From 35607ddc4fe1a83d782e9bef372c6cbc6b1aa56c Mon Sep 17 00:00:00 2001 From: Hawkynt Date: Fri, 23 Oct 2026 10:00:57 +0200 Subject: [PATCH 01/48] + CBT comic book archives (.cbt) .cbt is byte-identical to a POSIX tar, but no descriptor claimed the extension, so the comic-book row stayed partial. CbtFormatDescriptor is an extension-only view that delegates list/extract/create/add/remove to the tar descriptor (no magic: a content scan still resolves to Tar). Evidence: 7-Zip 26.03 extracts our .cbt byte for byte and we extract a .cbt 7-Zip wrote (CbtTests, tool-gated). .cba stays without a descriptor: the ACE reader/writer it would wrap is not conformant (acefile and lsar reject its output); the catalogue row says so. Sourcing: no new format logic (tar container reuse). --- Compression.Tests/ComicBook/CbtTests.cs | 126 ++++++++++++++++++ .../FileFormat.Cbt/CbtFormatDescriptor.cs | 50 +++++++ Hawkynt.FileFormats.Archives/README.md | 1 + docs/catalogue/reference-formats.csv | 2 +- 4 files changed, 178 insertions(+), 1 deletion(-) create mode 100644 Compression.Tests/ComicBook/CbtTests.cs create mode 100644 Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Cbt/CbtFormatDescriptor.cs diff --git a/Compression.Tests/ComicBook/CbtTests.cs b/Compression.Tests/ComicBook/CbtTests.cs new file mode 100644 index 000000000..8c687b177 --- /dev/null +++ b/Compression.Tests/ComicBook/CbtTests.cs @@ -0,0 +1,126 @@ +using System.Diagnostics; +using Compression.Analysis.ExternalTools; +using Compression.Registry; +using Compression.Lib; + +namespace Compression.Tests.ComicBook; + +/// +/// .cbt comic book archives: an extension-only view of the tar container. Oracle: 7-Zip reads +/// what we write and writes what we read. +/// +[TestFixture] +public class CbtTests { + + private static readonly byte[] Page1 = "first comic page bytes"u8.ToArray(); + private static readonly byte[] Page2 = [.. Enumerable.Range(0, 5000).Select(i => (byte)(i * 7 % 251))]; + private static readonly byte[] Page3 = "third page, added later"u8.ToArray(); + + private string _tmp = null!; + + [SetUp] + public void SetUp() { + this._tmp = Path.Combine(Path.GetTempPath(), "cwb_cbx_" + Guid.NewGuid().ToString("N")[..8]); + Directory.CreateDirectory(this._tmp); + } + + [TearDown] + public void TearDown() { + try { Directory.Delete(this._tmp, true); } catch { /* best effort */ } + } + + private static MemoryStream Create(IArchiveCreatable d) { + var ms = new MemoryStream(); + d.Create(ms, [ArchiveInputInfo.InMemory("page01.png", Page1), ArchiveInputInfo.InMemory("page02.png", Page2)], + new FormatCreateOptions()); + ms.Position = 0; + return ms; + } + + private static IEnumerable Descriptors() { + yield return new FileFormat.Cbt.CbtFormatDescriptor(); + } + + [TestCaseSource(nameof(Descriptors)), Category("HappyPath")] + public void Given_Descriptor_When_Inspected_Then_ExtensionOnlyAndWritable(IFormatDescriptor d) { + Assert.That(d.MagicSignatures, Is.Empty, "byte-identical to the inner container: extension-only detection"); + Assert.That(d.Extensions, Has.Count.EqualTo(1)); + Assert.That(d.DefaultExtension, Is.EqualTo(d.Extensions[0])); + Assert.That(d.Capabilities.HasFlag(FormatCapabilities.CanCreate), Is.True); + Assert.That(d.Capabilities.HasFlag(FormatCapabilities.CanModify), Is.True); + } + + [Test, Category("HappyPath")] + public void Given_Registry_When_ResolvedByExtension_Then_ComicDescriptorsWin() { + FormatRegistration.EnsureInitialized(); + Assert.That(FormatRegistry.GetByExtension(".cbt")?.Id, Is.EqualTo("Cbt")); + } + + [TestCaseSource(nameof(Descriptors)), Category("RoundTrip")] + public void Given_Archive_When_CreatedAddedRemoved_Then_SurvivorsByteIdentical(IFormatDescriptor d) { + using var ms = Create((IArchiveCreatable)d); + var ops = (IArchiveFormatOperations)d; + Assert.That(ops.List(ms, null).Select(e => e.Name), Is.EquivalentTo(new[] { "page01.png", "page02.png" })); + + ms.Position = 0; + ((IArchiveModifiable)d).Add(ms, [ArchiveInputInfo.InMemory("page03.png", Page3)]); + ms.Position = 0; + ((IArchiveModifiable)d).Remove(ms, ["page01.png"]); + ms.Position = 0; + Assert.That(ops.List(ms, null).Select(e => e.Name), Is.EquivalentTo(new[] { "page02.png", "page03.png" })); + ms.Position = 0; + Assert.That(ops.ExtractEntryToMemory(ms, "page02.png", null), Is.EqualTo(Page2)); + ms.Position = 0; + Assert.That(ops.ExtractEntryToMemory(ms, "page03.png", null), Is.EqualTo(Page3)); + } + + [TestCaseSource(nameof(Descriptors)), Category("EdgeCase")] + public void Given_Garbage_When_Listed_Then_ThrowsOrEmptyButNeverWrongBytes(IFormatDescriptor d) { + using var ms = new MemoryStream([.. Enumerable.Repeat((byte)0x5A, 700)]); + try { + var entries = ((IArchiveFormatOperations)d).List(ms, null); + Assert.That(entries.Where(e => e.OriginalSize > 0), Is.Empty); + } catch (Exception ex) when (ex is InvalidDataException or NotSupportedException or EndOfStreamException or ArgumentException or FormatException) { + Assert.Pass("rejected: " + ex.GetType().Name); + } + } + + private static (int Exit, string Out) Run(string exe, string args) { + var psi = new ProcessStartInfo(exe, args) { RedirectStandardOutput = true, RedirectStandardError = true, UseShellExecute = false }; + using var p = Process.Start(psi)!; + var stdout = p.StandardOutput.ReadToEndAsync(); + var stderr = p.StandardError.ReadToEndAsync(); + p.WaitForExit(60_000); + return (p.ExitCode, stdout.Result + stderr.Result); + } + + [Test, Category("EndToEnd")] + public void Given_OurCbt_When_SevenZipExtracts_Then_PagesByteIdentical() { + var sz = ToolDiscovery.GetToolPath("7z") ?? ToolDiscovery.GetToolPath("7za"); + if (sz == null) Assert.Ignore("7-Zip not found."); + var path = Path.Combine(this._tmp, "ours.cbt"); + using (var ms = Create(new FileFormat.Cbt.CbtFormatDescriptor())) + File.WriteAllBytes(path, ms.ToArray()); + var outDir = Path.Combine(this._tmp, "x"); + var (exit, output) = Run(sz!, $"x -ttar \"{path}\" -o\"{outDir}\" -y"); + Assert.That(exit, Is.Zero, output); + Assert.That(File.ReadAllBytes(Path.Combine(outDir, "page01.png")), Is.EqualTo(Page1)); + Assert.That(File.ReadAllBytes(Path.Combine(outDir, "page02.png")), Is.EqualTo(Page2)); + } + + [Test, Category("EndToEnd")] + public void Given_SevenZipCbt_When_WeExtract_Then_PagesByteIdentical() { + var sz = ToolDiscovery.GetToolPath("7z") ?? ToolDiscovery.GetToolPath("7za"); + if (sz == null) Assert.Ignore("7-Zip not found."); + var src = Path.Combine(this._tmp, "src"); + Directory.CreateDirectory(src); + File.WriteAllBytes(Path.Combine(src, "page01.png"), Page1); + File.WriteAllBytes(Path.Combine(src, "page02.png"), Page2); + var path = Path.Combine(this._tmp, "theirs.cbt"); + var (exit, output) = Run(sz!, $"a -ttar \"{path}\" \"{Path.Combine(src, "*")}\""); + Assert.That(exit, Is.Zero, output); + var d = new FileFormat.Cbt.CbtFormatDescriptor(); + using var fs = File.OpenRead(path); + Assert.That(((IArchiveFormatOperations)d).ExtractEntryToMemory(fs, "page02.png", null), Is.EqualTo(Page2)); + } +} diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Cbt/CbtFormatDescriptor.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Cbt/CbtFormatDescriptor.cs new file mode 100644 index 000000000..ff5a6f081 --- /dev/null +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Cbt/CbtFormatDescriptor.cs @@ -0,0 +1,50 @@ +#pragma warning disable CS1591 +using Compression.Registry; +using FileFormat.Tar; + +namespace FileFormat.Cbt; + +/// +/// Comic book archive — a POSIX tar container of sequentially named page images, conventionally suffixed .cbt. +/// Byte-identical to a tar archive, so it is identified by extension only and every operation is the tar one. +/// +/// References: +/// +/// https://en.wikipedia.org/wiki/Comic_book_archive — the .cbt/.cbz/.cbr naming convention +/// https://pubs.opengroup.org/onlinepubs/9799919799/utilities/pax.html — POSIX ustar/pax interchange format — the underlying container +/// +/// +public sealed class CbtFormatDescriptor : IFormatDescriptor, IArchiveFormatOperations, IArchiveCreatable, IArchiveModifiable { + + private static readonly TarFormatDescriptor Inner = new(); + + public string Id => "Cbt"; + public string DisplayName => "CBT"; + public FormatCategory Category => FormatCategory.Archive; + // R/W: tar's own native append/remove editors. + public FormatCapabilities Capabilities => + FormatCapabilities.CanList | FormatCapabilities.CanExtract | FormatCapabilities.CanCreate | + FormatCapabilities.CanModify | FormatCapabilities.CanTest | + FormatCapabilities.SupportsMultipleEntries | FormatCapabilities.SupportsDirectories; + public string DefaultExtension => ".cbt"; + public IReadOnlyList Extensions => [".cbt"]; + public IReadOnlyList CompoundExtensions => []; + // No magic: a .cbt is a plain tar, so a content scan resolves to Tar. + public IReadOnlyList MagicSignatures => []; + public IReadOnlyList Methods => [new("tar", "tar")]; + public string? TarCompressionFormatId => null; + public AlgorithmFamily Family => AlgorithmFamily.Archive; + public string Description => "Comic book tar archive"; + + public List List(Stream stream, string? password) => Inner.List(stream, password); + + public void Extract(Stream stream, string outputDir, string? password, string[]? files) + => Inner.Extract(stream, outputDir, password, files); + + public void Create(Stream output, IReadOnlyList inputs, FormatCreateOptions options) + => Inner.Create(output, inputs, options); + + public void Add(Stream archive, IReadOnlyList inputs) => ((IArchiveModifiable)Inner).Add(archive, inputs); + + public void Remove(Stream archive, string[] entryNames) => ((IArchiveModifiable)Inner).Remove(archive, entryNames); +} diff --git a/Hawkynt.FileFormats.Archives/README.md b/Hawkynt.FileFormats.Archives/README.md index d3f8c6198..842b72bb1 100644 --- a/Hawkynt.FileFormats.Archives/README.md +++ b/Hawkynt.FileFormats.Archives/README.md @@ -112,6 +112,7 @@ Every State, Test, Maintenance, Compress/Decompress and Demux/Mux/Remux cell is | [CAB](https://en.wikipedia.org/wiki/Cabinet_(file_format)) | `Cab` | `.cab` | R/W | ✅ | defrag · wipe | | [cabextract.org.uk](https://www.cabextract.org.uk/libmspack/) | | [CB7](https://en.wikipedia.org/wiki/Comic_book_archive) | `Cb7` | `.cb7` | R/W | ✅ | defrag · wipe | 7z-backed comic book archive | [7-zip.org](https://www.7-zip.org/7z.html) | | [CBR](https://en.wikipedia.org/wiki/Comic_book_archive) | `Cbr` | `.cbr` | R/W | ✅ | defrag · wipe | RAR-backed comic book archive | [rarlab.com](https://www.rarlab.com/technote.htm) | +| [CBT](https://en.wikipedia.org/wiki/Comic_book_archive) | `Cbt` | `.cbt` | R/W | ✅ | — | tar-backed comic book archive; 7-Zip reads ours and we read 7-Zip's | [pubs.opengroup.org](https://pubs.opengroup.org/onlinepubs/9799919799/utilities/pax.html) | | [CBZ](https://en.wikipedia.org/wiki/Comic_book_archive) | `Cbz` | `.cbz` | R/W | ✅ | defrag · wipe | ZIP-backed comic book archive | [pkware.cachefly.net](https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT) | | [CHM](https://en.wikipedia.org/wiki/Microsoft_Compiled_HTML_Help) | `Chm` | `.chm` | R/W | ✅ | defrag · wipe | | [cabextract.org.uk](https://www.cabextract.org.uk/libmspack/) | | [Compact Pro](https://en.wikipedia.org/wiki/Compact_Pro) | `CompactPro` | `.cpt` | R/W | ✅ | defrag · wipe | | [GitHub](https://github.com/MacPaw/XADMaster) | diff --git a/docs/catalogue/reference-formats.csv b/docs/catalogue/reference-formats.csv index ab231c065..06180621a 100644 --- a/docs/catalogue/reference-formats.csv +++ b/docs/catalogue/reference-formats.csv @@ -6,7 +6,7 @@ Enterprise Archive (EAR),ear,archive,,,,,,,Y,1,https://jakarta.ee/specifications Android Package (APK),apk,package,,,,,,fmt/2041,Y,2,https://developer.android.com/guide/components/fundamentals,Apk,Y,Y,Y,OK,, Android App Bundle,aab;apks,package,,,,,,fmt/2042,,1,https://developer.android.com/guide/app-bundle/app-bundle-format,AndroidBundle,Y,Y,Y,OK,, Android Archive (AAR library),aar,package,,,,,,fmt/2043,,1,https://developer.android.com/studio/projects/android-library#aar-contents,,,,,MISSING,, -Comic Book Archive,cbz;cbr;cb7;cbt;cba,archive,,,,,,fmt/1462,,1,https://en.wikipedia.org/wiki/Comic_book_archive,Cbz;Cbr;Cb7,Y,Y,Y,PARTIAL,,.cbt (tar) and .cba (ACE) have no descriptor +Comic Book Archive,cbz;cbr;cb7;cbt;cba,archive,,,,,,fmt/1462,,1,https://en.wikipedia.org/wiki/Comic_book_archive,Cbz;Cbr;Cb7;Cbt,Y,Y,Y,PARTIAL,,".cba (ACE) has no descriptor: the ACE reader/writer is not conformant (acefile and unar reject its output), so a CBA view would inherit wrong bytes" Chrome extension (CRX),crx,package,,,,,,,Y,1,https://en.wikipedia.org/wiki/Google_Chrome#Extensions,Crx,Y,Y,,OK,, MSIX / APPX,msix;appx;msixbundle;appxbundle;emsix;emsixbundle,package,,,,,,,Y,1,https://learn.microsoft.com/windows/msix/overview,Appx;Msix,Y,Y,Y,OK,, 7z,7z;s7z;001;exe,archive,RW,RW,R,R,R,fmt/484,RW,7,https://www.7-zip.org/7z.html,SevenZip,Y,Y,Y,PARTIAL,,"Deflate64, ARM64, RISC-V, Zstd/Brotli/LZ4 coders and external header references unsupported (SevenZipReader.cs)" From 28f7f860943495ece8376ae43fa00bfc7be886c6 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 23 Oct 2026 12:13:41 +0000 Subject: [PATCH 02/48] * refresh the application screenshot --- screenshots/main-window.png | Bin 66235 -> 65657 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/screenshots/main-window.png b/screenshots/main-window.png index a9ceb7f7ce233693ac240e941d4af64380209648..e3795c0d04a8041389e0aaa3edc8cc5c89e36820 100644 GIT binary patch literal 65657 zcmeFZgu7}+%ZT``+|fKdbxl9%F;1*yeeB>(|RdhhR#9`Z3Pck2NOY4DS7H_hLlkX}IkndvVs(x}<}aZAoiRKGBTEJY<_ zSgxx=WEA|}#KgL|tEJ{HkDv2cqyL87eGC`+>T74pA8JIfNJz4;$Op}4w~g7ZrF9YT z-kHhviP+gmJ;VnR2aYJ)YB%OWqUy$lDlad!(l#2L#C{$Urum&XRMl5o z@;iLK#oka~YnQ;lJknb2W4xVfY)qW1=)xm8OVMm_%ft<+bZIX;@F`E!iX$Onirc+P zUsQXqD<>DN?Vf)&aX<0qsAUeBWM(P*hTmc!p3Wn1|Mn4>^8uYUJDHb-o3-)p zP&ah5)HgY113L5Oi1`gYXYni6^iM>fo#?lbQN#rLQopOlE3V$4K_H)wP_qxXo{j!0 zY4MIKR4*TNP6`{2#=F=4yS*6;U3>4c!FNQ|8MzgH%5U#El{eNc-rb``$iDXz-RIXP zXCpH9x@X_v#i=+d394y5JrmO^HI<8YGnd76~fe1d!C=d4?A7F z$XUCZjnir>&DqCEc`6X4$pa;XwASh3DP(!Cv^hBW;=Oe~!WER`+A6!T!?a>DbQ@}DZ zvg$0R$Vo|i7fKR+F{YY~imTU@l$6G-W&mlYK~-z(Cr=YPp!>U|l7xue0* z+eh44Y7L&RvCGt-KaEfDla3Q6#DA4VZcZ?z=O=`Y8)M%4evd?_R^hbcSqK#@A*AUY z>H>|;@7TaXlXo6J)r2SNYCC@aem>dQdU)_i@WF$L$b1-7x3TfUpWV#X_E7pckImv< zYR2+1JIU+^89uk8NrRo)cybknzCKT#l670j*;u>|Y0~q<{gG^Jw`)Y|z8$yw-WQJv z%h?oi0zyLgQ4{N@JtSIvWBqFhOP(NDaL_*C!B9Hc;dC`f zo3E~L>JI@Cex-iEW#wZdjo7${O&)?{wJYvM{kK{028T?YU;Y5n1!YIOcD3$;!y`2oAzOMeuOc20i2WwEpM)P1ETur-k^+i>=A! z)m_)yF8Aalvj}H%zu6`!q9&klG{}B}>%*SI|qd>2KN2QRe1Lr@#-*Q!3t{4${ zeC$*;J{~$WbUbp_@&MWGf>e-wa$?t7OiXN`NGmfiwX7^Gw{#yoCFk?==K}6G7FRWE z%sRMG?FKi4i6X5;OZCP3^jv?Qs;Loiad8m@P!4=lRgW2n=R3TtVq|A$WTC4ws3*lKw1-R*E>v&ntOb%9kl?AJps-|JTW%yt-+abt`8KTeG1xAHd*$ypSh>3_ zei&jxOj1X8k=Hb?Ei(=b7UM(xLtQU}%!N*dvwL!kGF9NskmW->G{^(L5C)x?A2EYz zwL^|uf#^Z8+-6wz)U;ee!ot4XE`q2F`%bVQ8Oxufq@Mo)MD=@gY9zA+wTK571 zgAC9xJROx;s;pq+sc@`uxc2p_ovPgAyg1&-Oi6j+j$vUj-RN{It|XLM>En~`eLerc z@8IxJs_sGnVa@2qI3-hw*RPjo_p(3R+fNj$m#+OuEhu1ETI~}FBDI`NYj-q{U+aq( z>*^wNy}BHEpNxY2!H9lnX#9rw=PT~SqK^DUzjg$%Xk`YkWcG)Pe*wE2>3Ofo6 z6c{gb)T#dcJBv)={Q}sr$(N^S5OYQckER#&^a0&yOXq0zjbkIm0v|bezyz_Ke+tBr zcSJ!;bVZEs*rl`UW$0CO4b4pr7)+Jpr+LFhi9~XZ%v{ojE^fv%(+lTvy_dL8``(mV z-~al8_oZG}w~~<1v7O|Xj+Gm|F~iLwJ`)oY@W^KzcP*@}bZ(551dSUS3k&n|x`zeE zE2>@-Cfh@zfnO2wZ(hd1BumD(usysd)Q7#wyCym5ARzMZYvU*2Ff zseZ}b=$SlESnR}mbVxGWY;}!&48|HLExp9LaqhY7hpyF*((0P-BYb>(3=9m!#l>w{ zSW9zCJOXe@S9Zfi(IrF zORDL0UQ$y}>=16|CnW`}@~GrASgss^u+guxtS&1%*r=hhHpQ3WnfmqmGLhGIymN4H zwzq&^q{pX+oRG=&^)n19OiX%-o^+Jc??r;D0V)$?L$N%Yo}L9-$>H&4rh2oLwjDpJ zb#*THu}=$md_#x^49ih4x1JM_GtpD4IFj_kO7&-}%mTYg)C(TQ5f+=yeH%2;<2L;>;67kzE5!6te zJ7kK4bd`Yy>EFis`}1Bn6#5s_0DOw`_Xv^)RnP`Qx|V|>$Nam?x*Xk#zu4xTzBsCa z0^xABj~;tM`L9(|}MoKvOij&NPnd(G#TKh=GwiEQ5(BP50pMDF3?tkN00aGVL+}3A9U}d2 zn3Yl*UN}-IV>d;;Fcr?Tmi7SY!*KcGM4}swOO2_X3MM|)ufN~aKKnZ<#EmeT-*dOn z(RxFP|DiEy>sx-UUxHtdEfED=Nt~89Kce&3qQPS~7H^t)@{5PWRYi%nCM)1b+d7+| zcwSy6ol<4V;oYbv9}2W{`%6xgW>Az1@%l&OFZ~w}@t_HHG4!u*%I_(k5&o{PvEyNF zJfQSS!^MV|fV1$sNgfTvS4#$I#KpyYL>et`aiz%HO>{2AxkHApU_tSTwewT;Eu$(3 z$E%~<2L<_BuPE7%?PWj9+t`?x@^v`9xPaD2L;?^&qcQ~|=^*%=5}@1QhP z5VnzeG8}iF7ydYDsRfgDwZY35*8BVXr_W=mO%1H{TlL=9+Sr1?ii1ZoG24mLnx+oE zIQFKQz>tAXrNG0=*PLcnMk@01xJ1|e6T78ZzP@#F#P>x}7qSg^8y9y+rxH4poyo}w z5BO>MvQylAjuN~W*T`q$H!3aroe7h7_Gu(#6%Qy?3hegwF7pz$#9Dhtm*)lHCnpXV z$li2a-Th*slIB)c6YunxC@5GhhCd)~=KQc%R-PqtzrDfmF3ie(VbBtm8MR7~9emRz zFOTj{;(*wis#4xLhC8LoI$dW?{JD2s?5r(vx1d2P+r3FMmcOf0iYKIgc^@R4SjU6c@V_M#B4 zX(<$`fzEFMYxTt%t-9rCkQ0vWEsJS6nU%H2SY$jGox5VvmPJbO<3)#w_I4HY3`|AR z+8#H_9l@7;9&zFEGvy#dag}peP7ypIs%&xZK|W<9ST*dx+9@u{`$EX9s2D+5{}!8! zZ>O~*q%SD2WbH20u%YSlm9vhF$Qt58^RACS3M(svt5^pR3>P=JMl(%KaUBcDFw7LE zXJoTqM4$8{R6pB3K_t2D=XGyVo?)=DS z!ph5SN8lN^@r%d?p=Q^KbPW}I_R1e6C4M1S9%QU>IK$aS*icb5H8mIE-;I9QN{Wi= zZr9p(D|C8) zljCj^c$lW9rjnWoBY)nr5pRpQKOLQ(`VwKf8CY(lLL;Z5Ffy@3#%FE%Yx2$S-;68G zK@FJ-QD?4VXF`*ht<fGqsJ}8QK+=ThqlY~GTH8gd^)qXcC zFHI7)tEcDk==`uojv`i)3ewh}H3v5uFfcUC%g@Jy0*YcvT^)uKpj@c^sHwkafbjTf zknqUpV2QE82^W=c1de)4tci&!E;LZ1>YK}Hf6KVAw6t_m%byKIR#qkv5l8ry&2dO} z=Hlp-=0WLu>jduj=-Vk>vfN{|SjnIu9h67Z*%_ZFw+52+0dZj~*otod%FYkWF>kWf zC*zpV*o}`yB!ti5-EFV|nb+pyl28J557EI5HXWu@x@9=PlrIF`IVYjIz@a~g9p>-q32w-hoF&SK%(bV>gap|}YYN#U_#*G+ zzT$*MClBbA{=gfjMR3CIfBjS1?D;4D1s{2caQe#f>JwR8KneD!6wg)L@+1mV!!Ss1lGPrdeMeitgYpZMc5^dC;U-E?ENzIx zkq6>A!^6UPPR>rVz4@`pMc-ayfJwV*KwGG2 z;oY)13O%66S)`__ax5v9bNpOehy5I+#Am!rDu89|`sC}|7#SU{qM{V(A^L26lVp7} zIx@2H_H5sGV%s`hMC`47$?{1=WaRk;-}uCYgtYYcz+et`4$JlDkCce?v%y4vn9H3b zR+U@@yjZ_h!_%j@!^Muw+=)BKA%1!Olb)vQ>!0%q!eb&{Jw;zy#LJ<8t?;YoH@z&9 zr8#QYu-_Tg5!S(eBH($9=q$ziTaW(0xuG}jlpVSzg0bDg4WOc|oD*sFenQlXuW#4X zR~`ZGVz2i0owRa)TN|uhvA3_!{d6JSx6Z|uLQo1bD93TvzM?X~-#@AO>U7J^-`{_O zhzOcmaxf5!kT%uxQar|$$?#45!BJ0g-Xv`CWAE}^mjD?AI`c!==QKH$-6QWaL&M_gOfLK1Q214|aHNiy@SpBb zzoJr)iQh0bb42{9>31(b+)^X08t;%vmQLWW_ZSlwu6<7ApPvpOe@p50Z^rm&2F=c) z;fBjUU!!~t0WGE;N4yL7q+w(%ED^g9@O+Q@hK^JBESke&-qY>&rnTb$AFJW#?oZ8EltOb!|LIK5BW*xAK zeBlDanQ_=A=kstoS)??eq&!qET*Pb2_@o>amy=pVtT`CL=^dXXYf1I0H6JM-{+f^Y4I+wDzUgoSM> zTE8!KL=GU+E+PsvYOj7Sq#qL25v)O?0^mJ{C8L$eqeN$ljjziCm6uJn4Jb3 zE6K>1GSP#`1$gL_&VryyHu}2qeK_3dn>1akOxRIjV*d5Y?f8le-H2;@B5~u_ z5{RHwm4!l8SvMNGzk0q~(_-by3RgWc8tvFspbjllI*OKY*KOUt<`=qBZho zC}3$3#nLOyuGAOwwKz?Lh+jvrAEwNb*z$P^nEvz+b8@G(V#vYGdmu|KWUwenqvLZb zJVpAG?Un8cj_$SM{&G3P)Quc@Ptr*$hqTf7-M`qTo95+Tm>k3oSvEC;v>`<(;nj=3 z&Fwwzu#&=~k>-d2opFm!?a zu%{+h>_l6VFRMy+SKT(Cu2H8e(&u>z#As0DpaR&PBfm*7-DJhDL=z~{73L-_2mRI< zOP=#(^WL*1y<@d zVpZ?xZsaepy?Scc87Aairul33nI$>Z?Wkj?r@!^{_bL=|gzru{bFhOUrSPNqi}#;B zeC#jo(Ybhc7-aD`#Nxg+Wu!eZleEa;}iV172RHyC7yJ_qkGWtM5pibFCpj z=G5t_@XFV#QFDO8tsAFb{QX*hT}Y8zG|deJC^+tlt04TmM0yp!NGLV6fTr#jED=4t zLz!y{Pm(g6@%Zzjzr@4Y2Hvkj&gTKHroBj-`Guti4bDBIHJQ2J#lqbj(&4@w&CDBTOd8R@$jw&bLdbl`Bb*`_g}tOk_9e{Bq-s zg7xkW|9hOk_COtZe1e>C;gF}fZaq`nbtL=VEChKh2`p8i)4tnUU#WEsn_uW)v@2>z zf!#CNuMmw1Rw0V{_FZld4PoJ|>A1|y%){)XNPcSbX=e{XhpEfhxUw)9dMsBh#YKfk z3b+tRPC3SRE6dgT%wfWF&ni9R5nq+$92eV$|4SLt}*`SaRY8VI$uVW=G zIA%cAA+gD$8Mr)sOtNZND5+j$E?#QUHS%MxWFDN<+0`|s*TQqU)5H2qi~D-*&sE>d zJi;_D7z@iA<;d!V^~phPepcS_e1DN!SzgDIT6Lvq*i1oOnY@v!*sX}uQyfhLXG!zf z8v$$-A6QgGglb&8%!R$1M*g_{&@VAo!{E=v+$C1H)62b*a~1Jr~W(wCy9!0=~Q(&Ojd|8{@)1$uLF@sJraDL@9lJEhoFyb%TF8} zGNHQCmX?a2BGwp-ceJ=kILv%=l(SNQ&9WE2|0ER}8ahe_KyN}q0^KGJ4UHnr8&>w( z)4}S-Ml$b~6!Ee$TU=bcnVFeXThEl<1Wjw&NVe;!UB??9Z zRh2fywsIj&cHGhdcc|hE-Y?&j?v3;hy%@vP16NXk8q+h=ve;u|qvq3U z3a5|mx0J690A3u1<4!)%G7swf7ceI$ZO%XYxZ&Z$Bg2tOilp1ym6cpiLPM=uDSWZX zUS1%(og>D8E))?F5hwZ4%ucaHoW-s#&fh<=PzvzXqTSWjyNUM2DN^>=N+vpIu=&CVLt>NiqA&1Ajrc4}|- z)|>;e?w)fahw&ezq|S7|yjZQoQL9PHrJ-agjVGjMx2Y2Dl*0~jS& zhfM^p(fDu1nU^oqIclt?{xr4!n%$agxyDy!Ptk#c0+!R#S?R`JPgr=h-~BSF86#sz z)Rm|H{BSjgh8_?4f5hewA2PC{R-tR~+z=NNbwII#pqC9Q=SaXt&!!1Q4$Qlr$to-N zo9v~Om9gkFcYyNtcw@@jg^q!xOy$%vE-r2%G<4o^H<);5G|f2xh=+itF*CD8g@C8a z%T)c{fFhw(Kb%@BN^zl0N4_XeC}0)nk+EuOrg?cyAafr09bKD3^OjPjb&SA^Hzp;PrhQNyMVWgqSxhPK`UN$8TGBnjAeS$AU2?P6K z^zzg}r~I2~ePqvA-$`FrUyp)b>EgMY625^4)C;gLZcr~!D6FIljw-7uD@P@TTJJ6h z;^RjW2nz%1@gB1d*7}Hugaj)i-}SX$2)h(&zBx&F*VcIEVWaCQC~OoI6!aGt6Oge@ z86GgaLfBT?tH&$y8W$I3WfgbuxGau>0w6F*quY}YA%Uv4xvH(GX!r3H3uycL)Y7#@ zn)Zu(E$C#giu&U)EvLAqc&cj3+1Ypbot~Xt^!bi?wzYQz#IuN_h8n##luE8Lx@}3C zbA26q%f-~F*QfsIkX?T^ue zgu}B|Km-+t&#I!3lo|+hyH&H3kQyi`i%WU;4psL}Y-DnGe-|JHZR|>nSYjCn@*BO~ z%{4V|CU)Cav$E>Axq+TZFCjq?eojjTFnX0iz$$pYuph(2!=Uh2XKx=d?0ohN2fE10 zQuY}AL-ko82K1X|ZMxW)-WxU859oVcK=@@3B=b0aR#a9t?ChGFs_5zJ>gv6c@f1@K zxiEdfw^E$bRxGZ>WNd1l0QCBVFevKz6_+s0Qw~nHh_dEq7`}gjy^f-0LTKz%mi?v^ ze=^RmHR`<@O>3#lA>%k=VuHe6{*E>r=(=58U?7G!gqnf^kYU?R()V)y0Q<-g9<>l> zUQ1X9u8hjW@bJM-qw7G@x#Q-rnw(r|>5-wPUY&1T985z~&n5CJUx_QVhJ)6}h7-KS)yx$EK_Niu0=2%BRmvbfzC?3}%fZ1R zD&)W)ovYRv_M@DTIntAZno~tft8um!u_>y9X&Qm!zZ1aIBDq4F4#S}e&n?a-B*O30 zEvI-%5v0LZoWL!<&YV=lBmjB;URyi9_08aj>&>EpwY8XyxWB%uUw85G{>U0%&iaB1|#ST`hb0Y)ke2jqAG63tre23F%mUs%(gaFoI701-pm)WuL;IBGpLtIjm? zJhd(_uPki1{&Y7txg(-O?~M->!fq9W6P6e*i27tDX!KM_+)`Sa^?|#o1!e|(k57|Zi=Cp-Zw&?Jx?*UM4=0;55f+9ou3hGvZ-45Qjw&kJ7<~GNTIlKN z3CJ(VXv0;>zB1=S8%uF8b(AMUw>KrSEmyv3YdgU@VMi!4shloQ2sk5qcdP&?!xGy& zSWDZ1xJB&Ivb$-)RVg7$&C`vdoD0P;?s3(W7;@mU_x zY{-x?q*{zVv~hQDTwadoTsKzGU-~^9@4`*Ifr}lpxuIywuR##br8oJ*mXP_85A0}j zE_PNxgD7%wfSGP!Cp-r42L{~1ot8;TciD6X4vpBNQhj>g1*9lwZX!CoZh{3 zeidDOzr5TQ2I!E2f{coaf&yeKP3Vj^3d-8biv7l9sYZ1Fy?XKZYE;rt`3E7te*pTlnfvHs@}?*qj)VLpe3Ce3PpckWJ78h$8<<7OBFXu##UyA9|ic*eoC$)5tEo^FKY@LH+GIUn58N6x81& z)yC3&CtLHG0k;8!Buo z6$M9TX2M6Zbr+tf$HjqKJ=#!7YHU=^))!-4=lo$HJk5bR^85h%{vDrxru1i1r%h*E zM$@zFfAR&hbhyy}NLb)N0kuCoJYoeu?iyeQroxS(%76sTKK_+Fa}t3!Z`fYh0U`*n zQ6NDUYG};6?tSk3d9Skmqds5$oX-XzzgtnTx!qSaRX=5vDCQIwSKH*~Yt;jhQHef^ z>~=FFU~?FFNmhk@@j62EBY0LYgftWF>7#)a!tUnf1mGNZ=IXcycHRSTr9V?vQW~Krp|SBCK8NRqnwAdl??FBY$%VS)RN2v{ zN1BXGl4opDAoQj{4pB(;kqb~`%^F){@1xXgznl?j2!Oi|i@d;b>#C24%)cspVKCpO zU8sJr_h$M>2OVU2XXK7>fRB{2L)Ek0f&F;z!5g)(8}=(H5!75f)~EP{%@`O*wT@P! zpQ)_{=uHoR`4sp}f-p9hT{iEQKeG;(buH#0+o@gFqRiw{y2#tw-uU?FWY6`^q4pkS zO@3E(Ev-V6hRWe#`5|8h2uWMU?C-R3!Yq(@za+Of#;|n%2roCAU}E5XNz29cl1{x_ zLTIABvOT{6$(`?Pb9V#-IbEUy%ifNgC_IW$z~hD#pG@l<#UH+MA1;4vL$3h+Miec9 zDtCSnAdW~a_}U^Y2N~>tV6K%R;NjlHKB+$B+!{ zsdd}0h=^t!#%~66*f>qK7f|H>-hbE);!vO*7%pcgiYwVT(?>Rdt-4K%eWrE9_R#k@ zi|V&Z(e=_|-4Sr;0$B^UC{D|x5;rSQxz@MF=_bkB4{K{$7aS+M-szun#l?kYID@-D z5{TUW{2@Q5=1l103qfUNJ2XFaO*-NUg6IOD&`_YRkrLBM4VpTBwaW2nxVm~E63l}C zl!37~H|&YD;EbyJ;D%inm>pu?$+|-PfUYZxSye2J%~ZHPI7(2c4ApNde6Oqws?^|i zJwUlf5v(2>4t(hN>;71Y55|$F{t*!#uAri@IaTflLVh7Levny!O3(cG39zvP`;3W~ za{6O8K}OA*E$fA{yHfzs*Jnw>)`X>q2s6&8%QrmiPUKRE?vauf!*^t~La+&?jfuao z#3Uml`wtGiM=pOIDV>g7xq<7tQhzTu@hzA`B&5Urm`*k>Ma&a?S29EfOJt9bxB7un z`8nG6+f{Qnk2S2|uwpQ&h>DtgCka(S5s{AI;9zL#UVo!2>l!z_!R0)g?-uWFQX@|J zWW3}@B!rfx7ugLa`d6>BWq>tP2lv;mH5i=&jI+HTVg!oM1}`sGLMAHeY`g7Ixr=0gewx9;-l)h{#Hg)6N7oHl6hXM} zck!m{`*2yuSDNguz%T0;OzwJmLl%->?S4oFkkQLyrE;*z>$}-iH7dXR2WywKv2#)O zy_2z8ic^xL!omhrRLS@+djW^Fy=lwB4p%elt33?f#Mx0qy;)mAIndU{JIx6W^AUR7jdv<=U?4HqxX zs8<&GaVXYA0H5l+aKG?wHp?VVDJ0t=7T9WIzkUV8!~?#@jOC2cii+TEGR&i6kif65xU#@X5Yedj_HGOdlUH^6@X787 zv@PVYFE1}^9@TII7eiT?{5frUdpl)h^!3rkVZg*!3O`H=ScA*;s=e%B&Vn>ucXt;p zZT0Ti6}JOM;!U!rhcmp9kc3bKRZdx+<&EWeKqS5rFf#M9F%-OeF*rPGY-N<4n@hXE z=i;QjhCpOw0Xf)+=1puOw}Ys-G?qJwvZki_r%$7$jSm2}-BSlHWuUK8QB#(x7AP00 z^F2mAv)_95$oZTO{-@e*#W5C(Tetg2nvB#N3Vr$VC3__sA@{ANm6>hVQrudfhUar0 z$*~3MSAows7eFWj+5G(6ORyuD|G+g25FTS$m78uxWMmemeE$m5t80%@AtbZa=AYqu zx|Yf}gPK4O(By@?&klP!MKiVR77W~I6&?NF6xQ#FX00lrDuozjH z*=DB3IM6hB}7Y|JtFFQUs8^z{A={L*wS=#xHvh z6-`d!Lxq5p3W%vwa(+cQITPJaK$j%jJ6QR`?_N>CHZnW{_dKKFg1myc-H?s|n}!np zn9;p^)s4H)*sXTh?7qE|b!zR|#EUljG$}c2_5`|fc|ljInl6mNOvmK$=Th{5B*Ug> z8twaqrbXgi^;>A$a~V7{tpsc){aSSmhUqhf`6?GDh}zRXsq2orz$@?yHhXkXWoed~ zpDy@cSe5sA6h-g@8=dCy;n_gxY`~)A{okAn>kXe{D2!c2g<*maYBUv4!VNNoH!^7V4ID@wSF>EKz0z>*f?-(gF=#pm6ZrXnDxOm zU{!K1fDtu5=9!9WAl_Ea}oZZ1Vveyd^T3_M5Cnw(XN!$?$-ww zPoV#;V}X*HY=NyJC{t*Kp%GexwKd;0KCHR9I-U;yxlz8x=eDe}9S3x@S5%bee9mHHqsDMC%S~{|QY_43g552X^Yz)UWT`*_5uzfZ+|Wjb0569De#K z*{4_SJ&TKB%MnjIPOu_L&i}=dw70jza4amafLl$iR%1;X6tDQ`4~Y?os8vH^V&bs$ zjFg;rbAZPO;vsn9@iEXchW?FxAPJ!#94L|veU(MC+VjIkv&UpdUNmPiyLjZYFR%M6J4R}A+ z*qmh5)MAU_OTe*}<7~V#=XoakUe0>-+k%i#`{{Er_6LPm4Ezs?=$y#*&k@(}5I4+) zacJlPd^?S}Px1XcC4c+?2BCN*XI$x_XQ16?$hbnMBQWYV4(mJM{M3kICnsxUk_D=b z=QWk97EvN#2DO@V;96jDlSk+07ppQtvfE~?XH5>)0m zvY7OfNzTc}I64NYuBW?u-t)?-b@QZVD4ni4Rk*E@AfStZiRsBx0(q`GU8T~hWc@-255F?{K3V?B{$tW9d9&=KtQ>kQXX@<8fTB_r<)fHrbZ`(&E8m^loNAi36|4>`=>l@B&Q{Rf+6MOwP!0#stsx zu<&1H8GbKo$v=IdBjVO{{Pyh|#sHkK*zo5!p*oxFU@0SCT!22guI_FoT3XQKaa?{?#SYf8uOvua0t$uzxaR2_p`|lm3`vanj z^W42F$EP#YDyye=q3cIC?k+kFi~EBER-bQ~1zP_b-$56g3gSS6=WXf%iKLj6R*iXk zz|WtcQLLe%!7OP44;PQIw=YAjyax0v0!e7bYPRfrX)Ol4>uEXbbZ`_4VH9`?R#R$qzR_@g5i; z$0c}qLC?7}>WGZf)ZCEp%UYHuuDYYYg$atE`N770D+LsXGi|dui{Vc2MvWIZIr+J2 zl~oa;p{YqM92_2axM^8gzsHC3hRRr2SO80=?o#Jl#|?pH=aXD;1ojlZgeWS@mz7sK z|GCV`DUk)j-C&8DjSV{FgNO(T5LyJiMidQALE2J+7AmkG;F@#s6tOXqc5e{!bKyV%&=K|HU=jFr@!iI|S_nLs5TS zWDhneKeuP78CZI!mRgBMr#}Xfp`E_$`3~DN0+t7C#6hbc%{E!AIQU6{Q)MG}b#O4> zD5Q5tlwn)4KJUpwplNp@@Zp$myb0MOOa%}l37q*UAL&v;WcO)XPX za#W%0k9-rN!gvF;XY(krTUTd5qb;A)^65-Xsr?(}O>W3TlMCQu{)3`d_Dbs)x(F)C zJ$wTLEwXLun|q0*Gtp>116L1@oEi@NP|zR%08LLPP~Y5;k&^oR2hb0^vn?qF20xa@DxKJq?=3U(|-Ct1rLegMyEbUvFQuc<~1?WQ21@ zZ(`kh7|rIpBkEdzL{^qp=DNwT0~P?sBIoV!(`PY{)CHDTR_Yx$yxxMF`x)X>9{3lg z{j2x;FAf54{huz2|FZ?9IQmM&LqGK@(l@T2TD(MDlBc3ybH; z+!pd+7YIi008j5TN??JsV7|MO6dj~(;=bG1U)#tR7b=Z`VnPD)n+dp)mmu_!kB$0_+3tUQ+nVG)6eZK=qhl(AGx!r}1Xn*5gng18? z6+jrrroW1so%-PNM5q@O-=?YBAvnNx#ee8X=+4(jfpX&Ps;$**YM^a7zmz>Nh^2#^OXdgB z6#xG4cwXg9)OO3AhjYfH^T)R9iHoZ?=va=#8Tg+dOQA{TI$0pO*~#RbYI~{__^9gt zqoB=EHSn81DsR@Q{kXEGid=k8G{ z1vS=ladBzw@|K{y2L15(=G|-RQ+Ez4)y@!(M3GM$K!U}XP(bxaN`Kb-pWsYuy000#HjQqPgMZ{dacO#3EFBtBr6HMg zobqVyjLv)SDAN8nwowEYjbCYL2Qp&ir2+ZnhTa;V6i0&@cP5w;0C9}_kE&e3!md`^ zI|hEcK-qh+DUlO#3_pFsg-)6m#xbq4IhELJ&;y|t1V><06m0HTyi+iKa=s7HN&qda zm0Srv{f9{xD8TA`eQCL2ho`?3+L{2o4EXrK>oWa&*h@OQqx}&6(5I%ZCMQ3CW51@{ zNZJZ4D+6Xg-2toUQE_Y)%?r?X_~*x{KMynljPA|J?(u&UCXf*RbtA z(&O4;=t!ji`7a7=a;ZDVNvWbUMda*+JQlg}8PM0h&hbpC$C=H|x*UrG72@d;scMZABTeuY8jxWps! z5S*}xgo4~$=iRTnU93i+7(+)#M}?$0XTxyFEG&kqafF0~@)BVsD z8VmGjP@&Rge!p{40e2+;|DFXP09XbEN%3TP{Q_N!{HM2xi=yf7wLoBhjE)Y9m|Uy6 z{VQ131RM+wqJ*~Nj%rN&_q$eH6?Jt}BYg$Pi+}5n6}lHnI$#PKJE~p0XQD7SF)%Tj zGE%rn|F?q~y{apVEsD-6V|_CjC!mY;jd^EnKr|5hE{=DUwvli+MRCK!fa(9Pb9dhJ zMnfch=*cIrnAP)}uW5pWHOfBU9LH;;-0D5~;L`H}u$-MA zJu+g_l$4g5uQH{WIpsNdFbSx+|5&|WSRVU9S zqVwG#eB{+qW<3`5jz)%tzYot*u%27ETuY@7fzW)p_Pa3MGf`4p8aVCu>z2yx*OI#M zJPO^kQQY|~%^n9>)SoJ%ev8;Ikk`{2_M+^GX84@@`A3xkN{9VUyuRKND2$yxw1q|H z`}=>k%Ne?R%Cr|3)OX(E&r|+{U%zqz&EDA=DEt3-i^W)x+QvY?_s*Y5kEN)-=K>ud zhhN(+{RWK+sE~j8hlM8p$!Eoa>mQ9AKM(XTW%o-aa@7NRFQj98re383;qj2gZZAbp zB&5;xHn?MKrpY;cdSc30DauN<+;pPpdWlLVeaINAs*35*5D#i+Z@1ci0e@~bv9`P# z7x&C@d-lz;g=%DRrF9=&HRFt52$4*p0UHA^@S8gW=9+J&`o{iX7kCXKB2Y2o*=^6= zgKH$5EL0EuF2~7QI|7Z$r@WC*upeVbM~07pWWtgZ$#>+M0KT{Rn5i6^ebmr@s##w@ zo8%|CRL!%Y5YoB5^9=lF%}pK)$=ZIrP}Aej-q3k~CRnp|j=(Nej{^Awnr$pKsbcB$NRjVk}kJ>wZ{u6>}&d7U=t=g!YK7cup z{AtEG(0w$8Z7hgTA0JdK#Dr85V!z7EP;o>*pWZwmB2wewA>mJM-W^;3zp{dY>aMCm zl0wFX{%9M|nj257pR4+R*n7*UD%-6M6!ldJQ4j%XQ9?=S1_c2D>6Q`@k?t-P5R{e@ zknZj-0cq*ZCEeY9Cb;*z<8z-M=l5BIF%($9T2I{foL5a_c{!=&;l!SAcs-aGa6S}T zJJV}Z!kr>~{%N0EKnry5<~tu;_`w*Fv{^Q{1G`dB%!^<2rO~wBvm()Ygz2;h%dK8V7H&=?Fr=in%)Y9D4i9)J=6p10e zpZXtC(wyd)R(N{>X>CDWag#E8+8ta1^VU61*;VP-NMg-ES z?%risRqU$s3gsazvjhkHXL}_jrNL4~1VEPJucjM+G|(!SrmbNlM_swrp;56dF7^C@ z(*yL^Q?(R5(`;cBJv!%oIaY0*;s?G4T}=K%>&MHZ5|XNg#JkrNi*A{}jdwU|POdg_ zJ1HPNB_xOljL_A5^RY`I>TGL{$;GB?poh!+Rdn%O-%h&1?942W^Wn0t?V2@fzu5-J zJ;)X(S_iUyZlG&aq9zbubN`6y&Y#||ApR?oPAN}L`sqe*7vEW_qvrB_KyrIjeN!Wa zt2h|(VxFdMSRqGWrBvNJd4kN)DIdm@mgyGmT3#Tf#dys|&y4=wY?jNFGb_}p3 zWyHH)iKLTXjr@ioi99jCseedCJ&@(+={@|bO2_pG2lS-c*Y_m9GL9vU(Q9I2N_VYU zu`dUUh5qI4_O0BOgO9ITcW+e;r#(5G`H!`!Obc!%2KtQPlqH2!*iXJoQYK>1TH~@2&ldYa10s^Q~z`^5JXQyXMla3dT&0EB2XKuXT zan$tm?8`#E6;6b*uy6#1`9@wN$lI70nZ(6k(tTy?=>4Ijs(H{XcYApBcUsQh0>%|1 zBkvpN0H137b?xRNLh|9AYgH&Ot8BaAH8~yR9W53ny5j|=-qVbnL3ln)14EUc6#;PH zY+1^QDJhVGu)nc&HhZE@dJ{MSDuivYIQhB$>c7K-yk6S9crp6z0F6qHj-Kbi1G*^K zF3~;ODBK1|3i6Bfgn8s=I1`s+!i%a~s;~x5skGJYrfwHY7%~pNuF?r4b%SlkXta!H zUL3=tj+oc*YlHeXJN^5Xku~+-)cDHM zqmbU<2-A^Wp2lOmO_lzr)$24#7fsY%hfj}xe_9V*Br*yTVj`mOA>o-^#V%?BCc&3s z;Tfv4ix6!CEtA|tov@$UY1Bqc_VOC?qk_-$epFW*9>}72ZVH@<%&dx^iT2KF&5D;l@HefCJ6m{5O zV|fxX@N=POb-bc0UAXvIz5f=g6Nty?eVm=SRC3C|Fr3DMK+fC*@;&3Ja&LLR=nb z9Ny<~>R+RK`SRt+D4Ps|x4u5Mg^eyY6fqb z=0C}Tj|A20a|<82ab%yhl=ujJ>{^R~8Pq@UCFHRduKrH*<(81AovT;xH3q}@(BIf**(TbOAG;p_mB69;qCBl!dqn-M` z+t0h>Wu;MR(}!Uk?s3)lRH(g@=q{|V$4>-ETU)cTyiDsy;8Wja8BK-VDKND&+a%iY z{j1YaWw>b$?YUJ9mO#jL(Zy$uyv+Uj6Vc!^lT%21$dk3y|IfO6s%cus9M8Rt9D!miD)03Rl1H z(d}^9Z}P*qule^$qEZYYv)L_#9w_4$gx zze0z;*Ecp|@l&~=WQ}pfIq`^Q#@EI6EU2H^rlh6FDHX-XYYPhtL*T*Ocx9MHq=|ZE zMof&9&O~v6^10%5z+v+z9~q6|NjM)eDQkaqhVq(FXe>BHAhwFyF0$Z^*f^TU!XEMq ztLa}BSZq<~=#ZnB`L8#mC#1*IUKlgCcS`ycR!7nm5$cs`j-Tsa``%@p9<3L9N=kZS zzjwR1U7zbA!=qH872JVXElxqhpVWq`-Pu?XH(2o&*nr?ulalfe2oRZZgWgNul^*?3 zJcw<^7SWAWSTmTIAE(4eg8GvA14(uUiOMjpO$NtyIgi8gzXAvds2gX#i!%f zJv7ERY-`-CH_aLOG)+Mc7=5*3etupm-sCf(S`-}Bq@jDH&%|V>PL6IRCbCr3dNlGy z0UNi8irTJP^7Y%d?m}5O%(VY+jo0QM(RS)H$|C~Ad6EMViA$qwP=KNQ^p!CKgtS)~1rP?*skAWl2jx!2!zU=7NBw4Ykwt zj`EwCVeB>3v&fvw7_^UkR9Ib(2?K$D?eHOxOyJGb5!GL;)uC4Z>)I@o88b6#TNP3M zU*BpPQ?zl`7v?9eWEZU^EH`cvDEjn&f(zPvJHngTZzQR3rf94j@FRdnAnHf-W>rvn zFa{oUKC`7X_ua@SC}@@P9GfrWHqU)Z-MP4~8I|2)R-uS8A2jTGMx@t!|JI%VQ1;#D z%=Tvfc$3(2em>V`4Y5&TKf-1LQ5ESP{hWhCM5Fmz`>9N_y6to{RNYf%N4u+iUAa7@ zuj|6)%Xe2u*zE9qge-Cjt-{#Klc+;yi8B9~hLlsJkA+QC`RbE_xoG(NsPP7t^sg`6 zsnDo1GI5NG3y_iJx)-)*yl_{?U0%&{&sB02 zOH=M+etU#>~hXP?m*vX4GPUSMk!cu2#w(qDaisg5E; zN=i!SVD-v%ygc(b**dlt(6f;6SqGJbIr~WWI0z#RzDAk?Oj`e$`UK+H3n8Iy!!}M1 z{`o=#iqjKhyW{BvlGc#>zr%$(A8WR}B`UL=HTh=;mBAUtc$kmLrgI*U1h3*$gij~P z_Z4*5@HqbVPf+~t$kb>QX8~Xs;L-Vd0&ImB4=HzjI>nt`gQ7yGyo!(e)YHF`Myw8jD zB!MIKr;XyoGzn3LikB!^^!KEDyKy-Wrx1;dFYrP>T^^}AMbr)=D17l)%$vTyzx%}J z!`3AEr4Ehd@v@=u_7JKtX6-i+wAScH?EVX>_oeCc`P{%{egQ;CPzXLgD*==Fv+D86 zv<$oDU#I#56ylL4{}cNcHW58j2CGbH=)ja2r8mh)v94sZ*S|7b`?Eq*6;-QjCw{%Z zlJaGbgx5EkTV7gvqh=+7#ePBP&ctw~hF(#|decKRCJP)dL1gg9IZay-#N#8K2iMVU zq;Jv$%*-^Z(lk5K+dmJK50TH0ZEk8!FQ#C|+a`Y=lNOf;1#Gp^aMuDm)y;LHbA;fq zaS`ewN7?O-k%K55*-3fFgA+CG_` ze%;DA{n-0b%u_PA`{jEpHc?!{EiLte_4V%VXS{SYG*pgqO8)7F>|Z+Zu&H`-ARt($dk<4H?*9UdOG;?Nr!=m;Wv3$(Ciy% zeoBSbCuxOCDk?9(oi4F|l&)j@+hF!-H}5`L2%XE}&uF1|Fuvcy?=;zT)6iqa2dE`z zfpx_h#mm$4vvYQxX0~b>*+Vke?^+KI4tUCKH1bS&gH=FV^@q$FOw+f+EiElYtE1rL ztJVvolp#Mk+D_`xTN*3A0WK|JVTb?H(e5A5v=Yfrb3IU2rdXUk0h10>$q%U0pCC+2V zLI233-D-!k08!-ht0^TSH(^sVt~8OSvR#{$_Hu% zqEmInqs!JhHKpCDv}FzwQAimW%q(WVNNIvw$FmK!9+_?h| z(3`he{mrf-@wMFIeQAC?{b+$27yHhg*_q&KlsuVDtxBwuB=W;kg^7?ubLC*_(&-5X zo7or9Dr|?_iyR|E06Dp0KHE1&U%-2XsLyXy(;8y zojKLSbugIeN)U3HO?Nh>6@7T;{;$pgr_Z0j z&9*#HZgWukHx(mu>p#dFg{tAt|3%G|gqHk)m=PI&nP_Nnc2-oXn*M+K+rD{=cNmis z3kTJyvOGL=JImvJ5DxI>&6^o^xdSuI|JBv5zt8_q?kH``?j3*+EqyL;nZuQ-Wl=~H z2o%n`T6$m4Fe(Bm6in$Q>UrQ&mDCB5h3F;bZGjl(N9~bCM#J-_>@(DIc!5+JWi3z1 zv+#BZWfl-7nFPRJjX*jGloQiy4hY2FsfNcbQQwJMH!dR`)1XXjU{PiouAq=A6z#$X zB=)6PV_xB@3u#jkv195?x4+%`oRTuax}OHepydamfMeO=mebVal*YAdbQ+T_Zw%nh zrdKQITx;&>?Ugf|xy$S$w?;fxSXc;}9C~9CLoGvY^RIzWJjB&X*F^%_@Hh-MzX*S;V?eTf{~Z;|_TGp?%;$of$il*S*SbA>HJtYHO)l3kwP!8{q` zDXAyOu@v^wy?yejT))$5L6${-Yv#OdZ1mx#-ttUv`(5?)mOQF41a6!zzz8?!7s%M3nLjPh$-6h zh}=6MOH?Bw>dJy3qYLirQQO>;nZ3By8H(ft1y9!!KQHL!mJ~AwE!M$c9AdUL8!vQ| z&A97Bdb&!f)F}Sf7a?(R_je%4(q7eg%!+4+pcW*3ZCuvG9A+&wPl39lLp*GGQP0wdMyQIWP%$1@mQXw zsb6bu4h>9uDc^F0l3Vs0GW$BeKLN6_$j>j)-OfE3Zo}W?+#(h)FK-lv42Ma^tcn%? zWVJ@p!7+$Qsee4JZ4~^!J^|&YPh-tvOIUu?Z~cR=TU*^Rt;J?xDa6k5ifr)StFSYe zk9mK)OlWj9FNuMK_x1cwMC4psl=6gP{OvfZwy2k?OsIdk!|L(~VWP%dGT}{)v@h*! zs`cOmPp2wWOp#mt+BHaX5C)@ldB6p6|6Qh0M9T$*wxNGOW&h~ zwWcN^pa3?On?xMeYc&FYqywFTJ<`b5_Zykk#ii7r)`X$qf{&!kdhy{*qu}>e#p}07 ze0-+BxgHdPistp%jbBCwj`;jWiP1|H!5L);C+-5Wpf!Ykk|btp19S(--Z(yKpwgo)2;FuQp~ zsF!t6q}fKYs$z44gej`+%`N;vJ{oRS1&Oq+UoJ=ei+`pbg&TL>{Lu{*R)&jRMyH`t zY^&+-*HQOLPQO9KJ>S`-y*6GwWwujfGM=z&wP;vKg4?fP1n(P{#tbYtOr1R=C2z0; zQ>Aob-EMvJF;FNq8sc^QX}f6XuQ@TX^Z1(3O$$zkiEi=i5rONsZV#|vHTc41xiT4? z4n9SyZ;G=c+H?m3O0{BQJ>Dd@W%POlT?u+&O*m9+Ln+tbaUeU;+CUhCzPY>o4tms6 z)C68NkGM;E7Jm^PZy|5*wl0^12{m>niOng@v)b0(Z8|2<`NPfPkZ0Ig7mgm zPF{``a_B!*rdIn+;ldb?PNj*>bFtaQ(|)&#zjQwYwmgx=Atv;^2VZ6$KVg?(M(y0j z;wKLEGJeM?Gk`08>FvEQ`)0$cJU=dVy~Xd^AF{`Ipzy5)H|X-avh}HCZ{WS>uOYoN zd2bTvDJ1*3p`+jRZZ6V#KIK2!+kaDg^;g0+Os#VC^XH2jAEH48toJMVTh9Jy?QPPy zix&h5WX?F`iM4JSajhL#9Y>TKOsHa_tr!a1O|jEnuxz;oEP&KvVJNe^0kYlQTwN~SLi}-MMdiJ!tU*A1FJu9mnL=9P|Q+69a5pt2X zye_|TCfKs=An2XJ7(X@cw&pYb@ycSo1v_#%5gCO5$+zL0Vns$w*c^EH{BY%*pZ2AW zjlkptNn|fn)X$q#s^6IXUfa#p+bd@Mlwx6>cPZwdn4F{C<<8p8wO4_K05?>71P|JSq>UDODkuElgNOIyH)Z$6lhPSn#z6cS;~T`m2*^MXk7x98VjcEI}3pGBWenAN@^-9{kJKy zw{~{6Q@A!Z9QmJjoL*^BoTXg%Q7O91Y5QxFPl0~lN&Qy@8}Km@{#WOzSK;`8ky!A} zG){Xf^qg9)NY$b(2d{BoR|#ROpc2QA~zaBziEO$uu_aI3BU3SmgJf58TrPzx)8rVb?(0ziMn~lbIZuq z^i^>DUSINZB5s`EtubM|k-Mq)-obA|ckH-{R9N@=k%(=GFVgP??)V#ipE7e0EwaF3 z;FA`Ec$-*Js?T{VH_mv-QZn9&iJ!j$z{x&#G~p3lL$oVJl3q3m>iD2F>{-iDBL&#`)@7l9KIhzO9k*c_2rAiFe zszAto2l+4Go4eGZw0*suDN?%qYwa*#1`7gE%D_MW_Q@G&NqZJ7pT&O?oU(ZFGpq7Q z{rXiXPzrJjzOmYU*`YUzSXUo$YVC(IOIGcG^H*33Hw%l^Qo9;Bf$!krLN5|qt z8ul9wYJ|k4dO<RlbIaa2S%wVGVe%m6Vj|PzOoggtYUkarrU4A^9r# zayjRp^`kZ(&x$Mdgg3S6?j%){>LkuT|K4=zExzxmRqe>!>co{JWA#cIIl1LBN5SB} z20uKa?fbuGdKx2GGq@~HYau1?S^R>awr{>y-2JWE1=(>nZUFdfj;EWGc=kg}>2BI% z=GZjuqRya&(mV~meD+a{+!IMgiZqwhd5V%#UA!K4N6H;PzlT!jaS7Ze#OG7 zs=79-E+zHueRqn}QIm+cc;r&v_gt}J&3Ga3Q#_H2ii*m$oFP$j*jwpOUTa}7$j{49 z-K6s99NNM?L?_lqq_!q3FhSkhMUNz3W?8S@?WQ5_;{&xcPP>is0o8iXT*o9;Yg1D} zVV=H`<_1(0=O_IEEe{VXo$+M$Q~?JePTFiU=Gp`D%%z_`l~x~jY2ADtVxyj6 zGt+WIUfcE5hWbvHQe{#~%KTvT^*%Xy$d+bx$z3Xyr7S8j^7QedG<0OM z_S!%X9HV=aGwJP-oLU*o>IhzQ9D0q|*evI%G+}k;@h>yfXS5ncs?yRE-C;e6wcWu6 z{aH$d;fGZ+cE~ISZ*rXWqO?73ehmwQku7$14iG>uIDjPQA9fxz1O`qC9z)~TDKRk^ z*hEHy8Op&sz=0tyLcDxT@jt$0&V36}-jLEt!f9@~X;K{)9^S-sSI%yxvZ%yQi@%Ab zV`-$=P+wb5B)LZohd%X~C}yG~llFm*8wS45u8D}U@-w+R5t)7Y4s0eQ(Z*_=V7dv- zvMn&`fdpbP4nuv;vMMuE(fo|?@R#nJ-xCH?=HD6>;qVe%3V*|Id;C8)RtoW9Tq))h zDgU5vj%O2fFd!{&2m+Tw?JT&g*A7nWgu(IGq6ksNj{8k(WsTTZoOt+~025*m#V6C`v}E1H1vuD^5f91^1Q-;-A-}t`>I-8avBk9w_lbC;kRyj zmC|n*_niWfVm8R#pbYuOs23NU>D1|klt$KxI5#N<8x-XiSzDU!?<#ux&0+D|?~+JW z`A2`x&SCmRNd_8aCm!N!*F8^zV^UI5Vq+zEdIx&qSHYMF*&$GxRR=9C$-27>3I=;% z__dBzn4S3YIDm0e{ACd#o3(dpE`t`D)FrDl@6l0JX%R>j{c=0qylq2UsGLsq-W^o1 z*rxYqX%rftG!zA3A)1gvb8 z6(QM&j8w#kYU-2uILE2U?ivvQZCkPja&*P=;9g{M(@v^f*t2oVXMt#1TAx%U|J41sk%nrLbV z1U-#WJf1>WzSm$?VKV=L&~2}}iJGUUtLB_dyBfd0bXs}1hJ;R{sA$vSYt-wc!N+&a zwQIQcK5VIE+bh6I$Srbdjt)9qzjdBiv^<{KqNzQYG4#&)glc*Ou8B)0hfb~keCt@p zTX$ksPkyCtb)UUk=OT0CtJ92_|-`1Ypd1(08ISIDq>8WhiZCykK{99 zXhHfwHoSIOW8+nT;fW7;8lD`4Ei5e*7Ur2F%2+^eNyi%%zW4$ePQ~!arq@VFCUgLR z#YGeut@NlXN!0|J3=a3O$;0#{tan3C9T_!|D24cJ8c`eCv3XgWLKVf&Ts_nmx0)+3I>0>{CL1_+0jPc9tPA z%w~C+(03jQl}%HHQ2k$NK#xcLS*Vhk*NnA ze!VMT60ANj;JHWoqX{a?w+Rl`NGV=!{{JdyUlYh`2SY(CJKVB4Jg){7)Oj8HmI@^{ zfQj?Q z%-CI))qx0g^?9q`Px|oSAFVwf?a-l1^Anfq&0Abb#W=xAT$W#QUOinF)RbuXaE<&y`vvWT>jjsj9-X%&FSixLRTNtEDX;AD~1^GxP-OFmeuLB)DUp1gv z(09b1UX6&>$l3cY?eZDuhE+Xbvj^}zGwSpxCqpx*F-*O^>`31WRL)rnYjsQ>mMG})lr?&Bxaf3}( zTbsYB_Mp8^$mewXAYU{8jl4ogK!BcsPTz3tB!CXEe|QPKw6`}@9o=nP9VWa<3jMX3 zg98`8=h9{{M1)=JxYkYvVqQHiM4>rY^kC|`2q}=pkOrtmwgZvyfCrVb7BtMA|m2_v!)4ztStCy2zK^F)gpeoH!{l*Y*{$; za{tv|Z(D#@`xhLud8!g3oL8}>RY|S*CIz2hyBb2m58G5mSW62HyC&E2=Rg?gbXJ55 zx~U4o(zv+VM5bgh_eAP}47FVSohmi1)Wbbu?osezz7Q3?fd&kEMNXmCeyB}ywTHJ_&ux!Q=;yol0mn!g3v($VPA>U6*gH}EW3u# zGlY@Z2nGSJ3M96=McN)n>V?*e;ZL=fc?V(gLq%9kuA_q~Ep1q&03%{6oE*!n7BYTl zsg+H36^RqvjG&##NnMyfY^ZtEmIo{!cFUDOt@yZj7y-sSDWVUw6K{1XJ!xZEMaiMR{y&2bB>}y^I4C{5MwBI|=Fx>*et+ zNQP~oRe5F0f&oYRwT=!%MJUmb+g*zXix7l%2}=6lvE&&=u)6t!3lU6cSq`e89em*C zeV6r)=5+|Us^I4L1cOlu1V21tW6L&gW16G?#^Lh5j1M5WRkiYa_~JD9FfIlq@qq8dJ6yG=%KPqnjtC_Vt^LnnUjeJOEH< zVNH?q;EyXW?!aSMf%=jhhMGpggicyHHIK%S-Xc!@I5Ya7L|L6bE`pD_l)q(Wys=DtCG-?`QjE?GA~;uy_QjIGG3s!v`hLx zh~chz4~3-j>1JYhI2GyZhHo5@a>$b%@q%KhrO=>SJkoim*3PVMHYs#qQ(i-;e(K03 zkwh)XL{&BXz1n%BF~fQ3+)*bV&gNi!Qk?=qMwraVuXVq0#1r^J)I?QPMMV#ZWWEv$ z6>)j&snpc}Q7Dr>V|MpQPp7_vsy#KC3LC8y7u4f~tVc#lcdZ`6pa;pz@4rtkRllNw z7&c(ms(CAImWN#5GEcnCQOaO=Abbpk-%`vyVC+|;jVW- z4h|e?(pVE*dec}L1j+?2G^g7y;MKN)Z6?-k$~8qX1+*!_-)A6Oz4J~l7u`BW__ zEF_$qlxTz~9BCMSS)2U@L_lzDK$_IoyAc;>9ID1G9GV-p8~3@mDB(BcHOf2l^Bahv z{i}#i-R9a5s?0w<`Z+X5uRc46%k8q!?X*+`GNN218lWe$vR2)_LLtlu*wOZ=YAG2R z{zOTcn-TavS!?AN*cKMQelHnPN+gMeo0R25O;M5%Hl5hMfT0ItyRF zK5%u*pkV)Fp}{G)x#jNK7W_(;qPM(O-DKBX-{vl5+CrLaiC@_LcyZ;-U|E?P6u|*$wg?MKc zFg${!-7q5)m;KE59H4+XNYWA#E|J_jtlSj^a)UpgxQwOo5iTzylLop(ORxwehh!f45|}W7x;I*J<$vS{3g&EUzHJLgeUec`0TWaD0Q&7JfuLpVRVf z=5_(W0%A1ncS&0$zS>KJ{m8?oM1L}Tg9sP5*wEeFk@#}2pMHD6#^TTey)2A<+W$s$ zEhHa>AtAZ!iadKN_uuI5$&MY^>O#A`0>FINxxe?jH2&hIYo>QWb3nBkWT>s5k#|+| zt*DB!Izc7cU5<;IRGgfYxz;Za31Crp{3@>rlKx$*lKrDp{dX3M6|3eevReXY$Z!#Pk>9=wGme)TV0!S;syS$+)3G z6iIKAboyl_Jblk=_;(+tuD`%T-`=A>%W<_bkp5ICK#78e^F#d(j?VFs(#J=2jMA@0 z#Ll{t&p1y5_xAoJ!$fYXo_a0>!ER*a4`0HSEm@TdKVZhUF(YZ-+J^Qus=_jlP~< z+u_*30+S0rG8hSFO|PNP^BFW)az^^T?PbPaRVj+9whVi@YxO-}KY~nLw!V+UW@0in zzVQw=_Nh`)fxywO+{}R&&aGtxn9PjjS=asyTvM;LhTkw73kVM{vzntjo1=$lnsTd! zicu>DuloCL3CX&KL%CDR-?t{?;uMmS(A2)s{`{G+Oo7t(gJp_~j&24i;;|zJuh^x< z8owc@mt2--6qaeO+>&9{Ku z$HaQKwq@dJF*k!fUC-mNosBilYjcZa&}M5f7y=^)W~j+BsF;{67Jm*2x(m7x@q)ig z5Zjl8iE|#L0?B@CMoKob$L=sL)>DW!F88OES*O>#O0FWYAu_%2mpYNtK|!uiDnK0K zA~rSbaFTu7n^g}eDJkg)$lQLKSxd{kR%dr=Ir=!~wlM`t)}ex8e6z7!)8;%#xS^iw zP%pOxtNe^#_9aWeCrB9 zqwZdDB$hLCxP}0duf>oOmF;|8%DYEOnrpoy>~myw7R#617QQl=IPz=aLG;0O$L7!V z0|4J-e5pwX!wlNPSpJ!oOv3x1L1*jr}CYJa`U#~ zjAg@ST0Q(;d8L<&E%1@n@`5umMB`pc-f)Up_3DtzE6~2ei}E?$DQ0{6^!CTbL~3Hd zJh5mAun3O4oE)SjKY5~+l#qsohjR|-Tw-wp1^m5LqRR8Z$XwLk#}uQnolhJg-W}eO zmzwGi`I0{a^z!}Ca8terdlQpg?6N1ZnDX2XeDg+`84w;);c#}TYu~pEW8nAs|2jB0 z+vWq|RKp`9Gc$9L6P=i>du+Eom{;#rUr72taQ#-YyFjpm!M7sM{g$ZGCA@Qr;SyxH9 zcN9?=FqKpEutg9YUUqgfCLc0_DwNiqRqK7Ks+KQFtWs52L0#jqoiBS;b26e1UBnri z?rL%eLuf}d&)J>`Ky_WXt4>@te^nwQZ@ZLPEX_juXm5vzZNa5iiB0%XX4j^@)=tD$ zVeHjks8X|?RdI%%6MxfAL@`JPEf6CHo$pRzKwQ%8D=0fK zd^DO(w?FXu9@rq{b@Km1V@lOQs#;-a2M`%FR6uQqeGMwm>eKI%l`l#NprQp&Ft&V2 zaEQX$QjHifG3X7qOReH1v!fv17S6~IbUy$M$;l`_f5{aiR)m=-z}-H_GtCt+K0vj* zHq{{S$HP_Rpk6H`W7#CZq*9$-yyr3un)$;$<$XZ(p)P%E8T5DHi4#|-bFfHQT*VlZOE6ibZm-<(6j z^fW9CAkrEx(u2r`M8bcZYy{(X$i!enLBiKKCmKYkRUG&|gEK3GGf#j+N>lssq$5XX zOF?G*#53gjpYW{gNoZ=EE+{InkBAI%w-aq4~fmZ1tw z9$~q4_1aRo{fv2+Y@hGLh3n&Nz9S}huYNaqg}ZfG0_-~7KR_k%a%lK^}d-w(nutFCM4RuCiTS_4iRDLJ|0O{pm9eX9=3xz$P-UgGTg>CwZ7_uPPR1g}#v z8B^G2eSHm_fu1R8o5`sIH-D(~gIutkFGtsF^`%sqwc@y8be)N(YD6Lb<=#syq3Wa- z>EicPe#j67k~|4}O8I ziK#|NMN{S8Dt6=SRc-taYKGMHS~qeSqxNh~rNhs*m-747AEB(_kM)oC&(U8wlwayM zQ7ymLwNLkZb*74K&(>}{kFq5tW1=?bF2EDMMZ~^4fCBB4wF#m~t8WqRGYW4KMGoAT zvt?gJNg;{!Wr5{Ez?CDTVP&!Ev)e0pK8^xTA6@O3nv^7p z9LAvQOYCRUu|yHrTxPy9Y$BViQE95KiVLx)FRKq zVs3HE5e4Omu@vO_OKRk4&Fr>CEUy@bef|twT#3`%O;WeI+37i4P(jLYsH>`S%WM2w zXIgk{4}F=woCaa@j^G(1&VV65vX8 zW56Bl>x=FIPV2mGf*d*5uGiG{h=zuSnp##t=1X8O`b~5mr(HsMSGH@q-hOC^gIR%_Bc>xxQg;X@41GpeaFB>a&@`4Zs5UricI%oJ2u3Ap6^}zTh zn29-Jvr?2>#0tZ9M>*%(!#S)bO_=65u2-bk7Uh7j*O|W-3O9-d3eN@`?~f%EpQuAm zSGd=mf+9lMa$NZMJz+|Ouw)cmr(mCYZ1_eh7X5#<_g<(+jF0v-SjHw;AD*8~$W=W) z{s22>naLQd(Iy#=S0ZFA_VrboZkPi${PbxJh$#SgNZA%?!IY1GzvqM-Y7TeLAKLoC z&Qr>{&7%r(YK1p*(_af2SGqC{q@E-1^y2LKEU}i|y1V#e!t^6L9^v6G?GD!2AB9iX z;&FEB1CpxT-u#F7R(_&_QDv0Pcr4dqe{ch&u3a@XRyD^I9FtyNV&>*&C-pH&AJe{N z(2ypilswz~P#5`eg~#+E6{o0%qzkAw7UALM>BU5v;4qLCQM{50wT(SLZg)X8;Xj}PkCWd}!DKizZ{)qr z?d?OACTAewN%4@Slzf?|r2|dGvXPO{O`EhFVi>#D(!7uzm^}W`BQyjx0&hNBWyixc zQfIP`(9lVg>xBMuO!Av z6t`NHelVi4+)9ol;h5gFP$2okv5SinF$~SbuY}fInd9Kb$8R?xqayZ9_*0VN;BFN_ zZl=Zn4OIF=hCcapcC25}EJ%ENTvcm`*9_Bb?RN=s96uQ##w$CypczM0>0W;~teF=? z#!c;o)aP65=jZKh=y3fAia1!_c2>rYj`}?~w%&NPUI(jJMK{7+#An)!9(qL4`}@^J}kk$D)#w zXW{9XqFmgZ)(Q#=>gD=6Gd<1cNCZSSW?(;<``ClSBHu@AOt6^6>!<<6Eg){vW}2xv z1udw8g5->h+nb7JG;5PXJuLR6bCSmx7Uw?;++pXvl!pu`kEk&`d14900v=K|!GXX$ zpH+JC-QI`!Ut4IV9nL>Lk0_rLi0{Idg5Vv(}cEWDIF1CL<%G z#hj4i;)&-ti|YSpoTbwx&F1JgmXfN8Xgw%3DBRIN9#KdgoOBu7F$BlsOKk3+`ET_^yLJ!f`E?CkXYv!(^BPH`)`|6 zd>Hhqjq`RPX??7tM1g8}G|V!!t+Q=$D*67fo${?7-BULV z(9c|Ps%*w`Apjkvd-Ai>(dvPkcHc4=SRqb4PDgXz>;OHQu0-G(o0!;FBp$Ib)u8k> zEZD_*=ktt&fQJ-$*V?$>T`mdWHqN>P^wfhG|CSBLOc&GZu)JHN)MU^x(c7r~)XGgT z^efTnP%E*WpJxyhbmt49UFodik+(aItG{xzw>DI%!V+C6@AUFB7BSw?aIFk@h+5c2 zOnI-36&v!nEHL&3XJ3huC+If8W4)dB$)LeT^+Jw7d4t5wPxPJry0&#Rs6eR@X=+q_ zvs$a=0&yziM-L7da8Y{@{&_N%WW6_KpQ?*UKa~f`Tfw){N3ouDUbC zxKksG6^|n!9||drG^W3}*?swEcpt75_U+E4pzZy&V11|9s<(3Q8JDV6{A7Y?x+ z!_V>k?+Y{UJ@kwT#<+ct+a*CVLG$kQmor<=8;zB7Q4Xukm6X2*$~kSK*zFeA*o^0C zyHDmngbBqDRoZBTN)XuytO$@Q6b4>*Iwp6|TD{mAScQB6^+vh>&{w{XIm(S(VzcJcIGic{H=+ z5c-#Ie@)mnXv)eIekt1^RHWBat2B3(yqs-uuUENDD{&&&qOVjxSadI5CP6njs;Pu9 zD%g>kdZuJt()y+9Lgs=Rqy3a0p8)T1iilS+teK{#wO56NI5g$EY8zU*8(Q+dB$moi zH7m>psUv!O3jpy0%C;I|YdBT?qd_4}&J4oYie+R_uRkZ!*48d&8^4RWtL(A6@}@&2 z#(_cTRZr618ehrwhzY;vvf)h4{95@{E4#Q3mN&;gS{1V-!a2uUJE{@iJIif)5QiEB zV?KG1if4NkD9M8Fqt4QBMLof7sk-Y{eJAgacQ*W)z)mD7{{LFc^P=9D}(3=p)de-n*gUuvlXS~FL?c})LOMv&}N5gPgTIPzs zBp-+U^59tcwVmVyD=5v<6tia+Cr1aX1MYLF#7aTG<9yH-4x`=)x)ZfrRNm-P1HIgv zB#@kBQi#v!_+w?n#tlQ@qu(HYuD0&9F$|EvPFKJ+e%-W=3ECTU{Hp~kg9qs>28BL% zPFR!-^Xa7@c}(GXw1H}SuH0T^X)zd$G%7_5Nxk_=iFIA^M@0qdU@G^xb;)+u^3MtL zTnr?m9K27~C{KQtP%bw6HZ_q(J8st5TtD5DSbC~i2jVI`!tBIjM<3D5{-fp&w(Zp# zm>j#pWi3kfrOd>hyJ)k$X$<_=tgNi7eU&3H-bXZbs7gEnt}rW?-2@rE0lLWIwNY|6 z_VqEFaddq4!6Ck`#&2u}4H3jvN#duI{G+MjOZ~&c!#|^Vjb^{uxf~x1oTjX4IUm}s z{=}0>mCMGjyFxFsRE+q1I^hBK5qJLc@MV89gxz08kql>=; zN;XF3K4vS<$@$7+GEPb2ES31V4{IlL-J}&IFc}g&G7rrA_O9>BTUZdV+ItJdE9cru zXTwmgt5&5LHu_D;(f<#5?*SE6x^0cxCQw8$A|fCnB3UF!R-%G{S`k;SbQW7h=gkh&IBSu?&wEMPR5YO0Go7R?f^xheWn&87OD?C1&h|KB| zPgX5?HdAX#<{T7Rf`5bg=Dp^s%r#k+@B!!S?~5nzm^(xryu>@bvc7zo&-o-?H|Zsd z@$O}?xlBB2yilmuvtn91ozyGmS3|O@+FfL{J89JCf?ru#DN0apW$}Wl;NjdBUP}Ot zd@($nwH*dHll7PRUM^m3PqB&|;dcuT4!+ozheU?skA8oHRq!6Fc2?89M(s-_Rsuq2 zi8yZZGL*y|TpZM;+Q-vvPe2UuJR=t#D6}#Gu_o5e&NC;AR2JQw_c-*|3Q?TcWY@0E zmj%(c9QfzPtVk6fMfGLb6l!^PnV8(Z2%6<1b|bWOG|xf(&(=gHJKLcxy3wOUT|DAW z@qKCh;vE_z9n5{{l}*`c!CKtJCDGN^h7g{B_ZoX>WaQ%1-0JuEH;#q&?4SG&=VzqF z#KcJZ*al4MU{prbL?Aa@Ek7m)s;vu$~aspHLfydTz@UvpYXx!}88Pz|7#YY1hIU^Nev3TeA}{rY5l zq$jG$e?LvQ>l4cyTYH*(nqMRX`5z1e!f!wyn4OsYik7i)xi$m}@ znAxT(wfewemn%oJU?{MrhKlcPC#sh~E!2!N_QUwb{s_52r%7H&aDoiA3qEd9kw>SE zhqn5w_m(pkaKjSbU{y)%=*aBB455)|(K$kShU6Fv&p;fqGlmzw(GX&Lvb=2m6qG#! zl>$Bl-g{+Mlg43dIxVUXGa;Mnr;U=SA9;J7Q5>kP)vql-h2q2#To{nAWqeX(!rhsUk1sq1jlg)_inR3P}&- z;B1>rZ34%Ai>BiJa8AqHIail7`b!XpU7{u4B#ix)l|tApB@&BZeATzs<<%EmD*}Vo z`p+fG%+8OuZy-QfE@ytdk0@oxF$v7RNf1NVW-<(iA8RUsX)gL*Uu2~?n_igQ&uM*hbxdVP&-P%&g-GPs*38%aR}_dNm5CaN}sz-N5FTb`_?O+<@bklS6H7fA)X7* zcVDu(#iQmIjs!v@xM8`ptq$Sa?um&-U$O%ReSyh3LZ_glbaHcXv!T}_Kc9l<2x`hd zoex{}>P5aSW<%@!%0*k>sG7RE-MPtzin_o>-<^fk7V`Dikyd3VVKbfBoHMWau4mv^B*EcNT zsU`Tz#%erh#Q9Z6m_Mh;FqFsyDsn^ zehg39quBV+M-)3SExDE(`v&PyH|eDQINXwnk&%*eDz`4k&6gxvE=g4XL97($WGKib zJf-zlEqbZf7MM~X=z_rI(aU5IN-tdN`L9knqOp#hKf!MK>9I|H+cXM$#e$O-iX_Dx zBet(SGwVDkJX4aBuYmjQ?=Nyw>?u&3qYm)Wx=ZHF!Pc}SWV<=NjGCmg+azt~*^^$h zEY|ZcxwkWx9w&B{K&=91qWGmPHda@^&=i`J^Q)TxTaAk>VogC>w)q~z zT8q4^*%^pBXJXraiipd)tWu1qD}|AXX?1=1EMYUEeQGS%v2d`yKG~Edg60i@-u9@A zXCVDzKT;Uj{Vcg`m+M1Nv!f~yB&q-5E})?$+tbx&C(x~vHZi#M^l5cja4J|WXldJSEoLN$Z8{5wd2co2PoY1@GBcXM2INKV=r$G;RU5CY|Cz) zM$PXYd&BNV7s zoolQVvNVZAO)u8pcXrTBZQfkc;F^@m%A}OIvf}zpXNTqriScwm6anvfkvEY%hLhB@ zh=xDtdBH6d9XlG(^NWUsEFfoabO!)I_>a!I;e`A1nBhL|U?qe4jgX%XOT{R|mcfy}& zYC{eZqtCz_xyKpz@ftDv8T4VEkQ{qvCUV*h15VUxUdQC@_&<8wj+bV%m^{@Tk3b66 z*{#hGSS($S#=OtztBM;x`qQ^5)k+O0VX00xv952l2Uuer56pb89HbDl3zfhiq+u3slM5O3KggQKnNm zLv**hwDk3N^trsczhzx);K&=yZAXz}0DrugE@h)Tf%Ej~18PhuDsj7=P z#w^d~gK1qfCO_tDR!S%wuFLbiP3ua=fmwYA^95E?(!#!BckB*c6H4D=3PzthK6d1{ z)=M;Hu4h=knx%5E$;a9h()LEiIe_}sBvhgt20WsZ@y3 zqb(N!TW_U9+Oat-9vq`n&bnPN8j`uZkZr*9{>OFT`ha#6ttuhC^U}&H0iUz$ajYHd zz+#W2%&@P4R|@`M>Y|*L*!*-|oz#R(KzHdCM6bd=#EYG=nfMyeDB~X|PQcfmDr-K` zN?~hYG(hr#mB(?_)xzs0`tZm3_+4CKXz6jg?QQk9oUwH7zTS!?Bx+f4zPVQZuU=&= z_-6Y18}~wtz(Oa+IWU9VmI+KZ(4zTQQdtLwG7tqkMCD>IoR{HRwoM-!Om!Eu0GJM-U#Qs;BO3>vovkRs8yjnNEX_pDt!`oka#6OqP8>3h;}&hHG(mM^jy})s zpm)f1d>+?9QS2Z$x00_kf;c5!#Y->C1H~#jP0n5EzVYNRzx)G_BtM+cv#BH9lSa4Bm0% z)yfrYe`%?Ef9`EE%!~IiqIB2s1HIuvCf}T=QyPqxD1k5yGtBD&19Xiz^rc(~P;In^j=I5@3V$od8&O5n7#?1AfO`yf4Gz8prT6TywH zmy+v|*Lbd>F+p`xNUNm@`dQANCF0Rn=w1=TA>G@53O?55*hpMT-{Z$(S1|Sl+gU<$ z#v|Yv|4AYRcKPtIBq{Dt`NZ}w7pS!YW0kGQ0_J1`YwH`5b^=&oOU7P>zxKOrC!sPG6JtMuwjIp}H#Q_dAmR>;V! ztBE*6j$XdwrIb17$NM=gRhbu=AjMpoTR5%X`oRJcqcz$KwL zt#D5hk!0Hi#l}wLuM%9{-Z{BG4^Oxh*n)G<_#Kc)7w8t$9{rFQ?TVMA(DI(~r)6-K zG~IWNr73g4hs=cUZS%X~`=m{+@-HkbFLa*gXL~xiBd|Y1a&dePBzCZINxt$@&sL|8 zr3~qZL`IevY(`MvOqMLW&Ord>c9t|F9hkPFHP+sM_aSo{A&qsK^Dq=9**hU&4b3e!B?`dqrP07%EbFka5hKWAgGP5k+b( zEcBNBe{WAa{6Pdm@WSqC>5pBedta0w{6DK74EWye8ZgmHjW{M%XEhq;6aEeV%cEUBahey6e2XsI!Uu@fl^aKZ!RW2 z9*>YG3Xsi$wP~BJY2P#IaOOvvMk$8)(Wo278Y!m8e7WR-2%;)~qbn%&vZZ!KBwMAA zm_9bUWvntRBxIqxh)Ug`_eE{{DgRq(3K?748l$DLb)Cs)Hzs*+LPA2oQR!7AARsV$28W+&{8+5plL6I+u2jWLiA6Qo_m@;1 zcE%sIQA(Vr;FYO-XB0q!og|aqDjpmhiVcICW%R7tKsxN@1bt)Uj~kcv{5owX+E~@Q z&ZFj6R##1i^2eTaL&MDsO>vJVjQ&YTEMyJU74Y~$1 z7r&Lc;h78-XFlKdXzhFP!qRwng2nD&53WeLrluFi7`^9)FX1>Zr!)3Og3Wu`#*l{x z1QBL7rn%lileB~HvPMabA2}4UN9G2aTU*Uc6%;aal}&mxEDq)sAqwGp3-eqL*XkaX z#5uWgX|;cYuXe>HHaq;j--#L|x@#|xl&i#(6TY3P1Mqd9)!C~Y_5uLSUnz!fJ`z!( z8PQ_4G49@~e)(`7a5N&@*y##i=asn6sL*_m9d+|pbzoYqEWWz0wGlnltd@U8y)zoZ zouaQL^G70l@&#R_0!4ZrppW&0r$#NdQK|EinE^jdSoe#Um}|2*<=jzv?U4Q3=Wi#ZwCI1Vs+nXyopqMLQBobc!Oci)mZLE<_Fo0fGZ)v3O1+R&sAaOtEf5M zPsn^(QTvtb4Q}$sq{ar>M3ROi8U2n^0e9P~A=(nMjtW3CkZ!J^c#*44Hi>--cZl8}) zoIf>&i5Q)p4E5p;T_wTp5Q$a#yk!-_$Msh3rXWEIZJJD7_P|Kggs>x5j_JZRaKpic zPrp~aam%vV90>2r;j&(OI_yS@wZ&$eYe7R+?p!0?uD>42ATOILqqojx;Ob41x!$)f zmH6^+)=I&UQl3`rrgO6{^Qo>hUlO*#o|;6}utUa1^gYAJ#u5C!P867WhJep{dmD$0 zkN@>C2QE?dijE#J1tR;LhWhO8Q68ji@r{Ll=c}v7J^y#;Ul6T zkywlV0lUrV7xMyVoG`5cPD|?W{rvo|k$Za#<>9S?1RkM4h4?KQrX zRNH$hU&R>OEVQ*Znv&gB0{qFHABu~gl<#9>)l zUP8*VmM}Irn-U1nY`_C_x5IGB3}cfnyWNVw41*`avaYNQ7b&$iD$Hlo)@<3JBDkN% z{%u0o-q6eH{-?XUE#|suDqak8Eub}|*8LCEC3gNg`aEw(K2MX{%82ePy2&;HlAF5&fw?|X4pk1 z%+_vJ1i&LvMahthpCxs8LfP)JWh5Bs&mET94%*!}1u1M!1D}7RIR}>$+;OQc2<+~xd6LKsL zqE|1rrThMU(6~3|(NtsPP@Y!O4bH*_&c(;q*yN}K^pmo6Nvs!O&RbAgHNH>fj3@2>mT?a%&i zcJpe2(j^*{vwNaD{tZgu3WXoXqU8r>@D9Twt-EvXOY~}4I~0vOYi{8>AD+lz?F3zk zh{(vMJoKBFu3EF}U|X03>kg}-(oMp)7O&j5E-GlTu>@ zm*h^}Xym}kk|}@MMdX&>lR@SzRVI1KLxZ!X+viA$#)$C~>K)gv_0kZG)!D8cJ@SfR zBZ&B08)I(5lUgZb540zIWhSygZPA&L`c9chsi)j08l%mXCVD*?P)5ufrd&iZ^6~&2 zqEG%h=)%JfwzF1aO^aU{`rk(;81X^8)$~s{`_Iol;1Lm>0iMh9^p%;Uu!$Kse{7{C z51Yfb@4IIOkXtBy=FkxHsgjO3hsELMLq5dP(Q385TVub64ol_>djGLsj!j$|l^hBS zhm%3{EMIiwA+(#x9XdPj@%8K1JRs0k@t2D4nNG|4c82%n&TXmLon1iO#t*#sn{))T zxwcG19v5V<)TPny*-|kuqz#6dxUS9heXGl)Wxcr4LOJl7qogaYp)JL6LWxh+myM2= z7Dl2kEJ%c(j7%qLY6+F4A#^;f_|H8&)7`sMbV?WPIK*$96C+|H0hy&(k4q3c@2nYg zW5UOjcHOI1as(wn5`Tb;pQ3C&JSVjK5d$3T`bT^TyYmv~m*-86?(-0U+c&PsSP z(rOY^GLRAL)HQ$jl$VrePx%(xr1d#$^^e&^#VlO-Ujjt3`IZ;&x>)0W@BO+NVkzLzJ&l};=(O4we;udmMy>-s92q}X@4xg8bRYMpH z`HbB8AoR%KVa4aqwIPKF;WiRMBe~8cX}<8s5+)io&aw=Be7n88&paUu+w#h4iE=|bU_5%kG8sbBtCMerV)jNY!aj?yx4hMByi&@ zn?5t-8XkdxwhbG2`(GcuI^0%gIB?u|_0L>Q`1*OBdrq$|jP-1u^-ODrv%#2ry3z3yazJ~Z+XLJm2p-&SXk!;zw zSEnL(AlK~c?uOQFtP|Ti))4Nz!J7B=;4quF&ZQ6E-e0F~<$3G13u+$247&(t*@;^E zM)9HK!yLq-TDE=%vmb9kmeFi-kA60X{Y;cd0CkGuAu8D2zY~!yLcQN*PAd9^Nvkrs zg!BNZJ7@?)rOJ3oJbA4gE5{j(DJX+prc6e$XQI`tCO3)LZaof}9iQGR=}cLprd7yb zW>8<!jktUlNhks-C zX_nP71}r-}e%pn)fh9S!+VFN6JI+Fw0|k_hig0f$vzJ^B8_7^}OmnzuAL4Z9cX$@p z?&ZapxT}PO>>T%WbzoCvx%A$jh7y0$474(a239Vjvw1E~cY*W8FPDLz8s8Xdu`3?x zR%kb*#;wGP_qfn*)B16}lPag7VX_N8KhO4b_y+Oe-ki4gY{$#FK$)u2Qm)A{$;w~xAn`~%crLH{Z^wX7&ieR3c5ZR#g_!T;%raoI z*-8E!X>WhfrB2FIZ%cEhc`0Idd#5~{TNz^crUHww<68`P>fzzx<})h+FoF95cHKt+ z4S6_qC@CXdadjHPcy0FbU}`iw&Sh4ERslQPC)j8@(by4$FNcMt(1N&_m_bK|3w~*5 z<<8Ff(CX@HU0IC=-2V?OIOeOsx-s(ZelgOe-dDWqBSX!d$0oHKT&B^}Cr_8t2oE8s z647kuY@GQl{%8tpI8#Y5tHVYXRdF%TWL#XImC%9d+O+f<5Nf8W`f&@tB!1EC(3UYbqQ&Ba9v2GuBl9a3q6&IW3??IKlN_=lkJSkV~@#8a#`H^Xx z<9bXqN=iGsI|}lNP!Y*An)30uM3;mdQ6i}vuVX)UnUpAcUvF4VjBWpD4krw21C{{j z?`+JHs&wSc)+hQ~c>bt27g+RJN@C%q{DeLkP46E@I!BznBCm zyD^`N{a%@y;%OHRph*C&D{(i@4H>TbwCz@#c9YoSf&hPi^NHDx^b3@U9kYmv;PbQH zeLXBjt=3@K5QC3pZeIieiLLD*e?DxYIchfJJ-^7vv@R@68u8>a-w93fXwe`Bfa_Lg zcs$7*I_F&dqc!={c2ih6b^=Ph1A$Hr zXNC%7sEsyDtjH||Nj%+Wx>Fl2toJ9Waic<%dDThD1jyAF8LBIBwYMo3$GUEdfg+tm|0Cek#CjalwvWhFb> z-3g2$u`4LFPt&Jxo*pXfO18ndVTno|Q!8AO79yTUx!Lb56G+GN*4LV)sU~TyYL^^X zZqM-epckXki^@MRS)oT~80)trXYC0^b1uo$Q#69k<}G(4=8oY$X(q%?DT&ev9KWso4@ z>2TTC(uph@+;Ma4&b9JoT`Vd~wO**FqyCT~vq9}}v95s6*hp9F0;dnA5>Q0%^i@fL zkmXvs)&>5N?C*!yj~@93sae{O+VT=dZ{CK1WvS?QJG7uRBwIfN&fB2dBt3=KD%a2S4tt&pwK6-Q+!J2kf(I zQfxbP&s{oB9Ee>N?<@G;F8kl&-P&CY5GCmA?G_;AId3&-xccp{Z>RM7?<&d~o`t^( zQC#pr*4*StNiqJYoY@K#_TTJobocfGTujQ6VUWfHNNB!|4G{I_efuY7M`@j#Q!zSb zP-DA%_58J~=jWkdLALNA=Oz!UwvDxQODNCapxDu)5nYzy|ENm!>OpjXDhG=Ul6;`X zflBuD^vrn@D<>K&MW91@5~Fr@bYztcXl5CM0%jt$(ctU@8^R3YDGm{{ErX5pyl56S zXYbqK4Kp1n*5gs``)nNy^I=$a^ZgLNE+lVFbv~+o5T;$~=^ zA|oOkDOoHUU%LRiFC946Uvo`Jx(!#>W`OAmIt!ht+;-ySd*w&a&+yW$?Y|^`*2RBk z1Z7KnXkjwhs0U>PE7XAe4L{~n*jJb|f^+OQvJ&g$QenKg4w#tm&J-XVXdXdllK>L^ z@x!_y{*d>WZBJICGyHlmc_YV=n#(}bh}&w?D{4+I;mNbT?v}ACAMJkh^JR_uum`j5 z{~mLVSdZXFit?ks;uF`{dyL-3Uuhxw7)Opi3o$o)IgUY6?%SMkh7PX3_Adq!`CFNq z5B;J0itmtHVwF{u7bA>jQHeCmXR&Fu1hu4`g~GRW2dn$5qjC~c4sqse7XSDTkJ94W zpq&>H`h&0~WDJ+ua6AOHD22wg2AUg0o(E>s7M~}-aDhgGjB!)}y~N*W@UbldQxynV zpMP~iv)1#eJECm@L{d0DOKB?>SP)3%t7#?H_ZNMMRD0&jvwt*BTi5LO%X_`7;+Yu z)k$D^N>B$BA1=phYsYc2n$&iUOMJX*Q5sVNG=s~0ULy!bIo% z-@ngt!Mu|X`@dizP2s>5ktlP`oNSPgkSOsF<BWxwn|piq zmFO+}s_PquL02XK3_4$jK7pPPHoM6^K~In>q49eddi=N-A!G8|3KTFTLKqF|Hr}#v z&o2Fth5>^Tw|TyFVq}D2SVS`AEnV2@rd|c*rf~LX-R$?ZK-xj|q=!F1gCE1|-^5

J-t(C?D*vNbSd$Mpldw%6G^3`$t6)P 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 O*JNyHeySLKDeAvN*8HCU literal 66235 zcmeFZg;!kNmi9{=NC*`O5Ihy!9fCvQQn+gZ!2<+$h!l{Z!QI{6ErH;{T`Rb|`(5Om z)7`iG^u6C7@YOrUn;KQScI{ewt-0p>J zcfl)*(J^V@pO=P`N^leuS4tF=j|dc$bMVr~RTLBlW)zh5Hz+7P(I_Z*AL45j`M?_w z4P+!lQEqPkOK!*t14p7ri3+PYPj1dQX<&B}KH8P~h=N9p_43YrobQw*gTH3oS_)St zt|p#69xZ$9*f-1XhR09;bsX|oL&5JkFT>$1>~WKznjO)1h{Cho3m0eS(9TWc{oePS z){dnzsNfs_@8f@rz>gD=u*(mgdW;75kCgY#+S|?t#aAj}H=`X1H(L^r+v9V8y`zzG z4i7@P^Y_!2vEL!LcN_)fGL_lr`QK;B1I^)zf1jZU!TveY4)GAVSb?F9a|{F_!SweR zyf$47`pCBDXQ82?9NUDohuduC)1m<)w;v-%NZt(*{>d~?Q1~2`(+?PISmaU01gmwuiK^FSZiH?Zo!D(72f{TU)@&(oEtX0tmL8i_S95Z(>M)Nj znY5ODZca@NnsHOz8@Zcsy?CAAN;s89B}c-yf8v+ne{s0Er>mwxS}RgM)5-QCHa3=l zfnNLxse!RMtxJy64pKWhrc5LMyq+N-iN`YgAlb9Q^{xH`aQ%YRg!P0mOM|*6+GBQ9 zpCE%HvK6D2)r2vsbsX+p*N5u6z48-DsL<}ak=o`O0j&5&8D?j8STI<}*OcBRJLYWf zpZCt0G)v4IyWdk}Fj3w03-tHGA!4=e-8>(Xba_bjV~51St3x#B1$z2`&(uE)(8mzS4Ty0!GNf>Cl=H>+*DlT$f)IW8BcPYGG0 zX=~OUdIqQKUCJ_X<~5DjwlB_hc!`I)LUI=HT|_3oFu@(!J69D zE*C#o8E7b}p|LoXP4O6)r^4p-hsErhG%D_zni(D^+Zb+LMa2*Z7B)7Q-FAIP2Q{3b z=Zw*gX!CuyQ@dDSo*tJ~BA@MdEh<6i+tt;QsJ_I(k%64D6hZf@=C z$&nOYUV=cirLsQl`oqp46mwJfi;IgJO8I=qeQSLrmHa(Z_Sm3G$D76ms(`Bm@w8_! zB_-tLypqCW-oVljw;e4#6NOOXwP&Y ziKGABv))-^1MaV>`^2A*x*<3uN3k=o=F*6bF~+pK_>fUkj8ES_ZRooyR7ns7zeL2l zIVD1x6&C|I@l}UDULwi@3LQ_r1_mPQ4CBT!4tyRywCYwz^={^IJ2uKwTUlOC;IUmD z|9K_V*_k(5<4@wcyBo5RugS&7q#YaA7gP0;hjRO{gslB3vGd_#r-$GTk11b*9BF^m z$;if7PF-tjE0?%&OCyNG)N+-YAUk0=L<8+k z)~{b}ThmouNBbE9V}-qmoLk2Ub;t%w_4>kK0s$2{Ijhw_pVSL=nQr`pTI(&|HsVbM1y!j(^|4Yiy2ecM|#43Y?he=;)e!^k(YB z+JDu%-6Yn!wM?~VMpP6A^~&R~^Vd1aNWlYx0&z|@r#P!IiTOVCf4siqd2-F=VzBh` z{nQ_lKTbP){K&u!HMfh?=|;C53&BD~B?CPHC)e(WPS(hq-x$|z7+JQ?V+EIG-Z`E7 z6jtEl-!VWi{eju_u<0OnNAki#$j0)!Cx*#v0vX~(&WkP6CXe#Y>;cL&$8w}qxy72)5D>T?T3OwhB3&X} z7%%CL+eOXgOYFmRC9dxu5tEToj%$h8VZD$NdZVR9aJ0G$?PZXKN6UK8Hn=W7zHes& zS65UU9b1@~7#D4DQ|AfXj-BeMhU+1%lV1L#;{K=o59zz znwXf+pPT!Izp%2hD&I_b8X09ATP75`AYUQEBO+#Y_twU$oDwjO(95}rV3Lk%j)94~ z&k_4bc=QWGOv260n^QC>IcE?l7D43?qoCMWg5d5176;q2)+U>l5F$OWTt1#BVMr$p zNLhVhw?KtIPV?k?J?0t|(iQd1TAWs##B#I@XTm>;K7}MgPxr>>d!IZx;*gLv-~BDj z09KYMjx1rLWj7u?j2RA0Uwn>_kH5Z(0Y$VgJcEUXhH-Fkph4Hy^`8!~E-pTQ{ycl_ zGXmnnmsYHxz!f+)IQV|5ZEw9|19#b2y-0UwrmXJs=g)^M2VA5%&A z>bjk*tUPXRCd2KuyGqfHs{VnF?oWO{zIkLsx6WXq*W;qBv@{@&lUU&WSDP|pWQipR zPUI9+RU79!@{c@rka!6Nq7vE{7ARq>_O&EMex$g07TMp#??OdiQs*k9cqQr4jn(!g z9yg7pq;PZBBurHmm8IzAkcFZ_bIo%(Tpbl5s8FY!3t~YJN>0YYY;?G&$K9adU@Cpg+~K4)Op<=< zwJwg9_(u)yN3OH+njGdn2?ae}92=_P5ybDcEzC_#&CC+&>=nhtCbGZ%lt;@?E>?*B zSY>BxzOqRE9Nik(z-t-V9Y_~NoAtAT>^XXam2(pRUKN;cDxGCfOqj&nl+vhXs{h8%e4%`wXlty5BI92x2(z?kb)X>MkxVd5tQZ>@~E!EyFlGT*QB}mIS8T zVL*W3SpJblS=VSKhqCb8C51fF?F1G2p25+x@g*Ide;3-q8JeJLUeVLnYv05-&XuFU_Ha=tXTitW z_Nxu;{^ze99b(<;&v8ZuSniNSUBo$b_jql|%E-t_%gxprsuMo)-IvH)7g-?Q+*DCj z#l5NN>T1@pKgXttduwSH6P2{HwP0Z~6$=5s&hC8kjFewr1@1FeX=aSLX{< z@)fKg2OV>(y4}qPCL9GKooY5(j2CFYreM$0)UZ`5m@WC ztgLV6=2jT>QoD|hs?~6DwH-Hq|Nb4Ya&SVzcbQh@$^Z|+wGAVCtd2u;5_Jz}W zKjR_%bjY)TwsQ@XkT&rMvf!u_Ma1&c0~Rky%;yHkTtT;ZpeI4ag3<|yf_t}5cDNUh1_K^cYQ*4A*$yYif%#(lLPKHt-a%jHM zpk2BSO=e;~cDt*fQAPaYs{Z5q|8M|t_rD+E>1KVInX z@4W7>2)3JHm>XD_GD*3IB05-hFh=C{vbN4ZhYACSviWa8CMZY74LcQJ^w=(p+gTXQ ztAE_j>|^6zi>O06noeJ1YbZpX(#Wf~%VU7M742R{hNv1l$V)n6r-!2|W_ww{PP@K<1|hbUy7RVH7v3zX0E`)pOVth3Y5G zchwxXVWvWD4XL-9X6LZ7GB@~qN1^@UreA)elW~<$GWZ?eA)N1zmt9S^5elR^$b%uO zqlz5IknrJQ^`B6XJZ5BMbai$0#Bo%Z4#3pZ-pdy1)md4MHmAGT1;o)+-7Pxj6KwPt zeLXhw#dQ*6dr85F!y3uEx3`CYXliPLs9{0Zy$p|gMd*%;FM;|^riWyxfkIwp3HgLs zU`r5f&TFSF%Q)#6V=l{B+5e_L{=>=ANAr!}1oIjxi^nr=`%lE%kGHz;W~-Od3NzOi zS6?SvCnb?w4h{}B$tULO$fXTX240AqAF)@1Q4uRZgU)a@<_{>bl-RgEC3^A{gN}x# zgq@4@<|0~cR826|Wg$zBaGft(zesPMmWbbG|4&GhI=$|6mI-G46}VY1q0hr0v1>Ev z?oM>O3{X)K&4JvUpv7~Wy}ibh?YJt_xi=Qw1}t{Ac7pDwFR%&6hC3iFsajv$xSwn< zG50z+RS4d%VCJ$gwANQr!aCY+NV*||V_-ONaNPe6X_oJqb>RL{^MyOOV4waK ztDNu|`Wp9xxLyHU=Akn4E*H|I?K5T_1(kgY^?du?-HY7#O{tdO!;9PZnmC^xKY93t zwzI2ON>cXy!W(^g14c43HkZrS>&FR?Fc+6zY)$c8p?@jJ%z0@vo7x(=j7#;D^bHM- zcLSQB&9W?=MR2Wky#jT;V~d**Qb4_-@b98CeS&Aj!L3kt?_0^3?3( zHygW0yxQx9wXw058%&RI`t+*DQ#^PR3mKv0OiVkQtukH#BuA@jL&N3ezQH7d?uXGW z#$&!M#14jFqALlUkG(Hp35kf{uzpLhyQ%5w`Y-~5ix*YzjPsnBSXo0QJ*{A7bU;{2 z>KkN!&7t61qoAEB}eMpTfc26o}L58bU%m2~$nPz3S;>q3mx5r z;o;%(!zUD!Wgc~vV3xkMZua;04-5#HtguNRFvUtN+~#&-50>d!&N9Y^-4~+((_2!G zpy)`Qj4Nx^cy^Ji1^&Umid+1+Ddm7Of@zI6G&yrd8DKSfEr+jQzMs{(mqM`cdV1<^p>#?rx!@w6; zdqY{7;^O0WARMztBZ`A2;?~Tl+0dXP*RITDbaa3fRBN)Wsn2E@wr_66*CtU#ZXx9c zTL}17>8~#bEMFI!YD6rx+*BzZ_TO;og%>|uM}-E84-F2cN?(%j)6&qaP32|Pe{Rkj z`w12d<~lN1dUm$K3t3@D<-k$Vzq|Vg^U8~q`!i&)Oj{i$31Wn+c-zb)OcfQCSdS~6 z7sSLv;80bZk*rUjs@$yzIV{)tOp}EaoM)yk*rF`njf?INjj%lM*^J(1aMFDWA>Phw zoyYNXKb^rpC^s*89w^Sn!4l+t5h;x-guXW$HP{PZ~6I~Kk%5&k2iBNGGZbVujdx1%&?kir&`{z@;YsP zIN9ch!+XHYi>`jXa_7p7eX`G$F1v#56V1pd{??B|h19~#%%XN)_sw79ie!O-aot}0 z>oTaCTic2%D&ke;Uz=$qRdP9kwU9C#E=Eia9uTroAAC>qoT_ zUTv-IGSRHAtsCdrb0SNNi#|_DoR=n#&g_g0`@j~VfW&T=^Y^e&x%ug{ja+g;wr2?X ze@(NJ=|y|+;4Tc+e`2?9EonRK%4b+u?v%wx|Jq9VUSas-MzmmOY!YGAkd&c1r?vdt zR9V!{?(PdBVt&_CX38)r)RHPokNw{hzkka*I5@z*de?Ak%lJbK22xwQlhs|$&QcRo z2TWrL2yhvGry3fFqNRAp#6)INLVs1elvV8@c_$~jIy(V`sne` zvo&s2FPoCJs|x-6{4n<5^V4PJC6*3oP%2U?$t1|2X?X*0C8?l;Yek(K%%C(TXDvFU zh1bC}>2HM;KEW%K;uru({m+B`Ki zEd;i|f1pW^YuilfcaD)F^wRk`1aiou5!{|OV9H(N0unsDYdZxNDz2!m{^vM2*;t@P zg-M!8(LfggHW-6K0jC0R1_80Ol=GfVU+)GZ-r4zWJ2E^H0wWik>FY$BsE}QcJy@Tg zuBqV7c>+arzFXf|6Kn8je_KYDmKqSpQQ#g)i8k|dXk>|soVugi!tV7$SJ%G8CTd1T zDLE+{bLCb$Rc>-nu=6^ZlJ3qMr3fXb6k3^CWu_>?f01KivMGoC`3`yN+cPq7HsXl+ zo}u7@oo;rOv^6O*gHC;CwlP934I6fjan_gr3GoZDj|NRj(l8>%mH8%@wXtWPVf|$+ zkWi|#bF23HVn`TyaY7OA`4FTco->GD51n&2PgnViWdtP2WCu)bnb%z@g}J%;>4(=X zzO%g;+K|!{X)?5n*OS6>~L-Uo^L!L7-Sjg5_~%)-TWa@8(Ru)Yote8R!OKHGScoK~Q#qH?&|+GMh#tfC^@*8xHI zj_~R|Tu7&+lvHKf(=b0}F)OQkOKLv+5UmL_{Br2${);C*5fMupe;^CXJrNr8_dKp1 z1(WbjPL^u?4*30h44R_L)bP#UQ=Mx@hV(LTFsm1(=!`~?+`!U9N8u8PL;L=+oh!?5Ga#--m1HZ zYog7hw9Gxn!)vQJbQi_5+9BRE{f}5Ta|K_qt=tvrq}L4k;@4e zCl&1MQ#=&|gTtr0bB1PSX5MhtKNEJauZlHjElm~g&*p}FF-Zj@1Ye?osei-;b$^Bh zol~5OG)69I9%jM~Ijs|Ku05u&uTsM-!aqS$^oXPtNyBNk;i#jJrDyYo!v)lBv zOEk9Q4_xNMz=$B-=N+F+Q1O8!Xe}G{=OMK;$I5v@7%%6JFF&+j|CJ6lj$*Dkox;LH z5txJo6$Ag(C^7Q#@-7ZeL}3CC*jz@foOiLYTVO2@4>#zjsIv0X42_IjPOiUvx;h7M zbKIsCaSF9sG243I|rJA>uMR~`Z`R_-@Uf_ zy}Cc~QcNd-qdRJw-`RQlZWV|Xj0wCozgMME@p;YDFESbM81>EGnk!w?rvakPeSH#3 zVQXt!;8j*Lza-XU1VG0}YxSOAS)l5SttbyM7ONV&xgf+GkTN=z3KgiZt7vk!*1b+= z<&T^x9C(aM`nuy?H?EPzM*N>YRgZBM9^K2Mzg&9-`z-pC-bhHE}C0F zf1!lqEbvIZ&iP#-VJ-V)JTPaw+#K0gxRKeL$vis1WgwThlp&dEQ zTdL8=#;%C(9PQic9cT+mrIm>;3R^~0)mpSxX_HVOMuS2a1q+6f9jeM^*)*0!_q;9R zos>WpHT2g{Sv-)|mw{|SJY;bsc=8uToIx55|22?2HJu}DD!CU98$Rqa`y@q+aOv$vLlUlUEwx_@vxKp#u(S5SMd z`?gunyVEc){um=Av~$_D`tD!yaJi2*S3?;5i=Vxesc>Xe!DXh}%zS!!_*c4OBhNqx z|4Ps@dce*5k3BB2eXka}kPJ7}@-jxf5DEFF-DOvTW5NA-?2w&>jQojIZp;=OQA&6c zcd>QSovZU#w|uC{6?XbY9}5vNd;%U;c=A_7tfrG1)#u=>Nr$@>ix8fr-x(bN=|HPC;~l( zyGF#VQaBlW(RawTEfCA}ANT^=9Tgc#OGn3LJvy8!_E=L>HZ4NbVi9$X&h29M8z9Mu zj*brI7+FissljPknGIf@fJH#wmyH=@W4WwlODubbzJI9d1qT6cH)8N}%4rAWoy1c& zD}OEnwFTDAbLE19?wud!P}v+GH>73e4z|rUx|im*FHDq|T7^&L$CfHRdL)G;<9qTX zr<9M9)2i>&m!BzbDJUo+mzNj3NQb&6*Con7Tn?LwBs@CW7|Gig0jl)_0k=lO1Mx?0 zyoyWPx^)5gEJQnP;FlfIK{rb_kNZ3*aDvd)qTyOD56yJk>vtM1mKn5OkKb;F@zc`) zi~=GI^vqwy*~yoRKlhdT67Xhloyz;0r}G0FJaQDG!{RPD*9*qrJB-A6xO&8<4BsGyLo03>ePlTZ4DkK7)95sr9gv_ei!S!q)&v2ra6 zMtxpMK+&7Fdxb&ky_uEG{O+B|P^Iy>U2K!y^3vn%i{rf9?9J(_n{-PH9^$N4kbY&i zqrLS|SUOaEW&Ch$A?prhTMzN(`<%LUbMwjq%j~JUpZ=_sne1KOhkX?YURiy^)b|Dg z<7+6y-*x`hDYa&{)HrDtSx*`uZA;mIt{mINDZL7K=?va04vVv@eO)?|xBFsXp+ z@3&<@Hz(`K6> zQd&|IIsvCMGjwq&Z>;F^7hg;pHAOW!IjI_lsgn~$GP=ck0#4g)ZLQB>;Su4o0dY6R zS4*d}|Feb<)N_ll?C$G3IjmhawH~WCQ-*!LS)c;hxQFX;@_^}46PE=SF*`pQ8Drv3 zi7}3E4<+LDc%@^pC7eGziD}$xaaZJ~9jMi#3KZya3H6tk_auVO1zkhK z;-(7hsG?$q#;hl?{;N(Lv^k~xR@KApq;_S+=_=D{NuSF2-8(B}!^MREOM<}ilBy(L zw@klMR_MFUUo?OKJ@EAr7Z*1(H|uqZ5os8a8L|aalpN872*}TmpVnD0?#XpO-2U>Y zwA8lu-g#6+#Mzmk>u!IONmb#n$eg0$Or8Dc@NmFazx^6JlT*lwF+7gnZI6|PMpHXZ z1oc~h-@HvtAU)w+06_$w=jU|v_UlMn)t*?6K-UvSHaZ!&>d4MO8ZeVIHn?`tQP;Z? zZ@TSVCtqLDx;Gb=%0&ecmzCLd$>T>DtG?tHNRprVV_Wm!!2{JMCzV(oc-nw0Jb(<@ zn1R)-l(M_!i+QYH_SL*DqI;z0xVy8bTiKvw{>)t!$H)`*8Q>Rp*yo@ixurCbVKq%P zwaCN}o0FgSK)PToF0QFL@rg+VO+F_fsr&lM$Yi&G=2rIKJ`NSf_14RM#WdnJ&SF`Gr}-vReifr`%&PyU}GAgR6dd;D)+0>x0G+UcG+0kZi8#3;A z@d5&yXJajWj4tZ6hmVhd)YwXd<+d7>qC&ktH`mwK_YDjXPx64WhHY_i(^7k7aq*q; zbyib)4w(nX_r!g5m3j3HT0C|R&fcyrX*nqhsiHnDKgdZ$3dxIR>7`b zSLd`fW8D=nfk|?X4GUFPy1cxKs$uxEzFr#rTXQJ0t-amr{4yzCStsFFI{8hzd?b_B z`{DF&p`n9d%1-h~IUJTsj4@75PG(IW?%?( zwf_Y%v14O<@W4Ce%R{4g?=mwp{&~|B40&PM87Y|=DQcD+55yk8B=tN6{9AJm%{Y?e zvgo|{e@VcFZpi^HEfy@iJ0V|QN|T$3DG6d=Z0tC)p%n+a7(WGCmsN7n*y%%bUB!|^ zw|s#Af+4SpvcHGLNuYAu%^93Y04O~&GSWR$&=_<$k}QsvvRYY<{aYoGRT}jzYs|T; zE0FbV#y2~%sTYjlbXh@I=l)rF-SUzO-=oHsKRh`+Oyu`c)X@nAG-SA~WZ%x?oal;& zoSc`+*Bs5^tDdH2jh*lD9VR_o^!p&hMlKr@5U9q-`JS8Qtrm_2#tjBg{8uo5<8wz_ z#^R?A-g?2{RJ+q!*GOHJb;i&t;=8AaPef77_vrrooRC$<{}&ptn8YFoTxK<_?S@qW zchxuauux@CAlNq@KL~CoLx8+Nxg9amw2k^={|W4?kb>xvU#Rxe+mx>OrwqJLwz~ss zW<*83fK^aMT~$?0$@OOL-qAtyz6O1!0(JUw!82H?oh>RfwLav$Ub3^N)65`Qz96t= z)b--}Y9;zbm~jum(tUD#&brsMevns8blMt9Fw~H%b5^6c7m`hhUkmHk%zCIH-H^ur4FQ8~XgK@4r1Z!BB(Hm+2lamO@I-+foNDi(I3Y=Yki}yMHkv_3zWt6FcXcCX7Ds2K>Pp;4WqckVDLE01( z6T|db&*Sn?Q%qA+UE;z<=#8hau%6!R&_^MDlHfB3R}Im3?_dT>ic(S?aa^DV2bLv$ z!TVLHPceY#Y?U9SnP%Z}293NNTM+wQloV~I+EZU3ME%^@*hJ86Z-2%Y({ghQ6)H_1 z`Kj^xi$pLmQGm~Ze9~iQhKb>-@2w=70{~`2Y^(@aN_gI90+uVk@HhdjPt`^)I)(N1 zmkAe`<=pQbDrh-{(5^E6#SKE*M<@`x&eQ$HTzoUMPpKoqBO@asI$2(@vTK1NPs91O zDoNi;lQVvJLIQ9i03DnnBg4pu!+8#C@|cz!2q8s=b&d(Vj;K%EBL_Y#lWWJY=NuR9 zE79cS97NH(kvtC%3yX`2asmq(W{~P#6Z5~=18}aWj^QWs*60xcrYGIjuMB`QROW4ew{$M37cjMh>kInhE2LN=_ zx2F80>g&*ukb&h7gM&jk*kSwj4q(05)u@sqx}>F#9V<_+NN{m*&CSgT2sowWcuX zCD{7BD(sD2k^yE2KBrIG!otE)y$L$T_7sQ!Vva$Np~%NkMdi#KIqs2)&ph}G4}M$& zD+O*uzIMfY(Ttn8e6(!Z0MXW_j!EBlB6Kq?5ZHF}a+c{`n34q8EzFdcL{cq+0PxMt zvlyQkUme}OoI##U&aYVUg?^a$)-?vrhwlR+EhFQB!|WNlw2Vw&eAA!BRqDAFYM_#* zzKLvNz{gpcovBl7`kpdBTArgQ^Vq+Zh*~T}F@}&+bob0y$I4Oo4pdZ3F{C!H(wQaA z+iYQ+Bz==?-CzO%p;S(ZQ7l_irW#w~=%LVQy_gbf3`ROktG|S}ch-eR$s&6?(V@0Wwu0S;$FAn+fc?ZibDn8@fy{>o*oGsblA3P%=e%Vi zb$RThb#)7D>dOZQl?Ht1p@hHEr+rdK0pz$%mwq}$vvz$CE3=;A;d{kO!_B?F#Y@A4 zb46Cjpttm3b>jyxbh5k%2-=#wP9ExvX1Bhk;W-E9*a)xWQ(eYg234jiW(q{KO$`DP zQPh;3zTHLe;<9uK)4wzRtSKj|@Dlrc8Sd+7`QPoSz%fa=ojV~H^t4DsWVY$z$Iy`W zAJ)2z2#RN3Bb)nqJ$-l(SeJfl-DS9Ro)pRBej01Im=@20wzq0#*~ z99X9jdB#!t1qhln)j}v^Vv`;6y1~nmje`TA!mBM_CkkK(KLD43;z@&?`>LjBvv-jE z(kDNE73*n5wF-M71EVGz85z*m$mwNclSj7iA{8D3*~kr(*qD}DLn~UD0u<8~<>kpk zYoSH4TYPUm!s#q5KLW z`pccVxQL>O`_}U1_Ns+Cs&t}B%yS*_GJV^|B!J-=pUvF4XnW?_haVT6 zOoM-kWXR&@APhoLC6%aQOSUjBXMmiXzT-xnLOp;1z^N^MtD zdGpd#fmAkD!0ruF06=>&YH%EAa}Z(>YtN_;?EYiJJu(`wLWK>}VqX~%&ihZB%hO!% zJ9V$}f_FD@QJ-VU`~`0)Le4rtHf$bi>$vLGJ6mp40s@JUS5#Dag@tcT4Ab(`u85Ul z8$H&gKGb{cWas39()tER{Bw7+n9sxW!ZMSq>Z})n4wDKi!dI?Gxt9vE@23;*J^CWj z0_X;PPfz=e0B|L%5|^hmXXt?IB;b!%$$WcIYs0p_HPy8Q6203B<~i;wQH6Hk|E3Hk zlf!KpqY+uYvyS2;gXDxE^++S{K=q2iF(7vIn(BYol zB^ceBK&!B!;NOaGYkORv?JFTlNkPTM!n}J}Yn+@F6&@cR8#!7S7zXkre|6!30TypD zF_6z$5)%WXU^CgPwAltizGT4)P!h&JPE_{+NJLGER?w)tx;lNoG)YiG&Fv*Lk(YeIoq(*ZgBDfQZuk#VYu(TV&KrgGt)k z%Z~LXsHmzWJ$yL3Ut>93o^z1=>8|jcgY{0IPGQJfY@0qY)S8u*tX~Egq&(@_)u)X} zkxr)XT?`gf|HLP;D%vZVeU?BOk0roQXmB+QvYL&D*#67I z{}lSJqE13labT8s3iw}xiFoHK-CIk(Tx17TI}S}5Zkfy2vGF7@T6JXuBT^&D&Ta{| zp+q1%rxj!0>B+Ph)~JqUg6hU}nO$j><^CHB^Vyo4m#ZTi4s?EMy zsI#>_TjA71!)7e#ysEzyOEbStPDybl=vnGMV30-$2NCDt(azXtP9TEw*TEUsyzpvk zP0h^A?Oq?~8VjPK%3e$sM5KM<0;UPm+>A8S)fe=!r4az#524OlLWMeaAU6OtEnxo+^qf-@iHgTasg$Hf`ST>fW4%m;$DNV zQjZXwpg*Rt54xV1xPA?u=*)G27`E`+l9idL&#CiY<`5cw_Yg=(so$Ow6UFRSiV!SLG#TH2*h?hKvTA*mM~cB?X#y zbM@(c5B_bhDP;%3a_-H+!9hR}X}@F`?*m7Tvk4eW@rTOd8)^SQms!`qGX>}q7FJk1 z5plFErGKmW!YYIiFG^oQ!7~Jy?S7>%ItB%SPzBt2jzDp-?PTj0EjxwSWxr(MkO{}o ztHC>@Wj$X``~It(9wuol=lP4uvtTU$mjV9jhM@D|YdX5R^mK9xj**kuD^L&7nz37r zZo)-R0ohVsSmw}D^KAi=iRaB6S#X{V>fBy+%3EvaT2-Q_v@{G1baY{c%Nm{?5993RG$=cxCA`q8IfpMU&dG&Vvi z%>2f@>2b;s=*YC0D_yzgb#up~@$!lMe^@6B4HoX-6&8KBn7Tyg=a>81Co>~w5A-K= zF)>qcI9!Js^?msamc_yTexa+bjHGNiGZz4I^Xsdo7F7=BWu8NA@&haY9Np+NU7vO; zqgeu+)}&cAeL2=!US6KQxLCmJSYh)a``9D{q)Zr3gCL_4I6)xjZPwFLvcwDEo2IQg6L-W^~74Awhh(tjoWl;#;JcK#C!uk3U~-{T_vhT|H$ zETNYQ>dIx6rQsnVDI~0%oSwu4xtW=5ql38vrC>b+N~Yyn>r=}EMP%g>9#h757rcV1 zs410Jl{M^~6lWJJC@T;37fadNqC-Xhow31VgEzf;b zVU=|g2dvM^yn^S=hgau^0-omqAt@;?H8JaSkqq4DCpPL;t!w!Bz{JxYh~JaV-kktp zbsUyFfon7BG!8Zor(bG{PiSe0JUkS1IDhY~5?-v5T~t)%UJ?fy!ITO$|E=+XHU$Im z-62oyvcj!z6)g;8XlV%v8=Lsfc3@JsWyOk!{DVk*VfMiLCt1)HUZT@CSy=?#B;2;+ z3bbC`9lz_{kCFz+eAsYs#IhFpdV6dBtepX7ssgMbvh^`n2~ZA0B!jIVVhIq{W;YDZRGh2TP^8*dRH6&WxgkI)_8is9|6586h{xKmjXFTNPGVM>1&cE*vlsJ2`26sb68z;>vUDr|73jo`U zkxR2Va;}+}=+mqJrI`R`*`F*S*f_KO+BnOfGrPXL8wdeBxZAnU=64ywMIrHu=bxbVot?eP*BH8osuG!!9^soU-{p)_gK zy%H4Cqrcyh9Mn0wci=4{dg-xmFKHSLI=_P3w7mr zEBZ~ilvxh2ABD8s((Ef=0kZSwhG?D~|BJzY{#%=T0_U)cLX%ztQaEl4yl>c3#I?}%)2B;oeF z8*(Rr;xq_o`1#q%&hxvUyciR}%pCv5W&*(m=XTBB2EM$A2+Qen^(KLa<=@fb5$qhS zu>uaZOR@hTnSFpSqCvs<*x1@T6BF!T&pb*@oV^=0!B9Y-W1b`+c4K`UkG_PD9|H<( z&*N8L#mNBXUg=HDNzIo=#g zg#hhFJ_y8z*Y8(8-K*N3URrPvQ&m-k@l91Zpg+X`R{Fu=!T254_Mg3#?nw{%+&G=) z=J(-~HI`){aGafezLIzw-t^C>8*eJr8v@3YHxORp^MB1Nj%S+4YRrDt0)?0pY`-p64KXK3Q6`_w3D2&-X@V|j_eTg*G*bwips+?VA4eFX|*K66w%3;asMgOx&d3XcCOhyJ$Ib(|v zd*PKk_ugx1mPP*-6c3&+t{^!T#8L+e#=li9w~*>GS#kerz5SN`0sMW0$Vgm!9)8Be z8=lw0JtL~Ry71uk1QttaFs*3aKFMW)?#*+N`>+;=MYO6RrmYRkJV;xykpiGD$01=sRWF}nE z!GQxNDJ`AL>8qUfz(q%Qz*3iyi?FH8oJrKrt=?FMtUF^(k8R0kHLV z-HC$8I|MRqy!}VcuDE1;U%;!x3wbdDL6AgpKuDr)(6gMD3|j*$3XBN8MxR zinldH{KEE2i!t8w=RjmtO0oxSuYpBPwjsXO%(XX=EK>hp13aGIZSxypHdTjX}GC8zzaB`xP*s;8y>>UODe+@gfCLq_?+o zuW_r+<)RnO(5uK@?-9^!z%~&{%u9D)w98qIhK0p!HZ{Y4xkl}^YzOzbt!@Sk?2rNHMNSN@Vx@Pwv!69>u3@t_T*zCKTH3=0dJ;df6uKFa@^ z%x3dih&*aq3RL#}ux1q4i9%_2p!37()qt)5MTGCHX2>QK1 ze!nAFzhZM#X*HdE?7*o7{Ml*+rxquP1K5;9rtA{Dykirfw5;Xf0Syj2eIpj2JObeg zbVA^rQ`UE_Xf>I8Ut|`DhzF(gvJ#Ly8#t}42klC|1#ve5p8LPO4=5;LpdCYJ<@a+Z zv?7PR>%;MS%Z?6~_ndWJO#*Yzo|W3#*5>9awUw1Vx()`5Br0Enh8CQw)?gwu&5P8@ zK|4M%1Xx@?Oh*qqd3f(%!Ekj$|JF0m@$ouKE(s&p4=WP==;;4p@2#V%TDUcCY`{Vg z5G33pUDDFJK@jO~5b2g~Pys;@5D<`-ZjjCm0uq9Bx6<96-$c(F_dVYG-8;U2KZawR z;}F=e*4k^$`8?13&8<*ITQG1`n$Fz$-*{`)4!Up^8Tr6C?C&`4-rJ?yfVlZ6UF&3H zZW31JkB+fl`YOwl^2{sRzN{V8@|Lg3?W?%~^C9(RYtJ)b2Jm5R%_&$%4)4rajOF2S zMlv#EbMxkz4Z9Woev~o(SFo|*!PEiuQc(Xu(P)K>*THm)52jBvS5Yjd4d$;&+0#UV ze-w`+dh{kvT6$`x>K^4dTEG2iGLfOAMz;tvEYY=kHh$Xlx24ihwLbQ$L%Or zPV#fXl)t~6P#rmYLQ^@j*&K4><6}V~^Dm&1ZO`)R)g(e%5f2ZK{nIw-Kyiv~Y;ddQIuX~t zUB}4fUz80D=e3|RRVAhVIHw$#7xQ~I+3>ZVUZpa=@8OJ@%cbw?CA&5+49>YAwsa%woKZa`+gy63(4is=^?>jnrZ7*-HmF3yityc_J2usEsW9E#E_EIp!#D4rJIO4K4 z9}*b%vpMWh_sEaW_v54tOm#=lHRdWF`{Lr>lqBL?ZA;on5W2!`F?~gdkDb5-4jJ0k zQ@p8wtfza4g=VIZ52(*_+gj){ zZhdDcCn8Ih0Oqf3F$*(u@yh7Y;$tj7p~3#4wrF12$I9VG^TieMryBjg*QTaJ1p|Li zKH?x5)Yf^N)?|eAlG8*s9P;%eBX0T9((#8sMMnO;{_JgRhyHoPK}za`4+Xe~_Jtow zm+_-`thSrIM#6Hy9)yQ5#sb|5QcxNf{k&VYvZ9JgnQIRwNJz-W6v>X0NZu4A5jXVq(MJOE+lb7#RN;;*^`>N?QCBQB>7biPLvXqpjgEfn6+N z!rZS@sT+*&NK8t~`nM|lbE+EhcH-P~i$LlVo7!Pd-{!Ez;i7>`n}v1tZF+9#i&EQ+ zY(4I?7Qcxh6awP*udgh0RD`bVQ5p$RD zQ*%1>aM^VTjP3el|CgG1aD)sLkQIMZjj-0+gtuUx5pfd}#2wq^p(@8cnOI{*eaT4M zgI0CqlMv6&;=SayrSOwT%Zd3ZAj4&%PLf zZ4w(9Q*|Y;FgLKGb)9iiR5LL}GIk<8DXFkdn|EtYR*fj#`6qTnnNhS;_fRnmPO9;` zC3~icv}g2T(}aN~{CfaX5DX@uhOJ+JtEyi}EZ4OyI$KUNq^bLz)19FRwX-KtJbLxlA53zB}g zS4hW)Yq~wY$<2;r=vO|xZ`W&$tE=n68x!p(-d%1NZ`6A3Vt+xN9#c5XRM%-4^RBvW zCa6XR28y6-JtqI+zm#D^H;R%jGMiL3&R8qS^G84HJW#>e+^+yzF|)FIipX+KQRl`J(CG$dt; zFUt9un!{{wcy)WAsKfo6TnAit~dy3#XXes zYv{op>7B9+mX&d{HijPp9YIZ<26~^TSJ3ZhqK$QBf#2_JqOp;Y>j7N@p;B`<@Zl`Fl54%LGMV+h%g9hI{e021R|tS{%B^J zbO>0kqDiMB{|F6NuFRBbWo1UMgR?_<$!291&oKQulhpT9i|P8*>JjtYuTO?|S(h7b&B4k0>ZG)>L+ zB^NHQ_%g$|y~tl;H)AV))sLp(r`>=u)KBLm(DN;;qFNd5+>3*)@gQuN-^7w z#L@fe89Rdo zcpn%WJo}W9VAb5$*BL+l1>83%hv70yz5e19H1WQP^tJJhkAY@@%)cx6xS^&qlijV~ zM5t~;4`Vk-7j|2bftrd+PI;H!wD&adx&^2p^sCo3%jYGL-dQc?8NFp)y0clCs^1{L ztU%1lMuQEV<@*O%jkn-8{;ciuei3iLX9_{LYRmpP#(Fvcw1&Kpy?uN=fT0^?HYxX z9jSim9X`H;H);cX&qn)u*DaZ=p1pvB6MK=*d}dN9LDGjvJ%&QHJbB;_LQqt8qSh-Q zDT%GJ#_R7vl5)}!mH(;lS}hs=L)uX8nBw5JX5fF9X}nNrU%K++Xa56NaJCK8KEr?q z)jfH4UE7L7b~4-Adwv;03tuVR#fA38g#sE(4RuR(8~lM@ zWY6aYsGlHr#wjCm!FovP4P;+NN4$M2vVljh&e|rw?(p0Ql@HC=z8D^2*W$H6?E{k{ zgLr>dqrgi(|0URWBU(|2@DEX%o=3*SOG`UT!>*fO=R~^nZsOt2t(Bl0t<7h;-(cmL z_4riTt`P8QG5ZNw735n*^Cl$IhE3yUDHTo5jy0%{;HBv6fUro!p~vc8{W;fcZ+oQN z!FM=Fwi8m@y*Vn?Iy7?1N?N9c2B+d&j3RvJmHnx50B9HeJ_{GQBX)G4atlE-`DfY`%Q9j5VL4HDWGPV&3shxn4Q zf`4^Tqx%S1Avd=11RwuW;&*AEh>PYISv7wD{`C%gvv!!-o3lB(IQ~%N zpIurUmHF>B&Mol0kMUWEZa7@)dij~d zJX^E!#rAH8cWUaj5hny6+QURn=q(k0PLi6MW(txANj{Usa(blnVQs~QAo)tO;H#yV z8t1>M;W1!3Z#y?k`(4|%mHW1v)>US=#H{!A#raF0dXdOle?G3b^YZzB?ZsN_al>oBwHq%#S4Gj_$^^p@bLJ%z8fCgf2 zJ-HmSk$a5HuJZ*@)9i1}%a>~;$5_nO>_PM^=_#M{A*)`^JxKE%6q|L=rrnnEFy3)Y z8pyjFKdN#{d8I>o1JglZO!Za|+A5G*E#7K|=)a|7M|s4j zU8gFJ^WM#MevSC^bL;#ktmeI}F|qARWQPKp<`NP`bOP6EZ=uaUMpETz?~sHkvm|Az zsmZCSDebNtL5{D+%kx5M)0f5nAuqW>dp*7Q6PVKEet|AQAn z!fo+%h}|Edr4?wN5K5xRr9G)I%rS`1cK<=ki(BJS=@Ge_Uh8|^3kj= z$*HaVZ)FGnW>hHD^wQ`?a+n=uXvS(->4_ygg#?m#ELV70bYNhq%g(Ys<7)#}7zK4* zUJR#cYU-@IeoDRl*74KEpz*+t)ZWqYvYK9TL0)20b3>eIB)fd2x?0Jk!}fU6yYFJM z!P6UhZR~7Jc#2fZS1IY~O^>Fts&m{qiMHQYySr_oLH6brv;7aCR*kyt3X*%s+qSIt z7?UN8W^eQtv}y-?mJS5EI5q9$m3&kL@38|CbgSOzRxJ64&ecE?NtO&Ra5|~BbXui( zF0+@0fnZ{?V3}#nxS#r!Ex})a=4c_y(ETw}%Dy+2WzPcP7M6SUr)$`~!SG(^Za_d#l#i^&mEX)?l3d6MwPdVQ{CKN>RITTX@hYg8Jpu$+mWKet9jKIpT<;w_?HarxcaompF?9BAnp&AN$LN1J*rx%WR>J1)KHLvPStFuW8dHH%GSJ z%3!H;p>9Sm6*UuMEH_Hmy}WpZ*h13c55(Buio&M@(|jkUR;3DAtt~CwHk0iTDhmz@ z2Iy=~#{nARYghAvTQG%#gT`WSQgFu5^A3XMriQqtV&9MbCD8}lIU1GSGlM+?UCASr zR$*8&x^W&HQMws@jVzN4(Y&aE+M_o+*JCeHVWBf|l|@m6nH^?yOwo;_SX za(NLudFvRS0$*~1ut<1qhX-3W6WRNI(a_|VzxYzBzQvzZz>J0GUBb$GM0nt{vdfyJ(xQ6rR? z78iKTc7yPDp3GBZFxTSnef#GN3|4?w0$TLDoJ+Gb@QfH3{x0_Dk=E>|NAR_2hK51K zy@Q3}*nez>mljwQ4)`8gklg>09Kr^Zj@p}4*Hjl?og`pF{b-ATz!4>7!}DCgfQnw; z7+^`hflQ~nS^TEN{&?Ys6o;ZBct*S=cJ&3+{Mid_n(Nk!{YkQIeB3)rV->Dhl_WWX z9Gx^G{tg%5$>ap33^!#%SF`c#k26!G=^c?TrXG=J6W9=R5~4;)JAUln&qn((vu`LX zMCnh;VR87tnA_{e%quw&sh20&DEUOsEK?JR0aYClz!iy$i_6B^omLLwqUNZ^#Gc1{ zGnZqQ;P{`KJfBfZ1r{wk$La9h zJqP2E%9gO4Q zGsr}-AtAcM1#_!f0zf00n4ec*xLJIWA~*?pOw>c9H&{6nWik6#we<9+>rIEQ6LbHZ zeI_||$hJiIjVWi?PQrhiB(fO&{Mk#~+(x4blc@@O6lxAqNr?(0R~~6eM|&0sdN}|K5ud8z#uv(Z0-Q=LyJk90k-QCXm>Q~jz zc$_z9!4K5nEt?Rtz8Y;KDk|($e&prv{q&DETF*1=2>)wd{}{7-y;_q~+y3RDu<+2q zw&`Un7U|QdKeS{^rlwV{7i8;R{~Ko3*gE~4`LN2ryLpO(-2doqC+Q)dKB(JGMRDly z)s0_lV-Kcp<-OfKihch+MiBJ+HF64RVGInpf7p2=3qL$)VHT=+7>_G}Xu@V<8YWur zSzq-N!p|4ZR{rjFg^1PEzj=|Mi{{Ws4k=g1Tgci%g>|#n;z^P-ia)-3OCOG2+j_8@ z0M!wJZe?_3j0UZ-aX?EXD8S?66OV)CfOE=aV{kGv&(^`j1b_f>`;rA@F(8tV=+P1@ zW5sRZR`|=KRs6R$9^dv1KRJj6B*I}1chTQHxgG;ka9m+}J!`EWxQak`x_g%lpI-CP zRg#xN?}QS-XFh7%iu5|+i}?^06&*a`GGw>09Sw;HhP}k6`;Ka~mwmy`gK+3?J1_KD zq{_lLsl&i`x(x-q!we<$F1D8T2oKW7W@a>90e#3sx!tlX0ONbH?Zcks8uQc0AKj(F=?IQ~ZJueE# z`@!`A`u8iNimU;AF6>Wi4xW0F=Y=<-WS?>xY)JY~hU=Q+bI$z%NNew>Q1S;$F24F) zyLX|LI+D)M%Wi&~+44$c%ko%`q`ja=W|Z7a z^~rWtPsgb1SnHCoWK;~RsgRa*AW6VbhVYK9gef}W?SgfQpmVn1-IA zG7I;?zO?+FO7(uFVz4bnDju7Cqc#LQ*@9x$GiKa$x(};w@V#Tbskc$wb6^K?Z#H=3NCzLQsBh}s(&My$yqY5d?8?Z}pm_Gww( zs%9CC!l#u=hs8sMb~yzsj|Gy0&ZbHB#Th(QAwga`;d*`c(3EHhe{$ySQ-JiGwsp*C zTfMX7qo@0f(XRDfAa@-jVsX)C#}2>_jqW0VL8Xc=u)ed%6IQF zQ7HP@wlUPnGhkEy3J}GnJ|g#M!t+3E1#nGTSiFEpQA2Cd*7OqhFo(H?$P(O z2VtkPU)V@$g3?d5;2*Ney3kEdDa~_}mKtJ$318P>Asi|=(ba2%jL+u&vyp5Gsl2Li{i}Ld&XO5BxaRqag z(XBYkFCLlt{wyEe^}w&p>(7dU%K_W9922AgkFh ziG_?X__kwQ*Q*dBtaSQnXn-tAV_wU6Po)q_Y87{H$913 zno3G?yPrSbQ5<-2D~^RmF1eXGoT%J~TGzEY+vQ-He-+>qM_D0T%p4r*>cquK&9!8A z6*D!;pKqzqiu%gBk+w8951~%JoU8Hz2ncVvjrtER*mH41JLv`$%?%-n$q|>}&=^Hz z$UR-$y*Ei|`8uj>(t*Ko2*J}I3EbpmB3@VIz6YRVK2hb=)QN0736<2yl$>h1BCqYv zXGe3BLA5kJHFdV}m5Wh&I&ek9%iEV0-)ct=_tn+cg~l?MS=TjXE-vz(auEugmxo=B z$9287m+mVNmgO;Hhe_{Fs!wOkMy*ffXj@(x@Zm~dcO=AQP5hM`gx6<~sn%|=TO1HY z&n>dL;~_@GpY38y`_1>(ECIH78vkcnLOH4@PbDgMepE+Ca`c}QH?kC_XJr`UYew~bkhTnQeyo^xRR?7IAC<%@* zT-R_ue+EGHRPuJBL3xPtJpc8?r|@nBqJwIwp7HJ5l)??>ZuPtNe27HV*vhHPdl-k9 z7zlm@#FQ2m*6u$bB&ce9=Os;0>X{Tm+C)$1vd<@~>e79RhovP2bUb`^2U!NvrJ|DO zM0s`JToHeKBW&t46Yx^AS+eq4+$R5>!)q9E{t_wImQK`A6kHTScd#ljuG^{4D#*zR zqH7r&Ryyre78HC)?~QXQ4>1NR_$DXd_||(et{;(VePTUJh%+0 z`B5p+R~ZaB_l^Yb*b{{^$7fX$C((HF8wyp#Aipd7Jz$x>$ecq zzAI@+@_Z->4@|8dXyf`{B;}PkCn<*nXY&C+G|O zWQU>GE6-`0PQSTP@BKR(@ejT3&VQn~f$8Nnae8O_byQwzG9dsp(g8yyryo_%|FQe% zUrg_x0Zh)DD;yQ5j)hfvnXb;vB_bHzffNIL{PVtcHOORyUsvj-+g|xEd5qnEiJVU9 z4+7bJOEf~PIH}#f>=8((Be2k+whv`g&P|R|}=CO0KDeZIC zuzu$;85hNLj(RyDv0zXJLhMmIS`{tkS?Gv=-SF7*mbd#0_J-?3%-6Mjysj25c54tZYm6=mTz%`mD20SsYpI6MQtjWQ+iu+(uW?7Zd1 zw8z&(E6RX_(F(KY&v}fqGo+|Kxb}NzP-GK~Sy)&!D^N8YARdmqKPr{1`hStgn7TrA znK^Ak6xTVq^wu{Ce*U}xwU;O!gTch?!%Ei%ywycc2rd*E=D&!^NcX`+=RLqFS2U;F*4~PVSqU^K4_|vhC84-N`FW3A1JMtjw^|(z*Hh zXC^(QV|+zTppd{51#}z_$k6^L=BjGN47~<0a1$ zzHDO9*p7Ozd|g&s8`*eR%HZx5uuDX2+Mg%_y^@ZOin6MzvJzBDH#!V-I-ZD12Kf07 zm30V2)*?I#EIyl0Jd;GXP%Y!(xocTBUr4KvQs zUbahwoe#E#H$E{@dVt*io)1AsLq*lpd|<9j@@@T_ z?^c>xc$|?*`;5fYx-o~D*}#v{3g!G@{Z^PuS|6o12eawLH<`zeJ$+LoLoh|da#Tf1Cc}ACZY=s+^BohNr7SR$jgx%X)=^z4T%7IkUYAx8T4!R; z&ywQuHjsL=!Y_;FwaAo~&@lQ`=`u;DRwgE(egtw?#bL!`(XbO$2E9o-^;~9JZl^Z? zB@=r3SZ=%6D*J)Nx7EGG+yRSY#(H{qxLdtL4VN$w4|T(pm4Q!;H$B}w0^{T0lEYpS zoE_@?f`UzPdqE}pU8$LB$ZPw)c~e#fv$n?qUX+JxUTJA>c_x~7?Ed-OrO~2vg?(SW z;4?3}ai^Yn#NQ1k>&gY!NY2%$p<}LZmo@1b-$3Fqe&pAgobB$G zgXs%o<7^<=_ZAf_+Lh&k!1{^5!9vY%fl6q=$E;i z6v`P!K$q7Ut{`}$$h+o8MhVm@n7%yVD`sWw2312{uPus88xL`hfv>VDP*zQ5{YTsh zTU+zRec(TWS$YErI4>B@!xI&WsWvdw9q4SrJ~}IPY7QU-!8DYM&&>P~8L3!0J!dr| z8Otp>vOJWb7$!k{!%qnBDxsh4~ zXC*k07>KKO`Yl@dEiEdGqi)Zp@{)9G@=yoY!TmNe5hLX1v#zcoaXG+2f?~eCyeqmX zRah&u|Lbz!*QE`^K_;4Gqp?ZupOai!Na#&QhG@vb!U7Hw8ystww{OY_DmWkl2thQK!MdQ<6JP0dLt)Db`F_a%5|ko6fWX ztUGwRMHu+=;&0EqTu+tNot&Qbd1`5C8S+6X#MmEBzv(egoK&Oa6Qx|oB_B3pV6k`_ zu;v-O=wBo^yPS4&d{BJlf^QhfV0lAPq4*xx_^3}>^aHl&yttLjVzc4TS{uEu1iV;o zSq4*z*>8_~MnupcbmqT@JMxUGuiO@+Sb)04O)SE4>X6f-cKS{6PA9IWP+fwPT_UOa z2Xi&Gh*#>RQCN4UxXyffMByPH!K*Da!k-3?F)(qF&+irv!4|V5%p^56MMY3i#;RO^ zAcs4VCfzyx0^W0-T`Z|l_Zb*8)*GoAsBd6;LKokC0~zQKw_=kq4XT@t2fJb)*Q=b0 z&EW2Hrvhy%EiK)$f05(o&u;0>fLOlE=g;D-jm5wNmzN|5vid`|%Yv+g7OYBiz2H0H?1IRFN=CN`?r7flqe5YU(4PkV_RG9Uc(?-`Mjp$O;Dik)9iBY29{}U4n5y+n3FCx6^ z!i!Sq?Inri(AUxVTGt>e8%_R>NS!$P+R{*#TKP8Q)=NuEVY!^k>$f3W|_uDp!0G66s0XRoOyjyBG(dW4f) zce`TmRa>k+%yLanYphq)NIv5*I9^F2I#t>30; zZ!*g4P-Bnhn*_4}Jw3c`KV?)L9Unca4!4?t5wFxuk>8IG7kvC;6HiOz6TgV_XoVYA z{#ZT?JpE1GsWrM7Za(593moP{d^+8?00K5SJIiiv=7*pZ@po$j}&gf^>;Y zG_c&d@-C}h=RcGYzsbOfT)nMU-hbm=Dcb&MOxa1}NPo-G zZl2xd%>{l(4YHH7Q`gNKw zUN_S7`A{pQ#%9s7>+kEUT7={ry?$n1h)sXces435RT2FVuY7ws#5UQWQBDSne#sH{ z>XT-H*&mw1QZK9gv=3e%y1BWK+`!({-F!X?#VqULze;d5!e7NTH09(&?+G(Z9^H!Q zR0!=8S~)8OtRX0TwMEeV)Y`S6_B;LSD(Vl`H2Uekpn<*Y_JAbJ*X;M-c5!iP?D-+3d_!H!Ed7l8$w_z0G2g!L&Q2={{{E|z2L^hbc?;;;qc?(%%gJ{h+5$jGjsjhcqAkQTMCN8 zPAxvTIT}@b4$~$YuC9QG31d_ibU|@7+r*qCG{AtHqOktzmou^y62MaRct82!18APG zXC({DX+E9CH}tAU&Mx2$t^ctI?~XrS?WnR_Y(JKN@xtETBQ&%($n)~x11?yJ&}}}J zy|nP-{c59kNOP$A&UW^&$sgnydQz-;-+E}O3|Tvi#7}Sa^73-`3KGxkZ3kLS5AQ+U znyjz$vGBe+t6Qb=<*p_s^RZsTo#S)Y4@n>-zP;FM^J?LAXuYBit-HIfIR>ZUNDFEU z^l<(@-PP3_u?Y!RBU#g6^WQtz!($9;^$scDT|z%PLc_VaTnh_T4o3s42OjTX$B!w| zA_gL4M;Cirb80M!yTDj+>RLgJsECLQF}CG#HwL}<>5_`Mu6l8hnuDNZ1Rz{ftLN<2G%YUKR#FvU`~aLBf9^t~sFzB3d$W|x!Si(70rXg{V2aztCVOMwl~InHCDzMg3JSd* z)F)QfpI17vXc0O)+om3;tuI890LV4JX7A#-bO*CQ0$`wUMUR4#+|)8US;@f8pfJoD39kn%2Q?m-bUCFm=bm|8T7~6fW9}`f5PHLh z35U0ZC9K81|3_u-^%R}<>#*+e>pw_gt9a+6$o{`o{r@~|>i7)U#pklxnw}6K5)aLa z0WY_{qzdMzYFH~@WhDRurJmiRxJ4}ajQcF?O3bn5%wi;$T?_+0E!AmFw1C{@0Ud~#Cha#HH5{j=f} zGzl1kYqqvGq^0GMPvW}fATcg{mGt<>=>|z&$ZKm{x+Lqh3y(T=z1EM++7ze5aC@Wf zm+Z_&pXC>#BY=2RxX`%-+*}yUWlJ}Q8Xuwaz41mU9^S9(YB^-s#s;jJDE9RT{JOEE>+ZF!L zmIIy4S_7j;mke16+1M%kNJ-0{X$4dsVIa!NxSZ?`$sJP%waAWU_v@>vkMd3nx=s!Z zG(rvJga1*GB<;8e>%QhMx>rLU1WSBXyO9O+!rA$4;HLrGhJ+XgDwBukhPtNW=&)=> zj~Tb8yOJ(Dr6IxWYr_VtFWcXwKcPE3e+r0|b}>3hjEj>9X{2q0Emp5u>o9OqF*s)2%$}NrtO}Xu$W{qGq=X30SV#F@G_i+OU z8w9B1zL*Oy2jN==Mn=-oz#9-1v^h_-d{E zuoC)28E<0_6h57XqrnQvP%nGuN|oSBXOLaV)^M-iZFZAUt{1Z}E((~fdtg9j1Ew{| zJ;b6pWdj<@7hK%G>8MvaZUuF1TE@Jt`0&aHpa;vFo>X7U4@s*3UO*MC6 zY?*bjrN$v!Zl2qAGZk9%OI~km7dlIuw6sC=85>2>P7ZYjWJ7D=);!*MWwB|>1B<#3 z18r=aQZhR1_>u?zV=XN$W#w=Ha7AUBJW=XTW6@8uJmdxwnH2U%I~NbMGwrz4e0?d(`x}FsB7{)R6LIfdgCGzU-sjIV&@><*5us z(tUp9ESiy4Kh}&krQ~CjQ&>c3(N+#|5j#7!YlxhJLcQdZ5}TpEul?tLX9{7TU~>~v4-lS$)u>W)!JwfCB`h2;Fqpw((BnNJ8wQ%u%nT9Yrn>#-kThw} zX6#;CHFfnq&U}1&)tKmD?cSOK;~9zSxVUbCNS@vt<&_S*_bgtu1UxSu_D6C+Z+%L~ zP$Yg}ZC@W%3eRs~bVake^0-&0K6bH4Ok<22z&XBE4xFj*4SbMO}VZL;F5Py6gsEvj#Ew1C@f`X8{e*5Y;0@n@Z zMiocHL`qN6=dKkmJN#RZGQW5ZvIBz*;u>uwo4ag(aQQ<_bUiD(lo>KUEK&cg~uVQ~9Dm_91Ds1S12rxLAu=b7n#mRs!+q=gkMi-q&TN z`cic`QpBzhkA1sg8yk<#8+C`SX?LgcitHQR_%F7p>MYRF-W<8^fd%QSn)sj(?@S2& zl9RGKsWi!ixVusC+l!n;9)tb^@zRKhk8<{M@M9Gk@9_7TLpld8&?!+on0}W_WpVNM zh3(B|8#6bM=g(HZCKnA3mIZ=XHcTV9_%{RN!UKydI=kiP=E{)%emAu>7jZ|bAuA8N zDWBaMcHv^imy{lMk%(lU3@Z?%Auj+Ne#m!Q46&Q0Hd*1*E%v2I7BfU=m}o%7r&(@W zg?SBbN+2+Cf+`U?rg8%*bi`yfxvF*UV9QuX)vsjv$^XqoS){<|`N}rI&A>2)cAGnq ze^m6${Fk-?m%#@`Ifsf%GJ8z;mSZdUM^i2jK9E{f-alfarhP1oT)K}t8FCX>E<}kH z2?jAE9gUC}T4h@wmVVne+D2ce&DF66XXh27;qrs}kY>mmn~8>rD9JzBub(LamUfPo6cbvEFu8RE z!ALql9o10we4OM{Z8>LPsGAeP1gnoHDmii@Ki+DKSa>RK6KE;;_Agh4`qHh@Cuaz) zey5fpdWw&WkBjGXjJYAR5loWowbJ5O71q3yu^JY8sJ1>xBNh)&n&Abmxc-#y!*YR{a1p<*$jK}4IkclbH>>YS|oU;d~WZNSM&4@ z<825y8tLv=5*0N*Rttl9MLuC+MP-(lHd1a2aIr^Yh=t`bV3MY`3&A_LtbG<{X~` zK@-|&jj7_Ped^!74)liL>u{QE!~eietM@@cPthF?mR(k2c!3%L!l!qf0O+bPn4d%{ z-FdyjoT#{v>p~mHef24X^&)}$GIPv3CMux1G=jAYQ8=ALS+An@L306{TG}}f@fF1NYq1kHG%b0#>r%U2b4WutN**-p&A-K%> zc|o!=09j2d2Qn5!qG19IECfhJG)R2xPSd`$!O;M|a&?Bm+8B$U zn2}6(vMTI5(ARunXDL=^mZ(0d<`}Td;N1w9pK77WH?906qQB1481onOUtNgNQi{6m z_-yV3_x2*Whtd!y7LvlBw6C%-Wb*Nq%`0z{yZbImv8GBpz2W4BK`R8rHFg@{94zy# z-sZB$su!LJj*Nx1ml|>JYkS{^gk){O(vAPxAcl+89lJPc!bb9tLK|u6z`nu-+EDpJ z$GZ%C$B(7n7x&4ttNLQ)*;gMT$b?gplYJ;&$}8!csHwpy?v9I@p+Ty#L2CK;7*3n| zOqGC1CNg0q6{TOEVwuy}F?fpCBK>mDj5P;pH zYH7((W1-`T`Vevocv-JQf&t{VKkP7XJEnmuv!3@haLzICHV$GH$5j-LtPSUK==^Ab z1HMXM=3&>)G72Dg+(W&=DQ%}EuffWXTwB<=g4~k_whZVH#Cr$*c_FlW7;o|P^d{>4 z=LSoy{6-~&uaWkq>xv?u{LAT*hmoud^)NG1K38V5(aacgDI)fv;mkUKu_`dAs!-4k zm7m=46G|B8F+ALDzi`=Ua|yUBJv{^E6O0`KJ^oa4mqt1Khs+6{d0@>&o=3aNh=_XN zIt+###13A^x`pTB-TYByyfWIvraILBfRpQZc6)ZsK7NRYgprz)z&$})M*2B5Q#dZ> zoVCi7ajz%~(rm2MX|jK9_T$Ibug@Z%fTWaO`lG za}e3EeF}$hkC~f{FGdo5t~bSePZu&i`>|NqNPwICpR6hM7qvr9b3Tj-;~gmO&g(o) z91I%eXN1rLEu+!e@8HzXw8St?==0j}#Gb4y?e0P>{@DxGr=<=T(g@(V7k10fF*CCf zBcR&%4W%CgVay#xEGxYR&*EY;xA4({?#9NZ&d!Cwt@7)K7q?dw_f`}B>2Ymok+ZXh z(%dYTFuj)Y>C+uvUiYS{@$qq{pg30_?{{JnB6HmdVW~R1A9LLf`SdEAiKO2~q|?Izk2xWxrv&CDJyb#x=ouo9Hys-H~QE+>=>phTjCY~F6^}3Ut~oY zzlQqj=tpqfW;YLqNJ(h&^vo;}P`qG3wa9c(P*6xj0wHwmw&VI{xMFoRtoJftbu2Vb z(R{tV^(;L*`&zU_mD>SS$wux&nZRk{E;fxbJJ>q_-vxwA7@34^8JA~DWztsqI}&VH zhDeDB2eU+HXv)9*%M2s1|M0taExZj^{a>By$(wfF-tUgs-f(XN^8eJ-46NhjqNXl2 zc8PX5KlbF&tLhH9oYj;&$BS;*LQnqQ;5PS>GMO|2w*R7+#}$$XpVtRB?JIh#j;1RO ztsv_BT&5GG;vr5>DE;25ru;`>Ic=`@gZx5oSS+7U;1zyF=&{{nFUh#snUCD_PfdEjp2R5cJ@wvrBM+ZknI(^%~Fsph zS#~irO!Fx2!Zhyc`J*S;bi|s=#|bOoyYGFCQi=#X0YE5vxr%4B+eX{)(GWNWr3L)bXx}R;#UmaGVycnx= z%E(EnI>=c9815}1KN$-P5ec)(+3e&u=~0<<2;e;@CX)$9WBs93j^9`3vKcJVjf^%m zK6jL!VrRClROK+VjYz16nKDXY;bI3X3O-dw%xv~iJ) zfG`^z7%&|rqWSV4-g#kZt(0$xn%oDwT~>!#zr1y9F*hc{UHr%hP*G_a83Tj;-)Zf> zU+s9$M+hyGGHNusO#CQutgTNNrr_0r6AjZnxIjYSwq4;YvE#6@>-1QIckW7OMloQ+ zKOK0mKy7BDJ+>|=rt}co)n0_<+>j~0&tYsazmgzd8Ld$C z$Kds?Eu(wh3;zFmgD-$=${SlzT#co2VqE6h{R;VC-E+tK-@E6B^ZD0lPrK*#>MH+F zXl~G^UD!K0-sib{?+L3TOP*z(r)MZw zP<;6b#3c?}G0y?!AV|yDER5LA-7SXch6Fok1S?(IuAvpy{>3|bt?BccN8r)1mm9g7 zf`aYwI5_}QG4R!XrRsL)2<4Ee|MCox4#>FAfQ)}qRMI5u>noaAN*MQnXwXJVK|urc z+@VkrMyBE8At-HR_|~_&{olQNC#9qyr=~1oa7mzMf4+E{K=IHe0#k}>C5g032W9=&GowVz%;7vNk0I zcHmEW(b5e7N#65ddvYzV!{3HWT|y$X`aSIle5tSKQyf{AF6PshWWDHm9DuB;aW+@G z?n+`m{gvtbd9;Ul|Ixz>i)c>Z{)cPYolO9)sfuYd%(S5{UE{gx4Cs~OLiGpc45u3k zE6_2yEEnxxJfR9s>o0{$EME^6TwO`N_!M?}eonndP8KPYV3?L6r>wtE6h0E4b>4YG`n|0XQ)gJ}1ZVI+Ho-O~f?%H2LtL$T3U4K-*UHhG7CW@2A z%682n!p;5S{9I07wrb&YM!0N>wLxFe$6g&~W8(!!n}zL#q4J_~r=LmS8_o`v26I_X z1VoM;Y_hSl`*S*|g@vSV5!~u7*AI|b8Val2o0fc9r)d9e zc)(l^rSs#&iHwXKsxS=3&~8XQ`99Yf8#He=bfa>5sIb0XNYno$Ub^xXl)lEX=DEGAE>6=XOx zo^1uq8`WL1UiczOzKUHD!5^z}{OU2kWM)VRR?J=lVT-WqMr5W3vCrn^_&Zha_6dM> z0g0z;LW_fyhT68az5N(CJ!|H@*`)nBV*!DeDpg9y)rR*tFXJ%>jY?4nz0s=|!fg>F zN3K(`h{k=VPt&OyMKRRJ@HtF+nMHF;Mldf0L~<138S+JZ6-$y?8Yr$3P4O?kyM1$L zkg*}alU~!v)RgU6`=thGK`24OU_#rWij`I1!k^@|rT zlIyyc9jf3hbnu_tI^3~c3sd=Obr?JtOr%WUxuQv zjObKLpYGI@HmM~cdt_qW0Vl^Gj zIQeoJpE2D%!ON?%FEbnzYgDv4EK$f-D^2%zD>Qm6P<0VjmiDA8oaTjw_b$In;!HDK5}?>VjAc62^&T7^EynN20v7El-h$=-S_X` zf8jC{9T*pDXV7QcdgvK}uYI1~X!A#PZFAKLg9iZH`EG6rz-UQ~QF*<@N5H!je(Tb+ z-{0RNy=l3kp|WvO*gH(cty};7I^PkTNkd$1o*%kCRcpeLCxt+&hCM$^Jt$R2$9hyj zfy{VaXIEFo%-o!G`8FxXi8Jj^ee1{#*vVJkld5HE%4=jlJ78tuHdZFz>ohTnDgb2l z)uTmOW7>=+c6I^&gU$XmfS%5E!~22a9)&`dN?qMRTAb!N2Zc~I21&`b-T9%yiH3I_ zNuqVfDtfxQZK?$&HeM2b5yiK-o=-+|+j(LM2)`S~tF%)5N+PLQ6_U|+(@ba9J20lw zb&GJfc&>kMp>Uzw@8%H!UD1GI>WA93sM_f?p+4WN)ALz^HJ(;>{)e9!dY|c`#7<4q zqKT)P#%}P&Y77t4yxFFgo#d77{lsYE6FJ@if*VYmU6O8x$3IR+%{d=f3qoqIw{5NR z+@(l1Q|kBxkSzLCG1(l95zOrhr1*LM4ev1_4QuDRK^q zB+0qR2uLh)&b(D<_vv$v-RB?g-uuRVJsdq0cI~}u?=P%1*PL@Xv#qaAtl=yz(zC_WoNwxdfmd*NZp$+nPFE=ErhNq)x(8~-7ayr&%ZnjubP6+$_K7!p|~+r9C-8@zO^SMr9kU zc;RjyhH>#a+whtmN@DTTZZP&SHF{p>m&HciUJJTztDZtj)lj0!4y-)EIpQnlr{)xq zq-1pJ`Uxu~Kl|uJf$FT-VQp!hSQPz_(}F~ooL4tJ=XLl`Qm<18CY2W^nE1}X!q=6O zXC=8=R9MJNj^%(?2KD^pjrP3Xf~**)aUvrnnZ`S>nEM?Gs85|b70j&tWpq~C&cDx- zD(>dZoAZOxCCIt$$|74dkx;Sy+)&~I}2Vl~Yqo18cH~hq|WJ!5%s1#a0YrDyeN_VOX#D(bK#j(q}(ox{rVSSm8_Ak)m^) z8eLYV)03Sr1qy`sXJY~5B!B)Y-!v(pN3b`uM z-PAl>`5CS0*{@Z1k;*E!IJh|27?u}~+-q~}wwT72V0#p4;47FkM;2^HAjpq$b_(YF zT6Q;eHwrk=@8g|#EaN?|>@U^6q11e|VeLf}`$$4P`Hk_|ljj|#P0h{Cgo_(~`&%If zJ1cevxVCg$-)VAOcXG!E>hojNVsM{+lwO={Y=dQv3m?u3_vILt`1;!4TQaEl zg)xY6t2q*uP?;!ULy%M=dWRH5c&~GCC@asl#mR7Rbi6^m)BQ4ZpA#`ZaMYXMet{w2 zk}I!SYgmpc^G(K?o@fKy3F_^Q>A?zl1a%cm$7dqDoBdq+7FYy+B{%lIAoo_#cyj*b z&wJa#S%%?y4e{|t)Zz{Kb0=73%LBBfCe}as$64@LmIl3k9T~}tPMVz7$Zh1{+#wFk zm5w&=5vSzm)L*WM8=W+iw4>57Z_y~rd^2;w_awEQCCLZ!Fro_}WbO zlhoR(U9vS4QtaES93o33X8SS1FSKt4Ns(qD4x$$4R8v(HB@LS25^Am3-y_ujI`Sz$ zh^b<1Il7|{Y_X_Tm*{B3L|E5X>qzchS4wA*4d+k4H&#RDzGJnpe*{=C^!XPTZ3LYb zzZ5i7;JNC3eVPPp?-0?j-fQp9@lav5t81i@^Dk8x?QQHVS1Q!JLs;E+)+Hd6QqRxY z+N%#LrnE;Bx$mzz%E`$!UFMQ9pFBE$`nb!^xc7mZZlC9rS(wa(Vo82-ax$!S`PL)9 zK)q=9kwRu(P}gt)@%HMhzPUkrlK!VuYzD5KtqGG56BDDtxHtXc(*;td8Kor@a=Xwo z;6hUb4*LO$)J_fS6ffL2W2Rc(m6Z)DbM4riFOiOR=qW5;kt^Z0I>ED}5|^qI!QG-< zcFWs~)H_{^lLg(HCHqs$80mr5ExW1LSR={V0gA`mEOJpnd5>3u0|PrRG=-guHIBvMwxW6$IbZdwg|yhqcD1U23;< z23rDabdtNs;10L_M4I36v#Rp__q7HKmn2d971(f8jAIs8DGdaTEOoJcrBZ zVCKV>HFBQz`C+|WyD-0y5S+k5DY`7{VM8}ZmMQdcZK;Zi%y}^K;@NLqrUVH7*zj8Q-S_G03hIPcx-z+ghg+t)IP#QaU}XAKB z3)(3K7Bz0n#HpBx>St>MDQ0ECi>lMzc@18fTuVHok&$oJS#%5@K4d_f4d*w3ekY@L z7#{pa%H-BuIJDb_765w?wTiwxqf?TKt2fH-(Tlw#gFu6qrev5#xJIfJ>FL!q52E@3 z!9nurj+{wHt^9d`M+$q3^6C9s@8!3ad*o|jb-Sru{o%vAr+zINFJCSh)|#c%L88Ny zx*Zi2(T#B%jmXPAuan$8UHj{idva)zUF^lQ*+bF z+4t1mZu$T@)tM8hz_6_)Q!!{(^ULlY*wU!hpRGJOK+Zhuf|wX^&YEoQRm-^2iO~ZZ zS=VEoZDl1L>MD@~LCt)dF04LNR}R&w6O=rU+g;N8H@CJ|r@He3WtrBoHWRtYdTuLo zUs_%a%gbYQ(`R5;WDiS=XST^Kpjz6>d`v>Ow=(7L!dw88O=owmAhsen0*i4;G0{tV zS+?`ODLg$&O+^1!H+QFdC9D4#zc(zQrQ4b#`I8&Se~HFn9^4PjQ1{Z^zHfxvUDY=v zQ`{gw^JwcF8Ohu@RcPee=KM-($S7wV&)7)Z3%_h5_9H^coXY#W)VWCyGB6lA^y@UK)M|M^o+TStd-@`=DAFIUwid3i;~mDSbw zaGrbkGhIi2(2D&n%#-LS^i>vSXzsj!k^B`HR?s3|0bdHf?57w%6Gfo^ACGo*nBU!6WR4gx?>4%HzvZjc zuGt18BI)8;NonZC(#D8z4bSqTat}Z8me$sGvAe7FvC(8KI+uz04OSOhNxjL0b|*(B z()&-)p@Bfd!^v)R>icOfG^k~qpx_s;g?w#5+hcU8R5V8At%{Lpc*#1EQka^4a=GU{ z<6$LDoCtlqMWURJfTL2&(C!N6i=Xf-zlxFBSwU1|5;7`E^d+f&Dkv#i!QGo$+~dT= zSnaDem4lt`bSr^MnELJGDy+}X;U5ceWn#Ydm}4;=8WM^G?fv0UZ9$(mbP}Y@H&gF_ zN|-x0=#tHG&EWIy)_mT8!)%`rBomOuPE1TpvT9p?8SBVXkA~u&xoYaGQxp?pTz}y*+i$T~N!7F9=b8QsJ(#QTw?~kz;OZD)ddbxuxYz|GQ9i+strb zrmm8te#VXHN8MProO2xfG*gP+3<^(FBg}u zyt;8;LE-9&6Y)x)yDYFu3xgKjDS0M}EvO?jqbCi1g`sAw z2OnnBYFlE;kPI1VlB_@dOzi?AVx)IhLCIA8@AIqDkpJRq{-VHyN3z z1zA_#o2bPiG7uv)Z5*7rt3aJ%;ihYMY&QQb}>Ki-cE3q6PWLPLAK9j_GT?kf98);v^%aHDSN#tWs zkJ)5!(^ksvJ>^7Mi2ujiX$y#nFEDGBJIIEXl-Ab&H~=Xd#Xz2ZO8-p9>b_ zZ>nu4SnC>E4s3SG64FvvCC-SWDjvZci$W<{3*~@wZf|b`oc8{`$#ZrM9Y211p_%hqdkqgeHmH0$8&i0G zC0J6ddlwV!mNHfhnT7PUJ^+X_of*vNDbP;WcUjCQBru%!DqJB$dGTvQdX^v+9P{b9 ztDqA-4Ssj}5D`N3{2#|X{&C!Sdt1k6Zv$EPulZy}Pu{TXJ=ijBGYiyP_yq(~pV^yZ zqj)T8M#med1f3LekZa{`NC2i3bGLmM0!(GXZc3q&d{}UdLeyz0pOu94&5Y>Lb)OaE zhok`-?yiD}?qWH9#0>%6`2MG3XHk4i**SSlEiDzc8yRJhkwn+n*c2(wi*lYmWqJ8x zl2Y=SJ9kcRPX!phsNeys(Yx`+Su7BLdx*xcz*tm73P93hYHFI8XqseO*dI-gb95yyCCgbEl3jE6P(|EvsM5o3|pQuTKg}#{9 zD;E3@OPLAvgA~pjhBT%0+U$pB4cEWXHUEfg!ffpxeYu4{{I;_U0q`97PT~KdK>6LZ zhVXEYg-t3i#NnVk5i|Vk_}Ly({2{P>f+|h)+WP#rn9eC@s$y5QrdpgV%IfQQjHlDq z@n9u30XFS~MkhgxX{@PcM_tWA&_Y!c4$Jlie}>mYGx2}7;0e8=#UEDsGhs|kc2KJ5 zi!*Imk22VK)MMa;3iPCOq`hGi8A524_p0|(5C%%U>P$U3h=XJ0!XX&#A_t+Np=O8e zub&~7=*hK@5M)YS+gXsmEF#Akbb=blnBX_F*Re$6$IgMnuDs=S0K*{|$zW7Dlh*tA z@uZa%)5c7jScfI-5jq0)Gf*%gGJux~5aTufyR&n%_`O}R?y9GFB`X*uYvRN&xtR`&dor5(ywQ{rUS;V}~!1P(McH(We^Y)JilF;J~6U0fxGb@M}*k zEjdKiKZ=M zbaD3%t$=|RED7uA-AAus5LNed%-q$MS@p`yjHN9rD}}^KuM^3np_xQy#2yCLcmUH? zRxQ=8~GIsDnd3 zQEXHq-Lr3Bek9;Dx!`8d#>b%{c;ox4pY-8ro~$K736}rA!|C?WQ=21tO7mAu^XEj!8e^%r@Yh|$1Q=MiBGWIseEEd z&Y#4E3K->G`>PswZ2LMfTF>oW<3*_37AI+d_ze0xqzWcF?~s5r;O7G|$C%C0 zq~k)6ER&k4GF%m(jZw=q9o|3f>c*m1WHW~>EsLC6{T$GuSD5(_$L*}9hT9m9=0v?! zVN@lv=mY1wYH#%n?Y#VaN)Zz~G53lrk{i%Q*lIcVQb1zUVv@4U%C@}^CH@w!qg$;1 zcPtMvEDnH6dDxo5NU`eZwjy~i!{@Nsy4%Y^f}pecOpm`7apk1kQ65X}d`209k!c(q zngG(4)phzZFYkcV%r{fTzZixXd;;}75?dBb6f0KZuyaNNyblI?dI}9ZPC$MDo$RsK z(R;{^6y*|_Rq7k_5EmAO1grJdJRiZoG1w7~;?Me5$YyWPA5ylInd!eGO%SYR~5*X3LiUt<(B=#Y`Q?@usx<)Spq+NOQ-)g z?5+$v)rV7oFX8{XsZgJh>UQkd+I(-E^3M9H^Y{mI9nC87zj-R$5)v}pAFXCHHJ~MK z1I!m#sVZp-zY?^;E?eXK%P5QX%Rd7HhIBH;Hfw!fA9CD~j~G!*T!#wX#lukKE`eUC zJ$Xfk5VeYlDbx7!LCx1u{Xjvs6f=E|>dP!ver88&eWC$@%e8Hoa8=!pPwu!O7nN-@ zO}rKhRU_$%7Dvo@z9Dx0V+_r;joBy>7n9LBah6N?K zpZ!uMB!w9r{mPhjy*T4T&mE>mP_47n9*Eg`HeW29cYEg$1mjFh0tV>9<&)M&fRrl}qt!Q^&M`fke)m2c_bmhR-GV_j~+RnzVGtkb? zPUfDh@gw|M0LF2CewtF-!MDG+Z(?#1=&0DCW;p`?(9onaDIowoSxDWWrNx&VpvTXm z<{A8l5b5e~7pG81Mpi%qwVI*lzP@`D5)8Q91dDbj@73FGNCko{TgR&2LSARJ?wTeo zB_$;-P76kKW>$Xj<1xS8UDspysP9QZ%fD_qCpq1l)4;{V4%Z=n&Ho>pJAM>=+Br#D zSQe(r?yBLJjt(}uMRuME2?<07t)MeEZ5}G7*@e=ppz+~YBOF<2M-q;}_RU_VlzR(M zSLYm)3nfX&F2)$K+!Do>4%>xh3LoObZ$UeMC>nZVBXuA%HSNdizMI z#HKl)3@@<8($RmlpE|4i%U(!DJ)}{UIliTWoaX?ZP+~Npd!8D2$!~H^W>v=Ga_{Ej z^NOJ^I;?o4WY@TsV{=@k5%y$}LVvOz?7)8Os=PEiD<2*V#h2>Dxhr+Bl?jeG*q=*jl+FuG?XKY z*wd^tb0pNChEXl)D*AQ9I1|>@ez)qgWLVgNMX$l?OMJk1h{Xk3e=TI4Db?C3K~%7F zag^-t1TExSr%&=ta?MW0Nghl!oZ{7mb*cq&|LG_q#+;lWn=N-ko26S)Q5RKnGt&%C zhvZ9o)i_Fs-wYEOE(`8|rBiYoyo3jG`hlEIkOg*PcUC65)0HI|gHVf~O@TBdP+-}t zJ}w{5Z#DXrfhmOLoTyBw;P{BhL7HZMRZSoNOkG<~&SdyMxJ~dt=)3dK{ktIG&7@4U zW^auI^vWHZn;c8m4Gap(F_|l%i*t7l44c-#8qO{%2ncAU&(H?>n;N_2Iq0mmR0!8M zTK1M|OucR~Y0`6=L+&>6t(Z24>Fww^rUw|(RD>?#k}rCS8<<-3$LK`-dSqMr`kUCJ zod>t}H}pE$HQEBu^0O^O1wCeic^%NKyLhpejbq8C{VX&}Yx4@IWr#Yyy94Rok zbEc=vDhKE^BhnJyb6fIsvFh$CvYQhNXd%8=>JA{)>I)C6DkSDa|rTP_wz%R|dJguvXtChD~ zXotWY=wd)EJ3$R`Z=|ocK(0FmUos!{Zi_2kn~w+%4vq+M+%;N#`f`w^Sx%I|p1JgS z=h^rNywu#Me z%baxC=8N$oVnV0|%w$!NBtZTK%B0QpqYa zvtR2L@QHvOo&Vj+VCLRJ=Z4(goP_~ddq-Oww!}2&#?$1D`N)^AgbQ5~^YVfqolT^w z7|s~eb01Do%kz3~ea{#gWyHE~*#qX*EO$oqWiv$|uIEy+iYAmSDRqh^4wh5ZM3YYH zY^TvO@bS%8R)arkN~+HZif*3GXFD4US{fP;gJ%1(;^6C3SA8gVJ45k`pK>n;SpqFk zv9^k2Yo6V%_#^z<)%ytY^4&e|;$Y588xnj9Un=w8KCAWl>9Z+1?1L<;2k z3AtoA2izFfcb%zFD+8eXkp|`(7%wc@DJkU~h%|RT>#DEcOz6Ve;6|KYd}{!PV6CAy*d_sL_Hh?}*FjQmxuk&5OnbjLmV zEa13sUM}NJz`_Nsn$Auc#vp#aKHSiYIFZPnLSu{3x&GeXUQvRzqha!?@%w>qh~CE! zb-;gb-5%T7ofnMu0RA)^$2+Wp@#rz7<11l?Lv>9=aQ@zh6y;oFvy*04#og-(mn8!oj zPv&K0Wr`iAbD3QytA|k*9W!ppDo8Uu^!AoVb#_jwwq;le0|R5wj6*xc+9lD`p7EPl zpF~q5S3b9zx6{gQuBEa*J`S^9n@c@erc>_s_S%#R$@7D(pnTGWH9A54=FJ;45ny^` z0aimrJG`pWa@OtiUk;=@A zVo|X^!CST_VHe3AaUGbAC-3UHgG^;3Vqdj{38zcs%|xHxDYZ&uQP0p_**hqC3QPZ! zHv`hr&BPej-TCM#xYQ%^HdWecn%s{TCg+EL}Tdb>2Co+wY8(f zb-W(PsZmy1cGEd(Jdh60xOD4e+HLLaY`_Et)qGoP3ubEiS8DO9^1a7oEcL()m?e;x zEyJeOC5I?=vjj=??_*Rq=U`mN{MpmPL30{P2Hb#J3@tF?swo^+~0`a235lq zZi7`VL1Dd*mqgP;h%yLHx)7>+0ZmDh*6!u{Ol5)f{sKXMIFE%%TQL+5NNRk;ZdsqI zuz+Qv)!#SIzTg!FH=@^JeA`~NyuP>hVLO>&*H+C}&oONJFt5QZ8EluphC8-~V+wd! zA)6l0-a#izu(RDi5?552Y0Y&~#JF>)*?P(}+Lh0$ zCazJYAe<|l>)~$yf_jvd?cp;qk&7&~8&4^JCLDP8`hIyi&2!QNzk_B9fwV1$IUrCz zvU{Y-iOAUYWG}{)x%G2{r%w9l%yve}j`EuJjexF|BogKLhIZ}5 z$hUMaRJ3F`jU0j^DF-*Ky#9z>YY!9p!^m~YmiwLkL;4}9-Lu#5apCbr?r*i@A&H1? zw@-3TwDGft0LLG2N4fZ`GiR@Vh&C9G_DzQ79tVq2$$eSv8GS{Gbi*R$Db5Hhot`l2o8mU|?Vn%O4u20NvX~ z?_MuWz(bE8`o~C3d5ec{Z&vd0@guPq5tsen!1Nea>OaFqYBS$6o8v!oz0%dqcTbPJhfv2}aud*Br*A#gpkDuejkprXiL4`1 zig}Ca5hq(TwKTx5BgZW3%_yWK8}kDn-{HsWqQjT>y!iJ>pSU_4-yDv;z|N#|lDyBx z4*%OPR`&=}(Ka9O2Yk6R@|g(L#p1R` ztNT`}kGCg_V1HeM7|GJ|*_#Ol4hDr%VF2j0h_~dv_xGieJY*jX`Jgl7|E8Y$|FXRB zFN2>&v)Hnx^Yi}c%LLQ_lWXPS7FV)ppjafdvyS*re6U#z|IJ|N$8_U))@X&W$n?O5 z1M&dx7mCYONwFTrq!xv_LQ0(Ff6jE^B5CpV6fbvCBLlr%sjB_C_WfuEp4Ar$>(sn8?R?VosEI|Uhq-a5H{vTHmBO+1Yq&j z$$Ha<|M)v?XD(9$u0I$E^a79_7YPZ%38PL)e?Rt;c-?b?xhZ?^WODR z1T77v$zefL5jd^QyQ`;8GYg@`{R|257eYY!DGNN~T4TiQZoW-zY*MACY+*VtRekS{ z!}}tOv(!NkNrPu1LRHqgPFN3?8v=3+TRYHhYJ4w`>o&+zRBTP^eWY@`LgoIcx7T?$ zR1s#o2hrYf54*X}WU%)UeF@Yj9xGxe00f!TGc>id{HQpJV=AcP0A<0CnjEcyC4oT_ z(Z49?kJP23(RUhxF*+m@^Yf@ZY`Z!0!z?xx`JXj-)%+~|pYU%0 zW~({%$6w(O)X>NbG)#W!5+Q`v0bIrqUqk#pld0!Vcu1+f z)6M-)M6mw%kN(U2a#D0HozW{nx!pB0lbR7yCkr`hYXa6Ksbu!JKI1z*;hW@3&2r5E zsxWMeU&3D;p2g3(x}t@!9He2+t8(1Bb&>NCa4?VLj*e*YkZF}KdQYDWVS|~sA#^zN zBBcL6n|Xh(Dg_?>9|3y!*ZZaEE`hYvZZ2_kY&LP_3OmBwgm!yk`+_jBkeHbCS?ad2 z`-k6z{Pm&SiP3I~h~nfVqpdBeSMACP52eRS{*e#o`^4@VYkDMX-?$OvmiL<$Sf%CK zYau0`13U9^oJ0}UhD3CAw!h+Gz=stwR^1|-uD(9xZfM)-y*)HuxZ|_GMFzkTP;?WN zYyCuz-Mda~zx4xz-RC;~Edb-q^lwW^9yCAT$aE6M5RHOF2FR=#y6JuI)BA78gxSn4 zQhSPL+k7^lMoT4lRXjFq+$4k)(@N_=UI%3=UiD^cWzeE%t|!ms(bUU2p%Sn?za)dd ziMs^$(*LE#L^dbeh2;Sy78e&R#xVbq0m{lr(p%64Ldpfv)tMo;@fog-_IAepo+Pq+ z3GJHJ)^5mkK@_`Y0MYtXUsr9vG)P-G7jGMV1^Z1%U>hIc-vumn0e`2c5IML^L2(7l zF|(YumXDvM>`c=wLqrc*bD1ZRsiv$hYzc|ch*68ny%Hr@`d7&Sy{k@AK-}1v$sy8m z>5yRxYfS@wQ_J0Z|MaQsks|;e$0Q~FO63O6ZUa97o*tq(fK{L&fQf?U5xk%{A4ZbF#UuhhQzh0|CFE?_Y6!?@>UT`qpqj zRZ&)2C@LYd1if`Mwp5lZquDo$Obds9qXLqU9tCGqc7begjC;R6j3E0 zz=zQ;M$^^fU+-1wPS0*>0(G=U&{|NeIWU@@9XkV){fU~OE6$`TH%8`tQ6gKCdj&K} z^Rh}g1pbe494>05ZQpYq`slw54a?7z(Ytyw;IC9#RA_WqRQR6j{2uRBvQPfc*tvh+ zfE6yR>g_X*{XG%4RuLaUJmI0CzRB=^erG+bmi;qm4CgY3#Q6oHH=ZRr@a;gkbU|I& zIe0rhhol++$J_rF96upxO?&;OX1*&>=^Y(6aM-c4ckU#Uh*DPpf-e+z3d^`*n5t&qNFZ@u!FV!5^w`@JG;X55%Ktl0Y|rF+|Ed zJvUDJW#M4g!p`nd=nuGPF}g+w(?o{uBEua*J-JI;TbYF?$tZ>D0dVJwJB;`M79$7v zFD!qU^H%1=2k)d3_|KDaO~uK-qSzm*tGi1;&0sf_6%!pTb3lr!F>UUGm=%BXUw7=SD2M$HaneFDi; zs%p9>#MaLb_ak`T5;$5kgbVfCQi@zhjywZ30?@{8Gf|e?=crXx_iEUh(tNwlf1fq~ z|466=gVbF=PXS@ejuiq?RmSt-exgyqK{o7rQuj^Tvl_pWXhx@X_QWz<4wlEs);6P_ z%03g>-kiz9iN1uD4$20p46k2@-XF${fUwn@`7kg?knE|KY(owCUvNfcdx9T7oGL#>1b_f85+vysXTR9hJ<-{ z?Qa6gSlkI8om?JOz2OfZK6G|AD%^moOk##41vT2!^YM#(t4ha(PnS3isTt*<3!KfN^Q9hYPZcB} z4<9^W@c5P!WXhZ(7c7+NM_j(x!+A>~L5af4>oPFNYR|YMjEq$Bq)35yx=zLG1e#Cq zGKGE`Axfd=@VE3OeaVZ85znk>SpZ|q26YcSc%6L` zh*J);1IA`%JT$}{Sr zEDgEHp!%Tc0|i(rp#^5k)5FAQPd&T)Zv`B@!T9qp9s{iIhI&{;s)AsYI(?v5fY+>y zEtXQ0v4inu7Y|$VtQIf(AM|WPAQ(~FnI5WE5ckiDe< zSx)SG_SO*h7bx77uy14wkn#KN+qt%t7G*4yav(-3<)5E|)|Oovb6QlwuDq}g@9tgB zHSZPGvHXj$Q3(G%A)2Z#J|t^&Gy;wJDAFZRx4QbX>iv6mI#08_SrWkVZVj)P5QpAN z>l8j<8`6ASmI~gBXF^sn;Dy<1ya*xr>pGCQ%fX+C3YsO__M?QbKzUA z=J9V?8f%=jN_MV-JZQvdXlM)#$J|X%8+*OIBFhF|J59N9afVXnjK4n&Z%)g_FYH!& z*PLsxme5*8BuY-oygQ!o@b@1gGF;1EwAS>^)cA@(1tdCu6r}#9W20X+G{|`n&>g|5 zEsf#(q4QmDsa;3OZ`9ZQ3*N?!(Mxox{#Mi=ai zX5mnz0A~&)SQhVb$WBkN>fjIneQ70Ws(LyxztOEj+~!Xp$FwZ+Y|O162`AiWQ<+_j zzlB{~e-m~szGdD;&YVAfNZ=SM#cL?G__TN(_XYp>(GR(N<;L4*Pk8o}`0e4}#+RTD zcM<`L|2k)c44VgZ&be^r7)rdF8cr-A8qH}DOD$b#20e3EM@5vEMwzR|Z83NIEa4;1 zGz-j0J1e4z41ifDukBszQR$CSOJ78^K3T$3UEY<_p=oJRnw|!V8iXUxVLV(p#BR23 zC#gK6Vqy|ryq=maoEZ`-_M;Mbzse4ZRTkayfnm&3m2IEN2Y`wt$g$!l{X3u1r4S!z z5&8G-7H$)|_Oq?R$}E6X-)_4TE-g{uu`t_7C{YP!vkgmnu6+B@lV%sU!~z5kXc{QDrq{< zwCXK4+#BA+G3s0YoN%-ERr|+S<#Amr^8lIq)ztEHI_QGVn%1;q2 zt$oz-U-mj$H1cPd+=l`Mq4ZZ()#4a}lT4cJ{S8bXhJm85DKEbOWFkXJ-_6C2kIQK{ zp}|kA@pa@u`INC9X|*Ki%iaKe23Cq`SFxNH-6=cDATy-r`6HvEXlXU zL`1@59F`}eVX2C>Pu&17f=mARTha~Z*^gnzgXy9^7dh4;)&PeZh~o4LjUJ9k{9GMH z*?Cdeatg9G87V0i)Pi&Z(4hy5g?6XpMeL`0o{r$7xi7{@GdST+)KaM z&viar-`xV)VrFix*--AZDV3WF(wWROF>0{bdMLjv{udB!-!IWO%u7+lb!O=BX4sz{ z0RsXD^WmsJ#;YbPwf4CS>+KomPg@SqXFiULUFvEGAr)XoU*xc<0^$v44xsyxf_bn@ zm^KN$rp?2DrJsy{t!HrxYj1BSM$kcpAo~!4Ew$Mmx3F!pI2jg{;c?nZZ?+z|tGv9N zt9u)ootVkbb@&Y#U`iWRLN^a4j9$x1r{|atAO3t8!oR^jOP4R;kAYp56xx=e#+mW| z`ssIg^!LS}^bz3Reu8#)Hx6q9#G-=#A`xi)@5@0&qUH|Jst!yBw;@_Hp8Q(KE0AY3 zSPY;6gz|{`q5e|TV22&WjBrAjM(A;27ZCz`N6_a{-WZ>%FND@g~TRLQ0xLPmwBg0$X z7lw;$u|Oy%csw!N3%bN8PhV9!^dze;Aa`I>vXX$uCxGoJ`L`O&N`LTM53`-HpYPFE znVOuryJp@cOvQd*C^9OF?MI|5kXN}M(Ti>Xu5k$^0%0oPw)}O4jK#9AST-uCYkO~l z&XFMdUewPMYhcTL6DWD`wG&BS`=sTt4=9($1W(EY3Tdo{-D={Pq2wz;hfRe+etY3d?5hh}geCciLGV}doSLGkMYW&r|4&Ps znhJIBPI7({{@SKw)nh`qSt z&EFZL(@&`U9(vdjQ180B%GK7Kpw7@PGq*DC0xzrz65{=>Nq?fz)v)^_dc*DgH%qB! z?)L5NP*b^^8ye=gE?u+dzTb|bcldPDQI()AMn|i>9Ujh;`JpcyXdL$;&zpn%&lWJ> zRIi#(SA9-Vi;vfH-)R_tcI-Yli7nPIeBB&(kk!5;J*pyX2g@;BzW+%1bhZJKF-8S zqeDr``*Z({8B>sbz~dG24-CACHtWsT8BwJhzGr>;A}^xbr@A3T#A)%J$=ZzD&ZF@^puUV%z>*M5fPGtHV7`xNC?~jinDw-mMlnL5C zU`;DSl;e>~2v$}%x4riMz+HHtQ<>BdylojxwW>;os3kqntw+%tf5I=wf*eC)o9AJ} zhjz>BfQv)n3SCtN4p9;A`$g9**Fe<6`@@>|J7MPcB|m^e(|=iaaA*qu2a3;X8)hV& zX&9q@iOnQUDOnIY)-9{*6M7Z^xpsL)^@N9L0wX>5{lYv`T#nw6VOg#GVqSq%TMkE_ zf}QDU5lX(4@~4Z*eVy2j2o6Ieereua%>f@grFF4;HV4N@Q^ddpja0l#(6y zkhSs>J3MBKr>sDg1l$bhD`nSO8|_Mw-<}Ujv30R5@@6u8LhnQ=?^Ib|q)aF6-nFx$ z1<}V_th4Z)lOe(vdJF8VuswG=_a+i3JfY@y{PYwyLzev5IL86iQ_wd%1Z$HN{Yba{ zU3?O#JdUegt^7kd^m`f8N|AOoZ%%WwyXll9+`&(*B!8nH(se#r5yfAvfIkqTm26sC zx{BosV4TqM{YQVU_JE!n69IRMH)cTLKXI2}X?d0EJaLvI)ee5RIdx2jv^2f?d)C0P za{Au#LWO&d^&VK+gPVu;+sM9r>p_eotC-j)9^(Zo-HQ2MMr(+R`(G_Sb8$#D1v?iu zMB6AAlRD?B#Z@%esDMpWk$NXQ1Ng!tNdKg@Gaq1cDCDYrAd<(PT?iO$tdRRFhIv7%|AT zElqsn0Wj9*|B+I%;8Fa$cMm4sIzxDRk#xI=U#UzpujR!lHF*%_HtLn~PROK*U%Sj@ z$!qfUr57n90X1@cZukRsaybaP)ztR)_sT^JZtZ%UjL5eRFg4CY9qd7)$$JS(_E|qD zTg^B<7?U7l(Ji)_n+fzJiQu#@HCUU8eiiK$7^YDXHCdHq*frhTJtx3zH5eS_Kcd@U zHIRhI?W9huQ=MVrKsyevE*fCDNZ?+ zM45TG zjXh%zPKO|E2P+>@0uid{j;t)vmmu2$1`ija@9P2@?Y{4P9nI@@ zqq_xLu*!WB@sj_I!vU(UHoC8;hk)A0*Z2D~sb9NPX;040qD6WGy|}tY0uFNjfz+s7 z6`~O%P%O%pZOaBiJ=CWt`YNzBHJSuV)l-Ut$PHO(>74w0DD%w?;vm@ryPvtfIf0AN zJnIp_FEFMyx3=-UXH*+5%t#=Agz3O%LExl2SS0it6*^G} zHaZ`N$(R@!#q*Kg;0R=}vElTEo$jC9ZrH|VJpV8@!|-p(*>rsP0P32Xy5+kcpB?8) zRbS{&EC9AN&!OEOl9PcOwDSMgA>X!&S#1349pYU9SlA6@QV*Z|fSWQ({EhGNP zQsa}yv(z?K=IH)F#5|Fj%LjB^b8~a?O4ITpSMrnYE2dh*4MV9E=)?*to$vgFL7wPB zLlbB4tfj*gIPi|z+H(854ZuT=;Bk3R6#Ep@f@V#;yB0sBs|(%<2?Y#W3%$Lq`eG;{ z(v{DxF{!~U#)sY?^4=~49`o{n&M0C}qxQ|mF6(o8`8KMe1_qE>z-Z7um%sgjMiL~@ zWjJiKko<J^|CS=p-4}83Kjq3mt?1iPI&k{p=!8Vj}xX#ar$@&=A9!7SuBUB2Y_K ziTaV(z7%-&k zf2`D$ML(W?$R`Y!|H-cQM>u}zT9oTq{bw5YjQftTj?J_bd0}IYmfBcozC4!mM$RYm z!66pKk6be)upr-Cx{!-M)ps=ipY*Q9N~^6*n+X0Jc(EA38$=*ZdJrMECew@OYki22 zt8lem55M5P&-112?k@S(s#%v3BR5aKhGKX|lw3njMaE)r$iix_1!nFld1u`~hlYvK z)q6560T(zqAb8#>;rBV_CP$dx6MP)+vb#6Givyl-+|0q}6+ITLN%?uxZ5$(>VIostQv0?KGRj(?q6)q)Nj%a)56+=&yxZkL;JNC&vTUGQWGnLw_ zJ*}mTXN^tGSI71DSD#&qlFKefncQHX_EXQEphUi7B$_d(7-&qMw7lQZeU(iJq2Kw; zyC7(0v&H?Z6Mutw?`IQ9ligj(X457{PJ0e+jzDc0m1dFM+mTUg%Un2|sma4@Wez-! zOJ~n!3^p+{6teV~411)xk$p|r;Mx?d3*)!e*^773QdzaAiz z6NuUJ;>L4d1=BbTsI!{uHaHE;?+|XRNaSVT@5OGv7|z*t4bW`6zrFSouEYHj)!spl z_h6|^?YvZlgL-dMgXKd6E<@juBU?rE<*TS0V-AUWa!M&Ds&?mtjJDs%^9;I#rf=WM ztlXVf`xU1Yd2>xnOKsCqxv#6Fh|B7>z~K)i(9Ks5h|$>iaKBhbZ9gIJh=un4kmaixwxwB6jZgPUvqeb93?4jzPa@?8VqaoHzuG*)YP9@~c8k_Db z1rEJ85$jCpnZlgT=0kFs&c_^g4THG>DR9p%;Y>6R?so~W4P-9?36qat5-2L9_}mjO*2;*X9%gUi4-uEn(ufa+jwl~ z=I$Mo-Z^^Gu#7ypsNawS5&!juNFD2C*L>lV)IO`UqAzHHXIqQ!LpNs4xjS_N`^M?76;lg$G!}crz2zGe!keK~qSw9tTc#k8jzEWJH zz5Te<%E`0lW=9X?8cJ4fRmf5VG~DYWRo?%M{eQYU_kX6_KaO|bzB;II=SHP+D-kNi zP%-N!xe>}S$0a$BIpnlq-R0KJ9V(}=S!m80Hiz3nWg$6aZl_@@me-M=VFLQTfYk!yrQGZ!uWn|Ejp&rrkC7$!!3Ddvpp~nZ3|%35lBx1&u!PW&R6QxJxKWTEw|qOJo%0CkHT>d^lh3=ovCq)cKNq5u44I{$oK2W*m#z9* zK9M}79qZ+kp>4YO=Ld)BZ|T>%Ywk0q1-4sU&!i3Vv-$eSOw^wTv)UB5w>!awryJw4 z`JMmPB!FiMpZ}YK7Wh60ByN z#0=F$e3ljx>N4DyHet4DqC1UbarK#;_XXs~Et9hk{P*owjGu{oc-G5^*#?ZVgDL07 zwiBFSCC)!x>A+tU-eTkidWb9Efg`4+DmT*ACf5ix-@bC_jP+_E=HN{?2l-Od0+fz* zhz@__mrS^1#`7{CuL^Rqtw%^h>}KTn2^uN&-L9|63H-WKPvoCk9wNG7l?H%j3Otyobe{1kH zK`~fs4roaOaOZ2}uW1Xc%XfOpUkP);5}&R4+8#OrYX{@qZbelZYDL~J@J@(IH3=7~ ziLkk^VsWA-utSih@ZEe|`z^!M3s@#`$5VgrRi+I;I91Ri1FP$WQuiXXA5{-pyY&eE#e&6E;AlUk@Ts&#le>~~36tHcx z^{5;ITh0fD#@MC^pI$oA&xZK28nP6&tTQ`+OM)uLE-sb8qNZ=j`T3P=uu+a#)q|EmX5I;uNn(!imyqL^_sC6 zX9fDfBWpF~3|Jj{>Q$y@5ikeFoU<2qq`S zl`YdgkZJ;MQlfj~&^|tzlO1YMK2@A)X13|M9fxeTOO)3{wP4p-Phm$cdfs{tzaVGB z;czd;Xl$&9BSer3&!k!*c)YlAeP3A*q+$uAW}}9{K<*86_Tm(rIi0oa;hOo8$_J8f zM@A5U5t`>wRTbP{w!M01MIErOptGn)N00e>d8x%7lw7_6Y>+?}8pfuFs`-`P$i;82 zZ(PgL9;b8HK)tFPtJ$6dsn)bhl+GNSj0IsMEUe| z{Z-=N&TAA=4?_U>tcs@BUWEdSBSih5H{N&|LX1N$w;6*5CbBV1jDKK_+kRk}wk04zQV{ z!30~I&E0W3wS6I>wAj3%=aR=k?tgi~KBg(GJjZx6&uoD(N-Dc~1M2dVSghoM_$wqb z=&{C6hM6YJ(%e87+9rN|S}Hb5d;V2?Wo2>v`}+hl*lzJEGWnEa4~=%59Yg=)s1sm7 zM04rf-$FbO$;rt&{d8Nvx71&|g`sw(FK7wf@<4aJ_?s|Ly7tCiKbtW%HMO8CdC}vo z>=Sgjj?a;EsI4{7>_IHUq#=Ca%H0)eWj?4^n44dVi`fXWvZ4V?x|KS+uY8s=KMzFK zqq^Z;Z4r+_wyIK%#i$M$y;NNtP_I_(5giQ`5fQPrwl>TxvtWlm+|MVklmo+dDc~UV zzHTAN>PD0)&)xv%6vIl!ga|*$%0&l$P z@J;z-ex|x2n5D%mrC2b|1Mx51DK+4SvkuDvQaO+tE+R(O-+BOBx|jkO!)N9SR8X)W z3PGxLx7Ua8l2FASCjn&%C=!LlMj6U+kYUMt^VBh{q85KXa%{QJ?>>xww|`_^CxCI< zLyBJ?ss^wTJ-N*}b(J7HsUN!KeTQmcDUqBUw@*zw+;^ZRbTiCf|ETsBof}bZ#6s`J zY|pgK`)6Cv6S}avP2Qn?YO{|XN@$Tn3M|uhn{@Mk7SZ1-x^dYs{)$yko`DLOoe_$0 zZIK9?7l#ZX+RlQ$BP~fs8iP18va%T>KT!6H*`UQ-PGmhN37(BhlcXf${0RUIecKs>d*T{Yrz6VP6cT9^W(L`m3p3ZR_ndmEu~hgx)! zGx=kKDB#Hf%MaOiiIJe?7kiLcO$L|VI8v{1trz&7KVvglGkDClE$}Iag{z}!c-;Od;yak@X7!p}HM1|E2EYkxK^ndAs1-(8@sS{yr7Rz( zw*)~f<0x4(y6@kc9~S-lhWZ_;gZR-P>fjL@RAnK$-Mh96w|Yzu07;_k?7HGQotAA? z;p#-e3;&v$UlYGC=+4XlE(2xdDOR-~z*X3(rV+?K{2t+ZWIZ6sWpqEnuzGJ04%C)Eso{ zm!M2duWl{mfwisX`OnP{^IOa#h(0MX4JiG}!2k8s&zbBI-eLD-XJ>LW==n|=#>*Wy z#+BQ@ECadinM{~5Cr>o-y;LjFsVRs$s7}+=D6tFL&l<2-N=c(l-qUXYO>GZ0qAkzV zW)YeSUk;`>=*_k;>&^#{41x&eg2j58;}ExRE5_EPJaude81))F0UCsum-430xS~LZ zEl!le@tCLO#T<592JAFbVFvLKnvfA5bVOIFdLeZwWi53nXgTRO~C* zG7L$72K8s5JF~o{!9t-q3pv0K;z$_pDg=%e$D23*b=4{7$l0W%HeN8xS&s|AfM>Xw zOo!TP7#J!^FQX^wme`K90X?r~J~+<+n#~4xW_@4A3t@5UBQCz!0YFBV zvQB*EFuRt$^*+W pK=_RazqA+$1>vXvtCu=W@ZDAGv~+QAQ#;|nOpGk9yfnCV|DQd#;D-PJ From 66d9da0e424e691828dd8f21b43f1ae5a328ea41 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 23 Oct 2026 12:23:11 +0000 Subject: [PATCH 03/48] * refresh the archive browser screenshot --- docs/screenshots/archive-browser.png | Bin 65657 -> 66724 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/screenshots/archive-browser.png b/docs/screenshots/archive-browser.png index e3795c0d04a8041389e0aaa3edc8cc5c89e36820..7c21936b9b2148ea431037a62160d37c8301c1a0 100644 GIT binary patch literal 66724 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 literal 65657 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

J-t(C?D*vNbSd$Mpldw%6G^3`$t6)P zQ-{93)XKvzt!q-pJ_l}LdQ5SLIFvJTJpG?&LNj*BT z*_*vN&$+ZTQr4HdNUK=lx{huN%2Z3BZBb_L8=nB3)IjaxF5Hjz+ux4Qq7iiX<%2J>va@T$$vwVvITQp_qW!5OVA^r&kqUC zGo8s`Nh;&!;!0H&y?2E;1;?55201}f*py_I!)~MMn^IR{)F2G9i0vBwb;;iOkDsKU z@!ybsPU_rYlHd2G{(B`}A~(Sf+Dm)BXC}DBwG+u9QiA3Lci}{)0&@QR_*Km zV2`nTpg+E(f4ubl>;Ffq(7A?vAm`EPRsYzRV?k5c2P$>+&eM=CdQLh)6I-7BwuiTO zLtabtRje%>GS@St=T_UA&bya?A1nsC7^&;o4-aql?lgq5y7MA<{+TSx_>;97S^wKo zb14Peg$o4qsyW&gd2Vi1*#@V8j*;yIfX*+9N1p_4K+hI%v7=jVs+929_FL;v##lhIep9e05x*KhaKX?6A_y> zIy-+WnZnihTfOXIbnSC!w*oDp$KxwI5$m&doo#fp|ApdhnN^y&hd?pCphB|k@92!K{m`Cs3}s|l3N8&;Npd0%yDd7 z>|cvrgLY?G`BfFyj~=}TT(8JB=Ue~IzRS4RQ!oy|6QQ&uX~wos5?&=|>G*WaHUQ~PfU$FjLuf1~&XQ`VyI zE)W3)7Ac&ehFrHJB1xyIIR=3u-nC}+G%k(0TLW3{DyfC>jCtxq!;TJ~MqdEadG-d2 z(H8yDqSlysw8Q;f3Hi`P?P75`rhKfXs&W@I_vJ@${MY8EHUHmW8W{v7HUAA8Z|XKC z97sBcEqeMlq}pqu=xeY(arATJf5dceqv_8u+69$crn^ksvw6P6?5)v0g&1DkKZ3<< zgAOPjp9^EtpQDVADe8(fXpeXZNq8k@1t9Cr`Ym!{TGLQo?jjnLqDZ_jGV%hYRQesJ zU|he*H{X+s7%5_3pX;crmCDlZTTtSAZHMaRdyCw~+uE`A|4A>5G`OhpZ#yc>n{k8l zXAv?X^^j4NM!j}dQ5(usb7-X@1+4AsUzn8^eV`iWZDMyF80hokpb|di+(P72-xky}ZUc|vj zS#qZdvf?&6JimXP)*NcY)NLEeza*HQCcEj<$jQ2~30NMb3v1JKJM~;OI{|8F$R7waIw$P7mo8d$_RKl>+>x}TAamCz|6s&URdf}ObQpAu^LuCJw}uC>q@MP zsPU~^^eP304YQ_rc)kW*=g$fW+qJ&{xhWLPcLRZ^=5KYP*y-eER+B7L{}G1OsQTBd(rh z*t5U8Y0#D26K}-;btyDu+iI@EeekoWKEyB(+`~DFDE(_h66@chAFicd>l(ZO#=VoJ zI#w&~Gg>rd&?7PdKT`%W)B!@$pH$m3?Yb<8*wpf@(?KlEHwD9MOLO~=_CSbbOCOzb zqw3e{rmm`vitY3O^ml?$`0&ec(UZPaml*`BLCuLZ1`}Bpk;Ke{{MBpdpa+@5EXQ5C z4fGYiTH*iabgl85$3a6V0&@cB24q`c>Y$%KIGuF(^6uZ*Qbc$0@*uIxX7 z!$ZOq(@?m$(4R8_eeuV5_wIcwX(>!m)=NVDqLm{c;L@K+pWe@Y{sBXvFMsmYnMumy zC_H80{+Z~GIZKROq#F0oS^~NAbaV0k;4#T);WMDI0CeQ2lE@(#Df80l>#tI`kU!HX z<{vR3PSC#+3-1$JM0?0;p`2Cd*+9jbiD_4-Qy{grrbQOegjO+5c1);;p&fxGi2wZN zWPsl8`5NhBZE{eDZFz~Q@)BYeOU+_pj@$V!M$%yn&BEWig6Wj+U=CF@tJX+ZT2=fk z%InOvW<;%*qH>OK(Tt={TS2yKTKC_QtNIHVLkHjgv-2rvJs^q$IE5SY-Kk;T-5HPA zRKXX|yK5HoP+g$BsFwaS;KCTNBJsZhF16TA{L}v^Dq-*rOi`&@w8wCSMijjzhqJ%` z`%b7WFSy=$*Pt!VBrW3Bty^ie zgMC@XsJ4_mo4$>dKJv5kgR$WQ5NUyutX!JHAjpN_^TkTB*cGmiZkva(=#_4wV=3s@ z`usa;u^(CA{`Ppyv*^mT*%k+A%Y`O*Ambb?JXu=~4z^OxbwpK(+$S%w!66tZcBuOP zT@CxiPJIZt_edYlwv(j*>FF|GT|9}qErnjweD(I&BoJB|acCfTHiGW{Wt8!6u5RYc&OJ?$5{+FObRnJ0+HT$POTnq=AS7 zP#)wB$AEm*R9oAdZqwFj!q)#tEc}jMhH;A@sjoL7<0v$EKtQ|;Ov)1DTVSoU`YLg& zG&RnW?n}xW2|piyC&9BlQh4mpE`A;8Ss@{ZDgy;jYxw+zcYnJo+Gx;0r*xdk-Tje4 zvC8_slS4;;KM=8_TXcWM8NkG$^x3;Jn%M+_1`e4A9dl9BZgepb=moS)zX9465wDHe zg9lFdr9)ktGAbYOM^^%9px4|aTlYX-V{{0?dy(%W2l3S6l)P=23-8;Uo6r~3?8}p$ zovoUq`u^b4hwT|1&;cb+hD;{y{ zJgSrJV5_aa|L-XTA9l!Nxvb_To=sForrJOO-`j|Rf)s`99b;QtAip6HC0aD4F8J}I zjnLa1Q1cvjw#%2(t`dDJ9Z8x(XK0XO16VBu(258>MjdnsqR@$3N=#EgdNhocYU54U z7e)TA4#@l9sLKK9$Ea5D`WXy;FK&EiFU`o)pDiUz^qXR9Bl1>t_`4`N$LA_MA==cGn0u7A0SFi zh16=hG_9mDoP{5|rMk&#kH9}xNQ%_N1n#bF*n31|I4%*#R*-)>DIQ^lS-!^Ru*N*NM2(?ryxiRT z;`*~6PvC$>kK(4&&ie%hf;Hv{ws@pkVO${WvbPk0aiP%hDSiES_X2P@D1pYtoHJ&J>(~^7d2SUOIXlw)H zOlrTPCnTgzwfi{+uQ3?y^CBveY+aYqO@eQe1MgIAw__HXwC4!Uhek`~gU2!ff$FE9 z@HGbKLskjs7J3WQ1a9b^$G@Xp{*}_G=x-B9zaWO^;s9S)SoziWe zrt1A566;UtrT*2r=9@3i0kypgbg@#P+%$OasXv7a7*^z(JVm1;5pjE8cCpFW#(IlM zZEE{Coyy+B+a_0gQ$vyx4%cxw&jXVdXJIJUp)co5ZTtc6QFQ-N4xhZ)uUa*0e}ocG z!~@a@+Hn4gJSs5(@X?XED5Y*hj=?!)R>o^+KUwtfH`yx#(gg&Mp5KP|f&VVng_=0L z1kKQl7@+8Hp*;Rp+6*A7@U+jPzwFihw*>LvysEkFdeDsfZ%N{EJiM0nhL1;j;szrM z&M&_DCM73xOHj8x#COuW-kVlGtapdEr4t$}`nn9d!b?mgL;S};fGkxk3~B+8f)r8P znLxNEkvj^yQMtyx_rBT%Sz1Ek3eH~%sbQmeD8z>yAkqO=&vUBDs59o&&|}P*D7gN% zUE9@gbIPC6&HHK_*wJ&(B70<0Y-!lH3;A2XI}I8Q>|_s3{o%bgNvHC1cY_!U%Z{vk zhDk?XCe4w9UYrOUR0Kb@=oS$%j~k#vGJI_HcmGju!~d^ikds!6F*4MIP3ZeGlIQj$ zdH?Xf1~&AhOWi(wIL?)q^w6XD!s_?%v14nFtxaBS%KJ?v2O{|nh5Ut<6|4Y?Z-Fi+ zF^Ey`Tb6~lqx(?jE)#DrcL$#%_aWg>C{aWDV&QGiX^%D*B_lN}=MmTzb<>Yio< z8u5=VS8a(%+tF$~a-Q9JXmiDn>gFrkEdm%HI%i3}dAdJ46fXNy!ay8svONa}iHeF- zWc2F!8k$D?a-Ne23Q&95dnYqeA%tV-9Quw* zJ`XhH{=SL+i~Kvk5Gv;crH&lkf!|WFch+XNA*>`rH#=^UyoFiFFjrU+c>4SMd#Ngg z8^&{Ty+Xg_Y5#)+b%TWtHJz^MR^r)ethLol)-Y)70O4apLxY#MHytf?aP3*z7|ngi*0t|NuUdAcX1&qFq8F)m&{J9~X|Q#t2`3ib=?g~#OT>LHIiKRNE_ zW$NsqPX);V_PMpM-2p#^2(g!Mwk|*Lx&XA~tmh{%J(}3gz90$m?-e|BhBPkG(2xPi zQq_)=6DbI-s@`5+*NCsdcv^b;UOprIFB-Cn%Je~XpvYzsUpjuvOjg_{^&F6(2D1G9 zrS+9UEqlKYs&V>#{CLAzcOcbaL@d5vT<_eKUzHQ01xO1?Qe z7;b_FUC`A$&=HZb^p-a_hpC}&Ijp}<_ptth@XRD3CG|cBJfp-vY8j|3;H~I$-0K#N zZ6z(?mC2W)KwA77m%XgKMeC50n`u|pv0g603j$$X`I*|-WLLMheGWA;+8@r2q38gi zGLc?c%mk4FtV6TA8)Ibra`cL&%_ralBQ8QhTNZhHb^hl0n(`N#R*M6<&9h+`=Ao{k=Y(HdvIMKO{;Dk{HkaELla?* z8ahLB4N0~t+V!ANW^QH%!gYBPhqs=?+6DaDWaH~e{ z6Kxyy7gcmr2oi~K_YW*;J>N6kdb@G5lu}<>`#H1SPF5(3zWq{7yw`I$_2EYWL(u7` z+;}xl-p(&Kk_ECmlzdW&Qf8|9LtP&cpz!q<8}$LS$M@DI6BOvP&=c!HF#?()gU^*k zWG$yYPz`iT6VHnn9-Yt7sL`OINs6-2ejL6s(KU2t$FLje1qihJ=M(QcmdVm0kl;K=txQRinPW#mGbdcOni~S?^iixb;agI$l?r zIsjA#9lwuK@V$j1wZ|peEje_R`J`?AswAd`%Ci^ULbaq*B(my~WBSh=ScZ88ptvyP zA%-@L`U3l$7t#Gxa?>KIziKSZ|Isd3OGQGx>P-7*V`29*_%47A(meH_9rmOO8upYg zqa%f<_vn92Y5lXW5JUK|MsXjIlnOEV*JWW1YO_SXxNzuld8swUnBr=~V;-KOyM<`r z{Z4ZoFTX<9+Gf`$^fLs(1o~C@67=7I>Mivf9emR7vz`1aa?mk)YZQO-GUoSTSxTBn zQag(z-UHR)9+^Gql^Va<*yJra7vg{z!rqxRE;j?}#lr1IiGuY4pA{!DI;6^YT;=;1 zuOj}S4}D`9GBzgwwZKtDY|hBdcO>xPse67}l0g|tl$<6XN@0E}x|7H&%ZGg-WW4&e z8zbjk$9%ssHgsVVKnpSmQ=(jel^dJ3o>OsFXN;(KhSMfB;F4a+?Oq+-YiEXx$F9b$ z7RvX$5K5n~ev{?4EgqnCn51)Ap>A#I(u6@tlf+@-)n#!CHxZ#+(s3Lz`+>&?d0}(% z4FW{iaH3M~_ab9P{}wsyU8L!)JFl!T&vJgdBni28Sxetg+RWghs^E?CDI=Oi-bm!y z(lMhN@51~M-bwxV6xtZ_!NmTAQ1{#Tl!w)dYh`ar0fLC1#l@bskF3|>&?)U~2CD*Rr3-l1x}VGXIi#(PxcCJ)y3adO*xS0Wvomd*US z(u0~jYWHR~KT0Ue8IBmseHSnzd&Iri>|n$-HzWVq7jc5de5Qjl-?O*`u`X`>$i;x) za5JK5&`wR#Hc~Tn$~wQA``Y-7;`VCvV&o40deuPxTCzPao4*4=M(p_!6m{hK!2TcJ zG`hUSkzqBlg&^nwB&nKZSUg zE3t|zNDwYtj9gv(UTg24^^w}8Zou&Q*#NI7#|HYG?>!G>Kg_;%9Ey2Fp&=rilt`T7 zYElxfx+X`QnO?X+F<3{mZ9H+w!Lay{u5hzUFQ7g~eLa_bJ-)~9khieAqfev0(JRTS zT@^_~JEL{sq9Y}fGQgqJT0EBWm9fvW_zaI?vQ&7ni&mMj~fk zI7lrwDa7}-5O38pXHrIS5~Y84v3VbUl|F1#$KU^?Cng?4)C#T(Y-Y85wZfrW;*4r6B{!nJS_}LBTC37bB)gWpKY18Gv+OCF}*X~(9Z}!$Azx)Uo z^m8&;zUK(1j@PqWM=~(Mnk>cCt`nAm`cU(`r?4C#51mB;dwD-)<8q1(ReUG=M3|su zL~MDx_}euNqNXSE9t{cc^1&hD3_#yx7TH(kz0fPmT-$|>>Ima|8&l6^^vqVS82^U! z=a#^vmD6TsI4|Q%+igk(Hl{gh#_NR}ZVfdhDJ@4{i|zZUNkL8~(5|!L!iIWMb9>Tu zp?rWaGW&}{PyMv5(n3yN@?2s*)#j?_WggW?7yP)p(1E+a5MXg4TA%f#i4pgzXw42y+(Ed>%}X1XychQ10!`E3Uuxj>olxj`$cB

w(|fX-&-a`V!TC0v+n6eiZ3h7Cm_IGS~TF3zvh7dr0k_2Y1mhz z%_{|P%HRA)xt&L6jIYaxQj0vlEO*O8BZzvX-k8crI-t{b;shVu!V>9Yt7InfFB5Mt zu>{KGvK(Y-RdkYQ*KDrB!7H;84W++Vr$)6T9LnxY2>GBxivn9^>%!3BI*R?H)G{f$ zFXuxK{6!b{!b$z#G3CDrFt`+wm_9BhyuD}KX-4jjVDW!oBKtD^eND{yM48|#IEexm zl@+?%*4Y;%WWh$lGv52e7Ufgm;gS{Lrr59kh0=&go%|N6ChrBCl?5-65ISOmM{JRh zZ-D3)I;xoOyXDbZo$TzMou0L2CD`APxYsw-(Q%>@tW=TT>T=~;vv%MdpP`r+1solV zL90ro=^UTeP&oTuxQH@OveI>dc~W*yg!NJkve!X;c}Dq?fh0iCUE5oW zbz9fJj7kxy~c0+BazZ$YkzIppg6KN~NIo^CVA(_W#q}xxX{r z|8cy#zI9jkeM=E{DGQ}rDwR`C+ue#nNKW^i5XyN&a%L-ZB1uI#juw)`T8w5k%Bjft zFq^U5Az}{MoHyUs>i+%{-(Os=UE8kf{kh)zd|vO@>-l^ztau1U?zqUly$~}w6_*eX0(omU)!yyZ>c_r2x+fJP-f_(u%SGpyQs}21g{sol z$C8F+?0MhTm7lt4KoeWLtMNN-On;aVEqCH`kFmbb7dOT%_>L}{?bH(&Cf5f;8o#$F z{_RH$fB3An!=e9c!m-I{cdMC(ChSk7yu6TXalLX5r$0iG0-eN_{%B}SKvx|{J@koU zxiHw}HX<_tGB?LGG0Me!jFb^_cF)54zzE4Bf4&s}Z2@(Ur zd%gztFAq9J?&g%Ynob${agha8izDkRU4{h6RQSqj)zfp&RnuvH{=jCwX!>SyV(56p zs3bI`T6?1(Bp}CRx)$kLm{^Ajx9-N*3%#&1&}$Ol{hw1wUfqTHd$QjM=y1Ti&m8*hCv>f z+nSkIv?v@T*4Mv&=XtJ)+dAKS_o+LV93K(kl7Q$Iu7v#2NDnHKxzRk}7dYG`u31)? z;)QfO;b(y#2tyi4^j{Zjf7d)%=#eook>2gi(AhdWTT^(Dw3O+3>n5wOZ<7MJ(|!k+ z>`f;;Jxq{Fi5I+o)w&{#fW_ei7v9}t&ANTew3|0e&@8YOd%`_GUk7QLgV`G`Y}Y78 zFF44HTl_hkXX>fr;y%=~TTgw83+Cm3+O}-qY$l0Ru*&;*cQ|yv$%%n==-47jtx+r9 zshgX(>(ZInj?$EUnqtE^`2T!+^3}mE2!g>dQ#eF}Sg>Gx&>uL_vBkhDXhI@a)1AyL zs)A=ae7U&UoWP_5=sO9hjY5xU_p!10QiVznYJ9xFRWJRTD)jP07-{vl(nk5U+nVq9NIcn4<5REa}o1iw!ENDTi;G>A%|YbAHsk_JXW{b};@pJSa#b+kg#Zn6#PyqOAjjKcm$vfUf@QxT zX1Pjl;lpjjuKT*vU}cr>yXw+Wbfv)7BI7tRY&8?Cz25*Fo?xZ|F?gHgRy+-xHYW(* z!@4DQ-IMU?DecX{ugoxiCP-}ZVP9*koiXgpl2inv7GMqVv@psIci}VBsa!7QrM0o1 z!=BAClH2Z{Dlg5-+A}!MH9Y{oq89V}cu}Z2%)HO8=me;%gQs`VG`SM7&F6{@bu`x2 zHmP$e2gM~*Tm*KY*Rekmo(nA<@^-~}-tvNQe%^4>Lm1RF=!yh1IMV5i_$P(hxpDhu zLmW;tAhdkcfS0GZ+s(R}8O6&zffRy4UC-bt`GmVEN8BD0qoZ$97hxV}Vs0*)C8e=* z3}_p`oayZ4#V!i?^6}#`u&1`uvau&J#+d~L!JQ7qhng-M!A^ld3gxSz^a@{z-F)LQ zf=kWFA@NXPZCa8euR8nWPlpC@B=32!ZpZv4D(%&UVXDpW&@~TcuHU6jHbebbR$ZSN z7xyLl#L2aC+SskVrTk_VySK}qL=S7OfXM({V1{FfqhjJ8(yV<+avg&pRn3084vmu6 zaBZnntB;2ai&Hp8eFN?7CugMrY#(-__JfX&&K2!fkna2{oGV&i;x0oMp5On%_4L#R zN12h4bxZtWFYkbZBl{T-;3`$)H6&BTh_r|Id41jfB#g707Q}qHx;|2$`Lda5Y)n;( z34t|Sm+}3%G=%oSz6j(UpvUbwOnG_!Z#@O=#9x5a)>VgnKhRR_;cR?JPxts)f`&8e zWw!z%@>oDiB_O{af7>dm3{}6{%CK}kiCA{#dUuWtk(DeH^(yrZP`mU?dndXW4r%l3 za^dCCR|U*%d>PLvg_Yrk8d@3Fgr24ai+xtm_gCL#WJp$8h5;t_)R{1t60E+x4TP=a zGkcQ`*d5H_Jdl9Sk|u0dgRS-kU%M8)n%PH{Zee;$S>4@%_@Uycwat@g<{dY;fpT(> z1@<;>;RLPRbWw+2v&B$PN)}P&Hx{cRRiA`gEPh0c#<<|jIqB8c_)lIG(LH z)&T+Jvip}pZmEtFab|W-Wam>-@{14qGJApwGce%ni#we`|Lmn)a4<>J>aoFc7L-t^ zD!$p1u5bD3?vQw6)=~5r;!l6XnGBE@fS=yK#8*xAySAnJ9-9svVgF`3wg$A=qOxmF zZ&H9%wip#F(yEANQp5<@FBqqc7Zq5;Q0;KOD*`XMlT#ktJ4%MozA!P>7R#m1*0dwM zdtUr~tqz`6EwzNs$mycK;PktwCx9eS7IC6-nxdBl?F`3f&#%_#Mf{UTD3NAixRIwf z&fF@PwIGvOEFH4HJJ&DL`U^j$#8-1m#GLc|r?=6Gt_@ZF&qBGG2J-egSEm>Yv$E1A z!y~+{o}R(>$ish%Z`>h_%n21@KP@Qq#rvH)*eG;198l~32`vd!yU>=R;mlzN%H2v> z)K^k33DYe9#E2Za3P+#0sebRC%Jq;z#PlaQEQNoK#jyGcaPI`;O7-`RY2mHitk99i z#v>!S=sSJ+p1%RGKh{7o$pi=pEgVDB;#C|GeRDI+vhAtYEXNSee{zv-ZX-k_;YdKE zEO=hGqJ6kKsFCi^PbubKq&@^RayCIGV8iSC;TZS*4Nfi=>$Nb7F(Czpv(&g`uu401 z_vHE}$ip()ZB_F*)e@+PrvL?KHp!~BwQQIlU#{yK<3(32g=tT8kfY0{-_@BK8J$NV zrrZ%0s9grh=?@>KKYXqB)ybFrR5P%#?@-#f%_N6h^VPR!1@}34|LHFv^0F?zn4$&+ z^qT35`g5GDvMD-B!4-r(zB3Z^5YE5*C13%OZzhgXk1fAs(UM9hCLcB{P$_~GAu#^2xl|MDj!Q?%u`6Mx*2bs&U@ O*JNyHeySLKDeAvN*8HCU From 42456f21a49a7238ce2e96b006cce49ecbf9c4a2 Mon Sep 17 00:00:00 2001 From: Hawkynt Date: Mon, 26 Oct 2026 09:59:07 +0100 Subject: [PATCH 04/48] * screenshots refresh only on branches that change the UI Symptom: after any merge, every open pull request went DIRTY on screenshots/main-window.png (and docs/screenshots/*). The Generate and Branch screenshots workflows re-captured the window on every push to every branch and committed the result back, so branches that only touch a codec or a format each carried their own slightly different PNG, and the first merge turned all the others into binary conflicts. Each resolution re-ran the capture, restarted CI and needed a new approval. Both workflows now run only for pushes that touch the shell (Compression.NativeUI, Compression.Shell), the NativeForms pin, or the capture scripts and workflows themselves. workflow_dispatch still refreshes any branch on demand. --- .github/workflows/branch-screenshots.yml | 11 ++++++++--- .github/workflows/generate.yml | 15 +++++++++++++-- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/.github/workflows/branch-screenshots.yml b/.github/workflows/branch-screenshots.yml index 4a9b6d0c8..c53a63015 100644 --- a/.github/workflows/branch-screenshots.yml +++ b/.github/workflows/branch-screenshots.yml @@ -5,9 +5,14 @@ on: branches-ignore: - main - master - paths-ignore: - - README.md - - docs/screenshots/** + paths: + - Compression.NativeUI/** + - Compression.Shell/** + - build/NativeForms.ref + - build/NativeForms.props + - .github/workflows/scripts/capture-screenshot.sh + - .github/workflows/branch-screenshots.yml + - .github/workflows/scripts/update-readme-screenshots.py workflow_dispatch: permissions: diff --git a/.github/workflows/generate.yml b/.github/workflows/generate.yml index 0fec817fd..2b3018298 100644 --- a/.github/workflows/generate.yml +++ b/.github/workflows/generate.yml @@ -1,14 +1,25 @@ name: Generate -# Cheap generation stage: every push to a working branch refreshes derived files and commits them -# straight back onto that branch. By the time the pull request runs its full CI battery, the README +# Cheap generation stage: a push to a working branch that touches the UI refreshes derived files +# and commits them straight back onto that branch. By the time the pull request runs its full CI battery, the README # screenshot is already part of the branch rather than being a CI-only artifact. # +# Only UI changes trigger it. A format or codec branch at most nudges a few pixels of the same +# window, and refreshing the picture on each of them made every open pull request conflict on +# that one PNG as soon as another one merged. +# # Never on main: that branch takes changes through pull requests only, and the shared action refuses # to touch the default branch as an additional guard. on: push: branches-ignore: [main] + paths: + - Compression.NativeUI/** + - Compression.Shell/** + - build/NativeForms.ref + - build/NativeForms.props + - .github/workflows/scripts/capture-screenshot.sh + - .github/workflows/generate.yml workflow_dispatch: {} permissions: From 11bdfd2bfed09fc7c7649c1b91c89a74939d38b2 Mon Sep 17 00:00:00 2001 From: Hawkynt Date: Mon, 26 Oct 2026 10:01:09 +0100 Subject: [PATCH 05/48] + ZIP method 95 (XZ): read and write ZIP entries compressed with method 95 threw NotSupportedException, so every archive 7-Zip writes with -mm=xz (and WinZip .zipx XZ entries) was unreadable. APPNOTE 4.4.5 defines the payload as one complete .xz stream, so the entry is decoded and encoded with the existing XzStream (LZMA2, CRC-64 check); the writer falls back to Store when XZ would not shrink the data, like every other method. "xz" is exposed in the method lists (descriptor schema, CLI method spec, UI). Oracle: 7-Zip 26.03 tests and extracts our archives byte for byte and reports "Method = xz"; we decode archives 7-Zip writes with -mm=xz. A 7-Zip-written reference archive is committed under Compression.Tests/Zip/ReferenceVectors so the read direction is pinned without the tool. Sourcing: rung 3 (APPNOTE.TXT); the codec is our own XZ implementation. --- .../Containers/Zip/ZipCompatibility.cs | 1 + .../Containers/Zip/ZipCompressionMethod.cs | 3 + .../Containers/Zip/ZipFormatDescriptor.cs | 6 +- .../Containers/Zip/ZipOptionsResolver.cs | 1 + Compression.Core/Containers/Zip/ZipReader.cs | 3 + Compression.Core/Containers/Zip/ZipWriter.cs | 7 + .../Containers/Zip/ZipXzHelper.cs | 31 ++++ Compression.Core/REFERENCE.md | 1 + Compression.Lib/MethodSpec.cs | 1 + .../Views/CreateOptionsViewModel.cs | 3 + Compression.Tests/Compression.Tests.csproj | 4 + .../Zip/ReferenceVectors/README.md | 7 + .../Zip/ReferenceVectors/xz-7zip2603.zip | Bin 0 -> 413 bytes Compression.Tests/Zip/ZipXzTests.cs | 148 ++++++++++++++++++ Hawkynt.FileFormats.Archives/README.md | 2 +- docs/catalogue/reference-formats.csv | 2 +- 16 files changed, 215 insertions(+), 5 deletions(-) create mode 100644 Compression.Core/Containers/Zip/ZipXzHelper.cs create mode 100644 Compression.Tests/Zip/ReferenceVectors/README.md create mode 100644 Compression.Tests/Zip/ReferenceVectors/xz-7zip2603.zip create mode 100644 Compression.Tests/Zip/ZipXzTests.cs diff --git a/Compression.Core/Containers/Zip/ZipCompatibility.cs b/Compression.Core/Containers/Zip/ZipCompatibility.cs index f167be24a..d11aa19dc 100644 --- a/Compression.Core/Containers/Zip/ZipCompatibility.cs +++ b/Compression.Core/Containers/Zip/ZipCompatibility.cs @@ -106,6 +106,7 @@ ZipCompressionMethod.Reduce4 or ZipCompressionMethod.BZip2 => ZipConstants.VersionNeeded46, ZipCompressionMethod.Lzma or ZipCompressionMethod.Zstd or + ZipCompressionMethod.Xz or ZipCompressionMethod.Ppmd => ZipConstants.VersionNeeded63, ZipCompressionMethod.WinZipAes => ZipConstants.VersionNeeded51, _ => throw new NotSupportedException($"ZIP compression method {method} has no known compatibility profile."), diff --git a/Compression.Core/Containers/Zip/ZipCompressionMethod.cs b/Compression.Core/Containers/Zip/ZipCompressionMethod.cs index e9befe5b2..c9867e630 100644 --- a/Compression.Core/Containers/Zip/ZipCompressionMethod.cs +++ b/Compression.Core/Containers/Zip/ZipCompressionMethod.cs @@ -40,6 +40,9 @@ public enum ZipCompressionMethod : ushort { ///

Zstandard compression. Zstd = 93, + /// XZ compression (a complete .xz stream, APPNOTE 4.4.5 method 95). + Xz = 95, + /// PPMd version I, Rev 1 compression. Ppmd = 98, diff --git a/Compression.Core/Containers/Zip/ZipFormatDescriptor.cs b/Compression.Core/Containers/Zip/ZipFormatDescriptor.cs index 086a80969..c9ee594d3 100644 --- a/Compression.Core/Containers/Zip/ZipFormatDescriptor.cs +++ b/Compression.Core/Containers/Zip/ZipFormatDescriptor.cs @@ -20,7 +20,7 @@ public sealed class ZipFormatDescriptor : IFormatDescriptor, IArchiveFormatOpera /// public IReadOnlyList OptionsSchema => [ new("Method", "Compression method", FormatOptionKind.Enum, "deflate", - AllowedValues: ["deflate", "store", "deflate64", "bzip2", "lzma", "zstd"]), + AllowedValues: ["deflate", "store", "deflate64", "bzip2", "lzma", "zstd", "xz"]), new("Level", "Compression level", FormatOptionKind.Integer, "5", AllowedValues: ["0", "1", "3", "5", "7", "9"], Description: "Compression level. 0 = fastest, 9 = max."), @@ -177,7 +177,7 @@ public void Remove(Stream archive, string[] entryNames) { public IReadOnlyList Methods => [ new("deflate", "Deflate", SupportsOptimize: true), new("store", "Store"), new("deflate64", "Deflate64"), - new("bzip2", "BZip2"), new("lzma", "LZMA"), new("zstd", "Zstandard"), new("ppmd", "PPMd") + new("bzip2", "BZip2"), new("lzma", "LZMA"), new("zstd", "Zstandard"), new("ppmd", "PPMd"), new("xz", "XZ") ]; /// /// Gets the tar compression format id. @@ -294,7 +294,7 @@ public void Create(Stream output, IReadOnlyList inputs, Format var w = new ZipWriter(output, leaveOpen: true, compressionLevel: level, password: password, encryptionMethod: encryption); - if (options.DictSize > 0 && zipMethod == ZipCompressionMethod.Lzma) + if (options.DictSize > 0 && zipMethod is ZipCompressionMethod.Lzma or ZipCompressionMethod.Xz) w.LzmaDictionarySize = ZipOptionsResolver.NormalizeDictSize( ZipOptionsResolver.ResolveLzmaDictSize(options.DictSize, options.Optimize)); w.LzmaLevel = ZipOptionsResolver.ResolveLzmaLevel(options.Level, options.Optimize); diff --git a/Compression.Core/Containers/Zip/ZipOptionsResolver.cs b/Compression.Core/Containers/Zip/ZipOptionsResolver.cs index a1f6af0fd..cdb18cfff 100644 --- a/Compression.Core/Containers/Zip/ZipOptionsResolver.cs +++ b/Compression.Core/Containers/Zip/ZipOptionsResolver.cs @@ -27,6 +27,7 @@ public static (ZipCompressionMethod Method, DeflateCompressionLevel Level) "lzma" => (ZipCompressionMethod.Lzma, DeflateCompressionLevel.Default), "ppmd" => (ZipCompressionMethod.Ppmd, DeflateCompressionLevel.Default), "zstd" => (ZipCompressionMethod.Zstd, DeflateCompressionLevel.Default), + "xz" => (ZipCompressionMethod.Xz, DeflateCompressionLevel.Default), _ => (ZipCompressionMethod.Deflate, optimize ? DeflateCompressionLevel.Maximum : DeflateCompressionLevel.Default), }; diff --git a/Compression.Core/Containers/Zip/ZipReader.cs b/Compression.Core/Containers/Zip/ZipReader.cs index c52892e86..34a51a7f5 100644 --- a/Compression.Core/Containers/Zip/ZipReader.cs +++ b/Compression.Core/Containers/Zip/ZipReader.cs @@ -154,6 +154,9 @@ public byte[] ExtractEntry(ZipEntry entry) { case ZipCompressionMethod.Zstd: data = ZipZstdHelper.Decompress(compressedData); break; + case ZipCompressionMethod.Xz: + data = ZipXzHelper.Decompress(compressedData); + break; case ZipCompressionMethod.Ppmd: data = ZipPpmdHelper.Decompress(compressedData, (int)entry.UncompressedSize); break; diff --git a/Compression.Core/Containers/Zip/ZipWriter.cs b/Compression.Core/Containers/Zip/ZipWriter.cs index 6223d8807..89374edd4 100644 --- a/Compression.Core/Containers/Zip/ZipWriter.cs +++ b/Compression.Core/Containers/Zip/ZipWriter.cs @@ -132,6 +132,13 @@ public void AddEntry(string fileName, byte[] data, ZipCompressionMethod method = method = ZipCompressionMethod.Store; } break; + case ZipCompressionMethod.Xz: + compressedData = ZipXzHelper.Compress(data, this.LzmaDictionarySize, this.LzmaLevel); + if (compressedData.Length >= data.Length) { + compressedData = data; + method = ZipCompressionMethod.Store; + } + break; case ZipCompressionMethod.Zstd: compressedData = ZipZstdHelper.Compress(data); if (compressedData.Length >= data.Length) { diff --git a/Compression.Core/Containers/Zip/ZipXzHelper.cs b/Compression.Core/Containers/Zip/ZipXzHelper.cs new file mode 100644 index 000000000..d73930446 --- /dev/null +++ b/Compression.Core/Containers/Zip/ZipXzHelper.cs @@ -0,0 +1,31 @@ +using Compression.Core.Dictionary.Lzma; +using Compression.Core.Streams; +using FileFormat.Xz; + +namespace FileFormat.Zip; + +/// +/// Compresses and decompresses ZIP method 95 entry data. APPNOTE 4.4.5 defines the payload +/// as a complete .xz stream (stream header, blocks, index, footer), so the entry bytes are +/// exactly what a stand-alone xz would write. +/// +internal static class ZipXzHelper { + /// Decompresses an XZ-compressed ZIP entry. + public static byte[] Decompress(byte[] compressedData) { + using var input = new MemoryStream(compressedData, writable: false); + using var xz = new XzStream(input, CompressionStreamMode.Decompress, leaveOpen: true); + using var output = new MemoryStream(); + xz.CopyTo(output); + return output.ToArray(); + } + + /// Compresses data into a single .xz stream (LZMA2, CRC-64 check). + public static byte[] Compress(byte[] data, int dictionarySize = 1 << 23, + LzmaCompressionLevel level = LzmaCompressionLevel.Normal) { + using var output = new MemoryStream(); + using (var xz = new XzStream(output, CompressionStreamMode.Compress, dictionarySize, + XzConstants.CheckCrc64, null, level, leaveOpen: true)) + xz.Write(data, 0, data.Length); + return output.ToArray(); + } +} diff --git a/Compression.Core/REFERENCE.md b/Compression.Core/REFERENCE.md index 4aeff3afb..cbf4a3221 100644 --- a/Compression.Core/REFERENCE.md +++ b/Compression.Core/REFERENCE.md @@ -9741,6 +9741,7 @@ ZIP compression methods. | `BZip2` | `12` | BZip2 compression. | | `Lzma` | `14` | LZMA compression. | | `Zstd` | `93` | Zstandard compression. | +| `Xz` | `95` | XZ compression (a complete .xz stream, APPNOTE 4.4.5 method 95). | | `Ppmd` | `98` | PPMd version I, Rev 1 compression. | | `WinZipAes` | `99` | WinZip AES encryption (actual method stored in extra field). | diff --git a/Compression.Lib/MethodSpec.cs b/Compression.Lib/MethodSpec.cs index 65705df74..f3a6a1dd7 100644 --- a/Compression.Lib/MethodSpec.cs +++ b/Compression.Lib/MethodSpec.cs @@ -85,6 +85,7 @@ public static MethodSpec Parse(string? input) { "lzma" => (FileFormat.Zip.ZipCompressionMethod.Lzma, Compression.Core.Deflate.DeflateCompressionLevel.Default), "ppmd" => (FileFormat.Zip.ZipCompressionMethod.Ppmd, Compression.Core.Deflate.DeflateCompressionLevel.Default), "zstd" => (FileFormat.Zip.ZipCompressionMethod.Zstd, Compression.Core.Deflate.DeflateCompressionLevel.Default), + "xz" => (FileFormat.Zip.ZipCompressionMethod.Xz, Compression.Core.Deflate.DeflateCompressionLevel.Default), // deflate or default _ => (FileFormat.Zip.ZipCompressionMethod.Deflate, Optimize ? Compression.Core.Deflate.DeflateCompressionLevel.Maximum diff --git a/Compression.NativeUI/Views/CreateOptionsViewModel.cs b/Compression.NativeUI/Views/CreateOptionsViewModel.cs index e65e1fd9d..05231f4c4 100644 --- a/Compression.NativeUI/Views/CreateOptionsViewModel.cs +++ b/Compression.NativeUI/Views/CreateOptionsViewModel.cs @@ -335,6 +335,9 @@ public string HintText { "Zstd: Fast modern compression with good ratio. Requires extractors supporting ZIP method 93. " + "Not yet widely supported.\n" + "Opens with: 7-Zip 21+, PeaZip, NanaZip (very limited support elsewhere)", + (F.Zip, "xz") => + "XZ: LZMA2 in a complete .xz stream (ZIP method 95). Ratio close to LZMA.\n" + + "Opens with: 7-Zip, PeaZip, NanaZip, WinZip (not Windows Explorer)", (F.Zip, "shrink") => "Shrink: Legacy LZW method from PKZIP 1.0 (1989). Use only for vintage compatibility. " + "Very limited compression ratio by modern standards.\n" diff --git a/Compression.Tests/Compression.Tests.csproj b/Compression.Tests/Compression.Tests.csproj index acfd18620..b4fff4dd8 100644 --- a/Compression.Tests/Compression.Tests.csproj +++ b/Compression.Tests/Compression.Tests.csproj @@ -122,6 +122,10 @@ VdfsVectors.%(Filename)%(Extension) + + + ZipVectors.%(Filename)%(Extension) + DarVectors.%(Filename)%(Extension) diff --git a/Compression.Tests/Zip/ReferenceVectors/README.md b/Compression.Tests/Zip/ReferenceVectors/README.md new file mode 100644 index 000000000..f7af882f8 --- /dev/null +++ b/Compression.Tests/Zip/ReferenceVectors/README.md @@ -0,0 +1,7 @@ +# ZIP reference archives + +Every file here was written by a third-party archiver, never by CompressionWorkbench. + +| File | Writer | Command | What it pins | +| --- | --- | --- | --- | +| `xz-7zip2603.zip` | 7-Zip 26.03 (x64, Windows) | `7z a -tzip -mm=xz xz-7zip2603.zip text.txt hello.txt` | method 95 (XZ): `text.txt` is `The quick brown fox jumps over the lazy dog. ` × 50 (2250 bytes, CRC-32 `5FE03AFB`) as a complete .xz stream; `hello.txt` (`hello xz\n`) fell back to Store | diff --git a/Compression.Tests/Zip/ReferenceVectors/xz-7zip2603.zip b/Compression.Tests/Zip/ReferenceVectors/xz-7zip2603.zip new file mode 100644 index 0000000000000000000000000000000000000000..f141f793c2694ce25f542dbf784ccb09e4ca1f1d GIT binary patch literal 413 zcmWIWW@h1H00Ga0;MmYQy*f@H8-_Ddb8_zYBIYR2`Ut7>&#O$VM9g)x!dVIFnh~KvpmT;Z`7h3B+Ll05g(b AGXMYp literal 0 HcmV?d00001 diff --git a/Compression.Tests/Zip/ZipXzTests.cs b/Compression.Tests/Zip/ZipXzTests.cs new file mode 100644 index 000000000..8b7308118 --- /dev/null +++ b/Compression.Tests/Zip/ZipXzTests.cs @@ -0,0 +1,148 @@ +using System.Reflection; +using FileFormat.Zip; + +namespace Compression.Tests.Zip; + +/// +/// ZIP method 95 (XZ, APPNOTE 4.4.5): our writer and reader, the 7-Zip 26.03 reference archive +/// (Zip/ReferenceVectors), and 7-Zip as a live oracle in both directions. +/// +[TestFixture] +public class ZipXzTests { + + private static readonly byte[] FoxText = + System.Text.Encoding.ASCII.GetBytes(string.Concat(Enumerable.Repeat("The quick brown fox jumps over the lazy dog. ", 50))); + + private string _tmpDir = null!; + + [SetUp] + public void Setup() { + this._tmpDir = Path.Combine(Path.GetTempPath(), $"cwb_zipxz_{Guid.NewGuid():N}"); + Directory.CreateDirectory(this._tmpDir); + } + + [TearDown] + public void Teardown() { + try { Directory.Delete(this._tmpDir, true); } catch { /* best effort */ } + } + + [Test, Category("HappyPath"), Category("RoundTrip")] + public void GivenCompressibleData_WhenWrittenAsXz_ThenReadsBackIdenticalWithMethod95() { + var archive = CreateArchive(("fox.txt", FoxText)); + + using var reader = new ZipReader(new MemoryStream(archive)); + var entry = reader.Entries.Single(); + Assert.That((ushort)entry.CompressionMethod, Is.EqualTo(95)); + Assert.That(entry.CompressedSize, Is.LessThan(FoxText.Length)); + Assert.That(reader.ExtractEntry(entry), Is.EqualTo(FoxText)); + } + + [Test, Category("HappyPath"), Category("RoundTrip")] + public void GivenSeveralEntries_WhenWrittenAsXz_ThenEachEntryCarriesItsOwnXzStream() { + var a = FoxText; + var b = Enumerable.Range(0, 70_000).Select(i => (byte)(i * 7 % 13)).ToArray(); + var archive = CreateArchive(("a.txt", a), ("b.bin", b)); + + using var reader = new ZipReader(new MemoryStream(archive)); + Assert.That(reader.ExtractEntry(reader.Entries[0]), Is.EqualTo(a)); + Assert.That(reader.ExtractEntry(reader.Entries[1]), Is.EqualTo(b)); + } + + [Test, Category("Boundary")] + public void GivenEmptyFile_WhenWrittenAsXz_ThenStoredBecauseXzWouldBeLarger() { + var archive = CreateArchive(("empty.txt", [])); + + using var reader = new ZipReader(new MemoryStream(archive)); + Assert.That(reader.Entries[0].CompressionMethod, Is.EqualTo(ZipCompressionMethod.Store)); + Assert.That(reader.ExtractEntry(reader.Entries[0]), Is.Empty); + } + + [Test, Category("Boundary")] + public void GivenSingleByte_WhenWrittenAsXz_ThenFallsBackToStore() { + var archive = CreateArchive(("one.bin", [0x42])); + + using var reader = new ZipReader(new MemoryStream(archive)); + Assert.That(reader.Entries[0].CompressionMethod, Is.EqualTo(ZipCompressionMethod.Store)); + Assert.That(reader.ExtractEntry(reader.Entries[0]), Is.EqualTo(new byte[] { 0x42 })); + } + + [Test, Category("Exception")] + public void GivenCorruptXzPayload_WhenExtracted_ThenThrowsInsteadOfReturningWrongBytes() { + var archive = CreateArchive(("fox.txt", FoxText)); + using (var probe = new ZipReader(new MemoryStream(archive))) { + // Damage a byte inside the compressed payload (past the 30-byte local header + name). + var dataStart = (int)probe.Entries[0].LocalHeaderOffset + 30 + "fox.txt".Length; + archive[dataStart + 20] ^= 0xFF; + } + + using var reader = new ZipReader(new MemoryStream(archive)); + Assert.That(() => reader.ExtractEntry(reader.Entries[0]), Throws.InstanceOf()); + } + + [Test, Category("ThemVsUs")] + public void GivenSevenZipReferenceArchive_WhenRead_ThenXzEntryDecodesToTheSourceText() { + using var reader = new ZipReader(new MemoryStream(LoadVector("xz-7zip2603.zip"))); + var text = reader.Entries.Single(e => e.FileName == "text.txt"); + var hello = reader.Entries.Single(e => e.FileName == "hello.txt"); + + Assert.That(text.CompressionMethod, Is.EqualTo(ZipCompressionMethod.Xz)); + Assert.That(text.Crc32, Is.EqualTo(0x5FE03AFBu)); + Assert.That(reader.ExtractEntry(text), Is.EqualTo(FoxText)); + Assert.That(reader.ExtractEntry(hello), Is.EqualTo("hello xz\n"u8.ToArray())); + } + + [Test, Category("ExternalInterop")] + public void GivenOurXzArchive_WhenSevenZipTestsAndExtractsIt_ThenEveryByteMatches() { + FsInteropToolbox.Require7z(); + var b = Enumerable.Range(0, 70_000).Select(i => (byte)(i * 7 % 13)).ToArray(); + var path = Path.Combine(this._tmpDir, "ours.zip"); + File.WriteAllBytes(path, CreateArchive(("fox.txt", FoxText), ("b.bin", b))); + + var t = FsInteropToolbox.Run7z($"t \"{path}\""); + Assert.That(t.ExitCode, Is.EqualTo(0), $"7z t rejected the archive:\n{t.StdOut}\n{t.StdErr}"); + var l = FsInteropToolbox.Run7z($"l -slt \"{path}\""); + Assert.That(l.StdOut, Does.Contain("Method = xz")); + + var outDir = Path.Combine(this._tmpDir, "out"); + var x = FsInteropToolbox.Run7z($"x -y \"-o{outDir}\" \"{path}\""); + Assert.That(x.ExitCode, Is.EqualTo(0), x.StdOut + x.StdErr); + Assert.That(File.ReadAllBytes(Path.Combine(outDir, "fox.txt")), Is.EqualTo(FoxText)); + Assert.That(File.ReadAllBytes(Path.Combine(outDir, "b.bin")), Is.EqualTo(b)); + } + + [Test, Category("ExternalInterop")] + public void GivenSevenZipWritesXzZip_WhenWeReadIt_ThenEveryByteMatches() { + FsInteropToolbox.Require7z(); + var src = Path.Combine(this._tmpDir, "src"); + Directory.CreateDirectory(src); + var b = Enumerable.Range(0, 200_000).Select(i => (byte)(i * 31 % 251)).ToArray(); + File.WriteAllBytes(Path.Combine(src, "fox.txt"), FoxText); + File.WriteAllBytes(Path.Combine(src, "b.bin"), b); + var path = Path.Combine(this._tmpDir, "theirs.zip"); + + var a = FsInteropToolbox.Run7z($"a -tzip -mm=xz \"{path}\" \"{Path.Combine(src, "fox.txt")}\" \"{Path.Combine(src, "b.bin")}\""); + if (a.ExitCode != 0) + Assert.Ignore($"this 7-Zip cannot write ZIP method 95:\n{a.StdOut}\n{a.StdErr}"); + + using var reader = new ZipReader(File.OpenRead(path)); + Assert.That(reader.Entries.Select(e => e.CompressionMethod), Has.All.EqualTo(ZipCompressionMethod.Xz)); + Assert.That(reader.ExtractEntry(reader.Entries.Single(e => e.FileName == "fox.txt")), Is.EqualTo(FoxText)); + Assert.That(reader.ExtractEntry(reader.Entries.Single(e => e.FileName == "b.bin")), Is.EqualTo(b)); + } + + private static byte[] CreateArchive(params (string Name, byte[] Data)[] files) { + using var ms = new MemoryStream(); + using (var writer = new ZipWriter(ms, leaveOpen: true)) + foreach (var (name, data) in files) + writer.AddEntry(name, data, ZipCompressionMethod.Xz); + return ms.ToArray(); + } + + private static byte[] LoadVector(string name) { + using var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream($"ZipVectors.{name}") + ?? throw new InvalidOperationException($"missing embedded vector {name}"); + using var ms = new MemoryStream(); + stream.CopyTo(ms); + return ms.ToArray(); + } +} diff --git a/Hawkynt.FileFormats.Archives/README.md b/Hawkynt.FileFormats.Archives/README.md index a4ff6ec17..bc43ea12b 100644 --- a/Hawkynt.FileFormats.Archives/README.md +++ b/Hawkynt.FileFormats.Archives/README.md @@ -149,7 +149,7 @@ Every State, Test, Maintenance, Compress/Decompress and Demux/Mux/Remux cell is | Wrapster | `Wrapster` | | WORM | ✅ | defrag · wipe | MP3-wrapper archive carrying one member; stays WORM by design | [Archive Team](http://fileformats.archiveteam.org/wiki/Wrapster) | | [XAR](https://en.wikipedia.org/wiki/Xar_(archiver)) | `Xar` | `.xar` | R/W | ✅ | defrag · wipe | | [GitHub](https://github.com/mackyle/xar) | | ZAP (Amiga) | `Zap` | `.zap` | WORM | ✅ | wipe | Whole-disk archiver: entries are track_NNN.raw | [Aminet](https://aminet.net/) | -| [ZIP](https://en.wikipedia.org/wiki/ZIP_(file_format)) | `Zip` | `.zip` `.zipx` | R/W | ✅ | compress · repack · shrink · wipe | Store, Deflate, Deflate64, Shrink, Reduce, Implode, BZip2, LZMA, PPMd, Zstd, AES | [pkware.cachefly.net](https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT) | +| [ZIP](https://en.wikipedia.org/wiki/ZIP_(file_format)) | `Zip` | `.zip` `.zipx` | R/W | ✅ | compress · repack · shrink · wipe | Store, Deflate, Deflate64, Shrink, Reduce, Implode, BZip2, LZMA, XZ, PPMd, Zstd, AES | [pkware.cachefly.net](https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT) | | [ZOO](https://en.wikipedia.org/wiki/Zoo_(file_format)) | `Zoo` | `.zoo` | R/W | ✅ | defrag · wipe | | [Archive Team](http://fileformats.archiveteam.org/wiki/ZOO) | | [ZPAQ](https://en.wikipedia.org/wiki/ZPAQ) | `Zpaq` | `.zpaq` | R/W | ✅ | defrag | Reader covers the stored/simple models; ZPAQL virtual-machine execution is not implemented | [mattmahoney.net](http://mattmahoney.net/dc/zpaq.html) | diff --git a/docs/catalogue/reference-formats.csv b/docs/catalogue/reference-formats.csv index fcd97191b..f18495d3a 100644 --- a/docs/catalogue/reference-formats.csv +++ b/docs/catalogue/reference-formats.csv @@ -1,5 +1,5 @@ name,aliases_extensions,kind,src_7zip,src_libarchive,src_xad,src_binwalk,src_uniextract,src_pronom,src_wikipedia,source_count,reference_url,ours,ours_read,ours_create,ours_modify,gap,native_writer,notes -ZIP,zip;zipx;z01;sfx-zip;apk;docx;ear;epub;exe;imz;jar;odt;pptx;war;wz;xlsx;xpi,archive,RW,RW,R,D,R,x-fmt/263,RW,7,https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT,Zip,Y,Y,Y,PARTIAL,,"methods xz (95), JPEG (96), WavPack (97) and PKWARE strong encryption unsupported (ZipReader.cs)" +ZIP,zip;zipx;z01;sfx-zip;apk;docx;ear;epub;exe;imz;jar;odt;pptx;war;wz;xlsx;xpi,archive,RW,RW,R,D,R,x-fmt/263,RW,7,https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT,Zip,Y,Y,Y,PARTIAL,,"methods JPEG (96), WavPack (97) and PKWARE strong encryption unsupported (ZipReader.cs)" Java Archive (JAR),jar,archive,,,,,,x-fmt/412,Y,2,https://docs.oracle.com/en/java/javase/21/docs/specs/jar/jar.html,Jar,Y,Y,Y,OK,, Web Application Archive (WAR),war,archive,,,,,,,Y,1,https://jakarta.ee/specifications/servlet/,War,Y,Y,Y,OK,, Enterprise Archive (EAR),ear,archive,,,,,,,Y,1,https://jakarta.ee/specifications/platform/,Ear,Y,Y,Y,OK,, From c01351bb0073ec54ac786fb01066941bf768522d Mon Sep 17 00:00:00 2001 From: Hawkynt Date: Mon, 26 Oct 2026 10:07:41 +0100 Subject: [PATCH 06/48] * regenerate references --- docs/catalogue/GAPS.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/catalogue/GAPS.md b/docs/catalogue/GAPS.md index 3ebbcae5f..9d102290e 100644 --- a/docs/catalogue/GAPS.md +++ b/docs/catalogue/GAPS.md @@ -16,17 +16,17 @@ exists. It warns when a capability letter has drifted from the live descriptor. | Catalogue rows | 983 | | … formats listed by at least one source | 525 | | … registry ids no source lists (OURS-ONLY) | 458 | -| Source-listed rows mapped to something here | 288 / 525 (54.9 %) | +| Source-listed rows mapped to something here | 284 / 525 (54.1 %) | | … of rows listed by ≥ 2 sources | 122 / 138 (88 %) | | … of rows listed by ≥ 3 sources | 66 / 67 (PEA is the one missing) | | … of rows listed by ≥ 4 sources | 31 / 31 | | Gap type | Rows | Meaning | | --- | ---: | --- | -| `MISSING` | 237 | a source lists it; no descriptor or building block covers it | +| `MISSING` | 241 | a source lists it; no descriptor or building block covers it | | `READ-ONLY-BUT-SOURCES-WRITE` | 23 | we only read it; a source or the format's own tool writes it | -| `PARTIAL` | 43 | covered, but the reader handles only part of the format (see the table below) | -| `OK` | 222 | covered with no known gap against what the sources list | +| `PARTIAL` | 41 | covered, but the reader handles only part of the format (see the table below) | +| `OK` | 220 | covered with no known gap against what the sources list | | `OURS-ONLY` | 458 | in our registry, listed by none of the seven sources | ### Per source @@ -36,13 +36,13 @@ read-only rows. | Source | Rows it lists | Mapped | % | OK | | --- | ---: | ---: | ---: | ---: | -| 7-Zip (formats + codecs) | 96 | 89 | 92.7 | 70 | +| 7-Zip (formats + codecs) | 96 | 89 | 92.7 | 71 | | libarchive (formats + filters) | 28 | 27 | 96.4 | 22 | -| XADMaster / The Unarchiver | 126 | 98 | 77.8 | 80 | -| binwalk v3 | 79 | 48 | 60.8 | 35 | -| Universal Extractor 2 | 124 | 71 | 57.3 | 47 | -| PRONOM | 87 | 63 | 72.4 | 41 | -| Wikipedia | 266 | 156 | 58.6 | 114 | +| XADMaster / The Unarchiver | 126 | 94 | 74.6 | 77 | +| binwalk v3 | 79 | 48 | 60.8 | 36 | +| Universal Extractor 2 | 124 | 71 | 57.3 | 48 | +| PRONOM | 87 | 63 | 72.4 | 42 | +| Wikipedia | 266 | 156 | 58.6 | 116 | The libarchive and 7-Zip lists are almost fully covered. The rows still open are libarchive's grzip, plus seven 7-Zip rows: LVM, Android `super.img` (LP), AVB, TE, the Swap2/Swap4 filter, PKWARE strong From 0edd488b51fbbe89c7b8af0085addbfea6e0e877 Mon Sep 17 00:00:00 2001 From: Hawkynt Date: Mon, 26 Oct 2026 10:17:28 +0100 Subject: [PATCH 07/48] # XAR: bzip2, lzma and xz members decoded and checked against the TOC # XAR: bzip2, lzma and xz members decoded and checked against the TOC Symptom: lzma and xz members came back still compressed, bzip2 members threw, and any other encoding style was returned raw. Root cause: Extract only knew zlib and "none"; every lzma/xz style was folded into one name and fell through to the raw-bytes default. Change: encoding styles map one-to-one (octet-stream, x-gzip, x-bzip2, x-lzma, x-xz). bzip2 and xz go through our own stream decoders; x-lzma is sniffed, because xar's own encoder writes .xz there while libarchive writes the legacy .lzma format. Unknown styles are refused by name. Every member is checked against its declared size and its SHA-1, MD5 or SHA-256 extracted-checksum. Evidence: none/gzip/bzip2/lzma/xz archives written by bsdtar 3.7.2 (libarchive 3.7.2), committed with provenance; every member passes its SHA-1, all five decode to identical bytes, inputs match the generator's SHA-256s. XarOracleTests re-runs bsdtar live. Sourcing: rung 3 (xar format documentation) for the encoding styles; codecs are our own. * regenerate package references --- Compression.Tests/Compression.Tests.csproj | 4 + .../Xar/ReferenceVectors/README.md | 21 +++ .../Xar/ReferenceVectors/bzip2.xar | Bin 0 -> 9134 bytes .../Xar/ReferenceVectors/gzip.xar | Bin 0 -> 7892 bytes .../Xar/ReferenceVectors/lzma.xar | Bin 0 -> 7381 bytes .../Xar/ReferenceVectors/none.xar | Bin 0 -> 27711 bytes Compression.Tests/Xar/ReferenceVectors/xz.xar | Bin 0 -> 7511 bytes .../Xar/XarEncodingVectorTests.cs | 124 ++++++++++++++++++ Compression.Tests/Xar/XarOracleTests.cs | 72 ++++++++++ .../FileFormats/FileFormat.Xar/XarEntry.cs | 5 +- .../FileFormats/FileFormat.Xar/XarReader.cs | 108 +++++++++++---- Hawkynt.FileFormats.Archives/REFERENCE.md | 4 +- docs/catalogue/GAPS.md | 1 - docs/catalogue/reference-formats.csv | 2 +- 14 files changed, 309 insertions(+), 32 deletions(-) create mode 100644 Compression.Tests/Xar/ReferenceVectors/README.md create mode 100644 Compression.Tests/Xar/ReferenceVectors/bzip2.xar create mode 100644 Compression.Tests/Xar/ReferenceVectors/gzip.xar create mode 100644 Compression.Tests/Xar/ReferenceVectors/lzma.xar create mode 100644 Compression.Tests/Xar/ReferenceVectors/none.xar create mode 100644 Compression.Tests/Xar/ReferenceVectors/xz.xar create mode 100644 Compression.Tests/Xar/XarEncodingVectorTests.cs create mode 100644 Compression.Tests/Xar/XarOracleTests.cs diff --git a/Compression.Tests/Compression.Tests.csproj b/Compression.Tests/Compression.Tests.csproj index b4fff4dd8..41d6588b8 100644 --- a/Compression.Tests/Compression.Tests.csproj +++ b/Compression.Tests/Compression.Tests.csproj @@ -134,6 +134,10 @@ ArjVectors.%(Filename)%(Extension) + + + XarVectors.%(Filename)%(Extension) + diff --git a/Compression.Tests/Xar/ReferenceVectors/README.md b/Compression.Tests/Xar/ReferenceVectors/README.md new file mode 100644 index 000000000..cad3653b2 --- /dev/null +++ b/Compression.Tests/Xar/ReferenceVectors/README.md @@ -0,0 +1,21 @@ +# XAR reference archives + +Written by libarchive's `bsdtar 3.7.2` (libarchive 3.7.2, zlib 1.3, liblzma 5.4.5, bz2lib 1.0.8; +Ubuntu 24.04 package `libarchive-tools`) on 2026-10-19 with + +``` +bsdtar --format xar --options xar:compression= -cf .xar TEXT.TXT RANDOM.BIN REPEAT.BIN ONE.TXT +``` + +The inputs are the ones `Arj/ReferenceVectors/generate.sh` makes (same SHA-256s, listed in +`Arj/ReferenceVectors/README.md`). + +| Archive | Encoding style in the TOC | SHA-256 | +|---------|---------------------------|---------| +| `none.xar` | `application/octet-stream` | `995a3e5c7f0acb4f02afb508527d47a7395cd8e36b087fdc504a57202333900c` | +| `gzip.xar` | `application/x-gzip` (a zlib stream) | `bec70f7f56a92d2dd3863f05ac3c843a201a5e09a1ae4c6259ac56416736244d` | +| `bzip2.xar` | `application/x-bzip2` | `1e1259563b7c82d5b74813d42ae6f86db2a277311037924c043881dfd88af841` | +| `lzma.xar` | `application/x-lzma` (libarchive writes the legacy `.lzma` format) | `d938ef9be3fc1bb70f24bc4401a8b63fe257a97cfee76b413e034188f3efac85` | +| `xz.xar` | `application/x-xz` | `667081a142509a9ca4810a4187cb511a5a8b83dfc0efae28ccf2b013592496a5` | + +Every member carries the SHA-1 `extracted-checksum` bsdtar recorded, which the reader checks. diff --git a/Compression.Tests/Xar/ReferenceVectors/bzip2.xar b/Compression.Tests/Xar/ReferenceVectors/bzip2.xar new file mode 100644 index 0000000000000000000000000000000000000000..72dbfc87f02628545c8291a323a4b7953b3cf951 GIT binary patch literal 9134 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%0DJm!goeEZ$>JFPQM`6=x>em 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 literal 0 HcmV?d00001 diff --git a/Compression.Tests/Xar/ReferenceVectors/gzip.xar b/Compression.Tests/Xar/ReferenceVectors/gzip.xar new file mode 100644 index 0000000000000000000000000000000000000000..d33d84a019f8d8816fc16bc70b8bef2cf1367ab6 GIT binary patch literal 7892 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 U?JwMS_wPBg@$XCdf1Q;71@g%$g#Z8m literal 0 HcmV?d00001 diff --git a/Compression.Tests/Xar/ReferenceVectors/none.xar b/Compression.Tests/Xar/ReferenceVectors/none.xar new file mode 100644 index 0000000000000000000000000000000000000000..312dd4fdcfb247a0eddbf7ccb8f667c8eccd5793 GIT binary patch literal 27711 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 literal 0 HcmV?d00001 diff --git a/Compression.Tests/Xar/ReferenceVectors/xz.xar b/Compression.Tests/Xar/ReferenceVectors/xz.xar new file mode 100644 index 0000000000000000000000000000000000000000..9885afddb9e5f11539211573d980673db02e3ce3 GIT binary patch literal 7511 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 G(*FUH5p6&K literal 0 HcmV?d00001 diff --git a/Compression.Tests/Xar/XarEncodingVectorTests.cs b/Compression.Tests/Xar/XarEncodingVectorTests.cs new file mode 100644 index 000000000..758aab9a2 --- /dev/null +++ b/Compression.Tests/Xar/XarEncodingVectorTests.cs @@ -0,0 +1,124 @@ +using System.Buffers.Binary; +using System.Reflection; +using System.Security.Cryptography; +using System.Text; +using FileFormat.Xar; + +namespace Compression.Tests.Xar; + +///

+/// XAR members in every encoding xar defines, from archives libarchive's bsdtar wrote (see +/// Xar/ReferenceVectors/README.md). The reader checks each member against the SHA-1 the TOC records, +/// and the five archives hold the same files, so all encodings must decode to identical bytes. +/// +[TestFixture] +public class XarEncodingVectorTests { + private static byte[] Vector(string name) { + using var s = Assembly.GetExecutingAssembly().GetManifestResourceStream("XarVectors." + name) + ?? throw new FileNotFoundException("Embedded XAR vector missing: " + name); + using var ms = new MemoryStream(); + s.CopyTo(ms); + return ms.ToArray(); + } + + private static Dictionary ExtractAll(byte[] archive, out List entries) { + var reader = new XarReader(new MemoryStream(archive)); + entries = reader.Entries.ToList(); + return reader.Entries.Where(e => !e.IsDirectory).ToDictionary(e => e.FileName, reader.Extract, StringComparer.Ordinal); + } + + [Test, Category("HappyPath")] + [TestCase("none.xar", "none")] + [TestCase("gzip.xar", "zlib")] + [TestCase("bzip2.xar", "bzip2")] + [TestCase("lzma.xar", "lzma")] + [TestCase("xz.xar", "xz")] + public void RealArchive_EveryEncodingDecodesAndPassesItsChecksum(string vector, string method) { + var files = ExtractAll(Vector(vector), out var entries); + Assert.That(files.Keys, Is.EquivalentTo(new[] { "TEXT.TXT", "RANDOM.BIN", "REPEAT.BIN", "ONE.TXT" })); + Assert.That(entries.Single(e => e.FileName == "TEXT.TXT").Method, Is.EqualTo(method)); + Assert.That(Encoding.ASCII.GetString(files["TEXT.TXT"]), Does.StartWith("line 00001: the quick brown fox")); + Assert.That(files["REPEAT.BIN"], Is.EqualTo(files["RANDOM.BIN"].Concat(files["RANDOM.BIN"]).ToArray())); + Assert.That(files["ONE.TXT"], Is.EqualTo("a"u8.ToArray())); + // SHA-256 of the inputs as the generator script printed them (see ReferenceVectors/README.md). + Assert.That(Convert.ToHexStringLower(System.Security.Cryptography.SHA256.HashData(files["TEXT.TXT"])), + Is.EqualTo("c0541069eb5a1c9d4a11c2abb3993a554ba4a272fa671ea926f035775548de8e")); + Assert.That(Convert.ToHexStringLower(System.Security.Cryptography.SHA256.HashData(files["RANDOM.BIN"])), + Is.EqualTo("44763bf1aa0863dd94c239c350c8fe4aa8dc640d51fe567e94f1b956b261a46f")); + } + + [Test, Category("HappyPath")] + public void AllEncodings_DecodeToTheSameFiles() { + var reference = ExtractAll(Vector("none.xar"), out _); + foreach (var vector in new[] { "gzip.xar", "bzip2.xar", "lzma.xar", "xz.xar" }) { + var other = ExtractAll(Vector(vector), out _); + foreach (var (name, bytes) in reference) + Assert.That(other[name], Is.EqualTo(bytes).AsCollection, $"{vector}: {name}"); + } + } + + // ── Hand-built archives for the refusal paths ───────────────────────────────── + + /// Builds a one-member XAR whose heap holds under the given encoding style. + private static byte[] BuildXar(byte[] heap, long size, string style, string? sha1Hex) { + var checksum = sha1Hex is null ? "" : $"{sha1Hex}"; + var toc = $""" + + m.binfile + {heap.Length}0{size} + {checksum} + """; + var tocBytes = Encoding.UTF8.GetBytes(toc); + using var z = new MemoryStream(); + using (var zs = new System.IO.Compression.ZLibStream(z, System.IO.Compression.CompressionLevel.Optimal, leaveOpen: true)) + zs.Write(tocBytes); + var tocZ = z.ToArray(); + + var header = new byte[28]; + "xar!"u8.CopyTo(header); + BinaryPrimitives.WriteUInt16BigEndian(header.AsSpan(4), 28); + BinaryPrimitives.WriteUInt16BigEndian(header.AsSpan(6), 1); + BinaryPrimitives.WriteUInt64BigEndian(header.AsSpan(8), (ulong)tocZ.Length); + BinaryPrimitives.WriteUInt64BigEndian(header.AsSpan(16), (ulong)tocBytes.Length); + BinaryPrimitives.WriteUInt32BigEndian(header.AsSpan(24), 0); + return [.. header, .. tocZ, .. heap]; + } + + [Test, Category("Exception")] + public void UnknownEncoding_IsRefusedNotReturnedRaw() { + var archive = BuildXar("payload"u8.ToArray(), 7, "application/x-unheard-of", null); + var reader = new XarReader(new MemoryStream(archive)); + Assert.That(reader.Entries[0].Method, Is.EqualTo("application/x-unheard-of")); + Assert.Throws(() => reader.Extract(reader.Entries[0])); + } + + [Test, Category("Exception")] + public void ChecksumMismatch_Throws() { + var data = "payload"u8.ToArray(); + var wrong = Convert.ToHexString(SHA1.HashData("other"u8)); + var reader = new XarReader(new MemoryStream(BuildXar(data, data.Length, "application/octet-stream", wrong))); + Assert.Throws(() => reader.Extract(reader.Entries[0])); + } + + [Test, Category("HappyPath")] + public void ChecksumMatch_LowerCaseHex_IsAccepted() { + var data = "payload"u8.ToArray(); + var right = Convert.ToHexString(SHA1.HashData(data)).ToLowerInvariant(); + var reader = new XarReader(new MemoryStream(BuildXar(data, data.Length, "application/octet-stream", right))); + Assert.That(reader.Extract(reader.Entries[0]), Is.EqualTo(data)); + } + + [Test, Category("Exception")] + public void SizeMismatch_Throws() { + var data = "payload"u8.ToArray(); + var reader = new XarReader(new MemoryStream(BuildXar(data, data.Length + 1, "application/octet-stream", null))); + Assert.Throws(() => reader.Extract(reader.Entries[0])); + } + + [Test, Category("Exception")] + public void XzStyleWithoutXzMagic_Throws() { + var data = "not an xz stream"u8.ToArray(); + var reader = new XarReader(new MemoryStream(BuildXar(data, 5, "application/x-xz", null))); + Assert.Throws(() => reader.Extract(reader.Entries[0])); + } +} diff --git a/Compression.Tests/Xar/XarOracleTests.cs b/Compression.Tests/Xar/XarOracleTests.cs new file mode 100644 index 000000000..59b4d7b25 --- /dev/null +++ b/Compression.Tests/Xar/XarOracleTests.cs @@ -0,0 +1,72 @@ +#pragma warning disable CS1591 +using FileFormat.Xar; + +namespace Compression.Tests.Xar; + +/// +/// libarchive's bsdtar writes a XAR archive with each encoding, and our reader must hand back the +/// original bytes. The committed reference vectors pin the same thing offline; this re-asks the +/// tool on every run so a different tool version is noticed. +/// +[TestFixture] +[Category("ExternalInterop")] +public class XarOracleTests { + private string _dir = null!; + + [SetUp] + public void SetUp() { + this._dir = Path.Combine(Path.GetTempPath(), "cwb_theirs_" + Guid.NewGuid().ToString("N")[..8]); + Directory.CreateDirectory(this._dir); + } + + [TearDown] + public void TearDown() { + try { Directory.Delete(this._dir, true); } catch { /* best effort */ } + } + + private static void RequireTool(string tool, string package) { + if (!FsInteropToolbox.WslAvailable) + Assert.Ignore("WSL not available."); + if (!FsInteropToolbox.WslHasTool(tool)) + Assert.Ignore($"{tool} is not installed. Run inside WSL / on Linux: `sudo apt install -y {package}`."); + } + + private Dictionary Inputs() { + var text = string.Concat(Enumerable.Range(1, 400).Select(i => $"line {i:D5}: the quick brown fox jumps over the lazy dog\n")); + var random = new byte[3000]; + new Random(23).NextBytes(random); + var files = new Dictionary(StringComparer.Ordinal) { + ["TEXT.TXT"] = System.Text.Encoding.ASCII.GetBytes(text), + ["RANDOM.BIN"] = random, + ["REPEAT.BIN"] = [.. random, .. random], + ["ONE.TXT"] = "a"u8.ToArray(), + }; + foreach (var (name, bytes) in files) + File.WriteAllBytes(Path.Combine(this._dir, name), bytes); + return files; + } + + private void Run(string command) { + var r = FsInteropToolbox.RunWsl($"cd {FsInteropToolbox.WinToWsl(this._dir)} && {command}"); + Assert.That(r.ExitCode, Is.EqualTo(0), $"{command}\n{r.StdOut}\n{r.StdErr}"); + } + + [TestCase("none", "none")] + [TestCase("gzip", "zlib")] + [TestCase("bzip2", "bzip2")] + [TestCase("lzma", "lzma")] + [TestCase("xz", "xz")] + public void XarEncoding_WrittenByBsdtar_ReadByUs(string compression, string method) { + RequireTool("bsdtar", "libarchive-tools"); + var inputs = this.Inputs(); + this.Run($"bsdtar --format xar --options xar:compression={compression} -cf out.xar {string.Join(' ', inputs.Keys)}"); + + using var fs = File.OpenRead(Path.Combine(this._dir, "out.xar")); + var reader = new XarReader(fs); + foreach (var entry in reader.Entries.Where(e => !e.IsDirectory)) { + if (entry.FileName == "TEXT.TXT") + Assert.That(entry.Method, Is.EqualTo(method)); + Assert.That(reader.Extract(entry), Is.EqualTo(inputs[entry.FileName]).AsCollection, entry.FileName); + } + } +} diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Xar/XarEntry.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Xar/XarEntry.cs index 5904a1802..3173b6ed3 100644 --- a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Xar/XarEntry.cs +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Xar/XarEntry.cs @@ -16,7 +16,7 @@ public sealed class XarEntry { /// Whether this entry is a directory. public bool IsDirectory { get; init; } - /// Compression method name (e.g., "zlib", "bzip2", "none"). + /// Compression method: "none", "zlib", "bzip2", "lzma", "xz", or the raw encoding style when unrecognised. public string Method { get; init; } = "none"; /// Last modification date. @@ -30,4 +30,7 @@ public sealed class XarEntry { /// Extracted checksum (from TOC). internal string? ExtractedChecksum { get; init; } + + /// Hash named by the extracted checksum's style attribute (e.g. "sha1", "md5"). + internal string? ExtractedChecksumStyle { get; init; } } diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Xar/XarReader.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Xar/XarReader.cs index 63344934e..39b6b0c3c 100644 --- a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Xar/XarReader.cs +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Xar/XarReader.cs @@ -1,6 +1,10 @@ using System.Buffers.Binary; +using Compression.Core.Checksums; using Compression.Core.Deflate; using Compression.Core.Streams; +using FileFormat.Bzip2; +using FileFormat.Lzma; +using FileFormat.Xz; using System.Xml.Linq; namespace FileFormat.Xar; @@ -86,26 +90,18 @@ private void ParseFiles(XElement parent, string pathPrefix) { var dataEl = fileEl.Element("data"); long origSize = 0, compSize = 0, heapOffset = 0; var method = "none"; - string? archivedChecksum = null, extractedChecksum = null; + string? archivedChecksum = null, extractedChecksum = null, extractedChecksumStyle = null; DateTime? lastModified = null; if (dataEl != null) { origSize = ParseLong(dataEl.Element("size")?.Value); compSize = ParseLong(dataEl.Element("length")?.Value); heapOffset = ParseLong(dataEl.Element("offset")?.Value); - method = dataEl.Element("encoding")?.Attribute("style")?.Value ?? "none"; - // Normalize method names - if (method.Contains("zlib") || method.Contains("x-gzip")) - method = "zlib"; - else if (method.Contains("bzip2")) - method = "bzip2"; - else if (method.Contains("lzma") || method.Contains("xz")) - method = "lzma"; - else if (method == "application/octet-stream" || method.Contains("none")) - method = "none"; + method = NormalizeMethod(dataEl.Element("encoding")?.Attribute("style")?.Value); archivedChecksum = dataEl.Element("archived-checksum")?.Value; extractedChecksum = dataEl.Element("extracted-checksum")?.Value; + extractedChecksumStyle = dataEl.Element("extracted-checksum")?.Attribute("style")?.Value; } var mtimeStr = fileEl.Element("mtime")?.Value; @@ -122,12 +118,31 @@ private void ParseFiles(XElement parent, string pathPrefix) { HeapOffset = heapOffset, ArchivedChecksum = archivedChecksum, ExtractedChecksum = extractedChecksum, + ExtractedChecksumStyle = extractedChecksumStyle, }); } } } - /// Extracts the data for a given entry. + /// Maps an encoding style (a MIME type) to the method name reports. + /// + /// xar names its encodings by MIME type: application/octet-stream (stored), + /// application/x-gzip (a zlib stream, despite the name), application/x-bzip2, + /// application/x-lzma and application/x-xz. An unrecognised style is kept verbatim so + /// extraction can refuse it by name rather than hand back encoded bytes. + /// + private static string NormalizeMethod(string? style) => style switch { + null or "" or "application/octet-stream" => "none", + "application/x-gzip" or "application/zlib" or "application/x-zlib" => "zlib", + "application/x-bzip2" => "bzip2", + "application/x-lzma" => "lzma", + "application/x-xz" => "xz", + _ => style, + }; + + /// Extracts the data for a given entry and checks it against the TOC's extracted checksum. + /// The entry's encoding is not one xar defines. + /// The decoded data is the wrong size or fails its checksum. public byte[] Extract(XarEntry entry) { if (entry.IsDirectory) return []; @@ -135,21 +150,67 @@ public byte[] Extract(XarEntry entry) { var compressedData = new byte[entry.CompressedSize]; _stream.ReadExactly(compressedData); - return entry.Method switch { + var data = entry.Method switch { + "none" => compressedData, "zlib" => DecompressZlib(compressedData, (int)entry.OriginalSize), - "bzip2" => DecompressBzip2(compressedData), - "none" or "" => compressedData, - _ => compressedData, // unknown method, return raw + "bzip2" => DecodeStream(compressedData, s => new Bzip2Stream(s, CompressionStreamMode.Decompress, leaveOpen: true)), + // xar's own lzma encoder (lzma_easy_encoder) writes .xz streams under "application/x-lzma"; + // libarchive writes the legacy .lzma ("alone") format there. Both readers sniff, so do we. + "lzma" or "xz" when IsXz(compressedData) => + DecodeStream(compressedData, s => new XzStream(s, CompressionStreamMode.Decompress, leaveOpen: true)), + "lzma" => DecodeLzmaAlone(compressedData), + "xz" => throw new InvalidDataException($"XAR entry '{entry.FileName}' is marked xz but lacks the xz stream magic."), + _ => throw new NotSupportedException($"XAR entry '{entry.FileName}' uses unsupported encoding '{entry.Method}'."), }; + + if (data.LongLength != entry.OriginalSize) + throw new InvalidDataException( + $"XAR entry '{entry.FileName}' decoded to {data.LongLength} bytes; the TOC says {entry.OriginalSize}."); + VerifyChecksum(entry, data); + return data; + } + + private static bool IsXz(ReadOnlySpan data) => + data.Length >= 6 && data[..6].SequenceEqual((ReadOnlySpan)[0xFD, 0x37, 0x7A, 0x58, 0x5A, 0x00]); + + private static byte[] DecodeStream(byte[] data, Func open) { + using var input = new MemoryStream(data, writable: false); + using var decoder = open(input); + using var output = new MemoryStream(); + decoder.CopyTo(output); + return output.ToArray(); + } + + private static byte[] DecodeLzmaAlone(byte[] data) { + using var input = new MemoryStream(data, writable: false); + using var output = new MemoryStream(); + LzmaStream.Decompress(input, output); + return output.ToArray(); + } + + /// Checks against the TOC's extracted-checksum when it names a known hash. + private static void VerifyChecksum(XarEntry entry, byte[] data) { + if (string.IsNullOrWhiteSpace(entry.ExtractedChecksum) || entry.ExtractedChecksumStyle is null) + return; + byte[]? actual = entry.ExtractedChecksumStyle.ToLowerInvariant() switch { + "sha1" => Sha1.Compute(data), + "md5" => Md5.Compute(data), + "sha256" => Sha256.Compute(data), + _ => null, + }; + if (actual is null) + return; + if (!string.Equals(Convert.ToHexString(actual), entry.ExtractedChecksum.Trim(), StringComparison.OrdinalIgnoreCase)) + throw new InvalidDataException( + $"XAR entry '{entry.FileName}' fails its {entry.ExtractedChecksumStyle} extracted-checksum."); } private static byte[] DecompressZlib(byte[] data, int expectedSize) { - // Zlib data: 2-byte header + deflate stream + 4-byte Adler32 - // The raw Deflate decoder takes it once the zlib header is skipped + // Zlib data: 2-byte header + deflate stream + 4-byte Adler32; the raw Deflate decoder takes it + // once the header is skipped, and stops by itself before the trailer. if (data.Length < 2) - return data; + throw new InvalidDataException("XAR zlib stream is shorter than its two-byte header."); - // Skip zlib header (2 bytes) and omit trailing Adler32 (4 bytes) using var ms = new MemoryStream(data, 2, data.Length - 2); using var ds = new RawDeflateStream(ms, CompressionStreamMode.Decompress); var result = new byte[expectedSize]; @@ -162,13 +223,6 @@ private static byte[] DecompressZlib(byte[] data, int expectedSize) { return result[..totalRead]; } - private static byte[] DecompressBzip2(byte[] data) { - // Bzip2 decompression requires FileFormat.Bzip2 which we don't reference. - // For XAR archives with bzip2 entries, return the raw compressed data. - // The higher-level Compression.Lib can re-decompress if needed. - throw new NotSupportedException("XAR entries compressed with bzip2 are not supported in standalone mode. Use Compression.Lib for full format support."); - } - private static long ParseLong(string? s) => long.TryParse(s, out var v) ? v : 0; } diff --git a/Hawkynt.FileFormats.Archives/REFERENCE.md b/Hawkynt.FileFormats.Archives/REFERENCE.md index a536b218e..379092af7 100644 --- a/Hawkynt.FileFormats.Archives/REFERENCE.md +++ b/Hawkynt.FileFormats.Archives/REFERENCE.md @@ -32127,7 +32127,7 @@ Represents a single file entry in a XAR archive. | `FileName` | `string FileName { get; init; }` | File name (path within archive). | | `IsDirectory` | `bool IsDirectory { get; init; }` | Whether this entry is a directory. | | `LastModified` | `DateTime? LastModified { get; init; }` | Last modification date. | -| `Method` | `string Method { get; init; }` | Compression method name (e.g., "zlib", "bzip2", "none"). | +| `Method` | `string Method { get; init; }` | Compression method: "none", "zlib", "bzip2", "lzma", "xz", or the raw encoding style when unrecognised. | | `OriginalSize` | `long OriginalSize { get; init; }` | Uncompressed size in bytes. | #### `XarFormatDescriptor` @@ -32178,7 +32178,7 @@ Reads XAR (eXtensible ARchive) archives. XAR is Apple's archive format used for | `XarReader` | `XarReader(Stream stream)` | Creates a new XAR reader for the given stream. | | `Entries` | `IReadOnlyList Entries { get; }` | All entries in the archive. | | `HeapStart` | `long HeapStart { get; }` | Byte offset where the data heap begins (after header + TOC). | -| `Extract` | `byte[] Extract(XarEntry entry)` | Extracts the data for a given entry. | +| `Extract` | `byte[] Extract(XarEntry entry)` | Extracts the data for a given entry and checks it against the TOC's extracted checksum. | #### `XarWriter` diff --git a/docs/catalogue/GAPS.md b/docs/catalogue/GAPS.md index 9d102290e..1f0c98853 100644 --- a/docs/catalogue/GAPS.md +++ b/docs/catalogue/GAPS.md @@ -163,7 +163,6 @@ running real-world samples. The file named at the end of each row is where the l | ISO 9660 (Joliet / Rock Ridge / El Torito) | `Iso` | 7 | Rock Ridge limited to NM names (no SL/PX/TF/CE, no zisofs); interleaved files throw (IsoReader.cs) | | ZIP | `Zip` | 7 | methods xz (95), JPEG (96), WavPack (97) and PKWARE strong encryption unsupported (ZipReader.cs) | | LHA / LZH | `Lzh` | 6 | lh2/lh3 are decoded with the lh5 decoder (approximation) (LhaReader.cs) | -| XAR (eXtensible ARchive) | `Xar` | 5 | bzip2 throws; lzma/xz members are returned raw (XarReader.cs) | | StuffIt (classic + 5) | `StuffIt` | 4 | store and RLE only; LZW/Huffman/LZAH/Arsenic/DES methods throw (StuffItReader.cs) | | StuffIt X | `StuffItX` | 4 | stored and deflate only; Brimstone/Cyanide/Darkhorse/Iron throw (StuffItXReader.cs) | | zoo | `Zoo` | 4 | LZH method (2) unsupported (ZooReader.cs) | diff --git a/docs/catalogue/reference-formats.csv b/docs/catalogue/reference-formats.csv index f18495d3a..f6b9d2f79 100644 --- a/docs/catalogue/reference-formats.csv +++ b/docs/catalogue/reference-formats.csv @@ -24,7 +24,7 @@ Shell archive (shar),shar;run;sh,archive,,W,,,,fmt/329,Y,3,https://www.gnu.org/s mtree manifest,mtree;spec,archive,,RW,,,,,,1,https://man.freebsd.org/mtree/5,Mtree,Y,Y,,OK,, WARC (Web ARChive),warc,archive,,RW,R,,R,fmt/1281;fmt/1355;fmt/289,,4,https://iipc.github.io/warc-specifications/,Warc,Y,Y,,OK,, Internet Archive ARC (crawl),arc,archive,,,,,,fmt/410;x-fmt/219,,1,https://archive.org/web/researcher/ArcFileFormat.php,,,,,MISSING,, -XAR (eXtensible ARchive),xar;pkg;xip;mpkg,archive,R,RW,R,,,fmt/600,Y,5,https://github.com/mackyle/xar/wiki/xarformat,Xar,Y,Y,Y,PARTIAL,,bzip2 throws; lzma/xz members are returned raw (XarReader.cs) +XAR (eXtensible ARchive),xar;pkg;xip;mpkg,archive,R,RW,R,,,fmt/600,Y,5,https://github.com/mackyle/xar/wiki/xarformat,Xar,Y,Y,Y,OK,,"every xar encoding (none, gzip/zlib, bzip2, lzma, xz) decoded and checked against the TOC checksum; verified on bsdtar-written archives" Xar Image Format (PRONOM fmt/922),xar,archive,,,,,,fmt/922,,1,,,,,,MISSING,,PRONOM lists this separately from eXtensible ARchive Microsoft Cabinet (CAB),cab;exe;mscf,archive,R,R,R,R,,x-fmt/414,RW,6,https://learn.microsoft.com/previous-versions/bb417343(v=msdn.10),Cab,Y,Y,Y,OK,, CAB self-extractor (IExpress / MSCF SFX),exe,installer,,,,,R,,,1,,,,,,MISSING,, From 393d095fb859da81afce257929c870a92ffaa6e7 Mon Sep 17 00:00:00 2001 From: Hawkynt Date: Mon, 26 Oct 2026 13:01:35 +0100 Subject: [PATCH 08/48] * regenerate references --- docs/catalogue/GAPS.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/catalogue/GAPS.md b/docs/catalogue/GAPS.md index 1f0c98853..424dda614 100644 --- a/docs/catalogue/GAPS.md +++ b/docs/catalogue/GAPS.md @@ -25,8 +25,8 @@ exists. It warns when a capability letter has drifted from the live descriptor. | --- | ---: | --- | | `MISSING` | 241 | a source lists it; no descriptor or building block covers it | | `READ-ONLY-BUT-SOURCES-WRITE` | 23 | we only read it; a source or the format's own tool writes it | -| `PARTIAL` | 41 | covered, but the reader handles only part of the format (see the table below) | -| `OK` | 220 | covered with no known gap against what the sources list | +| `PARTIAL` | 40 | covered, but the reader handles only part of the format (see the table below) | +| `OK` | 221 | covered with no known gap against what the sources list | | `OURS-ONLY` | 458 | in our registry, listed by none of the seven sources | ### Per source @@ -36,13 +36,13 @@ read-only rows. | Source | Rows it lists | Mapped | % | OK | | --- | ---: | ---: | ---: | ---: | -| 7-Zip (formats + codecs) | 96 | 89 | 92.7 | 71 | -| libarchive (formats + filters) | 28 | 27 | 96.4 | 22 | -| XADMaster / The Unarchiver | 126 | 94 | 74.6 | 77 | +| 7-Zip (formats + codecs) | 96 | 89 | 92.7 | 72 | +| libarchive (formats + filters) | 28 | 27 | 96.4 | 23 | +| XADMaster / The Unarchiver | 126 | 94 | 74.6 | 78 | | binwalk v3 | 79 | 48 | 60.8 | 36 | | Universal Extractor 2 | 124 | 71 | 57.3 | 48 | -| PRONOM | 87 | 63 | 72.4 | 42 | -| Wikipedia | 266 | 156 | 58.6 | 116 | +| PRONOM | 87 | 63 | 72.4 | 43 | +| Wikipedia | 266 | 156 | 58.6 | 117 | The libarchive and 7-Zip lists are almost fully covered. The rows still open are libarchive's grzip, plus seven 7-Zip rows: LVM, Android `super.img` (LP), AVB, TE, the Swap2/Swap4 filter, PKWARE strong From 3bcfeb8c0d70d703328e1fe6498bf555bce17e16 Mon Sep 17 00:00:00 2001 From: Hawkynt Date: Mon, 26 Oct 2026 13:01:41 +0100 Subject: [PATCH 09/48] # LHA: -lh2- and -lh3- decoded with their own decoders, writing them refused # LHA: -lh2- and -lh3- decoded with their own decoders, writing them refused Symptom: -lh2- and -lh3- members were decoded with the -lh5- decoder, and the writer emitted -lh5- data labelled -lh2-/-lh3-, which no real LHA reads. Root cause: both are distinct LHarc 2.x methods. -lh2- is LZSS over an 8 KiB window with two adaptive Huffman trees (the position tree grows a leaf every 64 output bytes); -lh3- sends static trees per block, with a "ready made" position table when none is sent. Neither shares -lh5-'s bit stream. Change: Lh2Decoder and Lh3Decoder (with the LHarc fillbuf/getbits bit reader) decode them; LhaWriter refuses both methods and NativeUI no longer offers them. Evidence: lh2.lzh and lh3.lzh from lhasa's test suite (ISC), written by UNLHA32.DLL 2.67a, committed with provenance. Both decode to the CRC-16 UNLHA32 recorded, to 2,853 bytes of MIT licence text, and to identical bytes as each other. Sourcing: rung 1, converted from XADMaster's XADLZHOldHandles.m (LGPL-2.1-or-later; descended from LHa for UNIX via libxad), notice in THIRD-PARTY-NOTICE.XADMaster.txt. XADMaster sizes the -lh3- position alphabet as 1 << 10; the ready-made table only satisfies Kraft's equality with 128 symbols (8 KiB / 64), which is what the real files need. * regenerate package references --- Compression.Core/Dictionary/Lzh/Lh2Decoder.cs | 306 ++++++++++++++++++ Compression.Core/Dictionary/Lzh/Lh3Decoder.cs | 234 ++++++++++++++ .../Dictionary/Lzh/LhaLegacyBitReader.cs | 41 +++ .../Lzh/THIRD-PARTY-NOTICE.XADMaster.txt | 37 +++ Compression.Core/REFERENCE.md | 18 +- .../Views/CreateOptionsViewModel.cs | 7 - Compression.Tests/Compression.Tests.csproj | 4 + .../Lzh/LhaLegacyMethodVectorTests.cs | 89 +++++ Compression.Tests/Lzh/LhaTests.cs | 48 +-- .../Lzh/ReferenceVectors/README.md | 38 +++ .../Lzh/ReferenceVectors/lh2.lzh | Bin 0 -> 1377 bytes .../Lzh/ReferenceVectors/lh3.lzh | Bin 0 -> 1418 bytes .../FileFormat.Lzh/LhaCompatibility.cs | 5 +- .../FileFormats/FileFormat.Lzh/LhaReader.cs | 4 +- .../FileFormats/FileFormat.Lzh/LhaWriter.cs | 1 - Hawkynt.FileFormats.Archives/README.md | 2 +- docs/catalogue/GAPS.md | 2 +- docs/catalogue/reference-formats.csv | 2 +- 18 files changed, 782 insertions(+), 56 deletions(-) create mode 100644 Compression.Core/Dictionary/Lzh/Lh2Decoder.cs create mode 100644 Compression.Core/Dictionary/Lzh/Lh3Decoder.cs create mode 100644 Compression.Core/Dictionary/Lzh/LhaLegacyBitReader.cs create mode 100644 Compression.Core/Dictionary/Lzh/THIRD-PARTY-NOTICE.XADMaster.txt create mode 100644 Compression.Tests/Lzh/LhaLegacyMethodVectorTests.cs create mode 100644 Compression.Tests/Lzh/ReferenceVectors/README.md create mode 100644 Compression.Tests/Lzh/ReferenceVectors/lh2.lzh create mode 100644 Compression.Tests/Lzh/ReferenceVectors/lh3.lzh diff --git a/Compression.Core/Dictionary/Lzh/Lh2Decoder.cs b/Compression.Core/Dictionary/Lzh/Lh2Decoder.cs new file mode 100644 index 000000000..1c33f5ba7 --- /dev/null +++ b/Compression.Core/Dictionary/Lzh/Lh2Decoder.cs @@ -0,0 +1,306 @@ +namespace Compression.Core.Dictionary.Lzh; + +/// +/// Decodes LHA -lh2-: LZSS over an 8 KiB window with two adaptive Huffman trees. +/// +/// +/// A short-lived LHarc 2.x method. Unlike -lh1-, whose single tree is the classic +/// LZHUF one, -lh2- keeps two trees with "block" bookkeeping (a list of runs of equal +/// frequency) so a symbol's increment is one swap with its run leader: +/// +/// a character/length tree of 286 leaves: 0-255 literals, 256-284 match lengths 3-31, +/// and 285 followed by 8 raw bits for the longer lengths; +/// a position tree that starts with one leaf and gains a leaf for every 64 bytes of +/// output, until it covers the 8 KiB window (128 leaves). Its symbol is the high bits of the distance; +/// 6 raw bits follow. +/// +/// Both trees halve their frequencies when the root count reaches 0x8000. +/// Sourcing: converted from the -lh2- path of The Unarchiver's XADMaster +/// (XADLZHOldHandles.m, LGPL-2.1-or-later), itself descended from LHa for UNIX's +/// dhuf.c; checked against lh2.lzh from the lhasa test suite (ISC), written by +/// UNLHA32.DLL 2.67a, whose CRC-16 the output must match. See THIRD-PARTY-NOTICE.XADMaster.txt beside this file. +/// +public static class Lh2Decoder { + private const int DicBit = 13; + private const int DicSize = 1 << DicBit; + private const int Threshold = 3; + private const int NMax = 286; + private const int NChar = 256 + 60 - Threshold + 1; // 314: sizes the shared node arrays + private const int TreeSizeC = NChar * 2; // 628 + private const int TreeSizeP = 128 * 2; + private const int TreeSize = TreeSizeC + TreeSizeP; + private const int RootC = 0; + private const int RootP = TreeSizeC; + private const int N1 = NMax - 1; // the escape symbol (maxmatch 256 < 510) + + /// Decodes bytes of -lh2- data. + public static byte[] Decode(byte[] compressed, int originalSize) { + ArgumentNullException.ThrowIfNull(compressed); + ArgumentOutOfRangeException.ThrowIfNegative(originalSize); + var output = new byte[originalSize]; + if (originalSize == 0) + return output; + + var state = new State(new LhaLegacyBitReader(compressed)); + var text = new byte[DicSize]; + Array.Fill(text, (byte)' '); + var loc = 0; + var outPos = 0; + + while (outPos < originalSize) { + var c = state.DecodeC(); + if (c <= byte.MaxValue) { + output[outPos++] = text[loc] = (byte)c; + loc = (loc + 1) & (DicSize - 1); + ++state.Count; + continue; + } + + var length = c - (256 - Threshold); + var from = loc - state.DecodeP() - 1; + state.Count += (uint)length; + while (length-- > 0 && outPos < originalSize) { + output[outPos++] = text[loc] = text[from++ & (DicSize - 1)]; + loc = (loc + 1) & (DicSize - 1); + } + } + + return output; + } + + private sealed class State { + private readonly LhaLegacyBitReader _bits; + private readonly ushort[] _freq = new ushort[TreeSize]; + private readonly short[] _child = new short[TreeSize]; + private readonly short[] _stock = new short[TreeSize]; + private readonly short[] _sNode = new short[TreeSize / 2]; + private readonly short[] _block = new short[TreeSize]; + private readonly short[] _parent = new short[TreeSize]; + private readonly short[] _edge = new short[TreeSize]; + private int _avail; + private int _mostP; + private ushort _totalP; + private uint _nextCount; + + /// Bytes produced so far; the position tree grows with it. + public uint Count; + + public State(LhaLegacyBitReader bits) { + this._bits = bits; + this.StartC(); + this.StartP(); + } + + private void StartC() { + for (var i = 0; i < TreeSizeC; ++i) { + this._stock[i] = (short)i; + this._block[i] = 0; + } + + int j; + int k; + for (k = 0, j = NMax * 2 - 2; k < NMax; ++k, --j) { + this._freq[j] = 1; + this._child[j] = (short)~k; + this._sNode[k] = (short)j; + this._block[j] = 1; + } + + this._avail = 2; + this._edge[1] = NMax - 1; + var i2 = NMax * 2 - 2; + while (j >= 0) { + var f = this._freq[j] = (ushort)(this._freq[i2] + this._freq[i2 - 1]); + this._child[j] = (short)i2; + this._parent[i2] = this._parent[i2 - 1] = (short)j; + if (f == this._freq[j + 1]) + this._edge[this._block[j] = this._block[j + 1]] = (short)j; + else + this._edge[this._block[j] = this._stock[this._avail++]] = (short)j; + i2 -= 2; + --j; + } + } + + private void StartP() { + this._freq[RootP] = 1; + this._child[RootP] = ~NChar; + this._sNode[NChar] = RootP; + this._edge[this._block[RootP] = this._stock[this._avail++]] = RootP; + this._mostP = RootP; + this._totalP = 0; + this._nextCount = 64; + } + + /// Halves the leaf counts in [start, end) and rebuilds that tree and its runs. + private void Reconstruct(int start, int end) { + int i, j, k, l, b = 0; + uint f, g; + + for (i = j = start; i < end; ++i) { + if ((k = this._child[i]) < 0) { + this._freq[j] = (ushort)((this._freq[i] + 1) / 2); + this._child[j] = (short)k; + ++j; + } + if (this._edge[b = this._block[i]] == i) + this._stock[--this._avail] = (short)b; + } + + --j; + i = end - 1; + l = end - 2; + while (i >= start) { + while (i >= l) { + this._freq[i] = this._freq[j]; + this._child[i] = this._child[j]; + --i; + --j; + } + f = (uint)(this._freq[l] + this._freq[l + 1]); + for (k = start; f < this._freq[k]; ++k) { } + while (j >= k) { + this._freq[i] = this._freq[j]; + this._child[i] = this._child[j]; + --i; + --j; + } + this._freq[i] = (ushort)f; + this._child[i] = (short)(l + 1); + --i; + l -= 2; + } + + f = 0; + for (i = start; i < end; ++i) { + if ((j = this._child[i]) < 0) + this._sNode[~j] = (short)i; + else + this._parent[j] = this._parent[j - 1] = (short)i; + if ((g = this._freq[i]) == f) + this._block[i] = (short)b; + else { + this._edge[b = this._block[i] = this._stock[this._avail++]] = (short)i; + f = g; + } + } + } + + /// Increments node , first swapping it with its run leader; returns the parent. + private int SwapInc(int p) { + int b = this._block[p], q, r, s; + if ((q = this._edge[b]) != p) { + r = this._child[p]; + s = this._child[q]; + this._child[p] = (short)s; + this._child[q] = (short)r; + if (r >= 0) + this._parent[r] = this._parent[r - 1] = (short)q; + else + this._sNode[~r] = (short)q; + if (s >= 0) + this._parent[s] = this._parent[s - 1] = (short)p; + else + this._sNode[~s] = (short)p; + p = q; + ++this._edge[b]; + if (++this._freq[p] == this._freq[p - 1]) + this._block[p] = this._block[p - 1]; + else + this._edge[this._block[p] = this._stock[this._avail++]] = (short)p; + } else if (b == this._block[p + 1]) { + ++this._edge[b]; + if (++this._freq[p] == this._freq[p - 1]) + this._block[p] = this._block[p - 1]; + else + this._edge[this._block[p] = this._stock[this._avail++]] = (short)p; + } else if (++this._freq[p] == this._freq[p - 1]) { + this._stock[--this._avail] = (short)b; + this._block[p] = this._block[p - 1]; + } + return this._parent[p]; + } + + private void UpdateC(int p) { + if (this._freq[RootC] == 0x8000) + this.Reconstruct(0, NMax * 2 - 1); + ++this._freq[RootC]; + var q = (int)this._sNode[p]; + do + q = this.SwapInc(q); + while (q != RootC); + } + + private void UpdateP(int p) { + if (this._totalP == 0x8000) { + this.Reconstruct(RootP, this._mostP + 1); + this._totalP = this._freq[RootP]; + this._freq[RootP] = 0xffff; + } + var q = (int)this._sNode[p + NChar]; + while (q != RootP) + q = this.SwapInc(q); + ++this._totalP; + } + + /// Splits the last position leaf to add position symbol . + private void MakeNewNode(int p) { + var r = this._mostP + 1; + var q = r + 1; + this._sNode[~(this._child[r] = this._child[this._mostP])] = (short)r; + this._child[q] = (short)~(p + NChar); + this._child[this._mostP] = (short)q; + this._freq[r] = this._freq[this._mostP]; + this._freq[q] = 0; + this._block[r] = this._block[this._mostP]; + if (this._mostP == RootP) { + this._freq[RootP] = 0xffff; + ++this._edge[this._block[RootP]]; + } + this._parent[r] = this._parent[q] = (short)this._mostP; + this._edge[this._block[q] = this._stock[this._avail++]] = + this._sNode[p + NChar] = (short)(this._mostP = q); + this.UpdateP(p); + } + + /// Walks a tree from the child pointer to a leaf; returns the leaf (~symbol). + private int Walk(int c, bool atLeastOne) { + var buf = (short)this._bits.BitBuf; + var cnt = 0; + if (!atLeastOne && c <= 0) { + this._bits.FillBuf(0); + return c; + } + do { + c = this._child[c - (buf < 0 ? 1 : 0)]; + buf <<= 1; + if (++cnt == 16) { + this._bits.FillBuf(16); + buf = (short)this._bits.BitBuf; + cnt = 0; + } + } while (c > 0); + this._bits.FillBuf(cnt); + return c; + } + + public int DecodeC() { + var c = ~this.Walk(this._child[RootC], atLeastOne: true); + this.UpdateC(c); + if (c == N1) + c += this._bits.GetBits(8); + return c; + } + + public int DecodeP() { + while (this.Count > this._nextCount) { + this.MakeNewNode((int)(this._nextCount / 64)); + if ((this._nextCount += 64) >= DicSize) + this._nextCount = uint.MaxValue; + } + var c = ~this.Walk(this._child[RootP], atLeastOne: false) - NChar; + this.UpdateP(c); + return (c << 6) + this._bits.GetBits(6); + } + } +} diff --git a/Compression.Core/Dictionary/Lzh/Lh3Decoder.cs b/Compression.Core/Dictionary/Lzh/Lh3Decoder.cs new file mode 100644 index 000000000..8376760a0 --- /dev/null +++ b/Compression.Core/Dictionary/Lzh/Lh3Decoder.cs @@ -0,0 +1,234 @@ +namespace Compression.Core.Dictionary.Lzh; + +/// +/// Decodes LHA -lh3-: LZSS over an 8 KiB window with static Huffman trees sent per block. +/// +/// +/// The forerunner of -lh5-, with simpler tree transmission: +/// +/// Each block starts with a 16-bit symbol count, then the character/length tree: for +/// each of 286 symbols a presence bit and, if set, a 4-bit length minus one. Three leading length-1 +/// codes are the escape for a single-symbol tree, whose 9-bit value follows. +/// One bit selects the position tree: 1 sends 128 four-bit lengths (three leading +/// 1s again escape to a single 7-bit value); 0 uses the fixed "ready made" table whose run starts +/// are 2; 1, 1, 3, 6, 13, 31, 78. Its 128 symbols are the distance's high bits; 6 raw bits +/// follow. +/// Symbols 0-255 are literals, 256-284 match lengths 3-31, and 285 is followed by 8 +/// raw bits for the longer lengths. +/// +/// Sourcing: converted from the -lh3- path of The Unarchiver's XADMaster +/// (XADLZHOldHandles.m, LGPL-2.1-or-later), itself descended from LHa for UNIX's +/// shuf.c. XADMaster sizes the position alphabet as 1 << (16 - 6); the +/// ready-made table only satisfies Kraft's equality with 128 symbols (8 KiB / 64), which is also what +/// -lh3-'s window needs, so 128 is used here. Checked against lh3.lzh from the lhasa +/// test suite (ISC), written by UNLHA32.DLL 2.67a, whose CRC-16 the output must match. See +/// THIRD-PARTY-NOTICE.XADMaster.txt beside this file. +/// +public static class Lh3Decoder { + private const int DicBit = 13; + private const int DicSize = 1 << DicBit; + private const int Threshold = 3; + private const int N1 = 286; // character/length alphabet + private const int Np = DicSize / 64; // position alphabet: 128 + private const int ExtraBits = 8; + private const int LenField = 4; + private const int CBit = 9; + private const int MaxMatch = 256; + private const int Nc = byte.MaxValue + MaxMatch + 2 - Threshold; // 510: sizes the overflow tree + + private static readonly int[] ReadyMade = [2, 0x01, 0x01, 0x03, 0x06, 0x0D, 0x1F, 0x4E, 0]; + + /// Decodes bytes of -lh3- data. + /// A block's code lengths do not describe a complete tree. + public static byte[] Decode(byte[] compressed, int originalSize) { + ArgumentNullException.ThrowIfNull(compressed); + ArgumentOutOfRangeException.ThrowIfNegative(originalSize); + var output = new byte[originalSize]; + if (originalSize == 0) + return output; + + var state = new State(new LhaLegacyBitReader(compressed)); + var text = new byte[DicSize]; + Array.Fill(text, (byte)' '); + var loc = 0; + var outPos = 0; + + while (outPos < originalSize) { + var c = state.DecodeC(); + if (c <= byte.MaxValue) { + output[outPos++] = text[loc] = (byte)c; + loc = (loc + 1) & (DicSize - 1); + continue; + } + + var length = c - (256 - Threshold); + var from = loc - state.DecodeP() - 1; + while (length-- > 0 && outPos < originalSize) { + output[outPos++] = text[loc] = text[from++ & (DicSize - 1)]; + loc = (loc + 1) & (DicSize - 1); + } + } + + return output; + } + + private sealed class State(LhaLegacyBitReader bits) { + private readonly ushort[] _cTable = new ushort[4096]; + private readonly ushort[] _ptTable = new ushort[256]; + // One overflow tree shared by both tables, as in the reference: the position tree's nodes start at + // index 128 and the character tree's at 286, so neither reaches the other's. + private readonly ushort[] _left = new ushort[2 * Nc - 1]; + private readonly ushort[] _right = new ushort[2 * Nc - 1]; + private readonly byte[] _cLen = new byte[N1]; + private readonly byte[] _ptLen = new byte[Np]; + private int _blockSize; + + public int DecodeC() { + if (this._blockSize == 0) { + this._blockSize = bits.GetBits(16); + this.ReadTreeC(); + if (bits.GetBits(1) != 0) + this.ReadTreeP(); + else + this.ReadyMadeP(); + this.MakeTable(Np, this._ptLen, 8, this._ptTable); + } + --this._blockSize; + + int j = this._cTable[bits.BitBuf >> 4]; + if (j < N1) + bits.FillBuf(this._cLen[j]); + else { + bits.FillBuf(12); + var i = bits.BitBuf; + do { + j = (i & 0x8000) != 0 ? this._right[j] : this._left[j]; + i <<= 1; + } while (j >= N1); + bits.FillBuf(this._cLen[j] - 12); + } + + if (j == N1 - 1) + j += bits.GetBits(ExtraBits); + return j; + } + + public int DecodeP() { + int j = this._ptTable[bits.BitBuf >> 8]; + if (j < Np) + bits.FillBuf(this._ptLen[j]); + else { + bits.FillBuf(8); + var i = bits.BitBuf; + do { + j = (i & 0x8000) != 0 ? this._right[j] : this._left[j]; + i <<= 1; + } while (j >= Np); + bits.FillBuf(this._ptLen[j] - 8); + } + return (j << 6) + bits.GetBits(6); + } + + private void ReadTreeC() { + var i = 0; + while (i < N1) { + this._cLen[i] = bits.GetBits(1) != 0 ? (byte)(bits.GetBits(LenField) + 1) : (byte)0; + if (++i == 3 && this._cLen[0] == 1 && this._cLen[1] == 1 && this._cLen[2] == 1) { + var c = (ushort)bits.GetBits(CBit); + Array.Clear(this._cLen); + Array.Fill(this._cTable, c); + return; + } + } + this.MakeTable(N1, this._cLen, 12, this._cTable); + } + + private void ReadTreeP() { + var i = 0; + while (i < Np) { + this._ptLen[i] = (byte)bits.GetBits(LenField); + if (++i == 3 && this._ptLen[0] == 1 && this._ptLen[1] == 1 && this._ptLen[2] == 1) { + var c = (ushort)bits.GetBits(DicBit - 6); + Array.Clear(this._ptLen); + Array.Fill(this._ptTable, c); + return; + } + } + } + + private void ReadyMadeP() { + var t = 0; + var j = ReadyMade[t++]; + for (var i = 0; i < Np; ++i) { + while (ReadyMade[t] == i) { + ++j; + ++t; + } + this._ptLen[i] = (byte)j; + } + } + + /// + /// Builds a -bit lookup table for canonical codes of the given lengths, + /// hanging longer codes off it in the shared overflow tree. + /// + private void MakeTable(int nChar, byte[] bitLen, int tableBits, ushort[] table) { + Span count = stackalloc ushort[17]; + Span weight = stackalloc ushort[17]; + Span start = stackalloc ushort[18]; + + for (var i = 1; i <= 16; ++i) + weight[i] = (ushort)(1 << (16 - i)); + for (var i = 0; i < nChar; ++i) + ++count[bitLen[i]]; + + ushort total = 0; + for (var i = 1; i <= 16; ++i) { + start[i] = total; + total = (ushort)(total + weight[i] * count[i]); + } + if (total != 0) + throw new InvalidDataException("LHA -lh3- block has code lengths that do not form a complete tree."); + + var m = 16 - tableBits; + for (var i = 1; i <= tableBits; ++i) { + start[i] >>= m; + weight[i] >>= m; + } + + var first = start[tableBits + 1] >> m; + if (first != 0) + for (var i = first; i < 1 << tableBits; ++i) + table[i] = 0; + + var avail = nChar; + for (var j = 0; j < nChar; ++j) { + int k = bitLen[j]; + if (k == 0) + continue; + var l = (ushort)(start[k] + weight[k]); + if (k <= tableBits) { + for (int i = start[k]; i < l; ++i) + table[i] = (ushort)j; + } else { + uint code = start[k]; + ref var p = ref table[code >> m]; + code <<= tableBits; + for (var n = k - tableBits; --n >= 0;) { + if (p == 0) { + this._right[avail] = this._left[avail] = 0; + p = (ushort)avail++; + } + if ((code & 0x8000) != 0) + p = ref this._right[p]; + else + p = ref this._left[p]; + code <<= 1; + } + p = (ushort)j; + } + start[k] = l; + } + } + } +} diff --git a/Compression.Core/Dictionary/Lzh/LhaLegacyBitReader.cs b/Compression.Core/Dictionary/Lzh/LhaLegacyBitReader.cs new file mode 100644 index 000000000..29da80a0d --- /dev/null +++ b/Compression.Core/Dictionary/Lzh/LhaLegacyBitReader.cs @@ -0,0 +1,41 @@ +namespace Compression.Core.Dictionary.Lzh; + +/// +/// The 16-bit look-ahead bit buffer of the LHarc/LHa decoders (fillbuf/getbits): +/// MSB-first, with the next 16 bits always visible in . Reads past the end yield +/// zero bits, as the reference decoders do. +/// +internal sealed class LhaLegacyBitReader { + private readonly byte[] _data; + private int _pos; + private byte _subBitBuf; + private int _bitCount; + + /// The next 16 bits of the stream, most significant first. + public ushort BitBuf { get; private set; } + + public LhaLegacyBitReader(byte[] data) { + this._data = data; + this.FillBuf(16); + } + + /// Drops bits (0-16) from and shifts new ones in. + public void FillBuf(int n) { + while (n > this._bitCount) { + n -= this._bitCount; + this.BitBuf = (ushort)((this.BitBuf << this._bitCount) + (this._subBitBuf >> (8 - this._bitCount))); + this._subBitBuf = this._pos < this._data.Length ? this._data[this._pos++] : (byte)0; + this._bitCount = 8; + } + this._bitCount -= n; + this.BitBuf = (ushort)((this.BitBuf << n) + (this._subBitBuf >> (8 - n))); + this._subBitBuf = (byte)(this._subBitBuf << n); + } + + /// Reads bits (0-16) as an unsigned value. + public int GetBits(int n) { + var x = this.BitBuf >> (16 - n); + this.FillBuf(n); + return x; + } +} diff --git a/Compression.Core/Dictionary/Lzh/THIRD-PARTY-NOTICE.XADMaster.txt b/Compression.Core/Dictionary/Lzh/THIRD-PARTY-NOTICE.XADMaster.txt new file mode 100644 index 000000000..0c9607a18 --- /dev/null +++ b/Compression.Core/Dictionary/Lzh/THIRD-PARTY-NOTICE.XADMaster.txt @@ -0,0 +1,37 @@ +XADMaster (LHA -lh2- / -lh3-) - converted to C# + +Source: https://github.com/MacPaw/XADMaster (The Unarchiver's unarchiving engine) +Revision: 7cb9ee0abbb163f261e4cb74501e15067032319c (master, 2026-09-21) +Authors: Dag Ågren (original author); MacPaw Way Ltd. (2017-present); + parts descend from libxad (Dirk Stöcker and contributors) +Licence: GNU Lesser General Public License, version 2.1 or (at your option) + any later version. This repository is LGPL-3.0-or-later, which the + "or any later version" grant permits; the full LGPL text is in the + repository's LICENSE file. + +Upstream notice, as carried in each XADMaster source file: + + Copyright (c) 2017-present, MacPaw Way Ltd. All rights reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +Files converted: + + XADLZHOldHandles.m (LZHUFF2/LZHUFF3 paths) -> Lh2Decoder.cs, Lh3Decoder.cs, + LhaLegacyBitReader.cs + +The decoders are conversions: the adaptive two-tree bookkeeping of -lh2- and +the per-block static trees with the "ready made" position table of -lh3- are +carried across, with the tables copied exactly. One deliberate difference: +XADMaster sizes the -lh3- position alphabet as 1 << (16 - 6); the ready-made +table only satisfies Kraft's equality with 128 symbols (8 KiB / 64), so 128 is +used. Checked against lh2.lzh and lh3.lzh from the lhasa test suite (written +by UNLHA32.DLL 2.67a), whose CRC-16s the output matches. diff --git a/Compression.Core/REFERENCE.md b/Compression.Core/REFERENCE.md index cbf4a3221..ecc3be136 100644 --- a/Compression.Core/REFERENCE.md +++ b/Compression.Core/REFERENCE.md @@ -1484,7 +1484,7 @@ Implements `IBuildingBlock`. ### Namespace `Compression.Core.Dictionary.Lzh` -[`Lh1Decoder`](#lh1decoder) · [`Lh1Encoder`](#lh1encoder) · [`Lz5Decoder`](#lz5decoder) · [`Lz5Encoder`](#lz5encoder) · [`LzhBuildingBlock`](#lzhbuildingblock) · [`LzhConstants`](#lzhconstants) · [`LzhDecoder`](#lzhdecoder) · [`LzhEncoder`](#lzhencoder) · [`LzsDecoder`](#lzsdecoder) · [`LzsEncoder`](#lzsencoder) · [`PmaDecoder`](#pmadecoder) · [`PmaEncoder`](#pmaencoder) +[`Lh1Decoder`](#lh1decoder) · [`Lh1Encoder`](#lh1encoder) · [`Lh2Decoder`](#lh2decoder) · [`Lh3Decoder`](#lh3decoder) · [`Lz5Decoder`](#lz5decoder) · [`Lz5Encoder`](#lz5encoder) · [`LzhBuildingBlock`](#lzhbuildingblock) · [`LzhConstants`](#lzhconstants) · [`LzhDecoder`](#lzhdecoder) · [`LzhEncoder`](#lzhencoder) · [`LzsDecoder`](#lzsdecoder) · [`LzsEncoder`](#lzsencoder) · [`PmaDecoder`](#pmadecoder) · [`PmaEncoder`](#pmaencoder) #### `Lh1Decoder` @@ -1504,6 +1504,22 @@ Encodes data using the LHA -lh1- adaptive Huffman method. | `Lh1Encoder` | `Lh1Encoder()` | | | `Encode` | `static byte[] Encode(ReadOnlySpan data)` | Compresses data using the -lh1- algorithm. | +#### `Lh2Decoder` + +Decodes LHA `-lh2-`: LZSS over an 8 KiB window with two adaptive Huffman trees. + +| Member | Signature | Summary | +| --- | --- | --- | +| `Decode` | `static byte[] Decode(byte[] compressed, int originalSize)` | Decodes `originalSize` bytes of `-lh2-` data. | + +#### `Lh3Decoder` + +Decodes LHA `-lh3-`: LZSS over an 8 KiB window with static Huffman trees sent per block. + +| Member | Signature | Summary | +| --- | --- | --- | +| `Decode` | `static byte[] Decode(byte[] compressed, int originalSize)` | Decodes `originalSize` bytes of `-lh3-` data. | + #### `Lz5Decoder` Decodes -lz5- compressed data (LArc variant). Uses LZSS with a 4KB sliding window, no Huffman coding. diff --git a/Compression.NativeUI/Views/CreateOptionsViewModel.cs b/Compression.NativeUI/Views/CreateOptionsViewModel.cs index 05231f4c4..ee1d767e2 100644 --- a/Compression.NativeUI/Views/CreateOptionsViewModel.cs +++ b/Compression.NativeUI/Views/CreateOptionsViewModel.cs @@ -387,12 +387,6 @@ public string HintText { (F.Lzh, "lh1") => "lh1: Adaptive Huffman with 4 KB sliding window. The original LHA method from 1988.\n" + "Opens with: LHA/lha, 7-Zip (read), Unlha32.dll", - (F.Lzh, "lh2") => - "lh2: Adaptive Huffman variant. Rarely used — lh5 or lh7 are generally preferred.\n" - + "Opens with: LHA/lha (some builds), Unlha32.dll", - (F.Lzh, "lh3") => - "lh3: Adaptive Huffman with 8 KB window. Transitional method.\n" - + "Opens with: LHA/lha (some builds), Unlha32.dll", (F.Lzh, "lh4") => "lh4: Static Huffman with 4 KB window. Older format, good compatibility with vintage tools.\n" + "Opens with: 7-Zip, LHA/lha, PeaZip, Unlha32.dll", @@ -561,7 +555,6 @@ private void PopulateMethods() { F.Lzh => [ "lh5 (default, 8 KB)", "lh7 (64 KB)", "lh6 (32 KB)", "lh4 (4 KB)", "lh1 (adaptive Huffman 4 KB)", - "lh2 (adaptive Huffman)", "lh3 (adaptive Huffman 8 KB)", "lh0 (store)", "lzs (LZSS 2 KB)", "lz5 (LZSS 4 KB)", "pm0 (PMA store)", "pm1 (PMA PPMd order-2)", "pm2 (PMA PPMd order-3)", "pm2 (PPMd order-3)", "pm1 (PPMd order-2)", "pm0 (PMA store)"], diff --git a/Compression.Tests/Compression.Tests.csproj b/Compression.Tests/Compression.Tests.csproj index 41d6588b8..37d03e897 100644 --- a/Compression.Tests/Compression.Tests.csproj +++ b/Compression.Tests/Compression.Tests.csproj @@ -138,6 +138,10 @@ XarVectors.%(Filename)%(Extension) + + + LzhVectors.%(Filename)%(Extension) + diff --git a/Compression.Tests/Lzh/LhaLegacyMethodVectorTests.cs b/Compression.Tests/Lzh/LhaLegacyMethodVectorTests.cs new file mode 100644 index 000000000..fcec6694e --- /dev/null +++ b/Compression.Tests/Lzh/LhaLegacyMethodVectorTests.cs @@ -0,0 +1,89 @@ +using System.Reflection; +using System.Text; +using Compression.Core.Dictionary.Lzh; +using FileFormat.Lzh; + +namespace Compression.Tests.Lzh; + +/// +/// -lh2- and -lh3- against archives UNLHA32.DLL wrote (from lhasa's test suite; see +/// ReferenceVectors/README.md). Both archives hold the same file, so besides the CRC-16 UNLHA32 +/// recorded, the two independent decoders must agree with each other byte for byte. +/// +[TestFixture] +public class LhaLegacyMethodVectorTests { + private static byte[] Vector(string name) { + using var s = Assembly.GetExecutingAssembly().GetManifestResourceStream("LzhVectors." + name) + ?? throw new FileNotFoundException("Embedded LHA vector missing: " + name); + using var ms = new MemoryStream(); + s.CopyTo(ms); + return ms.ToArray(); + } + + private static (LhaEntry Entry, byte[] Data) ExtractOnly(string vector, string expectedMethod) { + using var reader = new LhaReader(new MemoryStream(Vector(vector))); + var entry = reader.Entries.Single(); + Assert.That(entry.Method, Is.EqualTo(expectedMethod)); + return (entry, reader.ExtractEntry(entry)); // ExtractEntry verifies the header's CRC-16 + } + + [Test, Category("HappyPath")] + [TestCase("lh2.lzh", LhaConstants.MethodLh2)] + [TestCase("lh3.lzh", LhaConstants.MethodLh3)] + public void RealArchive_DecodesToItsCrc(string vector, string method) { + var (entry, data) = ExtractOnly(vector, method); + Assert.That(entry.FileName, Is.EqualTo("LICENSE.MIT")); + Assert.That(data, Has.Length.EqualTo(2853)); + var text = Encoding.ASCII.GetString(data); + Assert.That(text, Does.Contain("Permission is hereby granted, free of charge")); + Assert.That(text, Does.Contain("THE SOFTWARE IS PROVIDED \"AS IS\"")); + } + + [Test, Category("HappyPath")] + public void Lh2AndLh3_OfTheSameFile_Agree() { + var (_, lh2) = ExtractOnly("lh2.lzh", LhaConstants.MethodLh2); + var (_, lh3) = ExtractOnly("lh3.lzh", LhaConstants.MethodLh3); + Assert.That(lh2, Is.EqualTo(lh3).AsCollection); + } + + [Test, Category("EdgeCase")] + public void EmptyOutput_ReadsNothing() { + Assert.That(Lh2Decoder.Decode([], 0), Is.Empty); + Assert.That(Lh3Decoder.Decode([], 0), Is.Empty); + } + + [Test, Category("Exception")] + public void NegativeSize_Throws() { + Assert.Throws(() => Lh2Decoder.Decode([], -1)); + Assert.Throws(() => Lh3Decoder.Decode([], -1)); + } + + [Test, Category("Exception")] + public void Lh3_IncompleteTree_Throws() { + // Block of 1 symbol; character tree: symbol 0 present with length 2 and every other symbol absent, + // which leaves half the code space unassigned. + var bits = new StringBuilder(); + bits.Append(Convert.ToString(1, 2).PadLeft(16, '0')); // block size + bits.Append("1" + "0001"); // symbol 0: present, length 1+1 = 2 + bits.Append(new string('0', 285)); // symbols 1..285 absent + var bytes = new byte[(bits.Length + 7) / 8 + 4]; + for (var i = 0; i < bits.Length; ++i) + if (bits[i] == '1') bytes[i >> 3] |= (byte)(0x80 >> (i & 7)); + Assert.Throws(() => Lh3Decoder.Decode(bytes, 1)); + } + + [Test, Category("Exception")] + public void TruncatedArchive_FailsTheCrcInsteadOfReturningGarbage() { + var archive = Vector("lh3.lzh"); + using var reader = new LhaReader(new MemoryStream(archive)); + var entry = reader.Entries.Single(); + // Zero the second half of the compressed body in place: the decoder reads zero bits there, and the + // result must be rejected by the CRC check rather than handed back. + var damaged = (byte[])archive.Clone(); + var bodyStart = (int)entry.DataOffset; + for (var i = bodyStart + (int)entry.CompressedSize / 2; i < bodyStart + entry.CompressedSize; ++i) + damaged[i] = 0; + using var damagedReader = new LhaReader(new MemoryStream(damaged)); + Assert.Catch(() => damagedReader.ExtractEntry(damagedReader.Entries.Single())); + } +} diff --git a/Compression.Tests/Lzh/LhaTests.cs b/Compression.Tests/Lzh/LhaTests.cs index b0557c531..71ca1d1c5 100644 --- a/Compression.Tests/Lzh/LhaTests.cs +++ b/Compression.Tests/Lzh/LhaTests.cs @@ -116,47 +116,13 @@ public void RoundTrip_SingleFile_Lh1() { Assert.That(extracted, Is.EqualTo(data)); } - [Category("HappyPath")] - [Category("RoundTrip")] - [Test] - public void RoundTrip_SingleFile_Lh2() { - var data = new byte[500]; - for (var i = 0; i < data.Length; ++i) - data[i] = (byte)(i % 13); - - var writer = new LhaWriter(LhaConstants.MethodLh2); - writer.AddFile("lh2.bin", data); - - var archive = writer.ToArray(); - - using var ms = new MemoryStream(archive); - var reader = new LhaReader(ms); - - Assert.That(reader.Entries, Has.Count.EqualTo(1)); - var extracted = reader.ExtractEntry(reader.Entries[0]); - Assert.That(extracted, Is.EqualTo(data)); - } - - [Category("HappyPath")] - [Category("RoundTrip")] - [Test] - public void RoundTrip_SingleFile_Lh3() { - var data = new byte[500]; - for (var i = 0; i < data.Length; ++i) - data[i] = (byte)(i % 7); - - var writer = new LhaWriter(LhaConstants.MethodLh3); - writer.AddFile("lh3.bin", data); - - var archive = writer.ToArray(); - - using var ms = new MemoryStream(archive); - var reader = new LhaReader(ms); - - Assert.That(reader.Entries, Has.Count.EqualTo(1)); - var extracted = reader.ExtractEntry(reader.Entries[0]); - Assert.That(extracted, Is.EqualTo(data)); - } + // -lh2- and -lh3- are read-only: the writer once emitted lh5 data under those IDs, which no real + // LHA reads. Reading them is pinned against real archives in LhaLegacyMethodVectorTests. + [Category("Exception")] + [TestCase(LhaConstants.MethodLh2)] + [TestCase(LhaConstants.MethodLh3)] + public void Writer_RefusesReadOnlyMethod(string method) => + Assert.Throws(() => _ = new LhaWriter(method)); [Category("HappyPath")] [Category("RoundTrip")] diff --git a/Compression.Tests/Lzh/ReferenceVectors/README.md b/Compression.Tests/Lzh/ReferenceVectors/README.md new file mode 100644 index 000000000..1e28019d2 --- /dev/null +++ b/Compression.Tests/Lzh/ReferenceVectors/README.md @@ -0,0 +1,38 @@ +# LHA reference archives + +Archives written by other LHA implementations, for the methods our writer cannot produce. + +| File | Method | Written by | Taken from | +|------|--------|------------|------------| +| `lh2.lzh` | `-lh2-`, level-2 header | UNLHA32.DLL 2.67a (`a archive.lzh filename`, switch `-jm5`) | lhasa `test/archives/unlha32/lh2.lzh` | +| `lh3.lzh` | `-lh3-`, level-2 header | UNLHA32.DLL 2.67a (switch `-jm6`) | lhasa `test/archives/unlha32/lh3.lzh` | + +Both come from the test suite of lhasa (, ISC licence, +Copyright (c) 2011-2025 Simon Howard), fetched from `master` on 2026-10-19: + +| File | SHA-256 | +|------|---------| +| `lh2.lzh` | `16e1cba85552ddc930442874dbfd42c0042547da482793e31ac2aaf819dc765e` | +| `lh3.lzh` | `095f5675a1224db59db9f3c3075b234c2b62ee8710e34968882fccae4659e63e` | + +Each holds one member, `LICENSE.MIT` (2,853 bytes, an MIT licence text). lhasa itself does not +decode either method, so the oracle is the member's CRC-16 recorded by UNLHA32 in the header: the +decoded bytes must match it, along with the size and the text's shape. + +ISC licence (lhasa): + +``` +Permission to use, copy, modify, and/or distribute this software +for any purpose with or without fee is hereby granted, provided +that the above copyright notice and this permission notice appear +in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL +WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE +AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR +CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, +NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +``` diff --git a/Compression.Tests/Lzh/ReferenceVectors/lh2.lzh b/Compression.Tests/Lzh/ReferenceVectors/lh2.lzh new file mode 100644 index 0000000000000000000000000000000000000000..a56bfea6a59fa791098305467e9ebaf55f21f0ec GIT binary patch literal 1377 zcmV-n1)lm)04;22GA$4V001Qm005iri(w!FSJ6!e07kY0000gE0Zd6lMNU&iE=@^P z8vsEiY9B>S*4F`*J1j*_*4F`*J1j*_*4F_B007XQ2mk;WEGhB`hVbtQ7L)Ip8|l^T z#53E@%?C3yJvQ1a;5gN#v!Qp}>Gj6AOIh9nxw%F74D4AtqOP6XjJsCFD7a%R`ts1H z3ZjInVWgUDa$zN_3B?}>l}zW##B`xlotg{dZQW@!&2e1h3>Qf@XQi>P+%_z0UWduHHlj~XvczlP&kw|#QSN7nfvI6J^Y{i4*%`(YUat_oP0iv^0WilIEmJZ zqWsX6gzmTU`_{j?XTO{IF@^nI8mQ}ZIH%VxD# zVZ1tGR%$8Y}MRe8b{^mUN;0TRZyhmr43y9Mqy>zPGs;K(R2dpSQ<%zC(FLNRybVpWP@MqyuR&PAoGjH zGm#73e*KYP`kKsn65@t?gFIEJH7~aelG4xSR7Aao<6@f7y8}p?KKSY^>e@>`LJp0x zWjX?7;OasVF{+;8XkPTu7yL{)1p5o;HW>9glvk{|QEX{nNKyV5KJ#E(5z$9>yQ7(h-=*Wb4P?R~8ifVLlP`dEA8 zma5Oc`4#tKSQOA*dxsk0))5`3><3=H!-vBG(SS{K7i-)+j{*7e|lv=B`>OeVB3wWc4mIc}p^u>vw0KeK6Y%d_BHs zZoYcUp;8s9i|0#RGjO&Ud#gKHH(ZsE)qB|(?SMyic*w)}0pp>(27COUYDgFQ2Zlu} z!A>S>4$*0XsjZ)S4NrRkU>o~kvM;Jl64ZuEl_^$7@j-*e= zOtS-aWXBIz;ie~EGKHO|2e2=au3_)#p6}D$cHE`@)*xgrS>h|79GG>n&vIX&p6~n0 zO>4W<1smUc^-YV7+N#9MGaS$Ux9n>FklS~U@(Zc*lB)_4I<7`5*C+EXVfbjTbnW3p jy7F$Z=3d%Ow;w%$VFlhTNT$XfE?$ zX|2g6)mafUnOie#%UsGW9ActQZ%=Q|@6Gr5JkJjeK*NGzP|IHcKo<-EWlLEXwRd@Q zk+J}sDFpzE0LT?#?}+knG)5w@8o*iIP%TH~$a_$cmC=7H0{}@Ly8%Gj4=?}#IT~09 zd2}yGn{9c?Yq-&bh`Gyu%DnPBe}i-LhoM9d%f@;a!yo-d@+#a1%^P3TNw14xsWn9&3XEki5Y3ct1XMR zEW#r*bG-u#i;Qpgvv+q&6b?~L#swBd^{roh5ETMFA7p%}xze5WFhMU?FaG1cDd}2` zl;m)$H_xBKLQ)$0niZ`Kabx9>(vZe`S9g`DQmAE};+;hX%@1FpeO@ExGyz7_F`rN3 zf>$zVC$x|p;ldPsDqI|%bg5Zwh^uB9xJ@hTbzn1@tz#b}hN1Kt4NA;RDoTdR6PmTK z|9;FHV|k`X6F@9Tea7$@l}6{a2LjD1aXC5onvT{Le>F$kD`rc;DxuBp`zhxTtJ)P3 zHopdH+AX4b$l+~|E6v5Wd)g4pP-kv=iy!zP#@)IaUf|AwUq2AL*4_OxA8QCNExe;g z6=h)|x$RG+Vy6yT+OblrR`)iXa6AT6huPs$PAVpvKE!Sb&PCOd2NDLH-HJ=5@1sLA zB`&DC8{MXMTgt`Rmh2>H2j-spN zFFRch;Ox8RDeJ!bfmizNLu?BZyM-h^UAWN^WGUK##+soINIpy&1B<1Ym2PB3w19Z z@t%RymC~0d3Z5GCZ|zwe3m!sjC>&X5rJb3vI*o~>SMv#dKH9Hye#L0^+vI&9bI zf%w+<6B2pz-?k!y82rIe?)_qStxRu@dR%W<>7>-KZ&~MfG%V2QVgD?1V#E6LwQ@$_ zQsIRq5BTByh#Za0unn;942yqd1CzMZ(ixmR-)`Xm*i3%G`8D$%4>2q4pN%JwVn(}d zbEPN>3&cVruwwj2T8uK0*F>vnRkeK`{k=ieb1g}7{GzBn11D*ED~XEX`P`Zo2!w{6 zXM)uj&1ALU8DDx8t((%TM8tEr*_xE1=mpvXUX=pIHi#@2Uczr2&N5mj-8!_+FTYQa6RAhCvE5=d?mK8 zPY$fsG?`jS(4~4pP)p?SUOmuZnK=DC^TL-E%G!){sKj9~8FlH~R+9GN zS^h-g_OGVS3hr&-dkW?agQ&W7RQ~6DCqKlDYlnOijFhHQaLQ=E#@jTBFiNDI>MncJ zKis~f4~D&7eSy(tgd~H`riPyB7vpn+QbkKHHe%qH^ng#oStB$JvMuAo@+!pSp z1~1<%5|oPESZ|1yoAn(%BZeZM590G;hm(dirPgzIoVAuKmoZFUvHZH}<8>It048>6 KBX!z9fPVpT52yzK literal 0 HcmV?d00001 diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Lzh/LhaCompatibility.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Lzh/LhaCompatibility.cs index 540bde0f6..b168fffb5 100644 --- a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Lzh/LhaCompatibility.cs +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Lzh/LhaCompatibility.cs @@ -66,11 +66,12 @@ public static void EnsureSupported(LhaArchiverGeneration generation, string meth throw new NotSupportedException($"LHA method '{method}' is not available in archiver generation {generation}."); } + // Methods the writer can encode. -lh2- and -lh3- are read-only: their encoders (adaptive two-tree + // Huffman and the per-block static trees with the ready-made position table) are not implemented, + // and writing lh5 data under their IDs, as this once did, produces archives no real LHA reads. internal static bool IsImplemented(string method) => method is LhaConstants.MethodLh0 or LhaConstants.MethodLh1 or - LhaConstants.MethodLh2 or - LhaConstants.MethodLh3 or LhaConstants.MethodLh4 or LhaConstants.MethodLh5 or LhaConstants.MethodLh6 or diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Lzh/LhaReader.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Lzh/LhaReader.cs index a4b76897c..d3c01a759 100644 --- a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Lzh/LhaReader.cs +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Lzh/LhaReader.cs @@ -46,8 +46,10 @@ public byte[] ExtractEntry(LhaEntry entry) { data = DecompressLh1(compressedData, (int)entry.OriginalSize); break; case LhaConstants.MethodLh2: + data = Lh2Decoder.Decode(compressedData, (int)entry.OriginalSize); + break; case LhaConstants.MethodLh3: - data = DecompressLzh(compressedData, (int)entry.OriginalSize, LzhConstants.Lh5PositionBits); + data = Lh3Decoder.Decode(compressedData, (int)entry.OriginalSize); break; case LhaConstants.MethodLh4: data = DecompressLzh(compressedData, (int)entry.OriginalSize, LzhConstants.Lh4PositionBits); diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Lzh/LhaWriter.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Lzh/LhaWriter.cs index 4e7972a8c..ceb120008 100644 --- a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Lzh/LhaWriter.cs +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Lzh/LhaWriter.cs @@ -41,7 +41,6 @@ public LhaWriter( LhaConstants.MethodLh1 => -3, LhaConstants.MethodPm1 => -5, LhaConstants.MethodPm2 => -6, - LhaConstants.MethodLh2 or LhaConstants.MethodLh3 => LzhConstants.Lh5PositionBits, LhaConstants.MethodLh4 => LzhConstants.Lh4PositionBits, LhaConstants.MethodLh5 => LzhConstants.Lh5PositionBits, LhaConstants.MethodLh6 => LzhConstants.Lh6PositionBits, diff --git a/Hawkynt.FileFormats.Archives/README.md b/Hawkynt.FileFormats.Archives/README.md index bc43ea12b..29ca6e9e2 100644 --- a/Hawkynt.FileFormats.Archives/README.md +++ b/Hawkynt.FileFormats.Archives/README.md @@ -128,7 +128,7 @@ Every State, Test, Maintenance, Compress/Decompress and Demux/Mux/Remux cell is | LhF (LhFloppy) | `LhF` | `.lhf` | R/W | ✅ | defrag · wipe | Whole-disk archiver: entries are track_NNN.raw | [Aminet](https://aminet.net) | | [lrzip](https://en.wikipedia.org/wiki/Rzip#lrzip) | `Lrzip` | `.lrz` | WORM | ✅ | defrag | LZMA-wrapped subtype only; other lrzip subtypes are rejected; single data member | [GitHub](https://github.com/ckolivas/lrzip) | | Lynx (Commodore) | `Lynx` | `.lnx` | R/W | ✅ | defrag · shrink · wipe | Stored entries only | [Archive Team](http://fileformats.archiveteam.org/wiki/Lynx_(Commodore_64)) | -| [LHA / LZH](https://en.wikipedia.org/wiki/LHA_(file_format)) | `Lzh` | `.lzh` `.lha` | R/W | ✅ | defrag · wipe | | [GitHub](https://github.com/jca02266/lha) | +| [LHA / LZH](https://en.wikipedia.org/wiki/LHA_(file_format)) | `Lzh` | `.lzh` `.lha` | R/W | ✅ | defrag · wipe | -lh2- and -lh3- are read-only | [GitHub](https://github.com/jca02266/lha) | | [LZX (Amiga)](https://en.wikipedia.org/wiki/LZX) | `LzxAmiga` | `.lzx` | R/W | ✅ | defrag · wipe | | [Aminet](https://aminet.net) | | [mtree](https://man.freebsd.org/cgi/man.cgi?query=mtree&sektion=5) | `Mtree` | `.mtree` | WORM | ✅ | — | Filesystem metadata manifest; does not embed file bodies, so CWB does not dereference `contents=` host paths | [FreeBSD mtree(5)](https://man.freebsd.org/cgi/man.cgi?query=mtree&sektion=5) | | [NuFX / ShrinkIt](https://en.wikipedia.org/wiki/ShrinkIt) | `NuFx` | `.shk` `.sdk` `.bxy` | R/W | ✅ | defrag · shrink · wipe | | [nulib.com](https://nulib.com/library/FTN.e08002.htm) | diff --git a/docs/catalogue/GAPS.md b/docs/catalogue/GAPS.md index 424dda614..828948241 100644 --- a/docs/catalogue/GAPS.md +++ b/docs/catalogue/GAPS.md @@ -162,7 +162,7 @@ running real-world samples. The file named at the end of each row is where the l | 7z | `SevenZip` | 7 | Deflate64, ARM64, RISC-V, Zstd/Brotli/LZ4 coders and external header references unsupported (SevenZipReader.cs) | | ISO 9660 (Joliet / Rock Ridge / El Torito) | `Iso` | 7 | Rock Ridge limited to NM names (no SL/PX/TF/CE, no zisofs); interleaved files throw (IsoReader.cs) | | ZIP | `Zip` | 7 | methods xz (95), JPEG (96), WavPack (97) and PKWARE strong encryption unsupported (ZipReader.cs) | -| LHA / LZH | `Lzh` | 6 | lh2/lh3 are decoded with the lh5 decoder (approximation) (LhaReader.cs) | +| LHA / LZH | `Lzh` | 6 | lh2/lh3 decoded but read-only; lh1, lzs, lz5, pm1, pm2, level-1 extended headers and level-3 headers fail on lhasa's test archives (refused by the CRC check), lhx and lk7 unsupported (LhaReader.cs) | | StuffIt (classic + 5) | `StuffIt` | 4 | store and RLE only; LZW/Huffman/LZAH/Arsenic/DES methods throw (StuffItReader.cs) | | StuffIt X | `StuffItX` | 4 | stored and deflate only; Brimstone/Cyanide/Darkhorse/Iron throw (StuffItXReader.cs) | | zoo | `Zoo` | 4 | LZH method (2) unsupported (ZooReader.cs) | diff --git a/docs/catalogue/reference-formats.csv b/docs/catalogue/reference-formats.csv index f6b9d2f79..d65e39d0f 100644 --- a/docs/catalogue/reference-formats.csv +++ b/docs/catalogue/reference-formats.csv @@ -34,7 +34,7 @@ Windows Update package (MSU),msu,installer,,,,,R,,,1,,,,,,MISSING,, Compiled HTML Help (CHM),chm;chi;chq;chw;hxs,document,R,,,,R,fmt/634,,3,https://www.nongnu.org/chmspec/latest/,Chm,Y,Y,Y,PARTIAL,,content sections above 1 unsupported (ChmReader.cs) Windows Imaging (WIM/SWM/ESD),wim;swm;esd;ppkg,disk-image,RW,,,,R,,Y,3,https://learn.microsoft.com/windows-hardware/manufacture/desktop/wim-vs-ffu-image-file-formats,Wim;Swm;Esd,Y,Y,,OK,, ARJ,arj,archive,R,,R,D,R,fmt/610,RW,6,https://en.wikipedia.org/wiki/ARJ,Arj,Y,Y,Y,OK,,methods 0-4 decoded; method 4 verified on archives the open-source ARJ port wrote -LHA / LZH,lzh;lha;lzs;exe;sfx,archive,R,R,R,,R,fmt/1558;fmt/626,RW,6,https://en.wikipedia.org/wiki/LHA_(file_format),Lzh,Y,Y,Y,PARTIAL,,lh2/lh3 are decoded with the lh5 decoder (approximation) (LhaReader.cs) +LHA / LZH,lzh;lha;lzs;exe;sfx,archive,R,R,R,,R,fmt/1558;fmt/626,RW,6,https://en.wikipedia.org/wiki/LHA_(file_format),Lzh,Y,Y,Y,PARTIAL,,"lh2/lh3 decoded but read-only; lh1, lzs, lz5, pm1, pm2, level-1 extended headers and level-3 headers fail on lhasa's test archives (refused by the CRC check), lhx and lk7 unsupported (LhaReader.cs)" ACE,ace,archive,,,R,,R,fmt/2075;fmt/2076,RW,4,https://en.wikipedia.org/wiki/ACE_(compressed_file_format),Ace,Y,Y,Y,OK,, ARC (SEA),arc;ark,archive,,,R,,R,,RW,3,https://en.wikipedia.org/wiki/ARC_(file_format),Arc,Y,Y,Y,OK,, PAK (NoGate ARC extension),pak,archive,,,R,,,,Y,2,,,,,,MISSING,, From 6493e5c70be6642dfb27d9e52e892bbe254adceb Mon Sep 17 00:00:00 2001 From: Hawkynt Date: Mon, 26 Oct 2026 13:02:19 +0100 Subject: [PATCH 10/48] * regenerate references --- Compression.Core/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Compression.Core/README.md b/Compression.Core/README.md index 12d7b1214..483e87991 100644 --- a/Compression.Core/README.md +++ b/Compression.Core/README.md @@ -205,7 +205,7 @@ Use the concrete version you intend to consume; this document does not predict a -Every public and protected member of all 726 types, generated from the built assembly and its XML documentation, is in [REFERENCE.md](https://github.com/Hawkynt/CompressionWorkbench/blob/main/Compression.Core/REFERENCE.md). +Every public and protected member of all 728 types, generated from the built assembly and its XML documentation, is in [REFERENCE.md](https://github.com/Hawkynt/CompressionWorkbench/blob/main/Compression.Core/REFERENCE.md). From e199a5f000b367778592ccd8ecab5cca13e9c1a1 Mon Sep 17 00:00:00 2001 From: Hawkynt Date: Mon, 26 Oct 2026 13:02:23 +0100 Subject: [PATCH 11/48] # LHA: header levels 1/3, lh1, lzs, lz5, pm1, pm2 and lhx read as their archivers wrote them # LHA: level-1 extended headers, level-3 headers and directory names read Symptom: on lhasa's test suite, members behind level-1 headers with extended headers came out a few bytes off (CRC mismatch or end of stream), level-3 archives were refused, directory names were dropped, and the modifier and layout map walked level-2 chains with the level-0 size byte. Root cause: a level-1 member's compressed size includes its extended headers, which the reader did not subtract; level 3 (32-bit sizes) was not implemented; extended header 0x02 (directory, 0xFF-separated) was ignored; each of the three walkers had its own partial parser. Change: one LhaHeaderParser for levels 0-3 (header checksum, the level-1 size correction, the OS-9/68k level-2 quirk, 0x01 file and 0x02 directory headers) used by the reader, the modifier and the layout map. A truncated last member is listed and fails on extraction instead of failing the whole archive. Evidence: archives from lhasa's test suite (LHA for Amiga 1.22, LHA OS/2 2.08, ...) committed with provenance; every member passes the CRC-16 its archiver recorded. Sourcing: rung 1, converted from lhasa's lha_file_header.c and ext_header.c (ISC), notice in THIRD-PARTY-NOTICE.lhasa.txt. # LHA: -lh1-, -lzs-, -lz5-, -pm1-, -pm2- decoded as their archivers wrote them Symptom: on lhasa's test suite every -lh1-, -lzs-, -lz5-, -pm1- and -pm2- member failed (CRC mismatch, end of stream, divide by zero); our writer's output for these methods was not readable by lhasa; -lhx- was refused. Root cause: the decoders implemented other schemes: -lh1- rebuilt a static tree every 4 KiB instead of LZHUF's adaptive tree; -lzs- was read byte-aligned with relative offsets instead of an MSB-first bit stream of absolute ring positions; -lz5- lacked LArc's predefined initial ring and start position; -pm1-/-pm2- were a PPMd model with no relation to PMarc. The encoders mirrored the same mistakes. Change: decoders converted from lhasa for -lh1- (shared adaptive tree), -lzs-, -lz5-, -pm1- and -pm2- (move-to-front history, PMarc's static and rebuilt trees); new -lh1-, -lzs- and -lz5- encoders built on the same tree and ring rules; writing -pm1-/-pm2- is refused (no encoder) and NativeUI stops offering them; -lhx- reads through the lh5 decoder with a 1 MiB window. Evidence: LHarc 1.13, LArc 3.33, PMarc 1.24/2 and UNLHA32 archives from lhasa's suite pass their CRC-16s, and five methods decode the same GPL-2 text identically. LhaOracleTests: every method x header level (0-2) our writer produces extracts byte-identically in lhasa (lha t / lha x). Remaining: LHARK's lk7 variant of -lh7-. Sourcing: rung 1, decoders converted from lhasa (ISC), tables copied exactly, notice in THIRD-PARTY-NOTICE.lhasa.txt; encoders are our own. * regenerate package references --- Compression.Core/Dictionary/Lzh/Lh1Decoder.cs | 253 +++--------------- Compression.Core/Dictionary/Lzh/Lh1Encoder.cs | 134 +++------- Compression.Core/Dictionary/Lzh/Lh1Tree.cs | 235 ++++++++++++++++ .../Dictionary/Lzh/LhaBitInput.cs | 39 +++ .../Dictionary/Lzh/LhaMatchFinder.cs | 66 +++++ Compression.Core/Dictionary/Lzh/Lz5Decoder.cs | 110 ++++---- Compression.Core/Dictionary/Lzh/Lz5Encoder.cs | 103 +++---- Compression.Core/Dictionary/Lzh/LzhDecoder.cs | 3 +- Compression.Core/Dictionary/Lzh/LzsDecoder.cs | 90 +++---- Compression.Core/Dictionary/Lzh/LzsEncoder.cs | 105 +++----- Compression.Core/Dictionary/Lzh/Pm1Decoder.cs | 171 ++++++++++++ Compression.Core/Dictionary/Lzh/Pm2Decoder.cs | 219 +++++++++++++++ Compression.Core/Dictionary/Lzh/PmaDecoder.cs | 32 --- Compression.Core/Dictionary/Lzh/PmaEncoder.cs | 31 --- Compression.Core/Dictionary/Lzh/PmaHistory.cs | 60 +++++ .../Lzh/THIRD-PARTY-NOTICE.lhasa.txt | 36 +++ Compression.Core/REFERENCE.md | 48 ++-- .../Views/CreateOptionsViewModel.cs | 9 +- Compression.Tests/Compression.Tests.csproj | 3 +- Compression.Tests/Lzh/LhaHeaderVectorTests.cs | 55 ++++ Compression.Tests/Lzh/LhaOracleTests.cs | 86 ++++++ Compression.Tests/Lzh/LhaSuiteVectorTests.cs | 61 +++++ Compression.Tests/Lzh/LhaTests.cs | 39 ++- Compression.Tests/Lzh/PmaTests.cs | 138 ---------- .../Lzh/ReferenceVectors/README.md | 25 +- .../Lzh/ReferenceVectors/generated_lzs.lzs | Bin 0 -> 12696 bytes .../Lzh/ReferenceVectors/larc333_initial.lzs | Bin 0 -> 675 bytes .../Lzh/ReferenceVectors/larc333_lz5.lzs | Bin 0 -> 8510 bytes .../ReferenceVectors/lha_amiga_122_level1.lzh | Bin 0 -> 76 bytes .../lha_amiga_122_lh0_dirs_bug.lzh | Bin 0 -> 308 bytes .../ReferenceVectors/lha_os2_208_h3_lh5.lzh | Bin 0 -> 7075 bytes .../lha_os2_208_h3_subdir.lzh | Bin 0 -> 271 bytes .../Lzh/ReferenceVectors/lharc113_lh1.lzh | Bin 0 -> 7548 bytes .../Lzh/ReferenceVectors/pmarc124_pm1.pma | Bin 0 -> 9984 bytes .../Lzh/ReferenceVectors/pmarc2_pm2.pma | Bin 0 -> 7168 bytes .../Lzh/ReferenceVectors/unlha32_h2_lhx.lzh | Bin 0 -> 6903 bytes .../FileFormat.Lzh/LhaCompatibility.cs | 10 +- .../FileFormat.Lzh/LhaHeaderParser.cs | 226 ++++++++++++++++ .../FileFormats/FileFormat.Lzh/LhaModifier.cs | 68 +---- .../FileFormats/FileFormat.Lzh/LhaReader.cs | 170 ++---------- .../FileFormats/FileFormat.Lzh/LhaWriter.cs | 8 +- .../FileFormat.Lzh/LzhConstants.cs | 3 + .../FileFormat.Lzh/LzhFormatDescriptor.cs | 2 +- .../FileFormat.Lzh/LzhLayoutMap.cs | 89 +----- .../THIRD-PARTY-NOTICE.lhasa.txt | 27 ++ Hawkynt.FileFormats.Archives/README.md | 2 +- Hawkynt.FileFormats.Archives/REFERENCE.md | 1 + docs/catalogue/GAPS.md | 2 +- docs/catalogue/reference-formats.csv | 2 +- 49 files changed, 1663 insertions(+), 1098 deletions(-) create mode 100644 Compression.Core/Dictionary/Lzh/Lh1Tree.cs create mode 100644 Compression.Core/Dictionary/Lzh/LhaBitInput.cs create mode 100644 Compression.Core/Dictionary/Lzh/LhaMatchFinder.cs create mode 100644 Compression.Core/Dictionary/Lzh/Pm1Decoder.cs create mode 100644 Compression.Core/Dictionary/Lzh/Pm2Decoder.cs delete mode 100644 Compression.Core/Dictionary/Lzh/PmaDecoder.cs delete mode 100644 Compression.Core/Dictionary/Lzh/PmaEncoder.cs create mode 100644 Compression.Core/Dictionary/Lzh/PmaHistory.cs create mode 100644 Compression.Core/Dictionary/Lzh/THIRD-PARTY-NOTICE.lhasa.txt create mode 100644 Compression.Tests/Lzh/LhaHeaderVectorTests.cs create mode 100644 Compression.Tests/Lzh/LhaOracleTests.cs create mode 100644 Compression.Tests/Lzh/LhaSuiteVectorTests.cs delete mode 100644 Compression.Tests/Lzh/PmaTests.cs create mode 100644 Compression.Tests/Lzh/ReferenceVectors/generated_lzs.lzs create mode 100644 Compression.Tests/Lzh/ReferenceVectors/larc333_initial.lzs create mode 100644 Compression.Tests/Lzh/ReferenceVectors/larc333_lz5.lzs create mode 100644 Compression.Tests/Lzh/ReferenceVectors/lha_amiga_122_level1.lzh create mode 100644 Compression.Tests/Lzh/ReferenceVectors/lha_amiga_122_lh0_dirs_bug.lzh create mode 100644 Compression.Tests/Lzh/ReferenceVectors/lha_os2_208_h3_lh5.lzh create mode 100644 Compression.Tests/Lzh/ReferenceVectors/lha_os2_208_h3_subdir.lzh create mode 100644 Compression.Tests/Lzh/ReferenceVectors/lharc113_lh1.lzh create mode 100644 Compression.Tests/Lzh/ReferenceVectors/pmarc124_pm1.pma create mode 100644 Compression.Tests/Lzh/ReferenceVectors/pmarc2_pm2.pma create mode 100644 Compression.Tests/Lzh/ReferenceVectors/unlha32_h2_lhx.lzh create mode 100644 Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Lzh/LhaHeaderParser.cs create mode 100644 Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Lzh/THIRD-PARTY-NOTICE.lhasa.txt diff --git a/Compression.Core/Dictionary/Lzh/Lh1Decoder.cs b/Compression.Core/Dictionary/Lzh/Lh1Decoder.cs index 45a0187ef..d7c5dbff5 100644 --- a/Compression.Core/Dictionary/Lzh/Lh1Decoder.cs +++ b/Compression.Core/Dictionary/Lzh/Lh1Decoder.cs @@ -1,234 +1,65 @@ -using Compression.Core.BitIO; - namespace Compression.Core.Dictionary.Lzh; /// -/// Decodes LHA -lh1- compressed data. -/// Uses a 4KB sliding window with dynamic (adaptive) Huffman coding. +/// Decodes LHarc -lh1-: LZSS over a 4 KiB window with an adaptive Huffman tree for literals and +/// copy lengths, and a fixed code for the high six bits of the copy distance. /// /// -/// The -lh1- format encodes 314 symbols: 256 literals (0-255) and -/// 58 length-position codes (256-313). The Huffman tree is rebuilt -/// periodically every symbols based on -/// accumulated frequencies. Positions use a fixed 6-bit encoding -/// with extra bits. +/// See for the tree and the position code. The window starts filled with spaces. +/// A copy of length n (codes 256-313 → 3-60) starts offset + 1 bytes back. +/// Sourcing: converted from lhasa's lh1_decoder.c (ISC, Simon Howard); see +/// THIRD-PARTY-NOTICE.lhasa.txt beside this file. Checked against the -lh1- archives of lhasa's +/// test suite. /// public sealed class Lh1Decoder { - private const int NChar = 256; - private const int WindowSize = 4096; - private const int WindowMask = WindowSize - 1; - private const int Threshold = 2; - private const int MaxMatch = 60; - private const int NumCodes = NChar + MaxMatch - Threshold + 1; // 314 - private const int BlockSize = 4096; - private const int PositionBits = 6; - private const int PositionSlots = 64; - - private readonly BitBuffer _bits; + internal const int WindowSize = 4096; + private readonly byte[] _data; - /// - /// Initializes a new . - /// - /// The stream containing -lh1- compressed data. + /// Initializes a new over the rest of . public Lh1Decoder(Stream input) { - this._bits = new(input); + ArgumentNullException.ThrowIfNull(input); + using var ms = new MemoryStream(); + input.CopyTo(ms); + this._data = ms.ToArray(); } - /// - /// Decodes the compressed data. - /// - /// The expected uncompressed size. - /// The decompressed data. + /// Decodes bytes. public byte[] Decode(int originalSize) { + ArgumentOutOfRangeException.ThrowIfNegative(originalSize); var output = new byte[originalSize]; - var window = new byte[WindowSize]; - // LH1 initializes the window with spaces (0x20) - Array.Fill(window, (byte)0x20); - var windowPos = 0; + var tree = new Lh1Tree(); + var bits = new LhaBitInput(this._data); + var ring = new byte[WindowSize]; + Array.Fill(ring, (byte)' '); + var ringPos = 0; var outPos = 0; - // Frequency table for adaptive Huffman - var freq = new int[NumCodes]; - Array.Fill(freq, 1); - var symbolCount = 0; - - // Build initial Huffman tree - (var codeTable, var tableBits) = BuildDecodeTable(freq); - while (outPos < originalSize) { - // Rebuild tree periodically - if (symbolCount >= BlockSize) { - // Halve frequencies to adapt (prevents overflow, forgets old data) - for (var i = 0; i < NumCodes; ++i) - freq[i] = (freq[i] + 1) >> 1; - (codeTable, tableBits) = BuildDecodeTable(freq); - symbolCount = 0; + if (bits.Exhausted) + throw new InvalidDataException("-lh1- stream ends before the member is complete."); + var node = 0; + while (!tree.IsLeaf(node)) + node = tree.Child(node) - bits.ReadBit(); + var code = tree.Child(node); + tree.Increment(code); + + if (code < 0x100) { + output[outPos++] = ring[ringPos] = (byte)code; + ringPos = (ringPos + 1) % WindowSize; + continue; } - var code = DecodeFromTable(codeTable, tableBits); - ++freq[code]; - ++symbolCount; - - if (code < NChar) { - var b = (byte)code; - output[outPos++] = b; - window[windowPos] = b; - windowPos = (windowPos + 1) & WindowMask; - } else { - var length = code - NChar + Threshold; - var posHigh = (int)this._bits.ReadBits(PositionBits); - var posLow = (int)this._bits.ReadBits(6); - var position = (posHigh << 6) | posLow; - - var srcPos = (windowPos - position - 1 + WindowSize) & WindowMask; - for (var j = 0; j < length && outPos < originalSize; ++j) { - var b = window[srcPos]; - output[outPos++] = b; - window[windowPos] = b; - windowPos = (windowPos + 1) & WindowMask; - srcPos = (srcPos + 1) & WindowMask; - } + int high = tree.OffsetLookup[bits.PeekBits(8)]; + bits.Skip(tree.OffsetLengths[high]); + var offset = (high << 6) | bits.ReadBits(6); + var count = code - 0x100 + Lh1Tree.CopyThreshold; + var start = ringPos - offset + WindowSize - 1; + for (var i = 0; i < count && outPos < originalSize; ++i) { + var b = ring[(start + i) % WindowSize]; + output[outPos++] = ring[ringPos] = b; + ringPos = (ringPos + 1) % WindowSize; } } - return output; } - - private int DecodeFromTable(int[] table, int maxBits) { - this._bits.EnsureBits(maxBits); - var peekBits = this._bits.PeekBits(maxBits); - - var entry = table[(int)peekBits]; - if (entry < 0) - throw new InvalidDataException("Failed to decode Huffman symbol in -lh1- data."); - - var symbol = entry & 0xFFFF; - var codeLen = entry >> 16; - this._bits.DropBits(codeLen); - return symbol; - } - - private static (int[] Table, int TableBits) BuildDecodeTable(int[] freq) { - // Build canonical Huffman codes from frequencies - var n = freq.Length; - var codeLengths = BuildCodeLengths(freq, n, 16); - - var maxLen = 0; - for (var i = 0; i < n; ++i) - if (codeLengths[i] > maxLen) - maxLen = codeLengths[i]; - - if (maxLen == 0) { - // All zero - shouldn't happen with freq>=1 init - maxLen = 1; - codeLengths[0] = 1; - } - - var tableBits = Math.Min(maxLen, 12); - var tableSize = 1 << tableBits; - var table = new int[tableSize]; - table.AsSpan().Fill(-1); - - var blCount = new int[maxLen + 1]; - foreach (var v in codeLengths) - if (v > 0 && v <= maxLen) - ++blCount[v]; - - var nextCode = new int[maxLen + 1]; - var code = 0; - for (var bits = 1; bits <= maxLen; ++bits) { - code = (code + blCount[bits - 1]) << 1; - nextCode[bits] = code; - } - - for (var sym = 0; sym < n; ++sym) { - var len = codeLengths[sym]; - if (len == 0 || len > tableBits) - continue; - - var symCode = nextCode[len]++; - var fillBits = tableBits - len; - var baseIdx = symCode << fillBits; - var packedValue = sym | (len << 16); - for (var fill = 0; fill < (1 << fillBits); ++fill) - table[baseIdx + fill] = packedValue; - } - - return (table, tableBits); - } - - private static int[] BuildCodeLengths(int[] freq, int n, int maxBits) { - // Package-merge algorithm simplified: build from frequencies - // Use a simple heap-based Huffman tree construction - var codeLengths = new int[n]; - - // Count non-zero - var activeCount = 0; - for (var i = 0; i < n; ++i) - if (freq[i] > 0) - ++activeCount; - - if (activeCount <= 1) { - // Find the one symbol (or pick 0) - for (var i = 0; i < n; ++i) - if (freq[i] > 0) { - codeLengths[i] = 1; - break; - } - return codeLengths; - } - - // Build Huffman tree using priority queue - // Node: (freq, depth, symbol or -1 for internal, left, right) - var pq = new SortedList<(long Freq, int Order), int>(); - var order = 0; - var nodeCount = 0; - var capacity = 2 * n; - var nodeLeft = new int[capacity]; - var nodeRight = new int[capacity]; - var nodeSymbol = new int[capacity]; // -1 for internal - - for (var i = 0; i < n; ++i) { - if (freq[i] > 0) { - var idx = nodeCount++; - nodeLeft[idx] = -1; - nodeRight[idx] = -1; - nodeSymbol[idx] = i; - pq.Add((freq[i], order++), idx); - } - } - - while (pq.Count > 1) { - var key1 = pq.Keys[0]; - var n1 = pq[key1]; - pq.RemoveAt(0); - - var key2 = pq.Keys[0]; - var n2 = pq[key2]; - pq.RemoveAt(0); - - var parent = nodeCount++; - nodeLeft[parent] = n1; - nodeRight[parent] = n2; - nodeSymbol[parent] = -1; - pq.Add((key1.Freq + key2.Freq, order++), parent); - } - - // Assign depths - var root = pq.Values[0]; - AssignDepths(root, 0, nodeLeft, nodeRight, nodeSymbol, codeLengths, maxBits); - - return codeLengths; - } - - private static void AssignDepths(int node, int depth, - int[] left, int[] right, int[] symbol, int[] codeLengths, int maxBits) { - if (symbol[node] >= 0) { - codeLengths[symbol[node]] = Math.Min(depth, maxBits); - return; - } - - AssignDepths(left[node], depth + 1, left, right, symbol, codeLengths, maxBits); - AssignDepths(right[node], depth + 1, left, right, symbol, codeLengths, maxBits); - } } diff --git a/Compression.Core/Dictionary/Lzh/Lh1Encoder.cs b/Compression.Core/Dictionary/Lzh/Lh1Encoder.cs index ebbe7ebc2..f263b7f03 100644 --- a/Compression.Core/Dictionary/Lzh/Lh1Encoder.cs +++ b/Compression.Core/Dictionary/Lzh/Lh1Encoder.cs @@ -3,111 +3,55 @@ namespace Compression.Core.Dictionary.Lzh; /// -/// Encodes data using the LHA -lh1- adaptive Huffman method. +/// Encodes LHarc -lh1- (see ): greedy LZSS matches over a 4 KiB window, +/// coded through the same adaptive the decoder evolves. /// /// -/// 4KB sliding window (initialized to 0x20), 314 symbols (256 literals + -/// 58 match-length codes), adaptive Huffman rebuilt every 4096 symbols. -/// Positions encoded as 6+6 = 12 bits. +/// A code is written as the path from the root to its leaf. Matches reach back only into bytes already +/// emitted. One zero byte is appended, because LHA decoders look ahead eight bits for each position +/// code. Verified by lhasa extracting what this writes. /// public sealed class Lh1Encoder { - private const int NChar = 256; - private const int WindowSize = 4096; - private const int WindowMask = WindowSize - 1; - private const int Threshold = 2; - private const int MaxMatch = 60; - private const int NumCodes = NChar + MaxMatch - Threshold + 1; // 314 - private const int BlockSize = 4096; - private const int PositionBits = 6; + private const int MaxLength = Lh1Tree.NumCodes - 0x100 + Lh1Tree.CopyThreshold - 1; // 60 - /// - /// Compresses data using the -lh1- algorithm. - /// - /// The input data to compress. - /// The compressed data. + /// Encodes . public static byte[] Encode(ReadOnlySpan data) { - if (data.Length == 0) - return []; - - using var output = new MemoryStream(); - var bits = new BitWriter(output); - - var window = new byte[WindowSize]; - Array.Fill(window, (byte)0x20); - var windowPos = 0; - - var freq = new int[NumCodes]; - Array.Fill(freq, 1); - var symbolCount = 0; - - var (codeLengths, codes) = BuildHuffmanTable(freq); - - var i = 0; - while (i < data.Length) { - // Rebuild tree periodically - if (symbolCount >= BlockSize) { - for (var s = 0; s < NumCodes; ++s) - freq[s] = (freq[s] + 1) >> 1; - (codeLengths, codes) = BuildHuffmanTable(freq); - symbolCount = 0; - } - - // Find best match in window - var bestLen = 0; - var bestPos = 0; - - for (var j = 1; j < WindowSize && j <= i; ++j) { - var srcIdx = (windowPos - j + WindowSize) & WindowMask; - var len = 0; - while (len < MaxMatch && i + len < data.Length) { - var wIdx = (srcIdx + len) & WindowMask; - if (window[wIdx] != data[i + len]) - break; - ++len; - } - if (len > bestLen && len >= Threshold) { - bestLen = len; - bestPos = j - 1; // position = distance - 1 - } + var input = data.ToArray(); + using var ms = new MemoryStream(); + var bits = new BitWriter(ms); + var tree = new Lh1Tree(); + var finder = new LhaMatchFinder(input, Lh1Decoder.WindowSize, Lh1Tree.CopyThreshold, MaxLength); + var path = new Stack(32); + + void WriteCode(int code) { + for (int node = tree.LeafOf(code); node != 0;) { + var parent = tree.Parent(node); + path.Push(tree.Child(parent) - node); + node = parent; } + while (path.Count > 0) + bits.WriteBit(path.Pop()); + tree.Increment(code); + } - if (bestLen >= Threshold) { - var code = NChar + bestLen - Threshold; - bits.WriteBits(codes[code], codeLengths[code]); - ++freq[code]; - ++symbolCount; - - // Write position: 6 high bits + 6 low bits - var posHigh = bestPos >> 6; - var posLow = bestPos & 0x3F; - bits.WriteBits((uint)posHigh, PositionBits); - bits.WriteBits((uint)posLow, 6); - - for (var k = 0; k < bestLen; ++k) { - window[windowPos] = data[i + k]; - windowPos = (windowPos + 1) & WindowMask; - } - i += bestLen; - } - else { - var b = data[i]; - bits.WriteBits(codes[b], codeLengths[b]); - ++freq[b]; - ++symbolCount; - - window[windowPos] = b; - windowPos = (windowPos + 1) & WindowMask; - ++i; + var pos = 0; + while (pos < input.Length) { + var (length, distance) = finder.Find(pos); + if (length == 0) { + WriteCode(input[pos++]); + continue; } + WriteCode(0x100 + length - Lh1Tree.CopyThreshold); + var offset = distance - 1; + var high = offset >> 6; + int codeLength = tree.OffsetLengths[high]; + bits.WriteBits((uint)(tree.OffsetCodes[high] >> (8 - codeLength)), codeLength); + bits.WriteBits((uint)(offset & 0x3F), 6); + pos += length; } - bits.FlushBits(); - return output.ToArray(); - } - - private static (int[] Lengths, uint[] Codes) BuildHuffmanTable(int[] freq) { - var lengths = LzhEncoder.BuildCodeLengths(freq, 16); - var codes = LzhEncoder.BuildCanonicalCodes(lengths); - return (lengths, codes); + if (input.Length > 0) + ms.WriteByte(0); + return ms.ToArray(); } } diff --git a/Compression.Core/Dictionary/Lzh/Lh1Tree.cs b/Compression.Core/Dictionary/Lzh/Lh1Tree.cs new file mode 100644 index 000000000..49eac3a51 --- /dev/null +++ b/Compression.Core/Dictionary/Lzh/Lh1Tree.cs @@ -0,0 +1,235 @@ +namespace Compression.Core.Dictionary.Lzh; + +/// +/// The adaptive Huffman tree of LHarc -lh1- (LZHUF), shared by and +/// so both evolve it identically. +/// +/// +/// 314 leaves (256 literals and 58 copy lengths 3-60) in a table kept sorted by decreasing +/// frequency; node 0 is the root and a branch's children are child (bit 0) and child - 1 +/// (bit 1). Nodes of equal frequency form a group whose leftmost node is its leader; incrementing a node +/// first swaps it with its leader, which keeps the table sorted. When the root count reaches 32 KiB the +/// leaf counts are halved and the tree rebuilt. +/// The 64 position codes use a fixed table: 1 code of 3 bits, 3 of 4, 8 of 5, 12 of 6, 24 of 7 +/// and 16 of 8, followed by 6 raw low bits. +/// Sourcing: converted from lhasa's lh1_decoder.c (ISC, Simon Howard), tables copied +/// exactly; see THIRD-PARTY-NOTICE.lhasa.txt beside this file. +/// +internal sealed class Lh1Tree { + public const int NumCodes = 314; + public const int NumNodes = NumCodes * 2 - 1; + public const int NumOffsets = 64; + public const int CopyThreshold = 3; + private const int ReorderLimit = 32 * 1024; + private static readonly int[] OffsetDistribution = [1, 3, 8, 12, 24, 16]; + + private readonly bool[] _leaf = new bool[NumNodes]; + private readonly ushort[] _child = new ushort[NumNodes]; + private readonly ushort[] _parent = new ushort[NumNodes]; + private readonly ushort[] _freq = new ushort[NumNodes]; + private readonly ushort[] _group = new ushort[NumNodes]; + private readonly ushort[] _leafNodes = new ushort[NumCodes]; + private readonly ushort[] _groups = new ushort[NumNodes]; + private readonly ushort[] _groupLeader = new ushort[NumNodes]; + private int _numGroups; + + /// Maps the next 8 input bits to a position code. + public readonly byte[] OffsetLookup = new byte[256]; + + /// Bit length of each position code. + public readonly byte[] OffsetLengths = new byte[NumOffsets]; + + /// Each position code's bits, left-aligned in a byte. + public readonly byte[] OffsetCodes = new byte[NumOffsets]; + + public Lh1Tree() { + this.InitGroups(); + this.InitTree(); + this.InitOffsetTable(); + } + + public bool IsLeaf(int node) => this._leaf[node]; + + public int Child(int node) => this._child[node]; + + public int Parent(int node) => this._parent[node]; + + public int LeafOf(int code) => this._leafNodes[code]; + + private ushort AllocGroup() => this._groups[this._numGroups++]; + + private void FreeGroup(ushort group) => this._groups[--this._numGroups] = group; + + private void InitGroups() { + for (var i = 0; i < NumNodes; ++i) + this._groups[i] = (ushort)i; + this._numGroups = 0; + } + + private void InitTree() { + var nodeIndex = NumNodes - 1; + var leafGroup = this.AllocGroup(); + for (var i = 0; i < NumCodes; ++i) { + this._leaf[nodeIndex] = true; + this._child[nodeIndex] = (ushort)i; + this._freq[nodeIndex] = 1; + this._group[nodeIndex] = leafGroup; + this._groupLeader[leafGroup] = (ushort)nodeIndex; + this._leafNodes[i] = (ushort)nodeIndex; + --nodeIndex; + } + + var child = NumNodes - 1; + while (nodeIndex >= 0) { + this._leaf[nodeIndex] = false; + this._child[nodeIndex] = (ushort)child; + this._parent[child] = (ushort)nodeIndex; + this._parent[child - 1] = (ushort)nodeIndex; + this._freq[nodeIndex] = (ushort)(this._freq[child] + this._freq[child - 1]); + this._group[nodeIndex] = this._freq[nodeIndex] == this._freq[nodeIndex + 1] + ? this._group[nodeIndex + 1] + : this.AllocGroup(); + this._groupLeader[this._group[nodeIndex]] = (ushort)nodeIndex; + --nodeIndex; + child -= 2; + } + } + + private void InitOffsetTable() { + var code = 0; + var offset = 0; + for (var i = 0; i < OffsetDistribution.Length; ++i) { + var length = i + 3; + var iterBit = 1 << (8 - length); + for (var j = 0; j < OffsetDistribution[i]; ++j) { + for (var k = 0; k < iterBit; ++k) + this.OffsetLookup[code | k] = (byte)offset; + this.OffsetLengths[offset] = (byte)length; + this.OffsetCodes[offset] = (byte)code; + code += iterBit; + ++offset; + } + } + } + + private int MakeGroupLeader(int nodeIndex) { + var group = this._group[nodeIndex]; + int leaderIndex = this._groupLeader[group]; + if (leaderIndex == nodeIndex) + return nodeIndex; + + (this._leaf[leaderIndex], this._leaf[nodeIndex]) = (this._leaf[nodeIndex], this._leaf[leaderIndex]); + (this._child[leaderIndex], this._child[nodeIndex]) = (this._child[nodeIndex], this._child[leaderIndex]); + this.Reparent(nodeIndex); + this.Reparent(leaderIndex); + return leaderIndex; + } + + private void Reparent(int index) { + if (this._leaf[index]) + this._leafNodes[this._child[index]] = (ushort)index; + else { + this._parent[this._child[index]] = (ushort)index; + this._parent[this._child[index] - 1] = (ushort)index; + } + } + + private void IncrementNodeFreq(int nodeIndex) { + var other = nodeIndex - 1; + ++this._freq[nodeIndex]; + if (nodeIndex < NumNodes - 1 && this._group[nodeIndex] == this._group[nodeIndex + 1]) { + ++this._groupLeader[this._group[nodeIndex]]; + if (this._freq[nodeIndex] == this._freq[other]) + this._group[nodeIndex] = this._group[other]; + else { + this._group[nodeIndex] = this.AllocGroup(); + this._groupLeader[this._group[nodeIndex]] = (ushort)nodeIndex; + } + } else if (this._freq[nodeIndex] == this._freq[other]) { + this.FreeGroup(this._group[nodeIndex]); + this._group[nodeIndex] = this._group[other]; + } + } + + private void Reconstruct() { + // Gather the leaves at the start, halving their counts. + var leafCount = 0; + var leafLeaf = new bool[NumCodes]; + var leafChild = new ushort[NumCodes]; + var leafFreq = new ushort[NumCodes]; + for (var i = 0; i < NumNodes; ++i) { + if (!this._leaf[i]) + continue; + leafChild[leafCount] = this._child[i]; + leafFreq[leafCount] = (ushort)((this._freq[i] + 1) / 2); + leafLeaf[leafCount] = true; + ++leafCount; + } + for (var i = 0; i < NumCodes; ++i) { + this._leaf[i] = leafLeaf[i]; + this._child[i] = leafChild[i]; + this._freq[i] = leafFreq[i]; + } + + var leaf = NumCodes - 1; + var child = NumNodes - 1; + var index = NumNodes - 1; + while (index >= 0) { + while (child - index < 2) { + this.CopyNode(index, leaf); + --index; + --leaf; + } + var freq = this._freq[child] + this._freq[child - 1]; + while (leaf >= 0 && freq >= this._freq[leaf]) { + this.CopyNode(index, leaf); + --index; + --leaf; + } + this._leaf[index] = false; + this._freq[index] = (ushort)freq; + this._child[index] = (ushort)child; + this._parent[child] = (ushort)index; + this._parent[child - 1] = (ushort)index; + --index; + child -= 2; + } + + this.InitGroups(); + var group = this.AllocGroup(); + this._group[0] = group; + this._groupLeader[group] = 0; + for (var i = 1; i < NumNodes; ++i) { + if (this._freq[i] == this._freq[i - 1]) + this._group[i] = this._group[i - 1]; + else { + group = this.AllocGroup(); + this._group[i] = group; + this._groupLeader[group] = (ushort)i; + } + } + } + + /// Copies leaf node to (from ≤ to), as the reference's struct copy does. + private void CopyNode(int to, int from) { + this._leaf[to] = this._leaf[from]; + this._child[to] = this._child[from]; + this._freq[to] = this._freq[from]; + this._parent[to] = this._parent[from]; + this._group[to] = this._group[from]; + this._leafNodes[this._child[from]] = (ushort)to; + } + + /// Counts one occurrence of , reshaping the tree. + public void Increment(int code) { + if (this._freq[0] >= ReorderLimit) + this.Reconstruct(); + ++this._freq[0]; + int nodeIndex = this._leafNodes[code]; + while (nodeIndex != 0) { + nodeIndex = this.MakeGroupLeader(nodeIndex); + this.IncrementNodeFreq(nodeIndex); + nodeIndex = this._parent[nodeIndex]; + } + } +} diff --git a/Compression.Core/Dictionary/Lzh/LhaBitInput.cs b/Compression.Core/Dictionary/Lzh/LhaBitInput.cs new file mode 100644 index 000000000..35387f1e6 --- /dev/null +++ b/Compression.Core/Dictionary/Lzh/LhaBitInput.cs @@ -0,0 +1,39 @@ +namespace Compression.Core.Dictionary.Lzh; + +/// +/// MSB-first bit reader for the LArc/LHarc/PMarc decoders. Reads past the end of the data return +/// zero bits, as the reference decoders' zero-filled input buffers do; callers bound their work by the +/// member's declared size. +/// +internal sealed class LhaBitInput(byte[] data) { + private readonly byte[] _data = data; + private long _bitPos; + + /// Gets whether every bit of the input has been consumed. + public bool Exhausted => this._bitPos >= (long)this._data.Length * 8; + + public int ReadBit() { + var index = (int)(this._bitPos >> 3); + var bit = index < this._data.Length ? (this._data[index] >> (7 - (int)(this._bitPos & 7))) & 1 : 0; + ++this._bitPos; + return bit; + } + + /// Reads bits (0-24) as an unsigned value. + public int ReadBits(int count) { + var value = 0; + for (var i = 0; i < count; ++i) + value = (value << 1) | this.ReadBit(); + return value; + } + + /// Returns the next bits without consuming them. + public int PeekBits(int count) { + var saved = this._bitPos; + var value = this.ReadBits(count); + this._bitPos = saved; + return value; + } + + public void Skip(int count) => this._bitPos += count; +} diff --git a/Compression.Core/Dictionary/Lzh/LhaMatchFinder.cs b/Compression.Core/Dictionary/Lzh/LhaMatchFinder.cs new file mode 100644 index 000000000..f821a30d3 --- /dev/null +++ b/Compression.Core/Dictionary/Lzh/LhaMatchFinder.cs @@ -0,0 +1,66 @@ +namespace Compression.Core.Dictionary.Lzh; + +/// +/// Hash-chain longest-match search over the input for the small-window LHA encoders +/// (-lzs-, -lz5-, -lh1-). A match at distance d copies from d bytes +/// back and may overlap the bytes it produces. +/// +internal sealed class LhaMatchFinder { + private const int HashBits = 14; + private const int MaxChain = 128; + private readonly byte[] _data; + private readonly int _maxDistance; + private readonly int _minLength; + private readonly int _maxLength; + private readonly int[] _head = new int[1 << HashBits]; + private readonly int[] _prev; + private int _inserted; + + public LhaMatchFinder(byte[] data, int maxDistance, int minLength, int maxLength) { + this._data = data; + this._maxDistance = maxDistance; + this._minLength = minLength; + this._maxLength = maxLength; + this._prev = new int[data.Length]; + Array.Fill(this._head, -1); + } + + private int Hash(int pos) => + ((this._data[pos] << 10) ^ (this._data[pos + 1] << 5) ^ this._data[pos + 2]) & ((1 << HashBits) - 1); + + /// Indexes every position before that is not yet indexed. + private void InsertUpTo(int pos) { + for (; this._inserted < pos; ++this._inserted) { + if (this._inserted + 2 >= this._data.Length) + continue; + var h = this.Hash(this._inserted); + this._prev[this._inserted] = this._head[h]; + this._head[h] = this._inserted; + } + } + + /// Finds the longest match for the bytes at ; returns length 0 when none reaches the minimum. + public (int Length, int Distance) Find(int pos) { + this.InsertUpTo(pos); + var limit = Math.Min(this._maxLength, this._data.Length - pos); + if (limit < this._minLength || pos + 2 >= this._data.Length) + return (0, 0); + + int bestLength = 0, bestDistance = 0, chain = 0; + for (var candidate = this._head[this.Hash(pos)]; candidate >= 0 && chain < MaxChain; candidate = this._prev[candidate], ++chain) { + var distance = pos - candidate; + if (distance > this._maxDistance) + break; + var length = 0; + while (length < limit && this._data[candidate + length] == this._data[pos + length]) + ++length; + if (length > bestLength) { + bestLength = length; + bestDistance = distance; + if (length == limit) + break; + } + } + return bestLength >= this._minLength ? (bestLength, bestDistance) : (0, 0); + } +} diff --git a/Compression.Core/Dictionary/Lzh/Lz5Decoder.cs b/Compression.Core/Dictionary/Lzh/Lz5Decoder.cs index c68f176cf..5a75b5285 100644 --- a/Compression.Core/Dictionary/Lzh/Lz5Decoder.cs +++ b/Compression.Core/Dictionary/Lzh/Lz5Decoder.cs @@ -1,76 +1,80 @@ namespace Compression.Core.Dictionary.Lzh; /// -/// Decodes -lz5- compressed data (LArc variant). -/// Uses LZSS with a 4KB sliding window, no Huffman coding. +/// Decodes LArc -lz5-: LZSS over a 4 KiB ring buffer, byte-aligned. /// /// -/// Similar to -lzs- but with a 4KB window. -/// Flag byte encodes 8 tokens. Bit 1 = literal, bit 0 = match. -/// Match: 12-bit offset (first byte + high 4 bits of second byte), -/// 4-bit length in low nibble of second byte. Minimum match = 2. -/// Window initialized to spaces. +/// A flag byte governs the next eight commands, least significant bit first: 1 is a literal byte, +/// 0 is a two-byte copy whose first byte and the high nibble of the second give a 12-bit absolute ring +/// position, and whose low nibble gives a length of 3-18. The ring buffer starts with a fixed pattern +/// (13 copies of each byte value, the values ascending then descending, 128 zeros, 110 spaces and 18 +/// zeros) and the write position starts 18 bytes before its end. +/// Sourcing: converted from lhasa's lz5_decoder.c (ISC, Simon Howard), initial ring +/// contents copied exactly; see THIRD-PARTY-NOTICE.lhasa.txt beside this file. Checked against the +/// -lz5- archives of lhasa's test suite. /// public static class Lz5Decoder { - private const int WindowSize = 4096; - private const int WindowMask = WindowSize - 1; - private const int Threshold = 2; + internal const int RingSize = 4096; + internal const int StartOffset = 18; + internal const int Threshold = 3; - /// - /// Decodes -lz5- compressed data. - /// - /// The compressed data. - /// The expected uncompressed size. - /// The decompressed data. + /// Decodes bytes of -lz5- data. public static byte[] Decode(ReadOnlySpan compressed, int originalSize) => Decode(compressed.ToArray(), originalSize); - /// - /// Decodes -lz5- compressed data. - /// - /// The compressed data. - /// The expected uncompressed size. - /// The decompressed data. + /// Decodes bytes of -lz5- data. public static byte[] Decode(byte[] compressed, int originalSize) { + ArgumentNullException.ThrowIfNull(compressed); + ArgumentOutOfRangeException.ThrowIfNegative(originalSize); var output = new byte[originalSize]; - var window = new byte[WindowSize]; - Array.Fill(window, (byte)0x20); - var windowPos = 0; + var ring = InitialRing(); + var ringPos = RingSize - StartOffset; + var src = 0; var outPos = 0; - var srcPos = 0; - - while (outPos < originalSize && srcPos < compressed.Length) { - int flags = compressed[srcPos++]; + while (outPos < originalSize) { + if (src >= compressed.Length) + throw new InvalidDataException("-lz5- stream ends before the member is complete."); + int flags = compressed[src++]; for (var bit = 0; bit < 8 && outPos < originalSize; ++bit) { if ((flags & (1 << bit)) != 0) { - // Literal - if (srcPos >= compressed.Length) - return output; - var b = compressed[srcPos++]; - output[outPos++] = b; - window[windowPos] = b; - windowPos = (windowPos + 1) & WindowMask; - } else { - // Match - if (srcPos + 1 >= compressed.Length) - return output; - int b1 = compressed[srcPos++]; - int b2 = compressed[srcPos++]; - - var offset = b1 | ((b2 & 0xF0) << 4); - var length = (b2 & 0x0F) + Threshold; - - for (var j = 0; j < length && outPos < originalSize; ++j) { - var b = window[(offset + j) & WindowMask]; - output[outPos++] = b; - window[windowPos] = b; - windowPos = (windowPos + 1) & WindowMask; - } + if (src >= compressed.Length) + throw new InvalidDataException("-lz5- stream ends inside a literal."); + output[outPos++] = ring[ringPos] = compressed[src++]; + ringPos = (ringPos + 1) % RingSize; + continue; + } + if (src + 1 >= compressed.Length) + throw new InvalidDataException("-lz5- stream ends inside a copy."); + int c0 = compressed[src++]; + int c1 = compressed[src++]; + var pos = ((c1 & 0xF0) << 4) | c0; + var length = (c1 & 0x0F) + Threshold; + for (var i = 0; i < length && outPos < originalSize; ++i) { + var b = ring[(pos + i) % RingSize]; + output[outPos++] = ring[ringPos] = b; + ringPos = (ringPos + 1) % RingSize; } } } - return output; } + + /// The ring buffer's initial contents, as LArc defines them. + internal static byte[] InitialRing() { + var ring = new byte[RingSize]; + var p = 0; + for (var i = 0; i < 256; ++i) + for (var j = 0; j < 13; ++j) + ring[p++] = (byte)i; + for (var i = 0; i < 256; ++i) + ring[p++] = (byte)i; + for (var i = 0; i < 256; ++i) + ring[p++] = (byte)(255 - i); + p += 128; // zeros + for (var i = 0; i < 110; ++i) + ring[p++] = (byte)' '; + // the final 18 bytes stay zero + return ring; + } } diff --git a/Compression.Core/Dictionary/Lzh/Lz5Encoder.cs b/Compression.Core/Dictionary/Lzh/Lz5Encoder.cs index 1d138e334..12063a99d 100644 --- a/Compression.Core/Dictionary/Lzh/Lz5Encoder.cs +++ b/Compression.Core/Dictionary/Lzh/Lz5Encoder.cs @@ -1,86 +1,43 @@ namespace Compression.Core.Dictionary.Lzh; /// -/// Encodes data using the -lz5- format (LArc variant). -/// Plain LZSS with a 4KB sliding window, no Huffman coding. +/// Encodes LArc -lz5- (see for the stream layout). /// +/// +/// Matches only reach back into bytes already emitted (never into the predefined initial ring) and are +/// written as absolute ring positions. Verified by lhasa extracting what this writes. +/// public static class Lz5Encoder { - private const int WindowSize = 4096; - private const int WindowMask = WindowSize - 1; - private const int Threshold = 2; - private const int MaxMatch = 17; // 4-bit length + 2 + private const int MaxLength = 15 + Lz5Decoder.Threshold; - /// - /// Encodes data using the -lz5- format. - /// - /// The data to compress. - /// The compressed data. - public static byte[] Encode(ReadOnlySpan data) - => Encode(data.ToArray()); + /// Encodes . + public static byte[] Encode(ReadOnlySpan data) => Encode(data.ToArray()); - /// - /// Encodes data using the -lz5- format. - /// - /// The data to compress. - /// The compressed data. + /// Encodes . public static byte[] Encode(byte[] data) { - var window = new byte[WindowSize]; - Array.Fill(window, (byte)0x20); - var windowPos = 0; - - using var output = new MemoryStream(); - var srcPos = 0; - - while (srcPos < data.Length) { - var flagPos = (int)output.Position; - output.WriteByte(0); // placeholder for flag byte - var flags = 0; - - for (var bit = 0; bit < 8 && srcPos < data.Length; ++bit) { - // Find best match in window - var bestLen = 0; - var bestOff = 0; - - for (var off = 1; off < WindowSize && off <= srcPos; ++off) { - var matchPos = (windowPos - off) & WindowMask; - var len = 0; - while (len < MaxMatch && srcPos + len < data.Length - && window[(matchPos + len) & WindowMask] == data[srcPos + len]) - ++len; - - if (len > bestLen) { - bestLen = len; - bestOff = matchPos; - } - } - - if (bestLen >= Threshold) { - // Match: encode offset + length - var b1 = bestOff & 0xFF; - var b2 = ((bestOff >> 4) & 0xF0) | ((bestLen - Threshold) & 0x0F); - output.WriteByte((byte)b1); - output.WriteByte((byte)b2); - - for (var j = 0; j < bestLen; ++j) { - window[windowPos] = data[srcPos++]; - windowPos = (windowPos + 1) & WindowMask; - } - } else { - // Literal - flags |= 1 << bit; - output.WriteByte(data[srcPos]); - window[windowPos] = data[srcPos++]; - windowPos = (windowPos + 1) & WindowMask; + ArgumentNullException.ThrowIfNull(data); + using var ms = new MemoryStream(); + var finder = new LhaMatchFinder(data, Lz5Decoder.RingSize - 1, Lz5Decoder.Threshold, MaxLength); + var group = new List(17); + var pos = 0; + while (pos < data.Length) { + byte flags = 0; + group.Clear(); + for (var bit = 0; bit < 8 && pos < data.Length; ++bit) { + var (length, distance) = finder.Find(pos); + if (length == 0) { + flags |= (byte)(1 << bit); + group.Add(data[pos++]); + continue; } + var ringPos = (Lz5Decoder.RingSize - Lz5Decoder.StartOffset + pos - distance) % Lz5Decoder.RingSize; + group.Add((byte)ringPos); + group.Add((byte)(((ringPos >> 4) & 0xF0) | (length - Lz5Decoder.Threshold))); + pos += length; } - - // Patch flag byte - var savedPos = output.Position; - output.Position = flagPos; - output.WriteByte((byte)flags); - output.Position = savedPos; + ms.WriteByte(flags); + ms.Write(group.ToArray()); } - - return output.ToArray(); + return ms.ToArray(); } } diff --git a/Compression.Core/Dictionary/Lzh/LzhDecoder.cs b/Compression.Core/Dictionary/Lzh/LzhDecoder.cs index c0b37c9a7..7145a8f0e 100644 --- a/Compression.Core/Dictionary/Lzh/LzhDecoder.cs +++ b/Compression.Core/Dictionary/Lzh/LzhDecoder.cs @@ -24,7 +24,7 @@ public sealed class LzhDecoder { /// Initializes a new . ///
/// The stream containing compressed data. - /// Number of position bits (13 for lh5, 15 for lh6, 16 for lh7). + /// Number of position bits (13 for lh5, 15 for lh6, 16 for lh7, 20 for lhx). public LzhDecoder(Stream input, int positionBits = LzhConstants.Lh5PositionBits) { this._bits = new(input); this._windowSize = 1 << positionBits; @@ -33,6 +33,7 @@ public LzhDecoder(Stream input, int positionBits = LzhConstants.Lh5PositionBits) 13 => 4, // lh5 15 => 5, // lh6 16 => 5, // lh7 + 20 => 5, // lhx (UNLHA32's 1 MiB window) _ => 4 }; } diff --git a/Compression.Core/Dictionary/Lzh/LzsDecoder.cs b/Compression.Core/Dictionary/Lzh/LzsDecoder.cs index d9c8dbbf7..68207650d 100644 --- a/Compression.Core/Dictionary/Lzh/LzsDecoder.cs +++ b/Compression.Core/Dictionary/Lzh/LzsDecoder.cs @@ -1,76 +1,54 @@ namespace Compression.Core.Dictionary.Lzh; /// -/// Decodes -lzs- compressed data (LArc format). -/// Uses plain LZSS with a 2KB sliding window, no Huffman coding. +/// Decodes LArc -lzs-: LZSS over a 2 KiB ring buffer, with no entropy coding. /// /// -/// Format: flag byte, then 8 tokens per flag. -/// Flag bit 1 = literal byte. -/// Flag bit 0 = match: 11-bit offset (big-endian across 2 bytes) + 4-bit length. -/// The 2 bytes encode: high 8 bits = first byte, low 3 bits of offset in top 3 bits of second byte, -/// length in low 4 bits of second byte. Minimum match = 2. Window initialized to spaces. +/// The stream is MSB-first bits. Each command opens with a flag bit: 1 is followed by an 8-bit +/// literal, 0 by an 11-bit absolute ring-buffer position and a 4-bit length (copies of 2-17 bytes). +/// The ring buffer starts filled with spaces and the write position starts 17 bytes before its end; +/// positions are absolute, not distances. +/// Sourcing: converted from lhasa's lzs_decoder.c (ISC, Simon Howard); see +/// THIRD-PARTY-NOTICE.lhasa.txt beside this file. Checked against the -lzs- archives of lhasa's +/// test suite. /// public static class LzsDecoder { - private const int WindowSize = 2048; - private const int WindowMask = WindowSize - 1; - private const int Threshold = 2; + internal const int RingSize = 2048; + internal const int StartOffset = 17; + internal const int Threshold = 2; - /// - /// Decodes -lzs- compressed data. - /// - /// The compressed data. - /// The expected uncompressed size. - /// The decompressed data. + /// Decodes bytes of -lzs- data. public static byte[] Decode(ReadOnlySpan compressed, int originalSize) => Decode(compressed.ToArray(), originalSize); - /// - /// Decodes -lzs- compressed data. - /// - /// The compressed data. - /// The expected uncompressed size. - /// The decompressed data. + /// Decodes bytes of -lzs- data. public static byte[] Decode(byte[] compressed, int originalSize) { + ArgumentNullException.ThrowIfNull(compressed); + ArgumentOutOfRangeException.ThrowIfNegative(originalSize); var output = new byte[originalSize]; - var window = new byte[WindowSize]; - Array.Fill(window, (byte)0x20); - var windowPos = 0; + var ring = new byte[RingSize]; + Array.Fill(ring, (byte)' '); + var ringPos = RingSize - StartOffset; + var bits = new LhaBitInput(compressed); var outPos = 0; - var srcPos = 0; - while (outPos < originalSize && srcPos < compressed.Length) { - int flags = compressed[srcPos++]; - - for (var bit = 0; bit < 8 && outPos < originalSize; ++bit) { - if ((flags & (1 << bit)) != 0) { - // Literal - if (srcPos >= compressed.Length) - return output; - var b = compressed[srcPos++]; - output[outPos++] = b; - window[windowPos] = b; - windowPos = (windowPos + 1) & WindowMask; - } else { - // Match - if (srcPos + 1 >= compressed.Length) - return output; - int b1 = compressed[srcPos++]; - int b2 = compressed[srcPos++]; - - var offset = b1 | ((b2 & 0xE0) << 3); - var length = (b2 & 0x0F) + Threshold; - - for (var j = 0; j < length && outPos < originalSize; ++j) { - var b = window[(offset + j) & WindowMask]; - output[outPos++] = b; - window[windowPos] = b; - windowPos = (windowPos + 1) & WindowMask; - } - } + while (outPos < originalSize) { + if (bits.Exhausted) + throw new InvalidDataException("-lzs- stream ends before the member is complete."); + if (bits.ReadBit() != 0) { + var b = (byte)bits.ReadBits(8); + output[outPos++] = ring[ringPos] = b; + ringPos = (ringPos + 1) % RingSize; + continue; + } + var pos = bits.ReadBits(11); + var length = bits.ReadBits(4) + Threshold; + for (var i = 0; i < length && outPos < originalSize; ++i) { + var b = ring[(pos + i) % RingSize]; + output[outPos++] = ring[ringPos] = b; + ringPos = (ringPos + 1) % RingSize; } } - return output; } } diff --git a/Compression.Core/Dictionary/Lzh/LzsEncoder.cs b/Compression.Core/Dictionary/Lzh/LzsEncoder.cs index 78151bde0..7c14f9175 100644 --- a/Compression.Core/Dictionary/Lzh/LzsEncoder.cs +++ b/Compression.Core/Dictionary/Lzh/LzsEncoder.cs @@ -1,86 +1,43 @@ +using Compression.Core.BitIO; + namespace Compression.Core.Dictionary.Lzh; /// -/// Encodes data using the -lzs- format (LArc). -/// Plain LZSS with a 2KB sliding window, no Huffman coding. +/// Encodes LArc -lzs- (see for the stream layout). /// +/// +/// Matches only reach back into bytes already emitted (never into the space-filled initial ring), +/// and are written as the absolute ring position of their source, as the format requires. Verified by +/// lhasa extracting what this writes. +/// public static class LzsEncoder { - private const int WindowSize = 2048; - private const int WindowMask = WindowSize - 1; - private const int Threshold = 2; - private const int MaxMatch = 17; // 4-bit length + 2 + private const int MaxLength = 15 + LzsDecoder.Threshold; - /// - /// Encodes data using the -lzs- format. - /// - /// The data to compress. - /// The compressed data. - public static byte[] Encode(ReadOnlySpan data) - => Encode(data.ToArray()); + /// Encodes . + public static byte[] Encode(ReadOnlySpan data) => Encode(data.ToArray()); - /// - /// Encodes data using the -lzs- format. - /// - /// The data to compress. - /// The compressed data. + /// Encodes . public static byte[] Encode(byte[] data) { - var window = new byte[WindowSize]; - Array.Fill(window, (byte)0x20); - var windowPos = 0; - - using var output = new MemoryStream(); - var srcPos = 0; - - while (srcPos < data.Length) { - var flagPos = (int)output.Position; - output.WriteByte(0); // placeholder for flag byte - var flags = 0; - - for (var bit = 0; bit < 8 && srcPos < data.Length; ++bit) { - // Find best match in window - var bestLen = 0; - var bestOff = 0; - - for (var off = 1; off < WindowSize && off <= srcPos; ++off) { - var matchPos = (windowPos - off) & WindowMask; - var len = 0; - while (len < MaxMatch && srcPos + len < data.Length - && window[(matchPos + len) & WindowMask] == data[srcPos + len]) - ++len; - - if (len > bestLen) { - bestLen = len; - bestOff = matchPos; - } - } - - if (bestLen >= Threshold) { - // Match: encode offset + length - var b1 = bestOff & 0xFF; - var b2 = ((bestOff >> 3) & 0xE0) | ((bestLen - Threshold) & 0x0F); - output.WriteByte((byte)b1); - output.WriteByte((byte)b2); - - for (var j = 0; j < bestLen; ++j) { - window[windowPos] = data[srcPos++]; - windowPos = (windowPos + 1) & WindowMask; - } - } else { - // Literal - flags |= 1 << bit; - output.WriteByte(data[srcPos]); - window[windowPos] = data[srcPos++]; - windowPos = (windowPos + 1) & WindowMask; - } + ArgumentNullException.ThrowIfNull(data); + using var ms = new MemoryStream(); + var bits = new BitWriter(ms); + var finder = new LhaMatchFinder(data, LzsDecoder.RingSize - 1, 3, MaxLength); + var pos = 0; + while (pos < data.Length) { + var (length, distance) = finder.Find(pos); + if (length == 0) { + bits.WriteBit(1); + bits.WriteBits(data[pos], 8); + ++pos; + continue; } - - // Patch flag byte - var savedPos = output.Position; - output.Position = flagPos; - output.WriteByte((byte)flags); - output.Position = savedPos; + var ringPos = (LzsDecoder.RingSize - LzsDecoder.StartOffset + pos - distance) % LzsDecoder.RingSize; + bits.WriteBit(0); + bits.WriteBits((uint)ringPos, 11); + bits.WriteBits((uint)(length - LzsDecoder.Threshold), 4); + pos += length; } - - return output.ToArray(); + bits.FlushBits(); + return ms.ToArray(); } } diff --git a/Compression.Core/Dictionary/Lzh/Pm1Decoder.cs b/Compression.Core/Dictionary/Lzh/Pm1Decoder.cs new file mode 100644 index 000000000..5c8a75608 --- /dev/null +++ b/Compression.Core/Dictionary/Lzh/Pm1Decoder.cs @@ -0,0 +1,171 @@ +namespace Compression.Core.Dictionary.Lzh; + +/// +/// Decodes PMarc -pm1-: alternating runs of literals and copies over a 16 KiB window, all +/// coded with fixed (static) prefix codes whose reach grows with the amount of output. +/// +/// +/// A 5-bit header selects one of 32 small trees that code the literal-range index; literals are +/// distances along a move-to-front history (). Each command is either a copy +/// (flag 0) or a block of 1-216 literals that, unless at its maximum length, is followed by a copy. +/// Copy distances use ranges that open up after 64, 320, 576, 832, ... bytes of output. +/// Sourcing: converted from lhasa's pm1_decoder.c (ISC, Simon Howard; reverse-engineered +/// there from the UNPMA10 decoder), tables copied exactly; see THIRD-PARTY-NOTICE.lhasa.txt beside this +/// file. Checked against the -pm1- archives of lhasa's test suite. Like the reference, input past +/// the end of the member reads as zero bytes. +/// +public static class Pm1Decoder { + private const int RingSize = 16384; + private const int MaxByteBlock = 216; + + private static readonly (int Offset, int Bits)[] CopyRanges = [ + (0, 6), (64, 8), (0, 6), (64, 9), (576, 11), (2624, 13), + (64, 8), + (576, 8), (576, 9), (576, 10), + (2624, 8), (2624, 9), (2624, 10), (2624, 11), (2624, 12), + ]; + + private static readonly (int Offset, int Bits)[] ByteRanges = [(0, 4), (16, 4), (32, 5), (64, 6), (128, 6), (192, 6)]; + + private static readonly byte[][] ByteDecodeTrees = [ + [0x12, 0x2d, 0xef, 0x1c, 0xab], [0x12, 0x23, 0xde, 0xab, 0xcf], [0x12, 0x2c, 0xd2, 0xab, 0xef], + [0x12, 0xa2, 0xd2, 0xbc, 0xef], [0x12, 0xa2, 0xc2, 0xbd, 0xef], [0x12, 0xa2, 0xcd, 0xb1, 0xef], + [0x12, 0xab, 0x12, 0xcd, 0xef], [0x12, 0xab, 0x1d, 0xc1, 0xef], [0x12, 0xab, 0xc1, 0xd1, 0xef], + [0xa1, 0x12, 0x2c, 0xde, 0xbf], [0xa1, 0x1d, 0x1c, 0xb1, 0xef], [0xa1, 0x12, 0x2d, 0xef, 0xbc], + [0xa1, 0x12, 0xb2, 0xde, 0xcf], [0xa1, 0x12, 0xbc, 0xd1, 0xef], [0xa1, 0x1c, 0xb1, 0xd1, 0xef], + [0xa1, 0xb1, 0x12, 0xcd, 0xef], [0xa1, 0xb1, 0xc1, 0xd1, 0xef], [0x12, 0x1c, 0xde, 0xab], + [0x12, 0xa2, 0xcd, 0xbe], [0x12, 0xab, 0xc1, 0xde], [0xa1, 0x1d, 0x1c, 0xbe], + [0xa1, 0x12, 0xbc, 0xde], [0xa1, 0x1c, 0xb1, 0xde], [0xa1, 0xb1, 0xc1, 0xde], + [0x1d, 0x1c, 0xab], [0x1c, 0xa1, 0xbd], [0x12, 0xab, 0xcd], + [0xa1, 0x1c, 0xbd], [0xa1, 0xb1, 0xcd], [0xa1, 0xbc], + [0xab], [0x00], + ]; + + /// Decodes bytes of -pm1- data. + /// The stream is damaged. + public static byte[] Decode(byte[] compressed, int originalSize) { + ArgumentNullException.ThrowIfNull(compressed); + ArgumentOutOfRangeException.ThrowIfNegative(originalSize); + return new State(compressed, originalSize).Run(); + } + + private sealed class State(byte[] compressed, int originalSize) { + private readonly LhaBitInput _bits = new(compressed); + private readonly byte[] _output = new byte[originalSize]; + private readonly byte[] _ring = new byte[RingSize]; + private readonly PmaHistory _history = new(); + private byte[] _byteTree = []; + private int _ringPos; + private int _pos; // bytes output so far + + public byte[] Run() { + if (this._output.Length == 0) + return this._output; + this._byteTree = ByteDecodeTrees[this._bits.ReadBits(5)]; + var budget = (long)compressed.Length * 8 + 64 * 1024; // zero-fill reads past the end; bound a runaway + while (this._pos < this._output.Length) { + if (--budget < 0) + throw new InvalidDataException("-pm1- stream does not produce its declared size."); + if (this._bits.ReadBit() == 0) + this.CopyCommand(); + else + this.ByteBlock(); + } + return this._output; + } + + private void Output(byte b) { + this._ring[this._ringPos] = b; + this._ringPos = (this._ringPos + 1) % RingSize; + this._history.Update(b); + if (this._pos < this._output.Length) + this._output[this._pos] = b; + ++this._pos; + } + + private int BitAfter(int threshold, int fallback) => this._pos >= threshold ? this._bits.ReadBit() : fallback; + + private int CopyTypeRange() { + if (this._bits.ReadBit() == 0) + return this.BitAfter(576, 0) != 0 ? 4 : this.BitAfter(64, 0); + if (this.BitAfter(64, 1) == 0) + return 3; + return this.BitAfter(2624, 1) != 0 ? 2 : 5; + } + + private int CopyCount() { + var x = this._bits.ReadBits(2); + if (x < 3) return x + 3; + x = this._bits.ReadBits(3); + if (x < 5) return x + 6; + if (x == 5) return this._bits.ReadBits(2) + 11; + if (x == 6) return this._bits.ReadBits(3) + 15; + x = this._bits.ReadBits(6); + if (x < 62) return x + 23; + return x == 62 ? this._bits.ReadBits(5) + 85 : this._bits.ReadBits(7) + 117; + } + + private void CopyCommand() { + var range = this.CopyTypeRange(); + var count = range < 2 ? 2 : this.CopyCount(); + range = range switch { + 3 when this._pos < 320 => 6, + 4 when this._pos < 832 => 7, + 4 when this._pos < 1088 => 8, + 4 when this._pos < 1600 => 9, + 5 when this._pos < 2880 => 10, + 5 when this._pos < 3136 => 11, + 5 when this._pos < 3648 => 12, + 5 when this._pos < 4672 => 13, + 5 when this._pos < 6720 => 14, + _ => range, + }; + var distance = CopyRanges[range].Offset + this._bits.ReadBits(CopyRanges[range].Bits); + if (distance >= this._pos) + throw new InvalidDataException("-pm1- copy reaches before the start of the output."); + var index = (this._ringPos + RingSize - distance - 1) % RingSize; + for (var i = 0; i < count; ++i) { + this.Output(this._ring[index]); + index = (index + 1) % RingSize; + } + } + + private int ByteDecodeIndex() { + var tree = this._byteTree; + if (tree[0] == 0) + return 0; + var at = 0; + while (true) { + var child = this._bits.ReadBit() == 0 ? (tree[at] >> 4) & 0x0F : tree[at] & 0x0F; + if (child >= 10) + return child - 10; + at += child; + if (at >= tree.Length) + throw new InvalidDataException("-pm1- literal tree walk leaves its table."); + } + } + + private int ByteBlockCount() { + var x = this._bits.ReadBits(2); + if (x < 3) return x + 1; + x = this._bits.ReadBits(3); + if (x < 7) return x + 4; + x = this._bits.ReadBits(4); + if (x < 14) return x + 11; + return x == 14 ? this._bits.ReadBits(6) + 25 : this._bits.ReadBits(7) + 89; + } + + private void ByteBlock() { + var length = this.ByteBlockCount(); + for (var i = 0; i < length; ++i) { + var index = this.ByteDecodeIndex(); + if (index >= ByteRanges.Length) + throw new InvalidDataException("-pm1- literal range is out of range."); + var count = ByteRanges[index].Offset + this._bits.ReadBits(ByteRanges[index].Bits); + this.Output(this._history.Find(count)); + } + if (length != MaxByteBlock && this._pos < this._output.Length) + this.CopyCommand(); + } + } +} diff --git a/Compression.Core/Dictionary/Lzh/Pm2Decoder.cs b/Compression.Core/Dictionary/Lzh/Pm2Decoder.cs new file mode 100644 index 000000000..7c0e829da --- /dev/null +++ b/Compression.Core/Dictionary/Lzh/Pm2Decoder.cs @@ -0,0 +1,219 @@ +namespace Compression.Core.Dictionary.Lzh; + +/// +/// Decodes PMarc -pm2-: LZSS over an 8 KiB window with literals coded against a move-to-front +/// history and two small Huffman trees that are re-sent as the stream grows. +/// +/// +/// The first bit is discarded. A code tree (up to 29 symbols) is read; codes 0-7 select a literal +/// range in the history (), codes 8+ a copy whose length is 2-16 directly or a +/// variable-length value, and whose distance uses an offset tree of 5 to 8 symbols. The trees are rebuilt +/// after 1, 2 and 4 KiB of output and then every 4 KiB, each time with a flag bit saying whether a new +/// code tree follows. +/// Sourcing: converted from lhasa's pm2_decoder.c and tree_decode.c (ISC, Simon +/// Howard), tables copied exactly; see THIRD-PARTY-NOTICE.lhasa.txt beside this file. Checked against +/// the -pm2- archives of lhasa's test suite. +/// +public static class Pm2Decoder { + private const int RingSize = 8192; + private const int CodeTreeElements = 65; + private const int OffsetTreeElements = 17; + private const byte LeafFlag = 0x80; + + private static readonly (int Offset, int Bits)[] HistoryDecode = + [(0, 3), (8, 3), (16, 4), (32, 5), (64, 5), (96, 5), (128, 6), (192, 6)]; + + private static readonly (int Offset, int Bits)[] CopyDecode = + [(17, 3), (25, 3), (33, 5), (65, 6), (129, 7), (256, 0)]; + + /// Decodes bytes of -pm2- data. + /// The stream is damaged. + public static byte[] Decode(byte[] compressed, int originalSize) { + ArgumentNullException.ThrowIfNull(compressed); + ArgumentOutOfRangeException.ThrowIfNegative(originalSize); + return new State(compressed, originalSize).Run(); + } + + private enum Rebuild { Unbuilt, Build1, Build2, Build3, Continuing } + + private sealed class State(byte[] compressed, int originalSize) { + private readonly LhaBitInput _bits = new(compressed); + private readonly byte[] _output = new byte[originalSize]; + private readonly byte[] _ring = Filled(RingSize, (byte)' '); + private readonly PmaHistory _history = new(); + private readonly byte[] _codeTree = Filled(CodeTreeElements, LeafFlag); + private readonly byte[] _offsetTree = Filled(OffsetTreeElements, LeafFlag); + private Rebuild _treeState = Rebuild.Unbuilt; + private int _rebuildRemaining; + private bool _needOffsetTree; + private int _ringPos; + private int _outPos; + + private static byte[] Filled(int length, byte value) { + var a = new byte[length]; + Array.Fill(a, value); + return a; + } + + public byte[] Run() { + if (this._output.Length == 0) + return this._output; + this._bits.ReadBit(); // the first bit is discarded + this.RebuildTrees(); + while (this._outPos < this._output.Length) { + if (this._bits.Exhausted) + throw new InvalidDataException("-pm2- stream ends before the member is complete."); + var code = ReadFromTree(this._bits, this._codeTree); + if (code < 8) + this.Output(this._history.Find(Variable(HistoryDecode, code))); + else + this.Copy(code - 8); + } + return this._output; + } + + private int Variable((int Offset, int Bits)[] table, int header) { + if (header >= table.Length) + throw new InvalidDataException("-pm2- code is out of range."); + return table[header].Offset + this._bits.ReadBits(table[header].Bits); + } + + private void Output(byte b) { + this._ring[this._ringPos] = b; + this._ringPos = (this._ringPos + 1) % RingSize; + if (this._outPos < this._output.Length) + this._output[this._outPos] = b; + ++this._outPos; + this._history.Update(b); + if (--this._rebuildRemaining == 0) + this.RebuildTrees(); + } + + private void Copy(int code) { + var count = code < 15 ? code + 2 : this.Variable(CopyDecode, code - 15); + int offset; + if (code == 0) + offset = this._bits.ReadBits(6); + else if (code < 20) { + var val = ReadFromTree(this._bits, this._offsetTree); + offset = val == 0 ? this._bits.ReadBits(6) : (1 << (val + 5)) + this._bits.ReadBits(val + 5); + } else + offset = 0; + var start = this._ringPos + RingSize - 1 - offset; + for (var i = 0; i < count; ++i) + this.Output(this._ring[(start + i) % RingSize]); + } + + private void RebuildTrees() { + switch (this._treeState) { + case Rebuild.Unbuilt: + this.ReadCodeTree(); + this.ReadOffsetTree(5); + this._treeState = Rebuild.Build1; + this._rebuildRemaining = 1024; + break; + case Rebuild.Build1: + this.ReadOffsetTree(6); + this._treeState = Rebuild.Build2; + this._rebuildRemaining = 1024; + break; + case Rebuild.Build2: + this.ReadOffsetTree(7); + this._treeState = Rebuild.Build3; + this._rebuildRemaining = 2048; + break; + case Rebuild.Build3: + if (this._bits.ReadBit() == 1) + this.ReadCodeTree(); + this.ReadOffsetTree(8); + this._treeState = Rebuild.Continuing; + this._rebuildRemaining = 4096; + break; + default: + if (this._bits.ReadBit() == 1) { + this.ReadCodeTree(); + this.ReadOffsetTree(8); + } + this._rebuildRemaining = 4096; + break; + } + } + + private void ReadCodeTree() { + var numCodes = this._bits.ReadBits(5); + var minCodeLength = this._bits.ReadBits(3); + if (numCodes > 29) + throw new InvalidDataException("-pm2- code tree has more than 29 codes."); + this._needOffsetTree = numCodes >= 10 && !(numCodes == 29 && minCodeLength == 0); + if (minCodeLength == 0) { + this._codeTree[0] = (byte)((numCodes - 1) | LeafFlag); + return; + } + var lengthBits = this._bits.ReadBits(3); + var lengths = new byte[numCodes]; + for (var i = 0; i < numCodes; ++i) { + var val = this._bits.ReadBits(lengthBits); + lengths[i] = val == 0 ? (byte)0 : (byte)(minCodeLength + val - 1); + } + BuildTree(this._codeTree, lengths); + } + + private void ReadOffsetTree(int numOffsets) { + if (!this._needOffsetTree) + return; + var lengths = new byte[numOffsets]; + int numCodes = 0, single = 0; + for (var off = 0; off < numOffsets; ++off) { + lengths[off] = (byte)this._bits.ReadBits(3); + if (lengths[off] != 0) { + single = off; + ++numCodes; + } + } + if (numCodes == 1) { + this._offsetTree[0] = (byte)(single | LeafFlag); + return; + } + BuildTree(this._offsetTree, lengths); + } + } + + /// Builds a canonical tree breadth-first: shorter codes take the earlier slots at each depth. + internal static void BuildTree(byte[] tree, byte[] lengths) { + int nextEntry = 0, allocated = 1, codeLength = 0; + bool remaining; + do { + // Expand every open slot into a branch with two children, one level deeper. + var newNodes = (allocated - nextEntry) * 2; + if (allocated + newNodes <= tree.Length) { + var end = allocated; + while (nextEntry < end) { + tree[nextEntry] = (byte)allocated; + allocated += 2; + ++nextEntry; + } + } + ++codeLength; + remaining = false; + for (var i = 0; i < lengths.Length; ++i) { + if (lengths[i] == codeLength) { + if (nextEntry >= allocated) + continue; // over-subscribed: the reference ignores the code + tree[nextEntry++] = (byte)(i | LeafFlag); + } else if (lengths[i] > codeLength) + remaining = true; + } + } while (remaining); + } + + internal static int ReadFromTree(LhaBitInput bits, byte[] tree) { + var code = tree[0]; + while ((code & LeafFlag) == 0) { + var index = code + bits.ReadBit(); + if (index >= tree.Length) + throw new InvalidDataException("-pm2- tree walk leaves the tree."); + code = tree[index]; + } + return code & ~LeafFlag; + } +} diff --git a/Compression.Core/Dictionary/Lzh/PmaDecoder.cs b/Compression.Core/Dictionary/Lzh/PmaDecoder.cs deleted file mode 100644 index 647aa4ccb..000000000 --- a/Compression.Core/Dictionary/Lzh/PmaDecoder.cs +++ /dev/null @@ -1,32 +0,0 @@ -using Compression.Core.Entropy.Ppmd; - -namespace Compression.Core.Dictionary.Lzh; - -/// -/// Decodes data compressed with the PMA (Prediction by Matching of Algorithms) method -/// used in LHA archives with methods -pm1- and -pm2-. -/// PMA uses PPMd (Prediction by Partial Matching) context modeling with arithmetic coding. -/// -public static class PmaDecoder { - /// - /// Decodes PMA-compressed data. - /// - /// The compressed data. - /// The expected decompressed size. - /// Context order: 2 for -pm1-, 3 for -pm2-. - /// The decompressed data. - public static byte[] Decode(byte[] compressed, int originalSize, int order) { - if (originalSize == 0) - return []; - - using var ms = new MemoryStream(compressed); - var decoder = new PpmdRangeDecoder(ms); - var model = new PpmdModelH(order); - - var output = new byte[originalSize]; - for (var i = 0; i < originalSize; ++i) - output[i] = model.DecodeSymbol(decoder); - - return output; - } -} diff --git a/Compression.Core/Dictionary/Lzh/PmaEncoder.cs b/Compression.Core/Dictionary/Lzh/PmaEncoder.cs deleted file mode 100644 index e14af2e37..000000000 --- a/Compression.Core/Dictionary/Lzh/PmaEncoder.cs +++ /dev/null @@ -1,31 +0,0 @@ -using Compression.Core.Entropy.Ppmd; - -namespace Compression.Core.Dictionary.Lzh; - -/// -/// Encodes data using the PMA (Prediction by Matching of Algorithms) method -/// used in LHA archives with methods -pm1- and -pm2-. -/// PMA uses PPMd (Prediction by Partial Matching) context modeling with arithmetic coding. -/// -public static class PmaEncoder { - /// - /// Encodes data using PMA compression. - /// - /// The data to compress. - /// Context order: 2 for -pm1-, 3 for -pm2-. - /// The compressed data. - public static byte[] Encode(ReadOnlySpan data, int order) { - if (data.Length == 0) - return []; - - using var ms = new MemoryStream(); - var encoder = new PpmdRangeEncoder(ms); - var model = new PpmdModelH(order); - - for (var i = 0; i < data.Length; ++i) - model.EncodeSymbol(encoder, data[i]); - - encoder.Finish(); - return ms.ToArray(); - } -} diff --git a/Compression.Core/Dictionary/Lzh/PmaHistory.cs b/Compression.Core/Dictionary/Lzh/PmaHistory.cs new file mode 100644 index 000000000..2faf182a6 --- /dev/null +++ b/Compression.Core/Dictionary/Lzh/PmaHistory.cs @@ -0,0 +1,60 @@ +namespace Compression.Core.Dictionary.Lzh; + +/// +/// The move-to-front byte history PMarc's -pm1- and -pm2- code literals against: a +/// literal is sent as how far back along this ring of all 256 byte values it lies from the last byte +/// written, and every byte written moves to the front. +/// +/// +/// The ring starts as 0x20-0x7F, 0x00-0x1F, 0xA0-0xDF, 0x80-0x9F, 0xE0-0xFF. Sourcing: converted from +/// lhasa's pma_common.c (ISC, Simon Howard); see THIRD-PARTY-NOTICE.lhasa.txt beside this file. +/// +internal sealed class PmaHistory { + private readonly byte[] _prev = new byte[256]; + private readonly byte[] _next = new byte[256]; + private byte _head; + + public PmaHistory() { + for (var i = 0; i < 256; ++i) { + this._prev[i] = (byte)(i + 1); + this._next[i] = (byte)(i - 1); + } + this._head = 0x20; + this.Link(0x7F, 0x00); + this.Link(0x1F, 0xA0); + this.Link(0xDF, 0x80); + this.Link(0x9F, 0xE0); + this.Link(0xFF, 0x20); + } + + private void Link(byte from, byte to) { + this._prev[from] = to; + this._next[to] = from; + } + + /// Returns the byte steps back from the most recent one. + public byte Find(int count) { + var code = this._head; + if (count < 128) + for (var i = 0; i < count; ++i) + code = this._prev[code]; + else + for (var i = 0; i < 256 - count; ++i) + code = this._next[code]; + return code; + } + + /// Moves to the front. + public void Update(byte b) { + if (this._head == b) + return; + this._next[this._prev[b]] = this._next[b]; + this._prev[this._next[b]] = this._prev[b]; + var oldHead = this._head; + this._prev[b] = oldHead; + this._next[b] = this._next[oldHead]; + this._prev[this._next[oldHead]] = b; + this._next[oldHead] = b; + this._head = b; + } +} diff --git a/Compression.Core/Dictionary/Lzh/THIRD-PARTY-NOTICE.lhasa.txt b/Compression.Core/Dictionary/Lzh/THIRD-PARTY-NOTICE.lhasa.txt new file mode 100644 index 000000000..a44a0b9f4 --- /dev/null +++ b/Compression.Core/Dictionary/Lzh/THIRD-PARTY-NOTICE.lhasa.txt @@ -0,0 +1,36 @@ +lhasa (LHA-family decoders) - converted to C# + +Source: https://github.com/fragglet/lhasa +Revision: 75ed83559f23e9538e0045c62f53f77ab03d03d6 (master, 2026-06-17) +Author: Simon Howard +Licence: ISC (reproduced below) + +Copyright (c) 2011-2025, Simon Howard + +Permission to use, copy, modify, and/or distribute this software +for any purpose with or without fee is hereby granted, provided +that the above copyright notice and this permission notice appear +in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL +WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE +AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR +CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, +NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +Files converted (decoders only; lhasa has no encoders): + + lib/lh1_decoder.c -> Lh1Tree.cs, Lh1Decoder.cs + lib/lzs_decoder.c -> LzsDecoder.cs + lib/lz5_decoder.c -> Lz5Decoder.cs (initial ring contents copied exactly) + lib/pm1_decoder.c -> Pm1Decoder.cs (tables copied exactly) + lib/pm2_decoder.c, tree_decode.c -> Pm2Decoder.cs (tables copied exactly) + lib/pma_common.c -> PmaHistory.cs + lib/bit_stream_reader.c -> LhaBitInput.cs + +The -lh1-, -lzs- and -lz5- encoders (Lh1Encoder.cs, LzsEncoder.cs, Lz5Encoder.cs) +are our own, built to the bit streams these decoders read and verified by lhasa +extracting what they write. diff --git a/Compression.Core/REFERENCE.md b/Compression.Core/REFERENCE.md index ecc3be136..02761f7a1 100644 --- a/Compression.Core/REFERENCE.md +++ b/Compression.Core/REFERENCE.md @@ -1484,25 +1484,25 @@ Implements `IBuildingBlock`. ### Namespace `Compression.Core.Dictionary.Lzh` -[`Lh1Decoder`](#lh1decoder) · [`Lh1Encoder`](#lh1encoder) · [`Lh2Decoder`](#lh2decoder) · [`Lh3Decoder`](#lh3decoder) · [`Lz5Decoder`](#lz5decoder) · [`Lz5Encoder`](#lz5encoder) · [`LzhBuildingBlock`](#lzhbuildingblock) · [`LzhConstants`](#lzhconstants) · [`LzhDecoder`](#lzhdecoder) · [`LzhEncoder`](#lzhencoder) · [`LzsDecoder`](#lzsdecoder) · [`LzsEncoder`](#lzsencoder) · [`PmaDecoder`](#pmadecoder) · [`PmaEncoder`](#pmaencoder) +[`Lh1Decoder`](#lh1decoder) · [`Lh1Encoder`](#lh1encoder) · [`Lh2Decoder`](#lh2decoder) · [`Lh3Decoder`](#lh3decoder) · [`Lz5Decoder`](#lz5decoder) · [`Lz5Encoder`](#lz5encoder) · [`LzhBuildingBlock`](#lzhbuildingblock) · [`LzhConstants`](#lzhconstants) · [`LzhDecoder`](#lzhdecoder) · [`LzhEncoder`](#lzhencoder) · [`LzsDecoder`](#lzsdecoder) · [`LzsEncoder`](#lzsencoder) · [`Pm1Decoder`](#pm1decoder) · [`Pm2Decoder`](#pm2decoder) #### `Lh1Decoder` -Decodes LHA -lh1- compressed data. Uses a 4KB sliding window with dynamic (adaptive) Huffman coding. +Decodes LHarc `-lh1-`: LZSS over a 4 KiB window with an adaptive Huffman tree for literals and copy lengths, and a fixed code for the high six bits of the copy distance. | Member | Signature | Summary | | --- | --- | --- | -| `Lh1Decoder` | `Lh1Decoder(Stream input)` | Initializes a new `Lh1Decoder`. | -| `Decode` | `byte[] Decode(int originalSize)` | Decodes the compressed data. | +| `Lh1Decoder` | `Lh1Decoder(Stream input)` | Initializes a new `Lh1Decoder` over the rest of `input`. | +| `Decode` | `byte[] Decode(int originalSize)` | Decodes `originalSize` bytes. | #### `Lh1Encoder` -Encodes data using the LHA -lh1- adaptive Huffman method. +Encodes LHarc `-lh1-` (see `Lh1Decoder`): greedy LZSS matches over a 4 KiB window, coded through the same adaptive `Lh1Tree` the decoder evolves. | Member | Signature | Summary | | --- | --- | --- | | `Lh1Encoder` | `Lh1Encoder()` | | -| `Encode` | `static byte[] Encode(ReadOnlySpan data)` | Compresses data using the -lh1- algorithm. | +| `Encode` | `static byte[] Encode(ReadOnlySpan data)` | Encodes `data`. | #### `Lh2Decoder` @@ -1522,21 +1522,21 @@ Decodes LHA `-lh3-`: LZSS over an 8 KiB window with static Huffman trees sent pe #### `Lz5Decoder` -Decodes -lz5- compressed data (LArc variant). Uses LZSS with a 4KB sliding window, no Huffman coding. +Decodes LArc `-lz5-`: LZSS over a 4 KiB ring buffer, byte-aligned. | Member | Signature | Summary | | --- | --- | --- | -| `Decode` | `static byte[] Decode(ReadOnlySpan compressed, int originalSize)` | Decodes -lz5- compressed data. | -| `Decode` | `static byte[] Decode(byte[] compressed, int originalSize)` | Decodes -lz5- compressed data. | +| `Decode` | `static byte[] Decode(ReadOnlySpan compressed, int originalSize)` | Decodes `originalSize` bytes of `-lz5-` data. | +| `Decode` | `static byte[] Decode(byte[] compressed, int originalSize)` | Decodes `originalSize` bytes of `-lz5-` data. | #### `Lz5Encoder` -Encodes data using the -lz5- format (LArc variant). Plain LZSS with a 4KB sliding window, no Huffman coding. +Encodes LArc `-lz5-` (see `Lz5Decoder` for the stream layout). | Member | Signature | Summary | | --- | --- | --- | -| `Encode` | `static byte[] Encode(ReadOnlySpan data)` | Encodes data using the -lz5- format. | -| `Encode` | `static byte[] Encode(byte[] data)` | Encodes data using the -lz5- format. | +| `Encode` | `static byte[] Encode(ReadOnlySpan data)` | Encodes `data`. | +| `Encode` | `static byte[] Encode(byte[] data)` | Encodes `data`. | #### `LzhBuildingBlock` @@ -1601,37 +1601,37 @@ Encodes data using LZH compression (methods -lh5-, -lh6-, -lh7-). Uses LZSS with #### `LzsDecoder` -Decodes -lzs- compressed data (LArc format). Uses plain LZSS with a 2KB sliding window, no Huffman coding. +Decodes LArc `-lzs-`: LZSS over a 2 KiB ring buffer, with no entropy coding. | Member | Signature | Summary | | --- | --- | --- | -| `Decode` | `static byte[] Decode(ReadOnlySpan compressed, int originalSize)` | Decodes -lzs- compressed data. | -| `Decode` | `static byte[] Decode(byte[] compressed, int originalSize)` | Decodes -lzs- compressed data. | +| `Decode` | `static byte[] Decode(ReadOnlySpan compressed, int originalSize)` | Decodes `originalSize` bytes of `-lzs-` data. | +| `Decode` | `static byte[] Decode(byte[] compressed, int originalSize)` | Decodes `originalSize` bytes of `-lzs-` data. | #### `LzsEncoder` -Encodes data using the -lzs- format (LArc). Plain LZSS with a 2KB sliding window, no Huffman coding. +Encodes LArc `-lzs-` (see `LzsDecoder` for the stream layout). | Member | Signature | Summary | | --- | --- | --- | -| `Encode` | `static byte[] Encode(ReadOnlySpan data)` | Encodes data using the -lzs- format. | -| `Encode` | `static byte[] Encode(byte[] data)` | Encodes data using the -lzs- format. | +| `Encode` | `static byte[] Encode(ReadOnlySpan data)` | Encodes `data`. | +| `Encode` | `static byte[] Encode(byte[] data)` | Encodes `data`. | -#### `PmaDecoder` +#### `Pm1Decoder` -Decodes data compressed with the PMA (Prediction by Matching of Algorithms) method used in LHA archives with methods -pm1- and -pm2-. PMA uses PPMd (Prediction by Partial Matching) context modeling with arithmetic coding. +Decodes PMarc `-pm1-`: alternating runs of literals and copies over a 16 KiB window, all coded with fixed (static) prefix codes whose reach grows with the amount of output. | Member | Signature | Summary | | --- | --- | --- | -| `Decode` | `static byte[] Decode(byte[] compressed, int originalSize, int order)` | Decodes PMA-compressed data. | +| `Decode` | `static byte[] Decode(byte[] compressed, int originalSize)` | Decodes `originalSize` bytes of `-pm1-` data. | -#### `PmaEncoder` +#### `Pm2Decoder` -Encodes data using the PMA (Prediction by Matching of Algorithms) method used in LHA archives with methods -pm1- and -pm2-. PMA uses PPMd (Prediction by Partial Matching) context modeling with arithmetic coding. +Decodes PMarc `-pm2-`: LZSS over an 8 KiB window with literals coded against a move-to-front history and two small Huffman trees that are re-sent as the stream grows. | Member | Signature | Summary | | --- | --- | --- | -| `Encode` | `static byte[] Encode(ReadOnlySpan data, int order)` | Encodes data using PMA compression. | +| `Decode` | `static byte[] Decode(byte[] compressed, int originalSize)` | Decodes `originalSize` bytes of `-pm2-` data. | ### Namespace `Compression.Core.Dictionary.Lzham` diff --git a/Compression.NativeUI/Views/CreateOptionsViewModel.cs b/Compression.NativeUI/Views/CreateOptionsViewModel.cs index ee1d767e2..dce6dfd6b 100644 --- a/Compression.NativeUI/Views/CreateOptionsViewModel.cs +++ b/Compression.NativeUI/Views/CreateOptionsViewModel.cs @@ -408,12 +408,6 @@ public string HintText { (F.Lzh, "pm0") => "pm0: PMA store mode — no compression. PMA-compatible container format.\n" + "Opens with: PMarc, Unlha32.dll", - (F.Lzh, "pm1") => - "pm1: PMA with PPMd order-2 prediction. Good for text files.\n" - + "Opens with: PMarc, Unlha32.dll", - (F.Lzh, "pm2") => - "pm2: PMA with PPMd order-3 prediction. Best LHA method for text and source code.\n" - + "Opens with: PMarc, Unlha32.dll", (F.Lzh, _) => "lh5 (8 KB) is the standard default. lh7 (64 KB) gives best general compression. " + "pm2 uses PPMd and excels on text. lh1-lh3 are legacy adaptive Huffman.\n" @@ -556,8 +550,7 @@ private void PopulateMethods() { "lh5 (default, 8 KB)", "lh7 (64 KB)", "lh6 (32 KB)", "lh4 (4 KB)", "lh1 (adaptive Huffman 4 KB)", "lh0 (store)", "lzs (LZSS 2 KB)", "lz5 (LZSS 4 KB)", - "pm0 (PMA store)", "pm1 (PMA PPMd order-2)", "pm2 (PMA PPMd order-3)", - "pm2 (PPMd order-3)", "pm1 (PPMd order-2)", "pm0 (PMA store)"], + "pm0 (PMA store)"], F.Arj => [ "Method 1 (default, best)", "Method 2", "Method 3 (fastest)", "Store"], F.Arc => [ diff --git a/Compression.Tests/Compression.Tests.csproj b/Compression.Tests/Compression.Tests.csproj index 37d03e897..67f6c0399 100644 --- a/Compression.Tests/Compression.Tests.csproj +++ b/Compression.Tests/Compression.Tests.csproj @@ -139,7 +139,8 @@ XarVectors.%(Filename)%(Extension) - + + LzhVectors.%(Filename)%(Extension) diff --git a/Compression.Tests/Lzh/LhaHeaderVectorTests.cs b/Compression.Tests/Lzh/LhaHeaderVectorTests.cs new file mode 100644 index 000000000..ae2f18d36 --- /dev/null +++ b/Compression.Tests/Lzh/LhaHeaderVectorTests.cs @@ -0,0 +1,55 @@ +using System.Reflection; +using FileFormat.Lzh; + +namespace Compression.Tests.Lzh; + +/// +/// Header levels 1 and 3 and directory names, from archives in lhasa's test suite written by LHA for +/// Amiga 1.22 and LHA OS/2 2.08 (see ReferenceVectors/README.md). Each member must land at the data its +/// header describes, which the CRC-16 check on extraction proves. +/// +[TestFixture] +public class LhaHeaderVectorTests { + private static byte[] Vector(string name) { + using var s = Assembly.GetExecutingAssembly().GetManifestResourceStream("LzhVectors." + name) + ?? throw new FileNotFoundException("Embedded LHA vector missing: " + name); + using var ms = new MemoryStream(); + s.CopyTo(ms); + return ms.ToArray(); + } + + private static List<(LhaEntry Entry, byte[] Data)> ExtractAll(string vector) { + using var reader = new LhaReader(new MemoryStream(Vector(vector))); + return reader.Entries.Select(e => (e, reader.ExtractEntry(e))).ToList(); + } + + [Test, Category("HappyPath")] + public void Level1_ExtendedHeaders_GiveTheDirectoryAndTheDataStart() { + var member = ExtractAll("lha_amiga_122_level1.lzh").Single(); + Assert.That(member.Entry.HeaderLevel, Is.EqualTo(1)); + Assert.That(member.Entry.FileName, Is.EqualTo("subdir/subdir2/hello.txt")); + } + + [Test, Category("HappyPath")] + public void Level3_ExtendedHeaders_GiveTheDirectory() { + var member = ExtractAll("lha_os2_208_h3_subdir.lzh").Single(m => m.Entry.FileName.EndsWith("HELLO.TXT", StringComparison.Ordinal)); + Assert.That(member.Entry.FileName, Is.EqualTo("subdir/subdir2/HELLO.TXT")); + } + + [Test, Category("EdgeCase")] + public void AmigaArchive_WithDirectoriesStoredAsLh0_ReadsEveryFile() { + var names = ExtractAll("lha_amiga_122_lh0_dirs_bug.lzh").Select(m => m.Entry.FileName).ToList(); + Assert.That(names, Does.Contain("MainDir/00_File.txt")); + Assert.That(names, Does.Contain("MainDir/03_Dir/File01.txt")); + } + + [Test, Category("EdgeCase")] + public void TruncatedLastMember_IsListedButFailsToExtract() { + var archive = Vector("lha_os2_208_h3_subdir.lzh"); + using var full = new LhaReader(new MemoryStream(archive)); + var last = full.Entries[^1]; + using var reader = new LhaReader(new MemoryStream(archive[..(int)(last.DataOffset + last.CompressedSize - 1)])); + Assert.That(reader.Entries, Has.Count.EqualTo(full.Entries.Count)); + Assert.Catch(() => reader.ExtractEntry(reader.Entries[^1])); + } +} diff --git a/Compression.Tests/Lzh/LhaOracleTests.cs b/Compression.Tests/Lzh/LhaOracleTests.cs new file mode 100644 index 000000000..2107f487e --- /dev/null +++ b/Compression.Tests/Lzh/LhaOracleTests.cs @@ -0,0 +1,86 @@ +#pragma warning disable CS1591 +using FileFormat.Lzh; + +namespace Compression.Tests.Lzh; + +/// +/// Every method and header level our LHA writer produces must extract in lhasa (lha), the +/// reference reader of the LHA family; and archives lhasa's own test suite holds must read here. +/// +[TestFixture] +[Category("ExternalInterop")] +public class LhaOracleTests { + private string _dir = null!; + + [SetUp] + public void SetUp() { + this._dir = Path.Combine(Path.GetTempPath(), "cwb_lha_" + Guid.NewGuid().ToString("N")[..8]); + Directory.CreateDirectory(this._dir); + } + + [TearDown] + public void TearDown() { + try { Directory.Delete(this._dir, true); } catch { /* best effort */ } + } + + private static void RequireLha() { + if (!FsInteropToolbox.WslAvailable) + Assert.Ignore("WSL not available."); + if (!FsInteropToolbox.WslHasTool("lha")) + Assert.Ignore("lha is not installed. Run inside WSL / on Linux: `sudo apt install -y lhasa`."); + } + + private static Dictionary Inputs() { + var text = System.Text.Encoding.ASCII.GetBytes(string.Concat( + Enumerable.Range(1, 2500).Select(i => $"line {i:D5}: the quick brown fox jumps over the lazy dog #{i % 37}\n"))); + var random = new byte[9000]; + new Random(41).NextBytes(random); + return new(StringComparer.Ordinal) { + ["TEXT.TXT"] = text, // > 64 KiB: tree rebuilds, window wraps + ["RANDOM.BIN"] = random, // incompressible: stored fallback + ["REPEAT.BIN"] = [.. random, .. random, .. random], + ["ONE.TXT"] = "a"u8.ToArray(), + ["EMPTY.TXT"] = [], + }; + } + + public static IEnumerable WritableCases() { + string[] methods = [ + LhaConstants.MethodLh0, LhaConstants.MethodLh1, LhaConstants.MethodLh4, LhaConstants.MethodLh5, + LhaConstants.MethodLh6, LhaConstants.MethodLh7, LhaConstants.MethodLz4, LhaConstants.MethodLzs, + LhaConstants.MethodLz5, LhaConstants.MethodPm0, + ]; + foreach (var method in methods) + foreach (var level in new[] { LhaHeaderLevel.Level0, LhaHeaderLevel.Level1, LhaHeaderLevel.Level2 }) + yield return new TestCaseData(method, level).SetName($"Writer_{method.Trim('-')}_{level}_ExtractsInLhasa"); + } + + [TestCaseSource(nameof(WritableCases))] + public void Writer_Output_ExtractsInLhasa(string method, LhaHeaderLevel level) { + RequireLha(); + var inputs = Inputs(); + var generation = method is LhaConstants.MethodLz4 or LhaConstants.MethodLzs or LhaConstants.MethodLz5 + ? LhaArchiverGeneration.LArc + : method == LhaConstants.MethodPm0 ? LhaArchiverGeneration.PmArc1 : LhaArchiverGeneration.Extended; + var writer = new LhaWriter(method, generation, level); + foreach (var (name, data) in inputs) + writer.AddFile(name, data); + var archive = Path.Combine(this._dir, "ours.lzh"); + File.WriteAllBytes(archive, writer.ToArray()); + + var into = Path.Combine(this._dir, "out"); + Directory.CreateDirectory(into); + var test = FsInteropToolbox.RunWsl($"lha t {FsInteropToolbox.WinToWsl(archive)}"); + Assert.That(test.ExitCode, Is.EqualTo(0), $"lha t rejected our {method} {level} archive:\n{test.StdOut}\n{test.StdErr}"); + var x = FsInteropToolbox.RunWsl($"cd {FsInteropToolbox.WinToWsl(into)} && lha xq {FsInteropToolbox.WinToWsl(archive)}"); + Assert.That(x.ExitCode, Is.EqualTo(0), $"lha x failed:\n{x.StdOut}\n{x.StdErr}"); + foreach (var (name, data) in inputs) { + var path = Path.Combine(into, name); + if (!File.Exists(path)) + path = Directory.EnumerateFiles(into, "*", SearchOption.AllDirectories) + .FirstOrDefault(f => string.Equals(Path.GetFileName(f), name, StringComparison.OrdinalIgnoreCase)) ?? path; + Assert.That(File.Exists(path), Is.True, $"lha did not extract {name}"); + Assert.That(File.ReadAllBytes(path), Is.EqualTo(data).AsCollection, name); + } + } +} diff --git a/Compression.Tests/Lzh/LhaSuiteVectorTests.cs b/Compression.Tests/Lzh/LhaSuiteVectorTests.cs new file mode 100644 index 000000000..bfc0d54fb --- /dev/null +++ b/Compression.Tests/Lzh/LhaSuiteVectorTests.cs @@ -0,0 +1,61 @@ +using System.Reflection; +using System.Security.Cryptography; +using FileFormat.Lzh; + +namespace Compression.Tests.Lzh; + +/// +/// Archives from lhasa's test suite, written by LHarc 1.13, LArc 3.33, PMarc 1.24 and 2, LHA for +/// Amiga 1.22, LHA OS/2 2.08 and UNLHA32 (see ReferenceVectors/README.md). Every member must pass the +/// CRC-16 its archiver recorded; several of them hold the same GPL-2 text, so the methods must also +/// agree with each other byte for byte. +/// +[TestFixture] +public class LhaSuiteVectorTests { + private static byte[] Vector(string name) { + using var s = Assembly.GetExecutingAssembly().GetManifestResourceStream("LzhVectors." + name) + ?? throw new FileNotFoundException("Embedded LHA vector missing: " + name); + using var ms = new MemoryStream(); + s.CopyTo(ms); + return ms.ToArray(); + } + + private static List<(LhaEntry Entry, byte[] Data)> ExtractAll(string vector) { + using var reader = new LhaReader(new MemoryStream(Vector(vector))); + return reader.Entries.Select(e => (e, reader.ExtractEntry(e))).ToList(); + } + + [Test, Category("HappyPath")] + [TestCase("lharc113_lh1.lzh", "-lh1-", "GPL-2", 0, TestName = "LHarc 1.13 -lh1-, level 0")] + [TestCase("larc333_lz5.lzs", "-lz5-", "GPL-2", 0, TestName = "LArc 3.33 -lz5-, level 0")] + [TestCase("larc333_initial.lzs", "-lz5-", "initial.bin", 0, TestName = "LArc 3.33 -lz5- reaching into the initial ring")] + [TestCase("generated_lzs.lzs", "-lzs-", "GPL-2", 0, TestName = "-lzs-, level 0")] + [TestCase("pmarc124_pm1.pma", "-pm1-", "COPYING.TXT", 0, TestName = "PMarc 1.24 -pm1-")] + [TestCase("pmarc2_pm2.pma", "-pm2-", "GPL-2.", 0, TestName = "PMarc 2 -pm2-")] + [TestCase("lha_os2_208_h3_lh5.lzh", "-lh5-", "GPL-2", 3, TestName = "LHA OS/2 2.08 level-3 header")] + [TestCase("unlha32_h2_lhx.lzh", "-lhx-", "GPL-2", 2, TestName = "UNLHA32 -lhx- (1 MiB window)")] + public void Member_DecodesToItsCrc(string vector, string method, string name, int level) { + var (entry, data) = ExtractAll(vector).Single(m => m.Entry.FileName == name); + Assert.That(entry.Method, Is.EqualTo(method)); + Assert.That(entry.HeaderLevel, Is.EqualTo(level)); + Assert.That(data, Has.Length.EqualTo(entry.OriginalSize)); + } + + [Test, Category("HappyPath")] + public void DifferentMethods_OfTheSameText_Agree() { + var expected = SHA256.HashData(ExtractAll("lharc113_lh1.lzh").Single().Data); + foreach (var vector in new[] { "larc333_lz5.lzs", "generated_lzs.lzs", "lha_os2_208_h3_lh5.lzh", "unlha32_h2_lhx.lzh" }) + Assert.That(SHA256.HashData(ExtractAll(vector).Single(m => m.Entry.FileName == "GPL-2").Data), Is.EqualTo(expected), vector); + } + + [Test, Category("Exception")] + public void DamagedMember_FailsItsCrc() { + var archive = Vector("lharc113_lh1.lzh"); + using var probe = new LhaReader(new MemoryStream(archive)); + var entry = probe.Entries.Single(); + archive[entry.DataOffset + entry.CompressedSize / 2] ^= 0x40; + using var reader = new LhaReader(new MemoryStream(archive)); + Assert.Catch(() => reader.ExtractEntry(reader.Entries.Single())); + } + +} diff --git a/Compression.Tests/Lzh/LhaTests.cs b/Compression.Tests/Lzh/LhaTests.cs index 71ca1d1c5..390018580 100644 --- a/Compression.Tests/Lzh/LhaTests.cs +++ b/Compression.Tests/Lzh/LhaTests.cs @@ -192,11 +192,31 @@ public class LzsDecoderTests { [Category("HappyPath")] [Test] public void Decode_LiteralOnly() { - // All literal flags, 3 bytes - byte[] compressed = [0x07, 0x41, 0x42, 0x43]; // flags=0b111, A B C + // Bit stream: 1 + 'A', 1 + 'B', 1 + 'C' (each literal is a 1 flag bit and 8 bits), zero-padded. + byte[] compressed = [0xA0, 0xD0, 0xA8, 0x60]; var result = LzsDecoder.Decode(compressed, 3); Assert.That(result, Is.EqualTo("ABC"u8.ToArray())); } + + [Category("HappyPath")] + [Test] + public void Decode_CopyFromInitialSpaces() { + // 0 + position 0 (11 bits) + length 3-2 (4 bits): copies three of the spaces the ring starts with. + byte[] compressed = [0b0000_0000, 0b0000_0001]; + Assert.That(LzsDecoder.Decode(compressed, 3), Is.EqualTo(" "u8.ToArray())); + } + + [Category("RoundTrip")] + [Test] + public void Encoder_RoundTrips() { + var data = System.Text.Encoding.ASCII.GetBytes(string.Concat(Enumerable.Repeat("lzs round trip ", 300))); + Assert.That(LzsDecoder.Decode(LzsEncoder.Encode(data), data.Length), Is.EqualTo(data)); + } + + [Category("Exception")] + [Test] + public void TruncatedStream_Throws() => + Assert.Throws(() => LzsDecoder.Decode([0xA0], 5)); } [TestFixture] @@ -209,4 +229,19 @@ public void Decode_LiteralOnly() { var result = Lz5Decoder.Decode(compressed, 3); Assert.That(result, Is.EqualTo("ABC"u8.ToArray())); } + + [Category("HappyPath")] + [Test] + public void Decode_CopyFromInitialRing() { + // Copy (flag 0) from position 13 (the run of byte 0x01), length 3. + byte[] compressed = [0x00, 13, 0x00]; + Assert.That(Lz5Decoder.Decode(compressed, 3), Is.EqualTo(new byte[] { 1, 1, 1 })); + } + + [Category("RoundTrip")] + [Test] + public void Encoder_RoundTrips() { + var data = System.Text.Encoding.ASCII.GetBytes(string.Concat(Enumerable.Repeat("lz5 round trip ", 400))); + Assert.That(Lz5Decoder.Decode(Lz5Encoder.Encode(data), data.Length), Is.EqualTo(data)); + } } diff --git a/Compression.Tests/Lzh/PmaTests.cs b/Compression.Tests/Lzh/PmaTests.cs deleted file mode 100644 index 2e2409406..000000000 --- a/Compression.Tests/Lzh/PmaTests.cs +++ /dev/null @@ -1,138 +0,0 @@ -using Compression.Core.Dictionary.Lzh; -using FileFormat.Lzh; - -namespace Compression.Tests.Lzh; - -[TestFixture] -public class PmaTests { - [Category("HappyPath")] - [Category("RoundTrip")] - [Test] - public void Pm2_RoundTrip_Pattern() { - var data = new byte[500]; - for (var i = 0; i < data.Length; ++i) - data[i] = (byte)(i % 10); - - var compressed = PmaEncoder.Encode(data, 3); - var decompressed = PmaDecoder.Decode(compressed, data.Length, 3); - Assert.That(decompressed, Is.EqualTo(data)); - } - - [Category("HappyPath")] - [Category("RoundTrip")] - [Test] - public void Pm1_RoundTrip_Pattern() { - var data = new byte[500]; - for (var i = 0; i < data.Length; ++i) - data[i] = (byte)(i % 7); - - var compressed = PmaEncoder.Encode(data, 2); - var decompressed = PmaDecoder.Decode(compressed, data.Length, 2); - Assert.That(decompressed, Is.EqualTo(data)); - } - - [Category("HappyPath")] - [Category("RoundTrip")] - [Test] - public void Pm2_RoundTrip_Text() { - var data = "Hello, PMA compression! This is a test of PPMd-based encoding in LHA archives."u8.ToArray(); - - var compressed = PmaEncoder.Encode(data, 3); - var decompressed = PmaDecoder.Decode(compressed, data.Length, 3); - Assert.That(decompressed, Is.EqualTo(data)); - } - - [Category("EdgeCase")] - [Category("RoundTrip")] - [Test] - public void Pm2_Empty() { - var compressed = PmaEncoder.Encode([], 3); - Assert.That(compressed, Is.Empty); - - var decompressed = PmaDecoder.Decode(compressed, 0, 3); - Assert.That(decompressed, Is.Empty); - } - - [Category("End2End")] - [Category("RoundTrip")] - [Test] - public void Pm2_Archive_RoundTrip() { - var data = new byte[300]; - for (var i = 0; i < data.Length; ++i) - data[i] = (byte)(i % 13); - - var writer = new LhaWriter(LhaConstants.MethodPm2); - writer.AddFile("test.bin", data); - var archive = writer.ToArray(); - - using var ms = new MemoryStream(archive); - var reader = new LhaReader(ms); - - Assert.That(reader.Entries, Has.Count.EqualTo(1)); - Assert.That(reader.Entries[0].Method, Is.EqualTo(LhaConstants.MethodPm2)); - var extracted = reader.ExtractEntry(reader.Entries[0]); - Assert.That(extracted, Is.EqualTo(data)); - } - - [Category("End2End")] - [Category("RoundTrip")] - [Test] - public void Pm1_Archive_RoundTrip() { - var data = new byte[200]; - for (var i = 0; i < data.Length; ++i) - data[i] = (byte)(i % 5); - - var writer = new LhaWriter(LhaConstants.MethodPm1); - writer.AddFile("test.bin", data); - var archive = writer.ToArray(); - - using var ms = new MemoryStream(archive); - var reader = new LhaReader(ms); - - Assert.That(reader.Entries, Has.Count.EqualTo(1)); - Assert.That(reader.Entries[0].Method, Is.EqualTo(LhaConstants.MethodPm1)); - var extracted = reader.ExtractEntry(reader.Entries[0]); - Assert.That(extracted, Is.EqualTo(data)); - } - - [Category("End2End")] - [Category("RoundTrip")] - [Test] - public void Pm0_Archive_RoundTrip() { - var data = "Stored PMA data"u8.ToArray(); - - var writer = new LhaWriter(LhaConstants.MethodPm0); - writer.AddFile("test.txt", data); - var archive = writer.ToArray(); - - using var ms = new MemoryStream(archive); - var reader = new LhaReader(ms); - - Assert.That(reader.Entries, Has.Count.EqualTo(1)); - Assert.That(reader.Entries[0].Method, Is.EqualTo(LhaConstants.MethodPm0)); - var extracted = reader.ExtractEntry(reader.Entries[0]); - Assert.That(extracted, Is.EqualTo(data)); - } - - [Category("End2End")] - [Category("RoundTrip")] - [Test] - public void Pm2_MultipleFiles_RoundTrip() { - var data1 = new byte[100]; - var data2 = new byte[200]; - for (var i = 0; i < data1.Length; ++i) data1[i] = (byte)(i % 10); - for (var i = 0; i < data2.Length; ++i) data2[i] = (byte)(i % 7); - - var writer = new LhaWriter(LhaConstants.MethodPm2); - writer.AddFile("f1.bin", data1); - writer.AddFile("f2.bin", data2); - var archive = writer.ToArray(); - - using var ms = new MemoryStream(archive); - var reader = new LhaReader(ms); - - Assert.That(reader.Entries, Has.Count.EqualTo(2)); - Assert.That(reader.ExtractEntry(reader.Entries[0]), Is.EqualTo(data1)); - Assert.That(reader.ExtractEntry(reader.Entries[1]), Is.EqualTo(data2)); - } -} diff --git a/Compression.Tests/Lzh/ReferenceVectors/README.md b/Compression.Tests/Lzh/ReferenceVectors/README.md index 1e28019d2..86236b0f8 100644 --- a/Compression.Tests/Lzh/ReferenceVectors/README.md +++ b/Compression.Tests/Lzh/ReferenceVectors/README.md @@ -1,6 +1,7 @@ # LHA reference archives -Archives written by other LHA implementations, for the methods our writer cannot produce. +Archives written by other LHA-family archivers, for methods and header levels our writer does not +produce or that must read exactly as their archiver wrote them. | File | Method | Written by | Taken from | |------|--------|------------|------------| @@ -19,6 +20,28 @@ Each holds one member, `LICENSE.MIT` (2,853 bytes, an MIT licence text). lhasa i decode either method, so the oracle is the member's CRC-16 recorded by UNLHA32 in the header: the decoded bytes must match it, along with the size and the text's shape. +## lhasa suite archives + +Taken from `test/archives/` of lhasa at `75ed83559f23e9538e0045c62f53f77ab03d03d6` (2026-06-17), renamed +`_`: + +| File | Written by | What it covers | SHA-256 | +|------|------------|----------------|---------| +| `lharc113_lh1.lzh` | LHarc 1.13 | `-lh1-`, level 0 | `594af58cb27d6a80e9bebd108cc82a8ab881a4b5549e4fc10379fbf7a0d83069` | +| `larc333_lz5.lzs` | LArc 3.33 | `-lz5-` | `ebacc5d6fa4f35ef4e2ff7176e9867e410e4dfc5922b5bcfb804185954e1ab89` | +| `larc333_initial.lzs` | LArc 3.33 | `-lz5-` copies from the predefined initial ring | `3d1a8bb82174986a0e4581d83763f22c5bdae42f5a34eb4841bdafb2f14a6f3e` | +| `generated_lzs.lzs` | lhasa's generated `-lzs-` set | `-lzs-` | `a7a0ff6acfef86a49300e4f0dcfbe7a61ba21d05b1585809e5a393ce5635c3b3` | +| `pmarc124_pm1.pma` | PMarc 1.24 | `-pm1-` | `13dfdbd992c2fac4964b3028c646aa68eb7a4a941a4224c4837058c3771b6346` | +| `pmarc2_pm2.pma` | PMarc 2 | `-pm2-` | `4428e8d9d4e5f61aa7fd041fc6048cfdb64052eaf2776f8b23b9430f506e7979` | +| `lha_amiga_122_level1.lzh` | LHA (Amiga) 1.22 | level 1 with directory extended headers | `dae46e78a2709eb664abfb904e859a653d178f53abfac7255afec6e3fe2c340f` | +| `lha_amiga_122_lh0_dirs_bug.lzh` | LHA (Amiga) 1.22 | directories written as `-lh0-` | `6aa959e8cde1419925d3e85b95ff16b2963301df114fc8f2137c7af6b8f4f17a` | +| `lha_os2_208_h3_lh5.lzh` | LHA (OS/2) 2.08 | level 3 header | `d980d1ddc47323fc860b0fb7829d72ce26afbe1f3f59f89e52f0eda54f425212` | +| `lha_os2_208_h3_subdir.lzh` | LHA (OS/2) 2.08 | level 3 with directories | `201051c47213d0964c596d40f574486dbb683665b2ba2a27a81bae69e3a9b655` | +| `unlha32_h2_lhx.lzh` | UNLHA32.DLL 2.67a | `-lhx-` (1 MiB window), level 2 | `c9ab661c5502714f9556be89617bddff237e0e21e72657dc019707aed9751d9b` | + +The oracle for each member is the CRC-16 its archiver recorded. Several hold the same GPL-2 text, and +the tests check that `-lh1-`, `-lz5-`, `-lzs-`, `-lh5-` and `-lhx-` all decode it identically. + ISC licence (lhasa): ``` diff --git a/Compression.Tests/Lzh/ReferenceVectors/generated_lzs.lzs b/Compression.Tests/Lzh/ReferenceVectors/generated_lzs.lzs new file mode 100644 index 0000000000000000000000000000000000000000..981642182f4105f0f0f0709a325923ccfa3f4965 GIT binary patch literal 12696 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 OL?jYMydp*vx9bms8Zt!y literal 0 HcmV?d00001 diff --git a/Compression.Tests/Lzh/ReferenceVectors/larc333_lz5.lzs b/Compression.Tests/Lzh/ReferenceVectors/larc333_lz5.lzs new file mode 100644 index 0000000000000000000000000000000000000000..35223cc32c9aa92f813f8e41fd01c21fd5a40786 GIT binary patch literal 8510 zcmXw;c~lcu{I@57sN=!}P|@0Y6F{IwOd^ViN+uydEJ8?vO0AknGLR`rW|&C`*s2ML zOMfl__oWKB+t!A~-D<#{Dh9;0E(wZlt=52hUGnn&-t+!@&$;K^{rkDk^VylPh6NMG z0uBWIoCZP3$M;MDP@i;p=2+q6ouBUd0Z7lv1?hfimQ;ae0{Q7&ai&ZH*pT#UmQo7) z{M>+6B-F|-8QKE*25?NFd?XrSfQ3;_fKDN*Km@+=8R!}kf>D&= zKd5&gq5gmb3c~xtbl(`p8sULX-GnexDIi-B+7Bq2ETA#tb70kz6&#CMzmcSw+mO)> z-GJa17KR&k3W-&cMhw3ar3)zzO#4zxHbeh*K$=pxbx0=8yv4!wk&8zYCdQ2WF@VrM_>_a<=HG!R=C zPDgQelJsPL3xtE>eh7F^sIKdGeW40lbNK5Jh`Se6mSb)bM zW|)yez!r@x&Y%Q`!X;l)hz@|BcaT;r*^iol3BP1jL{>~lZjLOI7Mco4t1C^n2GQdK z5mNwSDqs>rRpd2Jq8Zl?7t_u z;=hApG)gH|Uj7liz+noPD8qq;#^@L9jdCp_RmQ^_WYWrWKUjL1JjyA_~DvFe7DXiT_yH4<4oIJNwv<)(Uw1xvSPBD|gvRFaf?SSmS5rq#Rcv-A4?i1wV zFHr?WSg+}cLiG-ev4{=0tl$siN&u4>a5IP(L^MBu#!;aO8cAGYC~6qa^r%U8?7=2HbI+-6K!khb;p$U-r0W@2$y2`m2U?S^9w4co>HH8L* z#(a4Skwp|VWYG#BvLr}&0_Q*!<&8omkc zjEebCYrr^V8mKfpQ%AIL-pVeq%=%eK57Ggpo<#_|*~&j%wkL}EsggP-&!ZQh z=efls(LVN#LxoKh+W40dDc}5Hm)X5}b)Sb8Hg(ra)F;<6ZiGL?b0vC=aT|<;;4`QkijayR53#d(5zHHkYs12%2cw&*;z`EmaVWj{qj6n zRyq%)E|w`(3Yj?fySh(B^)s?lWoa_WaP+&nNp<}ALhj;m7b8nLqA8>`(n`{WC(YZ= zvb}N!#>TKolzM2u#OqqwOM721!{}df7;I2oG~2id*;5_-u&)l*m0bx z1Q!Qf`SnQdh+zmWM0oHi;kmenu@IuNA#e6(wU`J0~TqWoLj!DG8|xz%KHr^PZ~3KU2g#tNskf+|0CwX zzn}d#cuNyg6m@L*tJ+sZ?wPvh?2DXME_}~03b9}XcLlK-LF4(rk)KFiM%q-9SkFTD zY7LfGY`TaXffz8t4LLhh_6ZE&MjboH)eEE}?R~>924K2ly1DWjwY}|I5iXqQM78o_ zpRzS_sOW+S8gN>$B_t;NY>7NRw6Y6#a|S&HnG<8pceR|E2FY{CWuHRu{`x0JJm-4f9j{$t(s^SaMS ze4J7c-=^J!+zE+zI(TEW>1+%$pmdOTsVw#=x*BTX7+*OoZTt@4`=YvoHB4GxNfBC0 z3~6Dk{GH9zH#=|01FU@N0sEGN!~d-8=a<6%zPX;|mRF5+FSWg^)opA8e#l;t3<~i` zoO;gQAuTs57o zIb-|zRS-dFbbo9)`||9x7UlM_O9U{c5%33vSO(Usr&30|57mGT(>?%q-tV0}sR4^? zE6`#`J!oCd;idV6;cSD}wgTc;#e<@nJwZwJgv~6<+<8jcBEI+#8h^e^cO$3Y-Jna7 z#70eL{DS~bojpx-=ub$zEZhE=NRjXC))|DmIw~Rge z2sd~QxvyGt!dzccBq+W>;MUJF zpxadL)p+CI1=n>m_(^__;6dGywwrBzjCyr(a*e!NQ`vZ==1j(NZ>D&nhYYIS{D((XVp6SzTEU=(pdZp<4 zijMmYhrOx4+8%lmKd(|GhK?UM=S_JxwgVKC2FrZgHV+mY#V6?v?k`kBkMs>JFJNgF zhqiRyInu4nD_iBw$qu-MjIZ^NTzTNY$zL+s#FF9-(ZV=?H>vq{Bl!N$7wd9LaIM9h zPCp&PL9_GW4N(jblsS8Z*PvRkXWY@qR}{IzG@)@W+pxeT^4*C+E3{Q2Dv)J#Bo2*k zGOWi{3i`N*YU7|jW6(=?7=P?aG`$Fn?|gF+?Ps$$R~&kybDdr{der!PCtlvJ4QSN< z4SG{J?Im7#nnj<02PN~(svqQ~Yw7c0$svHJo#>0ada}BC-QG|hD8|+ri0fxYKn4f( zMnM0DHz-SSjCL21HeX-9I7z$$xe}%bA0;xPNsuBxe`xSD7EX_e_P*S= zBGxhKJoJ-Le&w?W(G|QUK)hIMzY49rdgs*fi(1KrtGBQIb6GEfK3=u19m8RE`rd|! zuLSK46}?tMuETF0Jm`9vfvJ+~{s%K;icDYboUG%C$Rg`h?ndeg+eDhGQ0P^q5!v@c zU3W;&EcNHCp9Rp~$6a|lPS^dG82T`61vR{b53$NTN_S$Y(sCU-5!R%6)bLTKyL35x z5!Z-ArN|>yBdez9Wc{Iv#hfch2yDa(Gn-9c2JhyX=g928yWC3{n4OPlQ#7ArxDmvPsymWIWxzg>V@j+ejSn*v&gnUe@UykG<)_~T z{cXahuy3p3X-d4DDxK`C$-SP@II z!xciuwguj=EX;r7!40u%PXN+%v%1qDhQ~XPQCr$e8MEt4TfJ>jdG~-DsGG8w`pK(i z(|d=)`MS;B72atm)IBh-Id2#S|1_4pWOt>#%H(lsjs`~%P#ZY*e!&%uASrV z8!%DfB%lir$x0!D8q+s~_0Sedz4LAP z%({i(1vQf>^m#J!dG+qu(|*=e0WdK!9!L`_&BT1$&WBLbe1iOrT&4L?6^a}b9V}8S zrl-HGuzxP~M#JP*N5D$N5V)?;*FWv^5>Cjd_*5h+TINnv>Ag9{xNkznd(xp|WXHPWBE0b4Q-Qb;M+A8U4d~?6&_HukK(O?hI35$ zVRd-m`nm1J@e4DRtC|Mn|{!?Py!03Ph)z~Jrpe?bI~wr{faa> zS^Cmb8aOt8f;+9W-=svTRGl3t8fV{vroa3t^=x&z&#d%7w{oVtbdBTPF+x(lHxi-6 zAwAZm{HWT#^^)D1Ne^Doc0uoDd(H;*k|UeaQ{P~{@UU!)sMu%!9UzV~-*itdn|+Cy%K0X|dF=(t zLdTbdUI}NJbS#TO)u)}ic1ghSwbN~Lt6P@sq;Im#+bPNpw0(O+`RCrt=JimSo7apI zlie@vOQG^^aYu6a@2KACRRt9Lo?TS=%u(Jc^R=TKX1su&+ad2pM%B-M+;!X=#(NSD z`FOTVhM1~>T56l{Kruz%eVcQ;34j^F%{ck?S@n++iUSw)0=3%joXpX+K?!w_t+)Ar zze7IK{oHr@0j@)+?;4=IP;dA*zCWCG<^B18+0R!yR@0TP0YU%1z!u0mLz6Glta*rq zn$ndc(vuWTJy;$ff4*Z|W#Ll(5kozNq$qg&)C> z+sRupC{j;8;ZFq|)zHh0m;An#9P+#RV&^Qa0nc?=zYf%i1ATAe{i3!Gd$0QKwS4l%{4b5+D+76 zjyvO9Ir-dm2a(_mLZ9q6wfdIFdeFV;GY2OpznRq4bzE7Q^hAE7AT{-Y(xI}F+FA=WiI{_z0tHb+3>CV+Iovu}2 zYYz=lZ?UCcd!P=2KC{7WIElU)KC8Q67qzGQY;ET}wZ(tv_@K7#yRGT5nP2U*8b!h*6Bn2e(>`*>w=-W$%=i&X=+(U*2 z)jWbWj~>$&bS7%@i6H~E|5LYv-3Q(^%G44+Qav*KZsa-_^yj!M(;eEcIbz?qiY?JA zQQfwb9V6hAlP2T{_-A?`GUuRU3KiTYADY?Rw(jq@EYokUNoz;d1!C6(k3G}tp|0cj zwt11W9e=nFx`QK6Js$kri!p^imhGR_xl8fbcJKOFcyG#q5p9_}M%9HS&jHruZAN@r z5p%LyMEHD;z3Q&~8_%F7k|1@S;Em7uwPr4*<#q(JUhWTz|889?S&f?nMq%~JZMsUS@u zl>&cu8jxh5iuA2gUMZ%KR$%jqv}@UlQleU&U8<4J_N$~>Dj=6Cp3jh}RBP1YJn#mU z%U7sTai;V+$V6v-5J_iC{8G6J%*v2v{Q+m!VzXpcwNmvFy^G1Rz$}IAxvCc|m1-o} za(|vemY$&k8UF0dRH>pDMg5tTI_{_%qJbPetx(CNN_dfa<_TG9Ng)?iR;am)!7Q07 zBRlt<`h!-t0YkI$z*n*zS*biA)lpL@>HOJpg;cp(4IfqiBb(8smM)@XSrThzZfXS8 zt2Ol0g{*AVa`kQX8nr6hQ>|HN!Egz+K@HE4epGBxXQ@!JEc2bLh!RpDO{U6vvXTNv zFmxIt$<6$TPNi}c@@%El_d)c#rj^>QR>+iJJqM@~zNpK|MN2x1Z>W!`XP{Y<^_nRQ z4B8@)mz^8J$){Fj9-%U%X+?HTdXdx*Ql)89iAq*9bBB7C?Q@$lcSec!xg=YuV(83F z@Fq(tSxKRaJaAemRm_x0b``<%6;e4WOQaN|s5uHnsXaSOB@v$SJO{<|Z1%Q}D#w;`1UMWQ9e7`Lh@>w)E>y4V=I zbL0N+9|L=4wvXDVPDNF>(IfWMTCp^ucM9*a#!`c6R3gb$I0sTk>{DvmC}l28$?&W{ z%V4|xs79s`+CGSw_hldrm1XAk+pQL@yr|B;p)ROVlnFOHE~rq(EvBy9fGjP|TrJ6n zGas=}+???ZbwVt?Q;nw145m^?q%48^+LSVnd867>3vF2^A`=>BSErQSRP$+fWl`!- zs@*Z}L7h*Fv-cc(h_R1z5K$=GH>7m|6D!@iZZg;1hO5C2_kL$- zIASWs@Po<=0k-ib1fyl13+B?~dBXe6PnsEh2x&3sK6_Z?De;|b`eB)y8z0P#_DNm6 zsrC{%IbdLuwTPcQKHrkzk#9aTt2_T7JHByBYLk3+`ykhD&dy6QpCecw@HKd$xeMh3 zsRtX@K6_EmU(juS{4{>OL=}8GRuTuMl$QFYA(ifi_PaUFozuoOeAV+~>XP#IH+jjh zIHNUU{M~M2AM&E8lwTjg*PWl8;29E_mHT)UYy7v!7#Y9*tNH!r<_!(n5-qHG6_EBw zlu*ZsO>qwpy#k9BaX+NQH&O$hCHy&w^+U6sq>=?l>$UB<9$$%@$FHBs(OM8|kp?f2 z4}-{AV1=(VYye>l5$HzTcqd4xyScF6GVsshkBgM;@-$XLo#{DvH7u?397=G_XTT42 z!aE@}uEqC&<84Y-{`0bu=LR-Aq3+w>z5FpX*<)bes(JI7qK3ZMpNuuC_(J9Mes zSRW?k>#2rgqNT2&Q$b12X^@#ESVGvb;O9{wdc)K6k19;qXL%Zc> zY8JqRZMR$tJHiY^wCg_(Y;sqF2YmI7ritu%{KVlIUVQSnhBN7=LF)5Js$fg>#3Yn= z|L(tS_1E6tSoek2DF2?z$%Rm{GCLD<{GORNk4Szde)kfXUzG}c>hW$Xu*P8Vecwbp zJ9(s^0yjKl+XglXpYrQV~C~P_v0WnOk#Q7k~ zxJb1{cvJ}Xy)VXt8U8A0AF6)c##Dvok)_$BuGBP)zditvZO||BNNKakBOjiQxA$p^ zeQAD@kOiqXN5p{Gq%$Lna|U~Q3CLq4#r+VOOa0@bnK)yBxmfU~6ihduAOq75E5vCi zUC%@?IaL(-TY~@6F zzmsR?|B7*!rWVbYRxuO#9BCI3RbHz|=#!Ve<<^9`U&8xJwRHr)~aFgsWL zr$s}Xe0gmKLQ_G@M7-Miae_ei)ErvmZhP62`eI-ct=i-+T;Bw3&btTRI~zOy48PLt zR{f$xBFQ71l literal 0 HcmV?d00001 diff --git a/Compression.Tests/Lzh/ReferenceVectors/lha_os2_208_h3_lh5.lzh b/Compression.Tests/Lzh/ReferenceVectors/lha_os2_208_h3_lh5.lzh new file mode 100644 index 0000000000000000000000000000000000000000..5dd917d4257967fdd480ed304ee171921cbd9d96 GIT binary patch literal 7075 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 N%Q(-kCU1sNKmZO5rWF7H literal 0 HcmV?d00001 diff --git a/Compression.Tests/Lzh/ReferenceVectors/lha_os2_208_h3_subdir.lzh b/Compression.Tests/Lzh/ReferenceVectors/lha_os2_208_h3_subdir.lzh new file mode 100644 index 0000000000000000000000000000000000000000..cc745341fd00b9f84aa779feb659bf11e5af4d58 GIT binary patch literal 271 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 SBqL`dhi)D6)2rajU4Q^0EuBLE literal 0 HcmV?d00001 diff --git a/Compression.Tests/Lzh/ReferenceVectors/pmarc124_pm1.pma b/Compression.Tests/Lzh/ReferenceVectors/pmarc124_pm1.pma new file mode 100644 index 0000000000000000000000000000000000000000..a02c477e8f8437df41f1b68736723084130622de GIT binary patch literal 9984 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 L!x9z$|3Cackn7h^ literal 0 HcmV?d00001 diff --git a/Compression.Tests/Lzh/ReferenceVectors/pmarc2_pm2.pma b/Compression.Tests/Lzh/ReferenceVectors/pmarc2_pm2.pma new file mode 100644 index 0000000000000000000000000000000000000000..f1f7cf80f16ac9fe45b3bd49efa0f35230958da0 GIT binary patch literal 7168 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 C`lcEH literal 0 HcmV?d00001 diff --git a/Compression.Tests/Lzh/ReferenceVectors/unlha32_h2_lhx.lzh b/Compression.Tests/Lzh/ReferenceVectors/unlha32_h2_lhx.lzh new file mode 100644 index 0000000000000000000000000000000000000000..c63395b55e83956ff5f7e32eceb2e53ed647d268 GIT binary patch literal 6903 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 method is LhaConstants.MethodLh0 or LhaConstants.MethodLh1 or @@ -79,7 +79,5 @@ LhaConstants.MethodLh7 or LhaConstants.MethodLz4 or LhaConstants.MethodLzs or LhaConstants.MethodLz5 or - LhaConstants.MethodPm0 or - LhaConstants.MethodPm1 or - LhaConstants.MethodPm2; + LhaConstants.MethodPm0; } diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Lzh/LhaHeaderParser.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Lzh/LhaHeaderParser.cs new file mode 100644 index 000000000..d2679ecfb --- /dev/null +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Lzh/LhaHeaderParser.cs @@ -0,0 +1,226 @@ +using System.Buffers.Binary; +using System.Text; + +namespace FileFormat.Lzh; + +/// One parsed LHA member header and where its data lies. +/// Offset of the header's first byte. +/// Offset of the member's compressed data (just past every header byte). +/// Size of the compressed data, extended headers excluded. +/// Uncompressed size. +/// The five-character method id, e.g. -lh5-. +/// Directory and file name joined with '/', or empty. +/// CRC-16 of the uncompressed data. +/// Header level, 0-3. +/// Operating-system id byte (0 for level 0, which has none). +/// Modification time. +internal sealed record LhaHeader( + long HeaderOffset, long DataOffset, long CompressedSize, long OriginalSize, + string Method, string Path, ushort Crc16, byte Level, byte OsId, DateTime LastModified) { + /// Offset just past the member's data, where the next header starts. + public long End => this.DataOffset + this.CompressedSize; +} + +/// +/// Parses LHA member headers of every level. +/// +/// +/// Layouts (all little-endian): +/// +/// Level 0 and 1: [0] header size N (bytes after the first two), [1] byte-sum of +/// those N bytes, [2..7] method, [7..11] compressed size, [11..15] original size, [15..19] MS-DOS time, +/// [19] attribute, [20] level, [21] name length L, name, CRC-16, then for level 0 an optional extended +/// area and for level 1 the OS id and the size of the first extended header. A level-1 member's +/// compressed size includes its extended headers, which follow the base header. +/// Level 2: [0..2] total header size, fields as above but with a Unix time, [21..23] +/// CRC-16, [23] OS id, then extended headers each led by a 16-bit size. LHA for OS-9/68k ('K') writes +/// a total two bytes short. +/// Level 3: [0..2] word size (4), the same fields, [24..28] total header size, then +/// extended headers each led by a 32-bit size. +/// +/// Extended header 0x01 carries the file name, 0x02 the directory name with 0xFF as separator. +/// Sourcing: converted from lhasa's lha_file_header.c (ISC, Simon Howard); see +/// THIRD-PARTY-NOTICE.lhasa.txt in this directory. +/// +internal static class LhaHeaderParser { + private const int CommonHeaderLength = 22; + private const int Level0MinLength = 22; + private const int Level1MinLength = 25; + private const int Level2Length = 26; + private const int Level3Length = 32; + private const int Level3MaxLength = 1024 * 1024; + private const byte OsTypeOs9_68k = (byte)'K'; + + /// + /// Reads the header at the stream's position. Returns at the end-of-archive + /// marker or end of stream. + /// + /// The header is damaged or of an unknown level. + public static LhaHeader? Read(Stream stream) { + var start = stream.Position; + if (stream.Length - start < 1) + return null; + var first = stream.ReadByte(); + if (first <= 0) + return null; // a zero size byte ends the archive + if (stream.Length - start < CommonHeaderLength) + throw new InvalidDataException("Truncated LHA header."); + + var raw = new List(256) { (byte)first }; + Append(stream, raw, CommonHeaderLength - 1); + var level = raw[20]; + + return level switch { + 0 or 1 => ReadLevel01(stream, raw, start, level), + 2 => ReadLevel2(stream, raw, start), + 3 => ReadLevel3(stream, raw, start), + _ => throw new InvalidDataException($"Unsupported LHA header level: {level}"), + }; + } + + private static LhaHeader ReadLevel01(Stream stream, List raw, long start, byte level) { + var headerLength = raw[0]; + if (headerLength < (level == 0 ? Level0MinLength : Level1MinLength)) + throw new InvalidDataException("LHA level-0/1 header is shorter than its fixed fields."); + Append(stream, raw, headerLength + 2 - raw.Count); + + byte sum = 0; + for (var i = 2; i < raw.Count; ++i) + sum += raw[i]; + if (sum != raw[1]) + throw new InvalidDataException("LHA header checksum mismatch."); + + var pathLength = raw[21]; + if ((level == 0 ? Level0MinLength : Level1MinLength) + pathLength > headerLength) + throw new InvalidDataException("LHA header name runs past the header."); + + long compressed = U32(raw, 7); + var name = Latin1(raw, 22, pathLength).Replace('\\', '/'); + var crc = U16(raw, 22 + pathLength); + byte os = level == 0 ? (byte)0 : raw[24 + pathLength]; + string? directory = null; + + if (level == 1) { + // The size of the first extended header closes the base header; each extended header ends with the next one's. + var offset = raw.Count - 2; + while (true) { + var size = U16(raw, raw.Count - 2); + if (size == 0) + break; + if (size < 3) + throw new InvalidDataException("LHA level-1 extended header is shorter than its own fields."); + if (compressed < size) + throw new InvalidDataException("LHA level-1 extended headers are larger than the member."); + compressed -= size; // the compressed size counts the extended headers too + Append(stream, raw, size); + } + ParseExtended(raw, offset, 2, ref name, ref directory); + } + + return Build(start, stream.Position, compressed, raw, name, directory, crc, level, os, + DosTime(U32(raw, 15))); + } + + private static LhaHeader ReadLevel2(Stream stream, List raw, long start) { + var headerLength = U16(raw, 0); + if (headerLength < Level2Length) + throw new InvalidDataException("LHA level-2 header is shorter than its fixed fields."); + Append(stream, raw, headerLength - raw.Count); + var os = raw[23]; + if (os == OsTypeOs9_68k) + Append(stream, raw, 2); // OS-9/68k LHA counts the header two bytes short + + var name = string.Empty; + string? directory = null; + ParseExtended(raw, 24, 2, ref name, ref directory); + return Build(start, stream.Position, U32(raw, 7), raw, name, directory, U16(raw, 21), 2, os, + DateTimeOffset.FromUnixTimeSeconds(U32(raw, 15)).UtcDateTime); + } + + private static LhaHeader ReadLevel3(Stream stream, List raw, long start) { + if (U16(raw, 0) != 4) + throw new InvalidDataException("LHA level-3 header has an unsupported word size."); + Append(stream, raw, Level3Length - raw.Count); + var headerLength = U32(raw, 24); + if (headerLength > Level3MaxLength || headerLength < raw.Count) + throw new InvalidDataException("LHA level-3 header size is out of range."); + Append(stream, raw, (int)headerLength - raw.Count); + + var name = string.Empty; + string? directory = null; + ParseExtended(raw, 28, 4, ref name, ref directory); + return Build(start, stream.Position, U32(raw, 7), raw, name, directory, U16(raw, 21), 3, raw[23], + DateTimeOffset.FromUnixTimeSeconds(U32(raw, 15)).UtcDateTime); + } + + /// Walks the extended-header chain starting at the size field at . + private static void ParseExtended(List raw, int offset, int fieldSize, ref string name, ref string? directory) { + while (offset + fieldSize <= raw.Count) { + long size = fieldSize == 4 ? U32(raw, offset) : U16(raw, offset); + if (size == 0) + break; + if (size < fieldSize + 1 || offset + size > raw.Count) + throw new InvalidDataException("LHA extended header size is out of range."); + var type = raw[offset + fieldSize]; + var dataStart = offset + fieldSize + 1; + var dataLength = (int)size - fieldSize - 1; + if (dataStart + dataLength > raw.Count) + throw new InvalidDataException("LHA extended header runs past the header."); + switch (type) { + case 0x01: + name = Latin1(raw, dataStart, dataLength); + break; + case 0x02: + var dir = new StringBuilder(dataLength); + for (var i = 0; i < dataLength; ++i) { + var b = raw[dataStart + i]; + dir.Append(b == 0xFF ? '/' : (char)b); + } + directory = dir.ToString(); + break; + } + offset += (int)size; + } + } + + private static LhaHeader Build(long start, long dataOffset, long compressed, List raw, string name, + string? directory, ushort crc, byte level, byte os, DateTime modified) { + var method = Encoding.ASCII.GetString([raw[2], raw[3], raw[4], raw[5], raw[6]]); + var path = name; + if (!string.IsNullOrEmpty(directory)) + path = directory.EndsWith('/') ? directory + name : directory + "/" + name; + return new LhaHeader(start, dataOffset, compressed, U32(raw, 11), method, path.TrimEnd('/'), crc, level, os, modified); + } + + private static void Append(Stream stream, List raw, int count) { + if (count <= 0) + return; + var buffer = new byte[count]; + var read = stream.ReadAtLeast(buffer, count, throwOnEndOfStream: false); + if (read < count) + throw new InvalidDataException("Truncated LHA header."); + raw.AddRange(buffer); + } + + private static ushort U16(List raw, int at) => (ushort)(raw[at] | (raw[at + 1] << 8)); + + private static uint U32(List raw, int at) => + (uint)(raw[at] | (raw[at + 1] << 8) | (raw[at + 2] << 16) | (raw[at + 3] << 24)); + + private static string Latin1(List raw, int at, int count) { + var bytes = new byte[count]; + raw.CopyTo(at, bytes, 0, count); + return Encoding.Latin1.GetString(bytes); + } + + private static DateTime DosTime(uint timestamp) { + var time = (int)(timestamp & 0xFFFF); + var date = (int)(timestamp >> 16); + try { + return new DateTime(((date >> 9) & 0x7F) + 1980, (date >> 5) & 0x0F, date & 0x1F, + (time >> 11) & 0x1F, (time >> 5) & 0x3F, (time & 0x1F) * 2); + } catch (ArgumentOutOfRangeException) { + return DateTime.MinValue; + } + } +} diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Lzh/LhaModifier.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Lzh/LhaModifier.cs index bd83350dd..161929f7a 100644 --- a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Lzh/LhaModifier.cs +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Lzh/LhaModifier.cs @@ -75,31 +75,16 @@ public static bool RemoveFile(Stream lha, string name, bool wipeData = true) { } // ── Header walking ──────────────────────────────────────────────────── - // Level-1 LHA layout per entry: - // byte 0: header_size (= N, count of bytes after the checksum) - // 0 = end-of-archive - // byte 1: checksum - // bytes 2..6 (5): method string ("-lh0-", "-lh5-", ...) - // bytes 7..10 (4): compressed_size (uint32 LE) - // ... rest of header (variable name + extras) ... - // Total entry = 2 + N + compressed_size bytes. + // Every header level is parsed by LhaHeaderParser; a member spans + // [header start, data offset + compressed size). private static long FindEofOffset(Stream lha) { lha.Position = 0; - Span rest = stackalloc byte[10]; while (lha.Position < lha.Length) { var entryStart = lha.Position; - var headerSize = lha.ReadByte(); - if (headerSize <= 0) return entryStart; - - // Read just enough to extract compressed_size (offset 7..10 from entry start). - var read = ReadFully(lha, rest); - if (read < rest.Length) return entryStart; // truncated → treat as EOF - - // rest[i] maps to file byte (entryStart + 1 + i). compressed_size lives at - // file bytes 7..10 (inclusive) → rest indices 6..9. - var compressedSize = (uint)(rest[6] | rest[7] << 8 | rest[8] << 16 | rest[9] << 24); - lha.Position = entryStart + 2 + headerSize + compressedSize; + var header = LhaHeaderParser.Read(lha); + if (header == null) return entryStart; + lha.Position = header.End; } return lha.Length; } @@ -109,50 +94,17 @@ private static long FindEofOffset(Stream lha) { private static EntryLocator LocateEntry(Stream lha, string targetName) { lha.Position = 0; while (lha.Position < lha.Length) { - var entryStart = lha.Position; - var headerSize = lha.ReadByte(); - if (headerSize <= 0) break; - - var headerBuf = new byte[headerSize + 1]; // checksum byte + N payload bytes - var read = 0; - while (read < headerBuf.Length) { - var n = lha.Read(headerBuf, read, headerBuf.Length - read); - if (n <= 0) break; - read += n; - } - if (read < headerBuf.Length) break; - - // headerBuf[0] = checksum; headerBuf[1+k] = payload byte k. Payload layout: - // 0..4 method, 5..8 compressed_size, 9..12 original_size, 13..16 timestamp, - // 17 reserved, 18 level, 19 nameLen, 20..20+nameLen-1 name. - var compressedSize = (uint)(headerBuf[6] | headerBuf[7] << 8 | headerBuf[8] << 16 | headerBuf[9] << 24); - var nameLen = headerBuf[20]; - var name = nameLen > 0 - ? System.Text.Encoding.ASCII.GetString(headerBuf, 21, Math.Min(nameLen, headerBuf.Length - 21)) - : ""; - - var totalEntrySize = 2L + headerSize + compressedSize; - - if (string.Equals(name, targetName, StringComparison.OrdinalIgnoreCase)) - return new EntryLocator(true, entryStart, totalEntrySize); - - lha.Position = entryStart + totalEntrySize; + var header = LhaHeaderParser.Read(lha); + if (header == null) break; + if (string.Equals(header.Path, targetName, StringComparison.OrdinalIgnoreCase)) + return new EntryLocator(true, header.HeaderOffset, header.End - header.HeaderOffset); + lha.Position = header.End; } return new EntryLocator(false, 0, 0); } // ── Helpers ─────────────────────────────────────────────────────────── - private static int ReadFully(Stream s, Span buf) { - var read = 0; - while (read < buf.Length) { - var n = s.Read(buf[read..]); - if (n <= 0) break; - read += n; - } - return read; - } - private static void ZeroRange(Stream s, long offset, long length) { var buf = new byte[(int)Math.Min(length, 8192)]; s.Position = offset; diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Lzh/LhaReader.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Lzh/LhaReader.cs index d3c01a759..21b2c29e5 100644 --- a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Lzh/LhaReader.cs +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Lzh/LhaReader.cs @@ -63,6 +63,9 @@ public byte[] ExtractEntry(LhaEntry entry) { case LhaConstants.MethodLh7: data = DecompressLzh(compressedData, (int)entry.OriginalSize, LzhConstants.Lh7PositionBits); break; + case LhaConstants.MethodLhx: + data = DecompressLzh(compressedData, (int)entry.OriginalSize, 20); + break; case LhaConstants.MethodLzs: data = LzsDecoder.Decode(compressedData, (int)entry.OriginalSize); break; @@ -73,10 +76,10 @@ public byte[] ExtractEntry(LhaEntry entry) { data = compressedData; break; case LhaConstants.MethodPm1: - data = PmaDecoder.Decode(compressedData, (int)entry.OriginalSize, 2); + data = Pm1Decoder.Decode(compressedData, (int)entry.OriginalSize); break; case LhaConstants.MethodPm2: - data = PmaDecoder.Decode(compressedData, (int)entry.OriginalSize, 3); + data = Pm2Decoder.Decode(compressedData, (int)entry.OriginalSize); break; default: throw new NotSupportedException($"Unsupported LHA method: {entry.Method}"); @@ -103,149 +106,26 @@ private static byte[] DecompressLh1(byte[] compressedData, int originalSize) { private void ReadEntries() { while (this._stream.Position < this._stream.Length) { - var entry = this.ReadHeader(); - if (entry == null) - break; - - if (entry.Method != LhaConstants.MethodLhd) - this._entries.Add(entry); - - this._stream.Position = entry.DataOffset + entry.CompressedSize; - } - } - - private LhaEntry? ReadHeader() { - var firstByte = this._stream.ReadByte(); - if (firstByte <= 0) - return null; - - var secondByte = this._stream.ReadByte(); - if (secondByte < 0) - return null; - - var methodBytes = new byte[5]; - if (this._stream.Read(methodBytes, 0, 5) < 5) - return null; - var method = Encoding.ASCII.GetString(methodBytes); - if (!method.StartsWith('-') || !method.EndsWith('-')) - return null; - - var reader = new BinaryReader(this._stream, Encoding.ASCII, leaveOpen: true); - var compressedSize = reader.ReadUInt32(); - var originalSize = reader.ReadUInt32(); - var timestamp = reader.ReadUInt32(); - var reserved = reader.ReadByte(); - var level = reader.ReadByte(); - - var entry = new LhaEntry { - Method = method, - CompressedSize = compressedSize, - OriginalSize = originalSize, - HeaderLevel = level, - LastModified = level == LhaConstants.HeaderLevel2 - ? DateTimeFromUnix(timestamp) - : DateTimeFromMsdos(timestamp), - }; - - switch (level) { - case LhaConstants.HeaderLevel0: - this.ReadLevel0Header(reader, entry, firstByte); - break; - case LhaConstants.HeaderLevel1: - ReadLevel1Header(reader, entry); - break; - case LhaConstants.HeaderLevel2: - ReadLevel2Header(reader, entry, firstByte | (secondByte << 8)); - break; - default: - throw new InvalidDataException($"Unsupported LHA header level: {level}"); - } - - return entry; - } - - private void ReadLevel0Header(BinaryReader reader, LhaEntry entry, int headerSize) { - var nameLength = reader.ReadByte(); - var nameBytes = reader.ReadBytes(nameLength); - entry.FileName = Encoding.ASCII.GetString(nameBytes); - entry.Crc16 = reader.ReadUInt16(); - - var headerStart = this._stream.Position - 2 - 5 - 4 - 4 - 4 - 1 - 1 - 1 - nameLength - 2; - entry.DataOffset = headerStart + 2 + headerSize; - this._stream.Position = entry.DataOffset; - } - - private static void ReadLevel1Header(BinaryReader reader, LhaEntry entry) { - var nameLength = reader.ReadByte(); - var nameBytes = reader.ReadBytes(nameLength); - entry.FileName = Encoding.ASCII.GetString(nameBytes); - entry.Crc16 = reader.ReadUInt16(); - entry.OsId = reader.ReadByte(); - - while (true) { - var extSize = reader.ReadUInt16(); - if (extSize == 0) - break; - if (extSize < 3) - throw new InvalidDataException("Invalid LHA level-1 extended-header size."); - - var extType = reader.ReadByte(); - var extData = reader.ReadBytes(extSize - 3); - if (extData.Length != extSize - 3) - throw new EndOfStreamException("Truncated LHA level-1 extended header."); - - if (extType == 0x01 && extData.Length > 0) - entry.FileName = Encoding.ASCII.GetString(extData); - } - - entry.DataOffset = reader.BaseStream.Position; - } - - private static void ReadLevel2Header(BinaryReader reader, LhaEntry entry, int totalHeaderSize) { - entry.Crc16 = reader.ReadUInt16(); - entry.OsId = reader.ReadByte(); - - var headerStart = reader.BaseStream.Position - 2 - 5 - 4 - 4 - 4 - 1 - 1 - 2 - 1; - var headerEnd = headerStart + totalHeaderSize; - if (headerEnd > reader.BaseStream.Length) - throw new EndOfStreamException("Truncated LHA level-2 header."); - - while (reader.BaseStream.Position < headerEnd) { - var extSize = reader.ReadUInt16(); - if (extSize == 0) - break; - if (extSize < 3 || reader.BaseStream.Position + extSize - 2 > headerEnd) - throw new InvalidDataException("Invalid LHA level-2 extended-header size."); - - var extType = reader.ReadByte(); - var extData = reader.ReadBytes(extSize - 3); - if (extData.Length != extSize - 3) - throw new EndOfStreamException("Truncated LHA level-2 extended header."); - - if (extType == 0x01 && extData.Length > 0) - entry.FileName = Encoding.ASCII.GetString(extData); - } - - reader.BaseStream.Position = headerEnd; - entry.DataOffset = headerEnd; - } - - private static DateTime DateTimeFromUnix(uint timestamp) - => DateTimeOffset.FromUnixTimeSeconds(timestamp).UtcDateTime; - - private static DateTime DateTimeFromMsdos(uint timestamp) { - var time = (int)(timestamp & 0xFFFF); - var date = (int)(timestamp >> 16); - try { - return new DateTime( - ((date >> 9) & 0x7F) + 1980, - (date >> 5) & 0x0F, - date & 0x1F, - (time >> 11) & 0x1F, - (time >> 5) & 0x3F, - (time & 0x1F) * 2); - } catch { - return DateTime.MinValue; + var header = LhaHeaderParser.Read(this._stream); + if (header == null) + break; + + if (header.Method != LhaConstants.MethodLhd) + this._entries.Add(new LhaEntry { + FileName = header.Path, + Method = header.Method, + CompressedSize = header.CompressedSize, + OriginalSize = header.OriginalSize, + LastModified = header.LastModified, + Crc16 = header.Crc16, + HeaderLevel = header.Level, + OsId = header.OsId, + DataOffset = header.DataOffset, + }); + + if (header.End > this._stream.Length) + break; // a truncated last member is listed; extracting it fails + this._stream.Position = header.End; } } diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Lzh/LhaWriter.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Lzh/LhaWriter.cs index ceb120008..7132d6a35 100644 --- a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Lzh/LhaWriter.cs +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Lzh/LhaWriter.cs @@ -39,8 +39,6 @@ public LhaWriter( LhaConstants.MethodLzs => -1, LhaConstants.MethodLz5 => -2, LhaConstants.MethodLh1 => -3, - LhaConstants.MethodPm1 => -5, - LhaConstants.MethodPm2 => -6, LhaConstants.MethodLh4 => LzhConstants.Lh4PositionBits, LhaConstants.MethodLh5 => LzhConstants.Lh5PositionBits, LhaConstants.MethodLh6 => LzhConstants.Lh6PositionBits, @@ -90,10 +88,6 @@ private void WriteEntry(Stream output, string name, byte[] data) { if (data.Length == 0 || this._positionBits == 0) { compressed = data; - } else if (this._positionBits == -5) { - compressed = PmaEncoder.Encode(data, 2); - } else if (this._positionBits == -6) { - compressed = PmaEncoder.Encode(data, 3); } else if (this._positionBits == -1) { compressed = LzsEncoder.Encode(data); } else if (this._positionBits == -2) { @@ -135,7 +129,7 @@ private void WriteEntry(Stream output, string name, byte[] data) { private string GetStoredMethod() => this._method switch { LhaConstants.MethodLz4 or LhaConstants.MethodLzs or LhaConstants.MethodLz5 => LhaConstants.MethodLz4, - LhaConstants.MethodPm0 or LhaConstants.MethodPm1 or LhaConstants.MethodPm2 => LhaConstants.MethodPm0, + LhaConstants.MethodPm0 => LhaConstants.MethodPm0, _ => LhaConstants.MethodLh0, }; diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Lzh/LzhConstants.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Lzh/LzhConstants.cs index 90d4b32b6..982d01485 100644 --- a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Lzh/LzhConstants.cs +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Lzh/LzhConstants.cs @@ -40,6 +40,9 @@ public static class LhaConstants { /// Method: directory marker. public const string MethodLhd = "-lhd-"; + /// Method: lh5-style static Huffman with a 1 MiB window (UNLHA32), read-only. + public const string MethodLhx = "-lhx-"; + /// Method: store (same as lh0, legacy). public const string MethodLz4 = "-lz4-"; diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Lzh/LzhFormatDescriptor.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Lzh/LzhFormatDescriptor.cs index 4eb422857..139bafffb 100644 --- a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Lzh/LzhFormatDescriptor.cs +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Lzh/LzhFormatDescriptor.cs @@ -98,7 +98,7 @@ public void Remove(Stream archive, string[] entryNames) { public IReadOnlyList Methods => [ new("lh5", "LH5"), new("lh0", "LH0 (Store)"), new("lh1", "LH1"), new("lh4", "LH4"), new("lh6", "LH6"), new("lh7", "LH7"), new("lzs", "LZS"), new("lz5", "LZ5"), - new("pm0", "PM0"), new("pm1", "PM1"), new("pm2", "PM2") + new("pm0", "PM0") ]; /// /// Gets the tar compression format id. diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Lzh/LzhLayoutMap.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Lzh/LzhLayoutMap.cs index 24159a27d..9ca4734a0 100644 --- a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Lzh/LzhLayoutMap.cs +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Lzh/LzhLayoutMap.cs @@ -1,5 +1,4 @@ #pragma warning disable CS1591 -using System.Text; using Compression.Registry; namespace FileFormat.Lzh; @@ -18,85 +17,19 @@ public static IEnumerable Enumerate(Stream archive) { archive.Position = 0; while (archive.Position < archive.Length) { - var entryStart = archive.Position; - - // Peek at first two bytes - var firstByte = archive.ReadByte(); - if (firstByte <= 0) yield break; - var secondByte = archive.ReadByte(); - if (secondByte < 0) yield break; - - // Read method string (5 bytes at offset 2) - var methodBytes = new byte[5]; - if (archive.Read(methodBytes, 0, 5) < 5) yield break; - var method = Encoding.ASCII.GetString(methodBytes); - - // Validate method - if (!method.StartsWith('-') || !method.EndsWith('-')) + LhaHeader? header; + try { + header = LhaHeaderParser.Read(archive); + } catch (InvalidDataException) { yield break; - - // Read common fields - var reader = new BinaryReader(archive, Encoding.ASCII, leaveOpen: true); - var compressedSize = reader.ReadUInt32(); - var originalSize = reader.ReadUInt32(); - var timestamp = reader.ReadUInt32(); - var reserved = reader.ReadByte(); - var level = reader.ReadByte(); - - string fileName; - long dataOffset; - - switch (level) { - case 0: { - var nameLength = reader.ReadByte(); - var nameBytes = reader.ReadBytes(nameLength); - fileName = Encoding.ASCII.GetString(nameBytes); - var crc16 = reader.ReadUInt16(); - // Level 0: headerSize (firstByte) includes everything from offset 2 to end of header - // Total header = 2 + firstByte bytes - dataOffset = entryStart + 2 + firstByte; - break; - } - case 1: { - var nameLength = reader.ReadByte(); - var nameBytes = reader.ReadBytes(nameLength); - fileName = Encoding.ASCII.GetString(nameBytes); - var crc16 = reader.ReadUInt16(); - var osId = reader.ReadByte(); - // Read extended headers - while (true) { - var extSize = reader.ReadUInt16(); - if (extSize == 0) break; - var extType = reader.ReadByte(); - var extData = reader.ReadBytes(extSize - 3); - if (extType == 0x01 && extData.Length > 0) - fileName = Encoding.ASCII.GetString(extData); - } - dataOffset = archive.Position; - break; - } - case 2: { - var totalHeaderSize = firstByte | (secondByte << 8); - var crc16 = reader.ReadUInt16(); - var osId = reader.ReadByte(); - fileName = ""; // will be set by extended headers - - var headerEnd = entryStart + totalHeaderSize; - while (archive.Position < headerEnd) { - var extSize = reader.ReadUInt16(); - if (extSize == 0) break; - var extType = reader.ReadByte(); - var extData = reader.ReadBytes(extSize - 3); - if (extType == 0x01 && extData.Length > 0) - fileName = Encoding.ASCII.GetString(extData); - } - archive.Position = headerEnd; - dataOffset = headerEnd; - break; - } - default: - yield break; } + if (header == null) yield break; + + var entryStart = header.HeaderOffset; + var dataOffset = header.DataOffset; + var compressedSize = header.CompressedSize; + var method = header.Method; + var fileName = header.Path; var headerSize = dataOffset - entryStart; diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Lzh/THIRD-PARTY-NOTICE.lhasa.txt b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Lzh/THIRD-PARTY-NOTICE.lhasa.txt new file mode 100644 index 000000000..63d1e77ae --- /dev/null +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Lzh/THIRD-PARTY-NOTICE.lhasa.txt @@ -0,0 +1,27 @@ +lhasa (LHA header parsing) - converted to C# + +Source: https://github.com/fragglet/lhasa +Revision: 75ed83559f23e9538e0045c62f53f77ab03d03d6 (master, 2026-06-17) +Author: Simon Howard +Licence: ISC (reproduced below) + +Copyright (c) 2011-2025, Simon Howard + +Permission to use, copy, modify, and/or distribute this software +for any purpose with or without fee is hereby granted, provided +that the above copyright notice and this permission notice appear +in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL +WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE +AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR +CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, +NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +Files converted: + + lib/lha_file_header.c, lib/ext_header.c -> LhaHeaderParser.cs (levels 0-3, + extended headers 0x01 and 0x02) diff --git a/Hawkynt.FileFormats.Archives/README.md b/Hawkynt.FileFormats.Archives/README.md index 29ca6e9e2..3affa6901 100644 --- a/Hawkynt.FileFormats.Archives/README.md +++ b/Hawkynt.FileFormats.Archives/README.md @@ -128,7 +128,7 @@ Every State, Test, Maintenance, Compress/Decompress and Demux/Mux/Remux cell is | LhF (LhFloppy) | `LhF` | `.lhf` | R/W | ✅ | defrag · wipe | Whole-disk archiver: entries are track_NNN.raw | [Aminet](https://aminet.net) | | [lrzip](https://en.wikipedia.org/wiki/Rzip#lrzip) | `Lrzip` | `.lrz` | WORM | ✅ | defrag | LZMA-wrapped subtype only; other lrzip subtypes are rejected; single data member | [GitHub](https://github.com/ckolivas/lrzip) | | Lynx (Commodore) | `Lynx` | `.lnx` | R/W | ✅ | defrag · shrink · wipe | Stored entries only | [Archive Team](http://fileformats.archiveteam.org/wiki/Lynx_(Commodore_64)) | -| [LHA / LZH](https://en.wikipedia.org/wiki/LHA_(file_format)) | `Lzh` | `.lzh` `.lha` | R/W | ✅ | defrag · wipe | -lh2- and -lh3- are read-only | [GitHub](https://github.com/jca02266/lha) | +| [LHA / LZH](https://en.wikipedia.org/wiki/LHA_(file_format)) | `Lzh` | `.lzh` `.lha` | R/W | ✅ | defrag · wipe | -lh2-, -lh3-, -lhx-, -pm1- and -pm2- are read-only | [GitHub](https://github.com/jca02266/lha) | | [LZX (Amiga)](https://en.wikipedia.org/wiki/LZX) | `LzxAmiga` | `.lzx` | R/W | ✅ | defrag · wipe | | [Aminet](https://aminet.net) | | [mtree](https://man.freebsd.org/cgi/man.cgi?query=mtree&sektion=5) | `Mtree` | `.mtree` | WORM | ✅ | — | Filesystem metadata manifest; does not embed file bodies, so CWB does not dereference `contents=` host paths | [FreeBSD mtree(5)](https://man.freebsd.org/cgi/man.cgi?query=mtree&sektion=5) | | [NuFX / ShrinkIt](https://en.wikipedia.org/wiki/ShrinkIt) | `NuFx` | `.shk` `.sdk` `.bxy` | R/W | ✅ | defrag · shrink · wipe | | [nulib.com](https://nulib.com/library/FTN.e08002.htm) | diff --git a/Hawkynt.FileFormats.Archives/REFERENCE.md b/Hawkynt.FileFormats.Archives/REFERENCE.md index 379092af7..abb0035eb 100644 --- a/Hawkynt.FileFormats.Archives/REFERENCE.md +++ b/Hawkynt.FileFormats.Archives/REFERENCE.md @@ -19634,6 +19634,7 @@ Constants for the LHA/LZH archive format. | `MethodLh6` | `const string MethodLh6` | Method: LZH compression with 32KB window. | | `MethodLh7` | `const string MethodLh7` | Method: LZH compression with 64KB window. | | `MethodLhd` | `const string MethodLhd` | Method: directory marker. | +| `MethodLhx` | `const string MethodLhx` | Method: lh5-style static Huffman with a 1 MiB window (UNLHA32), read-only. | | `MethodLz4` | `const string MethodLz4` | Method: store (same as lh0, legacy). | | `MethodLz5` | `const string MethodLz5` | Method: LZSS with 4KB window (LArc variant). | | `MethodLzs` | `const string MethodLzs` | Method: LZSS with 4KB window (no Huffman). | diff --git a/docs/catalogue/GAPS.md b/docs/catalogue/GAPS.md index 828948241..fb9d0648c 100644 --- a/docs/catalogue/GAPS.md +++ b/docs/catalogue/GAPS.md @@ -162,7 +162,7 @@ running real-world samples. The file named at the end of each row is where the l | 7z | `SevenZip` | 7 | Deflate64, ARM64, RISC-V, Zstd/Brotli/LZ4 coders and external header references unsupported (SevenZipReader.cs) | | ISO 9660 (Joliet / Rock Ridge / El Torito) | `Iso` | 7 | Rock Ridge limited to NM names (no SL/PX/TF/CE, no zisofs); interleaved files throw (IsoReader.cs) | | ZIP | `Zip` | 7 | methods xz (95), JPEG (96), WavPack (97) and PKWARE strong encryption unsupported (ZipReader.cs) | -| LHA / LZH | `Lzh` | 6 | lh2/lh3 decoded but read-only; lh1, lzs, lz5, pm1, pm2, level-1 extended headers and level-3 headers fail on lhasa's test archives (refused by the CRC check), lhx and lk7 unsupported (LhaReader.cs) | +| LHA / LZH | `Lzh` | 6 | every method and header level of lhasa's test suite reads except LHARK's lk7; lh2, lh3, lhx, pm1 and pm2 are read-only; self-extracting executables are not opened (LhaReader.cs) | | StuffIt (classic + 5) | `StuffIt` | 4 | store and RLE only; LZW/Huffman/LZAH/Arsenic/DES methods throw (StuffItReader.cs) | | StuffIt X | `StuffItX` | 4 | stored and deflate only; Brimstone/Cyanide/Darkhorse/Iron throw (StuffItXReader.cs) | | zoo | `Zoo` | 4 | LZH method (2) unsupported (ZooReader.cs) | diff --git a/docs/catalogue/reference-formats.csv b/docs/catalogue/reference-formats.csv index d65e39d0f..bd05e5eee 100644 --- a/docs/catalogue/reference-formats.csv +++ b/docs/catalogue/reference-formats.csv @@ -34,7 +34,7 @@ Windows Update package (MSU),msu,installer,,,,,R,,,1,,,,,,MISSING,, Compiled HTML Help (CHM),chm;chi;chq;chw;hxs,document,R,,,,R,fmt/634,,3,https://www.nongnu.org/chmspec/latest/,Chm,Y,Y,Y,PARTIAL,,content sections above 1 unsupported (ChmReader.cs) Windows Imaging (WIM/SWM/ESD),wim;swm;esd;ppkg,disk-image,RW,,,,R,,Y,3,https://learn.microsoft.com/windows-hardware/manufacture/desktop/wim-vs-ffu-image-file-formats,Wim;Swm;Esd,Y,Y,,OK,, ARJ,arj,archive,R,,R,D,R,fmt/610,RW,6,https://en.wikipedia.org/wiki/ARJ,Arj,Y,Y,Y,OK,,methods 0-4 decoded; method 4 verified on archives the open-source ARJ port wrote -LHA / LZH,lzh;lha;lzs;exe;sfx,archive,R,R,R,,R,fmt/1558;fmt/626,RW,6,https://en.wikipedia.org/wiki/LHA_(file_format),Lzh,Y,Y,Y,PARTIAL,,"lh2/lh3 decoded but read-only; lh1, lzs, lz5, pm1, pm2, level-1 extended headers and level-3 headers fail on lhasa's test archives (refused by the CRC check), lhx and lk7 unsupported (LhaReader.cs)" +LHA / LZH,lzh;lha;lzs;exe;sfx,archive,R,R,R,,R,fmt/1558;fmt/626,RW,6,https://en.wikipedia.org/wiki/LHA_(file_format),Lzh,Y,Y,Y,PARTIAL,,"every method and header level of lhasa's test suite reads except LHARK's lk7; lh2, lh3, lhx, pm1 and pm2 are read-only; self-extracting executables are not opened (LhaReader.cs)" ACE,ace,archive,,,R,,R,fmt/2075;fmt/2076,RW,4,https://en.wikipedia.org/wiki/ACE_(compressed_file_format),Ace,Y,Y,Y,OK,, ARC (SEA),arc;ark,archive,,,R,,R,,RW,3,https://en.wikipedia.org/wiki/ARC_(file_format),Arc,Y,Y,Y,OK,, PAK (NoGate ARC extension),pak,archive,,,R,,,,Y,2,,,,,,MISSING,, From fc95094746ae3b931d507486685f2a1f9a3b7abe Mon Sep 17 00:00:00 2001 From: Hawkynt Date: Mon, 26 Oct 2026 13:03:37 +0100 Subject: [PATCH 12/48] # PackIt and DiskDoubler: real on-disk formats, decode or refuse # PackIt: real on-disk layout, Huffman entries decoded, encrypted ones refused Symptom: real PackIt archives did not read: "PMa4" Huffman members came back as compressed bytes, and stored ones were cut at the wrong offsets. Archives we wrote were not PackIt files at all. Root cause: reader, writer and modifier shared an invented 87-byte header. The real header is 94 bytes after the magic (name, type, creator, Finder flags, fork sizes, dates, CRC-16), the forks are followed by a CRC-16, the archive ends with "PEnd", and a "PMa4" entry Huffman- codes the header, both forks and the CRC as one stream with no stored length. Change: reader, writer and modifier rewritten to the real layout. PMa4 entries are decoded (StuffIt method-3 style pre-order tree, MSB-first) and walked to find the next entry; both CRC-16s are checked; PMa5/PMa6 (XOR/DES-encrypted) entries are listed and refused. The writer emits stored entries with both CRCs and the end marker; defrag carries each entry over byte for byte so resource forks and Huffman coding survive. Evidence: nine real PackIt archives (dexvert sample set; seven Huffman- coded) decode with every header and fork CRC matching and every data fork identical to unar's; they are not committed (unknown redistribution terms) and run from test-corpus/packit when present. unar extracts archives we write, and decodes a test-encoded PMa4 entry to the same bytes we do. The header CRC (unchecked by XADMaster) is CRC-16/XMODEM over the 92 bytes before it, measured on every real header. Sourcing: rung 1, layout and Huffman scheme converted from XADMaster's XADPackItParser.m and XADStuffItHuffmanHandle.m (LGPL-2.1-or-later), notice in THIRD-PARTY-NOTICE.XADMaster.txt. # DiskDoubler: real header, methods 0/1/6/9 decoded, the rest refused Symptom: compressed DiskDoubler forks were returned as their compressed bytes, without an error, and real DiskDoubler files did not parse. Root cause: the reader and writer used an invented 82-byte header with a name field. A real file opens with the magic 0xABCD0054 and an 84-byte header (sizes, per-fork method, version bytes, dates, type/creator, per-fork checksums and delta types, CRC-16), often behind a MacBinary wrapper; the extract path had no decoder for any method but stored. Change: reader and writer rewritten to the real layout, with header CRC check and MacBinary detection; magic-based detection added. Decoded: 0 (stored), 1 (Unix compress with its 0x5A-masked header and byte-sum check), 6 and 9 ("AD" LZSS blocks with per-block header XOR). Methods 2-5, 7, 8, 10 and delta pre-processing throw NotSupportedException. The writer emits a stored single file. Evidence: on the dexvert DiskDoubler sample set (not committed: unknown redistribution terms; runs from test-corpus/diskdoubler when present) every method 6/9 fork is identical to unar's output; the one method-1 sample decodes 2 bytes short of its size in unar and in gzip alike and we refuse it the same way; the Compact Pro (8) samples are refused. unar extracts files we write. Sourcing: rung 1, layout and the AD decoder converted from XADMaster's XADDiskDoublerParser.m and XADDiskDoublerADnHandle.m (LGPL-2.1-or-later), notice in THIRD-PARTY-NOTICE.XADMaster.txt. * regenerate package references --- .../DiskDoubler/DiskDoublerOracleTests.cs | 103 ++++ .../DiskDoubler/DiskDoublerTests.cs | 408 ++++++++-------- .../PackIt/PackItInPlaceModifyTests.cs | 37 +- Compression.Tests/PackIt/PackItOracleTests.cs | 108 +++++ Compression.Tests/PackIt/PackItTests.cs | 458 +++++++++--------- .../DiskDoublerAdDecoder.cs | 109 +++++ .../DiskDoublerConstants.cs | 32 +- .../DiskDoublerEntry.cs | 33 +- .../DiskDoublerFormatDescriptor.cs | 14 +- .../DiskDoublerReader.cs | 283 ++++++----- .../DiskDoublerWriter.cs | 75 ++- .../THIRD-PARTY-NOTICE.XADMaster.txt | 34 ++ .../FileFormat.PackIt/PackItConstants.cs | 23 +- .../FileFormat.PackIt/PackItEntry.cs | 28 +- .../PackItFormatDescriptor.cs | 42 +- .../FileFormat.PackIt/PackItHuffmanDecoder.cs | 85 ++++ .../FileFormat.PackIt/PackItModifier.cs | 197 ++------ .../FileFormat.PackIt/PackItReader.cs | 287 ++++++----- .../FileFormat.PackIt/PackItWriter.cs | 95 ++-- .../THIRD-PARTY-NOTICE.XADMaster.txt | 34 ++ Hawkynt.FileFormats.Archives/README.md | 4 +- Hawkynt.FileFormats.Archives/REFERENCE.md | 62 ++- docs/catalogue/GAPS.md | 4 +- docs/catalogue/reference-formats.csv | 6 +- 24 files changed, 1557 insertions(+), 1004 deletions(-) create mode 100644 Compression.Tests/DiskDoubler/DiskDoublerOracleTests.cs create mode 100644 Compression.Tests/PackIt/PackItOracleTests.cs create mode 100644 Hawkynt.FileFormats.Archives/FileFormats/FileFormat.DiskDoubler/DiskDoublerAdDecoder.cs create mode 100644 Hawkynt.FileFormats.Archives/FileFormats/FileFormat.DiskDoubler/THIRD-PARTY-NOTICE.XADMaster.txt create mode 100644 Hawkynt.FileFormats.Archives/FileFormats/FileFormat.PackIt/PackItHuffmanDecoder.cs create mode 100644 Hawkynt.FileFormats.Archives/FileFormats/FileFormat.PackIt/THIRD-PARTY-NOTICE.XADMaster.txt diff --git a/Compression.Tests/DiskDoubler/DiskDoublerOracleTests.cs b/Compression.Tests/DiskDoubler/DiskDoublerOracleTests.cs new file mode 100644 index 000000000..4b788c66c --- /dev/null +++ b/Compression.Tests/DiskDoubler/DiskDoublerOracleTests.cs @@ -0,0 +1,103 @@ +#pragma warning disable CS1591 +using System.Security.Cryptography; +using FileFormat.DiskDoubler; + +namespace Compression.Tests.DiskDoubler; + +/// +/// DiskDoubler against The Unarchiver (unar, XADMaster), the maintained reader of the format. +/// +[TestFixture] +[Category("ExternalInterop")] +public class DiskDoublerOracleTests { + private string _dir = null!; + + [SetUp] + public void SetUp() { + this._dir = Path.Combine(Path.GetTempPath(), "cwb_dd_" + Guid.NewGuid().ToString("N")[..8]); + Directory.CreateDirectory(this._dir); + } + + [TearDown] + public void TearDown() { + try { Directory.Delete(this._dir, true); } catch { /* best effort */ } + } + + private static void RequireUnar() { + if (!FsInteropToolbox.WslAvailable) + Assert.Ignore("WSL not available."); + if (!FsInteropToolbox.WslHasTool("unar")) + Assert.Ignore("unar is not installed. Run inside WSL / on Linux: `sudo apt install -y unar`."); + } + + /// Extracts with unar, data forks only; returns whether unar succeeded and the single file it wrote. + private (bool Ok, byte[]? Data) UnarDataFork(string file) { + var into = Path.Combine(this._dir, "unar_" + Guid.NewGuid().ToString("N")[..6]); + Directory.CreateDirectory(into); + var r = FsInteropToolbox.RunWsl( + $"unar -q -f -k skip -D -o {FsInteropToolbox.WinToWsl(into)} {FsInteropToolbox.WinToWsl(file)}"); + var files = Directory.GetFiles(into, "*", SearchOption.AllDirectories); + return (r.ExitCode == 0, files.Length == 1 ? File.ReadAllBytes(files[0]) : null); + } + + [Test] + public void FileWeWrote_ExtractsInUnar() { + RequireUnar(); + var payload = new byte[6000]; + new Random(11).NextBytes(payload); + var path = Path.Combine(this._dir, "ours.dd"); + var w = new DiskDoublerWriter(); + w.SetFile(payload, "BINA", "????"); + using (var fs = File.Create(path)) + w.WriteTo(fs); + + var (ok, data) = this.UnarDataFork(path); + Assert.That(ok, Is.True, "unar rejected a file we wrote"); + Assert.That(data, Is.EqualTo(payload)); + } + + /// + /// Real DiskDoubler files, dropped into test-corpus/diskdoubler/ (not committed: their + /// redistribution terms are unknown). The dexvert sample set (sembiance.com/fileFormatSamples/archive/ + /// diskDoubler) covers methods 1, 6, 8 and 9. Every data fork we decode must match unar's; the ones we + /// refuse must be refused with , never returned undecoded. + /// + [Test] + public void RealFiles_InTestCorpus_MatchUnarOrAreRefused() { + var corpus = Path.GetFullPath(Path.Combine(TestContext.CurrentContext.TestDirectory, "..", "..", "..", "..", "test-corpus", "diskdoubler")); + if (!Directory.Exists(corpus)) + Assert.Ignore($"No real DiskDoubler files under {corpus}."); + RequireUnar(); + + var decoded = 0; + foreach (var file in Directory.EnumerateFiles(corpus).Order()) { + var head = new byte[300]; + using (var fs = File.OpenRead(file)) + head = head[..fs.ReadAtLeast(head, head.Length, throwOnEndOfStream: false)]; + if (!DiskDoublerReader.IsDiskDoubler(head)) + continue; + + using var r = new DiskDoublerReader(File.OpenRead(file)); + var data = r.Entries.FirstOrDefault(e => e.IsDataFork && e.OriginalSize > 0); + if (data is null) + continue; + if (!data.IsSupported) { + Assert.Throws(() => r.Extract(data), Path.GetFileName(file)); + continue; + } + var (ok, theirs) = this.UnarDataFork(file); + if (!ok) { + // unar rejects the fork (the corpus's one method-1 file decodes 2 bytes short of its size and + // fails its checksum, in unar and in gzip alike): we must reject it too, not return it. + Assert.Throws(() => r.Extract(data), $"{Path.GetFileName(file)}: unar refused it"); + continue; + } + Assert.That(theirs, Is.Not.Null, $"{Path.GetFileName(file)}: unar produced no single data fork"); + Assert.That(SHA256.HashData(r.Extract(data)), Is.EqualTo(SHA256.HashData(theirs!)), + $"{Path.GetFileName(file)} (method {data.Method})"); + ++decoded; + } + if (decoded == 0) + Assert.Ignore("No DiskDoubler file in the corpus uses a method this reader decodes."); + } +} diff --git a/Compression.Tests/DiskDoubler/DiskDoublerTests.cs b/Compression.Tests/DiskDoubler/DiskDoublerTests.cs index db7a20151..5522b0e4b 100644 --- a/Compression.Tests/DiskDoubler/DiskDoublerTests.cs +++ b/Compression.Tests/DiskDoubler/DiskDoublerTests.cs @@ -1,5 +1,7 @@ using System.Buffers.Binary; -using System.Text; +using Compression.Core.Checksums; +using Compression.Core.Streams; +using FileFormat.Compress; using FileFormat.DiskDoubler; namespace Compression.Tests.DiskDoubler; @@ -7,248 +9,272 @@ namespace Compression.Tests.DiskDoubler; [TestFixture] public class DiskDoublerTests { - // ── Archive builder helper ──────────────────────────────────────────────────── - - /// - /// Builds a minimal DiskDoubler file with the given data and resource fork parameters. - /// - private static byte[] BuildDdFile( - string name, - byte dataMethod, - byte[] dataBytes, - uint dataOrigSize, - byte rsrcMethod, - byte[] rsrcBytes, - uint rsrcOrigSize) { - - var hdr = new byte[DiskDoublerReader.HeaderSize]; - // [4..8] file type "TEXT" - Encoding.ASCII.GetBytes("TEXT").CopyTo(hdr, 4); - // [8..12] creator "CWIE" - Encoding.ASCII.GetBytes("CWIE").CopyTo(hdr, 8); - // [16..20] data fork original size - BinaryPrimitives.WriteUInt32BigEndian(hdr.AsSpan(16, 4), dataOrigSize); - // [20..24] data fork compressed size - BinaryPrimitives.WriteUInt32BigEndian(hdr.AsSpan(20, 4), (uint)dataBytes.Length); - // [24..28] resource fork original size - BinaryPrimitives.WriteUInt32BigEndian(hdr.AsSpan(24, 4), rsrcOrigSize); - // [28..32] resource fork compressed size - BinaryPrimitives.WriteUInt32BigEndian(hdr.AsSpan(28, 4), (uint)rsrcBytes.Length); - // [32] data method, [33] rsrc method - hdr[32] = dataMethod; - hdr[33] = rsrcMethod; - // [34] Pascal name length, [35..] name - var nameBytes = Encoding.Latin1.GetBytes(name); - var nameLen = Math.Min(nameBytes.Length, 47); - hdr[34] = (byte)nameLen; - Array.Copy(nameBytes, 0, hdr, 35, nameLen); + // ── Builders ────────────────────────────────────────────────────────────────── - using var ms = new MemoryStream(); - ms.Write(hdr); - ms.Write(dataBytes); - ms.Write(rsrcBytes); - return ms.ToArray(); + /// Builds a DiskDoubler file in the real 84-byte layout around already-encoded forks. + internal static byte[] BuildDdFile( + byte dataMethod, byte[] dataBytes, uint dataSize, + byte rsrcMethod = 0, byte[]? rsrcBytes = null, uint rsrcSize = 0, + ushort dataChecksum = 0, ushort dataDelta = 0, byte info1 = 0x2A, bool zeroHeaderCrc = false) { + rsrcBytes ??= []; + var hdr = new byte[84]; + BinaryPrimitives.WriteUInt32BigEndian(hdr, 0xABCD0054); + BinaryPrimitives.WriteUInt32BigEndian(hdr.AsSpan(4), dataSize); + BinaryPrimitives.WriteUInt32BigEndian(hdr.AsSpan(8), (uint)dataBytes.Length); + BinaryPrimitives.WriteUInt32BigEndian(hdr.AsSpan(12), rsrcSize); + BinaryPrimitives.WriteUInt32BigEndian(hdr.AsSpan(16), (uint)rsrcBytes.Length); + hdr[20] = dataMethod; + hdr[21] = rsrcMethod; + hdr[22] = info1; + "TEXT"u8.CopyTo(hdr.AsSpan(32)); + "ttxt"u8.CopyTo(hdr.AsSpan(36)); + BinaryPrimitives.WriteUInt16BigEndian(hdr.AsSpan(48), dataChecksum); + BinaryPrimitives.WriteUInt16BigEndian(hdr.AsSpan(54), dataDelta); + if (!zeroHeaderCrc) + BinaryPrimitives.WriteUInt16BigEndian(hdr.AsSpan(82), Crc16Ccitt.Compute(hdr.AsSpan(0, 82))); + return [.. hdr, .. dataBytes, .. rsrcBytes]; } - /// Builds a DiskDoubler file with a stored data fork only. - private static byte[] BuildStoredFile(string name, byte[] data) => - BuildDdFile(name, 0, data, (uint)data.Length, 0, [], 0); + private static DiskDoublerReader Open(byte[] file, string name = "doc") => new(new MemoryStream(file), name: name); - // ── Header parsing ──────────────────────────────────────────────────────────── + /// Encodes a method-1 fork: a .Z stream of the XOR-masked data, its header masked too. + private static (byte[] Fork, ushort Checksum) CompressFork(byte[] data) { + var masked = data.Select(b => (byte)(b ^ 0x5A)).ToArray(); + using var ms = new MemoryStream(); + using (var z = new CompressStream(ms, CompressionStreamMode.Compress, leaveOpen: true)) + z.Write(masked); + var fork = ms.ToArray(); + var checksum = (ushort)(data.Sum(b => (int)b) + fork[0] + fork[1] + fork[2]); + for (var i = 0; i < 3; ++i) fork[i] ^= 0x5A; + return (fork, checksum); + } - [Test, Category("HappyPath")] - public void Parse_StoredDataFork_OneEntry() { - var archive = BuildStoredFile("hello.txt", "Hello!"u8.ToArray()); - using var ms = new MemoryStream(archive); - var r = new DiskDoublerReader(ms); - Assert.That(r.Entries, Has.Count.EqualTo(1)); + /// Builds one "AD" block header for a block body of bytes. + private static byte[] AdBlockHeader(int compSize, int uncompSize, byte flags) { + var h = new byte[12]; + BinaryPrimitives.WriteUInt16BigEndian(h, (ushort)compSize); + BinaryPrimitives.WriteUInt16BigEndian(h.AsSpan(2), (ushort)uncompSize); + h[9] = flags; + byte x = 0; + for (var i = 0; i < 11; ++i) x ^= h[i]; + h[11] = x; + return h; } - [Test, Category("HappyPath")] - public void Parse_Entry_IsDataFork() { - var archive = BuildStoredFile("readme.txt", [0x41]); - using var ms = new MemoryStream(archive); - var r = new DiskDoublerReader(ms); - Assert.That(r.Entries[0].IsDataFork, Is.True); + private static byte[] PackBits(string bits) { + bits = bits.Replace(" ", ""); + var result = new byte[(bits.Length + 7) / 8]; + for (var i = 0; i < bits.Length; ++i) + if (bits[i] == '1') result[i >> 3] |= (byte)(0x80 >> (i & 7)); + return result; } + // ── Header ──────────────────────────────────────────────────────────────────── + [Test, Category("HappyPath")] - public void Parse_Entry_Name() { - var archive = BuildStoredFile("document.txt", [0x41]); - using var ms = new MemoryStream(archive); - var r = new DiskDoublerReader(ms); - Assert.That(r.Entries[0].Name, Is.EqualTo("document.txt")); + public void Writer_Layout_MagicSizesAndHeaderCrc() { + var payload = "hello diskdoubler"u8.ToArray(); + var w = new DiskDoublerWriter(); + w.SetFile(payload, "TEXT", "ttxt"); + using var ms = new MemoryStream(); + w.WriteTo(ms); + var file = ms.ToArray(); + + Assert.That(file, Has.Length.EqualTo(84 + payload.Length)); + Assert.That(BinaryPrimitives.ReadUInt32BigEndian(file), Is.EqualTo(0xABCD0054u)); + Assert.That(BinaryPrimitives.ReadUInt32BigEndian(file.AsSpan(4)), Is.EqualTo((uint)payload.Length)); + Assert.That(BinaryPrimitives.ReadUInt32BigEndian(file.AsSpan(8)), Is.EqualTo((uint)payload.Length)); + Assert.That(file[20], Is.Zero, "stored"); + Assert.That(BinaryPrimitives.ReadUInt16BigEndian(file.AsSpan(82)), Is.EqualTo(Crc16Ccitt.Compute(file.AsSpan(0, 82)))); + Assert.That(file.AsSpan(84).SequenceEqual(payload), Is.True); + } + + [Test, Category("HappyPath"), Category("RoundTrip")] + public void Writer_Reader_RoundTrip() { + var payload = new byte[4096]; + new Random(3).NextBytes(payload); + var w = new DiskDoublerWriter(); + w.SetFile(payload); + using var ms = new MemoryStream(); + w.WriteTo(ms); + + using var r = Open(ms.ToArray(), "test.txt"); + var e = r.Entries.Single(); + Assert.That((e.Name, e.IsDataFork, e.Method, e.OriginalSize), Is.EqualTo(("test.txt", true, 0, 4096L))); + Assert.That(r.Extract(e), Is.EqualTo(payload)); } [Test, Category("HappyPath")] - public void Parse_Entry_OriginalSize() { - var data = new byte[512]; - var archive = BuildStoredFile("data.bin", data); - using var ms = new MemoryStream(archive); - var r = new DiskDoublerReader(ms); - Assert.That(r.Entries[0].OriginalSize, Is.EqualTo(512)); + public void Reader_TakesNameFromFileWithoutDdExtension() { + var path = Path.Combine(Path.GetTempPath(), $"cwb_dd_{Guid.NewGuid():N}.txt.dd"); + try { + File.WriteAllBytes(path, BuildDdFile(0, [1, 2, 3], 3)); + using var r = new DiskDoublerReader(File.OpenRead(path)); + Assert.That(r.Entries[0].Name, Is.EqualTo(Path.GetFileName(path)[..^3])); + } finally { + File.Delete(path); + } } [Test, Category("HappyPath")] - public void Parse_Entry_CompressedSize() { - var data = new byte[100]; - var archive = BuildStoredFile("data.bin", data); - using var ms = new MemoryStream(archive); - var r = new DiskDoublerReader(ms); - Assert.That(r.Entries[0].CompressedSize, Is.EqualTo(100)); + public void Reader_BothForks_SecondFollowsFirst() { + var file = BuildDdFile(0, "data"u8.ToArray(), 4, 0, "resource"u8.ToArray(), 8); + using var r = Open(file); + Assert.That(r.Entries.Select(e => e.Name), Is.EqualTo(new[] { "doc", "doc.rsrc" })); + Assert.That(r.Extract(r.Entries[0]), Is.EqualTo("data"u8.ToArray())); + Assert.That(r.Extract(r.Entries[1]), Is.EqualTo("resource"u8.ToArray())); } [Test, Category("HappyPath")] - public void Parse_WithResourceFork_TwoEntries() { - var data = "data fork"u8.ToArray(); - var rsrc = "rsrc fork"u8.ToArray(); - var archive = BuildDdFile("mac.txt", 0, data, (uint)data.Length, - 0, rsrc, (uint)rsrc.Length); - using var ms = new MemoryStream(archive); - var r = new DiskDoublerReader(ms); - Assert.That(r.Entries, Has.Count.EqualTo(2)); - Assert.That(r.Entries[0].IsDataFork, Is.True); - Assert.That(r.Entries[1].IsDataFork, Is.False); + public void Reader_ResourceForkOnly_HasNoDataEntry() { + using var r = Open(BuildDdFile(0, [], 0, 0, "rsrc"u8.ToArray(), 4)); + Assert.That(r.Entries.Single().IsDataFork, Is.False); } [Test, Category("HappyPath")] - public void Parse_ResourceForkEntry_NameSuffix() { - byte[] data = [0x41]; - byte[] rsrc = [0x42]; - var archive = BuildDdFile("file", 0, data, 1u, 0, rsrc, 1u); - using var ms = new MemoryStream(archive); - var r = new DiskDoublerReader(ms); - Assert.That(r.Entries[1].Name, Does.EndWith(".rsrc")); + public void Reader_MacBinaryWrapped_IsFound() { + var file = new byte[128].Concat(BuildDdFile(0, "wrapped"u8.ToArray(), 7)).ToArray(); + Assert.That(DiskDoublerReader.IsDiskDoubler(file), Is.True); + using var r = Open(file); + Assert.That(r.Extract(r.Entries[0]), Is.EqualTo("wrapped"u8.ToArray())); } [Test, Category("EdgeCase")] - public void Parse_EmptyName_NoException() { - var archive = BuildStoredFile("", [0x41]); - using var ms = new MemoryStream(archive); - var r = new DiskDoublerReader(ms); - Assert.That(r.Entries[0].Name, Is.EqualTo(string.Empty)); + public void Reader_ZeroHeaderCrc_AcceptedAsOldFile() { + using var r = Open(BuildDdFile(0, [9], 1, zeroHeaderCrc: true)); + Assert.That(r.Extract(r.Entries[0]), Is.EqualTo(new byte[] { 9 })); } - // ── Extraction ──────────────────────────────────────────────────────────────── + [Test, Category("Exception")] + public void Reader_WrongHeaderCrc_Throws() { + var file = BuildDdFile(0, [9], 1); + file[40] ^= 0x01; // Finder flags + Assert.Throws(() => _ = Open(file)); + } - [Test, Category("HappyPath"), Category("RoundTrip")] - public void Extract_StoredEntry_ReturnsOriginalData() { - var original = "Hello, DiskDoubler!"u8.ToArray(); - var archive = BuildStoredFile("hello.txt", original); - using var ms = new MemoryStream(archive); - var r = new DiskDoublerReader(ms); - var result = r.Extract(r.Entries[0]); - Assert.That(result, Is.EqualTo(original)); + [Test, Category("Exception")] + [TestCase(new byte[0])] + [TestCase(new byte[] { 0xAB, 0xCD, 0x00, 0x54 })] + [TestCase(new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 })] + public void Reader_NotDiskDoubler_Throws(byte[] bytes) => + Assert.Throws(() => _ = Open(bytes)); + + [Test, Category("Exception")] + public void Reader_ForksPastEndOfFile_Throws() { + var file = BuildDdFile(0, new byte[100], 100); + Assert.Throws(() => _ = Open(file[..^1])); } - [Test, Category("HappyPath"), Category("RoundTrip")] - public void Extract_BinaryData_RoundTrips() { - var original = new byte[256]; - for (var i = 0; i < 256; ++i) original[i] = (byte)i; - var archive = BuildStoredFile("all-bytes.bin", original); - using var ms = new MemoryStream(archive); - var r = new DiskDoublerReader(ms); - Assert.That(r.Extract(r.Entries[0]), Is.EqualTo(original)); + // ── Methods ─────────────────────────────────────────────────────────────────── + + [Test, Category("RoundTrip")] + public void Method1_Compress_DecodesAndChecksSum() { + var data = System.Text.Encoding.ASCII.GetBytes(string.Concat(Enumerable.Repeat("DiskDoubler compress fork. ", 50))); + var (fork, checksum) = CompressFork(data); + using var r = Open(BuildDdFile(1, fork, (uint)data.Length, dataChecksum: checksum)); + Assert.That(r.Extract(r.Entries[0]), Is.EqualTo(data)); } - [Test, Category("EdgeCase"), Category("RoundTrip")] - public void Extract_EmptyDataFork_ReturnsEmpty() { - var archive = BuildDdFile("empty", 0, [], 0u, 0, [], 0u); - using var ms = new MemoryStream(archive); - var r = new DiskDoublerReader(ms); - // No entries expected (both forks are zero-sized). - Assert.That(r.Entries, Is.Empty); + [Test, Category("Exception")] + public void Method1_WrongChecksum_Throws() { + var data = "some bytes to compress"u8.ToArray(); + var (fork, checksum) = CompressFork(data); + using var r = Open(BuildDdFile(1, fork, (uint)data.Length, dataChecksum: (ushort)(checksum + 1))); + Assert.Throws(() => r.Extract(r.Entries[0])); } [Test, Category("HappyPath")] - public void Extract_UnsupportedMethod_ReturnsRawBytes() { - // Method 3 (LZC) is proprietary — reader returns raw compressed bytes. - var compressed = new byte[] { 0xAB, 0xCD, 0xEF }; - var archive = BuildDdFile("file.bin", 3, compressed, 100u, 0, [], 0u); - using var ms = new MemoryStream(archive); - var r = new DiskDoublerReader(ms); - var result = r.Extract(r.Entries[0]); - Assert.That(result, Is.EqualTo(compressed)); + [TestCase((byte)6)] + [TestCase((byte)9)] + public void MethodAd_StoredAndCompressedBlocks(byte method) { + // Block 1 stored: "ABC". Block 2 compressed: literal 'x', literal 'y', match distance 2 length 4 + // ("xyxy" overlapping), literal 'z' → "xyxyxyz". + var block2 = PackBits( + "0 01111000" + // literal 'x' + "0 01111001" + // literal 'y' + "1 0 00000010 101" + // match, near (8-bit) distance 2, length 4 + "0 01111010"); // literal 'z' + var fork = AdBlockHeader(3, 3, 0x01).Concat("ABC"u8.ToArray()) + .Concat(AdBlockHeader(block2.Length, 7, 0x08)).Concat(block2).ToArray(); + + using var r = Open(BuildDdFile(method, fork, 10)); + Assert.That(r.Extract(r.Entries[0]), Is.EqualTo("ABCxyxyxyz"u8.ToArray())); + } + + [Test, Category("Boundary")] + [TestCase("1 0 00000000 0", Description = "distance 0")] + [TestCase("1 0 00000001 0", Description = "distance before the block start")] + public void MethodAd_MatchOutsideBlock_Throws(string bits) { + var body = PackBits(bits); + var fork = AdBlockHeader(body.Length, 2, 0x08).Concat(body).ToArray(); + using var r = Open(BuildDdFile(6, fork, 2)); + Assert.Throws(() => r.Extract(r.Entries[0])); + } + + [Test, Category("Exception")] + public void MethodAd_BadBlockHeaderXor_Throws() { + var fork = AdBlockHeader(1, 1, 0x01).Concat(new byte[] { 0x41 }).ToArray(); + fork[11] ^= 0xFF; + using var r = Open(BuildDdFile(6, fork, 1)); + Assert.Throws(() => r.Extract(r.Entries[0])); } - // ── Error handling ──────────────────────────────────────────────────────────── + [Test, Category("Exception")] + [TestCase((byte)2)] + [TestCase((byte)3)] + [TestCase((byte)4)] + [TestCase((byte)5)] + [TestCase((byte)7)] + [TestCase((byte)8)] + [TestCase((byte)10)] + [TestCase((byte)11)] + public void UndecodedMethods_AreRefusedNotReturnedRaw(byte method) { + using var r = Open(BuildDdFile(method, [1, 2, 3, 4], 100)); + Assert.That(r.Entries[0].IsSupported, Is.False); + Assert.Throws(() => r.Extract(r.Entries[0])); + } - [Test, Category("ErrorHandling")] - public void Ctor_StreamTooShort_Throws() { - var tooShort = new byte[10]; - using var ms = new MemoryStream(tooShort); - Assert.Throws(() => _ = new DiskDoublerReader(ms)); + [Test, Category("Exception")] + public void DeltaPreprocessing_IsRefused() { + using var r = Open(BuildDdFile(0, [1, 2, 3], 3, dataDelta: 1)); + Assert.Throws(() => r.Extract(r.Entries[0])); + } + + [Test, Category("HappyPath")] + public void Method_HighBitFlag_IsMasked() { + using var r = Open(BuildDdFile(0x80, [7], 1)); + Assert.That(r.Entries[0].Method, Is.Zero); + Assert.That(r.Extract(r.Entries[0]), Is.EqualTo(new byte[] { 7 })); } - [Test, Category("ErrorHandling")] + // ── Descriptor ──────────────────────────────────────────────────────────────── + + [Test, Category("Exception")] public void Extract_NullEntry_Throws() { - var archive = BuildStoredFile("x", [0x41]); - using var ms = new MemoryStream(archive); - var r = new DiskDoublerReader(ms); + using var r = Open(BuildDdFile(0, [1], 1)); Assert.Throws(() => r.Extract(null!)); } - [Test, Category("ErrorHandling")] + [Test, Category("Exception")] public void Dispose_ThenExtract_Throws() { - var archive = BuildStoredFile("f.txt", [0x41]); - using var ms = new MemoryStream(archive); - var r = new DiskDoublerReader(ms); + var r = Open(BuildDdFile(0, [1], 1)); var entry = r.Entries[0]; r.Dispose(); Assert.Throws(() => r.Extract(entry)); } - // ── leaveOpen ───────────────────────────────────────────────────────────────── - - [Test, Category("HappyPath")] - public void LeaveOpen_True_StreamRemainsUsable() { - var archive = BuildStoredFile("f.txt", [0x41]); - using var ms = new MemoryStream(archive); - using (var r = new DiskDoublerReader(ms, leaveOpen: true)) { - _ = r.Entries; - } - Assert.That(ms.CanRead, Is.True); - } - - [Test, Category("HappyPath")] - public void Descriptor_ReportsWormCapability() { - var d = new DiskDoublerFormatDescriptor(); - Assert.That(d.Capabilities.HasFlag(Compression.Registry.FormatCapabilities.CanCreate), Is.True); - } - [Test, Category("HappyPath"), Category("RoundTrip")] - public void Writer_Stored_RoundTrips() { - var payload = "hello diskdoubler"u8.ToArray(); - var w = new DiskDoublerWriter(); - w.SetFile("test.txt", payload); + public void Descriptor_Create_ThenList() { + var d = new DiskDoublerFormatDescriptor(); using var ms = new MemoryStream(); - w.WriteTo(ms); + ((Compression.Registry.IArchiveCreatable)d).Create( + ms, + [Compression.Registry.ArchiveInputInfo.InMemory("payload.bin", "dd descriptor"u8.ToArray())], + new Compression.Registry.FormatCreateOptions()); ms.Position = 0; - - var r = new DiskDoublerReader(ms); - Assert.That(r.Entries, Has.Count.EqualTo(1)); - Assert.That(r.Entries[0].Name, Is.EqualTo("test.txt")); - Assert.That(r.Entries[0].OriginalSize, Is.EqualTo(payload.Length)); - Assert.That(r.Extract(r.Entries[0]), Is.EqualTo(payload)); - } - - [Test, Category("HappyPath"), Category("RoundTrip")] - public void Descriptor_Create_RoundTrips() { - var tmp = Path.GetTempFileName(); - try { - File.WriteAllBytes(tmp, "dd descriptor"u8.ToArray()); - var d = new DiskDoublerFormatDescriptor(); - using var ms = new MemoryStream(); - ((Compression.Registry.IArchiveCreatable)d).Create( - ms, - [new Compression.Registry.ArchiveInputInfo(tmp, "payload.bin", false)], - new Compression.Registry.FormatCreateOptions()); - ms.Position = 0; - var entries = d.List(ms, null); - Assert.That(entries, Has.Count.EqualTo(1)); - Assert.That(entries[0].Name, Is.EqualTo("payload.bin")); - } finally { - File.Delete(tmp); - } + var entries = d.List(ms, null); + Assert.That(entries, Has.Count.EqualTo(1)); + Assert.That(entries[0].OriginalSize, Is.EqualTo(13)); + Assert.That(entries[0].Method, Is.EqualTo("None")); } } diff --git a/Compression.Tests/PackIt/PackItInPlaceModifyTests.cs b/Compression.Tests/PackIt/PackItInPlaceModifyTests.cs index 78715570f..57feb2179 100644 --- a/Compression.Tests/PackIt/PackItInPlaceModifyTests.cs +++ b/Compression.Tests/PackIt/PackItInPlaceModifyTests.cs @@ -6,14 +6,15 @@ namespace Compression.Tests.PackIt; /// /// Locks PackIt's modifier as TRUE in-place at the byte level: /// -/// Add: appends a new entry at EOF. The entire pre-existing byte range -/// [0, oldLength) must be byte-identical at the original offsets. +/// Add: writes the new entry over the "PEnd" marker and re-appends the +/// marker. Every byte before the marker, [0, oldLength - 4), must be +/// byte-identical at the original offsets. /// Remove of last entry: the surviving prefix at [0, removedEntryOffset) -/// must be byte-identical at the original offsets. +/// must be byte-identical at the original offsets, followed by the marker. /// /// These are the contract that distinguishes a real random-access modifier -/// from a rebuild-disguised one. PackIt has no central directory and no -/// trailing footer, so an EOF-append is a clean in-place mutation. +/// from a rebuild-disguised one. PackIt has no central directory; its only +/// trailer is the four-byte "PEnd" marker. /// [TestFixture] public class PackItInPlaceModifyTests { @@ -36,9 +37,11 @@ public void AddFile_PrefixBytesAreByteIdenticalAtOriginalOffsets() { var after = ms.ToArray(); Assert.That(after.Length, Is.GreaterThan(oldLength), "Append must grow the archive."); - Assert.That(after.AsSpan(0, oldLength).SequenceEqual(before), + Assert.That(after.AsSpan(0, oldLength - 4).SequenceEqual(before.AsSpan(0, oldLength - 4)), Is.True, - "Pre-existing bytes [0, oldLength) must be byte-identical at original offsets."); + "Pre-existing entries [0, oldLength - 4) must be byte-identical at original offsets."); + Assert.That(after.AsSpan(after.Length - 4).SequenceEqual("PEnd"u8), Is.True, + "The end marker must follow the appended entry."); } [Test, Category("Contract")] @@ -50,9 +53,9 @@ public void AddFile_AppendsNewEntryAtEofOnly() { ms.Write(seed); PackItModifier.AddFile(ms, "added.bin", new byte[42]); - // The added entry occupies exactly [oldLength, newLength). - // 87-byte header + 42-byte data = 129 byte entry. - Assert.That(ms.Length, Is.EqualTo(oldLength + 87 + 42)); + // The added entry occupies exactly [oldLength - 4, newLength - 4): + // 4-byte magic + 94-byte header + 42-byte data fork + 2-byte fork CRC. + Assert.That(ms.Length, Is.EqualTo(oldLength + 4 + 94 + 42 + 2)); } [Test, Category("Contract")] @@ -73,11 +76,12 @@ public void RemoveLastEntry_PrefixBytesAreByteIdenticalAtOriginalOffsets() { Assert.That(removed, Is.True); var after = ms.ToArray(); - Assert.That(after.Length, Is.EqualTo(droppedEntryOffset), - "Removing the last entry must truncate to exactly the dropped entry's start offset."); - Assert.That(after.AsSpan().SequenceEqual(seed.AsSpan(0, (int)droppedEntryOffset)), + Assert.That(after.Length, Is.EqualTo(droppedEntryOffset + 4), + "Removing the last entry must leave exactly the survivors plus the end marker."); + Assert.That(after.AsSpan(0, (int)droppedEntryOffset).SequenceEqual(seed.AsSpan(0, (int)droppedEntryOffset)), Is.True, "Survivor prefix [0, removedEntryOffset) must be byte-identical at original offsets."); + Assert.That(after.AsSpan((int)droppedEntryOffset).SequenceEqual("PEnd"u8), Is.True); } [Test, Category("Contract")] @@ -114,17 +118,14 @@ private static byte[] BuildSeedPit(params (string Name, byte[] Data)[] files) { /// /// Walks the PackIt entry chain on a buffer copy and returns the byte - /// offset of the named entry's "PMag"/"PMa4" magic (i.e. the entry's - /// 87-byte fixed header begins at this offset). + /// offset of the named entry's "PMag"/"PMa4" magic. /// private static long FindEntryOffset(byte[] data, string targetName) { using var ms = new MemoryStream(data); using var r = new PackItReader(ms, leaveOpen: true); foreach (var e in r.Entries) { if (!string.Equals(e.Name, targetName, StringComparison.OrdinalIgnoreCase)) continue; - // The reader exposes the data-fork offset; the entry's header magic is - // 87 bytes earlier (PackItReader.EntryHeaderSize). - return e.DataOffset - PackItReader.EntryHeaderSize; + return e.EntryOffset; } throw new InvalidOperationException($"Entry '{targetName}' not found in seed archive."); } diff --git a/Compression.Tests/PackIt/PackItOracleTests.cs b/Compression.Tests/PackIt/PackItOracleTests.cs new file mode 100644 index 000000000..a134475cf --- /dev/null +++ b/Compression.Tests/PackIt/PackItOracleTests.cs @@ -0,0 +1,108 @@ +#pragma warning disable CS1591 +using System.Security.Cryptography; +using FileFormat.PackIt; + +namespace Compression.Tests.PackIt; + +/// +/// PackIt against The Unarchiver (unar, XADMaster), the maintained reader of the format: +/// what we write it must read, what it reads we must read the same way. +/// +[TestFixture] +[Category("ExternalInterop")] +public class PackItOracleTests { + private string _dir = null!; + + [SetUp] + public void SetUp() { + this._dir = Path.Combine(Path.GetTempPath(), "cwb_pit_" + Guid.NewGuid().ToString("N")[..8]); + Directory.CreateDirectory(this._dir); + } + + [TearDown] + public void TearDown() { + try { Directory.Delete(this._dir, true); } catch { /* best effort */ } + } + + private static void RequireUnar() { + if (!FsInteropToolbox.WslAvailable) + Assert.Ignore("WSL not available."); + if (!FsInteropToolbox.WslHasTool("unar")) + Assert.Ignore("unar is not installed. Run inside WSL / on Linux: `sudo apt install -y unar`."); + } + + /// Extracts with unar (data forks only) and returns file name → bytes. + private Dictionary Unar(string archive, bool requireSuccess = true) { + var into = Path.Combine(this._dir, "unar_" + Path.GetFileNameWithoutExtension(archive)); + Directory.CreateDirectory(into); + var r = FsInteropToolbox.RunWsl( + $"unar -q -f -k skip -D -o {FsInteropToolbox.WinToWsl(into)} {FsInteropToolbox.WinToWsl(archive)}"); + if (requireSuccess) + Assert.That(r.ExitCode, Is.EqualTo(0), $"unar failed:\n{r.StdOut}\n{r.StdErr}"); + return Directory.EnumerateFiles(into, "*", SearchOption.AllDirectories) + .ToDictionary(f => Path.GetFileName(f), File.ReadAllBytes, StringComparer.Ordinal); + } + + [Test] + public void ArchiveWeWrote_ExtractsInUnar() { + RequireUnar(); + var text = "a short line of text\n"u8.ToArray(); + var random = new byte[5000]; + new Random(17).NextBytes(random); + var path = Path.Combine(this._dir, "ours.pit"); + using (var fs = File.Create(path)) + using (var w = new PackItWriter(fs)) { + w.AddFile("A.TXT", text); + w.AddFile("B.BIN", random, "BINA", "????", resourceFork: "rsrc"u8.ToArray()); + w.AddFile("EMPTY", []); + } + + var got = this.Unar(path); + Assert.That(got["A.TXT"], Is.EqualTo(text)); + Assert.That(got["B.BIN"], Is.EqualTo(random)); + Assert.That(got["EMPTY"], Is.Empty); + } + + [Test] + public void HuffmanEntry_DecodesTheSameInUnarAndHere() { + RequireUnar(); + var data = System.Text.Encoding.ASCII.GetBytes(string.Concat(Enumerable.Repeat("PackIt II Huffman, oracle check. ", 60))); + var path = Path.Combine(this._dir, "huff.pit"); + using (var fs = File.Create(path)) { + PackItTestEncoder.WriteCompressedEntry(fs, "HUFF.TXT", data, []); + fs.Write("PEnd"u8); + } + + Assert.That(this.Unar(path)["HUFF.TXT"], Is.EqualTo(data), "unar's reading of the stream"); + using var r = new PackItReader(File.OpenRead(path)); + Assert.That(r.Extract(r.Entries.Single()), Is.EqualTo(data), "our reading of the same stream"); + } + + /// + /// Real PackIt archives, dropped into test-corpus/packit/ (not committed: their redistribution + /// terms are unknown). The dexvert sample set (sembiance.com/fileFormatSamples/archive/packIt) holds + /// nine, seven of them Huffman-coded. Every data fork must match what unar extracts. + /// + [Test] + public void RealArchives_InTestCorpus_MatchUnar() { + var corpus = Path.GetFullPath(Path.Combine(TestContext.CurrentContext.TestDirectory, "..", "..", "..", "..", "test-corpus", "packit")); + if (!Directory.Exists(corpus) || !Directory.EnumerateFiles(corpus, "*.pit").Any()) + Assert.Ignore($"No real .pit files under {corpus}."); + RequireUnar(); + + var checkedForks = 0; + foreach (var file in Directory.EnumerateFiles(corpus, "*.pit").Order()) { + // unar cannot open a resource-fork-only entry while skipping forks; every data fork still lands. + var expected = this.Unar(file, requireSuccess: false); + using var r = new PackItReader(File.OpenRead(file)); + Assert.That(r.IsIncomplete, Is.False, file); + foreach (var e in r.Entries.Where(e => e.DataForkSize > 0)) { + var ours = r.Extract(e); + Assert.That(expected.TryGetValue(e.Name, out var theirs), Is.True, $"{file}: unar produced no '{e.Name}'"); + Assert.That(SHA256.HashData(ours), Is.EqualTo(SHA256.HashData(theirs!)), $"{file}: '{e.Name}'"); + ++checkedForks; + } + } + Assert.That(checkedForks, Is.GreaterThan(0)); + } +} diff --git a/Compression.Tests/PackIt/PackItTests.cs b/Compression.Tests/PackIt/PackItTests.cs index b43dc542c..903e4a7e1 100644 --- a/Compression.Tests/PackIt/PackItTests.cs +++ b/Compression.Tests/PackIt/PackItTests.cs @@ -1,5 +1,6 @@ using System.Buffers.Binary; using System.Text; +using Compression.Core.Checksums; using FileFormat.PackIt; namespace Compression.Tests.PackIt; @@ -7,294 +8,293 @@ namespace Compression.Tests.PackIt; [TestFixture] public class PackItTests { - // ── Archive builder helper ──────────────────────────────────────────────────── + // ── Helpers ─────────────────────────────────────────────────────────────────── - /// - /// Manually assembles a single PackIt entry in a stream, using the given magic, - /// name, file type, creator, data fork, and resource fork. - /// - private static void WriteRawEntry( - MemoryStream ms, - byte[] magic, - string name, - string fileType, - string creator, - byte[] dataFork, - byte[] rsrcFork) { - - ms.Write(magic); - - // 63-byte Pascal filename field - var nameBytes = Encoding.Latin1.GetBytes(name); - var nameLen = Math.Min(nameBytes.Length, 62); - var nameField = new byte[63]; - nameField[0] = (byte)nameLen; - Array.Copy(nameBytes, 0, nameField, 1, nameLen); - ms.Write(nameField); - - // file type (4) + creator (4) - var typeBytes = PadOrTrunc(Encoding.ASCII.GetBytes(fileType), 4); - var creatorBytes = PadOrTrunc(Encoding.ASCII.GetBytes(creator), 4); - ms.Write(typeBytes); - ms.Write(creatorBytes); - - // Finder flags (2) + locked (1) + pad (1) - ms.Write(new byte[4]); - - // data fork size (uint32 BE) + resource fork size (uint32 BE) - var sizes = new byte[8]; - BinaryPrimitives.WriteUInt32BigEndian(sizes.AsSpan(0, 4), (uint)dataFork.Length); - BinaryPrimitives.WriteUInt32BigEndian(sizes.AsSpan(4, 4), (uint)rsrcFork.Length); - ms.Write(sizes); - - ms.Write(dataFork); - ms.Write(rsrcFork); - } - - private static byte[] PadOrTrunc(byte[] src, int len) { - var dest = new byte[len]; - Array.Copy(src, dest, Math.Min(src.Length, len)); - for (var i = src.Length; i < len; ++i) - dest[i] = (byte)' '; - return dest; - } - - /// Builds a single-entry stored archive. - private static byte[] BuildStoredArchive(string name, byte[] data) { + private static byte[] Write(params (string Name, byte[] Data)[] files) { using var ms = new MemoryStream(); - WriteRawEntry(ms, "PMag"u8.ToArray(), name, "TEXT", "CWIE", data, []); + using (var w = new PackItWriter(ms, leaveOpen: true)) + foreach (var (name, data) in files) + w.AddFile(name, data); return ms.ToArray(); } - // ── Header / entry parsing ──────────────────────────────────────────────────── + private static PackItReader Open(byte[] archive) => new(new MemoryStream(archive)); + + private static readonly DateTime SampleTime = new(1990, 6, 15, 12, 30, 0, DateTimeKind.Utc); + + // ── Layout ──────────────────────────────────────────────────────────────────── [Test, Category("HappyPath")] - public void Parse_SingleStoredEntry_OneEntry() { - var archive = BuildStoredArchive("hello.txt", "hello"u8.ToArray()); - using var ms = new MemoryStream(archive); - var r = new PackItReader(ms); - Assert.That(r.Entries, Has.Count.EqualTo(1)); + public void Writer_Layout_MagicHeaderForksCrcAndEndMarker() { + var data = "Hello, PackIt!"u8.ToArray(); + var archive = Write(("hello.txt", data)); + + Assert.That(archive.AsSpan(0, 4).SequenceEqual("PMag"u8), Is.True); + var header = archive.AsSpan(4, 94); + Assert.That(header[0], Is.EqualTo(9)); + Assert.That(Encoding.Latin1.GetString(header.Slice(1, 9)), Is.EqualTo("hello.txt")); + Assert.That(Encoding.Latin1.GetString(header.Slice(64, 4)), Is.EqualTo("TEXT")); + Assert.That(Encoding.Latin1.GetString(header.Slice(68, 4)), Is.EqualTo("CWIE")); + Assert.That(BinaryPrimitives.ReadUInt32BigEndian(header[76..]), Is.EqualTo((uint)data.Length)); + Assert.That(BinaryPrimitives.ReadUInt32BigEndian(header[80..]), Is.Zero); + Assert.That(BinaryPrimitives.ReadUInt16BigEndian(header[92..]), Is.EqualTo(Crc16Ccitt.Compute(header[..92])), + "header CRC is CRC-16/XMODEM over the 92 bytes before it"); + Assert.That(archive.AsSpan(98, data.Length).SequenceEqual(data), Is.True); + Assert.That(BinaryPrimitives.ReadUInt16BigEndian(archive.AsSpan(98 + data.Length)), Is.EqualTo(Crc16Ccitt.Compute(data))); + Assert.That(archive.AsSpan(archive.Length - 4).SequenceEqual("PEnd"u8), Is.True); + Assert.That(archive, Has.Length.EqualTo(4 + 94 + data.Length + 2 + 4)); } [Test, Category("HappyPath")] - public void Parse_Entry_Name() { - var archive = BuildStoredArchive("readme.txt", [0x41]); - using var ms = new MemoryStream(archive); - var r = new PackItReader(ms); - Assert.That(r.Entries[0].Name, Is.EqualTo("readme.txt")); + public void Writer_NoFiles_IsJustTheEndMarker() { + var archive = Write(); + Assert.That(archive, Is.EqualTo("PEnd"u8.ToArray())); + using var r = Open(archive); + Assert.That(r.Entries, Is.Empty); + Assert.That(r.IsIncomplete, Is.False); } - [Test, Category("HappyPath")] - public void Parse_Entry_DataForkSize() { - var data = new byte[128]; - var archive = BuildStoredArchive("data.bin", data); - using var ms = new MemoryStream(archive); - var r = new PackItReader(ms); - Assert.That(r.Entries[0].DataForkSize, Is.EqualTo(128)); + [Test, Category("HappyPath"), Category("RoundTrip")] + public void Writer_Reader_RoundTrip_MetadataAndForks() { + var data = new byte[3000]; + new Random(5).NextBytes(data); + var rsrc = "resource fork bytes"u8.ToArray(); + using var ms = new MemoryStream(); + using (var w = new PackItWriter(ms, leaveOpen: true)) + w.AddFile("doc", data, "APPL", "ttxt", rsrc, SampleTime); + + ms.Position = 0; + using var r = new PackItReader(ms); + var e = r.Entries.Single(); + Assert.That((e.Name, e.FileType, e.Creator), Is.EqualTo(("doc", "APPL", "ttxt"))); + Assert.That((e.DataForkSize, e.ResourceForkSize), Is.EqualTo((3000L, (long)rsrc.Length))); + Assert.That(e.Modified, Is.EqualTo(SampleTime)); + Assert.That(e.IsCompressed, Is.False); + Assert.That(r.Extract(e), Is.EqualTo(data)); + Assert.That(r.ExtractResourceFork(e), Is.EqualTo(rsrc)); } - [Test, Category("HappyPath")] - public void Parse_Entry_FileTypeAndCreator() { - var archive = BuildStoredArchive("doc.txt", [0x41]); - using var ms = new MemoryStream(archive); - var r = new PackItReader(ms); - Assert.That(r.Entries[0].FileType, Is.EqualTo("TEXT")); - Assert.That(r.Entries[0].Creator, Is.EqualTo("CWIE")); + [Test, Category("RoundTrip")] + public void Writer_Reader_MultipleFiles_InOrder() { + var archive = Write(("a.txt", "Hello"u8.ToArray()), ("b.txt", []), ("c.bin", new byte[700])); + using var r = Open(archive); + Assert.That(r.Entries.Select(e => e.Name), Is.EqualTo(new[] { "a.txt", "b.txt", "c.bin" })); + Assert.That(r.Extract(r.Entries[0]), Is.EqualTo("Hello"u8.ToArray())); + Assert.That(r.Extract(r.Entries[1]), Is.Empty); + Assert.That(r.Extract(r.Entries[2]), Is.EqualTo(new byte[700])); } - [Test, Category("HappyPath")] - public void Parse_StoredEntry_IsCompressedFalse() { - var archive = BuildStoredArchive("f.txt", [0x41]); - using var ms = new MemoryStream(archive); - var r = new PackItReader(ms); - Assert.That(r.Entries[0].IsCompressed, Is.False); + [Test, Category("Boundary")] + [TestCase(63, 63)] + [TestCase(64, 63)] + [TestCase(1, 1)] + public void Writer_Name_IsCutAtSixtyThreeBytes(int length, int kept) { + var name = new string('n', length); + using var r = Open(Write((name, [1]))); + Assert.That(r.Entries[0].Name, Is.EqualTo(name[..kept])); } + // ── Huffman ("PMa4") entries ───────────────────────────────────────────────── + [Test, Category("HappyPath")] - public void Parse_CompressedEntry_IsCompressedTrue() { - // Build an entry with "PMa4" magic. + public void Compressed_Entry_DecodesBothForksAndFindsNextEntry() { + var data = Encoding.ASCII.GetBytes(string.Concat(Enumerable.Repeat("the quick brown fox ", 40))); + var rsrc = new byte[] { 0, 0, 1, 2, 3, 0, 0, 0 }; using var ms = new MemoryStream(); - WriteRawEntry(ms, "PMa4"u8.ToArray(), "compressed.bin", "TEXT", "CWIE", [0xAB, 0xCD], []); + PackItTestEncoder.WriteCompressedEntry(ms, "fox.txt", data, rsrc); + PackItTestEncoder.WriteStoredEntry(ms, "after.txt", "tail"u8.ToArray(), []); + ms.Write("PEnd"u8); + ms.Position = 0; - var r = new PackItReader(ms); + using var r = new PackItReader(ms); + Assert.That(r.Entries, Has.Count.EqualTo(2)); Assert.That(r.Entries[0].IsCompressed, Is.True); + Assert.That(r.Entries[0].EntryLength, Is.LessThan(4 + 94 + data.Length + rsrc.Length + 2), + "the test encoder must actually compress, or the boundary walk is not exercised"); + Assert.That(r.Extract(r.Entries[0]), Is.EqualTo(data)); + Assert.That(r.ExtractResourceFork(r.Entries[0]), Is.EqualTo(rsrc)); + Assert.That(r.Extract(r.Entries[1]), Is.EqualTo("tail"u8.ToArray())); + Assert.That(r.IsIncomplete, Is.False); } - [Test, Category("HappyPath")] - public void Parse_MultipleEntries_AllFound() { + [Test, Category("Exception")] + public void Compressed_ForkCrcMismatch_Throws() { using var ms = new MemoryStream(); - WriteRawEntry(ms, "PMag"u8.ToArray(), "first.txt", "TEXT", "CWIE", "first"u8.ToArray(), []); - WriteRawEntry(ms, "PMag"u8.ToArray(), "second.txt", "TEXT", "CWIE", "second"u8.ToArray(), []); - WriteRawEntry(ms, "PMag"u8.ToArray(), "third.txt", "TEXT", "CWIE", "third"u8.ToArray(), []); + PackItTestEncoder.WriteCompressedEntry(ms, "bad.txt", "payload"u8.ToArray(), [], corruptForkCrc: true); + ms.Write("PEnd"u8); ms.Position = 0; - var r = new PackItReader(ms); - Assert.That(r.Entries, Has.Count.EqualTo(3)); - Assert.That(r.Entries[0].Name, Is.EqualTo("first.txt")); - Assert.That(r.Entries[1].Name, Is.EqualTo("second.txt")); - Assert.That(r.Entries[2].Name, Is.EqualTo("third.txt")); + using var r = new PackItReader(ms); + Assert.Throws(() => r.Extract(r.Entries[0])); } - [Test, Category("EdgeCase")] - public void Parse_UnknownMagic_StopsEarly() { - using var ms = new MemoryStream(); - WriteRawEntry(ms, "PMag"u8.ToArray(), "valid.txt", "TEXT", "CWIE", [0x41], []); - ms.Write("XXXX"u8); // garbage magic — should stop parsing - ms.Position = 0; - var r = new PackItReader(ms); - Assert.That(r.Entries, Has.Count.EqualTo(1)); - } + // ── Integrity ───────────────────────────────────────────────────────────────── - [Test, Category("EdgeCase")] - public void Parse_EmptyStream_NoEntries() { - using var ms = new MemoryStream(); - var r = new PackItReader(ms); - Assert.That(r.Entries, Is.Empty); + [Test, Category("Exception")] + public void Stored_ForkCrcMismatch_Throws() { + var archive = Write(("x.txt", "abc"u8.ToArray())); + archive[98] ^= 0x01; // first data byte + using var r = Open(archive); + Assert.Throws(() => r.Extract(r.Entries[0])); } - // ── Extraction ──────────────────────────────────────────────────────────────── + [Test, Category("Exception")] + public void HeaderCrcMismatch_ListsButRefusesExtraction() { + var archive = Write(("x.txt", "abc"u8.ToArray())); + archive[4 + 72] ^= 0x01; // Finder flags: covered by the header CRC, changes nothing else + using var r = Open(archive); + Assert.That(r.Entries[0].HeaderCrcValid, Is.False); + Assert.Throws(() => r.Extract(r.Entries[0])); + } - [Test, Category("HappyPath"), Category("RoundTrip")] - public void Extract_StoredEntry_ReturnsOriginalData() { - var original = "Hello, PackIt!"u8.ToArray(); - var archive = BuildStoredArchive("hello.txt", original); - using var ms = new MemoryStream(archive); - var r = new PackItReader(ms); - var result = r.Extract(r.Entries[0]); - Assert.That(result, Is.EqualTo(original)); + [Test, Category("Exception")] + public void EncryptedEntry_ListedButRefused() { + using var ms = new MemoryStream(); + PackItTestEncoder.WriteStoredEntry(ms, "plain.txt", "ok"u8.ToArray(), []); + ms.Write("PMa5"u8); + ms.Write(new byte[40]); + ms.Position = 0; + using var r = new PackItReader(ms); + Assert.That(r.Entries, Has.Count.EqualTo(2)); + Assert.That(r.Entries[1].IsEncrypted, Is.True); + Assert.That(r.IsIncomplete, Is.True); + Assert.That(r.Extract(r.Entries[0]), Is.EqualTo("ok"u8.ToArray())); + Assert.Throws(() => r.Extract(r.Entries[1])); } - [Test, Category("HappyPath"), Category("RoundTrip")] - public void Extract_BinaryData_RoundTrips() { - var original = new byte[256]; - for (var i = 0; i < 256; ++i) original[i] = (byte)i; - var archive = BuildStoredArchive("allbytes.bin", original); - using var ms = new MemoryStream(archive); - var r = new PackItReader(ms); - Assert.That(r.Extract(r.Entries[0]), Is.EqualTo(original)); + // ── Damaged and foreign input ───────────────────────────────────────────────── + + [Test, Category("EdgeCase")] + public void MissingEndMarker_IsTolerated() { + var archive = Write(("a.txt", "x"u8.ToArray())); + using var r = Open(archive[..^4]); + Assert.That(r.Entries, Has.Count.EqualTo(1)); + Assert.That(r.IsIncomplete, Is.False); } - [Test, Category("EdgeCase"), Category("RoundTrip")] - public void Extract_EmptyDataFork_ReturnsEmpty() { - var archive = BuildStoredArchive("empty.txt", []); - using var ms = new MemoryStream(archive); - var r = new PackItReader(ms); - Assert.That(r.Extract(r.Entries[0]), Is.Empty); + [Test, Category("EdgeCase")] + public void TruncatedSecondEntry_KeepsFirstAndFlagsIncomplete() { + var archive = Write(("a.txt", "first"u8.ToArray()), ("b.txt", new byte[100])); + using var r = Open(archive[..^50]); + Assert.That(r.Entries.Select(e => e.Name), Is.EqualTo(new[] { "a.txt" })); + Assert.That(r.IsIncomplete, Is.True); } - [Test, Category("HappyPath"), Category("RoundTrip")] - public void Extract_MultipleEntries_CorrectData() { - var data1 = "Hello"u8.ToArray(); - var data2 = "World"u8.ToArray(); - using var ms = new MemoryStream(); - WriteRawEntry(ms, "PMag"u8.ToArray(), "a.txt", "TEXT", "CWIE", data1, []); - WriteRawEntry(ms, "PMag"u8.ToArray(), "b.txt", "TEXT", "CWIE", data2, []); - ms.Position = 0; - var r = new PackItReader(ms); - Assert.That(r.Extract(r.Entries[0]), Is.EqualTo(data1)); - Assert.That(r.Extract(r.Entries[1]), Is.EqualTo(data2)); + [Test, Category("EdgeCase")] + public void UnknownMagicAfterEntries_StopsAndFlagsIncomplete() { + var archive = Write(("valid.txt", [0x41])); + var damaged = archive[..^4].Concat("XXXX"u8.ToArray()).ToArray(); + using var r = Open(damaged); + Assert.That(r.Entries, Has.Count.EqualTo(1)); + Assert.That(r.IsIncomplete, Is.True); } - // ── Error handling ──────────────────────────────────────────────────────────── + [Test, Category("Exception")] + [TestCase(new byte[0])] + [TestCase(new byte[] { (byte)'P', (byte)'K', 3, 4, 0, 0 })] + public void NotAPackItArchive_Throws(byte[] bytes) => + Assert.Throws(() => _ = Open(bytes)); - [Test, Category("ErrorHandling")] + [Test, Category("Exception")] public void Extract_NullEntry_Throws() { - var archive = BuildStoredArchive("x.txt", [0x41]); - using var ms = new MemoryStream(archive); - var r = new PackItReader(ms); + using var r = Open(Write(("x.txt", [0x41]))); Assert.Throws(() => r.Extract(null!)); } - [Test, Category("ErrorHandling")] + [Test, Category("Exception")] public void Dispose_ThenExtract_Throws() { - var archive = BuildStoredArchive("f.txt", [0x41]); - using var ms = new MemoryStream(archive); - var r = new PackItReader(ms); + var r = Open(Write(("f.txt", [0x41]))); var entry = r.Entries[0]; r.Dispose(); Assert.Throws(() => r.Extract(entry)); } - // ── Writer round-trip ───────────────────────────────────────────────────────── - - [Test, Category("HappyPath"), Category("RoundTrip")] - public void Writer_RoundTrip_SingleFile() { - var data = "Hello, PackIt Writer!"u8.ToArray(); - using var ms = new MemoryStream(); - using (var w = new PackItWriter(ms, leaveOpen: true)) - w.AddFile("hello.txt", data); - - ms.Position = 0; - var r = new PackItReader(ms); - Assert.That(r.Entries, Has.Count.EqualTo(1)); - Assert.That(r.Entries[0].Name, Is.EqualTo("hello.txt")); - Assert.That(r.Extract(r.Entries[0]), Is.EqualTo(data)); - } - - [Test, Category("HappyPath"), Category("RoundTrip")] - public void Writer_RoundTrip_MultipleFiles() { - var data1 = new byte[256]; - var data2 = new byte[128]; - Random.Shared.NextBytes(data1); - Random.Shared.NextBytes(data2); - - using var ms = new MemoryStream(); - using (var w = new PackItWriter(ms, leaveOpen: true)) { - w.AddFile("file1.bin", data1); - w.AddFile("file2.bin", data2); - } - - ms.Position = 0; - var r = new PackItReader(ms); - Assert.That(r.Entries, Has.Count.EqualTo(2)); - Assert.That(r.Extract(r.Entries[0]), Is.EqualTo(data1)); - Assert.That(r.Extract(r.Entries[1]), Is.EqualTo(data2)); + [Test, Category("HappyPath")] + public void Reader_LeaveOpen_True_StreamRemainsUsable() { + using var ms = new MemoryStream(Write(("f.txt", [0x41]))); + using (var r = new PackItReader(ms, leaveOpen: true)) + _ = r.Entries; + Assert.That(ms.CanRead, Is.True); } +} - [Test, Category("HappyPath"), Category("RoundTrip")] - public void Writer_RoundTrip_EmptyFile() { - using var ms = new MemoryStream(); - using (var w = new PackItWriter(ms, leaveOpen: true)) - w.AddFile("empty.txt", []); - - ms.Position = 0; - var r = new PackItReader(ms); - Assert.That(r.Entries, Has.Count.EqualTo(1)); - Assert.That(r.Extract(r.Entries[0]), Is.Empty); +/// +/// Writes PackIt entries for tests, including "PMa4" Huffman entries, which the product writer does not +/// produce. The Huffman tree is built from byte frequencies; any prefix tree is valid PackIt. +/// +internal static class PackItTestEncoder { + public static void WriteStoredEntry(Stream output, string name, byte[] data, byte[] rsrc) { + output.Write("PMag"u8); + output.Write(Body(name, data, rsrc, corruptForkCrc: false)); } - [Test, Category("HappyPath")] - public void Writer_Magic_IsPMag() { - using var ms = new MemoryStream(); - using (var w = new PackItWriter(ms, leaveOpen: true)) - w.AddFile("x", [1, 2, 3]); - - ms.Position = 0; - Span magic = stackalloc byte[4]; - ms.ReadExactly(magic); - Assert.That(magic.ToArray(), Is.EqualTo("PMag"u8.ToArray())); + public static void WriteCompressedEntry(Stream output, string name, byte[] data, byte[] rsrc, bool corruptForkCrc = false) { + var body = Body(name, data, rsrc, corruptForkCrc); + output.Write("PMa4"u8); + output.Write(Huffman(body)); } - [Test, Category("HappyPath")] - public void Writer_StoredEntry_IsCompressedFalse() { - var data = "test"u8.ToArray(); - using var ms = new MemoryStream(); - using (var w = new PackItWriter(ms, leaveOpen: true)) - w.AddFile("t.txt", data); - - ms.Position = 0; - var r = new PackItReader(ms); - Assert.That(r.Entries[0].IsCompressed, Is.False); + private static byte[] Body(string name, byte[] data, byte[] rsrc, bool corruptForkCrc) { + var header = new byte[94]; + var nameBytes = Encoding.Latin1.GetBytes(name); + header[0] = (byte)nameBytes.Length; + nameBytes.CopyTo(header, 1); + "TEXT"u8.CopyTo(header.AsSpan(64)); + "ttxt"u8.CopyTo(header.AsSpan(68)); + BinaryPrimitives.WriteUInt32BigEndian(header.AsSpan(76), (uint)data.Length); + BinaryPrimitives.WriteUInt32BigEndian(header.AsSpan(80), (uint)rsrc.Length); + BinaryPrimitives.WriteUInt16BigEndian(header.AsSpan(92), Crc16Ccitt.Compute(header.AsSpan(0, 92))); + var forks = data.Concat(rsrc).ToArray(); + var crc = Crc16Ccitt.Compute(forks); + if (corruptForkCrc) crc ^= 0x5555; + var trailer = new byte[2]; + BinaryPrimitives.WriteUInt16BigEndian(trailer, crc); + return [.. header, .. forks, .. trailer]; } - // ── leaveOpen ───────────────────────────────────────────────────────────────── - - [Test, Category("HappyPath")] - public void Reader_LeaveOpen_True_StreamRemainsUsable() { - var archive = BuildStoredArchive("f.txt", [0x41]); - using var ms = new MemoryStream(archive); - using (var r = new PackItReader(ms, leaveOpen: true)) { - _ = r.Entries; + private sealed record Node(int Weight, int Symbol, Node? Zero, Node? One); + + /// Huffman-codes as PackIt does: pre-order tree, then MSB-first codes, byte-padded. + public static byte[] Huffman(byte[] body) { + var counts = new int[256]; + foreach (var b in body) ++counts[b]; + var queue = new PriorityQueue(); + var order = 0; + for (var s = 0; s < 256; ++s) + if (counts[s] > 0) + queue.Enqueue(new Node(counts[s], s, null, null), (counts[s], order++)); + if (queue.Count == 1) { + var only = queue.Dequeue(); + queue.Enqueue(new Node(only.Weight, -1, only, new Node(0, (only.Symbol + 1) & 0xFF, null, null)), (only.Weight, order++)); } - Assert.That(ms.CanRead, Is.True); + while (queue.Count > 1) { + var a = queue.Dequeue(); + var b = queue.Dequeue(); + queue.Enqueue(new Node(a.Weight + b.Weight, -1, a, b), (a.Weight + b.Weight, order++)); + } + var root = queue.Dequeue(); + + var codes = new (uint Bits, int Length)[256]; + var bits = new List(); + void Emit(Node n, uint code, int length) { + if (n.Zero is null) { + bits.Add(true); + for (var i = 7; i >= 0; --i) bits.Add(((n.Symbol >> i) & 1) != 0); + codes[n.Symbol] = (code, length); + return; + } + bits.Add(false); + Emit(n.Zero, code << 1, length + 1); + Emit(n.One!, (code << 1) | 1, length + 1); + } + Emit(root, 0, 0); + foreach (var b in body) { + var (code, length) = codes[b]; + for (var i = length - 1; i >= 0; --i) bits.Add(((code >> i) & 1) != 0); + } + + var result = new byte[(bits.Count + 7) / 8]; + for (var i = 0; i < bits.Count; ++i) + if (bits[i]) result[i >> 3] |= (byte)(0x80 >> (i & 7)); + return result; } } diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.DiskDoubler/DiskDoublerAdDecoder.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.DiskDoubler/DiskDoublerAdDecoder.cs new file mode 100644 index 000000000..e44fee711 --- /dev/null +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.DiskDoubler/DiskDoublerAdDecoder.cs @@ -0,0 +1,109 @@ +using System.Buffers.Binary; + +namespace FileFormat.DiskDoubler; + +/// +/// Decodes DiskDoubler's "AD" methods (6 = ADS/AD2, 9 = AD1): a sequence of independent LZSS blocks +/// of at most 8 KiB each. +/// +/// +/// Each block opens with a 12-byte header: +/// +/// [0..2] compressed size (bytes after this header) [2..4] uncompressed size (≤ 0x2000) +/// [4..8] unused here [8] data check (unverified) [9] flags (bit 0 = stored block) +/// [10] unused here [11] XOR of header bytes 0..11 (bytes 0-1 and 2-3 folded as 16-bit values) +/// +/// A compressed block is an MSB-first bit stream of tokens: 0 + 8 bits is a literal; 1 is a match, +/// followed by a "far" bit selecting a 12- or 8-bit distance, then the length: 0 → 2, 100 → 3, +/// 101 → 4, 11 + 4 bits → 5-20. Matches never reach outside their own block. +/// Sourcing: converted from The Unarchiver's XADMaster (XADDiskDoublerADnHandle.m, +/// LGPL-2.1-or-later); checked against real DiskDoubler files, decoding them as unar does. +/// +internal static class DiskDoublerAdDecoder { + private const int HeaderSize = 12; + private const int MaxBlock = 0x2000; + + public static byte[] Decode(ReadOnlySpan input, long originalSize) { + var output = new byte[checked((int)originalSize)]; + var outPos = 0; + var inPos = 0; + + while (outPos < output.Length) { + if (input.Length - inPos < HeaderSize) + throw new InvalidDataException("DiskDoubler AD stream ends inside a block header."); + var header = input.Slice(inPos, HeaderSize); + var compSize = BinaryPrimitives.ReadUInt16BigEndian(header); + var uncompSize = BinaryPrimitives.ReadUInt16BigEndian(header[2..]); + var check = (byte)(compSize ^ (compSize >> 8) ^ uncompSize ^ (uncompSize >> 8)); + for (var i = 4; i < 11; ++i) + check ^= header[i]; + if (check != header[11]) + throw new InvalidDataException("DiskDoubler AD block header fails its XOR check."); + if (uncompSize > MaxBlock) + throw new InvalidDataException($"DiskDoubler AD block claims {uncompSize} bytes; blocks hold at most {MaxBlock}."); + if (uncompSize > output.Length - outPos) + throw new InvalidDataException("DiskDoubler AD block runs past the fork's declared size."); + + inPos += HeaderSize; + if (compSize > input.Length - inPos) + throw new InvalidDataException("DiskDoubler AD block runs past the end of the fork."); + var block = input.Slice(inPos, compSize); + var target = output.AsSpan(outPos, uncompSize); + + if ((header[9] & 1) != 0) { + if (compSize < uncompSize) + throw new InvalidDataException("DiskDoubler AD stored block is shorter than its size."); + block[..uncompSize].CopyTo(target); + } else + DecodeBlock(block, target); + + outPos += uncompSize; + inPos += compSize; + } + + return output; + } + + private static void DecodeBlock(ReadOnlySpan block, Span output) { + var bitPos = 0; + var pos = 0; + + int Bit(ReadOnlySpan data) { + var index = bitPos >> 3; + if (index >= data.Length) + throw new InvalidDataException("DiskDoubler AD block ends before its output is complete."); + var bit = (data[index] >> (7 - (bitPos & 7))) & 1; + ++bitPos; + return bit; + } + + int Bits(ReadOnlySpan data, int count) { + var value = 0; + for (var i = 0; i < count; ++i) + value = (value << 1) | Bit(data); + return value; + } + + while (pos < output.Length) { + if (Bit(block) == 0) { + output[pos++] = (byte)Bits(block, 8); + continue; + } + + var offset = Bits(block, Bit(block) != 0 ? 12 : 8); + int length; + if (Bit(block) == 0) + length = 2; + else if (Bit(block) == 0) + length = Bit(block) == 0 ? 3 : 4; + else + length = Bits(block, 4) + 5; + + if (offset == 0 || offset > pos) + throw new InvalidDataException("DiskDoubler AD match reaches before the start of its block."); + length = Math.Min(length, output.Length - pos); + for (var i = 0; i < length; ++i, ++pos) + output[pos] = output[pos - offset]; + } + } +} diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.DiskDoubler/DiskDoublerConstants.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.DiskDoubler/DiskDoublerConstants.cs index d0312b2dc..6f02d94b1 100644 --- a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.DiskDoubler/DiskDoublerConstants.cs +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.DiskDoubler/DiskDoublerConstants.cs @@ -4,15 +4,33 @@ namespace FileFormat.DiskDoubler; /// Constants for the DiskDoubler compressed file format (Salient Software, 1989-1993). /// internal static class DiskDoublerConstants { - /// Size of the fixed-length DiskDoubler file header in bytes. - public const int HeaderSize = 82; + /// Magic at the start of a single compressed file (and of every file header inside a DiskDoubler archive). + public const uint Magic = 0xABCD0054; + + /// Size of the single-file header in bytes, magic and header CRC included. + public const int HeaderSize = 84; + + /// Bytes covered by the header CRC (everything before it). + public const int HeaderCrcSpan = 82; + + /// Size of the MacBinary header that commonly wraps a DiskDoubler file. + public const int MacBinaryHeaderSize = 128; /// Compression method: stored (no compression). - public const byte MethodStored = 0; + public const int MethodStored = 0; + + /// Compression method: Unix compress LZW. + public const int MethodCompress = 1; + + /// Compression method: "AD" / "ADS" LZSS blocks (DiskDoubler 3.x/4.x, AutoDoubler). + public const int MethodAds = 6; + + /// Compression method: Compact Pro (LZH + RLE). + public const int MethodCompactPro = 8; - /// Compression method: simple RLE. - public const byte MethodRle = 1; + /// Compression method: "AD1" LZSS blocks, same block format as . + public const int MethodAd1 = 9; - /// Compression method: LZC variant (proprietary). - public const byte MethodLzc = 3; + /// Seconds between the Macintosh epoch (1904-01-01) and the Unix epoch. + public const long MacEpochOffsetSeconds = 2_082_844_800; } diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.DiskDoubler/DiskDoublerEntry.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.DiskDoubler/DiskDoublerEntry.cs index 64070cac5..c2cafce94 100644 --- a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.DiskDoubler/DiskDoublerEntry.cs +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.DiskDoubler/DiskDoublerEntry.cs @@ -1,11 +1,15 @@ namespace FileFormat.DiskDoubler; -/// Represents a single compressed file stored in a DiskDoubler file. +/// Represents one fork of a DiskDoubler compressed file. public sealed class DiskDoublerEntry { - /// Gets the original filename. + /// Gets the entry name: the file's name for the data fork, with ".rsrc" appended for the resource fork. public string Name { get; init; } = string.Empty; - /// Gets the compression method ID (0 = stored, 1 = RLE, 3 = LZC variant, others = proprietary). + /// + /// Gets the compression method: 0 stored, 1 Unix compress, 2 and 5 DiskDoubler Huffman variants, + /// 3 RLE, 4 Huffman, 6 and 9 "AD" LZSS, 7 Stac LZS, 8 Compact Pro, 10 "DD". The high bit is a flag + /// and is masked off. + /// public int Method { get; init; } /// Gets the original (uncompressed) size in bytes. @@ -19,4 +23,27 @@ public sealed class DiskDoublerEntry { /// Gets whether this entry represents the data fork (as opposed to the resource fork). public bool IsDataFork { get; init; } + + /// Gets the fork's checksum field (its meaning depends on the method). + public ushort Checksum { get; init; } + + /// Gets the fork's delta pre-processing type (0 = none). + public int DeltaType { get; init; } + + /// Gets the Mac file type code. + public string FileType { get; init; } = string.Empty; + + /// Gets the Mac creator code. + public string Creator { get; init; } = string.Empty; + + /// Gets the modification time, or when the header holds zero. + public DateTime? Modified { get; init; } + + /// Gets whether this reader can decode the entry's method. + public bool IsSupported => this.DeltaType == 0 && this.Method is + DiskDoublerConstants.MethodStored or DiskDoublerConstants.MethodCompress or + DiskDoublerConstants.MethodAds or DiskDoublerConstants.MethodAd1; + + /// The XOR key the encoder applied to compress output (0 or 0x5A), from the header's version bytes. + internal byte XorKey { get; init; } } diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.DiskDoubler/DiskDoublerFormatDescriptor.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.DiskDoubler/DiskDoublerFormatDescriptor.cs index bb8f9e4d1..9247b6464 100644 --- a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.DiskDoubler/DiskDoublerFormatDescriptor.cs +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.DiskDoubler/DiskDoublerFormatDescriptor.cs @@ -55,12 +55,10 @@ public IEnumerable EnumerateLayout(Stream archive) { /// Gets the compound extensions. /// public IReadOnlyList CompoundExtensions => []; - // DiskDoubler has no universally reliable magic bytes; detection is primarily by extension. - // The header version identifier at offset 0 varies by version so we use a low-confidence hint. /// - /// Gets the magic signatures. + /// Gets the magic signatures: a single DiskDoubler file starts with 0xABCD0054. /// - public IReadOnlyList MagicSignatures => []; + public IReadOnlyList MagicSignatures => [new([0xAB, 0xCD, 0x00, 0x54], Confidence: 0.8)]; /// /// Gets the methods. /// @@ -89,10 +87,10 @@ public List List(Stream stream, string? password) { e.Name, e.OriginalSize, e.CompressedSize, - $"Method {e.Method}", + DiskDoublerReader.MethodName(e.Method), false, false, - DateTime.MinValue)) + e.Modified ?? DateTime.MinValue)) .ToList(); } @@ -141,11 +139,11 @@ public byte[] ExtractEntryToMemory(Stream archive, string entryName, string? pas /// public void Create(Stream output, IReadOnlyList inputs, FormatCreateOptions options) { // WORM: store the first input as a DiskDoubler data fork (method 0 = stored). - // DiskDoubler wraps a single Macintosh file, not a multi-file archive. + // DiskDoubler wraps a single Macintosh file, not a multi-file archive, and records no name. var w = new DiskDoublerWriter(); foreach (var i in inputs) { if (i.IsDirectory) continue; - w.SetFile(Path.GetFileName(i.ArchiveName), i.ReadContent()); + w.SetFile(i.ReadContent()); break; } w.WriteTo(output); diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.DiskDoubler/DiskDoublerReader.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.DiskDoubler/DiskDoublerReader.cs index eeefea0f0..799ec9f3b 100644 --- a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.DiskDoubler/DiskDoublerReader.cs +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.DiskDoubler/DiskDoublerReader.cs @@ -1,46 +1,38 @@ using System.Buffers.Binary; using System.Text; +using Compression.Core.Checksums; +using Compression.Core.Streams; +using FileFormat.Compress; namespace FileFormat.DiskDoubler; /// -/// Reads the header of a DiskDoubler compressed file and provides access to -/// its data and resource fork entries. +/// Reads a single DiskDoubler compressed file and decodes its forks. /// /// -/// DiskDoubler (Salient Software, 1989-1993) compressed individual files using a -/// proprietary 82-byte header followed by the compressed data fork and an optional -/// compressed resource fork. This reader reconstructs the entry list from the header -/// and supports extraction of stored (method 0) entries; for all other compression -/// methods the raw compressed bytes are returned unchanged. -/// -/// Header layout (82 bytes): +/// DiskDoubler (Salient Software, 1989-1993) replaced a file by a compressed one with this 84-byte +/// header (all big-endian), followed by the compressed data fork and then the compressed resource fork: /// -/// [0..4] format version identifier (uint32 BE) -/// [4..8] Mac file type code (4 ASCII bytes) -/// [8..12] Mac creator code (4 ASCII bytes) -/// [12..14] Finder flags (uint16 BE) -/// [14..16] padding / reserved -/// [16..20] data fork original size (uint32 BE) -/// [20..24] data fork compressed size (uint32 BE) -/// [24..28] resource fork original size (uint32 BE) -/// [28..32] resource fork compressed size (uint32 BE) -/// [32] data fork compression method -/// [33] resource fork compression method -/// [34..82] filename (Pascal string: byte 34 = length, bytes 35..82 = name) +/// [0..4] magic 0xABCD0054 +/// [4..8] data fork size [8..12] data fork compressed size +/// [12..16] resource fork size [16..20] resource fork compressed size +/// [20] data fork method [21] resource fork method [22] version byte +/// [24..28] modified [28..32] created (seconds since 1904) +/// [32..36] file type [36..40] creator [40..42] Finder flags +/// [48..50] data fork checksum [50..52] resource fork checksum [52] second version byte +/// [54..56] data fork delta type [56..58] resource fork delta type +/// [82..84] CRC-16/XMODEM of bytes 0..82 (very old files store 0000) /// -/// Compressed data follows immediately after the 82-byte header. +/// The file may sit inside a MacBinary wrapper, in which case the header follows its 128 bytes. +/// The header holds no name: the entries take the name of the file being read, without ".dd". +/// Decoded methods: 0 (stored), 1 (Unix compress, with its own header XOR-masked by 0x5A and +/// a 16-bit byte-sum check), 6 and 9 ("AD" LZSS blocks, see ). Every +/// other method — the DiskDoubler Huffman variants, RLE, Stac LZS, Compact Pro and "DD" — and any delta +/// pre-processing is refused with rather than returned undecoded. +/// Sourcing: layout and methods from The Unarchiver's XADMaster (XADDiskDoublerParser.m, +/// LGPL-2.1-or-later); verified on real DiskDoubler files against unar's output. /// public sealed class DiskDoublerReader : IDisposable { - /// Size of the fixed-length DiskDoubler file header in bytes. - public const int HeaderSize = 82; - - /// Byte offset of the filename Pascal string within the header. - private const int FileNameOffset = 34; - - /// Maximum bytes available for the filename (Pascal length byte + 47 name bytes). - private const int FileNameFieldLength = 48; - private readonly Stream _stream; private readonly bool _leaveOpen; private readonly List _entries = []; @@ -53,46 +45,64 @@ public sealed class DiskDoublerReader : IDisposable { /// /// to leave open after this reader is disposed. /// + /// The name to give the entries; defaults to the stream's file name without ".dd". /// Thrown when is null. - /// Thrown when the stream is too short to contain a valid header. - public DiskDoublerReader(Stream stream, bool leaveOpen = false) { + /// The stream holds no DiskDoubler header, or its header CRC is wrong. + public DiskDoublerReader(Stream stream, bool leaveOpen = false, string? name = null) { this._stream = stream ?? throw new ArgumentNullException(nameof(stream)); this._leaveOpen = leaveOpen; - this.ParseHeader(); + this.ParseHeader(name ?? DefaultName(stream)); } - /// Gets the list of entries parsed from the DiskDoubler file header. - /// - /// A DiskDoubler file contains at most two entries: one for the data fork and one for the - /// resource fork. The resource fork entry is omitted when the resource fork is empty. - /// + /// Gets the forks parsed from the header: the data fork (if any), then the resource fork (if any). public IReadOnlyList Entries => this._entries; - /// - /// Extracts the data for the specified entry. - /// - /// An entry obtained from . - /// - /// The uncompressed bytes for method 0 (stored), or the raw compressed bytes for all - /// other methods. - /// - /// Thrown when is null. - /// Thrown when this reader has been disposed. + /// Returns whether starts a DiskDoubler file (directly or behind MacBinary). + public static bool IsDiskDoubler(ReadOnlySpan header) => + StartsWithHeader(header) || + (header.Length >= DiskDoublerConstants.MacBinaryHeaderSize && StartsWithHeader(header[DiskDoublerConstants.MacBinaryHeaderSize..])); + + /// Decodes the specified fork. + /// The fork uses a method (or delta step) this reader does not decode. + /// The compressed data is damaged or fails its check. public byte[] Extract(DiskDoublerEntry entry) { ArgumentNullException.ThrowIfNull(entry); ObjectDisposedException.ThrowIf(this._disposed, this); - if (entry.CompressedSize == 0) - return []; + if (entry.DeltaType != 0) + throw new NotSupportedException($"DiskDoubler fork '{entry.Name}' uses delta pre-processing type {entry.DeltaType}, which is not supported."); this._stream.Position = entry.DataOffset; - var compressed = this.ReadExact((int)entry.CompressedSize); - - return entry.Method == DiskDoublerConstants.MethodStored - ? compressed - : compressed; // raw compressed bytes for unsupported methods + var compressed = new byte[entry.CompressedSize]; + this._stream.ReadExactly(compressed); + + return entry.Method switch { + DiskDoublerConstants.MethodStored => entry.OriginalSize <= compressed.LongLength + ? compressed[..(int)entry.OriginalSize] + : throw new InvalidDataException($"DiskDoubler stored fork '{entry.Name}' is shorter than its size."), + DiskDoublerConstants.MethodCompress => DecodeCompress(entry, compressed), + DiskDoublerConstants.MethodAds or DiskDoublerConstants.MethodAd1 => DiskDoublerAdDecoder.Decode(compressed, entry.OriginalSize), + _ => throw new NotSupportedException( + $"DiskDoubler fork '{entry.Name}' uses method {entry.Method} ({MethodName(entry.Method)}), which is not supported."), + }; } + /// Names a method as the format's tools do. + public static string MethodName(int method) => method switch { + 0 => "None", + 1 => "Compress", + 2 => "Method 2", + 3 => "RLE", + 4 => "Huffman", + 5 => "Method 5", + 6 => "ADS/AD2", + 7 => "Stac LZS", + 8 => "Compact Pro", + 9 => "AD/AD1", + 10 => "DDn", + _ => $"Method {method}", + }; + /// public void Dispose() { if (!this._disposed) { @@ -102,78 +112,109 @@ public void Dispose() { } } - // ── Parsing ─────────────────────────────────────────────────────────────────── - - private void ParseHeader() { - if (this._stream.Length - this._stream.Position < HeaderSize) - throw new InvalidDataException( - $"Stream is too short to contain a DiskDoubler header (need {HeaderSize} bytes)."); - - var hdr = this.ReadExact(HeaderSize); - - // [4..8] Mac file type — informational only - // [8..12] Mac creator — informational only - // [16..20] data fork original size - var dataOrigSize = BinaryPrimitives.ReadUInt32BigEndian(hdr.AsSpan(16, 4)); - // [20..24] data fork compressed size - var dataCompSize = BinaryPrimitives.ReadUInt32BigEndian(hdr.AsSpan(20, 4)); - // [24..28] resource fork original size - var rsrcOrigSize = BinaryPrimitives.ReadUInt32BigEndian(hdr.AsSpan(24, 4)); - // [28..32] resource fork compressed size - var rsrcCompSize = BinaryPrimitives.ReadUInt32BigEndian(hdr.AsSpan(28, 4)); - // [32] data fork method, [33] resource fork method - var dataMethod = hdr[32]; - var rsrcMethod = hdr[33]; - - // [34] Pascal string length, [35..81] name bytes - var nameLength = hdr[FileNameOffset]; - if (nameLength > FileNameFieldLength - 1) - nameLength = (byte)(FileNameFieldLength - 1); - var name = nameLength > 0 - ? Encoding.Latin1.GetString(hdr, FileNameOffset + 1, nameLength) - : string.Empty; - - // Compressed data follows the header immediately. - var dataStart = this._stream.Position; // = HeaderSize from stream start - - if (dataOrigSize > 0 || dataCompSize > 0) { - this._entries.Add(new DiskDoublerEntry { - Name = name, - Method = dataMethod, - OriginalSize = dataOrigSize, - CompressedSize = dataCompSize, - DataOffset = dataStart, - IsDataFork = true, - }); + // ── Decoding ────────────────────────────────────────────────────────────────── + + private static byte[] DecodeCompress(DiskDoublerEntry entry, byte[] compressed) { + if (compressed.Length < 3) + throw new InvalidDataException($"DiskDoubler compress fork '{entry.Name}' is shorter than its header."); + // The three header bytes are a .Z header (1F 9D flags), masked like the output. + var header = new byte[] { (byte)(compressed[0] ^ entry.XorKey), (byte)(compressed[1] ^ entry.XorKey), (byte)(compressed[2] ^ entry.XorKey) }; + if (header[0] != 0x1F || header[1] != 0x9D) + throw new InvalidDataException($"DiskDoubler compress fork '{entry.Name}' lacks the compress magic."); + + var unmasked = (byte[])compressed.Clone(); + header.CopyTo(unmasked, 0); + + var output = new byte[checked((int)entry.OriginalSize)]; + using (var source = new MemoryStream(unmasked, writable: false)) + using (var lzw = new CompressStream(source, CompressionStreamMode.Decompress, leaveOpen: true)) { + var total = 0; + while (total < output.Length) { + var read = lzw.Read(output, total, output.Length - total); + if (read == 0) + throw new InvalidDataException($"DiskDoubler compress fork '{entry.Name}' ends after {total} of {output.Length} bytes."); + total += read; + } } - if (rsrcOrigSize > 0 || rsrcCompSize > 0) { - this._entries.Add(new DiskDoublerEntry { - Name = name + ".rsrc", - Method = rsrcMethod, - OriginalSize = rsrcOrigSize, - CompressedSize = rsrcCompSize, - DataOffset = dataStart + dataCompSize, - IsDataFork = false, - }); + var sum = 0; + for (var i = 0; i < output.Length; ++i) { + output[i] ^= entry.XorKey; + sum += output[i]; } + // The stored check is the byte sum of the output plus the three (unmasked) header bytes. + var expected = (entry.Checksum - header[0] - header[1] - header[2]) & 0xFFFF; + if ((sum & 0xFFFF) != expected) + throw new InvalidDataException($"DiskDoubler compress fork '{entry.Name}' fails its checksum."); + return output; } - // ── Stream helpers ──────────────────────────────────────────────────────────── + // ── Parsing ─────────────────────────────────────────────────────────────────── + + private static bool StartsWithHeader(ReadOnlySpan data) => + data.Length >= DiskDoublerConstants.HeaderSize && + BinaryPrimitives.ReadUInt32BigEndian(data) == DiskDoublerConstants.Magic; - private byte[] ReadExact(int count) { - var buf = new byte[count]; - this.ReadExact(buf.AsSpan()); - return buf; + private static string DefaultName(Stream stream) { + var path = (stream as FileStream)?.Name; + if (string.IsNullOrEmpty(path)) + return "file"; + var name = Path.GetFileName(path); + return name.EndsWith(".dd", StringComparison.OrdinalIgnoreCase) && name.Length > 3 ? name[..^3] : name; } - private void ReadExact(Span buffer) { - var total = 0; - while (total < buffer.Length) { - var read = this._stream.Read(buffer[total..]); - if (read == 0) - throw new EndOfStreamException("Unexpected end of stream reading DiskDoubler data."); - total += read; - } + private void ParseHeader(string name) { + var origin = this._stream.Position; + var probe = new byte[DiskDoublerConstants.MacBinaryHeaderSize + DiskDoublerConstants.HeaderSize]; + var got = this._stream.ReadAtLeast(probe, probe.Length, throwOnEndOfStream: false); + var span = probe.AsSpan(0, got); + + int headerAt; + if (StartsWithHeader(span)) + headerAt = 0; + else if (got >= DiskDoublerConstants.MacBinaryHeaderSize && StartsWithHeader(span[DiskDoublerConstants.MacBinaryHeaderSize..])) + headerAt = DiskDoublerConstants.MacBinaryHeaderSize; + else + throw new InvalidDataException("Stream does not start with a DiskDoubler header (magic 0xABCD0054)."); + + var hdr = span.Slice(headerAt, DiskDoublerConstants.HeaderSize); + var storedCrc = BinaryPrimitives.ReadUInt16BigEndian(hdr[82..]); + if (storedCrc != 0 && storedCrc != Crc16Ccitt.Compute(hdr[..DiskDoublerConstants.HeaderCrcSpan])) + throw new InvalidDataException("DiskDoubler header fails its CRC-16."); + + var dataSize = BinaryPrimitives.ReadUInt32BigEndian(hdr[4..]); + var dataCompSize = BinaryPrimitives.ReadUInt32BigEndian(hdr[8..]); + var rsrcSize = BinaryPrimitives.ReadUInt32BigEndian(hdr[12..]); + var rsrcCompSize = BinaryPrimitives.ReadUInt32BigEndian(hdr[16..]); + var info1 = hdr[22]; + var info2 = hdr[52]; + var xorKey = info1 >= 0x2A && (info2 & 0x80) == 0 ? (byte)0x5A : (byte)0; + var modified = BinaryPrimitives.ReadUInt32BigEndian(hdr[24..]); + var fileType = Encoding.Latin1.GetString(hdr.Slice(32, 4)); + var creator = Encoding.Latin1.GetString(hdr.Slice(36, 4)); + + var dataStart = origin + headerAt + DiskDoublerConstants.HeaderSize; + if (dataStart + (long)dataCompSize + rsrcCompSize > this._stream.Length) + throw new InvalidDataException("DiskDoubler file is shorter than its header's fork sizes."); + + DiskDoublerEntry Fork(string entryName, uint size, uint compSize, int method, int checksumAt, int deltaAt, long offset, bool isData) => new() { + Name = entryName, + Method = method & 0x7F, + OriginalSize = size, + CompressedSize = compSize, + DataOffset = offset, + IsDataFork = isData, + Checksum = BinaryPrimitives.ReadUInt16BigEndian(probe.AsSpan(headerAt + checksumAt)), + DeltaType = BinaryPrimitives.ReadUInt16BigEndian(probe.AsSpan(headerAt + deltaAt)), + FileType = fileType, + Creator = creator, + Modified = modified == 0 ? null : DateTime.UnixEpoch.AddSeconds(modified - DiskDoublerConstants.MacEpochOffsetSeconds), + XorKey = xorKey, + }; + + if (dataSize > 0 || rsrcSize == 0) + this._entries.Add(Fork(name, dataSize, dataCompSize, hdr[20], 48, 54, dataStart, true)); + if (rsrcSize > 0) + this._entries.Add(Fork(name + ".rsrc", rsrcSize, rsrcCompSize, hdr[21], 50, 56, dataStart + dataCompSize, false)); } } diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.DiskDoubler/DiskDoublerWriter.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.DiskDoubler/DiskDoublerWriter.cs index 9b5929ef2..a66b8eaf7 100644 --- a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.DiskDoubler/DiskDoublerWriter.cs +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.DiskDoubler/DiskDoublerWriter.cs @@ -1,66 +1,51 @@ #pragma warning disable CS1591 using System.Buffers.Binary; using System.Text; +using Compression.Core.Checksums; namespace FileFormat.DiskDoubler; /// -/// Writes a DiskDoubler stored (method 0) file. Takes a single data fork -/// payload; resource fork is empty. Roundtrips through -/// . +/// Writes a single DiskDoubler file with a stored (method 0) data fork and no resource fork, in the +/// layout documents. The Unarchiver (unar) reads it back. /// public sealed class DiskDoublerWriter { - private const int HeaderSize = 82; - private const int FileNameOffset = 34; - private const int MaxNameLength = 47; // 82 - 34(offset) - 1(pascal len byte) = 47 - - private string _name = "file"; private byte[] _data = []; + private string _fileType = "????"; + private string _creator = "????"; - /// - /// Sets the file. - /// - public void SetFile(string name, byte[] data) { - ArgumentNullException.ThrowIfNull(name); + /// Sets the data fork. DiskDoubler stores no name; the file's own name is the entry's name. + public void SetFile(byte[] data, string fileType = "????", string creator = "????") { ArgumentNullException.ThrowIfNull(data); - _name = name; - _data = data; + ArgumentNullException.ThrowIfNull(fileType); + ArgumentNullException.ThrowIfNull(creator); + this._data = data; + this._fileType = fileType; + this._creator = creator; } - /// - /// Writes the to to the supplied output. - /// + /// Writes the header and the stored data fork to . public void WriteTo(Stream output) { ArgumentNullException.ThrowIfNull(output); - var hdr = new byte[HeaderSize]; - - // [0..4] version — reader doesn't validate; use zero. - // [4..8] Mac file type — "????" placeholder. - Encoding.ASCII.GetBytes("????").CopyTo(hdr, 4); - // [8..12] Mac creator — "????" placeholder. - Encoding.ASCII.GetBytes("????").CopyTo(hdr, 8); - // [12..14] Finder flags — 0. - // [14..16] reserved — 0. - - // [16..20] data fork original size (BE). - BinaryPrimitives.WriteUInt32BigEndian(hdr.AsSpan(16), (uint)_data.Length); - // [20..24] data fork compressed size (BE) — same as original (stored). - BinaryPrimitives.WriteUInt32BigEndian(hdr.AsSpan(20), (uint)_data.Length); - // [24..28] resource fork original size — 0. - // [28..32] resource fork compressed size — 0. - // [32] data fork compression method — 0 (stored). - hdr[32] = DiskDoublerConstants.MethodStored; - // [33] resource fork compression method — 0. - hdr[33] = DiskDoublerConstants.MethodStored; - - // [34] Pascal string: length byte + name bytes (Latin-1, up to 47 chars). - var nameBytes = Encoding.Latin1.GetBytes(_name); - var nameLen = Math.Min(nameBytes.Length, MaxNameLength); - hdr[FileNameOffset] = (byte)nameLen; - nameBytes.AsSpan(0, nameLen).CopyTo(hdr.AsSpan(FileNameOffset + 1)); + var hdr = new byte[DiskDoublerConstants.HeaderSize]; + BinaryPrimitives.WriteUInt32BigEndian(hdr, DiskDoublerConstants.Magic); + BinaryPrimitives.WriteUInt32BigEndian(hdr.AsSpan(4), (uint)this._data.Length); + BinaryPrimitives.WriteUInt32BigEndian(hdr.AsSpan(8), (uint)this._data.Length); + // [12..20] resource fork sizes, [20..22] methods: zero = empty and stored. + hdr[22] = 0x2A; // the version byte real files carry + WriteFourCc(hdr.AsSpan(32, 4), this._fileType); + WriteFourCc(hdr.AsSpan(36, 4), this._creator); + BinaryPrimitives.WriteUInt16BigEndian(hdr.AsSpan(82), Crc16Ccitt.Compute(hdr.AsSpan(0, DiskDoublerConstants.HeaderCrcSpan))); output.Write(hdr); - output.Write(_data); + output.Write(this._data); + } + + private static void WriteFourCc(Span dest, string value) { + var bytes = Encoding.Latin1.GetBytes(value); + var length = Math.Min(bytes.Length, 4); + bytes.AsSpan(0, length).CopyTo(dest); + dest[length..].Fill((byte)' '); } } diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.DiskDoubler/THIRD-PARTY-NOTICE.XADMaster.txt b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.DiskDoubler/THIRD-PARTY-NOTICE.XADMaster.txt new file mode 100644 index 000000000..267cdbd8e --- /dev/null +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.DiskDoubler/THIRD-PARTY-NOTICE.XADMaster.txt @@ -0,0 +1,34 @@ +XADMaster (DiskDoubler) - converted to C# + +Source: https://github.com/MacPaw/XADMaster (The Unarchiver's unarchiving engine) +Revision: 7cb9ee0abbb163f261e4cb74501e15067032319c (master, 2026-09-21) +Authors: Dag Ågren (original author); MacPaw Way Ltd. (2017-present); + parts descend from libxad (Dirk Stöcker and contributors) +Licence: GNU Lesser General Public License, version 2.1 or (at your option) + any later version. This repository is LGPL-3.0-or-later, which the + "or any later version" grant permits; the full LGPL text is in the + repository's LICENSE file. + +Upstream notice, as carried in each XADMaster source file: + + Copyright (c) 2017-present, MacPaw Way Ltd. All rights reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +Files converted: + + XADDiskDoublerParser.m -> DiskDoublerReader.cs (header layout, method + numbering, compress-method XOR and checksum) + XADDiskDoublerADnHandle.m -> DiskDoublerAdDecoder.cs + +Methods 2-5, 7, 8 and 10 and delta pre-processing are refused rather than +decoded. The header CRC is CRC-16/XMODEM over the 82 bytes before it (XADMaster +computes the same value through a bit-reversed table). diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.PackIt/PackItConstants.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.PackIt/PackItConstants.cs index 08fd8ba05..133139ea5 100644 --- a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.PackIt/PackItConstants.cs +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.PackIt/PackItConstants.cs @@ -10,9 +10,24 @@ internal static class PackItConstants { /// Entry magic for a Huffman-compressed entry: "PMa4". public static ReadOnlySpan MagicCompressed => "PMa4"u8; - /// Size of the per-entry header in bytes (magic + filename field + metadata). - public const int EntryHeaderSize = 87; + /// Entry magic for a Huffman-compressed entry XOR-encrypted with the password: "PMa5". + public static ReadOnlySpan MagicXorEncrypted => "PMa5"u8; - /// Maximum filename length in a PackIt entry (Pascal string capacity minus length byte). - public const int FileNameMaxLength = 62; + /// Entry magic for a Huffman-compressed entry DES-encrypted with the password: "PMa6". + public static ReadOnlySpan MagicDesEncrypted => "PMa6"u8; + + /// End-of-archive marker that follows the last entry: "PEnd". + public static ReadOnlySpan MagicEnd => "PEnd"u8; + + /// Size of the entry header that follows the magic, in bytes. + public const int HeaderSize = 94; + + /// Bytes of the header covered by the header CRC (everything before the CRC itself). + public const int HeaderCrcSpan = 92; + + /// Capacity of the filename field (after its length byte). + public const int FileNameMaxLength = 63; + + /// Seconds between the Macintosh epoch (1904-01-01) and the Unix epoch. + public const long MacEpochOffsetSeconds = 2_082_844_800; } diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.PackIt/PackItEntry.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.PackIt/PackItEntry.cs index c2cfe8f36..be31e2cb3 100644 --- a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.PackIt/PackItEntry.cs +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.PackIt/PackItEntry.cs @@ -11,15 +11,39 @@ public sealed class PackItEntry { /// Gets the Mac four-character creator code (e.g. "CWIE"). public string Creator { get; init; } = string.Empty; + /// Gets the Finder flags. + public ushort FinderFlags { get; init; } + /// Gets the uncompressed data fork size in bytes. public long DataForkSize { get; init; } /// Gets the uncompressed resource fork size in bytes. public long ResourceForkSize { get; init; } - /// Gets whether this entry uses Huffman compression ("PMa4"). + /// Gets the creation time, or when the header holds zero. + public DateTime? Created { get; init; } + + /// Gets the modification time, or when the header holds zero. + public DateTime? Modified { get; init; } + + /// Gets whether this entry is Huffman-compressed ("PMa4", "PMa5", "PMa6"). public bool IsCompressed { get; init; } - /// Gets the absolute byte offset where the data fork begins in the source stream. + /// Gets whether this entry is password-encrypted ("PMa5" XOR, "PMa6" DES). + public bool IsEncrypted { get; init; } + + /// Gets whether the header matched its CRC-16 (always for encrypted entries, which cannot be checked). + public bool HeaderCrcValid { get; init; } = true; + + /// + /// Gets the absolute offset where the data fork begins for a stored entry; for a compressed entry, + /// the offset of its Huffman bit stream (the byte after the magic). + /// public long DataOffset { get; init; } + + /// Gets the absolute offset of the entry's magic. + public long EntryOffset { get; init; } + + /// Gets the number of bytes the entry occupies, magic included. + public long EntryLength { get; init; } } diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.PackIt/PackItFormatDescriptor.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.PackIt/PackItFormatDescriptor.cs index 54eaa0f5f..760de7dd1 100644 --- a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.PackIt/PackItFormatDescriptor.cs +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.PackIt/PackItFormatDescriptor.cs @@ -10,27 +10,36 @@ namespace FileFormat.PackIt; /// References: /// /// https://github.com/MacPaw/XADMaster — XADMaster (The Unarchiver) — maintained implementation including PackIt -/// No formal specification — format known from PackIt itself and later community documentation +/// No formal specification; header CRC measured on real PackIt II archives (see PackItReader) /// /// public sealed class PackItFormatDescriptor : IFormatDescriptor, IArchiveFormatOperations, IArchiveCreatable, IArchiveModifiable, IArchiveDefragmentable, IArchiveLayoutMap { - /// Rebuild-based defrag: extracts then re-creates the PackIt archive in listing order. + /// Rebuild-based defrag: re-chains the entries in listing order. public void Defragment(Stream archive) => this.Defragment(archive, new DefragOptions { Mode = DefragMode.ConsolidateAtStart }); - /// Rebuild-based defrag: extracts then re-creates the PackIt archive per the requested mode. + /// + /// Rebuild-based defrag. Each entry is carried over as its raw bytes (magic to fork CRC), so resource + /// forks, Finder info, dates and Huffman coding survive unchanged; only the chain is rewritten. + /// public void Defragment(Stream archive, DefragOptions options) { DefragRebuilder.Rebuild(archive, options, readEntries: stream => { var r = new PackItReader(stream, leaveOpen: true); - return r.Entries.Select(e => (e.Name, r.Extract(e))); + if (r.IsIncomplete) + throw new InvalidDataException("PackIt archive cannot be walked to its end; refusing to rebuild it."); + return r.Entries.Select(e => { + var raw = new byte[e.EntryLength]; + stream.Position = e.EntryOffset; + stream.ReadExactly(raw); + return (e.Name, raw); + }).ToList(); }, - buildImage: files => { + buildImage: entries => { using var ms = new MemoryStream(); - using (var w = new PackItWriter(ms, leaveOpen: true)) { - foreach (var (n, d) in files) w.AddFile(n, d); - } + foreach (var (_, raw) in entries) ms.Write(raw); + ms.Write("PEnd"u8); return ms.ToArray(); }); } @@ -40,11 +49,8 @@ public void Defragment(Stream archive, DefragOptions options) { public IEnumerable EnumerateLayout(Stream archive) { archive.Position = 0; var r = new PackItReader(archive); - foreach (var e in r.Entries) { - var totalSize = e.DataForkSize + e.ResourceForkSize; - if (totalSize > 0) - yield return new DefragBlockInfo(e.DataOffset, totalSize, DefragBlockKind.Used, FileName: e.Name); - } + foreach (var e in r.Entries) + yield return new DefragBlockInfo(e.EntryOffset, e.EntryLength, DefragBlockKind.Used, FileName: e.Name); } /// public ulong BlockCount { get; set; } = MinBlockCount; - // Native stat40/cde40 items live in leaves; extent40 items live in twigs. - // Reiser4Tree packs additional nodes as needed, and allocator accounting covers - // both file data and tree blocks. Derived layout and oracle evidence are in - // docs/REISER4-NATIVE-PROFILE.md. The legacy constants below are retained only - // for reading images made by the earlier private-directory writer. + /// How regular files are stored. follows the + /// captured mkfs profile, whose root names cryptcompress for new files. + public Reiser4FileBody FileBody { get; set; } = Reiser4FileBody.Extents; - /// Marker written at of the master superblock. + /// Marker written at of the master superblock by the earliest workbench writer. /// The value spells nothing: a marker that reads as words names whoever chose them. internal static readonly byte[] PayloadMarker = [0x8D, 0x17, 0x0C, 0xE1, 0x93, 0x1A, 0x0F, 0xB6, 0x81]; @@ -154,14 +83,11 @@ public sealed class Reiser4Writer { /// Offset in the master superblock of the first directory block number (d64). internal const int MasterPayloadDirOff = MasterPayloadMarkerOff + 12; - /// Magic at the head of every payload directory block. + /// Magic at the head of every legacy payload directory block. internal static readonly byte[] DirMagic = [0x9E, 0x0B, 0x14, 0xA7, 0x02, 0xDB, 0x18, 0x8F]; - /// Directory block head: magic, next-block link, entry count. internal const int DirHeadSize = 8 + 8 + 4; - - /// One directory entry: a 224-byte name, then the first data block and the byte length. internal const int DirNameLength = 224; internal const int DirEntrySize = DirNameLength + 8 + 8; internal const int DirEntriesPerBlock = (BlockSize - DirHeadSize) / DirEntrySize; @@ -172,55 +98,74 @@ public sealed class Reiser4Writer { /// internal const ulong BlocksPerBitmap = (ulong)(BlockSize - 4) * 8; - private readonly List<(string Name, FilePayload Payload, Reiser4Reader.FileMetadata? Metadata)> _files = []; + private readonly List> _edits = []; + private readonly HashSet _names = new(StringComparer.Ordinal); - /// Adds a regular file to the payload area. + /// Adds a regular file. public void AddFile(string name, byte[] data, Reiser4Reader.FileMetadata? metadata = null) { - ValidateName(name); ArgumentNullException.ThrowIfNull(data); - this._files.Add((name, FilePayload.FromBytes(data), metadata)); + this.Claim(name); + this._edits.Add(plan => plan.AddFile(name, FilePayload.FromBytes(data), metadata)); } /// Adds a file whose bytes are pulled from as the image is written. public void AddStreamingFile(string name, long size, Func openStream, Reiser4Reader.FileMetadata? metadata = null) { - ValidateName(name); ArgumentNullException.ThrowIfNull(openStream); - this._files.Add((name, FilePayload.FromStream(size, openStream), metadata)); + this.Claim(name); + this._edits.Add(plan => plan.AddFile(name, FilePayload.FromStream(size, openStream), metadata)); } - /// Validates the path components supported by the native namespace writer. - internal static string? RejectName(string? name) { - if (string.IsNullOrEmpty(name)) return "an entry needs a name"; - var components = name.Replace('\\', '/').Split('/'); - if (components.Length > 129) return "this profile supports at most 129 path components"; - if (components.Any(static component => component.Length == 0 || component is "." or "..")) - return "path components must be non-empty and cannot be dot entries"; - if (name.Contains('\0') || name.Contains(':') || name.Any(static c => c > 127)) - return "this profile requires ASCII names without NUL or colon"; - return null; - } - - private readonly Dictionary _directories = new(StringComparer.Ordinal); - /// Retains an explicit directory, including an empty directory. public void AddDirectory(string name, Reiser4Reader.FileMetadata? metadata = null) { var normalized = name.Replace('\\', '/').TrimEnd('/'); if (normalized.Length > 0 && RejectName(normalized) is { } reason) throw new NotSupportedException("Reiser4: " + reason + "."); - this._directories[normalized] = metadata; + this._edits.Add(plan => plan.AddDirectory(normalized, metadata)); + } + + /// Adds a symbolic link whose target is . + public void AddSymlink(string name, string target, Reiser4Reader.FileMetadata? metadata = null) { + ArgumentNullException.ThrowIfNull(target); + this.Claim(name); + this._edits.Add(plan => plan.AddSymlink(name, target, metadata)); + } + + /// Adds a device node, FIFO or socket; carries the file type bits. + public void AddSpecialFile(string name, ushort mode, ulong device = 0, Reiser4Reader.FileMetadata? metadata = null) { + this.Claim(name); + this._edits.Add(plan => plan.AddSpecial(name, mode, device, metadata)); + } + + /// Adds as a further name of the file at . + public void AddHardLink(string name, string existing) { + ArgumentNullException.ThrowIfNull(existing); + this.Claim(name); + this._edits.Add(plan => plan.AddHardLink(name, existing)); } - private void ValidateName(string name) { + private void Claim(string name) { if (RejectName(name) is { } reason) throw new NotSupportedException("Reiser4: " + reason + "."); - if (this._files.Any(f => f.Name.Replace('\\', '/').Equals(name.Replace('\\', '/'), StringComparison.Ordinal))) + if (!this._names.Add(name.Replace('\\', '/'))) throw new ArgumentException($"Reiser4: '{name}' is already in the root directory.", nameof(name)); } + /// Validates the path components supported by the native namespace writer. + internal static string? RejectName(string? name) { + if (string.IsNullOrEmpty(name)) return "an entry needs a name"; + var components = name.Replace('\\', '/').Split('/'); + if (components.Length > 129) return "this profile supports at most 129 path components"; + if (components.Any(static component => component.Length == 0 || component is "." or "..")) + return "path components must be non-empty and cannot be dot entries"; + if (name.Contains('\0') || name.Contains(':') || name.Any(static c => c > 127)) + return "this profile requires ASCII names without NUL or colon"; + if (components.Any(static component => component.Length > 255)) return "a name is longer than 255 bytes"; + return null; + } + /// - /// Smallest block count that holds : the reserved - /// blocks, the directory chain, every file's data blocks, and the bitmap blocks - /// interleaved among them. + /// Smallest block count that holds : the reserved blocks, every + /// file's data blocks, the tree, and the bitmap blocks interleaved among them. /// public static ulong EstimateBlockCount(IEnumerable fileSizes) { ArgumentNullException.ThrowIfNull(fileSizes); @@ -229,26 +174,18 @@ public static ulong EstimateBlockCount(IEnumerable fileSizes) { blocks += (ulong)((sizes.Count + DirEntriesPerBlock - 1) / Math.Max(1, DirEntriesPerBlock)); foreach (var size in sizes) blocks += (ulong)((size + BlockSize - 1) / BlockSize); - blocks += blocks / BlocksPerBitmap + 2; // the strided bitmap blocks + blocks += blocks / BlocksPerBitmap + 2; return Math.Max(MinBlockCount, blocks + blocks / 20); } - /// True when holds a block-allocator bitmap. - private static bool IsBitmapBlock(ulong block) - => block == 18 || (block != 0 && block % BlocksPerBitmap == 0); - - /// Builds the image fully in memory and returns the byte array. - /// For block counts above ~32 K the result will be tens of MB; prefer the - /// streaming overload when caller-side allocation matters. + /// Builds the image fully in memory and returns the byte array. public byte[] Build() { using var ms = new MemoryStream(); this.Write(ms); return ms.ToArray(); } - /// Streams the full image into . Writes - /// ×4096 bytes and leaves the stream positioned at - /// the end. + /// Streams the full image into and leaves the stream positioned at the end. public void Write(Stream output) { ArgumentNullException.ThrowIfNull(output); if (!output.CanSeek) { @@ -259,204 +196,33 @@ public void Write(Stream output) { output.Flush(); return; } - var blocks = Math.Max(this.BlockCount, MinBlockCount); - var totalBytes = checked((long)blocks * BlockSize); + var plan = this.CreatePlan(); + foreach (var edit in this._edits) edit(plan); + plan.Write(output); + } + /// The empty volume: the captured mkfs blocks with this writer's identity patched in. + internal Reiser4Plan CreatePlan() { var uuid = this.Uuid ?? Guid.NewGuid().ToByteArray(bigEndian: true); if (uuid.Length != 16) throw new ArgumentException("UUID must be exactly 16 bytes.", nameof(this.Uuid)); var mkfsId = this.MkfsId ?? unchecked((uint)Random.Shared.Next(int.MinValue, int.MaxValue)); var label = TrimLabel(this.Label); - // Templates are byte-exact 4 KB captures from `mkfs.reiser4 -fffy` on a 4096-block - // image, so the patches below are pure overrides of variable fields. - var blk16 = LoadTemplate(16); - var blk17 = LoadTemplate(17); - var blk18 = LoadTemplate(18); - var blk21 = LoadTemplate(21); - var blk22 = LoadTemplate(22); - var blk23 = LoadTemplate(23); - var blk24 = LoadTemplate(24); - - // ── Master superblock (block 16) ───────────────────────────────────── - uuid.AsSpan().CopyTo(blk16.AsSpan(MasterUuidOff, 16)); - Array.Clear(blk16, MasterLabelOff, 16); - label.AsSpan().CopyTo(blk16.AsSpan(MasterLabelOff, 16)); - - // ── Format40 SB (block 17) ─────────────────────────────────────────── - BinaryPrimitives.WriteUInt64LittleEndian(blk17.AsSpan(F40BlockCountOff, 8), blocks); - BinaryPrimitives.WriteUInt64LittleEndian(blk17.AsSpan(F40FreeBlocksOff, 8), blocks - ReservedBlockCount); - BinaryPrimitives.WriteUInt32LittleEndian(blk17.AsSpan(F40MkfsIdOff, 4), mkfsId); - - - // ── Backup record (block 22) ───────────────────────────────────────── - uuid.AsSpan().CopyTo(blk22.AsSpan(BackupUuidOff, 16)); - Array.Clear(blk22, BackupLabelOff, 16); - label.AsSpan().CopyTo(blk22.AsSpan(BackupLabelOff, 16)); - BinaryPrimitives.WriteUInt64LittleEndian(blk22.AsSpan(BackupF40BlockCountOff, 8), blocks); - BinaryPrimitives.WriteUInt32LittleEndian(blk22.AsSpan(BackupF40MkfsIdOff, 4), mkfsId); - - // ── Tree nodes — twig (block 23) and leaf (block 24) ───────────────── - BinaryPrimitives.WriteUInt32LittleEndian(blk23.AsSpan(NodeMkfsIdOff, 4), mkfsId); - BinaryPrimitives.WriteUInt32LittleEndian(blk24.AsSpan(NodeMkfsIdOff, 4), mkfsId); - - // ── Native file data blocks ───────────────────────────────────────── - // Allocations step over the strided bitmap blocks, which the bitmap pass below then - // marks along with everything else in use. - var cursor = ReservedBlockCount; - ulong Alloc() { - while (IsBitmapBlock(cursor)) ++cursor; - blocks = Math.Max(blocks, checked(cursor + 1)); - return cursor++; - } - - // No private directory chain any more: the native tree names every file, and - // blocks that the tree does not reach but the bitmap marks used are exactly - // what fsck.reiser4 reports as a bitmap mismatch. Readers keep understanding - // the chain in images written before. - var payloads = new DeferredPayloads(); - // The same runs the payload area is made of become the extents of the file in - // the tree — one file's bytes, described twice, sitting in one place. - var treeFiles = new List(this._files.Count); - var nextObjectId = RootObjectId + 1; - foreach (var (name, payload, metadata) in this._files) { - var need = (payload.Size + BlockSize - 1) / BlockSize; - var first = need > 0 ? Alloc() : 0UL; - // A file's blocks are consecutive apart from any bitmap they straddle, so - // the body is recorded as one payload per contiguous stretch. - var runs = new List(); - var runStart = first; - var runBlocks = need > 0 ? 1L : 0L; - var written = 0L; - for (var i = 1L; i < need; ++i) { - var next = Alloc(); - if (next == runStart + (ulong)runBlocks) { ++runBlocks; continue; } - AddRun(payloads, payload, runStart, runBlocks, ref written); - runs.Add(new Reiser4Tree.Run(runStart, (ulong)runBlocks)); - runStart = next; - runBlocks = 1; - } - if (runBlocks > 0) { - AddRun(payloads, payload, runStart, runBlocks, ref written); - runs.Add(new Reiser4Tree.Run(runStart, (ulong)runBlocks)); - } - - treeFiles.Add(new Reiser4Tree.Entry { - Name = name, ParentObjectId = RootObjectId, ObjectId = nextObjectId++, Size = payload.Size, Runs = runs, Metadata = metadata, - }); - } - - // ── The tree itself ────────────────────────────────────────────────── - // Every file gets a stat data and its extents, and the root directory an entry - // naming it — so what the volume holds is what a reader of the format finds, - // not only what our own reader knows to look for. - var tree = Reiser4Tree.Build(blk24, BlockSize, mkfsId, (uint)DateTimeOffset.UtcNow.ToUnixTimeSeconds(), - RootLocality, RootObjectId, treeFiles, this._directories, Alloc); - blk23 = tree.Nodes[23]; - blk24 = tree.Nodes[24]; - BinaryPrimitives.WriteUInt16LittleEndian(blk17.AsSpan(F40TreeHeightOff), tree.Height); - BinaryPrimitives.WriteUInt64LittleEndian(blk17.AsSpan(F40OidNextOff), tree.NextObjectId); - BinaryPrimitives.WriteUInt64LittleEndian(blk17.AsSpan(F40OidFileCountOff), tree.ObjectCount); - totalBytes = checked((long)blocks * BlockSize); - BinaryPrimitives.WriteUInt64LittleEndian(blk17.AsSpan(F40BlockCountOff), blocks); - BinaryPrimitives.WriteUInt64LittleEndian(blk22.AsSpan(BackupF40BlockCountOff), blocks); - - var usedBlocks = cursor; // every block below the cursor is reserved or payload - - // ── Free-block accounting and the bitmap blocks ────────────────────── - var tailBitmapBlocks = (blocks - 1) / BlocksPerBitmap - (usedBlocks - 1) / BlocksPerBitmap; - BinaryPrimitives.WriteUInt64LittleEndian(blk17.AsSpan(F40FreeBlocksOff, 8), blocks - usedBlocks - tailBitmapBlocks); - var bitmaps = BuildBitmaps(blocks, usedBlocks, blk18); - - // ── Emit the metadata prefix, then the payload ─────────────────────── - var basePosition = output.CanSeek ? output.Position : 0; - var firstDataBlock = ReservedBlockCount; - var zero = new byte[BlockSize]; - for (var b = 0UL; b < firstDataBlock; b++) { - var buf = b switch { - 16 => blk16, - 17 => blk17, - 18 => blk18, - 21 => blk21, - 22 => blk22, - 23 => blk23, - 24 => blk24, - _ => zero, - }; - output.Write(buf, 0, BlockSize); - } - output.Flush(); + var master = LoadTemplate(16); + uuid.AsSpan().CopyTo(master.AsSpan(MasterUuidOff, 16)); + Array.Clear(master, MasterLabelOff, 16); + label.AsSpan().CopyTo(master.AsSpan(MasterLabelOff, 16)); - output.SetLength(basePosition + totalBytes); - foreach (var (block, bytes) in bitmaps) { - if (block < firstDataBlock) continue; // already emitted in the prefix - output.Position = basePosition + (long)block * BlockSize; - output.Write(bytes); - } - foreach (var (block, node) in tree.Nodes) { - if (block is 23 or 24) continue; - output.Position = basePosition + checked((long)block * BlockSize); - output.Write(node); - } - payloads.FlushTo(output, basePosition); - output.Position = basePosition + totalBytes; - output.Flush(); - } + var backup = LoadTemplate(22); + uuid.AsSpan().CopyTo(backup.AsSpan(BackupUuidOff, 16)); + Array.Clear(backup, BackupLabelOff, 16); + label.AsSpan().CopyTo(backup.AsSpan(BackupLabelOff, 16)); - /// Records one contiguous run of a file's blocks as a payload to copy. - private static void AddRun(DeferredPayloads payloads, FilePayload payload, - ulong firstBlock, long blockCount, ref long written) { - var length = Math.Min(blockCount * BlockSize, payload.Size - written); - if (length <= 0) return; - var skip = written; - payloads.Add((long)firstBlock * BlockSize, - FilePayload.FromStream(length, () => SkipTo(payload.Open(), skip))); - written += blockCount * BlockSize; - } - - /// Advances to , reading through when it cannot seek. - private static Stream SkipTo(Stream source, long offset) { - if (offset <= 0) return source; - if (source.CanSeek) { - source.Position = offset; - return source; - } - var buffer = new byte[64 * 1024]; - var remaining = offset; - while (remaining > 0) { - var n = source.Read(buffer, 0, (int)Math.Min(buffer.Length, remaining)); - if (n <= 0) break; - remaining -= n; - } - return source; - } - - /// - /// Builds every block-allocator bitmap. Bitmap i covers blocks - /// [i × BlocksPerBitmap, (i+1) × BlocksPerBitmap); the first lives at the - /// reserved block 18 and the rest at the stride boundaries. Blocks below - /// are allocated, as is every bitmap block and - /// everything past the end of the filesystem — an out-of-range bit must read as - /// 1 or the allocator would hand out a block that is not there. - /// - private static List<(ulong Block, byte[] Bytes)> BuildBitmaps(ulong blocks, ulong usedBlocks, byte[] first) { - var result = new List<(ulong Block, byte[] Bytes)>(); - var count = (blocks + BlocksPerBitmap - 1) / BlocksPerBitmap; - for (var i = 0UL; i < count; ++i) { - var block = i == 0 ? 18UL : i * BlocksPerBitmap; - var buf = i == 0 ? first : new byte[BlockSize]; - Array.Clear(buf, 0, buf.Length); - var baseBlock = i * BlocksPerBitmap; - for (var bit = 0UL; bit < BlocksPerBitmap; ++bit) { - var target = baseBlock + bit; - if (target >= usedBlocks && target < blocks && !IsBitmapBlock(target)) continue; - buf[BitmapDataOff + (int)(bit >> 3)] |= (byte)(1 << (int)(bit & 7)); - } - var adler = Adler32.Compute(buf.AsSpan(BitmapDataOff, BitmapDataLength)); - BinaryPrimitives.WriteUInt32LittleEndian(buf.AsSpan(BitmapAdlerOff, 4), adler); - result.Add((block, buf)); - } - return result; + var plan = Reiser4Plan.Fresh(master, LoadTemplate(17), LoadTemplate(21), backup, LoadTemplate(24), mkfsId, + Math.Max(this.BlockCount, MinBlockCount)); + plan.FileBody = this.FileBody; + return plan; } private static byte[] TrimLabel(string? label) { @@ -465,51 +231,7 @@ private static byte[] TrimLabel(string? label) { return bytes.Length <= 16 ? bytes : bytes[..16]; } - /// - /// Why the fixed blocks of an existing volume describe something this writer would not - /// write back, or when a rebuild reproduces them. - /// - /// - /// A rebuild writes the captured mkfs prefix again with only the volume's identity - /// patched in, so every other byte of those blocks has to be what the source already - /// holds. That is where a volume made with another profile shows: the format40 tail - /// policy, and the plugin set the backup record keeps of the root directory's — hash, - /// fibration, formatting. Writing the default profile over them leaves the root's own - /// plugin set disagreeing with its backup, which fsck.reiser4 reports, and names - /// keyed with a hash the volume does not use, which nothing can look up. - /// A status block other than "consistent" marks a volume the tools found damaged, - /// and a journal header or footer that is not blank belongs to a volume the kernel - /// wrote, whose transactions this reader does not replay. Both are left alone rather - /// than silently rewritten. - /// - internal static string? ProfileMismatch(Func readBlock) { - ArgumentNullException.ThrowIfNull(readBlock); - static bool SameOutside(ReadOnlySpan actual, ReadOnlySpan template, params (int Start, int End)[] volatileRanges) { - if (actual.Length != template.Length) return false; - for (var i = 0; i < template.Length; ++i) - if (actual[i] != template[i] && !volatileRanges.Any(range => i >= range.Start && i < range.End)) - return false; - return true; - } - - // Master: uuid, label and the legacy payload marker and pointer that follow them. - if (!SameOutside(readBlock(16), LoadTemplate(16), (MasterUuidOff, MasterPayloadDirOff + 8))) - return "the master superblock carries fields this writer does not reproduce"; - // Format40: the counters, the root, the mkfs id and the tree height move; magic, - // tail policy, flags and version are the profile. - if (!SameOutside(readBlock(17), LoadTemplate(17), (F40BlockCountOff, F40MagicOff), (F40TreeHeightOff, F40PolicyOff))) - return "the volume uses a tail policy or format40 flags other than the default profile"; - if (readBlock(19).Any(static b => b != 0) || readBlock(20).Any(static b => b != 0)) - return "the journal is not blank, and its transactions are not replayed"; - if (!SameOutside(readBlock(21), LoadTemplate(21))) - return "the status block does not mark the volume consistent"; - if (!SameOutside(readBlock(22), LoadTemplate(22), (BackupUuidOff, BackupLabelOff + 16), - (BackupF40BlockCountOff, BackupF40MkfsIdOff + 4))) - return "the root directory's plugin set (hash, fibration or formatting) is not the default profile"; - return null; - } - - private static byte[] LoadTemplate(int blockNumber) { + internal static byte[] LoadTemplate(int blockNumber) { var resource = $"FileSystem.Reiser4.Templates.block_{blockNumber}.bin"; var asm = typeof(Reiser4Writer).Assembly; using var stream = asm.GetManifestResourceStream(resource) diff --git a/Hawkynt.FileFormats.FileSystems/README.md b/Hawkynt.FileFormats.FileSystems/README.md index 4177f0de8..b6d9a3728 100644 --- a/Hawkynt.FileFormats.FileSystems/README.md +++ b/Hawkynt.FileFormats.FileSystems/README.md @@ -128,7 +128,7 @@ The `Id`, `State` and verb columns are read off the descriptors by `FilesystemRe | [OCFS2 (Oracle Cluster Filesystem 2)](https://en.wikipedia.org/wiki/OCFS2) | `Ocfs2` | R/W | ✅ | ✅ moving | — | ✅ | ✅ | — | ✅ | Linux kernel `ocfs2` driver (libguestfs appliance) mounts the written volume and reads the tree back byte-identical with modes, owners and times; [`fsck.ocfs2 -fn`](https://github.com/markfasheh/ocfs2-tools) clean before and after a kernel read-write mount, and after in-place add / replace / remove (nested too) / defrag / shrink on our volumes and on `mkfs.ocfs2 -M local` volumes filled by the kernel; kernel-written files with extent trees of depth 1 and 2 extract with the kernel's SHA-256 | Single-node (local) volumes; in-place edits cover files in inline directories (missing directories are made), extent-backed directories are refused; shrink trims the free tail in place; journal at least the kernel's 4 MiB minimum | [OCFS2](https://www.kernel.org/doc/html/latest/filesystems/ocfs2.html) | | [QNX4 FS](https://en.wikipedia.org/wiki/QNX4FS) | `Qnx4` | R/W | ✅ | ✅ moving | — | ✅ | ✅ | — | ✅ | own reader + struct-parity tests | — | [qnx4](https://www.kernel.org/doc/html/latest/filesystems/qnx4.html) | | [QNX6 Neutrino FS](https://en.wikipedia.org/wiki/QNX6FS) | `Qnx6` | R/W | ✅ | ✅ moving | — | ✅ | ✅ | — | ✅ | own reader + struct-parity tests | — | [qnx6](https://www.kernel.org/doc/html/latest/filesystems/qnx6.html) | -| [Reiser4](https://en.wikipedia.org/wiki/Reiser4) | `Reiser4` | R/W | ✅ | ✅ moving | — | ✅ | ✅ | — | ✅ | `fsck.reiser4 --check` + `debugfs.reiser4` (WSL-gated): trees up to height 4, nested/empty directories, bytes read through the tools' own lookup; edits on `mkfs.reiser4` volumes and on trees `fsck.reiser4 --build-fs` rewrote | Multi-level node40 trees with nested and empty directories; edits rebuild the volume keeping UUID, label, mkfs id, object IDs and stat data; volumes of another plugin profile (hash, fibration, tail policy) are read but not rewritten; defrag moves in place only for a two-node tree | [Reiser4](https://reiser4.wiki.kernel.org/) | +| [Reiser4](https://en.wikipedia.org/wiki/Reiser4) | `Reiser4` | R/W | ✅ | ✅ moving | — | ✅ | ✅ | — | ✅ | `fsck.reiser4 --check` + `debugfs.reiser4` (CI gate) on every `mkfs.reiser4 -o` profile; a Reiser4 kernel (Linux 5.4 + SFRN 4.0.2 under QEMU) mounts and reads back every volume the writer makes or edits, and wrote the 13 reference volumes the reader is checked against | Every plugin profile (r5/tea/fnv1/deg/rupasov hashes, all four fibrations, tails/extents/smart, node40/node41, cryptcompress with lzo1/gzip1/zstd1, 4K–64K clusters); extents with holes, tails and compressed clusters; symlinks, device nodes, FIFOs, sockets, hard links; journal replay; edits keep identity, keys and every stat byte; in-place defrag on trees of any height; new long names refused under the Rupasov hash; encrypted files, short keys and other block sizes refused | [Reiser4](https://reiser4.wiki.kernel.org/) | | [ReiserFS](https://en.wikipedia.org/wiki/ReiserFS) | `ReiserFs` | R/W | ✅ | ✅ moving | — | ✅ | ✅ | — | ✅ | [`reiserfsck`](https://git.kernel.org/pub/scm/linux/kernel/git/jeffm/reiserfsprogs.git), also after mutation | ReiserFS 3.6; edits rebuild the tree | [ReiserFS documentation](https://www.kernel.org/doc/html/latest/filesystems/reiserfs.html) | | [TUX2](https://en.wikipedia.org/wiki/Tux2) | `Tux2` | R/W | ✅ | ✅ moving | — | ✅ | ✅ | — | ✅ | own reader + struct-parity tests | Phase-tree filesystem | [Tux2](https://en.wikipedia.org/wiki/Tux2) | | [TUX3](https://en.wikipedia.org/wiki/Tux3) | `Tux3` | R | ✅ | — | — | ✅ | ✅ | — | — | own reader + struct-parity tests | — | [Tux3](https://github.com/OGAWAHirofumi/tux3) | @@ -333,7 +333,7 @@ cwb recover raw.img --mode files --format Jpeg,Png - Where **Notes** says a format's edits *rebuild* the volume, an add or remove costs the whole image rather than the bytes that changed, and the block placement of untouched files may move. - **bcachefs** creation, in-place add/replace, reading and extraction preserve inode timestamps (to 100 ns, before the epoch and past 2038), UID/GID and permission bits when supplied through the archive-input metadata; ordinary file-backed inputs capture available host timestamps and mode automatically. Applying UID/GID on extraction depends on host APIs and is not available through the portable .NET filesystem API. Volumes are written at metadata version 1.3, the newest the distributions' bcachefs-tools open, so their `fsck` can judge them; newer tools upgrade such a volume as they open it. Mutation is profile-gated: the in-place writer owns single-device regular pointer extents as emitted by this package, and re-publishes every tree from what it read, so a volume another implementation wrote (packed keys, appended bsets, a journal with keys in it, another metadata version) is refused for mutation with the reason and left untouched; it is still read, including packed and multi-bset nodes, sparse files and symbolic links. Compressed and encrypted extents are recognised and refused per file, not decoded. Bucket generations are carried through a mutation: emptying a bucket advances its generation, and the alloc key, the `bucket_gens` slot, the extent pointer and its backpointer are written from one source and checked against each other before the commit is published. Foreign volumes with extra live b-trees, non-canonical `bucket_gens` or `alloc_v4` keys, inline / reflink / compressed extent keys, or unsupported inode and dirent types are refused for mutation rather than rewritten speculatively; read support is broader. What a volume carries and how each value was established is written up in [BCACHEFS-ON-DISK.md](https://github.com/Hawkynt/CompressionWorkbench/blob/main/docs/BCACHEFS-ON-DISK.md). - **ReFS** edits are offline-quiescent: the image must not be mounted, and `RefsMutationMode.NativeCow` stays fail-closed. The reader walks ReFS 3.x containers, MSB+ trees, allocators, Block Refcount rows and MLog framing; the offline editor relocates data and metadata pages, replaces and removes regular files and empty directories through CoW B+ replacement and alternate-checkpoint publication. Block Refcount row creation and whole-file clone semantics are implemented and tested: `RefsOfflineBlockCloner.CloneWholeFile` repoints an existing destination stream at an existing, equal-sized, cluster-aligned source stream, materialises the shared-cluster reference counts — including the first clone of a slot the sparse table does not yet track — and publishes Object Table root #0 and Block Refcount root #6 through one alternate checkpoint, reclaiming the destination's former allocation only once that checkpoint is durable. Writing to a clone afterwards reallocates rather than overwriting the shared clusters. **No public verb reaches this primitive**: it is a library entry point, not something `cwb` can be asked to do, and the profile is deliberately narrower than `FSCTL_DUPLICATE_EXTENTS_TO_FILE` — resident, sparse, integrity, zero-length, already-shared and partial-range clones are all refused. Still open before a mounted driver could use the same core: redo-payload codecs and replay for every opcode, every Schema Table key rule, the allocation-zone policies of the three allocators, container create / delete / move, partial-range and EOF-extending clones, hard links, sparse and integrity-stream mutation beyond 4 KiB clusters, snapshots, ADS, security descriptors, reparse points, USN, rename, truncate, a format path, locking and a Windows `chkdsk` corpus. -- **Reiser4** R/W writes and reads node40 trees with as many leaves, twigs and internal levels as the namespace needs, nested and empty directories, and extents in twig nodes. Edits, defrag, shrink and relayout are staged rebuilds that keep the volume's UUID, label and mkfs id, every object ID, mode, owner, timestamps and declared stat-data extensions (large times, flags, plugin and heir sets); `UpdateMetadata` sets mode, owner and timestamps the same way and refuses link-count or extension changes. `fsck.reiser4` calls trees of height 3 and 4 consistent before and after those edits, and file bytes agree with where `debugfs.reiser4` finds them. A rebuild is refused, the image untouched, when the volume uses another plugin profile (a hash, fibration or tail policy other than mkfs's default), has a non-blank journal or a status other than consistent, or holds items outside the profile — tails, ctails, xattr items, symlinks, other stat-data extensions, sparse or shared files, non-ASCII names, short keys. No Reiser4-capable kernel was reachable, so nothing was mounted. Older private payload-chain images remain readable. See [native profile notes](https://github.com/Hawkynt/CompressionWorkbench/blob/main/docs/REISER4-NATIVE-PROFILE.md). +- **Reiser4** R/W reads and writes node40 and node41 (checksummed) trees of any height under every plugin profile `mkfs.reiser4 -o` can set: directory entries are keyed with the directory's own hash (r5, tea, fnv1, deg) and fibration (lexic, dot_o, ext_1, ext_3), and the tail policy, root plugin set and backup block are carried. File bodies are extents (holes kept as holes), tails, or cryptcompress clusters compressed with lzo1, gzip1 or zstd1 at 4–64 KiB; symlinks, device nodes, FIFOs, sockets and hard links are read and written. A journal holding committed but unflushed transactions is replayed before reading, and an edit writes the replayed state. Edits, defrag, shrink and relayout are staged: the volume is read whole, edited as a plan, written to scratch, read back and verified, and only then copied over the source — refusals leave it byte-identical. New regular files are extents unless `FileBody` asks for tails, the smart policy, compressed files or the volume's own profile. Defragmentation moves extent data in place on trees of any height (twig units repointed, allocator bits moved), falling back to a rebuild when the journal is pending. A Reiser4 kernel (Linux 5.4.18 with the SFRN 4.0.2 patch, under QEMU) wrote the 13 reference volumes the reader is checked against and reads back every volume the writer makes or edits; `fsck.reiser4` calls them consistent. Refused: names longer than 23 bytes under the Rupasov hash (the kernel and reiser4progs compute it differently), encrypted files, short keys, block sizes other than 4096, damaged volumes. See [native profile notes](https://github.com/Hawkynt/CompressionWorkbench/blob/main/docs/REISER4-NATIVE-PROFILE.md). - **GFS2** R/W is the standalone `lock_nolock` profile with regular files in the root directory; small files are stuffed and larger files use the indirect tree. Existing-image edits rebuild the volume while preserving its size floor, lock-table value, UUID and each regular file's mode, owner, timestamps (with nanoseconds) and access-policy flags; layout-changing flags such as JDATA are not carried over because the rebuilt file is laid out plainly. Directory attributes are not preserved. ExHash/nested-directory writing, journal replay, cluster-lock-manager state and extended attributes remain out of scope. - **NSS** native read support is intentionally narrow and quiescent: the reader reconstructs validated DirH/LEAF namespace relationships and ordinary contiguous file extents using the OES-derived clean-room profile in [NSS-ON-DISK.md](https://github.com/Hawkynt/CompressionWorkbench/blob/main/docs/NSS-ON-DISK.md), while retaining anchor diagnostics for unsupported images. Native allocation trees, journals, trustee metadata, ZLBH history, compressed/sparse/fragmented data profiles and writable NSS pools remain out of scope; the existing writer still emits a private Workbench container rather than a pool NetWare/OES would mount. - **HFS+** is listed as a POSIX system shows it: a catalog '/' appears as ':' (and a ':' given to the writer is stored as '/'), file hard links carry their indirect node's data under every name, directory hard links (Time Machine snapshots) are directories holding their inode's content wherever they are linked — a link back into a directory being listed is shown but not entered, and the links add at most a million entries — and the metadata directories and journal files are left out. `.HFS+ Private Directory Data` stays visible only while it holds something no link reaches. A journal that holds transactions is replayed into what is listed and extracted, the image untouched, stopping where Apple's replay does: at the first damaged block list, dropping the transaction last opened before it. hfsprogs' `fsck.hfsplus` does not replay journals, so the replay is checked by writing it out and having fsck accept the result; no other independent replay was available. Every decmpfs (HFS+ transparent compression) method is read: 1, 3/4 zlib, 5 (zeros, as libfshfs reads it), 7/8 LZVN, 9/10 raw, 11/12 LZFSE and 13/14 LZBITMAP; a dataless placeholder (0x80000001/0x80000002) has no local content and lists and extracts as empty, with `Kind` `dataless`. The writer's `Compression` option (default `None`) stores files compressed with any of those methods except 5 and the dataless types, which do not encode given content: inline in the attribute when the encoding fits (3802 bytes, files up to 64 KiB), otherwise as 64 KiB resource-fork chunks; a file that would not shrink stays uncompressed. libfshfs reads the zlib, LZVN, LZFSE and raw volumes byte for byte, 7-Zip the zlib and LZVN ones, HFSExplorer the zlib one; none of them, nor hfsfuse or Apple's open-source fsck_hfs, implements method 1 or LZBITMAP, so those two have no independent HFS+ reader here (the LZBITMAP stream itself is checked against dissect.util). The in-place editor repacks the catalog, extents overflow and attributes B-trees after each edit, growing a B-tree file into free space (one more extent at most per growth, up to eight), so an add may split nodes and a removal may empty a leaf. It adds files at any path, creating missing folders, optionally compressed (`HfsPlusModifier.AddFile` with an `HfsPlusCompression`) and with extended attributes (inline when they fit an attributes node, else in an attribute fork); data that no single free run holds is spread over several, the runs past the eighth recorded in the extents overflow file. Removing a file removes its extended attributes, decmpfs attribute, resource fork and overflow records and frees every block they own. On a case-folding volume a name differing only in case replaces the file; on a case-sensitive HFSX volume it is a second file. Refused, the volume untouched: removing or replacing a hard link or directory hard link, anything in the metadata directories, a fork whose extents do not add up to its block count, a special file continued in the extents overflow file, and any in-place write — edit, defragmentation, wipe — on a volume whose journal holds transactions; a journal that is empty stays empty and valid. Defragmentation leaves the journal files where the volume header points. fsck.hfsplus accepts volumes edited each of these ways, including `mkfs.hfsplus -J`, `-s` and `-s -J` volumes and the hdiutil volume, and libfshfs reads every file and extended attribute back. On extraction, characters the host cannot hold in a file name (on Windows `: < > " | ? *`, control characters, trailing dots and blanks) become `_`, as for every format. diff --git a/Hawkynt.FileFormats.FileSystems/REFERENCE.md b/Hawkynt.FileFormats.FileSystems/REFERENCE.md index a53eb4bf9..a4fca6de7 100644 --- a/Hawkynt.FileFormats.FileSystems/REFERENCE.md +++ b/Hawkynt.FileFormats.FileSystems/REFERENCE.md @@ -12111,63 +12111,79 @@ Performs the bounded offline ReFS block-clone operation for two existing, equal- ### Namespace `FileSystem.Reiser4` -[`Reiser4BlockMover`](#reiser4blockmover) · [`Reiser4FormatDescriptor`](#reiser4formatdescriptor) · [`Reiser4MasterSb`](#reiser4mastersb) · [`Reiser4Reader`](#reiser4reader) · [`Reiser4Reader.Entry`](#reiser4readerentry) · [`Reiser4Reader.FileMetadata`](#reiser4readerfilemetadata) · [`Reiser4Writer`](#reiser4writer) +[`Reiser4BlockMover`](#reiser4blockmover) · [`Reiser4FileBody`](#reiser4filebody) · [`Reiser4FormatDescriptor`](#reiser4formatdescriptor) · [`Reiser4MasterSb`](#reiser4mastersb) · [`Reiser4Reader`](#reiser4reader) · [`Reiser4Reader.Entry`](#reiser4readerentry) · [`Reiser4Reader.EntryKind`](#reiser4readerentrykind) · [`Reiser4Reader.FileMetadata`](#reiser4readerfilemetadata) · [`Reiser4Writer`](#reiser4writer) #### `Reiser4BlockMover` -Moves a file's blocks inside a Reiser4 payload area and rewrites the directory entry that said where it started. +Moves the data blocks of a Reiser4 volume's extent files in place and repoints the extent units that name them, wherever in the tree their twig nodes sit. Implements `IFilesystemBlockMover`. | Member | Signature | Summary | | --- | --- | --- | | `Reiser4BlockMover` | `Reiser4BlockMover()` | | -| `BlockSize` | `int BlockSize { get; }` | A block, which is what the directory counts in. | -| `FirstDataByte` | `long FirstDataByte { get; }` | First byte a file may occupy: past the reserved blocks and the directory, which is where the first file already sits. | -| `RepointsRunsIndependently` | `bool RepointsRunsIndependently { get; }` | Each call notes where one run has got to; a file split by the bitmaps it steps over is simply several calls. | -| `SupportsHeldRuns` | `bool SupportsHeldRuns { get; }` | A run may be held outside the volume while the rest of the layout moves, which is what lets a full volume be rearranged at all. | -| `Init` | `void Init(Stream image)` | Reads the directory once and notes where every file is. | +| `BlockSize` | `int BlockSize { get; }` | A block, which is what an extent unit counts in. | +| `FirstDataByte` | `long FirstDataByte { get; }` | First byte a file may occupy: past the jump area, the superblocks, the journal, the status and backup blocks and the first two nodes. | +| `RepointsRunsIndependently` | `bool RepointsRunsIndependently { get; }` | Each call notes where one unit's run has got to. | +| `SupportsHeldRuns` | `bool SupportsHeldRuns { get; }` | A run may be held outside the volume while the rest of the layout moves. | +| `Init` | `void Init(Stream image)` | Reads the tree once and notes where every extent unit is. | | `MoveExtent` | `void MoveExtent(Stream image, long srcOffset, long dstOffset, long length, bool zeroSource = false)` | | -| `SettleDirectory` | `void SettleDirectory(Stream image)` | Writes each file's new physical location into both the native extent40 item and the legacy workbench directory once the pass is over. | +| `SettleDirectory` | `void SettleDirectory(Stream image)` | Writes every unit's new start into its twig and moves the allocator bits with it. | | `UpdateAllocationAfterMove` | `void UpdateAllocationAfterMove(Stream image, string fileName, long oldOffset, long newOffset, long length)` | | +#### `Reiser4FileBody` + +How the body of a regular file this writer creates is stored. + +| Value | Numeric | Summary | +| --- | --- | --- | +| `Extents` | `0` | Extent items in twigs pointing at data blocks (`reg40`, "extents" formatting). | +| `Tails` | `1` | Tail (`plain40`) items in leaves holding the bytes themselves (`reg40`, "tails" formatting). | +| `Smart` | `2` | Tails up to four blocks, extents above that — the kernel's "smart" formatting. | +| `Compressed` | `3` | A cryptcompress (`ccreg40`) file: compressed disk clusters in `ctail40` items. | +| `Profile` | `4` | Whatever the volume's root plugin set says new files are: its create plugin, then its formatting. | + #### `Reiser4FormatDescriptor` -Descriptor for Reiser4 filesystem images (successor to ReiserFS 3.6 — completely different on-disk layout). Volumes whose node40 tree the reader walks completely list and extract their files and directories, and are created and edited through staged rebuilds that carry the volume's identity and every object's metadata across; other images surface the master superblock at offset 65536, the format40 superblock that follows it, a structured metadata bundle and the raw image. Magic: `"ReIsEr4"` at offset 65536 — master superblock `ms_magic[16]`. References: `https://archive.kernel.org/oldwiki/reiser4.wiki.kernel.org/` — archived Reiser4 wiki (format40 layout, plugin system)reiser4progs (`mkfs.reiser4` / `debugfs.reiser4`) — canonical userspace tooling`https://en.wikipedia.org/wiki/Reiser4` — Wikipedia article +Descriptor for Reiser4 filesystem images (successor to ReiserFS 3.6 — completely different on-disk layout). Volumes whose node40/node41 tree the reader walks completely list and extract their files, directories, links and special files — after replaying a pending journal — and are created and edited through staged rebuilds that carry the volume's identity, plugin profile and every object's keys, metadata and body across; other images surface the master superblock at offset 65536, the format40 superblock that follows it, a structured metadata bundle and the raw image. Magic: `"ReIsEr4"` at offset 65536 — master superblock `ms_magic[16]`. References: `https://archive.kernel.org/oldwiki/reiser4.wiki.kernel.org/` — archived Reiser4 wiki (format40 layout, plugin system)reiser4progs (`mkfs.reiser4` / `debugfs.reiser4`) — canonical userspace tooling`https://en.wikipedia.org/wiki/Reiser4` — Wikipedia article Implements `IArchiveCreatable`, `IArchiveDefragmentable`, `IArchiveFormatOperations`, `IArchiveModifiable`, `IArchivePurgeable`, `IArchiveShrinkable`, `IArchiveWriteConstraints`, `IFilesystemExtentMap`, `IFormatDescriptor`, `IFormatOptionsSchema`, `ILayoutOptimizable`, `IWipeEmpty`. | Member | Signature | Summary | | --- | --- | --- | | `Reiser4FormatDescriptor` | `Reiser4FormatDescriptor()` | | -| `AcceptedInputsDescription` | `string AcceptedInputsDescription { get; }` | Gets the accepted inputs description. | -| `Capabilities` | `FormatCapabilities Capabilities { get; }` | Gets the capabilities. | -| `Category` | `FormatCategory Category { get; }` | Gets the category. | -| `CompoundExtensions` | `IReadOnlyList CompoundExtensions { get; }` | Gets the compound extensions. | -| `DefaultExtension` | `string DefaultExtension { get; }` | Gets the default extension. | -| `Description` | `string Description { get; }` | Gets the description. | -| `DisplayName` | `string DisplayName { get; }` | Gets the display name. | -| `Extensions` | `IReadOnlyList Extensions { get; }` | Gets the extensions. | -| `Family` | `AlgorithmFamily Family { get; }` | Gets the family. | -| `Id` | `string Id { get; }` | Gets the id. | -| `MagicSignatures` | `IReadOnlyList MagicSignatures { get; }` | Gets the magic signatures. | -| `MaxTotalArchiveSize` | `long? MaxTotalArchiveSize { get; }` | Gets the max total archive size. | -| `Methods` | `IReadOnlyList Methods { get; }` | Gets the methods. | -| `MinTotalArchiveSize` | `long? MinTotalArchiveSize { get; }` | Gets the min total archive size. | -| `OptionsSchema` | `IReadOnlyList OptionsSchema { get; }` | Knobs the empty-filesystem writer actually honours. `VolumeLabel` is written into the master superblock label field (and the backup record) and surfaces through `fsck.reiser4` / our metadata readback; `ImageSize` drives `BlockCount` (4 KB blocks, clamped to the writer minimum). The 4 KB block size is fixed — the embedded mkfs.reiser4 templates are byte-exact 4096-byte captures — so it is intentionally not exposed. | -| `TarCompressionFormatId` | `string TarCompressionFormatId { get; }` | Gets the tar compression format id. | -| `Add` | `void Add(Stream archive, IReadOnlyList inputs)` | Adds or replaces members while retaining existing stat-data extensions. | -| `CanAccept` | `bool CanAccept(ArchiveInputInfo input, out string reason)` | Performs the can accept operation. | -| `CreateFromStreams` | `void CreateFromStreams(Stream target, IEnumerable inputs, FormatCreateOptions options)` | Creates the supported native node40 profile from input streams. Each source is consumed once into a temporary file, then copied in bounded chunks by `Reiser4Writer`; no complete file is staged in memory. Directory inputs retain empty directories and nested paths. | -| `Create` | `void Create(Stream output, IReadOnlyList inputs, FormatCreateOptions options)` | Performs the create operation. | +| `AcceptedInputsDescription` | `string AcceptedInputsDescription { get; }` | | +| `Capabilities` | `FormatCapabilities Capabilities { get; }` | | +| `Category` | `FormatCategory Category { get; }` | | +| `CompoundExtensions` | `IReadOnlyList CompoundExtensions { get; }` | | +| `DefaultExtension` | `string DefaultExtension { get; }` | | +| `Description` | `string Description { get; }` | | +| `DisplayName` | `string DisplayName { get; }` | | +| `Extensions` | `IReadOnlyList Extensions { get; }` | | +| `Family` | `AlgorithmFamily Family { get; }` | | +| `Id` | `string Id { get; }` | | +| `MagicSignatures` | `IReadOnlyList MagicSignatures { get; }` | | +| `MaxTotalArchiveSize` | `long? MaxTotalArchiveSize { get; }` | | +| `Methods` | `IReadOnlyList Methods { get; }` | | +| `MinTotalArchiveSize` | `long? MinTotalArchiveSize { get; }` | | +| `OptionsSchema` | `IReadOnlyList OptionsSchema { get; }` | Knobs the writer honours. `VolumeLabel` is written into the master superblock label field (and the backup record); `ImageSize` drives `BlockCount` (4 KB blocks, clamped to the writer minimum); `FileBody` picks how regular files are stored (`Reiser4FileBody`). The 4 KB block size is fixed — the embedded mkfs.reiser4 templates are byte-exact 4096-byte captures — so it is intentionally not exposed. | +| `TarCompressionFormatId` | `string TarCompressionFormatId { get; }` | | +| `AddHardLink` | `void AddHardLink(Stream archive, string path, string existing)` | Adds `path` as a further name of the existing file `existing`. | +| `AddSpecialFile` | `void AddSpecialFile(Stream archive, string path, ushort mode, ulong device = 0)` | Adds a device node (`device` = major << 20 \| minor), FIFO or socket. | +| `AddSymlink` | `void AddSymlink(Stream archive, string path, string target)` | Adds a symbolic link at `path` pointing at `target`. | +| `Add` | `void Add(Stream archive, IReadOnlyList inputs)` | Adds or replaces members while retaining every existing object; new files are stored as extents. | +| `Add` | `void Add(Stream archive, IReadOnlyList inputs, Reiser4FileBody body)` | Adds or replaces members, storing new regular files as `body` says. | +| `CanAccept` | `bool CanAccept(ArchiveInputInfo input, out string reason)` | | +| `CreateFromStreams` | `void CreateFromStreams(Stream target, IEnumerable inputs, FormatCreateOptions options)` | Creates the volume from input streams. Each source is consumed once into a temporary file, then copied in bounded chunks by `Reiser4Writer`; no complete file is staged in memory. Directory inputs retain empty directories and nested paths. | +| `Create` | `void Create(Stream output, IReadOnlyList inputs, FormatCreateOptions options)` | Creates a volume holding `inputs`. | | `Defragment` | `void Defragment(Stream archive)` | Performs the defragment operation. | -| `Defragment` | `void Defragment(Stream archive, DefragOptions options)` | Rewrites the volume with every file laid out contiguously from the start of the payload area. Each entry is spilled to scratch and the writer pulls it back, so the rebuild is not bounded by what a byte[] can hold. | -| `EnumerateExtents` | `IEnumerable EnumerateExtents(Stream image)` | Reports the volume's layout: the reserved blocks and the payload directory chain as metadata, then each file's blocks. A file's blocks are consecutive apart from the block-allocator bitmaps they step over. | +| `Defragment` | `void Defragment(Stream archive, DefragOptions options)` | Defragments the volume: in place when the planner's moves can be written back as extent repoints (any tree height), otherwise by a staged rebuild that lays every file out contiguously at the same volume size. | +| `EnumerateExtents` | `IEnumerable EnumerateExtents(Stream image)` | Reports the volume's layout: the reserved blocks, the tree nodes and the allocator bitmaps as metadata, then each file's extent runs. A volume whose journal still holds transactions to replay reports nothing: its blocks are not yet where the tree says. | | `Extract` | `void Extract(Stream stream, string outputDir, string password, string[] files)` | Decodes the supplied input. | | `List` | `List List(Stream stream, string password)` | Lists the entries in the supplied container. | -| `RebuildStreaming` | `void RebuildStreaming(Stream source, Stream target, LayoutRebuildOptions options)` | Rebuilds the supported native profile while carrying existing metadata. | +| `RebuildStreaming` | `void RebuildStreaming(Stream source, Stream target, LayoutRebuildOptions options)` | Rebuilds the volume while carrying existing metadata, at the requested image size or the smallest that holds it. | | `Remove` | `void Remove(Stream archive, string[] entryNames)` | Removes members and directory subtrees through a metadata-preserving rebuild. | -| `Shrink` | `void Shrink(Stream input, Stream output)` | Rebuilds tightly while retaining native metadata, or copies through on failure. | +| `Shrink` | `void Shrink(Stream input, Stream output)` | Rebuilds tightly while retaining native metadata, or copies through when the volume cannot be rebuilt smaller. | | `UpdateMetadata` | `void UpdateMetadata(Stream archive, string name, FileMetadata metadata)` | Updates a native object's mode, owner and timestamps through a staged rebuild. | | `WipeUnusedSpace` | `long WipeUnusedSpace(Stream image, bool wipeClusterTips = true, bool wipeDeletedEntries = true)` | Zeros every byte no live file and no metadata block occupies. | @@ -12204,7 +12220,7 @@ Parses the Reiser4 master superblock at byte offset 65536 (16 * 4 KB) and the ad #### `Reiser4Reader` -Reads a Reiser4 image: the master superblock's label, UUID and block size, plus regular files represented by the native stat40/cde40/extent40 items emitted by `Reiser4Writer`. The older workbench payload directory remains a compatibility fallback for images written before native tree items became authoritative. +Reads a Reiser4 image: the master superblock's label, UUID and block size, and every object of the node40/node41 tree after the journal is replayed — directories, regular files whose bodies are extents, tails or compressed clusters (holes included), symbolic links, device nodes, FIFOs, sockets and hard links. The older workbench payload directory remains a compatibility fallback for images written before native tree items became authoritative. Implements `IDisposable`. @@ -12213,15 +12229,17 @@ Implements `IDisposable`. | `Reiser4Reader` | `Reiser4Reader(Stream stream, bool leaveOpen = true)` | Initializes a new instance of `Reiser4Reader`. | | `MasterOffset` | `const long MasterOffset` | Byte offset of the master superblock: block 16 at a 4 KB block size. | | `BlockSize` | `int BlockSize { get; }` | Filesystem block size from the master superblock. | -| `Entries` | `IReadOnlyList Entries { get; }` | Files and directories found in the native tree, or files in the legacy payload directory. | +| `Entries` | `IReadOnlyList Entries { get; }` | Files, directories, links and special files found in the native tree, or files in the legacy payload directory. | | `Label` | `string Label { get; }` | Volume label from the master superblock. | | `Length` | `long Length { get; }` | Total size of the backing image in bytes. | -| `NativeTreeValid` | `bool NativeTreeValid { get; }` | True when the complete supported native namespace was decoded. | +| `NativeProblem` | `string NativeProblem { get; }` | Why the native tree was not decoded, when it was not. | +| `NativeTreeValid` | `bool NativeTreeValid { get; }` | True when the complete native namespace was decoded. | +| `ReplayedTransactions` | `int ReplayedTransactions { get; }` | Journal transactions replayed before the tree was read (0 when the journal was clean). | | `RootMetadata` | `FileMetadata RootMetadata { get; }` | Root stat-data, including inherited plugin settings. | | `UuidHex` | `string UuidHex { get; }` | Volume UUID from the master superblock, as hex. | | `Valid` | `bool Valid { get; }` | True when the image carries a valid Reiser4 master superblock. | | `Dispose` | `void Dispose()` | Releases resources held by this instance. | -| `EnumerateRuns` | `IEnumerable> EnumerateRuns(Entry entry)` | Where an entry's bytes live as physical byte runs. | +| `EnumerateRuns` | `IEnumerable> EnumerateRuns(Entry entry)` | Where an entry's bytes live as physical byte runs (extent data only; tails and clusters live in tree nodes). | | `ExtractTo` | `long ExtractTo(Entry entry, Stream destination)` | Writes `entry`'s contents into `destination`. | | `Extract` | `byte[] Extract(Entry entry)` | Reads a file's contents. Only valid below the array limit. | @@ -12234,12 +12252,31 @@ Implements `IEquatable`. | Member | Signature | Summary | | --- | --- | --- | | `Entry` | `Entry(string Name, ulong FirstBlock, long Size)` | One filesystem object and its physical extents. | +| `Body` | `string Body { get; init; }` | How the body of a regular file is stored: "extent", "tail", "ctail" or "" for none. | +| `Device` | `ulong Device { get; init; }` | The device number of a device node, as the kernel encodes it (major << 20 \| minor). | | `FirstBlock` | `ulong FirstBlock { get; init; }` | | +| `HardLinkOf` | `string HardLinkOf { get; init; }` | The path this entry is a further name of, when the object has more than one name. | | `IsDirectory` | `bool IsDirectory { get; init; }` | True when this entry is a directory. | +| `Kind` | `EntryKind Kind { get; init; }` | What kind of object this entry names. | +| `LinkTarget` | `string LinkTarget { get; init; }` | The target of a symbolic link. | | `Metadata` | `FileMetadata Metadata { get; init; }` | On-disk stat-data fields retained for metadata-preserving rebuilds. | | `Name` | `string Name { get; init; }` | | | `Size` | `long Size { get; init; }` | | +#### `Reiser4Reader.EntryKind` + +What kind of object an entry names. + +| Value | Numeric | Summary | +| --- | --- | --- | +| `File` | `0` | A regular file. | +| `Directory` | `1` | A directory. | +| `Symlink` | `2` | A symbolic link; `LinkTarget` holds its target. | +| `CharacterDevice` | `3` | A character device; `Device` holds its number. | +| `BlockDevice` | `4` | A block device; `Device` holds its number. | +| `Fifo` | `5` | A named pipe. | +| `Socket` | `6` | A socket. | + #### `Reiser4Reader.FileMetadata` Stat-data fields which can be represented by the current writer. @@ -12260,11 +12297,12 @@ Implements `IEquatable`. | `RawStatData` | `byte[] RawStatData { get; init; }` | | | `Size` | `long Size { get; init; }` | | | `StatLocality` | `ulong StatLocality { get; init; }` | Locality of the object stat key. | +| `StatOrdering` | `ulong StatOrdering { get; init; }` | Ordering word of the object stat key (the kernel derives it from the object's first name). | | `UserId` | `uint UserId { get; init; }` | | #### `Reiser4Writer` -Creator for a Reiser4 filesystem image that starts from what `mkfs.reiser4 -fffy` from `reiser4progs 1.2.2` produces and adds directories and regular files through the native tree — stat data and directory entries in leaves, extents in twigs, as many internal levels above them as the tree needs — so that `fsck.reiser4` validates the result as `"FS is consistent."` with or without files. The image holds 25 reserved blocks at fixed positions (block size = 4 KB): 0..15 — jump-area / partition data (zero).16 — master superblock (`"ReIsEr4"` at offset 65536).17 — format40 superblock (`"ReIsEr40FoRmAt"` at offset 52).18 — block-allocator bitmap (4-byte adler32 + bit array).19..20 — journal header / footer (zero for an empty FS).21 — status block (`"ReiSeR4StATusBl"`).22 — superblock backup record.23 — storage-tree root (twig, level 2).24 — leaf containing the root-directory stat-data + ".", "..". Implementation strategy: we embed the seven non-zero reference blocks as resources captured byte-exact from a real `mkfs.reiser4` image, then patch in only the per-image fields: UUID (16 bytes, random)Label (≤ 16 bytes, optional)mkfs_id (4 bytes, random) — appears in 4 places: format40 SB, backup record, twig header, leaf header.block_count / free_blocks (in format40 SB and backup).Bitmap (block 18) — bits 0..24 set for the 25 reserved blocks plus filler bits for the unused tail of the bitmap range, then adler32 of the bitmap data prepended. Round-trips with `fsck.reiser4 -y` exit 0 and produces output identical to the reference image except for the random fields above. +Creator for a Reiser4 filesystem image that starts from what `mkfs.reiser4 -fffy` from `reiser4progs 1.2.2` produces and adds directories, regular files, symbolic links, device nodes, FIFOs, sockets and hard links through the native tree — stat data, directory entries and tails in leaves, extents in twigs, as many internal levels above them as the tree needs — so that `fsck.reiser4` validates the result as `"FS is consistent."` and a Reiser4 kernel mounts and reads it. The image holds 25 reserved blocks at fixed positions (block size = 4 KB): 0..15 — jump-area / partition data (zero).16 — master superblock (`"ReIsEr4"` at offset 65536).17 — format40 superblock (`"ReIsEr40FoRmAt"` at offset 52).18 — block-allocator bitmap (4-byte adler32 + bit array).19..20 — journal header / footer (zero for an unjournalled volume).21 — status block (`"ReiSeR4StATusBl"`).22 — superblock backup record.23 — storage-tree root (twig, level 2, or higher).24 — first leaf (the root directory's stat data and entries). The fixed blocks are byte-exact captures of a real `mkfs.reiser4` image with only the per-image fields patched in: UUID, label, mkfs id, block and free-block counts, the root, the next object id, the file count and the tree height. Regular files are written as extents by default; `FileBody` selects tails, the kernel's smart policy or compressed (cryptcompress) files instead. | Member | Signature | Summary | | --- | --- | --- | @@ -12272,15 +12310,19 @@ Creator for a Reiser4 filesystem image that starts from what `mkfs.reiser4 -fffy | `BlockSize` | `const int BlockSize` | Filesystem block size — 4 KB is the only supported value. Reiser4 theoretically supports 512 / 1024 / 2048 / 4096 / 8192, but the embedded templates are 4096-byte exact captures. | | `MinBlockCount` | `const ulong MinBlockCount` | Minimum block count we'll emit. mkfs.reiser4 itself rejects images below ~750 blocks, but we round up to 4096 (= 16 MB) to match the reference capture and avoid bitmap-truncation edge cases. | | `BlockCount` | `ulong BlockCount { get; set; }` | Total filesystem size in 4 KB blocks. Clamped to `MinBlockCount`. | +| `FileBody` | `Reiser4FileBody FileBody { get; set; }` | How regular files are stored. `Profile` follows the captured mkfs profile, whose root names cryptcompress for new files. | | `Label` | `string Label { get; set; }` | Customisable label written to the master SB (NUL-padded to 16 bytes; longer strings are truncated; null = empty/zero). | | `MkfsId` | `uint? MkfsId { get; set; }` | Optional 32-bit mkfs identifier. When null, a random value is drawn from `Shared`. | | `Uuid` | `byte[] Uuid { get; set; }` | Optional 16-byte UUID. When null, a random Guid is used. | | `AddDirectory` | `void AddDirectory(string name, FileMetadata metadata = null)` | Retains an explicit directory, including an empty directory. | -| `AddFile` | `void AddFile(string name, byte[] data, FileMetadata metadata = null)` | Adds a regular file to the payload area. | +| `AddFile` | `void AddFile(string name, byte[] data, FileMetadata metadata = null)` | Adds a regular file. | +| `AddHardLink` | `void AddHardLink(string name, string existing)` | Adds `name` as a further name of the file at `existing`. | +| `AddSpecialFile` | `void AddSpecialFile(string name, ushort mode, ulong device = 0, FileMetadata metadata = null)` | Adds a device node, FIFO or socket; `mode` carries the file type bits. | | `AddStreamingFile` | `void AddStreamingFile(string name, long size, Func openStream, FileMetadata metadata = null)` | Adds a file whose bytes are pulled from `openStream` as the image is written. | -| `Build` | `byte[] Build()` | Builds the image fully in memory and returns the byte array. For block counts above ~32 K the result will be tens of MB; prefer the streaming overload when caller-side allocation matters. | -| `EstimateBlockCount` | `static ulong EstimateBlockCount(IEnumerable fileSizes)` | Smallest block count that holds `fileSizes`: the reserved blocks, the directory chain, every file's data blocks, and the bitmap blocks interleaved among them. | -| `Write` | `void Write(Stream output)` | Streams the full image into `output`. Writes `BlockCount`×4096 bytes and leaves the stream positioned at the end. | +| `AddSymlink` | `void AddSymlink(string name, string target, FileMetadata metadata = null)` | Adds a symbolic link whose target is `target`. | +| `Build` | `byte[] Build()` | Builds the image fully in memory and returns the byte array. | +| `EstimateBlockCount` | `static ulong EstimateBlockCount(IEnumerable fileSizes)` | Smallest block count that holds `fileSizes`: the reserved blocks, every file's data blocks, the tree, and the bitmap blocks interleaved among them. | +| `Write` | `void Write(Stream output)` | Streams the full image into `output` and leaves the stream positioned at the end. | ### Namespace `FileSystem.ReiserFs` diff --git a/docs/REISER4-NATIVE-PROFILE.md b/docs/REISER4-NATIVE-PROFILE.md index 21320c49f..6e3d05a72 100644 --- a/docs/REISER4-NATIVE-PROFILE.md +++ b/docs/REISER4-NATIVE-PROFILE.md @@ -2,128 +2,189 @@ ## Evidence and provenance -The existing binary templates were captured from `mkfs.reiser4 -fffy` in -reiser4progs 1.2.2. Their fixed fields are the starting point for this profile. -The on-disk layout is also described by the Reiser4 node40, stat40, cde40, -extent40 and format40 plugins in the upstream -[reiser4progs project](https://github.com/edward6/reiser4progs). -The upstream GPL implementation is reference material, not copied or converted -source. This follows sourcing rung 2: no compatible managed implementation was -identified. The new traversal and rebuild tests use synthetic native nodes; -reference-tool conformance is covered separately as described below. Mounted -kernel interoperability has not been tested. - -## Derived layout used here - -For the captured 4096-byte format40 profile, the master is block 16 and the -format superblock is block 17. The latter stores the root block at byte 16 and -the tree height at byte 68. The root object's stat key has locality 41 and object -ID 42. Names beneath a directory use that directory's object ID as locality. - -A node40 block has a 28-byte header, bodies growing upwards and 38-byte item -headers growing downwards from the end. The header's item count is at byte 2, -body-end offset at byte 6, magic at byte 8 and level at byte 26. Each item -header contains four little-endian key words, followed by body offset, flags -and plugin ID. Internal pointer bodies contain a little-endian block address. -Traversal follows all pointers, requires descending levels, and rejects cycles -and out-of-range addresses. - -The supported object plugins are stat40 (0), cde40 (2) and extent40 (5). -Stat-data and directory items occupy level-1 leaves. Extents occupy level-2 -twig nodes alongside child pointers; the reader also accepts the earlier -workbench placement of extents in leaves. This placement follows upstream -`libreiser4/tree.c` target-level selection, which assigns extent items to the -twig level and other object items to the leaf level. -Stat-data must include the lightweight and Unix extensions. Its first 44 bytes -carry extension mask, mode, link count, size, UID, GID, three timestamps and -allocated-byte count. Further extensions follow in mask-bit order; the writer -carries large times (bit 2, 12 bytes), flags (bit 5, 4 bytes), the plugin set -(bit 4) and the heir set (bit 8), each a 16-bit count of 4-byte slots, and -refuses a body holding any other extension or bytes its mask does not declare, -which `fsck.reiser4` reports as a fatal corruption. -Extent bodies contain pairs of 64-bit block start and block count. Multiple -items are joined in logical-offset order only when they describe contiguous -logical content. Holes and unsupported body plugins are rejected. - -Cde40 has a 16-bit entry count, 26-byte unit headers, and units containing a -24-byte target stat key plus the stored name when its key is hashed. Resolving -the target's locality and object ID distinguishes files and directories. Dot -entries are omitted from the archive namespace. Nested and empty directories -are represented explicitly. Large directories split at unit boundaries; each -item uses its first unit name key. Extent arrays split at run boundaries with -logical byte offsets. Leaves end before a twig extent key, so a child pointer does not span an -extent key range at its parent. Sorted leaf items pack into bounded leaves, and parent nodes -use the first key of each child as their delimiting key. Parent levels grow until -one root fits. Format40 height, allocator bitmaps, object counts and allocated -node blocks follow the resulting layout. Paths have at most 129 components to -bound directory recursion. This writer restricts names to ASCII; it rejects -unsupported names rather than truncating them into different names. - -## Rebuild contract and limits - -Add, remove, defrag, shrink and layout rebuild capture metadata before staging, -and write nothing to the source until the staged volume has been read back and -verified. Volume UUID, label and mkfs id survive, as do existing object IDs; -new IDs are allocated beyond the retained ones rather than renumbering live -objects. Mode, ownership and timestamps are retained, size, allocated bytes and -directory link counts follow the rebuilt namespace, and the declared -stat-data extensions listed above are carried byte for byte. Root stat-data -(with its plugin set) and empty directories are retained. - -`UpdateMetadata` sets mode permission bits, UID, GID and the three timestamps -through the same staged rebuild, including on the root. It refuses a change of -object kind, of link count (which follows the namespace) and of extension bytes -with `NotSupportedException`, the volume unchanged. - -A rebuild writes the captured mkfs prefix back with only the identity patched -in, so it is refused, before anything is written, when the source's fixed -blocks hold anything else: - -| Block | What must match the captured profile | Why | +The fixed blocks of a fresh volume are byte-exact captures from `mkfs.reiser4 -fffy` in +reiser4progs 1.2.2. Everything else in this document was derived from the behaviour of two +implementations and checked against both: + +* **reiser4progs 1.2.2** (Ubuntu package 1.2.2-1build2) under WSL: `mkfs.reiser4` makes volumes with + every plugin profile, `fsck.reiser4 --check` judges every volume the writer produces, and + `debugfs.reiser4` resolves names (`-i` prints an object's stat data and items, `-k` prints a + file through reiser4progs' own body plugins — usable as a byte oracle only for text without `%`, + because the bytes are handed to `printf` as its format string). +* **A Reiser4 kernel**: Metztli's Debian build of Linux 5.4.18 with the SFRN 4.0.2 patch + (`linux-image-5.4.0-3+reizer4.0.2-cloud-amd64`), booted under QEMU with a busybox initramfs + (`Compression.Tests/Reiser4/KernelOracle/kernel-run.sh`). It wrote the reference volumes in + `Compression.Tests/Reiser4/ReferenceVectors` through its own write path and reads back every + volume the writer produces. + +The upstream sources (the GPL [reiser4progs](https://github.com/edward6/reiser4progs) and +[kernel module](https://github.com/edward6/reiser4)) were read as reference material to write this +document; no code was copied, converted or transliterated (sourcing rung 2: no licence-compatible +managed implementation exists). Constants — magic strings, TEA key words and delta, FNV offset +basis and prime, the degenerate hash value, CRC-32C and Adler-32 — are copied exactly. + +## Fixed blocks + +Block size is 4096; the master superblock is block 16 and the format40 superblock block 17 +(root block at byte 16, next object id at 24, file count at 32, mkfs id at 48, tree height at 68, +tail policy at 70, flags at 72 — bit 0 set for large keys — and node plugin id at 84). Block 18 is +the first allocator bitmap (a 4-byte Adler-32 of the rest, then one bit per block; further bitmaps +sit at multiples of 32 736 blocks), 19 and 20 the journal header and footer, 21 the status block +(`"ReiSeR4StATusBl"`, then a 64-bit status that is 0 for a consistent volume), 22 the backup of +the master, the format fields and the root's plugin set. + +An edit carries blocks 16, 17, 21 and 22 of the source and patches only the counters (block and +free-block counts, root, next object id, file count, height); the journal blocks are written blank +because the rebuilt volume already holds the replayed state. A volume whose status is not 0 is +refused, as is one with short keys (`mkfs.reiser4 -o key=key_short` crashes in 1.2.2, so no +reference exists) or a block size other than 4096. + +## Plugin profile + +`mkfs.reiser4 -o` changes exactly three things: the format40 tail policy (block 17, byte 70), the +root directory's `sdext_plugin_set` and its copy in the backup block, and — for `node=node41` — the +node plugin id (block 17, byte 84) and the node layout. Plugin-set members are 16-bit pairs +(member, plugin id): 0 file, 1 directory, 2 permission, 3 formatting, 4 hash, 5 fibration, +6 stat data, 7 directory item, 8 cipher, 9 digest, 10 compression, 11 compression mode, 12 cluster, +13 create. An object's missing members come from the root's plugin set (the kernel's +`finish_pset`), and the root's missing ones from the kernel defaults (r5, ext_1, smart, lzo1, conv, +64K, reg40). The default mkfs profile names **ccreg40** (cryptcompress) as the create plugin, so a +kernel writes compressed files on a default volume. + +### Directory entry keys + +A directory entry's key is `(directory oid, type 0, ordering, objectid, offset)`. The name's bytes +pack big-endian into the ordering from its second byte (seven bytes), then the objectid (eight), +then the offset (eight). A name longer than 23 bytes sets bit 56 of the ordering, keeps only its +first 15 bytes in the key, and puts the hash of the remaining bytes in the offset; such a name is +stored after the entry's 24-byte target key, NUL-terminated. The fibration plugin's fibre occupies +the ordering's top seven bits: + +| Fibration | Fibre | +| --- | --- | +| `lexic_fibre` (0) | 0 | +| `dot_o_fibre` (1) | 1 for names ending in `.o`, else 0 | +| `ext_1_fibre` (2) | the last byte, when the byte before it is `.` (and the name is longer than 2) | +| `ext_3_fibre` (3) | the sum of the last three bytes, when the fourth from last is `.` (name longer than 4), modulo 128 | + +| Hash | Value of the bytes after the 15th | +| --- | --- | +| `r5_hash` (1) | `a = (a + (b << 4) + (b >> 4)) * 11` over the bytes, 64-bit | +| `tea_hash` (2) | TEA in a Davies–Meyer construction evaluated in 64-bit arithmetic: 16-byte blocks of four little-endian 32-bit words get 6 rounds, the remainder padded with `len | len << 8 | …` gets 10; the result is the two halves xored | +| `fnv1_hash` (3) | 64-bit FNV-1 | +| `deg_hash` (4) | the constant `0xC0C0C0C010101010` | +| `rupasov_hash` (0) | not computed: the kernel and reiser4progs disagree (fsck.reiser4 reports every kernel-keyed long name as carrying the wrong offset), so no long name keyed with it can satisfy both. Existing entries are carried; new names longer than 23 bytes are refused. | + +The key of a new object's stat data is `(parent oid, type 1, ordering of its first name, oid, 0)`, +as the kernel makes it; directory entries carry the target's full stat key. Existing entries and +stat keys are always carried as found, never recomputed. + +## Nodes and items + +A node40 node has a 28-byte header (plugin id, item count, free space, free-space start, magic +`0x52344653`, mkfs id, flush id, flags, level) and 38-byte item headers growing down from the end +(32-byte key, body offset, flags, item plugin id). node41 adds a 32-bit checksum at byte 28 — the +CRC-32C register (initial value all ones, no final inversion) over the 28 header bytes and then +everything after the checksum — and its bodies start at byte 32. + +| Item plugin | Level | Body | | --- | --- | --- | -| 16 master | everything but UUID and label | other disk-format fields are not reproduced | -| 17 format40 | magic, tail policy, flags, version | `mkfs.reiser4 -o formatting=tails` changes the policy | -| 19, 20 journal | blank | a kernel-written journal is not replayed | -| 21 status | "consistent" | a volume fsck marked damaged is not silently cleared | -| 22 backup | everything but UUID, label, block count, mkfs id | it backs up the root's plugin set: hash, fibration, formatting | - -Writing the default profile over another one was observed to fail: -`fsck.reiser4` reported the root's plugin set disagreeing with its backup, and -with `-o hash=tea_hash` a long name keyed with r5 could not be looked up by -`debugfs.reiser4`. Such volumes are read, not rewritten. Unsupported or -incomplete native trees are refused the same way. Shrink copies the original -through when it cannot build a supported smaller result. - -Reading supports multiple internal levels. Writing builds multiple leaves and -additional internal levels as needed. An indivisible stat-data body or -directory unit larger than a node is refused. This is not full Reiser4 -metadata support: separate xattr items, tail and ctail bodies, arbitrary -object plugins, symlinks, sparse files, shared objects, non-ASCII names, -short keys and alternate node plugins are outside the profile. Native tree -blocks discovered by traversal are reserved in the wipe map. +| stat40 (0) | leaf | the stat data | +| cde40 (2) | leaf | 16-bit count, 26-byte unit headers (three key words, body offset), units of a 24-byte target key plus the stored name of a long entry | +| nodeptr40 (3) | internal | a 64-bit block number | +| extent40 (5) | twig | 16-byte units: start block and width; start 0 is a hole | +| plain40 (6) | leaf | tail: the file's bytes from the key's offset | +| ctail40 (7) | leaf | one byte of cluster shift, then bytes of a disk cluster from the key's offset | + +Stat data starts with a 16-bit extension mask; extensions follow in bit order: light-weight (bit 0: +mode, links, size), Unix (bit 1: uid, gid, atime, mtime, ctime, then 64-bit bytes — or the device +number `major << 20 | minor` of a device node), large times (bit 2, 12 bytes), symlink (bit 3: the +target, as long as the light-weight size, then a NUL), plugin set (bit 4) and heir set (bit 8) +(a count of 4-byte pairs), flags (bit 5, 4 bytes). The crypto extension (bit 7), a cipher in the +plugin set and a chained mask (bit 15) are refused: no key is available for encrypted files. + +### File bodies + +* **reg40, extents.** Units in logical order; holes are units with start 0 and are kept as holes. + `bytes` counts allocated blocks. A unit never covers an allocator bitmap block. +* **reg40, tails.** plain40 items covering the file from offset 0; `bytes` equals the size. The + kernel's smart policy keeps files of up to four blocks in tails. +* **ccreg40 (cryptcompress).** The file is cut into logical clusters of 4 KiB to 64 KiB (cluster + plugin 4…0, shift 12…16, also stored as each ctail item's first byte). Each present cluster is + a disk cluster split across ctail items keyed at the cluster's start plus the byte offset within + the disk cluster. A disk cluster is compressed exactly when it is shorter than the logical + cluster (the cluster size, or what is left of the file); then its last four bytes are the + little-endian Adler-32 of the compressed stream before them. lzo1 is raw LZO1X, gzip1 a raw + deflate stream, zstd1 a Zstandard frame. Compression is kept only when stream plus checksum is + shorter than the input, and inputs under the plugin's minimum (256 bytes, 64 for gzip1) are + stored plain. Missing clusters are holes. `bytes` counts clusters times the cluster size. The + kernel's `conv` mode turns an incompressible file into a reg40 extent file and records + `compressMode=latt` in the plugin set of one it compressed; both are carried. + +### Objects + +Directories, regular files, symlinks (target in the stat data), character and block devices, +FIFOs and sockets (no body), and hard links (several entries naming one stat key; `nlink` counts +them). A directory's `size` is its number of entries including the dot entries, its `bytes` the sum +of its units (26 + 24 bytes each, plus a long name and its NUL), its `nlink` 2 plus its +subdirectories (3 plus them for the root). The writer recomputes these, and a file's `nlink`, from +the namespace; every other stat-data byte is carried. + +## Journal + +Block 19 holds the last committed transaction, block 20 the last one written back to its home +locations (plus the free-block, file and next-oid counters). Every transaction between them is +replayed, oldest first: its head (`"TxMagic4"`, id, total records, padding, previous transaction, +first wander record, counters) links back to the previous one, and its wander records +(`"LogMagc4"`, id, total, serial, next record) list `(original, wandered)` block pairs from byte 32; +replay copies each wandered block over its original. Reading happens on the replayed view; an edit +writes the replayed state with a blank journal. A chain that does not parse is refused. + +Verified on `journal-replay`, captured between a kernel commit and its write-back (writes throttled +by QEMU, image copied the moment the header moved past the footer): the replayed namespace is the +one the kernel shows after mounting, and differs from the unreplayed one. + +## Writing + +New regular files are extents by default; `FileBody` (`Reiser4Writer`, the `FileBody` create +option, `Add(…, Reiser4FileBody)`) selects tails, the smart policy, cryptcompress, or whatever the +volume's root says (`Profile`: its create plugin, then its formatting). A replaced file keeps its +identity, metadata and plugin. Leaves end before a twig extent key; parent levels grow until one +root fits at block 23; the first leaf is block 24. + +Every edit is staged: the source is read whole (journal replayed), edited as a plan, written to +scratch, read back and verified — namespace, identity and every object's stat data — and only then +copied over the source. Refusals leave the source byte-identical. + +### Defragmentation + +The in-place pass moves extent data on trees of any height: each unit's run moves on its own, the +new start is written into the unit's twig (node41 checksums re-sealed), and the allocator bits of +the blocks each unit left are cleared and of the blocks it landed on set. Tree nodes, tails and +compressed clusters do not move. A volume whose journal holds transactions, or a file whose extent +covers blocks past its end, falls back to a staged rebuild at the same size. ## Evidence -Oracle: reiser4progs 1.2.2 (Ubuntu package 1.2.2-1build2) under WSL. The WSL -kernel (6.6) has no Reiser4 driver, so nothing was mounted; volumes written by -the tools themselves come from `mkfs.reiser4` and from -`fsck.reiser4 --build-fs`. File bytes are taken where `debugfs.reiser4 -i` -says they are (its own path lookup, stat data and extent units); `debugfs -k` -is not usable as a byte oracle because it hands file contents to `printf` as -the format string. - | Volume | Checked by | Result | | --- | --- | --- | +| 13 kernel-written reference volumes: default (lzo1, conv, 64K), gzip1+force+8K, zstd1+latt+16K, lzo1+none+4K, reg40 smart, reg40 tails, reg40+extents+node41, node41, tea+lexic, fnv1+dot_o, deg+ext_3, rupasov, journal replay | our reader against the kernel's read-back manifest | every path, type, mode, owner, mtime, link count, size, device, symlink target and file MD5 equal | +| the same, edited (add a long-named file under each body, a symlink, a hard link; remove two names) | `fsck.reiser4 --check`; the kernel's manifest | consistent; carried objects identical, new ones read back byte for byte, including clusters we compressed with lzo1, gzip1 and zstd1 | +| names in every reference directory | re-keyed with the volume's hash and fibration | identical to the kernel's keys (all but Rupasov) | +| every `mkfs.reiser4 -o` profile (hashes, fibrations, formattings, create, compression, mode, cluster, node41) edited under each body | `fsck.reiser4 --check`; `debugfs.reiser4 -i/-k` | consistent; names resolve; plain bodies read back; root plugin set unchanged | +| writer volumes with every object kind and body | `fsck.reiser4`; the kernel's manifest | consistent; identical | +| a tall tree scattered and defragmented in place | `fsck.reiser4`; the kernel's manifest | consistent after both; no node moved; every file identical | | 3,004 files in 28 nested directories, empty and deep-empty directories, sizes 0/1/4095/4096/4097/2.2 MB, names of 23, 24, 100 and 255 characters | `fsck.reiser4 --check`; `debugfs -s`; `debugfs -i` + block copy for 316 files; `measurefs -S` | consistent; height 3, 38 twigs, 113 leaves, 3,040 objects; 0 byte mismatches | -| the same after metadata update, add (nested), remove (subtree and a 255-character name), defrag, shrink, relayout | `fsck`; `debugfs -s`, `-i` and `-k` before/after | consistent each time; UUID, label, stat data and stat keys (object IDs) of untouched objects identical; the update applied exactly | | 12,000 files with extents | `fsck`; `debugfs -s` | consistent; height 4 | -| our volume after `fsck.reiser4 --build-fs` inserted lost+found (object 0xffff, uid 1000) | our reader; then add into lost+found and `fsck` | read completely, 0 mismatches; consistent, object ID and owner kept | -| `mkfs.reiser4` volume, then add nested files, long names, an empty directory | `fsck`; `debugfs -s`, `-i` | consistent; UUID, label, mkfs id, policies and root stat unchanged | -| `mkfs.reiser4 -o hash=tea_hash` / `formatting=tails` / `fibration=lexic_fibre` | our editor | read; edit refused, image byte-identical | -| a file carrying a large-time extension (mask bit 2) through add and defrag | `fsck`; `debugfs -i` | consistent; `sdext_lt` still present | - -`Reiser4ProfileExternalTests` and `Reiser4MutationExternalTests` replay these -checks wherever reiser4progs is installed. The Linux CI leg installs -reiser4progs and runs them as the hard "Reiser4 oracle" gate, with -`CWB_REQUIRE_REISER4PROGS=1` so a missing tool fails the gate instead of -skipping it. +| our volume after `fsck.reiser4 --build-fs` inserted lost+found | our reader; then add into lost+found and `fsck` | read completely; consistent, object ID and owner kept | + +Known disagreements between the two oracles, recorded rather than resolved: kernel-written Rupasov +long names fail `fsck.reiser4`; a tails-formatted file the kernel left with a trailing hole is +reported by `fsck.reiser4` as having the wrong size. `debugfs.reiser4` keys lookups below the root with its own default profile rather than the root's plugin set, so in a non-default profile it finds hashed or fibred names in subdirectories — the kernel's as well as ours — only when given the volume's profile with `-o`. + +`Reiser4KernelVolumeTests` runs without any tool. `Reiser4ProfileExternalTests`, +`Reiser4MutationExternalTests` and `Reiser4FeatureExternalTests` replay the reiser4progs checks +wherever it is installed; the Linux CI leg installs it and runs them as the hard "Reiser4 oracle" +gate with `CWB_REQUIRE_REISER4PROGS=1`, so a missing tool fails the gate instead of skipping it. +`Reiser4KernelOracleTests` need the kernel (`CWB_REISER4_KERNEL_DOWNLOAD=1` fetches it) and skip +without it. From 6c6dd7b4dd367f420cfd99766721d713ef233638 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 26 Oct 2026 12:10:36 +0000 Subject: [PATCH 36/48] * refresh the archive browser screenshot --- docs/screenshots/archive-browser.png | Bin 66518 -> 65657 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/screenshots/archive-browser.png b/docs/screenshots/archive-browser.png index de88d7dd43f38a733fe5557dd0e66b254aa140ee..e3795c0d04a8041389e0aaa3edc8cc5c89e36820 100644 GIT binary patch literal 65657 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

J-t(C?D*vNbSd$Mpldw%6G^3`$t6)P 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 O*JNyHeySLKDeAvN*8HCU literal 66518 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 Kj%4xcAO8X%gq{lk From f7ceb835b7db58e761f0817ff10a17c3b6e1cc66 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 26 Oct 2026 12:10:47 +0000 Subject: [PATCH 37/48] * refresh the archive browser screenshot --- docs/screenshots/archive-browser.png | Bin 66518 -> 66542 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/screenshots/archive-browser.png b/docs/screenshots/archive-browser.png index de88d7dd43f38a733fe5557dd0e66b254aa140ee..5a0c859e84abab8b88df1cbca136e2103c3af24b 100644 GIT binary patch delta 28443 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 bo@MVC(m5TPYCYt_`AAROP^(1qX2^d4eShVN delta 28271 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 Date: Mon, 26 Oct 2026 12:11:26 +0000 Subject: [PATCH 38/48] * refresh the archive browser screenshot --- docs/screenshots/archive-browser.png | Bin 66518 -> 66467 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/screenshots/archive-browser.png b/docs/screenshots/archive-browser.png index de88d7dd43f38a733fe5557dd0e66b254aa140ee..e03df9d4bb6b3f99978ae04296bf29138d51ffd0 100644 GIT binary patch delta 28248 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ⅅ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 J1#0(#{sUDROb!45 delta 28339 zcmc$`1yq&k8aC{V1%iU00wOXmZKtMo5x&#CyHr=%W>F(~@ zbV%p^pBHE5%$(!QIsdo5fBh_%Z1#Tl8&BQWeO=f6BzT?c^E#L1_YpdyLyy%U67}S| z+_|b(LwyDQCA;U0S6*BzwCgF~72?sbOPKmBo~ATA>=S>tk2|a2`Z;|pHEfEXs@DRx zh>VHrUTto=Z`7B!^Pxv<*7(F+%jiGJQMPVzn)V~rHn&?+Gz3MD3C5!MSrcFfPxLQ8nw! z0)0l98P1AUv5~kIsO*k{8t>1E^J*=nQ|uwUsh?)qp9 zjTFV@J~>R5YUwfAj&VEWaahix*Ol=`9$O!&417y0DBw80=nmN~?^&&Msj-_P*2Xk# zZ}p|BCe+;U$-L&M*rJ*>u@l|163KD0^|eYZ-{cAzzo1P>1>Ekha#1Iit1S!a1#1Jj z5XQ8avqBw3v6xIbjzGQ}$yHBm>OR2@-W?-mwgq;Ca6BgLPZpr= zlai3pK5i|9BKwfhtX5Mq7|Rveo&XUMkwpDB2d?TN^Hl;E;^STW4dvRsY`rNxnM{?k zC+%N1K7LKg(@nISCQ)KWW=Kb^iA~r^W95e+H4>poUd0&kl%A7&vm{(8v~0{?`n2TD z(p+(yp+Ps)?M=Bu-;M2UW={MX`@nd^zTN#SQ%$`o^g6-ItD-w65&R^)c^oQD#;jct z?+ulk2|Vqp6A}`VV&xQ8)-B(im7%t9l& zVRszzz~|!fc`PSjztpv#U0}M55DU%Jh~_o-ER2OvuP7E4NGzcaHJ60tk0fjY2g^43 zYDoEa8!yrKCJ)HX`5nhQtExsu$_xuLz$959Ae5}?D+6-nsl^)#nHans$X;| zm9l1sgnw)+_GH}XJ@F+!z%*sj+O1x>Z{y?5ke5Hn6qg;N?&3 zbhtxCQPXjive08~zLQk1o*3le5K(0RJ) z7re7sPU)T7W~Z};3E`N|^phhsVYMA8svngl9w*y0D~z#TOKuK|UloE}(KTnHQSWl6 z$?+nTa+&Y>lS9X5xwIRU3yN~GpOjJ+ zxS{js561YyA|p%n&`jP!Ptg!#yXcLv>)FXr>=+n)%LsZ8uQMc3tp)}{Wz!NIn07Pr2UeduI+ z_f-RVJZ87KOqDJ1X^J$9=f#+0rL{7$?QWSAV`J-LSM=)JgY8A*45*QrQLBlzWMaxP zlu5H8E8)o z+%*s72OTxixeYIGg^n6naZuMG>G+`O(H?Wxr^sHw&+TIB7IA< zIuA$BBv}OX#;$6X>~U;e1)pAih)?3QwdZXS&4Ue5?2z$(DK1J>YQ32j!q}UVZ!Wr5 zTvWtJ+Ryeu>-r!Um+?Y4cU6;pFz#jY4b_1hxB8G39t1wE1pc($jB)v zDS@e?oS~)u(7_)+-ld;u)OnYL#q3LVww1RZ&%*&6iq&ycrl0LfPl{W=MS|#2F54a5 zy(}p1{QmjG?c{m!=6UE*g2?gV4mKJ4!RlzK1QAnKezwm2iQ0p^5BCZ?^~NmwwXi1V z=kW{7Qs!dI5^J0Hu<}et528aDwNT|0q0Jun!fPJ6d3gFJKqA(9U|yg^eCt84M4CD;6QTnpaYm~gai8kpU8;u-!|ehP z|4tqa0TE&O9fowrMo)fzsh@vtDivUAYa22)G(`90J!rKBk$AZyV{{aRDAiK;N>TE) z%j0p!wL=AzM@#uj71-(vi&NE4oD~(a?ib!?qu*IOE4Ja#w=_STh8~ck%+1L$Xp1g9 z7+#CuFiv+fcw-PKz0Y^JGb$!!K2QXua9Hmp$BMfcRYmip2)>Oc(M%NYYmImi!*5z3 z7&uJz%P$8I>f=Cc{h@Y1hGw6|fJ&ytsEB*TyK`kPVsS~Prj}i|WIu<8@2{4-Ty%Y4 z)b77xZ(opDD{+MNrFZe;a3QTsB#YC*JJs%_3ImtNn-lMsm(9$xFXH7eGPFn>La&`Y zUGzH3ifxD(76*`Ck_KBFm9GrjV)AoRzZgQ|>GX*C{!(SsSUCcJcXb@^WG`r~4}sJ~ zRh5eegEdAvidP@Z!1l~yGNzYA_4UcqN}2ViNYqpuN7yt_KTYesdbk6vVUKGeO%$c5 z=32tD*vCJH;EUYmHv^dJdLbsNZ*>qkTq(m(MsgtRoh*7=>`vgKt#Mb6acd;IFJ`5% z{1DG}v7@3!w{p{JZLEBp>6qVO21{LCok9r1Uk+v?A!gXJg8#DkyU?AHt0@YLQ_CZB zZ+3~8wNDOK{J?^!2@STb?ly-mIrUx_JlgLc2beA2q>lj^ZCJz^b&D*N`DEA0m^MB^ zpEX=Lnj0)`2V2QCCBir@npx}9uc`_-IG}OK<Yk=- zp~>;o71O`S)Ru;aPt!=NJ+RDxC&S+-%azmE|GpZd2*%B$V{KdsNc7pe;@i>ba{l#ii1fyCMefx zGo+^{&q2LFHmz5$PNpd2{U?PKi}4D=oo!BVi>rzw2z>f#rL_^V?33Zl#tYh9G&DI) z9DUpnL_yAel6M<~lN zjU3ln5L+s4v5C`eY#Pf7@bB2lqACt{%@lSYG6Qj%?CN`FoQ<-r>f@WIU28AyKy6F zq{3~lKGvi+efwbLGKJ7?h9-yEkn769_PbICB1X-*rD@PsO*R9hkp*Uagf1MkqE<9J z%TecX1a1?jbGgW?K|b#LAC;7+(S)?Qv)}NB3$6+lDO>UEH!}mkqpc@x>aHare*_J8 zbymgcZ&qd|Nuj`U7a4hYINMBF_f9cIAu<1x0v!$x4kIJOJKW36S|xc-OB^fl@!D?! zhQD{%fzGB%!qVU=6x6`lP|^H({kc{PiQtOw#U&SoUMI#$->!TK^mQFmf(+WClA;Wa zlA56*HLMMtVGcHQTWQD(Xtb-VE4gCV!L<50tE#mBROvP;0)M5{w!0^|@p(2%h%HPD z+sSDk!0fzSj$pc*BsVWnC^+pOaCVi72CNmDjXF$xnwyN}F5Hxg{nncu8^CGaRb+IX zk}^T0qN4Q9ow@+B1mvBdMl*A>n~pA)YN(w+%f2o-*F^4Q@{3pIApyI&Wh77a__uU2 z?&l44QjwfUZBrAI#o-QG$48h>ZRvrX;|ucg-SM@K8MraY*ClQ+Y8AxG@7@MCr8t_# z5XDp9+MD=o$XP2hg0M_icwshsazxS*C4s9%++{_#Y_IfP8z7mNxR{IOf zJZE%txDC2ChQ|;BGhKGPqTFStqh@9beofpJ{k5a^b0Q!I6%jkz!R>N5>;93gwx(*;&P``?(oLjcw=7Oi&-` zUtE9Q(!vNeshBiesV1$hQ8CbE&=WWVelpbrjZ{S&w%nB}viU@bgj0GK%gS7Xbs9NO zW@l%YFdTy5pqGgC;1Vq}85y~hZn#RBO z2*>yE8F?Ce&Cr5QQtBPON?3L#`0$Y+R+$CF(Avt-+PDiJO(0n26tld&3SL&4F4vB; z%r4K==)j-6kghd%W#TMI-^^Y{s; zA7D?CM&E*utR$T}UuJ)YiKb-UOrD(CyoUCdtam;>pI_wDK}(ZmufktBF%t4%XqW2d zwwJc<*{>e$&!#D97d!X1_UbP;1o|Dh=KEg4!4Wvv+O$Epdsz<7095@38@@XBWI}M* z-U5|R?JSii+Hkz1Oπ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 RUoropbz4^*qx$HNe*#b=eM0~M From 987e25db86e59551025d6e66385cfe1ac9c0f8de Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 26 Oct 2026 12:12:17 +0000 Subject: [PATCH 39/48] * refresh the application screenshot --- screenshots/main-window.png | Bin 65657 -> 66555 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/screenshots/main-window.png b/screenshots/main-window.png index e3795c0d04a8041389e0aaa3edc8cc5c89e36820..fc928f6d0dc4e508e434ff9b001a8a9263cd1570 100644 GIT binary patch literal 66555 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

J-t(C?D*vNbSd$Mpldw%6G^3`$t6)P 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 O*JNyHeySLKDeAvN*8HCU From dd7c3323197df1555f41f14ca8134c4ce6a2f7e8 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 26 Oct 2026 12:12:27 +0000 Subject: [PATCH 40/48] * refresh the application screenshot --- screenshots/main-window.png | Bin 65657 -> 66629 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/screenshots/main-window.png b/screenshots/main-window.png index e3795c0d04a8041389e0aaa3edc8cc5c89e36820..dede4a714b9747df8a778790bb863513ad08c9bd 100644 GIT binary patch literal 66629 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

lQy6-O`i$-wKimDLWMTk%zk*l-AbP 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 literal 65657 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

J-t(C?D*vNbSd$Mpldw%6G^3`$t6)P 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 O*JNyHeySLKDeAvN*8HCU From a5b5eeabc3bc01b076e1245c4cf5fc848dd3c527 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 26 Oct 2026 12:13:08 +0000 Subject: [PATCH 41/48] * refresh the archive browser screenshot --- docs/screenshots/archive-browser.png | Bin 66518 -> 65657 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/screenshots/archive-browser.png b/docs/screenshots/archive-browser.png index de88d7dd43f38a733fe5557dd0e66b254aa140ee..e3795c0d04a8041389e0aaa3edc8cc5c89e36820 100644 GIT binary patch literal 65657 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

J-t(C?D*vNbSd$Mpldw%6G^3`$t6)P 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 O*JNyHeySLKDeAvN*8HCU literal 66518 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 Kj%4xcAO8X%gq{lk From 7e5d2d4ae83f2c11a2e30fa5c90c9e6d11c49fbf Mon Sep 17 00:00:00 2001 From: Hawkynt Date: Mon, 26 Oct 2026 13:14:19 +0100 Subject: [PATCH 42/48] * regenerate references --- Hawkynt.FileFormats.FileSystems/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Hawkynt.FileFormats.FileSystems/README.md b/Hawkynt.FileFormats.FileSystems/README.md index b6d9a3728..8e8b6e34e 100644 --- a/Hawkynt.FileFormats.FileSystems/README.md +++ b/Hawkynt.FileFormats.FileSystems/README.md @@ -282,7 +282,7 @@ ops.Remove(image, ["var/log/old.log"]); -Every public and protected member of all 873 types, generated from the built assembly and its XML documentation, is in [REFERENCE.md](https://github.com/Hawkynt/CompressionWorkbench/blob/main/Hawkynt.FileFormats.FileSystems/REFERENCE.md). +Every public and protected member of all 875 types, generated from the built assembly and its XML documentation, is in [REFERENCE.md](https://github.com/Hawkynt/CompressionWorkbench/blob/main/Hawkynt.FileFormats.FileSystems/REFERENCE.md). From c869b83c4fb5b1e2eeb06941ce26c98a8694a6b8 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 26 Oct 2026 12:14:44 +0000 Subject: [PATCH 43/48] * refresh the archive browser screenshot --- docs/screenshots/archive-browser.png | Bin 66518 -> 66571 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/screenshots/archive-browser.png b/docs/screenshots/archive-browser.png index de88d7dd43f38a733fe5557dd0e66b254aa140ee..14b1777df2273d16b31dd428d9c327415ae493af 100644 GIT binary patch delta 28431 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≪@hK4HV8@D$$Caa;9q}M(T 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 E16A#Tj{pDw delta 28315 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 From d91ec8d6c1ca9227d6f085fdda498279f3aadb2c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 26 Oct 2026 12:16:26 +0000 Subject: [PATCH 44/48] * refresh the application screenshot --- screenshots/main-window.png | Bin 65657 -> 66755 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/screenshots/main-window.png b/screenshots/main-window.png index e3795c0d04a8041389e0aaa3edc8cc5c89e36820..f22734b0fc513b7706244cbef6d8c6597ea7d042 100644 GIT binary patch literal 66755 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 literal 65657 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

J-t(C?D*vNbSd$Mpldw%6G^3`$t6)P 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 O*JNyHeySLKDeAvN*8HCU From 74cb88313b444978d070569e2965906ca99922ac Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 26 Oct 2026 12:18:07 +0000 Subject: [PATCH 45/48] * refresh the archive browser screenshot --- docs/screenshots/archive-browser.png | Bin 66518 -> 66470 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/screenshots/archive-browser.png b/docs/screenshots/archive-browser.png index de88d7dd43f38a733fe5557dd0e66b254aa140ee..35fd079c865915e9fb8eeb52fb462b2cc866d33e 100644 GIT binary patch delta 28259 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 ^77&2+m)YYJ45 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 CFMHkq delta 28306 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 Date: Mon, 26 Oct 2026 15:06:38 +0000 Subject: [PATCH 46/48] * refresh the application screenshot --- screenshots/main-window.png | Bin 66510 -> 66698 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/screenshots/main-window.png b/screenshots/main-window.png index a8d91cb6875fd05a6e6bed08a6f241f4bb446625..59392e2fdbde2efec0535da613ddd06d1c25c7fc 100644 GIT binary patch delta 28545 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 From 1fdfcbbe12a19e0623b487a50e135f8bdd539fd1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 26 Oct 2026 15:09:21 +0000 Subject: [PATCH 47/48] * refresh the archive browser screenshot --- docs/screenshots/archive-browser.png | Bin 66486 -> 66581 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/screenshots/archive-browser.png b/docs/screenshots/archive-browser.png index c2a1fd7d3c9a2db69811b4c8a8008c04cac2a895..43beaf8c4081221ded644461b8cbaa6c7b16ce4b 100644 GIT binary patch delta 28237 zcmce;1z1(-8aC{VqY?@zA|fCIsECw;w19$yq|%MFtw0O>1U?;Co%o`XxT zCis-A!sGeXIIORVTKg(m7@|8P*OqIqIbw(;vTA%h0`I%u3cU06e$Y+a+B@&R{QO?% zM*oGN-Ktr&25D8?2NtL4#}7A~IrUqcBh;KCX8ST@91fPOmlQIN4SREw$hmWwzOsfk zH#R0ampU9DZYNF6%9|}f-7g4>trt>#hL5J?eanu$yuD+kBHMN243U>E>@4);Y#w5Q zOZK^LoL5KZ=5AdO3yR>iWD`zGU0LLE(D`_v@=~>=KI5D0gS;f^IBmC`XylQf>;vTC zj;m;#a=t~+iNMu?fq@g}GJhH;O{Jm@x_;86q$J#6Mo(T+e}Dfj=&Mqf`&4c6Y4bv7 z^yH%H7)k!lkacaXkcQ;mSMyk*#Y*a0FJw9LP#%+K*N8y8Di5kDvYB#qj700{>2aAZ zhi|fQ*j7}M7u%%Z&$zH8M5Dztbov8crWTr(R4>-_^myPekNQQ6juYAOK)gK1KjJ`9 z%5*He^i#fhVZKLDFMH@ZH<1CcptCydHj8mv6kD3|ZJe=E?albq)Mj%+nxv_*)S-uo z&?yBqo^zhz%zi(vB{8GcoxoT3gk1G%g@{_j@A7YOP|L(L)28d3@|H5yL~vSfxvi?9 z#iO{6eN_r_Zy4}~Rg1?-uZ%!njOHYZt9EY;3^LL9xTPyXdb+xtW^0$~q$1ks)8ul5 z`lEO*)M=)Lv3eNCtckwM)>^G}vBliQ^p`BuVeosBL=#z*3PdJPFw6pkq_;x42D{qo&~@k!z`Ti@(nMJy`kPl zQf^8NiF+N(XGudOvy7Igsl?Lf4i)HxXse^{q(ylPy8Uo|GEQu9Jme}Rh81B7{^=VH zrHRd@C}bo}X{4zS)EC4gB^hiR_MmN7t~pLnQ73t2C%!h+)il-BRPPvm{vc3CPd8X~ zw7x#kw(U0m$8c!a!EmZvNLV3NQL}T;-1hTloO_>cUA%aa5mUnQV0zPse6UR|Q)E-i z>us$!M8WH1HM2YBLJ%6NA~M zccs6`+%u?3$OrAX8%3biU;k>T%4P*`Y-wVu*sx{rz4v8O&c>>`0%w78n@F@%sc9*M z_N(OkAjo!jE6|KX-K_sf*Stefk7r5>5i$Q0nc#B)4JfnYc#IWOYICD>{mccv0pHao zLMn_P(hf8IbDGp*5q4X*zuLq^74PvD7@)@))+v;f)LmU&dCoq&6i>QKlyWMG+9G|e z)8st;WaX!4lCF!!_0lj&^%Y;r$;p9iR|gsVL>5bycDgIU#K2qb>-*)GFH&u{i+5M) zVszZ{O=MQb`i=(tMdL<_Z3c=QeF-MpcgGxiGZ6aPhvMNyuUk`XM-1CS4rby)SX9_j z3-a^BxGig!?Qu_zmM|Z#jtL(hH60D)e3MR+f8=^eJr1lSACK1SrUR}Qsg^-TQg+7< z+ueQB#KcUqq>;A!1#}AO>f5Orrz=CG_!K;%MNoNbF($c5Hf2#uN9Vfjrk(-D+sTjV z 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 From 67c60ff225f5aed5a07414ee0d318d803a6c9716 Mon Sep 17 00:00:00 2001 From: Hawkynt Date: Wed, 28 Oct 2026 06:49:48 +0100 Subject: [PATCH 48/48] # reject ambiguous firmware payloads before writing an image Adding a second named payload to Intel HEX could silently discard a file because the shared image builder kept only the first payload in filesystem enumeration order. Reject multiple non-metadata payloads, including an empty first payload, before any output is written. Tests verify creation refusal and byte-preserving add refusal. Verified all three regressions fail before the fix and pass after it, 93 focused tests, 34280 required tests with 1582 skips and no failures, and three package documentation checks. --- .../FirmwareHex/FirmwareHexPayloadTests.cs | 37 +++++++++++++++++++ .../FirmwareHexWriter.cs | 5 ++- 2 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 Compression.Tests/FirmwareHex/FirmwareHexPayloadTests.cs diff --git a/Compression.Tests/FirmwareHex/FirmwareHexPayloadTests.cs b/Compression.Tests/FirmwareHex/FirmwareHexPayloadTests.cs new file mode 100644 index 000000000..bbbc898af --- /dev/null +++ b/Compression.Tests/FirmwareHex/FirmwareHexPayloadTests.cs @@ -0,0 +1,37 @@ +using Compression.Registry; +using FileFormat.FirmwareHex; + +namespace Compression.Tests.FirmwareHex; + +[TestFixture] +public sealed class FirmwareHexPayloadTests { + [TestCase(false)] + [TestCase(true)] + public void Create_RejectsMultiplePayloadsWithoutWritingOutput(bool emptyFirst) { + var descriptor = new IntelHexFormatDescriptor(); + using var output = new MemoryStream(); + var inputs = new[] { + ArchiveInputInfo.InMemory("first.bin", emptyFirst ? [] : [1, 2, 3]), + ArchiveInputInfo.InMemory("second.bin", [9, 8, 7]), + }; + + Assert.Throws(() => + ((IArchiveCreatable)descriptor).Create(output, inputs, new FormatCreateOptions())); + Assert.That(output.Length, Is.Zero); + } + + [Test] + public void Add_RejectsAnotherPayloadWithoutChangingTheArchive() { + var descriptor = new IntelHexFormatDescriptor(); + using var archive = new MemoryStream(); + ((IArchiveCreatable)descriptor).Create(archive, + [ArchiveInputInfo.InMemory("firmware.bin", [1, 2, 3])], new FormatCreateOptions()); + var original = archive.ToArray(); + archive.Position = 0; + + Assert.Throws(() => ((IArchiveModifiable)descriptor).Add(archive, + [ArchiveInputInfo.InMemory("ADD.BIN", [9, 8, 7])])); + Assert.That(archive.ToArray(), Is.EqualTo(original)); + } + +} diff --git a/Hawkynt.FileFormats.FileSystems/FileFormats/FileFormat.FirmwareHex/FirmwareHexWriter.cs b/Hawkynt.FileFormats.FileSystems/FileFormats/FileFormat.FirmwareHex/FirmwareHexWriter.cs index 6c7d4b452..1c9e17266 100644 --- a/Hawkynt.FileFormats.FileSystems/FileFormats/FileFormat.FirmwareHex/FirmwareHexWriter.cs +++ b/Hawkynt.FileFormats.FileSystems/FileFormats/FileFormat.FirmwareHex/FirmwareHexWriter.cs @@ -33,6 +33,7 @@ public static class FirmwareHexWriter { /// one the reader rendered. An input list with no payload describes an image /// with no data, which both formats can write. /// + /// More than one non-metadata payload is supplied. public static FirmwareImage ImageFrom(IReadOnlyList inputs, string sourceFormat) { ArgumentNullException.ThrowIfNull(inputs); @@ -53,7 +54,9 @@ public static FirmwareImage ImageFrom(IReadOnlyList inputs, st } // Any other single input is the payload, whatever it is called: a caller // converting a .bin into a .hex should not have to rename it first. - payload ??= input.ReadContent(); + if (payload is not null) + throw new InvalidDataException($"{sourceFormat} represents one logical firmware payload; multiple payload inputs are ambiguous."); + payload = input.ReadContent(); } List<(uint Address, byte[] Data)> segments;

@@ -103,6 +109,8 @@ public void Remove(Stream archive, string[] entryNames) { public IReadOnlyList MagicSignatures => [ new([(byte)'P', (byte)'M', (byte)'a', (byte)'g'], Confidence: 0.85), new([(byte)'P', (byte)'M', (byte)'a', (byte)'4'], Confidence: 0.85), + new([(byte)'P', (byte)'M', (byte)'a', (byte)'5'], Confidence: 0.85), + new([(byte)'P', (byte)'M', (byte)'a', (byte)'6'], Confidence: 0.85), ]; /// /// Gets the methods. @@ -131,11 +139,11 @@ public List List(Stream stream, string? password) { i, e.Name, e.DataForkSize, - e.DataForkSize, - e.IsCompressed ? "Huffman" : "Stored", - false, + e.EntryLength, + e.IsEncrypted ? "Huffman+Encrypted" : e.IsCompressed ? "Huffman" : "Stored", false, - DateTime.MinValue)) + e.IsEncrypted, + e.Modified ?? DateTime.MinValue)) .ToList(); } diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.PackIt/PackItHuffmanDecoder.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.PackIt/PackItHuffmanDecoder.cs new file mode 100644 index 000000000..c1983cf95 --- /dev/null +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.PackIt/PackItHuffmanDecoder.cs @@ -0,0 +1,85 @@ +namespace FileFormat.PackIt; + +/// +/// Decodes the Huffman stream of a "PMa4" PackIt entry. +/// +/// +/// The stream is MSB-first. It opens with the code tree in pre-order: a 1 bit is a leaf followed +/// by its 8-bit byte value; a 0 bit is a branch, followed by its 0-subtree and then its 1-subtree. +/// Every byte after that is one code walked from the root (0 = first subtree). The tree is sent once per +/// entry and the entry ends on a byte boundary. +/// Sourcing: the scheme is StuffIt's method 3, which PackIt II introduced; behaviour taken from +/// The Unarchiver's XADMaster (XADStuffItHuffmanHandle.m, XADPackItParser.m, +/// LGPL-2.1-or-later) and checked against real PackIt II archives, whose header and fork CRC-16s +/// the decoded bytes must match. +/// +internal sealed class PackItHuffmanDecoder { + // Node i: Left/Right children; a negative child is ~byteValue (a leaf). + private readonly List<(int Zero, int One)> _nodes = []; + private readonly int _rootLeaf = int.MinValue; + private readonly Stream _stream; + private int _current; + private int _bitsLeft; + + /// Gets the number of bytes consumed from the stream so far. + public long BytesConsumed { get; private set; } + + /// Reads the code tree from , positioned just after the entry magic. + /// The tree is deeper than 256 levels or the stream ends inside it. + public PackItHuffmanDecoder(Stream stream) { + this._stream = stream; + var root = this.ParseTree(0); + if (root < 0) + this._rootLeaf = ~root; // degenerate one-symbol tree: every code is empty + } + + /// Decodes .Length bytes. + public void Decode(Span output) { + if (this._rootLeaf != int.MinValue) { + output.Fill((byte)this._rootLeaf); + return; + } + for (var i = 0; i < output.Length; ++i) { + var node = 0; + while (true) { + var (zero, one) = this._nodes[node]; + var next = this.ReadBit() == 0 ? zero : one; + if (next < 0) { + output[i] = (byte)~next; + break; + } + node = next; + } + } + } + + private int ParseTree(int depth) { + if (depth > 256) + throw new InvalidDataException("PackIt Huffman tree is deeper than any 256-symbol code."); + if (this.ReadBit() == 1) { + var value = 0; + for (var i = 0; i < 8; ++i) + value = (value << 1) | this.ReadBit(); + return ~value; + } + var index = this._nodes.Count; + this._nodes.Add((0, 0)); + var zero = this.ParseTree(depth + 1); + var one = this.ParseTree(depth + 1); + this._nodes[index] = (zero, one); + return index; + } + + private int ReadBit() { + if (this._bitsLeft == 0) { + var b = this._stream.ReadByte(); + if (b < 0) + throw new InvalidDataException("PackIt Huffman stream ends before the entry is complete."); + ++this.BytesConsumed; + this._current = b; + this._bitsLeft = 8; + } + --this._bitsLeft; + return (this._current >> this._bitsLeft) & 1; + } +} diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.PackIt/PackItModifier.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.PackIt/PackItModifier.cs index 41a2db9a1..3febc62ec 100644 --- a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.PackIt/PackItModifier.cs +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.PackIt/PackItModifier.cs @@ -1,193 +1,78 @@ #pragma warning disable CS1591 -using System.Buffers.Binary; -using System.Text; namespace FileFormat.PackIt; /// -/// Random-access in-place modifier for PackIt (.pit) classic Macintosh -/// archives. PackIt has no explicit end-of-archive marker — readers stop -/// when the next 4 bytes are not "PMag" or "PMa4". Add appends a new -/// stored entry at EOF; Remove walks the entry chain, locates the target, -/// and shifts trailing bytes forward to compact (no central directory). +/// In-place edits of a PackIt archive. PackIt has no directory: entries are a chain ended by +/// "PEnd", so an add rewrites the marker after the new entry and a remove shifts the tail. /// public static class PackItModifier { /// - /// Appends a stored ("PMag") entry at the end of the archive. Walks the - /// existing entry chain to find the EOF (first non-magic 4 bytes), then - /// writes the new entry there and truncates. I/O cost is one full - /// sequential entry walk plus the new entry's bytes. + /// Appends a stored ("PMag") entry after the last entry and rewrites the "PEnd" marker behind it. /// + /// The archive cannot be walked to its end (truncated or encrypted entry). public static void AddFile(Stream pit, string name, byte[] data, string fileType = "TEXT", string creator = "CWIE") { ArgumentNullException.ThrowIfNull(pit); ArgumentNullException.ThrowIfNull(name); ArgumentNullException.ThrowIfNull(data); - var eofOffset = FindEofOffset(pit); - pit.Position = eofOffset; - WriteStoredEntry(pit, name, data, fileType, creator); + var end = FindEntriesEnd(pit); + pit.Position = end; + PackItWriter.WriteStoredEntry(pit, name, data, [], fileType, creator, modified: null); + pit.Write(PackItConstants.MagicEnd); pit.SetLength(pit.Position); } /// - /// Removes the named entry. Returns true if found. Walks the chain to - /// locate the entry, then shifts trailing bytes forward to compact. + /// Removes the named entry. Returns true if found. Locates the entry by walking the chain, then shifts + /// the trailing bytes forward over it. /// public static bool RemoveFile(Stream pit, string name, bool wipeData = true) { ArgumentNullException.ThrowIfNull(pit); ArgumentNullException.ThrowIfNull(name); - var locator = LocateEntry(pit, name); - if (!locator.Found) return false; + if (pit.Length == 0) + return false; + pit.Position = 0; + PackItEntry? target; + using (var reader = new PackItReader(pit, leaveOpen: true)) + target = reader.Entries.FirstOrDefault(e => !e.IsEncrypted && string.Equals(e.Name, name, StringComparison.OrdinalIgnoreCase)); + if (target is null) + return false; if (wipeData) - ZeroRange(pit, locator.EntryOffset, locator.EntrySize); + ZeroRange(pit, target.EntryOffset, target.EntryLength); - var afterEntry = locator.EntryOffset + locator.EntrySize; + var afterEntry = target.EntryOffset + target.EntryLength; var bytesToShift = pit.Length - afterEntry; - if (bytesToShift > 0) { - var buf = new byte[64 * 1024]; - var src = afterEntry; - var dst = locator.EntryOffset; - while (bytesToShift > 0) { - var chunk = (int)Math.Min(buf.Length, bytesToShift); - pit.Position = src; - var read = 0; - while (read < chunk) { - var n = pit.Read(buf, read, chunk - read); - if (n <= 0) break; - read += n; - } - pit.Position = dst; - pit.Write(buf, 0, read); - src += read; - dst += read; - bytesToShift -= read; - } + var buf = new byte[64 * 1024]; + var src = afterEntry; + var dst = target.EntryOffset; + while (bytesToShift > 0) { + var chunk = (int)Math.Min(buf.Length, bytesToShift); + pit.Position = src; + pit.ReadExactly(buf, 0, chunk); + pit.Position = dst; + pit.Write(buf, 0, chunk); + src += chunk; + dst += chunk; + bytesToShift -= chunk; } - pit.SetLength(pit.Length - locator.EntrySize); + pit.SetLength(pit.Length - target.EntryLength); return true; } - // ── Entry walking ───────────────────────────────────────────────────── - // PackIt entry layout (87-byte fixed header + variable forks): - // bytes 0..3: magic ("PMag" or "PMa4") - // bytes 4..66: filename Pascal string (1 length byte + 62 name bytes) - // bytes 67..70: Mac file type (4 ASCII) - // bytes 71..74: Mac creator code (4 ASCII) - // bytes 75..76: Finder flags (uint16 BE) - // byte 77: locked flag - // byte 78: zero padding - // bytes 79..82: data fork size (uint32 BE) - // bytes 83..86: resource fork size (uint32 BE) - // bytes 87..: data fork bytes, then resource fork bytes - // Total entry = 87 + dataForkSize + resourceForkSize. - - private const int EntryHeaderSize = PackItReader.EntryHeaderSize; // 87 - private const int DataForkSizeOffset = 79; - private const int ResourceForkSizeOffset = 83; - - private static long FindEofOffset(Stream pit) { + /// Returns the offset just past the last entry, which is where "PEnd" sits (or belongs). + private static long FindEntriesEnd(Stream pit) { + if (pit.Length == 0) + return 0; pit.Position = 0; - Span hdr = stackalloc byte[EntryHeaderSize]; - while (pit.Position + EntryHeaderSize <= pit.Length) { - var entryStart = pit.Position; - var read = ReadFully(pit, hdr); - if (read < EntryHeaderSize) return entryStart; - - if (!IsKnownMagic(hdr)) return entryStart; - - var dataForkSize = BinaryPrimitives.ReadUInt32BigEndian(hdr.Slice(DataForkSizeOffset, 4)); - var rsrcForkSize = BinaryPrimitives.ReadUInt32BigEndian(hdr.Slice(ResourceForkSizeOffset, 4)); - pit.Position = entryStart + EntryHeaderSize + dataForkSize + rsrcForkSize; - } - return pit.Length; - } - - private readonly record struct EntryLocator(bool Found, long EntryOffset, long EntrySize); - - private static EntryLocator LocateEntry(Stream pit, string targetName) { - pit.Position = 0; - Span hdr = stackalloc byte[EntryHeaderSize]; - while (pit.Position + EntryHeaderSize <= pit.Length) { - var entryStart = pit.Position; - var read = ReadFully(pit, hdr); - if (read < EntryHeaderSize) break; - if (!IsKnownMagic(hdr)) break; - - var nameLength = hdr[4]; - if (nameLength > 62) nameLength = 62; - var name = nameLength > 0 - ? Encoding.Latin1.GetString(hdr.Slice(5, nameLength)) - : string.Empty; - - var dataForkSize = BinaryPrimitives.ReadUInt32BigEndian(hdr.Slice(DataForkSizeOffset, 4)); - var rsrcForkSize = BinaryPrimitives.ReadUInt32BigEndian(hdr.Slice(ResourceForkSizeOffset, 4)); - var entrySize = (long)EntryHeaderSize + dataForkSize + rsrcForkSize; - - if (string.Equals(name, targetName, StringComparison.OrdinalIgnoreCase)) - return new EntryLocator(true, entryStart, entrySize); - - pit.Position = entryStart + entrySize; - } - return new EntryLocator(false, 0, 0); - } - - private static bool IsKnownMagic(ReadOnlySpan hdr) => - hdr[..4].SequenceEqual(PackItConstants.MagicStored) || - hdr[..4].SequenceEqual(PackItConstants.MagicCompressed); - - // ── Entry writing ───────────────────────────────────────────────────── - - private static void WriteStoredEntry(Stream pit, string name, byte[] data, string fileType, string creator) { - Span header = stackalloc byte[EntryHeaderSize]; - header.Clear(); - - // Magic "PMag" (stored). - PackItConstants.MagicStored.CopyTo(header); - - // Pascal filename: 1 length byte + up to 62 name bytes at offsets 4..66. - var nameBytes = Encoding.Latin1.GetBytes(name); - var nameLen = Math.Min(nameBytes.Length, PackItConstants.FileNameMaxLength); // 62 - header[4] = (byte)nameLen; - nameBytes.AsSpan(0, nameLen).CopyTo(header[5..]); - - // File type at 67..70. - WriteAscii4(header.Slice(67, 4), fileType); - // Creator at 71..74. - WriteAscii4(header.Slice(71, 4), creator); - // Finder flags (75..76), locked (77), padding (78) — already zeroed. - - // Data fork size (BE) at 79..82, resource fork size (BE) at 83..86. - BinaryPrimitives.WriteUInt32BigEndian(header.Slice(DataForkSizeOffset, 4), (uint)data.Length); - BinaryPrimitives.WriteUInt32BigEndian(header.Slice(ResourceForkSizeOffset, 4), 0u); - - pit.Write(header); - if (data.Length > 0) - pit.Write(data); - // Resource fork: zero-length, nothing to write. - } - - private static void WriteAscii4(Span dest, string value) { - var bytes = Encoding.ASCII.GetBytes(value); - var len = Math.Min(bytes.Length, 4); - bytes.AsSpan(0, len).CopyTo(dest); - for (var i = len; i < 4; ++i) - dest[i] = (byte)' '; - } - - // ── Helpers ─────────────────────────────────────────────────────────── - - private static int ReadFully(Stream s, Span buf) { - var read = 0; - while (read < buf.Length) { - var n = s.Read(buf[read..]); - if (n <= 0) break; - read += n; - } - return read; + using var reader = new PackItReader(pit, leaveOpen: true); + if (reader.IsIncomplete) + throw new InvalidDataException("PackIt archive cannot be walked to its end; refusing to append after an unknown tail."); + return reader.Entries.Count == 0 ? 0 : reader.Entries[^1].EntryOffset + reader.Entries[^1].EntryLength; } private static void ZeroRange(Stream s, long offset, long length) { diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.PackIt/PackItReader.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.PackIt/PackItReader.cs index 9d38d182e..989b28fc7 100644 --- a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.PackIt/PackItReader.cs +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.PackIt/PackItReader.cs @@ -1,5 +1,6 @@ using System.Buffers.Binary; using System.Text; +using Compression.Core.Checksums; namespace FileFormat.PackIt; @@ -7,49 +8,27 @@ namespace FileFormat.PackIt; /// Reads entries from a PackIt (.pit) classic Macintosh archive. /// /// -/// PackIt (Harry Chesley, 1984) was one of the earliest Mac archive formats. -/// Each entry in the archive begins with a 4-byte magic word ("PMag" for stored, -/// "PMa4" for Huffman-compressed), followed by the entry header and inline file data. -/// -/// Per-entry layout: +/// PackIt (Harry Chesley, 1984-86) has no archive header: entries follow one another, each +/// opened by a four-byte magic, and the archive ends with "PEnd". /// -/// [0..4] magic: "PMag" (stored) or "PMa4" (Huffman compressed) -/// [4..67] filename field: 63 bytes, Pascal string (byte 4 = length, bytes 5..67 = name) -/// [67..71] Mac file type (4 ASCII bytes) -/// [71..75] Mac creator code (4 ASCII bytes) -/// [75..77] Finder flags (uint16 BE) -/// [77] locked flag (1 byte) -/// [78] zero padding (1 byte) -/// [79..83] data fork size (uint32 BE) -/// [83..87] resource fork size (uint32 BE) -/// [87..] data fork bytes (data fork size bytes) -/// resource fork bytes (resource fork size bytes) +/// magic "PMag" stored · "PMa4" Huffman · "PMa5" Huffman + XOR · "PMa6" Huffman + DES +/// [0] filename length +/// [1..64] filename (63 bytes) +/// [64..68] file type [68..72] creator [72..74] Finder flags [74..76] unused +/// [76..80] data fork size [80..84] resource fork size +/// [84..88] modified [88..92] created (seconds since 1904, big-endian) +/// [92..94] CRC-16/XMODEM of bytes 0..92 +/// data fork, resource fork, CRC-16/XMODEM of both forks /// -/// This reader supports stored ("PMag") entries with full extraction and lists -/// Huffman-compressed ("PMa4") entries for informational purposes only. +/// In a compressed entry everything after the magic — the 94-byte header, both forks and the fork +/// CRC — is one Huffman stream (see ), padded to a byte boundary. +/// Nothing records its compressed length, so listing decodes each compressed entry to find the next. +/// Encrypted entries cannot be walked without the password; listing stops at the first one. +/// Sourcing: layout from The Unarchiver's XADMaster (XADPackItParser.m, +/// LGPL-2.1-or-later); the header CRC (not checked by XADMaster) was identified by measurement on +/// real PackIt II archives, every header of which it matches. /// public sealed class PackItReader : IDisposable { - /// Size of the fixed per-entry header in bytes (magic + filename field + metadata). - public const int EntryHeaderSize = 87; - - /// Offset of the Pascal filename field within the entry header. - private const int FileNameOffset = 4; - - /// Maximum length of the filename field in bytes (63 bytes: 1 length + 62 name). - private const int FileNameFieldSize = 63; - - /// Offset of the Mac file type within the entry header. - private const int FileTypeOffset = 67; - - /// Offset of the Mac creator code within the entry header. - private const int CreatorOffset = 71; - - /// Offset of the data fork size within the entry header. - private const int DataForkSizeOffset = 79; - - /// Offset of the resource fork size within the entry header. - private const int ResourceForkSizeOffset = 83; - private readonly Stream _stream; private readonly bool _leaveOpen; private readonly List _entries = []; @@ -63,6 +42,7 @@ public sealed class PackItReader : IDisposable { /// to leave open after this reader is disposed. /// /// Thrown when is null. + /// The stream does not start with a PackIt entry or end marker. public PackItReader(Stream stream, bool leaveOpen = false) { this._stream = stream ?? throw new ArgumentNullException(nameof(stream)); this._leaveOpen = leaveOpen; @@ -72,25 +52,50 @@ public PackItReader(Stream stream, bool leaveOpen = false) { /// Gets the list of entries found in the archive. public IReadOnlyList Entries => this._entries; - /// - /// Extracts the data fork of the specified entry. - /// - /// An entry obtained from . - /// - /// The raw data fork bytes. For stored entries the bytes are the original file data. - /// For Huffman-compressed entries the raw compressed bytes are returned. - /// - /// Thrown when is null. - /// Thrown when this reader has been disposed. - public byte[] Extract(PackItEntry entry) { + /// Gets whether listing stopped early (truncated archive or an entry it cannot walk past). + public bool IsIncomplete { get; private set; } + + /// Extracts the data fork of the specified entry. + /// The entry is encrypted. + /// The header or fork CRC-16 does not match. + public byte[] Extract(PackItEntry entry) => this.ExtractForks(entry).Data; + + /// Extracts the resource fork of the specified entry. + /// The entry is encrypted. + /// The header or fork CRC-16 does not match. + public byte[] ExtractResourceFork(PackItEntry entry) => this.ExtractForks(entry).Resource; + + /// Decodes both forks of and checks every CRC. + public (byte[] Data, byte[] Resource) ExtractForks(PackItEntry entry) { ArgumentNullException.ThrowIfNull(entry); ObjectDisposedException.ThrowIf(this._disposed, this); - if (entry.DataForkSize == 0) - return []; + if (entry.IsEncrypted) + throw new NotSupportedException($"PackIt entry '{entry.Name}' is password-encrypted; decryption is not supported."); + if (!entry.HeaderCrcValid) + throw new InvalidDataException($"PackIt entry '{entry.Name}' has a header that fails its CRC-16."); + + var forkBytes = checked((int)(entry.DataForkSize + entry.ResourceForkSize)); + var body = new byte[forkBytes + 2]; + if (entry.IsCompressed) { + this._stream.Position = entry.DataOffset; + var decoder = new PackItHuffmanDecoder(this._stream); + Span header = stackalloc byte[PackItConstants.HeaderSize]; + decoder.Decode(header); + decoder.Decode(body); + } else { + this._stream.Position = entry.DataOffset; + this._stream.ReadExactly(body); + } + + var stored = BinaryPrimitives.ReadUInt16BigEndian(body.AsSpan(forkBytes)); + var actual = Crc16Ccitt.Compute(body.AsSpan(0, forkBytes)); + if (stored != actual) + throw new InvalidDataException( + $"PackIt entry '{entry.Name}' fails its fork CRC-16: stored 0x{stored:X4}, computed 0x{actual:X4}."); - this._stream.Position = entry.DataOffset; - return this.ReadExact((int)entry.DataForkSize); + var dataLength = (int)entry.DataForkSize; + return (body.AsSpan(0, dataLength).ToArray(), body.AsSpan(dataLength, forkBytes - dataLength).ToArray()); } /// @@ -105,80 +110,114 @@ public void Dispose() { // ── Parsing ─────────────────────────────────────────────────────────────────── private void ParseArchive() { - Span magicBuf = stackalloc byte[4]; - - while (this._stream.Position < this._stream.Length) { - // Try to read 4-byte magic. If fewer than 4 bytes remain, stop. - var remaining = (int)(this._stream.Length - this._stream.Position); - if (remaining < EntryHeaderSize) - break; - - this.ReadExact(magicBuf); - - var isStored = magicBuf.SequenceEqual(PackItConstants.MagicStored); - var isCompressed = !isStored && magicBuf.SequenceEqual(PackItConstants.MagicCompressed); - - if (!isStored && !isCompressed) - break; // no more recognized entries - - // Read the rest of the entry header (EntryHeaderSize - 4 bytes already consumed). - var hdrRemainder = this.ReadExact(EntryHeaderSize - 4); - - // Filename: Pascal string at hdrRemainder[0..63] (relative to hdrRemainder). - // hdrRemainder[0] = name length, [1..62] = name bytes - var nameLength = hdrRemainder[0]; - if (nameLength > FileNameFieldSize - 1) - nameLength = (byte)(FileNameFieldSize - 1); - var name = nameLength > 0 - ? Encoding.Latin1.GetString(hdrRemainder, 1, nameLength) - : string.Empty; - - // File type and creator are 4 ASCII bytes each. - // Offsets within hdrRemainder = (absolute offset) - 4 (magic already consumed). - var fileTypeOff = FileTypeOffset - 4; // 63 - var creatorOff = CreatorOffset - 4; // 67 - var dataOff = DataForkSizeOffset - 4; // 75 - var rsrcOff = ResourceForkSizeOffset - 4; // 79 - - var fileType = Encoding.ASCII.GetString(hdrRemainder, fileTypeOff, 4); - var creator = Encoding.ASCII.GetString(hdrRemainder, creatorOff, 4); - - var dataForkSize = BinaryPrimitives.ReadUInt32BigEndian(hdrRemainder.AsSpan(dataOff, 4)); - var rsrcForkSize = BinaryPrimitives.ReadUInt32BigEndian(hdrRemainder.AsSpan(rsrcOff, 4)); - - // Data fork bytes start immediately after the header. - var dataForkStart = this._stream.Position; - - this._entries.Add(new PackItEntry { - Name = name, - FileType = fileType, - Creator = creator, - DataForkSize = dataForkSize, - ResourceForkSize = rsrcForkSize, - IsCompressed = isCompressed, - DataOffset = dataForkStart, - }); - - // Skip past data fork + resource fork to reach the next entry. - this._stream.Position = dataForkStart + dataForkSize + rsrcForkSize; + Span magic = stackalloc byte[4]; + Span header = stackalloc byte[PackItConstants.HeaderSize]; + var first = true; + + while (true) { + var entryOffset = this._stream.Position; + if (this._stream.Length - entryOffset < 4) { + // A missing "PEnd" is tolerated (some transfers drop it); a missing first entry is not a PackIt file. + if (first) + throw new InvalidDataException("Stream is too short to be a PackIt archive."); + this.IsIncomplete = this._stream.Length != entryOffset; + return; + } + this._stream.ReadExactly(magic); + + if (magic.SequenceEqual(PackItConstants.MagicEnd)) + return; + + var stored = magic.SequenceEqual(PackItConstants.MagicStored); + var compressed = magic.SequenceEqual(PackItConstants.MagicCompressed); + var encrypted = magic.SequenceEqual(PackItConstants.MagicXorEncrypted) || magic.SequenceEqual(PackItConstants.MagicDesEncrypted); + if (!stored && !compressed && !encrypted) { + if (first) + throw new InvalidDataException("Stream does not start with a PackIt entry magic."); + this.IsIncomplete = true; + return; + } + first = false; + + if (encrypted) { + // The header itself is encrypted; without the password neither it nor the entry's length is known. + this._entries.Add(new PackItEntry { + Name = "(encrypted)", IsCompressed = true, IsEncrypted = true, + EntryOffset = entryOffset, DataOffset = entryOffset + 4, EntryLength = this._stream.Length - entryOffset, + }); + this.IsIncomplete = true; + return; + } + + var bodyStart = this._stream.Position; + try { + PackItHuffmanDecoder? decoder = null; + if (stored) + this._stream.ReadExactly(header); + else { + decoder = new PackItHuffmanDecoder(this._stream); + decoder.Decode(header); + } + + var dataSize = BinaryPrimitives.ReadUInt32BigEndian(header[76..]); + var rsrcSize = BinaryPrimitives.ReadUInt32BigEndian(header[80..]); + var crcValid = BinaryPrimitives.ReadUInt16BigEndian(header[92..]) + == Crc16Ccitt.Compute(header[..PackItConstants.HeaderCrcSpan]); + var forkBytes = (long)dataSize + rsrcSize; + + long end; + if (stored) { + end = bodyStart + PackItConstants.HeaderSize + forkBytes + 2; + if (end > this._stream.Length) + throw new EndOfStreamException(); + } else { + // Walk the forks and their CRC to find where the next entry starts. + var scratch = new byte[64 * 1024]; + for (var left = forkBytes + 2; left > 0;) { + var chunk = (int)Math.Min(left, scratch.Length); + decoder!.Decode(scratch.AsSpan(0, chunk)); + left -= chunk; + } + end = bodyStart + decoder!.BytesConsumed; + } + + this._entries.Add(new PackItEntry { + Name = ReadName(header), + FileType = Encoding.Latin1.GetString(header[64..68]), + Creator = Encoding.Latin1.GetString(header[68..72]), + FinderFlags = BinaryPrimitives.ReadUInt16BigEndian(header[72..]), + DataForkSize = dataSize, + ResourceForkSize = rsrcSize, + Modified = FromMacTime(BinaryPrimitives.ReadUInt32BigEndian(header[84..])), + Created = FromMacTime(BinaryPrimitives.ReadUInt32BigEndian(header[88..])), + IsCompressed = compressed, + HeaderCrcValid = crcValid, + EntryOffset = entryOffset, + DataOffset = stored ? bodyStart + PackItConstants.HeaderSize : bodyStart, + EntryLength = end - entryOffset, + }); + this._stream.Position = end; + } catch (Exception ex) when (ex is EndOfStreamException or InvalidDataException) { + if (this._entries.Count == 0) + throw new InvalidDataException("PackIt archive is truncated inside its first entry.", ex); + this.IsIncomplete = true; + return; + } } } - // ── Stream helpers ──────────────────────────────────────────────────────────── - - private byte[] ReadExact(int count) { - var buf = new byte[count]; - this.ReadExact(buf.AsSpan()); - return buf; + private static string ReadName(ReadOnlySpan header) { + var length = Math.Min((int)header[0], PackItConstants.FileNameMaxLength); + return Encoding.Latin1.GetString(header.Slice(1, length)); } - private void ReadExact(Span buffer) { - var total = 0; - while (total < buffer.Length) { - var read = this._stream.Read(buffer[total..]); - if (read == 0) - throw new EndOfStreamException("Unexpected end of stream reading PackIt data."); - total += read; - } + internal static DateTime? FromMacTime(uint seconds) => + seconds == 0 ? null : DateTime.UnixEpoch.AddSeconds(seconds - PackItConstants.MacEpochOffsetSeconds); + + internal static uint ToMacTime(DateTime? time) { + if (time is null) + return 0; + var seconds = (long)(time.Value.ToUniversalTime() - DateTime.UnixEpoch).TotalSeconds + PackItConstants.MacEpochOffsetSeconds; + return seconds is < 0 or > uint.MaxValue ? 0 : (uint)seconds; } } diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.PackIt/PackItWriter.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.PackIt/PackItWriter.cs index 0ca897ee3..b2a92f8da 100644 --- a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.PackIt/PackItWriter.cs +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.PackIt/PackItWriter.cs @@ -1,16 +1,16 @@ using System.Buffers.Binary; using System.Text; +using Compression.Core.Checksums; namespace FileFormat.PackIt; /// -/// Creates a PackIt (.pit) classic Macintosh archive. +/// Creates a PackIt (.pit) classic Macintosh archive of stored ("PMag") entries. /// /// -/// Produces archives using the stored ("PMag") entry format only. All entries are -/// written with an empty resource fork. The archive is written incrementally on each -/// call, so the stream must remain writable until -/// is called. +/// Entries are written as they are added; writes the "PEnd" marker, so the +/// stream must stay writable until then. The layout is the one documents, +/// header and fork CRC-16s included; The Unarchiver (unar) reads it back. /// public sealed class PackItWriter : IDisposable { private readonly Stream _stream; @@ -31,28 +31,33 @@ public PackItWriter(Stream stream, bool leaveOpen = false) { /// /// Appends a stored file entry to the archive. /// - /// The filename (up to 62 characters, Latin-1 encoded). - /// The uncompressed data fork bytes. + /// The filename (up to 63 characters, Latin-1 encoded; longer names are cut). + /// The data fork bytes. /// The four-character Mac file type code (default "TEXT"). /// The four-character Mac creator code (default "CWIE"). + /// The resource fork bytes, or for none. + /// The modification time, or to record none. /// Thrown when or is null. /// Thrown when this writer has been disposed. public void AddFile( string name, byte[] data, string fileType = "TEXT", - string creator = "CWIE") { + string creator = "CWIE", + byte[]? resourceFork = null, + DateTime? modified = null) { ArgumentNullException.ThrowIfNull(name); ArgumentNullException.ThrowIfNull(data); ObjectDisposedException.ThrowIf(this._disposed, this); - this.WriteEntry(name, data, fileType, creator); + WriteStoredEntry(this._stream, name, data, resourceFork ?? [], fileType, creator, modified); } /// public void Dispose() { if (!this._disposed) { this._disposed = true; + this._stream.Write(PackItConstants.MagicEnd); this._stream.Flush(); if (!this._leaveOpen) this._stream.Dispose(); @@ -61,51 +66,43 @@ public void Dispose() { // ── Serialisation ───────────────────────────────────────────────────────────── - private void WriteEntry(string name, byte[] data, string fileType, string creator) { - // Magic "PMag" = stored. - this._stream.Write(PackItConstants.MagicStored); + /// Writes one complete "PMag" entry (magic, header, forks, fork CRC). + internal static void WriteStoredEntry(Stream output, string name, ReadOnlySpan data, ReadOnlySpan resourceFork, + string fileType, string creator, DateTime? modified) { + Span header = stackalloc byte[PackItConstants.HeaderSize]; + header.Clear(); - // Filename field: 63 bytes (Pascal string: 1 length byte + up to 62 name bytes). var nameBytes = Encoding.Latin1.GetBytes(name); - var nameLen = Math.Min(nameBytes.Length, PackItConstants.FileNameMaxLength); - Span nameField = stackalloc byte[PackItConstants.FileNameMaxLength + 1]; // 63 bytes - nameField.Clear(); - nameField[0] = (byte)nameLen; - nameBytes.AsSpan(0, nameLen).CopyTo(nameField[1..]); - this._stream.Write(nameField); + var nameLength = Math.Min(nameBytes.Length, PackItConstants.FileNameMaxLength); + header[0] = (byte)nameLength; + nameBytes.AsSpan(0, nameLength).CopyTo(header[1..]); + WriteFourCc(header.Slice(64, 4), fileType); + WriteFourCc(header.Slice(68, 4), creator); + // [72..74] Finder flags and [74..76] are left zero. + BinaryPrimitives.WriteUInt32BigEndian(header[76..], (uint)data.Length); + BinaryPrimitives.WriteUInt32BigEndian(header[80..], (uint)resourceFork.Length); + var macTime = PackItReader.ToMacTime(modified); + BinaryPrimitives.WriteUInt32BigEndian(header[84..], macTime); + BinaryPrimitives.WriteUInt32BigEndian(header[88..], macTime); + BinaryPrimitives.WriteUInt16BigEndian(header[92..], Crc16Ccitt.Compute(header[..PackItConstants.HeaderCrcSpan])); - // File type (4 bytes) + creator (4 bytes). - Span typeField = stackalloc byte[4]; - Span creatorField = stackalloc byte[4]; - WriteAscii4(typeField, fileType); - WriteAscii4(creatorField, creator); - this._stream.Write(typeField); - this._stream.Write(creatorField); + var crc = new Crc16Ccitt(); + crc.Update(data); + crc.Update(resourceFork); + Span trailer = stackalloc byte[2]; + BinaryPrimitives.WriteUInt16BigEndian(trailer, (ushort)crc.Value); - // Finder flags (2 bytes) + locked (1 byte) + zero padding (1 byte) = 4 bytes. - Span meta = stackalloc byte[4]; - meta.Clear(); - this._stream.Write(meta); - - // Data fork size (uint32 BE) + resource fork size (uint32 BE) = 8 bytes. - Span sizes = stackalloc byte[8]; - BinaryPrimitives.WriteUInt32BigEndian(sizes, (uint)data.Length); - BinaryPrimitives.WriteUInt32BigEndian(sizes[4..], 0u); // resource fork = empty - this._stream.Write(sizes); - - // Data fork bytes. - if (data.Length > 0) - this._stream.Write(data); - // Resource fork bytes: zero bytes (already accounted for by size = 0). + output.Write(PackItConstants.MagicStored); + output.Write(header); + output.Write(data); + output.Write(resourceFork); + output.Write(trailer); } - // ── Helpers ─────────────────────────────────────────────────────────────────── - - private static void WriteAscii4(Span dest, string value) { - var bytes = Encoding.ASCII.GetBytes(value); - var len = Math.Min(bytes.Length, 4); - bytes.AsSpan(0, len).CopyTo(dest); - for (var i = len; i < 4; ++i) - dest[i] = (byte)' '; + private static void WriteFourCc(Span dest, string value) { + var bytes = Encoding.Latin1.GetBytes(value); + var length = Math.Min(bytes.Length, 4); + bytes.AsSpan(0, length).CopyTo(dest); + dest[length..].Fill((byte)' '); } } diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.PackIt/THIRD-PARTY-NOTICE.XADMaster.txt b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.PackIt/THIRD-PARTY-NOTICE.XADMaster.txt new file mode 100644 index 000000000..f729d680a --- /dev/null +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.PackIt/THIRD-PARTY-NOTICE.XADMaster.txt @@ -0,0 +1,34 @@ +XADMaster (PackIt) - converted to C# + +Source: https://github.com/MacPaw/XADMaster (The Unarchiver's unarchiving engine) +Revision: 7cb9ee0abbb163f261e4cb74501e15067032319c (master, 2026-09-21) +Authors: Dag Ågren (original author); MacPaw Way Ltd. (2017-present); + parts descend from libxad (Dirk Stöcker and contributors) +Licence: GNU Lesser General Public License, version 2.1 or (at your option) + any later version. This repository is LGPL-3.0-or-later, which the + "or any later version" grant permits; the full LGPL text is in the + repository's LICENSE file. + +Upstream notice, as carried in each XADMaster source file: + + Copyright (c) 2017-present, MacPaw Way Ltd. All rights reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +Files converted: + + XADPackItParser.m -> PackItReader.cs (entry layout) + XADStuffItHuffmanHandle.m -> PackItHuffmanDecoder.cs + +The header CRC (which XADMaster reads but does not check) was identified by +measurement: CRC-16/XMODEM over the 92 header bytes before it matched every +header of nine real PackIt archives. Encrypted entries (PMa5/PMa6) are listed +and refused rather than decrypted. diff --git a/Hawkynt.FileFormats.Archives/README.md b/Hawkynt.FileFormats.Archives/README.md index 3affa6901..19f330c8f 100644 --- a/Hawkynt.FileFormats.Archives/README.md +++ b/Hawkynt.FileFormats.Archives/README.md @@ -117,7 +117,7 @@ Every State, Test, Maintenance, Compress/Decompress and Demux/Mux/Remux cell is | [Compact Pro](https://en.wikipedia.org/wiki/Compact_Pro) | `CompactPro` | `.cpt` | R/W | ✅ | defrag · wipe | | [GitHub](https://github.com/MacPaw/XADMaster) | | [CPIO](https://en.wikipedia.org/wiki/Cpio) | `Cpio` | `.cpio` | R/W | ✅ | defrag · wipe | Reads and writes all four header variants — binary (both byte orders), `odc`, `newc` and `crc`, the last with its payload checksum verified; the `Format` option picks one and edits keep the archive's own | [pubs.opengroup.org](https://pubs.opengroup.org/onlinepubs/9699919799/utilities/pax.html) | | [DAR (Disk ARchive)](https://en.wikipedia.org/wiki/Dar_(disk_archiver)) | `Dar` | `.dar` | WORM | ✅ | — | Reads formats 9–11.3 (verified on 11.3): single and multi-slice, tape marks, gzip / bzip2 / xz / zstd / lz4 / lzo in streaming or block mode, sparse files, hard links; encrypted archives are refused. Writes single-slice 11.3 archives (stored, gzip, bzip2, xz, zstd, lz4) that `dar -t` accepts and `dar -x` restores byte for byte. Layout: [DAR-ON-DISK.md](https://github.com/Hawkynt/CompressionWorkbench/blob/main/docs/DAR-ON-DISK.md) | [dar.linux.free.fr](http://dar.linux.free.fr) | -| [DiskDoubler](https://en.wikipedia.org/wiki/DiskDoubler) | `DiskDoubler` | `.dd` `.sea` | WORM | — | wipe | Single-fork compressor: one payload per file | [GitHub](https://github.com/MacPaw/XADMaster) | +| [DiskDoubler](https://en.wikipedia.org/wiki/DiskDoubler) | `DiskDoubler` | `.dd` `.sea` | WORM | — | wipe | Single-fork compressor: one payload per file. Reads methods 0, 1, 6 and 9, refuses the rest; writes stored | [GitHub](https://github.com/MacPaw/XADMaster) | | [DMS](https://en.wikipedia.org/wiki/Disk_Masher_System) | `Dms` | `.dms` | WORM | ✅ | defrag | | [GitHub](https://github.com/markrabjohn/xDMS) | | [EGG (ALZip)](https://en.wikipedia.org/wiki/EGG_(file_format)) | `Egg` | `.egg` | WORM | ✅ | defrag | | [GitHub](https://github.com/alkegi/docs/blob/master/egg.md) | | [ESD](https://en.wikipedia.org/wiki/Windows_Imaging_Format) | `Esd` | `.esd` | WORM | ✅ | wipe | Solid LZMS WIM; created images carry a metadata resource but entries re-list as resources | [Microsoft Learn](https://learn.microsoft.com/en-us/windows-hardware/manufacture/desktop/wim-and-esd-windows-image-files-overview) | @@ -132,7 +132,7 @@ Every State, Test, Maintenance, Compress/Decompress and Demux/Mux/Remux cell is | [LZX (Amiga)](https://en.wikipedia.org/wiki/LZX) | `LzxAmiga` | `.lzx` | R/W | ✅ | defrag · wipe | | [Aminet](https://aminet.net) | | [mtree](https://man.freebsd.org/cgi/man.cgi?query=mtree&sektion=5) | `Mtree` | `.mtree` | WORM | ✅ | — | Filesystem metadata manifest; does not embed file bodies, so CWB does not dereference `contents=` host paths | [FreeBSD mtree(5)](https://man.freebsd.org/cgi/man.cgi?query=mtree&sektion=5) | | [NuFX / ShrinkIt](https://en.wikipedia.org/wiki/ShrinkIt) | `NuFx` | `.shk` `.sdk` `.bxy` | R/W | ✅ | defrag · shrink · wipe | | [nulib.com](https://nulib.com/library/FTN.e08002.htm) | -| PackIt | `PackIt` | `.pit` | R/W | ✅ | defrag · wipe | | [GitHub](https://github.com/MacPaw/XADMaster) | +| PackIt | `PackIt` | `.pit` | R/W | ✅ | defrag · wipe | Reads stored and Huffman entries, writes stored; encrypted entries are refused | [GitHub](https://github.com/MacPaw/XADMaster) | | [RAR](https://en.wikipedia.org/wiki/RAR_(file_format)) | `Rar` | `.rar` | R/W | ✅ | wipe | v1–v5 readers; creation and edits emit RAR4/RAR5 without claiming WinRAR encoder parity | [rarlab.com](https://www.rarlab.com/technote.htm) | | [7z](https://en.wikipedia.org/wiki/7z) | `SevenZip` | `.7z` | R/W | ✅ | compress · wipe | | [7-zip.org](https://www.7-zip.org/7z.html) | | [SHAR](https://en.wikipedia.org/wiki/Shar) | `Shar` | `.shar` `.sh` | R/W | ✅ | defrag | Add appends in place; Remove re-emits the script from the survivors | [gnu.org](https://www.gnu.org/software/sharutils/) | diff --git a/Hawkynt.FileFormats.Archives/REFERENCE.md b/Hawkynt.FileFormats.Archives/REFERENCE.md index abb0035eb..08ea63067 100644 --- a/Hawkynt.FileFormats.Archives/REFERENCE.md +++ b/Hawkynt.FileFormats.Archives/REFERENCE.md @@ -13715,16 +13715,22 @@ Implements `IArchiveFormatOperations`, `IArchiveInMemoryExtract`, `IFormatDescri #### `DiskDoublerEntry` -Represents a single compressed file stored in a DiskDoubler file. +Represents one fork of a DiskDoubler compressed file. | Member | Signature | Summary | | --- | --- | --- | | `DiskDoublerEntry` | `DiskDoublerEntry()` | | +| `Checksum` | `ushort Checksum { get; init; }` | Gets the fork's checksum field (its meaning depends on the method). | | `CompressedSize` | `long CompressedSize { get; init; }` | Gets the compressed size in bytes. | +| `Creator` | `string Creator { get; init; }` | Gets the Mac creator code. | | `DataOffset` | `long DataOffset { get; init; }` | Gets the absolute byte offset of the compressed data within the source stream. | +| `DeltaType` | `int DeltaType { get; init; }` | Gets the fork's delta pre-processing type (0 = none). | +| `FileType` | `string FileType { get; init; }` | Gets the Mac file type code. | | `IsDataFork` | `bool IsDataFork { get; init; }` | Gets whether this entry represents the data fork (as opposed to the resource fork). | -| `Method` | `int Method { get; init; }` | Gets the compression method ID (0 = stored, 1 = RLE, 3 = LZC variant, others = proprietary). | -| `Name` | `string Name { get; init; }` | Gets the original filename. | +| `IsSupported` | `bool IsSupported { get; }` | Gets whether this reader can decode the entry's method. | +| `Method` | `int Method { get; init; }` | Gets the compression method: 0 stored, 1 Unix compress, 2 and 5 DiskDoubler Huffman variants, 3 RLE, 4 Huffman, 6 and 9 "AD" LZSS, 7 Stac LZS, 8 Compact Pro, 10 "DD". The high bit is a flag and is masked off. | +| `Modified` | `DateTime? Modified { get; init; }` | Gets the modification time, or `null` when the header holds zero. | +| `Name` | `string Name { get; init; }` | Gets the entry name: the file's name for the data fork, with ".rsrc" appended for the resource fork. | | `OriginalSize` | `long OriginalSize { get; init; }` | Gets the original (uncompressed) size in bytes. | #### `DiskDoublerFormatDescriptor` @@ -13745,7 +13751,7 @@ Implements `IArchiveCreatable`, `IArchiveFormatOperations`, `IArchiveLayoutMap`, | `Extensions` | `IReadOnlyList Extensions { get; }` | Gets the extensions. | | `Family` | `AlgorithmFamily Family { get; }` | Gets the family. | | `Id` | `string Id { get; }` | Gets the id. | -| `MagicSignatures` | `IReadOnlyList MagicSignatures { get; }` | Gets the magic signatures. | +| `MagicSignatures` | `IReadOnlyList MagicSignatures { get; }` | Gets the magic signatures: a single DiskDoubler file starts with 0xABCD0054. | | `Methods` | `IReadOnlyList Methods { get; }` | Gets the methods. | | `TarCompressionFormatId` | `string TarCompressionFormatId { get; }` | Gets the tar compression format id. | | `Create` | `void Create(Stream output, IReadOnlyList inputs, FormatCreateOptions options)` | Performs the create operation. | @@ -13757,27 +13763,28 @@ Implements `IArchiveCreatable`, `IArchiveFormatOperations`, `IArchiveLayoutMap`, #### `DiskDoublerReader` -Reads the header of a DiskDoubler compressed file and provides access to its data and resource fork entries. +Reads a single DiskDoubler compressed file and decodes its forks. Implements `IDisposable`. | Member | Signature | Summary | | --- | --- | --- | -| `DiskDoublerReader` | `DiskDoublerReader(Stream stream, bool leaveOpen = false)` | Opens a DiskDoubler compressed file from the given stream and parses its header. | -| `HeaderSize` | `const int HeaderSize` | Size of the fixed-length DiskDoubler file header in bytes. | -| `Entries` | `IReadOnlyList Entries { get; }` | Gets the list of entries parsed from the DiskDoubler file header. | +| `DiskDoublerReader` | `DiskDoublerReader(Stream stream, bool leaveOpen = false, string name = null)` | Opens a DiskDoubler compressed file from the given stream and parses its header. | +| `Entries` | `IReadOnlyList Entries { get; }` | Gets the forks parsed from the header: the data fork (if any), then the resource fork (if any). | | `Dispose` | `void Dispose()` | | -| `Extract` | `byte[] Extract(DiskDoublerEntry entry)` | Extracts the data for the specified entry. | +| `Extract` | `byte[] Extract(DiskDoublerEntry entry)` | Decodes the specified fork. | +| `IsDiskDoubler` | `static bool IsDiskDoubler(ReadOnlySpan header)` | Returns whether `header` starts a DiskDoubler file (directly or behind MacBinary). | +| `MethodName` | `static string MethodName(int method)` | Names a method as the format's tools do. | #### `DiskDoublerWriter` -Writes a DiskDoubler stored (method 0) file. Takes a single data fork payload; resource fork is empty. Roundtrips through `DiskDoublerReader`. +Writes a single DiskDoubler file with a stored (method 0) data fork and no resource fork, in the layout `DiskDoublerReader` documents. The Unarchiver (`unar`) reads it back. | Member | Signature | Summary | | --- | --- | --- | | `DiskDoublerWriter` | `DiskDoublerWriter()` | | -| `SetFile` | `void SetFile(string name, byte[] data)` | Sets the file. | -| `WriteTo` | `void WriteTo(Stream output)` | Writes the to to the supplied output. | +| `SetFile` | `void SetFile(byte[] data, string fileType = "????", string creator = "????")` | Sets the data fork. DiskDoubler stores no name; the file's own name is the entry's name. | +| `WriteTo` | `void WriteTo(Stream output)` | Writes the header and the stored data fork to `output`. | ### Namespace `FileFormat.Dls` @@ -24034,17 +24041,24 @@ Represents a file entry in a PackIt (.pit) archive. | Member | Signature | Summary | | --- | --- | --- | | `PackItEntry` | `PackItEntry()` | | +| `Created` | `DateTime? Created { get; init; }` | Gets the creation time, or `null` when the header holds zero. | | `Creator` | `string Creator { get; init; }` | Gets the Mac four-character creator code (e.g. "CWIE"). | | `DataForkSize` | `long DataForkSize { get; init; }` | Gets the uncompressed data fork size in bytes. | -| `DataOffset` | `long DataOffset { get; init; }` | Gets the absolute byte offset where the data fork begins in the source stream. | +| `DataOffset` | `long DataOffset { get; init; }` | Gets the absolute offset where the data fork begins for a stored entry; for a compressed entry, the offset of its Huffman bit stream (the byte after the magic). | +| `EntryLength` | `long EntryLength { get; init; }` | Gets the number of bytes the entry occupies, magic included. | +| `EntryOffset` | `long EntryOffset { get; init; }` | Gets the absolute offset of the entry's magic. | | `FileType` | `string FileType { get; init; }` | Gets the Mac four-character file type code (e.g. "TEXT"). | -| `IsCompressed` | `bool IsCompressed { get; init; }` | Gets whether this entry uses Huffman compression ("PMa4"). | +| `FinderFlags` | `ushort FinderFlags { get; init; }` | Gets the Finder flags. | +| `HeaderCrcValid` | `bool HeaderCrcValid { get; init; }` | Gets whether the header matched its CRC-16 (always `true` for encrypted entries, which cannot be checked). | +| `IsCompressed` | `bool IsCompressed { get; init; }` | Gets whether this entry is Huffman-compressed ("PMa4", "PMa5", "PMa6"). | +| `IsEncrypted` | `bool IsEncrypted { get; init; }` | Gets whether this entry is password-encrypted ("PMa5" XOR, "PMa6" DES). | +| `Modified` | `DateTime? Modified { get; init; }` | Gets the modification time, or `null` when the header holds zero. | | `Name` | `string Name { get; init; }` | Gets the filename (up to 63 characters, Mac Roman / Latin-1 encoded). | | `ResourceForkSize` | `long ResourceForkSize { get; init; }` | Gets the uncompressed resource fork size in bytes. | #### `PackItFormatDescriptor` -PackIt classic Macintosh archive (.pit; Harry Chesley, 1984) — sequential PMag/PMa4 records bundling data and resource forks. References: `https://github.com/MacPaw/XADMaster` — XADMaster (The Unarchiver) — maintained implementation including PackItNo formal specification — format known from PackIt itself and later community documentation +PackIt classic Macintosh archive (.pit; Harry Chesley, 1984) — sequential PMag/PMa4 records bundling data and resource forks. References: `https://github.com/MacPaw/XADMaster` — XADMaster (The Unarchiver) — maintained implementation including PackItNo formal specification; header CRC measured on real PackIt II archives (see PackItReader) Implements `IArchiveCreatable`, `IArchiveDefragmentable`, `IArchiveFormatOperations`, `IArchiveLayoutMap`, `IArchiveModifiable`, `IArchivePurgeable`, `IFormatDescriptor`, `IWipeEmpty`. @@ -24065,8 +24079,8 @@ Implements `IArchiveCreatable`, `IArchiveDefragmentable`, `IArchiveFormatOperati | `TarCompressionFormatId` | `string TarCompressionFormatId { get; }` | Gets the tar compression format id. | | `Add` | `void Add(Stream archive, IReadOnlyList inputs)` | Adds (or replaces by name) files inside an existing PackIt archive. Uses `PackItModifier` — Add appends Stored at EOF; Remove walks the entry chain and shifts trailing bytes (no central directory). | | `Create` | `void Create(Stream output, IReadOnlyList inputs, FormatCreateOptions options)` | Performs the create operation. | -| `Defragment` | `void Defragment(Stream archive)` | Rebuild-based defrag: extracts then re-creates the PackIt archive in listing order. | -| `Defragment` | `void Defragment(Stream archive, DefragOptions options)` | Rebuild-based defrag: extracts then re-creates the PackIt archive per the requested mode. | +| `Defragment` | `void Defragment(Stream archive)` | Rebuild-based defrag: re-chains the entries in listing order. | +| `Defragment` | `void Defragment(Stream archive, DefragOptions options)` | Rebuild-based defrag. Each entry is carried over as its raw bytes (magic to fork CRC), so resource forks, Finder info, dates and Huffman coding survive unchanged; only the chain is rewritten. | | `EnumerateLayout` | `IEnumerable EnumerateLayout(Stream archive)` | | | `ExtractEntryToMemory` | `byte[] ExtractEntryToMemory(Stream archive, string entryName, string password)` | Native in-memory single-entry extraction routed through the bounded `OpenEntry`. | | `Extract` | `void Extract(Stream stream, string outputDir, string password, string[] files)` | Decodes the supplied input. | @@ -24076,12 +24090,12 @@ Implements `IArchiveCreatable`, `IArchiveDefragmentable`, `IArchiveFormatOperati #### `PackItModifier` -Random-access in-place modifier for PackIt (.pit) classic Macintosh archives. PackIt has no explicit end-of-archive marker — readers stop when the next 4 bytes are not "PMag" or "PMa4". Add appends a new stored entry at EOF; Remove walks the entry chain, locates the target, and shifts trailing bytes forward to compact (no central directory). +In-place edits of a PackIt archive. PackIt has no directory: entries are a chain ended by `"PEnd"`, so an add rewrites the marker after the new entry and a remove shifts the tail. | Member | Signature | Summary | | --- | --- | --- | -| `AddFile` | `static void AddFile(Stream pit, string name, byte[] data, string fileType = "TEXT", string creator = "CWIE")` | Appends a stored ("PMag") entry at the end of the archive. Walks the existing entry chain to find the EOF (first non-magic 4 bytes), then writes the new entry there and truncates. I/O cost is one full sequential entry walk plus the new entry's bytes. | -| `RemoveFile` | `static bool RemoveFile(Stream pit, string name, bool wipeData = true)` | Removes the named entry. Returns true if found. Walks the chain to locate the entry, then shifts trailing bytes forward to compact. | +| `AddFile` | `static void AddFile(Stream pit, string name, byte[] data, string fileType = "TEXT", string creator = "CWIE")` | Appends a stored ("PMag") entry after the last entry and rewrites the `"PEnd"` marker behind it. | +| `RemoveFile` | `static bool RemoveFile(Stream pit, string name, bool wipeData = true)` | Removes the named entry. Returns true if found. Locates the entry by walking the chain, then shifts the trailing bytes forward over it. | #### `PackItReader` @@ -24092,21 +24106,23 @@ Implements `IDisposable`. | Member | Signature | Summary | | --- | --- | --- | | `PackItReader` | `PackItReader(Stream stream, bool leaveOpen = false)` | Opens a PackIt archive from the given stream and reads all entries. | -| `EntryHeaderSize` | `const int EntryHeaderSize` | Size of the fixed per-entry header in bytes (magic + filename field + metadata). | | `Entries` | `IReadOnlyList Entries { get; }` | Gets the list of entries found in the archive. | +| `IsIncomplete` | `bool IsIncomplete { get; }` | Gets whether listing stopped early (truncated archive or an entry it cannot walk past). | | `Dispose` | `void Dispose()` | | +| `ExtractForks` | `ValueTuple ExtractForks(PackItEntry entry)` | Decodes both forks of `entry` and checks every CRC. | +| `ExtractResourceFork` | `byte[] ExtractResourceFork(PackItEntry entry)` | Extracts the resource fork of the specified entry. | | `Extract` | `byte[] Extract(PackItEntry entry)` | Extracts the data fork of the specified entry. | #### `PackItWriter` -Creates a PackIt (.pit) classic Macintosh archive. +Creates a PackIt (.pit) classic Macintosh archive of stored ("PMag") entries. Implements `IDisposable`. | Member | Signature | Summary | | --- | --- | --- | | `PackItWriter` | `PackItWriter(Stream stream, bool leaveOpen = false)` | Initialises a new `PackItWriter`. | -| `AddFile` | `void AddFile(string name, byte[] data, string fileType = "TEXT", string creator = "CWIE")` | Appends a stored file entry to the archive. | +| `AddFile` | `void AddFile(string name, byte[] data, string fileType = "TEXT", string creator = "CWIE", byte[] resourceFork = null, DateTime? modified = null)` | Appends a stored file entry to the archive. | | `Dispose` | `void Dispose()` | | ### Namespace `FileFormat.Paf` diff --git a/docs/catalogue/GAPS.md b/docs/catalogue/GAPS.md index fb9d0648c..04f73884c 100644 --- a/docs/catalogue/GAPS.md +++ b/docs/catalogue/GAPS.md @@ -180,9 +180,9 @@ running real-world samples. The file named at the end of each row is where the l | ZPAQ | `Zpaq` | 3 | reads only the stored blocks our own writer emits; ZPAQL-compressed blocks (every real zpaq level) throw (ZpaqReader.cs) | | Btrfs | `Btrfs` | 2 | zlib/lzo/zstd compressed extents are skipped (BtrfsReader.cs) | | Compact Pro | `CompactPro` | 2 | stored and RLE only; LZ+RLE and LZ+Huffman unsupported (CompactProReader.cs) | -| DiskDoubler | `DiskDoubler` | 2 | stored only; compressed members are returned as raw compressed bytes without an error (DiskDoublerReader.cs) | +| DiskDoubler | `DiskDoubler` | 2 | single files only (no DDAR/DDA2 archives); methods 0, 1, 6, 9 decoded and checked against unar on real files; 2-5, 7, 8, 10 and delta refused (DiskDoublerReader.cs) | | EnCase / Expert Witness (E01) | `Ewf` | 2 | single segment only (no .E02+), no L01 logical evidence, no Ex01 (EwfReader.cs) | -| PackIt | `PackIt` | 2 | PMag (stored) only; PMa4 Huffman members are returned raw (PackItReader.cs) | +| PackIt | `PackIt` | 2 | encrypted PMa5/PMa6 entries refused; stored and Huffman entries verified on real archives against unar (PackItReader.cs) | | UHARC | `Uharc` | 2 | stored and LZP only (UharcReader.cs) | | VHDX | `Vhdx` | 2 | differencing / partially-present blocks read as zeros (VhdxStream.cs) | | Comic Book Archive | `Cbz`, `Cbr`, `Cb7` | 1 | .cbt (tar) and .cba (ACE) have no descriptor | diff --git a/docs/catalogue/reference-formats.csv b/docs/catalogue/reference-formats.csv index bd05e5eee..516676341 100644 --- a/docs/catalogue/reference-formats.csv +++ b/docs/catalogue/reference-formats.csv @@ -45,9 +45,9 @@ ALZip,alz,archive,,,R,,R,,RW,3,https://en.wikipedia.org/wiki/ALZip,AlZip,Y,Y,Y,P EGG (ALZip),egg,archive,,,R,,,,,1,https://en.wikipedia.org/wiki/ALZip,Egg,Y,Y,,PARTIAL,,"store and deflate only; bzip2/LZMA/AZO, encryption and split archives unsupported (EggReader.cs)" StuffIt (classic + 5),sit;sea,archive,,,R,,R,fmt/1459;fmt/1460;fmt/639,RW,4,https://en.wikipedia.org/wiki/StuffIt,StuffIt,Y,Y,Y,PARTIAL,,store and RLE only; LZW/Huffman/LZAH/Arsenic/DES methods throw (StuffItReader.cs) StuffIt X,sitx,archive,,,R,,R,fmt/399,RW,4,https://en.wikipedia.org/wiki/StuffIt,StuffItX,Y,Y,,PARTIAL,,stored and deflate only; Brimstone/Cyanide/Darkhorse/Iron throw (StuffItXReader.cs) -DiskDoubler,dd,archive,,,R,,,,Y,2,https://en.wikipedia.org/wiki/DiskDoubler,DiskDoubler,Y,Y,,PARTIAL,,stored only; compressed members are returned as raw compressed bytes without an error (DiskDoublerReader.cs) +DiskDoubler,dd,archive,,,R,,,,Y,2,https://en.wikipedia.org/wiki/DiskDoubler,DiskDoubler,Y,Y,,PARTIAL,,"single files only (no DDAR/DDA2 archives); methods 0, 1, 6, 9 decoded and checked against unar on real files; 2-5, 7, 8, 10 and delta refused (DiskDoublerReader.cs)" Compact Pro,cpt,archive,,,R,,,,Y,2,https://en.wikipedia.org/wiki/Compact_Pro,CompactPro,Y,Y,Y,PARTIAL,,stored and RLE only; LZ+RLE and LZ+Huffman unsupported (CompactProReader.cs) -PackIt,pit,archive,,,R,,,,Y,2,https://en.wikipedia.org/wiki/PackIt,PackIt,Y,Y,Y,PARTIAL,,PMag (stored) only; PMa4 Huffman members are returned raw (PackItReader.cs) +PackIt,pit,archive,,,R,,,,Y,2,https://en.wikipedia.org/wiki/PackIt,PackIt,Y,Y,Y,PARTIAL,,"real layout (PMag/PMa4, header and fork CRC-16) verified on real archives against unar; encrypted PMa5/PMa6 entries refused (PackItReader.cs)" Now Compress,now,archive,,,R,,,,,1,,,,,,MISSING,, LZX (Amiga),lzx,archive,,,R,,R,,Y,3,https://en.wikipedia.org/wiki/LZX,LzxAmiga,Y,Y,Y,OK,, NuFX / ShrinkIt,shk;sdk;bxy,archive,,,,,,,Y,1,https://wiki.preterhuman.net/NuFX,NuFx,Y,Y,Y,OK,, @@ -185,7 +185,7 @@ StuffIt X Darkhorse,,codec,,,R,,,,,1,,,,,,MISSING,, StuffIt X Iron,,codec,,,R,,,,,1,,,,,,MISSING,, StuffIt X English dictionary preprocessor,,codec,,,R,,,,,1,,,,,,MISSING,, StuffIt X x86 filter,,filter,,,R,,,,,1,,,,,,MISSING,, -DiskDoubler methods (ADn/DDn/Method2),,codec,,,R,,,,,1,,,,,,MISSING,, +DiskDoubler methods (ADn/DDn/Method2),,codec,,,R,,,,,1,,DiskDoubler,Y,Y,,PARTIAL,,"ADn (6, 9) decoded; DDn and Method 2 refused (DiskDoublerAdDecoder.cs)" Compact Pro LZH/RLE,,codec,,,R,,,,,1,,,,,,MISSING,, Squeeze (Huffman),,codec,,,R,,,,,1,,Squeeze,Y,Y,,OK,, Crunch CP/M (LZW),,codec,,,R,,,,,1,,Crunch,Y,Y,,OK,, From 2350d2a66c545ce842875522d4792342e18572cf Mon Sep 17 00:00:00 2001 From: Hawkynt Date: Mon, 26 Oct 2026 13:04:16 +0100 Subject: [PATCH 13/48] * regenerate references --- docs/catalogue/GAPS.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/catalogue/GAPS.md b/docs/catalogue/GAPS.md index 04f73884c..5ac828100 100644 --- a/docs/catalogue/GAPS.md +++ b/docs/catalogue/GAPS.md @@ -16,16 +16,16 @@ exists. It warns when a capability letter has drifted from the live descriptor. | Catalogue rows | 983 | | … formats listed by at least one source | 525 | | … registry ids no source lists (OURS-ONLY) | 458 | -| Source-listed rows mapped to something here | 284 / 525 (54.1 %) | +| Source-listed rows mapped to something here | 285 / 525 (54.3 %) | | … of rows listed by ≥ 2 sources | 122 / 138 (88 %) | | … of rows listed by ≥ 3 sources | 66 / 67 (PEA is the one missing) | | … of rows listed by ≥ 4 sources | 31 / 31 | | Gap type | Rows | Meaning | | --- | ---: | --- | -| `MISSING` | 241 | a source lists it; no descriptor or building block covers it | +| `MISSING` | 240 | a source lists it; no descriptor or building block covers it | | `READ-ONLY-BUT-SOURCES-WRITE` | 23 | we only read it; a source or the format's own tool writes it | -| `PARTIAL` | 40 | covered, but the reader handles only part of the format (see the table below) | +| `PARTIAL` | 41 | covered, but the reader handles only part of the format (see the table below) | | `OK` | 221 | covered with no known gap against what the sources list | | `OURS-ONLY` | 458 | in our registry, listed by none of the seven sources | @@ -38,7 +38,7 @@ read-only rows. | --- | ---: | ---: | ---: | ---: | | 7-Zip (formats + codecs) | 96 | 89 | 92.7 | 72 | | libarchive (formats + filters) | 28 | 27 | 96.4 | 23 | -| XADMaster / The Unarchiver | 126 | 94 | 74.6 | 78 | +| XADMaster / The Unarchiver | 126 | 95 | 75.4 | 78 | | binwalk v3 | 79 | 48 | 60.8 | 36 | | Universal Extractor 2 | 124 | 71 | 57.3 | 48 | | PRONOM | 87 | 63 | 72.4 | 43 | From fd7e239e91db14dbf05f346dd9b7eef7a4a5c7eb Mon Sep 17 00:00:00 2001 From: Hawkynt Date: Mon, 26 Oct 2026 13:04:19 +0100 Subject: [PATCH 14/48] * FreeArc: real FreeArc 0.67 archives, read and write * FreeArc: real FreeArc 0.67 archives, read and write Symptom: FreeArcReader/FreeArcWriter used a private layout of our own ("ArC\1" + flags + typed blocks). Not one real FreeArc archive could be read, and FreeArc rejected everything we wrote, but the descriptor still claimed create and modify. Root cause: the format was never taken from FreeArc. A real archive is read from its end. The footer descriptor sits in the last 4 KiB and lists the control blocks. Each directory block lists its solid blocks with offsets relative to itself and the per-file columns. Every descriptor and control block is CRC-32 checked. Integers use FreeArc's own variable-length form, and the directory and footer are normally lzma-compressed. Change: the reader and writer are rewritten from docs/FREEARC-ON-DISK.md and the private layout is removed with no backward compatibility. - Reading: the full container (SFX prefix, comment, directories, UTF-8 names, several solid blocks). storing and lzma (raw LZMA1, dictionary and lc/lp/pb from the method string) decode. tornado, ppmd, lzp, grzip, rep, delta, exe, 4x4 and encryption are listed but refused with NotSupportedException. Archives whose directory cannot be read (encrypted headers) list as FULL.arc + metadata.ini (parse_status=partial). - Writing: FreeArc's layout with a storing or lzma solid block. For storing input in FreeArc's order it is byte-identical to "arc a -m0 -dmstoring". Oracle: FreeArc 0.67 (2014-03-15) Arc.exe and unarc.exe, run as black boxes. "unarc t/x" and "arc t/lb/x" extract our storing and lzma archives byte-identically, and we extract arc's -m0/-mlzma/-mlzma:lc4 archives byte-identically (FreeArcOracleTests). Nine archives Arc.exe wrote are checked in as fixtures, with provenance. Create/modify stay because FreeArc itself accepts our output. Sourcing: rung 2. FreeArc's sources are GPL-2.0 and the 0.67 binaries freeware, so neither can be absorbed. The sources (svn2github/freearc: Unarc/ArcStructure.h, ArhiveStructure.hs, ArhiveDirectory.hs, ByteStream.hs) were read to write docs/FREEARC-ON-DISK.md, every field was confirmed against hex dumps of Arc.exe's output, and the code was written from that document. Rung 1 does not apply: there is no permissively licensed FreeArc implementation. * FreeArc: regenerate the Archives API reference --- Compression.Tests/Compression.Tests.csproj | 4 + .../FreeArc/FreeArcOracleTests.cs | 168 +++++++ Compression.Tests/FreeArc/FreeArcTests.cs | 434 ++++++++++------- .../FreeArc/ReferenceVectors/README.md | 31 ++ .../FreeArc/ReferenceVectors/comment.arc | Bin 0 -> 448 bytes .../FreeArc/ReferenceVectors/dirs.arc | Bin 0 -> 326 bytes .../FreeArc/ReferenceVectors/encrypted.arc | Bin 0 -> 369 bytes .../FreeArc/ReferenceVectors/hdrenc.arc | Bin 0 -> 735 bytes .../FreeArc/ReferenceVectors/lzma-lc4.arc | Bin 0 -> 447 bytes .../FreeArc/ReferenceVectors/lzma.arc | Bin 0 -> 431 bytes .../FreeArc/ReferenceVectors/ppmd.arc | Bin 0 -> 386 bytes .../FreeArc/ReferenceVectors/storing.arc | Bin 0 -> 2287 bytes .../FreeArc/ReferenceVectors/tornado.arc | Bin 0 -> 524 bytes .../FileFormat.FreeArc/FreeArcEncoding.cs | 121 +++++ .../FileFormat.FreeArc/FreeArcEntry.cs | 32 +- .../FreeArcFormatDescriptor.cs | 105 +++-- .../FileFormat.FreeArc/FreeArcMethods.cs | 151 ++++++ .../FileFormat.FreeArc/FreeArcReader.cs | 440 ++++++++++-------- .../FileFormat.FreeArc/FreeArcWriter.cs | 222 ++++++--- Hawkynt.FileFormats.Archives/README.md | 2 +- Hawkynt.FileFormats.Archives/REFERENCE.md | 56 ++- docs/FREEARC-ON-DISK.md | 130 ++++++ docs/catalogue/GAPS.md | 6 +- docs/catalogue/reference-formats.csv | 2 +- 24 files changed, 1408 insertions(+), 496 deletions(-) create mode 100644 Compression.Tests/FreeArc/FreeArcOracleTests.cs create mode 100644 Compression.Tests/FreeArc/ReferenceVectors/README.md create mode 100644 Compression.Tests/FreeArc/ReferenceVectors/comment.arc create mode 100644 Compression.Tests/FreeArc/ReferenceVectors/dirs.arc create mode 100644 Compression.Tests/FreeArc/ReferenceVectors/encrypted.arc create mode 100644 Compression.Tests/FreeArc/ReferenceVectors/hdrenc.arc create mode 100644 Compression.Tests/FreeArc/ReferenceVectors/lzma-lc4.arc create mode 100644 Compression.Tests/FreeArc/ReferenceVectors/lzma.arc create mode 100644 Compression.Tests/FreeArc/ReferenceVectors/ppmd.arc create mode 100644 Compression.Tests/FreeArc/ReferenceVectors/storing.arc create mode 100644 Compression.Tests/FreeArc/ReferenceVectors/tornado.arc create mode 100644 Hawkynt.FileFormats.Archives/FileFormats/FileFormat.FreeArc/FreeArcEncoding.cs create mode 100644 Hawkynt.FileFormats.Archives/FileFormats/FileFormat.FreeArc/FreeArcMethods.cs create mode 100644 docs/FREEARC-ON-DISK.md diff --git a/Compression.Tests/Compression.Tests.csproj b/Compression.Tests/Compression.Tests.csproj index 67f6c0399..59dbe59f1 100644 --- a/Compression.Tests/Compression.Tests.csproj +++ b/Compression.Tests/Compression.Tests.csproj @@ -79,6 +79,10 @@ CscVectors.%(Filename)%(Extension) + + + FreeArcVectors.%(Filename)%(Extension) + CvfVectors.%(Filename)%(Extension) diff --git a/Compression.Tests/FreeArc/FreeArcOracleTests.cs b/Compression.Tests/FreeArc/FreeArcOracleTests.cs new file mode 100644 index 000000000..940c72ccb --- /dev/null +++ b/Compression.Tests/FreeArc/FreeArcOracleTests.cs @@ -0,0 +1,168 @@ +using System.Diagnostics; +using System.Text; +using FileFormat.FreeArc; + +namespace Compression.Tests.FreeArc; + +/// +/// Live round trips against FreeArc 0.67 itself: its unarc and arc must test and +/// extract what our writer makes byte-identically, and we must extract what arc makes. +/// +/// +/// The tools are located as $FREEARC_UNARC / $FREEARC_ARC (paths), else as +/// unarc.exe / Arc.exe on the Windows PATH. Both ship in the bin folder of +/// FreeArc 0.67 (2014-03-15), e.g. the self-extracting FreeArc-console-0.67-alpha-win32.exe +/// (run it with -x -y -d<dir>). FreeArc is freeware without published sources for +/// 0.67, so it is used only as a black box. Without the tools every test here is ignored. +/// +[TestFixture] +[Category("ExternalInterop")] +public sealed class FreeArcOracleTests { + private static readonly Lazy _unarc = new(() => Locate("FREEARC_UNARC", "unarc.exe")); + private static readonly Lazy _arc = new(() => Locate("FREEARC_ARC", "Arc.exe")); + private string _tmp = null!; + + [SetUp] + public void Setup() { + this._tmp = Path.Combine(Path.GetTempPath(), $"cwb_freearc_oracle_{Guid.NewGuid():N}"); + Directory.CreateDirectory(this._tmp); + } + + [TearDown] + public void Teardown() { + try { Directory.Delete(this._tmp, recursive: true); } catch { /* best effort */ } + } + + private static (string Name, byte[] Data)[] Files() { + var big = new byte[300_000]; + for (var i = 0; i < big.Length; ++i) + big[i] = (byte)((i * 2654435761u >> 13) % 7 == 0 ? i : i >> 4); + return [ + ("hello.txt", FreeArcTests.Hello), + ("sub/lines.txt", FreeArcTests.Lines()), + ("empty.bin", []), + ("dир/файл.txt", "abc"u8.ToArray()), + ("a/b/big.bin", big), + ]; + } + + [TestCase("storing")] + [TestCase("lzma")] + [TestCase("lzma:1mb:lc4:lp1:pb1")] + public void OurArchive_UnarcTestsAndExtractsByteIdentical(string method) { + var unarc = Require(_unarc, "unarc"); + var archive = this.WriteOurs(method); + + var test = Run(unarc, ["t", archive]); + Assert.That(test.ExitCode, Is.Zero, test.Output); + Assert.That(test.Output, Does.Contain("All OK").Or.Contain("Testing"), test.Output); + + var outDir = Path.Combine(this._tmp, "x"); + var extract = Run(unarc, ["x", "-o+", $"-dp{outDir}", archive]); + Assert.That(extract.ExitCode, Is.Zero, extract.Output); + this.AssertExtracted(outDir); + } + + [TestCase("storing")] + [TestCase("lzma")] + public void OurArchive_ArcListsTestsAndExtractsByteIdentical(string method) { + var arc = Require(_arc, "Arc"); + var archive = this.WriteOurs(method); + + var test = Run(arc, ["t", "-cfg-", archive]); + Assert.That(test.ExitCode, Is.Zero, test.Output); + var list = Run(arc, ["lb", "-cfg-", archive]); + Assert.That(list.ExitCode, Is.Zero, list.Output); + Assert.That(list.Output, Does.Contain("big.bin")); + + var outDir = Path.Combine(this._tmp, "x"); + var extract = Run(arc, ["x", "-cfg-", "-y", $"-dp{outDir}", archive]); + Assert.That(extract.ExitCode, Is.Zero, extract.Output); + this.AssertExtracted(outDir); + } + + [TestCase("-m0")] + [TestCase("-mlzma")] + [TestCase("-mlzma:lc4:lp1:pb1")] + [TestCase("-m5x")] + public void ArcArchive_WeExtractByteIdentical(string method) { + var arc = Require(_arc, "Arc"); + var src = Path.Combine(this._tmp, "src"); + foreach (var (name, data) in Files()) { + var path = Path.Combine(src, name.Replace('/', Path.DirectorySeparatorChar)); + Directory.CreateDirectory(Path.GetDirectoryName(path)!); + File.WriteAllBytes(path, data); + } + Directory.CreateDirectory(Path.Combine(src, "emptydir")); + + var archive = Path.Combine(this._tmp, "theirs.arc"); + var create = Run(arc, ["a", "-cfg-", "-r", method, archive, "*"], src); + Assert.That(create.ExitCode, Is.Zero, create.Output); + + using var r = new FreeArcReader(File.OpenRead(archive)); + if (r.Entries.Any(e => !e.IsDirectory && !FreeArcMethods.IsSupported(e.Method))) + Assert.Inconclusive($"{method} chose methods we do not decode: {string.Join(", ", r.Entries.Select(e => e.Method).Distinct())}"); + foreach (var (name, data) in Files()) + Assert.That(r.Extract(r.Entries.Single(e => e.Name == name)), Is.EqualTo(data), name); + Assert.That(r.Entries.Single(e => e.Name == "emptydir").IsDirectory, Is.True); + } + + private string WriteOurs(string method) { + var w = new FreeArcWriter(method); + w.AddDirectory("emptydir"); + w.AddDirectory("dир"); + foreach (var (name, data) in Files()) + w.AddFile(name, data); + var path = Path.Combine(this._tmp, "ours.arc"); + File.WriteAllBytes(path, w.Build()); + return path; + } + + private void AssertExtracted(string outDir) { + Assert.Multiple(() => { + foreach (var (name, data) in Files()) + Assert.That(File.ReadAllBytes(Path.Combine(outDir, name.Replace('/', Path.DirectorySeparatorChar))), Is.EqualTo(data), name); + Assert.That(Directory.Exists(Path.Combine(outDir, "emptydir")), Is.True); + }); + } + + private static string Require(Lazy tool, string name) { + if (tool.Value is null) + Assert.Ignore($"FreeArc's {name} not found: set FREEARC_{name.ToUpperInvariant()} or put it on PATH (see the class remarks)."); + return tool.Value!; + } + + private static string? Locate(string variable, string executable) { + var configured = Environment.GetEnvironmentVariable(variable); + if (!string.IsNullOrWhiteSpace(configured) && File.Exists(configured)) + return configured; + if (!OperatingSystem.IsWindows()) + return null; + foreach (var dir in (Environment.GetEnvironmentVariable("PATH") ?? "").Split(Path.PathSeparator)) { + var candidate = Path.Combine(dir.Trim(), executable); + if (File.Exists(candidate)) + return candidate; + } + return null; + } + + private static (int ExitCode, string Output) Run(string executable, string[] arguments, string? workingDirectory = null) { + var start = new ProcessStartInfo(executable) { + RedirectStandardOutput = true, + RedirectStandardError = true, + UseShellExecute = false, + WorkingDirectory = workingDirectory ?? Path.GetDirectoryName(executable)!, + StandardOutputEncoding = Encoding.UTF8, + }; + foreach (var argument in arguments) + start.ArgumentList.Add(argument); + using var process = Process.Start(start)!; + var stdOut = process.StandardOutput.ReadToEndAsync(); + var stdErr = process.StandardError.ReadToEndAsync(); + if (!process.WaitForExit(120_000)) { + process.Kill(entireProcessTree: true); + return (-1, "timed out"); + } + return (process.ExitCode, stdOut.Result + stdErr.Result); + } +} diff --git a/Compression.Tests/FreeArc/FreeArcTests.cs b/Compression.Tests/FreeArc/FreeArcTests.cs index 20bb554fe..8f41bc2a1 100644 --- a/Compression.Tests/FreeArc/FreeArcTests.cs +++ b/Compression.Tests/FreeArc/FreeArcTests.cs @@ -1,242 +1,332 @@ +using System.Reflection; +using System.Text; +using Compression.Core.Checksums; +using Compression.Registry; using FileFormat.FreeArc; namespace Compression.Tests.FreeArc; +/// +/// FreeArc against archives FreeArc 0.67 wrote (see ReferenceVectors/README.md) and against +/// our own writer. The live oracle runs are in . +/// [TestFixture] public class FreeArcTests { + // The fixture inputs were touched to 2024-01-02 03:04:05 UTC, but FreeArc 0.67 (run on Windows + // while daylight saving was in effect) recorded them one hour later; the archives hold this value. + internal static readonly DateTime FixtureTime = new(2024, 1, 2, 4, 4, 5, DateTimeKind.Utc); - // ── Helper ──────────────────────────────────────────────────────────────── + internal static byte[] Hello => "Hello, FreeArc!\n"u8.ToArray(); - private static MemoryStream BuildArchive(Action populate) { - var w = new FreeArcWriter(); - populate(w); - return new MemoryStream(w.Build()); + internal static byte[] Lines() { + var sb = new StringBuilder(); + for (var i = 1; i <= 40; ++i) + sb.Append("line ").Append(i).Append(" the quick brown fox jumps over the lazy dog\n"); + return Encoding.ASCII.GetBytes(sb.ToString()); } - // ── Reader round-trip tests ─────────────────────────────────────────────── - - [Test, Category("RoundTrip")] - public void Read_SyntheticArchive_SingleFile() { - var data = "Hello FreeArc!"u8.ToArray(); - using var ms = BuildArchive(w => w.AddFile("hello.txt", data)); - using var r = new FreeArcReader(ms); - - Assert.That(r.Entries, Has.Count.EqualTo(1)); - Assert.That(r.Entries[0].Name, Is.EqualTo("hello.txt")); - Assert.That(r.Entries[0].Size, Is.EqualTo(data.Length)); - Assert.That(r.Entries[0].Method, Is.EqualTo("storing")); - Assert.That(r.Extract(r.Entries[0]), Is.EqualTo(data)); + internal static byte[] Vector(string name) { + using var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream($"FreeArcVectors.{name}.arc") + ?? throw new InvalidOperationException($"Missing FreeArc reference vector {name}.arc"); + using var ms = new MemoryStream(); + stream.CopyTo(ms); + return ms.ToArray(); } - [Test, Category("RoundTrip")] - public void Read_SyntheticArchive_MultipleFiles() { - var file1 = "First file data"u8.ToArray(); - var file2 = "Second file data"u8.ToArray(); - var file3 = "Third file data"u8.ToArray(); - - using var ms = BuildArchive(w => { - w.AddFile("a.txt", file1); - w.AddFile("b.txt", file2); - w.AddFile("c.txt", file3); + private static FreeArcReader Open(byte[] archive) => new(new MemoryStream(archive)); + + private static FreeArcEntry Entry(FreeArcReader r, string name) => r.Entries.Single(e => e.Name == name); + + // ── Real archives: supported methods ─────────────────────────────────────── + + [TestCase("storing", "storing")] + [TestCase("lzma", "lzma:32kb:normal:32")] + [TestCase("lzma-lc4", "lzma:32kb:normal:32:pb1:lc4:lp1")] + [Category("RoundTrip")] + public void RealArchive_ThreeFiles_ExtractByteIdentical(string vector, string method) { + using var r = Open(Vector(vector)); + + Assert.That(r.Entries.Select(e => e.Name), Is.EquivalentTo(new[] { "hello.txt", "empty.bin", "sub/lines.txt" })); + Assert.Multiple(() => { + Assert.That(r.Extract(Entry(r, "hello.txt")), Is.EqualTo(Hello)); + Assert.That(r.Extract(Entry(r, "sub/lines.txt")), Is.EqualTo(Lines())); + Assert.That(r.Extract(Entry(r, "empty.bin")), Is.Empty); + Assert.That(r.Entries.Select(e => e.Method).Distinct(), Is.EqualTo(new[] { method })); + Assert.That(r.Entries.All(e => !e.IsDirectory)); + Assert.That(r.Entries.All(e => e.LastModified == FixtureTime)); + Assert.That(Entry(r, "hello.txt").Crc, Is.EqualTo(0x2B27C831u)); + Assert.That(r.Entries.Sum(e => e.CompressedSize), Is.LessThanOrEqualTo(Vector(vector).Length)); + Assert.That(r.SfxSize, Is.Zero); }); - using var r = new FreeArcReader(ms); - - Assert.That(r.Entries, Has.Count.EqualTo(3)); - Assert.That(r.Entries[0].Name, Is.EqualTo("a.txt")); - Assert.That(r.Entries[1].Name, Is.EqualTo("b.txt")); - Assert.That(r.Entries[2].Name, Is.EqualTo("c.txt")); - Assert.That(r.Extract(r.Entries[0]), Is.EqualTo(file1)); - Assert.That(r.Extract(r.Entries[1]), Is.EqualTo(file2)); - Assert.That(r.Extract(r.Entries[2]), Is.EqualTo(file3)); } [Test, Category("RoundTrip")] - public void Read_SyntheticArchive_EmptyFile() { - using var ms = BuildArchive(w => w.AddFile("empty.bin", [])); - using var r = new FreeArcReader(ms); + public void RealArchive_DirectoriesUnicodeAndSeveralSolidBlocks() { + using var r = Open(Vector("dirs")); + + Assert.Multiple(() => { + Assert.That(Entry(r, "emptydir").IsDirectory, Is.True); + Assert.That(Entry(r, "dир").IsDirectory, Is.True); + Assert.That(Entry(r, "dир/файл.txt").IsDirectory, Is.False); + Assert.That(r.Extract(Entry(r, "dир/файл.txt")), Is.EqualTo("abc"u8.ToArray())); + Assert.That(r.Extract(Entry(r, "hello.txt")), Is.EqualTo(Hello)); + Assert.That(r.Extract(Entry(r, "emptydir")), Is.Empty); + }); + } - Assert.That(r.Entries, Has.Count.EqualTo(1)); - Assert.That(r.Entries[0].Size, Is.EqualTo(0)); - Assert.That(r.Extract(r.Entries[0]), Is.Empty); + [Test] + public void RealArchive_Comment() { + using var r = Open(Vector("comment")); + Assert.That(r.Comment, Is.EqualTo("A FreeArc comment")); + Assert.That(r.Extract(Entry(r, "sub/lines.txt")), Is.EqualTo(Lines())); } - [Test, Category("RoundTrip")] - public void Read_SyntheticArchive_BinaryData() { - // Deterministic non-trivial binary payload — never Random.Shared.NextBytes. - var data = new byte[512]; - for (var i = 0; i < data.Length; i++) data[i] = (byte)(i * 7 + 13); + // ── Real archives: methods we refuse ─────────────────────────────────────── - using var ms = BuildArchive(w => w.AddFile("binary.bin", data)); - using var r = new FreeArcReader(ms); + [TestCase("ppmd", "ppmd:10:48mb")] + [TestCase("tornado", "rep:3kb:256+4x4:tor:3:3kb:h16kb")] + public void RealArchive_UnsupportedMethod_ListsButRefusesExtraction(string vector, string method) { + using var r = Open(Vector(vector)); - Assert.That(r.Extract(r.Entries[0]), Is.EqualTo(data)); + Assert.That(r.Entries.Select(e => e.Name), Is.EquivalentTo(new[] { "hello.txt", "sub/lines.txt" })); + Assert.That(r.Entries[0].Method, Is.EqualTo(method)); + Assert.That(() => r.Extract(Entry(r, "hello.txt")), Throws.TypeOf()); } - [Test, Category("RoundTrip")] - public void Read_SyntheticArchive_Utf8FileName() { - var data = "content"u8.ToArray(); - using var ms = BuildArchive(w => w.AddFile("dossier/fichier.txt", data)); - using var r = new FreeArcReader(ms); - - Assert.That(r.Entries[0].Name, Is.EqualTo("dossier/fichier.txt")); - Assert.That(r.Extract(r.Entries[0]), Is.EqualTo(data)); + [Test] + public void RealArchive_EncryptedData_ListsButRefusesExtraction() { + using var r = Open(Vector("encrypted")); + var entry = Entry(r, "hello.txt"); + Assert.That(entry.Method, Does.Contain("+aes-256/ctr:")); + Assert.That(() => r.Extract(entry), Throws.TypeOf().With.Message.Contains("encrypted")); } - [Test, Category("RoundTrip")] - public void Read_SyntheticArchive_NoFiles() { - using var ms = BuildArchive(_ => { }); - using var r = new FreeArcReader(ms); + [Test] + public void RealArchive_EncryptedHeaders_ReaderRefuses_DescriptorFallsBack() { + var archive = Vector("hdrenc"); + Assert.That(() => Open(archive), Throws.TypeOf()); - Assert.That(r.Entries, Is.Empty); + var listed = new FreeArcFormatDescriptor().List(new MemoryStream(archive), null); + Assert.That(listed.Select(e => e.Name), Is.EqualTo(new[] { "FULL.arc", "metadata.ini" })); + Assert.That(listed[0].OriginalSize, Is.EqualTo(archive.Length)); } - [Test, Category("RoundTrip")] - public void Read_SyntheticArchive_LargeFile() { - var data = new byte[65536]; - for (var i = 0; i < data.Length; i++) data[i] = (byte)(i & 0xFF); - - using var ms = BuildArchive(w => w.AddFile("large.dat", data)); - using var r = new FreeArcReader(ms); - - Assert.That(r.Entries[0].Size, Is.EqualTo(65536)); - Assert.That(r.Extract(r.Entries[0]), Is.EqualTo(data)); + [Test] + public void RealArchive_SfxPrefix_IsSkipped() { + var archive = Vector("lzma"); + var prefixed = new byte[1000 + archive.Length]; + archive.CopyTo(prefixed, 1000); + using var r = Open(prefixed); + Assert.That(r.SfxSize, Is.EqualTo(1000)); + Assert.That(r.Extract(Entry(r, "sub/lines.txt")), Is.EqualTo(Lines())); } - [Test, Category("RoundTrip")] - public void Read_SyntheticArchive_CompressedSizeMatchesStored() { - var data = "stored data"u8.ToArray(); - using var ms = BuildArchive(w => w.AddFile("f.txt", data)); - using var r = new FreeArcReader(ms); + // ── Corruption and boundaries ────────────────────────────────────────────── - // Writer stores without compression so CompressedSize == Size. - Assert.That(r.Entries[0].CompressedSize, Is.EqualTo(r.Entries[0].Size)); + [Test] + public void Corrupt_FooterDescriptorCrc_Throws() { + var archive = Vector("storing"); + archive[^1] ^= 0x55; + Assert.That(() => Open(archive), Throws.TypeOf()); } - // ── Descriptor property tests ───────────────────────────────────────────── - [Test] - public void Descriptor_Properties() { - var d = new FreeArcFormatDescriptor(); - Assert.That(d.Id, Is.EqualTo("FreeArc")); - Assert.That(d.DisplayName, Is.EqualTo("FreeArc")); - Assert.That(d.DefaultExtension, Is.EqualTo(".arc")); - Assert.That(d.Extensions, Contains.Item(".arc")); - Assert.That(d.Category, Is.EqualTo(Compression.Registry.FormatCategory.Archive)); - Assert.That(d.Family, Is.EqualTo(Compression.Registry.AlgorithmFamily.Archive)); - Assert.That(d.Description, Is.EqualTo("FreeArc compressed archive")); - Assert.That(d.TarCompressionFormatId, Is.Null); + public void Corrupt_Truncated_Throws() { + var archive = Vector("lzma"); + Assert.That(() => Open(archive[..^3]), Throws.TypeOf()); } [Test] - public void Descriptor_Id_IsDistinctFromArc() { - // Ensure we don't accidentally share the legacy ARC format id. - var d = new FreeArcFormatDescriptor(); - Assert.That(d.Id, Is.Not.EqualTo("Arc")); - Assert.That(d.Id, Is.Not.EqualTo("arc")); + public void Corrupt_DirectoryBlockByte_FailsCrc() { + var archive = Vector("storing"); + // Data block is 2087 bytes at 31; the stored directory follows it. + archive[31 + 2087 + 5] ^= 0x01; + Assert.That(() => Open(archive), Throws.TypeOf()); } [Test] - public void Descriptor_Capabilities() { - var d = new FreeArcFormatDescriptor(); - Assert.That(d.Capabilities.HasFlag(Compression.Registry.FormatCapabilities.CanList)); - Assert.That(d.Capabilities.HasFlag(Compression.Registry.FormatCapabilities.CanExtract)); - Assert.That(d.Capabilities.HasFlag(Compression.Registry.FormatCapabilities.CanCreate)); - Assert.That(d.Capabilities.HasFlag(Compression.Registry.FormatCapabilities.CanTest)); - Assert.That(d.Capabilities.HasFlag(Compression.Registry.FormatCapabilities.SupportsMultipleEntries)); + public void Corrupt_FileDataByte_FailsCrcOnExtract() { + var archive = Vector("storing"); + archive[31 + 2087 - 1] ^= 0x01; // last byte of sub/lines.txt + using var r = Open(archive); + Assert.That(r.Extract(Entry(r, "hello.txt")), Is.EqualTo(Hello)); + Assert.That(() => r.Extract(Entry(r, "sub/lines.txt")), Throws.TypeOf().With.Message.Contains("CRC")); } - [Test] - public void Descriptor_MagicSignature_Correct() { - var d = new FreeArcFormatDescriptor(); - var sig = d.MagicSignatures[0]; - Assert.That(sig.Bytes, Is.EqualTo(new byte[] { (byte)'A', (byte)'r', (byte)'C', 0x01 })); - Assert.That(sig.Confidence, Is.EqualTo(0.95).Within(0.001)); + [TestCase(0)] + [TestCase(2)] + [TestCase(15)] + public void TooSmall_Throws(int length) { + var data = new byte[length]; + "ArC\x01"u8[..Math.Min(4, length)].CopyTo(data); + Assert.That(() => Open(data), Throws.TypeOf()); } [Test] - public void Descriptor_Create_ViaInterface() { - var data = "create test"u8.ToArray(); - var tmpFile = Path.GetTempFileName(); - try { - File.WriteAllBytes(tmpFile, data); - var d = new FreeArcFormatDescriptor(); - using var ms = new MemoryStream(); - ((Compression.Registry.IArchiveCreatable)d).Create(ms, - [new Compression.Registry.ArchiveInputInfo(tmpFile, "test.txt", false)], - new Compression.Registry.FormatCreateOptions()); - ms.Position = 0; - using var r = new FreeArcReader(ms); - Assert.That(r.Entries, Has.Count.EqualTo(1)); - Assert.That(r.Entries[0].Name, Is.EqualTo("test.txt")); - Assert.That(r.Extract(r.Entries[0]), Is.EqualTo(data)); - } finally { File.Delete(tmpFile); } + public void SignatureOnly_NoFooter_Throws() { + var data = new byte[64]; + "ArC\x01"u8.CopyTo(data); + Assert.That(() => Open(data), Throws.TypeOf()); } [Test] - public void Descriptor_List_ViaInterface() { - var data = "descriptor list test"u8.ToArray(); - using var ms = BuildArchive(w => w.AddFile("test.txt", data)); - var d = new FreeArcFormatDescriptor(); - var entries = d.List(ms, null); + public void LegacyArcBytes_Throw() { + var data = new byte[64]; + data[0] = 0x1A; + data[1] = 0x08; + Assert.That(() => Open(data), Throws.TypeOf()); + } - Assert.That(entries, Has.Count.EqualTo(1)); - Assert.That(entries[0].Name, Is.EqualTo("test.txt")); - Assert.That(entries[0].OriginalSize, Is.EqualTo(data.Length)); + [TestCase(0UL, 1)] + [TestCase(127UL, 1)] + [TestCase(128UL, 2)] + [TestCase((1UL << 14) - 1, 2)] + [TestCase(1UL << 14, 3)] + [TestCase((1UL << 28) - 1, 4)] + [TestCase(1UL << 28, 5)] + [TestCase((1UL << 56) - 1, 8)] + [TestCase(1UL << 56, 9)] + [TestCase(ulong.MaxValue, 9)] + public void VarInt_RoundTrip_AtLengthBoundaries(ulong value, int expectedLength) { + using var ms = new MemoryStream(); + FreeArcEncoding.WriteVarInt(ms, value); + var bytes = ms.ToArray(); + var p = 0; + Assert.That(bytes, Has.Length.EqualTo(expectedLength)); + Assert.That(FreeArcEncoding.ReadVarInt(bytes, ref p), Is.EqualTo(value)); + Assert.That(p, Is.EqualTo(expectedLength)); } - // ── Magic distinction ────────────────────────────────────────────────────── + [Test] + public void VarInt_KnownEncodings_FromFreeArcOutput() { + // 10508 was written by FreeArc as 31 A4, 85 as AA, 8 as 10. + var p = 0; + Assert.That(FreeArcEncoding.ReadVarInt([0x31, 0xA4], ref p), Is.EqualTo(10508)); + p = 0; + Assert.That(FreeArcEncoding.ReadVarInt([0xAA], ref p), Is.EqualTo(85)); + p = 0; + Assert.That(FreeArcEncoding.ReadVarInt([0x10], ref p), Is.EqualTo(8)); + } [Test] - public void MagicDistinction_FreeArcVsLegacyArc() { - // Legacy ARC uses 0x1A as the first byte. - // FreeArc uses 'A' (0x41), 'r', 'C', 0x01. - var freeArcMagic = FreeArcReader.Magic; - Assert.That(freeArcMagic[0], Is.Not.EqualTo(0x1A), - "FreeArc magic must not collide with legacy ARC 0x1A marker."); - Assert.That(freeArcMagic[0], Is.EqualTo((byte)'A')); - Assert.That(freeArcMagic[1], Is.EqualTo((byte)'r')); - Assert.That(freeArcMagic[2], Is.EqualTo((byte)'C')); - Assert.That(freeArcMagic[3], Is.EqualTo(0x01)); + public void VarInt_Truncated_Throws() { + var p = 0; + Assert.That(() => FreeArcEncoding.ReadVarInt([0x01], ref p), Throws.TypeOf()); } - // ── Error handling ──────────────────────────────────────────────────────── + [TestCase("storing", true)] + [TestCase("lzma:1mb:normal:bt4:32", true)] + [TestCase("ppmd:10:48mb", false)] + [TestCase("delta+lzma:32kb", false)] + [TestCase("4x4:tor:3", false)] + [TestCase("lzma+aes-256/ctr:n1000", false)] + public void Methods_IsSupported(string method, bool supported) => + Assert.That(FreeArcMethods.IsSupported(method) && !FreeArcMethods.IsEncrypted(method), Is.EqualTo(supported)); - [Test] - public void BadMagic_Throws_InvalidDataException() { - var bad = new byte[] { 0x1A, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; - using var ms = new MemoryStream(bad); - Assert.Throws(() => _ = new FreeArcReader(ms)); + // ── Writer ───────────────────────────────────────────────────────────────── + + [Test, Category("RoundTrip")] + public void Writer_Storing_ReproducesFreeArcByteForByte() { + // FreeArc 0.67 wrote storing.arc with -m0 -dmstoring; given the same files in the same order + // and timestamps our writer must produce the identical archive. + var w = new FreeArcWriter(); + w.AddFile("empty.bin", [], FixtureTime); + w.AddFile("hello.txt", Hello, FixtureTime); + w.AddFile("sub/lines.txt", Lines(), FixtureTime); + Assert.That(w.Build(), Is.EqualTo(Vector("storing"))); + } + + [TestCase("storing")] + [TestCase("lzma")] + [TestCase("lzma:1mb")] + [TestCase("lzma:64kb:lc4:lp1:pb1")] + [Category("RoundTrip")] + public void Writer_RoundTrip(string method) { + var big = new byte[200_000]; + for (var i = 0; i < big.Length; ++i) + big[i] = (byte)(i * 31 % 251 ^ (i >> 9)); + + var w = new FreeArcWriter(method); + w.AddDirectory("emptydir", FixtureTime); + w.AddDirectory("dир", FixtureTime); + w.AddFile("dир/файл.txt", "abc"u8.ToArray(), FixtureTime); + w.AddFile("hello.txt", Hello, FixtureTime); + w.AddFile("a/b/empty.bin", [], FixtureTime); + w.AddFile("big.bin", big, FixtureTime); + + using var r = Open(w.Build()); + Assert.Multiple(() => { + Assert.That(r.Entries, Has.Count.EqualTo(6)); + Assert.That(Entry(r, "emptydir").IsDirectory, Is.True); + Assert.That(Entry(r, "dир").IsDirectory, Is.True); + Assert.That(r.Extract(Entry(r, "dир/файл.txt")), Is.EqualTo("abc"u8.ToArray())); + Assert.That(r.Extract(Entry(r, "hello.txt")), Is.EqualTo(Hello)); + Assert.That(r.Extract(Entry(r, "a/b/empty.bin")), Is.Empty); + Assert.That(r.Extract(Entry(r, "big.bin")), Is.EqualTo(big)); + Assert.That(Entry(r, "big.bin").Crc, Is.EqualTo(Crc32.Compute(big))); + Assert.That(r.Entries.All(e => e.LastModified == FixtureTime)); + }); } [Test] - public void TooSmall_Throws_InvalidDataException() { - var small = new byte[] { (byte)'A', (byte)'r' }; // only 2 bytes - using var ms = new MemoryStream(small); - Assert.Throws(() => _ = new FreeArcReader(ms)); + public void Writer_NoEntries_IsReadableAndEmpty() { + using var r = Open(new FreeArcWriter().Build()); + Assert.That(r.Entries, Is.Empty); } + [TestCase("ppmd")] + [TestCase("tor:3")] + [TestCase("delta+lzma")] + public void Writer_UnsupportedMethod_Throws(string method) => + Assert.That(() => new FreeArcWriter(method), Throws.TypeOf()); + + // ── Descriptor ───────────────────────────────────────────────────────────── + [Test] - public void EmptyStream_Throws_InvalidDataException() { - using var ms = new MemoryStream(); - Assert.Throws(() => _ = new FreeArcReader(ms)); + public void Descriptor_Capabilities_AndIdentity() { + var d = new FreeArcFormatDescriptor(); + Assert.Multiple(() => { + Assert.That(d.Id, Is.EqualTo("FreeArc")); + Assert.That(d.DefaultExtension, Is.EqualTo(".arc")); + Assert.That(d.MagicSignatures[0].Bytes, Is.EqualTo("ArC\x01"u8.ToArray())); + Assert.That(d.Capabilities.HasFlag(FormatCapabilities.CanCreate), Is.True); + Assert.That(d.Capabilities.HasFlag(FormatCapabilities.CanModify), Is.True); + Assert.That(d.Capabilities.HasFlag(FormatCapabilities.SupportsDirectories), Is.True); + }); } [Test] - public void CorrectMagicButTruncatedBody_ProducesEmptyEntries() { - // 4-byte valid magic + 4-byte flags but then nothing — the reader - // treats EOF on the block-type byte as end-of-archive (no entries). - var buf = new byte[8]; - buf[0] = (byte)'A'; buf[1] = (byte)'r'; buf[2] = (byte)'C'; buf[3] = 0x01; - using var ms = new MemoryStream(buf); - var r = new FreeArcReader(ms); - Assert.That(r.Entries, Has.Count.EqualTo(0)); + public void Descriptor_ListAndExtract_RealArchive() { + var d = new FreeArcFormatDescriptor(); + var listed = d.List(new MemoryStream(Vector("dirs")), null); + Assert.That(listed.Single(e => e.Name == "emptydir").IsDirectory, Is.True); + + var dir = Path.Combine(Path.GetTempPath(), $"cwb_freearc_{Guid.NewGuid():N}"); + try { + d.Extract(new MemoryStream(Vector("dirs")), dir, null, null); + Assert.That(File.ReadAllBytes(Path.Combine(dir, "dир", "файл.txt")), Is.EqualTo("abc"u8.ToArray())); + Assert.That(Directory.Exists(Path.Combine(dir, "emptydir")), Is.True); + } finally { + try { Directory.Delete(dir, recursive: true); } catch { /* best effort */ } + } } [Test] - public void WrongMagicByte4_Throws_InvalidDataException() { - // 'A','r','C' but 0x02 instead of 0x01 - var bad = new byte[] { (byte)'A', (byte)'r', (byte)'C', 0x02, 0, 0, 0, 0, 0 }; - using var ms = new MemoryStream(bad); - Assert.Throws(() => _ = new FreeArcReader(ms)); + public void Descriptor_Create_WritesRealLayout() { + var tmp = Path.GetTempFileName(); + try { + File.WriteAllBytes(tmp, Hello); + using var ms = new MemoryStream(); + ((IArchiveCreatable)new FreeArcFormatDescriptor()).Create(ms, + [new ArchiveInputInfo(tmp, "x/hello.txt", false), new ArchiveInputInfo("", "x", true)], + new FormatCreateOptions()); + ms.Position = 0; + using var r = new FreeArcReader(ms); + Assert.That(r.Extract(Entry(r, "x/hello.txt")), Is.EqualTo(Hello)); + Assert.That(Entry(r, "x").IsDirectory, Is.True); + Assert.That(ms.ToArray()[..4], Is.EqualTo("ArC\x01"u8.ToArray())); + } finally { + File.Delete(tmp); + } } } diff --git a/Compression.Tests/FreeArc/ReferenceVectors/README.md b/Compression.Tests/FreeArc/ReferenceVectors/README.md new file mode 100644 index 000000000..6d8f8736c --- /dev/null +++ b/Compression.Tests/FreeArc/ReferenceVectors/README.md @@ -0,0 +1,31 @@ +# FreeArc reference archives + +Every `.arc` file here was written by FreeArc 0.67 (2014-03-15) `Arc.exe`, taken from the `bin` +folder of `FreeArc-console-0.67-alpha-win32.exe` (Wayback Machine copy of +`freearc.org/download/testing/`), on Windows 11. FreeArc is GPL/freeware and is used only as a black +box; see `docs/FREEARC-ON-DISK.md`. + +Inputs (all files and directories touched to 2024-01-02 03:04:05 UTC; FreeArc, run on Windows during +daylight saving time, recorded them as 04:04:05 UTC, and that is what the archives hold): + +| Name | Content | +|------|---------| +| `hello.txt` | `Hello, FreeArc!\n` (16 bytes) | +| `empty.bin` | 0 bytes | +| `sub/lines.txt` | `line N the quick brown fox jumps over the lazy dog\n` for N = 1..40 (2071 bytes) | +| `dир/файл.txt` | `abc` | +| `emptydir/` | empty directory | + +Each archive was made with `Arc.exe a -i0 -cfg- `: + +| File | Switches | Files | What it covers | +|------|----------|-------|----------------| +| `storing.arc` | `-m0 -dmstoring` | hello, empty, lines | everything uncompressed; our writer reproduces it byte for byte | +| `lzma.arc` | `-mlzma` | hello, empty, lines | `lzma:32kb:normal:32` data, lzma-compressed directory and footer | +| `lzma-lc4.arc` | `-mlzma:lc4:lp1:pb1` | hello, empty, lines | non-default literal/position bits | +| `dirs.arc` | `-mlzma -s- -r` | emptydir, dир (recursive), hello | directory entries, UTF-8 names, three solid blocks | +| `comment.arc` | `lzma.arc`, then `Arc.exe c comment.arc "--archive-comment=A FreeArc comment"` | | archive comment in the footer | +| `ppmd.arc` | `-mppmd` | hello, lines | `ppmd:10:48mb` — refused | +| `tornado.arc` | `-m1` | hello, lines | `rep:…+4x4:tor:…` — refused | +| `encrypted.arc` | `-mlzma -pSecret` | hello | `lzma…+aes-256/ctr:…` data — refused | +| `hdrenc.arc` | `-mlzma -hpSecret` | hello | encrypted directory — listed as `FULL.arc` + `metadata.ini` | diff --git a/Compression.Tests/FreeArc/ReferenceVectors/comment.arc b/Compression.Tests/FreeArc/ReferenceVectors/comment.arc new file mode 100644 index 0000000000000000000000000000000000000000..e446f98922ad87bc169ccbc04b742f2515ad1d17 GIT binary patch literal 448 zcmZ=Pa%N;;U}JX#(oDrA`9+y|=?nq_{`(8s)48jTGN?#;&d3*IYWs6pdwad0U!Tae z+#)-R331ow`a8(JH^{m5e@}I3^Ns^EuCHY3P>9gz{wbFd_pinCh+%L=%S_=*F*j~U z+;?T;n^(59bFY>BHvtp2&H2nio2G=hKX@;o^)_7eM@;pr1w4%UQVEh_n_eG3e73xY zOW}v%gvUaE(l!*Du9&%a#mvjUy*oDTm@V$q!FcM1@05lM>E@5-M74fd`Ty@zhhzpu z#tU!%@|uQxo*J{Q{H(lHS+#oU?qk<_^6un|J#kcGFyE8-&F=rcz>*JJ8{WR%`*4-l z?1y_UJv(;6|h*^X@Jde{y8u7vAtQzm#P=_D_jcIL=c1|No!JISinXVaut? zO|&x1O|r_%FUn2Ku}Ug2u`)JdIJD>6(FPaUIECX3ObqiFxh6*LxjV7(#6jo#36<^- z8EU#7$8W4#W5zhqP$APQZ^89B4ik7*W^aEdx3NrXS$y8jP1*g9&tB%={$h5F(^vSD h?8QCt%M0(a#s5o}0^7@h!`{9nHczcoCKOxi004t(&DsC} literal 0 HcmV?d00001 diff --git a/Compression.Tests/FreeArc/ReferenceVectors/dirs.arc b/Compression.Tests/FreeArc/ReferenceVectors/dirs.arc new file mode 100644 index 0000000000000000000000000000000000000000..c2245e0a3ecdeaf7f71b9456c755b24c0873b08f GIT binary patch literal 326 zcmZ=Pa%N;;U}JX#(oDrA`9+y|=?nq_{`(8s)48jTGN?#;&d3*IYWs6pdwad0U!VBV zsr>){zTd#WU@)U&iC5qJ|KE}u7#NrtWe@KD@cZWz-%mxQ>_@l8b*wgwmb0Jp z7v(1ASS6L1SQ#5Jgfcy0U~uf~WSU#Xz{D_*k!xb)p1Tv9SZ)Lc`23sA9Is@)d}5r} zlbu!{?6-JWJKo=|ILFUs-+@~%rkz<661q&~aug>=tn%0RKO1TqK=yFpuqUtSOf84^ I!_=pS02rc=ApigX literal 0 HcmV?d00001 diff --git a/Compression.Tests/FreeArc/ReferenceVectors/encrypted.arc b/Compression.Tests/FreeArc/ReferenceVectors/encrypted.arc new file mode 100644 index 0000000000000000000000000000000000000000..1f86897aeb343231d07ac57016fa50589314ac57 GIT binary patch literal 369 zcmZ=Pa%N;;U}JX#(oDrA`9+y|=?nq_{`(8s)48jT-eYH!exQ1&gwarcq4qV~iniFv z3zhD>hA7)GFea|~lJ_c`W0LhNZ_ehI6MYY;BpERa&ON5Jdz#r>=Z7!8)_aIZ@2<8e zdhU8{yMKV?WxMkXK7mZ@pRMVu4;4CC+dOwe?|+3|S<~K6x**%I_Jb#v>WPyUyI5Rr z^l!}HQDXZ!=;f8%oRoX9rinWpw+NP1a9-i4e}5_Ixkk(@t0S@N+TUA!yQ^BiSbA2* z10|(MVXH~LYi{tVnK$p^mt`=PTmApf^mz>+f3f9M^QC BpGp7# literal 0 HcmV?d00001 diff --git a/Compression.Tests/FreeArc/ReferenceVectors/hdrenc.arc b/Compression.Tests/FreeArc/ReferenceVectors/hdrenc.arc new file mode 100644 index 0000000000000000000000000000000000000000..20150ff1968cd41e61ae083e91894b080c8d4130 GIT binary patch literal 735 zcmb7=*-KPW0LI4|m&}2L1T`{B?7=KL_uO+=iky6jaK#*P$-4L4d(GTuMo}9IMO-4( z!Ue_58ZtF2OCKCkCKcCELwy*xGA$P>!$>NkO#g(QzVGGx!S~Y{f*e#TXBXX0s*R>} zLsD9z%H2K8mQkGOmN#JcDd~DDr5D<^4@VuvD+BRqI{)+NP>nsIAU!ckznPrybwFTHn-f)dqd3 zK!-eHzeNUzMo%()_C`&NUYB)#%5UxBf%}RRA8t4NirAh?4urjQygX!c@)-&A{CwK7 zd(Al|FIC`)RFO|hH>3(Fyl6r^2?GS#cmh)NNo+FkX#@a(Hvry<8G;0mMJ&aL7(<|7 z03kr+PNR`Pa|qG`L<%4nR+1=M;#iL46q>{=QZQCH9zzTvpM+Qi0+NM5#ycY#ahL@h z0GNWT#4t!!^{89a&}_4*6gn+wfjHl8(FxVpg&u$sgUB@R+>zU-i>`@ zJqZzUx2%5tl^@sqTqauGL(9B828NfO1(vOBB283e#7y4wY+M7`d1TvK`Tc`kcbj)> z&y5aAo_sjmXs%x+Ci@#g%Ntft)#EKyQPrIJ%Cc$w=bw=wWmoE+|B}iQf+Q;}g9(bJ z0l^9wGLWNbSwfJKSegSO5=l;`fFLR|MR15>5CVXqupm+rB eiURNsj8G_A0F*!>g;Oo4t?HNI>#Xm=Fv~xsb1EwU literal 0 HcmV?d00001 diff --git a/Compression.Tests/FreeArc/ReferenceVectors/lzma-lc4.arc b/Compression.Tests/FreeArc/ReferenceVectors/lzma-lc4.arc new file mode 100644 index 0000000000000000000000000000000000000000..8ba6afc93479f1a4f4f8347eda2610f792c3649d GIT binary patch literal 447 zcmZ=Pa%N;;U}JX#(oDrA`9+y|=?nq_{`(8s)48jTGN?#;u@?MtYCEj|e4WWI34=u% z=WhQJVp%lh@HK13WB#Al?=(@nRsM6n#Gad}Uuw#-F8bT<^1hY-FUY#-RlAkTq+Q|_ z@7CEKRJxVL*EHnw)R=AMXXUNRs?|$(-{X>ae$VL)*YUQNIo>B0l}ww=7Mmin>O+4| z+pZa}B}-l|?6xXXOx&dL=9R6ks=4vM%No`XA80k2&gvB35mdEUiC!#iRzpTxH0TfbfIaRrdR))DrR(bhFxrsSeNhKy$#zqXcu4s6AFczp?TgAY{FprUI zV&tB?6B|Fi(z$0>w@|?RVw}X;P0PwnV}mt0xx>D0ol?ZasP{){`OB1hMVzJ&Hz#-= dU3dG`|NoD7bbzhlz+p{JlgF%CZDysCA^-sV!hiq( literal 0 HcmV?d00001 diff --git a/Compression.Tests/FreeArc/ReferenceVectors/lzma.arc b/Compression.Tests/FreeArc/ReferenceVectors/lzma.arc new file mode 100644 index 0000000000000000000000000000000000000000..bf6b31aa79470d43c1f93cc0dcb6242080d69da0 GIT binary patch literal 431 zcmZ=Pa%N;;U}JX#(oDrA`9+y|=?nq_{`(8s)48jTGN?#;&d3*IYWs6pdwad0U!Tae z+#)-R331ow`a8(JH^{m5e@}I3^Ns^EuCHY3P>9gz{wbFd_pinCh+%L=%S_=*F*j~U z+;?T;n^(59bFY>BHvtp2&H2nio2G=hKX@;o^)_7eM@;pr1w4%UQVEh_n_eG3e73xY zOW}v%gvUaE(l!*Du9&%a#mvjUy*oDTm@V$q!FcM1@05lM>E@5-M74fd`Ty@zhhzpu z#tU!%@|uQxo*J{Q{H(lHS+#oU?qk<_^6un|J#kcGFyE8-&F=rcz>*JJ8{WR%`*4-l z?1y_UJv(;6|h*^X@Jde{y8u7vAtQzm#P=_D_jcIL=c1|No!JISinXVaut? zO|&x1O|r_%FUn2Ku}Ug2u`)JdIJD>6(FPaUIECX3ObqiFxh6*LxjV7(#6jo#36<^- z8EU#7$8W4#W5zhqP$APQZ^89B4ik7*W^aEdx3NrXS$y8jO*!Rj_x%5VgYN*?8V(%R P?*OOE`FcUK%72ektAKZfe0^u))V6TFB!@_g;EBr~ zGA=yb6sU}SXo!W;jD_u_|DRgG2GdW-WLx)*N0zbnq= z4)+|Xj)NC29tl+1u!6UxFK)Z^Tc5Re9&+A(7A>wiqv_P+mI+4t9>*^dlmEZ!4Fdzn zw`@68xrtVWxk*-e`9-;jIaWy}CRWBq3|-UKh*(z6;5he+fr()rBiF>pJ$ENI{we&r zsqd5Yk$u-p5?V6~YwB8ZD-`5kpDLQsaZYjX#$B6MJ^AbQB>3{&mbz_TZU6rtR|x>y T!hyqv-tq)@m#G&FV=+M+NjZJfD9%|Y*;Na*cbaSe! zyOW|XKyeg&BbtU}zh59Ekoz77`3!$6JXv9^wrc%9D^aXN*LPUGe(@6AIvcasGv#@D zk4{6Stgzo$_gr5Qr+A=foVfiV*`dDi=}M<`os5Er^hAZr&t7jfrAzJPi7-#3dD1dZ z+UCiDd2(o;9GNG_<_X^i8sPtP000LBaDV^@3~&Ge2NZCC0S6oiz<~f92*7~=90aEv|XPKvLT`wr!mXMhiLi6ScOrS+IRP=xLJPj_nqD0<7djUk)+&rvCvx&leeF* i=W02od~D}~O1bDeUzP2X#cRc(I-TzC=6U0(H~s@kyCMVt literal 0 HcmV?d00001 diff --git a/Compression.Tests/FreeArc/ReferenceVectors/tornado.arc b/Compression.Tests/FreeArc/ReferenceVectors/tornado.arc new file mode 100644 index 0000000000000000000000000000000000000000..e48877fb7bd5fc486dcf8a87079dc50338b86775 GIT binary patch literal 524 zcmZ=Pa%N;;U}JX#(oDrA`9+y|=?nq_{`(8s)48jTG5~=!2Lr<|AkECe(7?cO>&3!e zv$WTXe77cS(z~@{>rq$pE4y;r49#{vUlf&nxAj1G05c>de3=ro4aZN(p zyqtT}Y8QBz>HA|r_WowL(Kdzt)uF4y)<$j3x|+4P*X-7cv~U0a|NTF=j)9TUQGHv% z=OEv;Ulw*7ecH3$L2d2-nZJJP554j_e`#9Re%t^5-y~iDTf>3Fnw+LfzRSBElB=Tt DMHS_@ literal 0 HcmV?d00001 diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.FreeArc/FreeArcEncoding.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.FreeArc/FreeArcEncoding.cs new file mode 100644 index 000000000..7296547f7 --- /dev/null +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.FreeArc/FreeArcEncoding.cs @@ -0,0 +1,121 @@ +using System.Buffers.Binary; +using System.Numerics; +using System.Text; + +namespace FileFormat.FreeArc; + +/// +/// The primitive encodings of the FreeArc container: the variable-length integer, the C string +/// and the block-type numbers. See docs/FREEARC-ON-DISK.md. +/// +internal static class FreeArcEncoding { + /// "ArC\x01" read as a little-endian 32-bit value; opens the archive and every block descriptor. + public const uint Signature = 0x01437241; + + /// The version word FreeArc 0.67 writes after the signature in the header block. + public const uint ArchiveVersion = 0x07060000; + + /// How far from the end of the archive the footer descriptor may start. + public const int FooterScanWindow = 4096; + + public const int BlockHeader = 1; + public const int BlockData = 2; + public const int BlockDirectory = 3; + public const int BlockFooter = 4; + public const int BlockRecovery = 5; + + /// Reads one variable-length integer: the count of low one-bits in the first byte tells how many more bytes follow. + public static ulong ReadVarInt(ReadOnlySpan buffer, ref int position) { + if (position >= buffer.Length) + throw new InvalidDataException("FreeArc: integer runs past the end of the block."); + + var first = buffer[position]; + var extra = BitOperations.TrailingZeroCount(~(uint)first); + if (extra >= 8) { + // A first byte of all ones announces a plain 64-bit value in the next eight bytes. + if (position + 9 > buffer.Length) + throw new InvalidDataException("FreeArc: integer runs past the end of the block."); + var wide = BinaryPrimitives.ReadUInt64LittleEndian(buffer.Slice(position + 1, 8)); + position += 9; + return wide; + } + + var length = extra + 1; + if (position + length > buffer.Length) + throw new InvalidDataException("FreeArc: integer runs past the end of the block."); + + ulong value = 0; + for (var i = length - 1; i >= 0; --i) + value = (value << 8) | buffer[position + i]; + position += length; + return value >> length; + } + + /// Reads a variable-length integer that must fit a non-negative . + public static int ReadCount(ReadOnlySpan buffer, ref int position) { + var value = ReadVarInt(buffer, ref position); + if (value > int.MaxValue) + throw new InvalidDataException("FreeArc: count out of range."); + return (int)value; + } + + /// Reads a variable-length integer that must fit a non-negative . + public static long ReadSize(ReadOnlySpan buffer, ref int position) { + var value = ReadVarInt(buffer, ref position); + if (value > long.MaxValue) + throw new InvalidDataException("FreeArc: size out of range."); + return (long)value; + } + + /// Writes one variable-length integer in the shortest form. + public static void WriteVarInt(Stream output, ulong value) { + Span buffer = stackalloc byte[9]; + for (var length = 1; length <= 8; ++length) { + if (value >= 1UL << (7 * length)) + continue; + + var encoded = (value << length) | ((1UL << (length - 1)) - 1); + for (var i = 0; i < length; ++i) + buffer[i] = (byte)(encoded >> (8 * i)); + output.Write(buffer[..length]); + return; + } + + buffer[0] = 0xFF; + BinaryPrimitives.WriteUInt64LittleEndian(buffer[1..], value); + output.Write(buffer); + } + + /// Reads a NUL-terminated UTF-8 string. + public static string ReadString(ReadOnlySpan buffer, ref int position) { + var rest = buffer[Math.Min(position, buffer.Length)..]; + var end = rest.IndexOf((byte)0); + if (end < 0) + throw new InvalidDataException("FreeArc: unterminated string."); + var text = Encoding.UTF8.GetString(rest[..end]); + position += end + 1; + return text; + } + + /// Writes a NUL-terminated UTF-8 string. + public static void WriteString(Stream output, string text) { + output.Write(Encoding.UTF8.GetBytes(text)); + output.WriteByte(0); + } + + /// Reads a little-endian 32-bit value. + public static uint ReadUInt32(ReadOnlySpan buffer, ref int position) { + if (position + 4 > buffer.Length) + throw new InvalidDataException("FreeArc: field runs past the end of the block."); + var value = BinaryPrimitives.ReadUInt32LittleEndian(buffer.Slice(position, 4)); + position += 4; + return value; + } + + /// Writes a little-endian 32-bit value. + public static void WriteUInt32(Stream output, uint value) { + Span buffer = stackalloc byte[4]; + BinaryPrimitives.WriteUInt32LittleEndian(buffer, value); + output.Write(buffer); + } +} diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.FreeArc/FreeArcEntry.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.FreeArc/FreeArcEntry.cs index b7103a984..3abc3e7df 100644 --- a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.FreeArc/FreeArcEntry.cs +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.FreeArc/FreeArcEntry.cs @@ -1,19 +1,37 @@ namespace FileFormat.FreeArc; -/// Represents a single file entry within a FreeArc archive. +/// Represents a single file or directory recorded in a FreeArc directory block. public sealed class FreeArcEntry { - /// The file name as stored in the archive directory block. + /// The full stored path, with / as separator. public string Name { get; init; } = ""; /// The uncompressed size of the file in bytes. public long Size { get; init; } - /// The compressed size of the file data in bytes. + /// + /// The compressed size of the solid block that holds this file, reported on the block's first + /// file only (FreeArc does not record per-file compressed sizes); zero on the others. + /// public long CompressedSize { get; init; } - /// The compression method string (e.g. "storing", "lzma", "freearc"). - public string Method { get; init; } = "storing"; + /// The method string of the solid block holding this file, e.g. lzma:32kb:normal:32. + public string Method { get; init; } = FreeArcMethods.Storing; - /// The byte offset within the data payload where this file's data begins. - internal long DataOffset { get; init; } + /// Whether this entry is a directory. + public bool IsDirectory { get; init; } + + /// The modification time (stored as 32-bit Unix seconds), in UTC. + public DateTime? LastModified { get; init; } + + /// The CRC-32 of the uncompressed file contents. + public uint Crc { get; init; } + + /// The solid data block holding this file. + internal FreeArcDataBlock Block { get; init; } = null!; + + /// The byte offset of this file inside the decoded solid block. + internal long OffsetInBlock { get; init; } } + +/// A solid data block: one compressed stream holding the concatenated contents of consecutive files. +internal sealed record FreeArcDataBlock(string Compressor, long Position, long CompressedSize, long OriginalSize); diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.FreeArc/FreeArcFormatDescriptor.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.FreeArc/FreeArcFormatDescriptor.cs index 2f870b213..80712a35e 100644 --- a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.FreeArc/FreeArcFormatDescriptor.cs +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.FreeArc/FreeArcFormatDescriptor.cs @@ -1,19 +1,26 @@ #pragma warning disable CS1591 +using System.Text; using Compression.Registry; using static Compression.Registry.FormatHelpers; namespace FileFormat.FreeArc; /// -/// Format descriptor for FreeArc compressed archives (.arc). +/// Format descriptor for FreeArc archives (.arc, signature ArC\x01). /// /// References: /// +/// docs/FREEARC-ON-DISK.md — the layout this implementation follows, derived from FreeArc's sources and checked against FreeArc 0.67's output /// https://github.com/Bulat-Ziganshin/FA — FreeArc'Next by FreeArc's author, Bulat Ziganshin (the original freearc.org site is defunct) /// https://en.wikipedia.org/wiki/FreeArc — Wikipedia overview -/// No formal specification — the archive layout is defined by the original FreeArc sources /// /// +/// +/// Reads real FreeArc archives; extracts solid blocks compressed with storing or lzma +/// and refuses every other method (tornado, ppmd, lzp, grzip, rep, delta, exe, ...) and encryption. +/// Writes storing/lzma archives that FreeArc 0.67's unarc and arc +/// test and extract byte-identically. +/// public sealed class FreeArcFormatDescriptor : IFormatDescriptor, IArchiveFormatOperations, IArchiveCreatable, IArchiveModifiable, IArchiveDefragmentable, IArchiveLayoutMap { /// Rebuild-based defrag: extracts then re-creates the FreeArc archive in listing order. @@ -25,10 +32,10 @@ public void Defragment(Stream archive, DefragOptions options) { DefragRebuilder.Rebuild(archive, options, readEntries: stream => { var r = new FreeArcReader(stream, leaveOpen: true); - return r.Entries.Select(e => (e.Name, r.Extract(e))); + return r.Entries.Where(e => !e.IsDirectory).Select(e => (e.Name, r.Extract(e))).ToList(); }, buildImage: files => { - var w = new FreeArcWriter(); + var w = new FreeArcWriter("lzma"); foreach (var (n, d) in files) w.AddFile(n, d); return w.Build(); }); @@ -37,11 +44,10 @@ public void Defragment(Stream archive, DefragOptions options) { /// public IEnumerable EnumerateLayout(Stream archive) { archive.Position = 0; - var r = new FreeArcReader(archive); - foreach (var e in r.Entries) { + var r = new FreeArcReader(archive, leaveOpen: true); + foreach (var e in r.Entries) if (e.CompressedSize > 0) - yield return new DefragBlockInfo(e.DataOffset, e.CompressedSize, DefragBlockKind.Used, FileName: e.Name); - } + yield return new DefragBlockInfo(e.Block.Position, e.CompressedSize, DefragBlockKind.Used, FileName: e.Name); } /// @@ -53,17 +59,13 @@ public IEnumerable EnumerateLayout(Stream archive) { /// public FormatCategory Category => FormatCategory.Archive; + // R/W: Add/Replace/Remove go through the verified extract -> edit -> re-create rebuild + // (default IArchiveModifiable). The writer's output is accepted by FreeArc 0.67 itself. /// - // R/W: a mutable archive. Add/Replace/Remove go through the verified extract -> - // edit -> re-create rebuild (default IArchiveModifiable); relayouting the container - // on edit is honest R/W. See FormatCapabilities.cs (WORM vs R/W). - /// - /// Gets the capabilities. - /// public FormatCapabilities Capabilities => FormatCapabilities.CanList | FormatCapabilities.CanExtract | FormatCapabilities.CanCreate | - FormatCapabilities.CanModify | - FormatCapabilities.CanTest | FormatCapabilities.SupportsMultipleEntries; + FormatCapabilities.CanModify | FormatCapabilities.CanTest | + FormatCapabilities.SupportsMultipleEntries | FormatCapabilities.SupportsDirectories; /// public string DefaultExtension => ".arc"; @@ -75,17 +77,12 @@ public IEnumerable EnumerateLayout(Stream archive) { public IReadOnlyList CompoundExtensions => []; /// - // "ArC\x01" — the four-byte signature that opens every FreeArc archive. - // Confidence is set high (0.95) because the combination of 'r', 'C' and 0x01 - // makes accidental collisions with the legacy ARC format (which uses 0x1A) extremely unlikely. - /// - /// Gets the magic signatures. - /// + // "ArC\x01" opens every FreeArc archive; the legacy SEA ARC format starts with 0x1A instead. public IReadOnlyList MagicSignatures => [new([(byte)'A', (byte)'r', (byte)'C', 0x01], Confidence: 0.95)]; /// - public IReadOnlyList Methods => [new("freearc", "FreeArc")]; + public IReadOnlyList Methods => [new("lzma", "LZMA"), new(FreeArcMethods.Storing, "Storing")]; /// public string? TarCompressionFormatId => null; @@ -94,30 +91,66 @@ public IEnumerable EnumerateLayout(Stream archive) { public AlgorithmFamily Family => AlgorithmFamily.Archive; /// - public string Description => "FreeArc compressed archive"; + public string Description => "FreeArc archive"; /// public List List(Stream stream, string? password) { - using var r = new FreeArcReader(stream, leaveOpen: true); - return r.Entries.Select((e, i) => - new ArchiveEntryInfo(i, e.Name, e.Size, e.CompressedSize, e.Method, false, false, null)) - .ToList(); + try { + using var r = new FreeArcReader(stream, leaveOpen: true); + return r.Entries.Select((e, i) => new ArchiveEntryInfo(i, e.Name, e.Size, e.CompressedSize, e.Method, + e.IsDirectory, FreeArcMethods.IsEncrypted(e.Method), e.LastModified)).ToList(); + } catch (Exception ex) when (ex is NotSupportedException or InvalidDataException) { + // Encrypted headers or a directory compressed with a method we lack: expose the raw archive. + return [ + new(0, "FULL.arc", stream.Length, stream.Length, FreeArcMethods.Storing, false, false, null), + new(1, "metadata.ini", Metadata(ex).Length, Metadata(ex).Length, FreeArcMethods.Storing, false, false, null), + ]; + } } /// public void Extract(Stream stream, string outputDir, string? password, string[]? files) { - using var r = new FreeArcReader(stream, leaveOpen: true); - foreach (var e in r.Entries) { - if (files != null && !MatchesFilter(e.Name, files)) continue; - WriteFile(outputDir, e.Name, r.Extract(e)); + FreeArcReader r; + try { + r = new FreeArcReader(stream, leaveOpen: true); + } catch (Exception ex) when (ex is NotSupportedException or InvalidDataException) { + stream.Position = 0; + using var raw = new MemoryStream(); + stream.CopyTo(raw); + if (files == null || MatchesFilter("FULL.arc", files)) WriteFile(outputDir, "FULL.arc", raw.ToArray()); + if (files == null || MatchesFilter("metadata.ini", files)) WriteFile(outputDir, "metadata.ini", Metadata(ex)); + return; + } + + using (r) { + foreach (var e in r.Entries) { + if (files != null && !MatchesFilter(e.Name, files)) continue; + if (e.IsDirectory) + Directory.CreateDirectory(Path.Combine(outputDir, e.Name.Replace('/', Path.DirectorySeparatorChar))); + else + WriteFile(outputDir, e.Name, r.Extract(e)); + } } } /// public void Create(Stream output, IReadOnlyList inputs, FormatCreateOptions options) { - var w = new FreeArcWriter(); - foreach (var (name, data) in FormatHelpers.FilesOnly(inputs)) - w.AddFile(name, data); - output.Write(w.Build()); + var method = options.MethodName?.Trim().ToLowerInvariant() switch { + null or "" or "lzma" => options.DictSize > 0 ? $"lzma:{Math.Max(4096, options.DictSize)}b" : "lzma", + var m => m, + }; + var w = new FreeArcWriter(method); + foreach (var input in inputs) { + var modified = input.Metadata?.LastWriteTimeUtc?.UtcDateTime + ?? (input.InMemoryContent == null && File.Exists(input.FullPath) ? File.GetLastWriteTimeUtc(input.FullPath) : (DateTime?)null); + if (input.IsDirectory) + w.AddDirectory(input.ArchiveName, modified); + else + w.AddFile(input.ArchiveName, input.ReadContent(), modified); + } + w.WriteTo(output); } + + private static byte[] Metadata(Exception ex) => + Encoding.UTF8.GetBytes($"format=FreeArc\nparse_status=partial\nreason={ex.Message.ReplaceLineEndings(" ")}\n"); } diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.FreeArc/FreeArcMethods.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.FreeArc/FreeArcMethods.cs new file mode 100644 index 000000000..e005149b3 --- /dev/null +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.FreeArc/FreeArcMethods.cs @@ -0,0 +1,151 @@ +using System.Globalization; +using Compression.Core.Dictionary.Lzma; + +namespace FileFormat.FreeArc; + +/// +/// FreeArc compression method strings: name:param:param... stages joined by +, applied +/// left to right when compressing and therefore undone right to left when extracting. +/// +/// +/// Only the stages our own codecs reproduce exactly are decoded: storing and lzma +/// (a raw LZMA1 stream with no properties header; dictionary and lc/lp/pb come from the method +/// string). Everything else — tornado, lzp, ppmd, grzip, rep, dict, delta, exe, mm, external +/// compressors and encryption — is refused with . +/// +public static class FreeArcMethods { + /// The method name of an uncompressed stage. + public const string Storing = "storing"; + + private static readonly string[] EncryptionNames = ["aes", "blowfish", "serpent", "twofish"]; + + /// Splits a method string into its stages. + public static string[] Stages(string compressor) => compressor.Split('+'); + + /// Gets whether every stage of can be decoded. + public static bool IsSupported(string compressor) => + Stages(compressor).All(stage => StageName(stage) is Storing or "lzma"); + + /// Gets whether contains an encryption stage. + public static bool IsEncrypted(string compressor) => + Stages(compressor).Any(stage => EncryptionNames.Any(e => StageName(stage).StartsWith(e, StringComparison.OrdinalIgnoreCase))); + + /// Decodes produced by into exactly bytes. + /// A stage is encrypted or uses a codec this library does not implement. + /// The stream does not decode to the expected size. + public static byte[] Decode(string compressor, byte[] input, long outputSize) { + if (IsEncrypted(compressor)) + throw new NotSupportedException($"FreeArc: encrypted data (method \"{compressor}\") is not supported."); + + var stages = Stages(compressor); + foreach (var stage in stages) + if (StageName(stage) is not (Storing or "lzma")) + throw new NotSupportedException($"FreeArc: compression method \"{StageName(stage)}\" (in \"{compressor}\") is not supported."); + + var data = input; + for (var i = stages.Length - 1; i >= 0; --i) + data = DecodeStage(stages[i], data, i == 0 ? outputSize : -1); + + if (data.LongLength != outputSize) + throw new InvalidDataException($"FreeArc: \"{compressor}\" decoded to {data.LongLength} bytes, expected {outputSize}."); + return data; + } + + /// Encodes with a single supported stage. + public static byte[] Encode(string compressor, ReadOnlySpan input) { + var stages = Stages(compressor); + if (stages.Length != 1) + throw new NotSupportedException($"FreeArc: writing chained method \"{compressor}\" is not supported."); + + switch (StageName(stages[0])) { + case Storing: + return input.ToArray(); + case "lzma": { + var p = LzmaParameters.Parse(stages[0], input.Length); + var encoder = new LzmaEncoder((int)Math.Clamp(p.Dictionary, 4096, 1L << 30), p.Lc, p.Lp, p.Pb); + using var output = new MemoryStream(); + encoder.Encode(output, input, writeEndMarker: true); + return output.ToArray(); + } + default: + throw new NotSupportedException($"FreeArc: writing method \"{compressor}\" is not supported."); + } + } + + /// + /// Gives a bare lzma stage an explicit dictionary (the next power of two covering the + /// input, 64 KiB to 64 MiB) so FreeArc's decoder does not reserve its much larger default. + /// + public static string WithDictionary(string compressor, long inputLength) { + if (StageName(compressor) != "lzma" || compressor.Split(':').Skip(1).Any(t => LzmaParameters.IsSize(t.Trim().ToLowerInvariant()))) + return compressor; + var dictionary = 1L << 16; + while (dictionary < inputLength && dictionary < 1L << 26) + dictionary <<= 1; + var size = dictionary >= 1L << 20 ? $"{dictionary >> 20}mb" : $"{dictionary >> 10}kb"; + var colon = compressor.IndexOf(':'); + return colon < 0 ? $"lzma:{size}" : $"lzma:{size}{compressor[colon..]}"; + } + + private static string StageName(string stage) { + var colon = stage.IndexOf(':'); + return (colon < 0 ? stage : stage[..colon]).Trim().ToLowerInvariant(); + } + + private static byte[] DecodeStage(string stage, byte[] input, long outputSize) { + if (StageName(stage) == Storing) + return input; + + var p = LzmaParameters.Parse(stage, outputSize); + using var source = new MemoryStream(input, writable: false); + var dictionary = (int)Math.Clamp(Math.Max(p.Dictionary, outputSize), 4096, int.MaxValue); + return new LzmaDecoder(source, p.Lc, p.Lp, p.Pb, dictionary, outputSize).Decode(); + } + + /// lzma stage parameters: tokens with a size suffix are the dictionary, lcN/lpN/pbN the literal and position bits; mode, match finder, fast bytes and mcN only steer the encoder. + private readonly record struct LzmaParameters(long Dictionary, int Lc, int Lp, int Pb) { + public static LzmaParameters Parse(string stage, long fallbackDictionary) { + long dictionary = -1; + int lc = 3, lp = 0, pb = 2; + foreach (var raw in stage.Split(':').Skip(1)) { + var token = raw.Trim().ToLowerInvariant(); + if (TryBits(token, "lc", 8, ref lc) || TryBits(token, "lp", 4, ref lp) || TryBits(token, "pb", 4, ref pb)) + continue; + if (TrySize(token, out var size)) + dictionary = size; + } + + return new(dictionary > 0 ? dictionary : Math.Max(fallbackDictionary, 1 << 16), lc, lp, pb); + } + + private static bool TryBits(string token, string prefix, int max, ref int value) { + if (!token.StartsWith(prefix, StringComparison.Ordinal) + || !int.TryParse(token.AsSpan(prefix.Length), NumberStyles.None, CultureInfo.InvariantCulture, out var parsed)) + return false; + if (parsed > max) + throw new InvalidDataException($"FreeArc: lzma parameter \"{token}\" out of range."); + value = parsed; + return true; + } + + public static bool IsSize(string token) => TrySize(token, out _); + + private static bool TrySize(string token, out long size) { + size = 0; + var (digits, multiplier) = token switch { + _ when token.EndsWith("gb", StringComparison.Ordinal) => (token[..^2], 1L << 30), + _ when token.EndsWith("mb", StringComparison.Ordinal) => (token[..^2], 1L << 20), + _ when token.EndsWith("kb", StringComparison.Ordinal) => (token[..^2], 1L << 10), + _ when token.EndsWith('g') => (token[..^1], 1L << 30), + _ when token.EndsWith('m') => (token[..^1], 1L << 20), + _ when token.EndsWith('k') => (token[..^1], 1L << 10), + _ when token.EndsWith('b') => (token[..^1], 1L), + _ => ("", 0L), + }; + if (multiplier == 0 || !long.TryParse(digits, NumberStyles.None, CultureInfo.InvariantCulture, out var value)) + return false; + size = value * multiplier; + return true; + } + } +} diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.FreeArc/FreeArcReader.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.FreeArc/FreeArcReader.cs index 97cfa1b7f..413d63f92 100644 --- a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.FreeArc/FreeArcReader.cs +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.FreeArc/FreeArcReader.cs @@ -1,225 +1,281 @@ -#pragma warning disable CS1591 -using System.Buffers.Binary; -using System.Text; +using Compression.Core.Checksums; +using static FileFormat.FreeArc.FreeArcEncoding; namespace FileFormat.FreeArc; /// -/// Reads FreeArc archives (.arc). -/// -/// This implementation parses a well-defined binary subset of the FreeArc container -/// format that is produced by and understood by this reader. -/// -/// -/// Binary layout (all integers are little-endian): -/// -/// 4 bytes — magic "ArC\x01" -/// 4 bytes — uint32 archive flags (reserved, currently 0) -/// One or more blocks, each preceded by a 1-byte block type: -/// -/// 0x01 = directory block -/// 0x02 = data block -/// 0x00 = end-of-archive marker -/// -/// -/// -/// -/// -/// Directory block payload: -/// -/// uint32 — number of file entries -/// Per entry: uint16 nameLen + UTF-8 name + uint64 size + uint64 compressedSize + uint64 dataOffset + uint16 methodLen + ASCII method -/// -/// -/// -/// Data block payload: -/// -/// uint32 — payload length in bytes -/// payload bytes (concatenated raw file data) -/// -/// +/// Reads real FreeArc archives (.arc, signature ArC\x01) as written by FreeArc 0.4x–0.67. /// +/// +/// The archive is located from its end: the footer block's descriptor sits in the last 4 KiB, the +/// footer lists the control blocks (header, directories, recovery) and each directory block lists +/// its solid data blocks and files. Every control block and descriptor is CRC-checked; file data is +/// checked against the per-file CRC-32 on extraction. Layout in docs/FREEARC-ON-DISK.md. +/// Data whose method this library cannot decode (see ) is listed but +/// refused on extraction. +/// public sealed class FreeArcReader : IDisposable { - /// Magic bytes at the start of every FreeArc archive. - public static readonly byte[] Magic = [(byte)'A', (byte)'r', (byte)'C', 0x01]; - - private const byte BlockTypeEnd = 0x00; - private const byte BlockTypeDir = 0x01; - private const byte BlockTypeData = 0x02; - private readonly Stream _stream; - private readonly bool _leaveOpen; - private readonly byte[] _dataBuf; // full concatenated data payload - private bool _disposed; + private readonly bool _leaveOpen; + private readonly List _entries = []; + private FreeArcDataBlock? _cachedBlock; + private byte[]? _cachedData; - /// Gets all file entries found in the archive directory. - public IReadOnlyList Entries { get; } + /// Gets all files and directories recorded in the archive's directory blocks, in archive order. + public IReadOnlyList Entries => this._entries; - /// - /// Initialises a new and parses the archive. - /// - /// A readable stream positioned at the start of a FreeArc archive. - /// - /// to leave open after this reader is disposed; - /// to close it. - /// - /// Thrown when is . - /// Thrown when the archive signature is missing or the structure is malformed. - public FreeArcReader(Stream stream, bool leaveOpen = false) { - _stream = stream ?? throw new ArgumentNullException(nameof(stream)); - _leaveOpen = leaveOpen; - - // Validate magic. - Span hdr = stackalloc byte[4]; - ReadExact(hdr); - if (hdr[0] != 'A' || hdr[1] != 'r' || hdr[2] != 'C' || hdr[3] != 0x01) - throw new InvalidDataException("Invalid FreeArc magic bytes."); - - // Archive flags (reserved). - Span flagBuf = stackalloc byte[4]; - ReadExact(flagBuf); - // flags currently unused - - // Read blocks sequentially. - var entries = new List(); - var dataBufs = new List(); - - while (true) { - var b = _stream.ReadByte(); - if (b < 0 || b == BlockTypeEnd) break; - - switch ((byte)b) { - case BlockTypeDir: - ParseDirectoryBlock(entries); - break; - case BlockTypeData: - dataBufs.Add(ReadDataBlock()); - break; - default: - throw new InvalidDataException($"Unknown FreeArc block type 0x{b:X2}."); - } - } + /// Gets the size of the data preceding the archive proper (an SFX module), or zero. + public long SfxSize { get; private set; } - // Merge all data blocks into a single flat buffer so Extract() can index by offset. - var totalData = dataBufs.Sum(d => d.Length); - _dataBuf = new byte[totalData]; - var pos = 0; - foreach (var chunk in dataBufs) { - chunk.CopyTo(_dataBuf, pos); - pos += chunk.Length; - } + /// Gets whether the archive is locked against further modification. + public bool IsLocked { get; private set; } - Entries = entries; - } + /// Gets the archive comment, or an empty string. + public string Comment { get; private set; } = ""; - // ── Extraction ─────────────────────────────────────────────────────────── + /// Opens a FreeArc archive and reads its footer and directory blocks. + /// A readable, seekable stream holding the archive. + /// to leave open on dispose. + /// The stream is not a FreeArc archive or its structure is corrupt. + /// A directory block is encrypted or compressed with an unsupported method. + public FreeArcReader(Stream stream, bool leaveOpen = false) { + ArgumentNullException.ThrowIfNull(stream); + if (!stream.CanRead || !stream.CanSeek) + throw new ArgumentException("FreeArc needs a readable, seekable stream.", nameof(stream)); + this._stream = stream; + this._leaveOpen = leaveOpen; + this.ReadStructure(); + } - /// - /// Extracts and returns the raw (uncompressed) bytes for the specified entry. - /// - /// The to extract. - /// - /// The file data as a byte array, or an empty array when the entry has zero size. - /// - /// Thrown when is . - /// Thrown when the data offset or size is out of range. + /// Extracts the contents of , verifying its CRC-32. + /// The entry's solid block uses an unsupported or encrypted method. + /// The data is corrupt. public byte[] Extract(FreeArcEntry entry) { ArgumentNullException.ThrowIfNull(entry); + if (entry.IsDirectory || entry.Size == 0) + return []; - if (entry.Size == 0) return []; + var block = this.DecodeBlock(entry.Block); + if (entry.OffsetInBlock + entry.Size > block.LongLength) + throw new InvalidDataException($"FreeArc: \"{entry.Name}\" lies outside its solid block."); - var offset = entry.DataOffset; - var size = entry.Size; + var data = block.AsSpan((int)entry.OffsetInBlock, (int)entry.Size).ToArray(); + if (Crc32.Compute(data) != entry.Crc) + throw new InvalidDataException($"FreeArc: \"{entry.Name}\" failed its CRC check."); + return data; + } - if (offset < 0 || offset + size > _dataBuf.Length) - throw new InvalidDataException( - $"Entry '{entry.Name}': data offset {offset} + size {size} exceeds data buffer ({_dataBuf.Length} bytes)."); + /// + public void Dispose() { + if (!this._leaveOpen) + this._stream.Dispose(); + } - var result = new byte[size]; - _dataBuf.AsSpan((int)offset, (int)size).CopyTo(result); - return result; + private byte[] DecodeBlock(FreeArcDataBlock block) { + if (ReferenceEquals(block, this._cachedBlock)) + return this._cachedData!; + + var compressed = this.ReadAt(block.Position, block.CompressedSize); + var data = FreeArcMethods.Decode(block.Compressor, compressed, block.OriginalSize); + this._cachedBlock = block; + this._cachedData = data; + return data; } - // ── Block parsers ──────────────────────────────────────────────────────── - - private void ParseDirectoryBlock(List entries) { - // Hoist fixed-size scratch buffers outside the loop to satisfy CA2014. - Span buf2 = stackalloc byte[2]; - Span buf4 = stackalloc byte[4]; - Span buf8 = stackalloc byte[8]; - - // uint32 LE — entry count - ReadExact(buf4); - var count = BinaryPrimitives.ReadUInt32LittleEndian(buf4); - - for (var i = 0; i < count; i++) { - // uint16 LE name length - ReadExact(buf2); - var nameLen = BinaryPrimitives.ReadUInt16LittleEndian(buf2); - if (nameLen > 4096) throw new InvalidDataException("FreeArc directory: name length too large."); - - var nameBytes = new byte[nameLen]; - ReadExact(nameBytes); - var name = Encoding.UTF8.GetString(nameBytes); - - // uint64 LE uncompressed size - ReadExact(buf8); - var size = (long)BinaryPrimitives.ReadUInt64LittleEndian(buf8); - - // uint64 LE compressed size - ReadExact(buf8); - var compressedSize = (long)BinaryPrimitives.ReadUInt64LittleEndian(buf8); - - // uint64 LE data offset (byte offset within the concatenated data payload) - ReadExact(buf8); - var dataOffset = (long)BinaryPrimitives.ReadUInt64LittleEndian(buf8); - - // uint16 LE method length + ASCII method string - ReadExact(buf2); - var methodLen = BinaryPrimitives.ReadUInt16LittleEndian(buf2); - var methodBytes = new byte[methodLen]; - ReadExact(methodBytes); - var method = Encoding.ASCII.GetString(methodBytes); - - entries.Add(new FreeArcEntry { - Name = name, - Size = size, - CompressedSize = compressedSize, - DataOffset = dataOffset, - Method = method, - }); + private void ReadStructure() { + var footer = this.FindFooter(); + var footerData = this.ReadControlBlock(footer); + + var p = 0; + var count = ReadCount(footerData, ref p); + var controls = new List(count); + for (var i = 0; i < count; ++i) { + var type = ReadCount(footerData, ref p); + var compressor = ReadString(footerData, ref p); + var relative = ReadSize(footerData, ref p); + var original = ReadSize(footerData, ref p); + var compressed = ReadSize(footerData, ref p); + var crc = ReadUInt32(footerData, ref p); + var position = footer.Position - relative; + if (position < 0 || position + compressed > footer.Position) + throw new InvalidDataException("FreeArc: footer lists a block outside the archive."); + controls.Add(new(type, compressor, position, original, compressed, crc)); } - } - private byte[] ReadDataBlock() { - // uint32 LE payload length - Span buf4 = stackalloc byte[4]; - ReadExact(buf4); - var len = BinaryPrimitives.ReadUInt32LittleEndian(buf4); + if (p < footerData.Length) + this.IsLocked = footerData[p++] != 0; + if (p < footerData.Length) { + // Pre-0.60 comment: a list of UCS-4 code points. + var legacyLength = ReadCount(footerData, ref p); + var chars = new System.Text.StringBuilder(); + for (var i = 0; i < legacyLength; ++i) + chars.Append(char.ConvertFromUtf32((int)ReadUInt32(footerData, ref p))); + this.Comment = chars.ToString(); + } + if (p < footerData.Length) + _ = ReadString(footerData, ref p); // recovery-record setting + if (p < footerData.Length) { + var commentLength = ReadCount(footerData, ref p); + if (p + commentLength > footerData.Length) + throw new InvalidDataException("FreeArc: comment runs past the footer."); + if (commentLength > 0) + this.Comment = System.Text.Encoding.UTF8.GetString(footerData, p, commentLength); + } - var data = new byte[len]; - ReadExact(data); - return data; + this.SfxSize = controls.Count > 0 ? Math.Max(0, controls.Min(c => c.Position)) : 0; + + foreach (var control in controls.Where(c => c.Type == BlockDirectory)) + this.ReadDirectory(control, this.ReadControlBlock(control)); } - // ── Low-level I/O ──────────────────────────────────────────────────────── + private void ReadDirectory(ControlBlock directory, byte[] dir) { + var p = 0; + var blockCount = ReadCount(dir, ref p); + var filesPerBlock = new int[blockCount]; + for (var i = 0; i < blockCount; ++i) + filesPerBlock[i] = ReadCount(dir, ref p); + var compressors = new string[blockCount]; + for (var i = 0; i < blockCount; ++i) + compressors[i] = ReadString(dir, ref p); + var offsets = new long[blockCount]; + for (var i = 0; i < blockCount; ++i) + offsets[i] = ReadSize(dir, ref p); + var compSizes = new long[blockCount]; + for (var i = 0; i < blockCount; ++i) + compSizes[i] = ReadSize(dir, ref p); + + var dirCount = ReadCount(dir, ref p); + var dirNames = new string[dirCount]; + for (var i = 0; i < dirCount; ++i) + dirNames[i] = ReadString(dir, ref p).Replace('\\', '/'); + + long total = 0; + foreach (var n in filesPerBlock) + total += n; + if (total > dir.Length) + throw new InvalidDataException("FreeArc: directory claims more files than it can hold."); + var files = (int)total; + + var names = new string[files]; + for (var i = 0; i < files; ++i) + names[i] = ReadString(dir, ref p).Replace('\\', '/'); + var dirNumbers = new int[files]; + for (var i = 0; i < files; ++i) { + dirNumbers[i] = ReadCount(dir, ref p); + if (dirNumbers[i] >= dirCount) + throw new InvalidDataException("FreeArc: file refers to a directory name that does not exist."); + } + var sizes = new long[files]; + for (var i = 0; i < files; ++i) + sizes[i] = ReadSize(dir, ref p); + var times = new uint[files]; + for (var i = 0; i < files; ++i) + times[i] = ReadUInt32(dir, ref p); + if (p + files > dir.Length) + throw new InvalidDataException("FreeArc: directory flags run past the block."); + var isDir = new bool[files]; + for (var i = 0; i < files; ++i) + isDir[i] = dir[p++] != 0; + var crcs = new uint[files]; + for (var i = 0; i < files; ++i) + crcs[i] = ReadUInt32(dir, ref p); + // Optional tagged fields follow, ending with tag 0; FreeArc 0.67 writes none. + + var file = 0; + for (var b = 0; b < blockCount; ++b) { + long blockSize = 0; + for (var k = 0; k < filesPerBlock[b]; ++k) + blockSize += sizes[file + k]; + + var position = directory.Position - offsets[b]; + if (position < 0 || position + compSizes[b] > directory.Position) + throw new InvalidDataException("FreeArc: directory lists a data block outside the archive."); + var block = new FreeArcDataBlock(compressors[b], position, compSizes[b], blockSize); + + long offset = 0; + for (var k = 0; k < filesPerBlock[b]; ++k, ++file) { + var folder = dirNames[dirNumbers[file]]; + this._entries.Add(new() { + Name = folder.Length == 0 ? names[file] : folder.TrimEnd('/') + "/" + names[file], + Size = sizes[file], + CompressedSize = k == 0 ? compSizes[b] : 0, + Method = compressors[b], + IsDirectory = isDir[file], + LastModified = DateTime.UnixEpoch.AddSeconds(times[file]), + Crc = crcs[file], + Block = block, + OffsetInBlock = offset, + }); + offset += sizes[file]; + } + } + } - private void ReadExact(Span buf) { - var read = 0; - while (read < buf.Length) { - var n = _stream.Read(buf[read..]); - if (n == 0) - throw new InvalidDataException( - $"FreeArc: unexpected end of stream (needed {buf.Length} bytes, got {read})."); - read += n; + /// Scans the last 4 KiB backwards for a descriptor that checks out as the footer's. + private ControlBlock FindFooter() { + var length = this._stream.Length; + if (length < 16) + throw new InvalidDataException("FreeArc: too small to be an archive."); + + var windowStart = Math.Max(0, length - FooterScanWindow); + var window = this.ReadAt(windowStart, length - windowStart); + for (var at = window.Length - 4; at >= 0; --at) { + if (window[at] != 'A' || window[at + 1] != 'r' || window[at + 2] != 'C' || window[at + 3] != 1) + continue; + if (TryParseDescriptor(window.AsSpan(at), windowStart + at, out var block) && block.Type == BlockFooter) + return block; } + + throw new InvalidDataException("FreeArc: no footer block descriptor in the last 4 KiB — not a FreeArc archive or truncated."); } - /// - public void Dispose() { - if (!_disposed) { - _disposed = true; - if (!_leaveOpen) _stream.Dispose(); + /// + /// A descriptor: signature, type, compressor, original size, compressed size, CRC of the block's + /// decoded contents, then the CRC of the descriptor itself. The block precedes its descriptor. + /// The footer's descriptor runs to the end of the archive. + /// + private static bool TryParseDescriptor(ReadOnlySpan descriptor, long position, out ControlBlock block) { + block = default; + if (descriptor.Length < 12) + return false; + var body = descriptor[..^4]; + if (Crc32.Compute(body) != System.Buffers.Binary.BinaryPrimitives.ReadUInt32LittleEndian(descriptor[^4..])) + return false; + + try { + var p = 4; + var type = ReadCount(body, ref p); + var compressor = ReadString(body, ref p); + var original = ReadSize(body, ref p); + var compressed = ReadSize(body, ref p); + var crc = ReadUInt32(body, ref p); + if (p != body.Length || compressed > position) + return false; + block = new(type, compressor, position - compressed, original, compressed, crc); + return true; + } catch (InvalidDataException) { + return false; } } + + private byte[] ReadControlBlock(ControlBlock block) { + if (block.Original > int.MaxValue || block.Compressed > int.MaxValue) + throw new InvalidDataException("FreeArc: control block too large."); + var compressed = this.ReadAt(block.Position, block.Compressed); + var data = FreeArcMethods.Decode(block.Compressor, compressed, block.Original); + if (Crc32.Compute(data) != block.Crc) + throw new InvalidDataException($"FreeArc: control block at {block.Position} failed its CRC check."); + return data; + } + + private byte[] ReadAt(long position, long count) { + if (position < 0 || count < 0 || position + count > this._stream.Length || count > int.MaxValue) + throw new InvalidDataException("FreeArc: block lies outside the archive."); + var buffer = new byte[count]; + this._stream.Position = position; + this._stream.ReadExactly(buffer); + return buffer; + } + + private readonly record struct ControlBlock(int Type, string Compressor, long Position, long Original, long Compressed, uint Crc); } diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.FreeArc/FreeArcWriter.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.FreeArc/FreeArcWriter.cs index e7a4691a7..b20499d46 100644 --- a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.FreeArc/FreeArcWriter.cs +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.FreeArc/FreeArcWriter.cs @@ -1,88 +1,172 @@ -#pragma warning disable CS1591 -using System.Buffers.Binary; -using System.Text; +using Compression.Core.Checksums; +using static FileFormat.FreeArc.FreeArcEncoding; namespace FileFormat.FreeArc; /// -/// Builds minimal FreeArc archives (.arc) that can be read by . -/// -/// All files are stored without compression (method "storing"). The writer produces -/// the exact binary layout described in : magic, archive flags, -/// a single directory block, a single data block, and the end-of-archive marker. -/// +/// Writes real FreeArc archives that FreeArc 0.67's arc and unarc list, test and extract. /// +/// +/// The layout is FreeArc's own (docs/FREEARC-ON-DISK.md): a header block, the solid data +/// blocks, one directory block and the footer block, each control block followed by its CRC-checked +/// descriptor. Directories go into an empty storing block of their own, as FreeArc does; all +/// files share one solid block compressed with the chosen method — storing or lzma. +/// The directory and footer blocks are stored uncompressed. +/// public sealed class FreeArcWriter { - private readonly List<(string Name, byte[] Data)> _files = []; - - /// Adds a file to the archive being built. - /// The filename as it will appear in the archive directory. - /// The raw file data to store. - public void AddFile(string name, byte[] data) => _files.Add((name, data)); - - /// - /// Serialises the archive and returns it as a byte array. - /// - /// The complete FreeArc archive bytes. - public byte[] Build() { - using var ms = new MemoryStream(); - - // Magic + archive flags (zero). - ms.Write(FreeArcReader.Magic); - ms.Write(stackalloc byte[4]); // flags = 0 - - // Compute per-file data offsets within the concatenated payload. - var offsets = new long[_files.Count]; - long dataPos = 0; - for (var i = 0; i < _files.Count; i++) { - offsets[i] = dataPos; - dataPos += _files[i].Data.Length; - } - - // --- Directory block --- - ms.WriteByte(0x01); // BlockTypeDir - - Span buf4 = stackalloc byte[4]; - Span buf2 = stackalloc byte[2]; - Span buf8 = stackalloc byte[8]; - - BinaryPrimitives.WriteUInt32LittleEndian(buf4, (uint)_files.Count); - ms.Write(buf4); + private readonly List<(string Name, byte[] Data, DateTime Modified)> _files = []; + private readonly List<(string Name, DateTime Modified)> _directories = []; + + /// Creates a writer that compresses the file block with . + /// storing, or lzma with optional FreeArc parameters such as lzma:1mb. + public FreeArcWriter(string method = FreeArcMethods.Storing) { + var name = method.Split(':')[0].Trim().ToLowerInvariant(); + if (method.Contains('+') || name is not (FreeArcMethods.Storing or "lzma")) + throw new NotSupportedException($"FreeArc: writing method \"{method}\" is not supported (storing or lzma only)."); + this.Method = method; + } - for (var i = 0; i < _files.Count; i++) { - var (name, data) = _files[i]; - var nameBytes = Encoding.UTF8.GetBytes(name); - var methodBytes = Encoding.ASCII.GetBytes("storing"); + /// Gets the method string used for the file block. + public string Method { get; } - BinaryPrimitives.WriteUInt16LittleEndian(buf2, (ushort)nameBytes.Length); - ms.Write(buf2); - ms.Write(nameBytes); + /// Adds a file. + public void AddFile(string name, byte[] data, DateTime? modified = null) { + ArgumentNullException.ThrowIfNull(name); + ArgumentNullException.ThrowIfNull(data); + this._files.Add((Normalize(name), data, modified ?? DateTime.UtcNow)); + } - BinaryPrimitives.WriteUInt64LittleEndian(buf8, (ulong)data.Length); - ms.Write(buf8); // uncompressed size + /// Adds a directory entry. + public void AddDirectory(string name, DateTime? modified = null) { + ArgumentNullException.ThrowIfNull(name); + this._directories.Add((Normalize(name), modified ?? DateTime.UtcNow)); + } - BinaryPrimitives.WriteUInt64LittleEndian(buf8, (ulong)data.Length); - ms.Write(buf8); // compressed size (same — stored) + /// Builds the archive. + public byte[] Build() { + using var output = new MemoryStream(); + this.WriteTo(output); + return output.ToArray(); + } - BinaryPrimitives.WriteUInt64LittleEndian(buf8, (ulong)offsets[i]); - ms.Write(buf8); // data offset + /// Writes the archive to , which must be positioned at its start. + public void WriteTo(Stream output) { + ArgumentNullException.ThrowIfNull(output); + using var archive = new MemoryStream(); + + // Header block: signature + version, then its descriptor. + var header = new MemoryStream(); + WriteUInt32(header, Signature); + WriteUInt32(header, ArchiveVersion); + var headerBlock = WriteControlBlock(archive, BlockHeader, header.ToArray()); + + // Data blocks: directories in an empty storing block, files in one solid block. + var blocks = new List<(int Files, string Compressor, long Position, long Size)>(); + var entries = new List<(string Name, long Size, DateTime Modified, bool IsDir, uint Crc)>(); + if (this._directories.Count > 0) { + blocks.Add((this._directories.Count, FreeArcMethods.Storing, archive.Position, 0)); + foreach (var (name, modified) in this._directories) + entries.Add((name, 0, modified, true, 0)); + } + if (this._files.Count > 0) { + using var solid = new MemoryStream(); + foreach (var (name, data, modified) in this._files) { + solid.Write(data); + entries.Add((name, data.LongLength, modified, false, Crc32.Compute(data))); + } + var method = FreeArcMethods.WithDictionary(this.Method, solid.Length); + var compressed = FreeArcMethods.Encode(method, solid.ToArray()); + blocks.Add((this._files.Count, method, archive.Position, compressed.LongLength)); + archive.Write(compressed); + } - BinaryPrimitives.WriteUInt16LittleEndian(buf2, (ushort)methodBytes.Length); - ms.Write(buf2); - ms.Write(methodBytes); + var directoryPosition = archive.Position; + var directoryBlock = WriteControlBlock(archive, BlockDirectory, BuildDirectory(blocks, entries, directoryPosition)); + + var footerPosition = archive.Position; + var footer = new MemoryStream(); + WriteVarInt(footer, 2); + foreach (var block in new[] { headerBlock, directoryBlock }) { + WriteVarInt(footer, (ulong)block.Type); + WriteString(footer, FreeArcMethods.Storing); + WriteVarInt(footer, (ulong)(footerPosition - block.Position)); + WriteVarInt(footer, (ulong)block.Size); + WriteVarInt(footer, (ulong)block.Size); + WriteUInt32(footer, block.Crc); } + footer.WriteByte(0); // not locked + WriteVarInt(footer, 0); // no legacy (UCS-4) comment + WriteString(footer, ""); // no recovery-record setting + WriteVarInt(footer, 0); // no comment + WriteControlBlock(archive, BlockFooter, footer.ToArray()); + + archive.Position = 0; + archive.CopyTo(output); + } - // --- Data block --- - ms.WriteByte(0x02); // BlockTypeData + private static byte[] BuildDirectory( + List<(int Files, string Compressor, long Position, long Size)> blocks, + List<(string Name, long Size, DateTime Modified, bool IsDir, uint Crc)> entries, + long directoryPosition) { + var dir = new MemoryStream(); + WriteVarInt(dir, (ulong)blocks.Count); + foreach (var b in blocks) WriteVarInt(dir, (ulong)b.Files); + foreach (var b in blocks) WriteString(dir, b.Compressor); + foreach (var b in blocks) WriteVarInt(dir, (ulong)(directoryPosition - b.Position)); + foreach (var b in blocks) WriteVarInt(dir, (ulong)b.Size); + + var folders = new List(); + var folderIndex = new Dictionary(StringComparer.Ordinal); + var numbers = new List(); + var baseNames = new List(); + foreach (var e in entries) { + var slash = e.Name.LastIndexOf('/'); + var folder = slash < 0 ? "" : e.Name[..slash]; + baseNames.Add(slash < 0 ? e.Name : e.Name[(slash + 1)..]); + if (!folderIndex.TryGetValue(folder, out var index)) { + index = folders.Count; + folderIndex[folder] = index; + folders.Add(folder); + } + numbers.Add(index); + } - BinaryPrimitives.WriteUInt32LittleEndian(buf4, (uint)dataPos); - ms.Write(buf4); - foreach (var (_, data) in _files) - ms.Write(data); + WriteVarInt(dir, (ulong)folders.Count); + foreach (var f in folders) WriteString(dir, f); + foreach (var n in baseNames) WriteString(dir, n); + foreach (var n in numbers) WriteVarInt(dir, (ulong)n); + foreach (var e in entries) WriteVarInt(dir, (ulong)e.Size); + foreach (var e in entries) WriteUInt32(dir, ToUnixTime(e.Modified)); + foreach (var e in entries) dir.WriteByte(e.IsDir ? (byte)1 : (byte)0); + foreach (var e in entries) WriteUInt32(dir, e.Crc); + WriteVarInt(dir, 0); // end of optional fields + return dir.ToArray(); + } - // --- End-of-archive marker --- - ms.WriteByte(0x00); + /// Writes a stored control block followed by its descriptor and the descriptor's CRC. + private static (int Type, long Position, long Size, uint Crc) WriteControlBlock(Stream archive, int type, byte[] data) { + var position = archive.Position; + archive.Write(data); + var crc = Crc32.Compute(data); + + var descriptor = new MemoryStream(); + WriteUInt32(descriptor, Signature); + WriteVarInt(descriptor, (ulong)type); + WriteString(descriptor, FreeArcMethods.Storing); + WriteVarInt(descriptor, (ulong)data.LongLength); + WriteVarInt(descriptor, (ulong)data.LongLength); + WriteUInt32(descriptor, crc); + var body = descriptor.ToArray(); + archive.Write(body); + WriteUInt32(archive, Crc32.Compute(body)); + return (type, position, data.LongLength, crc); + } - return ms.ToArray(); + private static uint ToUnixTime(DateTime time) { + var utc = time.Kind == DateTimeKind.Local ? time.ToUniversalTime() : time; + var seconds = (long)(utc - DateTime.UnixEpoch).TotalSeconds; + return (uint)Math.Clamp(seconds, 0, uint.MaxValue); } + + private static string Normalize(string name) => name.Replace('\\', '/').Trim('/'); } diff --git a/Hawkynt.FileFormats.Archives/README.md b/Hawkynt.FileFormats.Archives/README.md index 19f330c8f..c3d21dc19 100644 --- a/Hawkynt.FileFormats.Archives/README.md +++ b/Hawkynt.FileFormats.Archives/README.md @@ -121,7 +121,7 @@ Every State, Test, Maintenance, Compress/Decompress and Demux/Mux/Remux cell is | [DMS](https://en.wikipedia.org/wiki/Disk_Masher_System) | `Dms` | `.dms` | WORM | ✅ | defrag | | [GitHub](https://github.com/markrabjohn/xDMS) | | [EGG (ALZip)](https://en.wikipedia.org/wiki/EGG_(file_format)) | `Egg` | `.egg` | WORM | ✅ | defrag | | [GitHub](https://github.com/alkegi/docs/blob/master/egg.md) | | [ESD](https://en.wikipedia.org/wiki/Windows_Imaging_Format) | `Esd` | `.esd` | WORM | ✅ | wipe | Solid LZMS WIM; created images carry a metadata resource but entries re-list as resources | [Microsoft Learn](https://learn.microsoft.com/en-us/windows-hardware/manufacture/desktop/wim-and-esd-windows-image-files-overview) | -| [FreeArc](https://en.wikipedia.org/wiki/FreeArc) | `FreeArc` | `.arc` | R/W | ✅ | defrag · wipe | | [GitHub](https://github.com/Bulat-Ziganshin/FA) | +| [FreeArc](https://en.wikipedia.org/wiki/FreeArc) | `FreeArc` | `.arc` | R/W | ✅ | defrag · wipe | Reads FreeArc 0.67 archives; decodes storing and lzma blocks only (tornado, ppmd, lzp, grzip, rep, delta, exe and encryption are refused). Writes storing/lzma archives that FreeArc 0.67 extracts byte-identically. Layout: [FREEARC-ON-DISK.md](https://github.com/Hawkynt/CompressionWorkbench/blob/main/docs/FREEARC-ON-DISK.md) | [GitHub](https://github.com/Bulat-Ziganshin/FA) | | HA | `Ha` | `.ha` | R/W | ✅ | defrag · wipe | | [Archive Team](http://fileformats.archiveteam.org/wiki/HA) | | [IFF CDAF](https://en.wikipedia.org/wiki/Interchange_File_Format) | `IffCdaf` | `.cdaf` | R/W | ✅ | defrag · wipe | | [Aminet](https://aminet.net) | | [LBR](https://en.wikipedia.org/wiki/LBR_(file_format)) | `Lbr` | `.lbr` | R/W | ✅ | defrag · wipe | | [gaby.de](http://www.gaby.de/cpm/manuals/archive/lbr.txt) | diff --git a/Hawkynt.FileFormats.Archives/REFERENCE.md b/Hawkynt.FileFormats.Archives/REFERENCE.md index 08ea63067..0df10d396 100644 --- a/Hawkynt.FileFormats.Archives/REFERENCE.md +++ b/Hawkynt.FileFormats.Archives/REFERENCE.md @@ -16762,30 +16762,33 @@ Implements `IArchiveFormatOperations`, `IFormatDescriptor`. ### Namespace `FileFormat.FreeArc` -[`FreeArcEntry`](#freearcentry) · [`FreeArcFormatDescriptor`](#freearcformatdescriptor) · [`FreeArcReader`](#freearcreader) · [`FreeArcWriter`](#freearcwriter) +[`FreeArcEntry`](#freearcentry) · [`FreeArcFormatDescriptor`](#freearcformatdescriptor) · [`FreeArcMethods`](#freearcmethods) · [`FreeArcReader`](#freearcreader) · [`FreeArcWriter`](#freearcwriter) #### `FreeArcEntry` -Represents a single file entry within a FreeArc archive. +Represents a single file or directory recorded in a FreeArc directory block. | Member | Signature | Summary | | --- | --- | --- | | `FreeArcEntry` | `FreeArcEntry()` | | -| `CompressedSize` | `long CompressedSize { get; init; }` | The compressed size of the file data in bytes. | -| `Method` | `string Method { get; init; }` | The compression method string (e.g. "storing", "lzma", "freearc"). | -| `Name` | `string Name { get; init; }` | The file name as stored in the archive directory block. | +| `CompressedSize` | `long CompressedSize { get; init; }` | The compressed size of the solid block that holds this file, reported on the block's first file only (FreeArc does not record per-file compressed sizes); zero on the others. | +| `Crc` | `uint Crc { get; init; }` | The CRC-32 of the uncompressed file contents. | +| `IsDirectory` | `bool IsDirectory { get; init; }` | Whether this entry is a directory. | +| `LastModified` | `DateTime? LastModified { get; init; }` | The modification time (stored as 32-bit Unix seconds), in UTC. | +| `Method` | `string Method { get; init; }` | The method string of the solid block holding this file, e.g. `lzma:32kb:normal:32`. | +| `Name` | `string Name { get; init; }` | The full stored path, with `/` as separator. | | `Size` | `long Size { get; init; }` | The uncompressed size of the file in bytes. | #### `FreeArcFormatDescriptor` -Format descriptor for FreeArc compressed archives (.arc). References: `https://github.com/Bulat-Ziganshin/FA` — FreeArc'Next by FreeArc's author, Bulat Ziganshin (the original freearc.org site is defunct)`https://en.wikipedia.org/wiki/FreeArc` — Wikipedia overviewNo formal specification — the archive layout is defined by the original FreeArc sources +Format descriptor for FreeArc archives (.arc, signature `ArC\x01`). References: `docs/FREEARC-ON-DISK.md` — the layout this implementation follows, derived from FreeArc's sources and checked against FreeArc 0.67's output`https://github.com/Bulat-Ziganshin/FA` — FreeArc'Next by FreeArc's author, Bulat Ziganshin (the original freearc.org site is defunct)`https://en.wikipedia.org/wiki/FreeArc` — Wikipedia overview Implements `IArchiveCreatable`, `IArchiveDefragmentable`, `IArchiveFormatOperations`, `IArchiveLayoutMap`, `IArchiveModifiable`, `IArchivePurgeable`, `IFormatDescriptor`, `IWipeEmpty`. | Member | Signature | Summary | | --- | --- | --- | | `FreeArcFormatDescriptor` | `FreeArcFormatDescriptor()` | | -| `Capabilities` | `FormatCapabilities Capabilities { get; }` | Gets the capabilities. | +| `Capabilities` | `FormatCapabilities Capabilities { get; }` | | | `Category` | `FormatCategory Category { get; }` | | | `CompoundExtensions` | `IReadOnlyList CompoundExtensions { get; }` | | | `DefaultExtension` | `string DefaultExtension { get; }` | | @@ -16794,7 +16797,7 @@ Implements `IArchiveCreatable`, `IArchiveDefragmentable`, `IArchiveFormatOperati | `Extensions` | `IReadOnlyList Extensions { get; }` | | | `Family` | `AlgorithmFamily Family { get; }` | | | `Id` | `string Id { get; }` | | -| `MagicSignatures` | `IReadOnlyList MagicSignatures { get; }` | Gets the magic signatures. | +| `MagicSignatures` | `IReadOnlyList MagicSignatures { get; }` | | | `Methods` | `IReadOnlyList Methods { get; }` | | | `TarCompressionFormatId` | `string TarCompressionFormatId { get; }` | | | `Create` | `void Create(Stream output, IReadOnlyList inputs, FormatCreateOptions options)` | | @@ -16804,29 +16807,48 @@ Implements `IArchiveCreatable`, `IArchiveDefragmentable`, `IArchiveFormatOperati | `Extract` | `void Extract(Stream stream, string outputDir, string password, string[] files)` | | | `List` | `List List(Stream stream, string password)` | | +#### `FreeArcMethods` + +FreeArc compression method strings: `name:param:param...` stages joined by `+`, applied left to right when compressing and therefore undone right to left when extracting. + +| Member | Signature | Summary | +| --- | --- | --- | +| `Storing` | `const string Storing` | The method name of an uncompressed stage. | +| `Decode` | `static byte[] Decode(string compressor, byte[] input, long outputSize)` | Decodes `input` produced by `compressor` into exactly `outputSize` bytes. | +| `Encode` | `static byte[] Encode(string compressor, ReadOnlySpan input)` | Encodes `input` with a single supported stage. | +| `IsEncrypted` | `static bool IsEncrypted(string compressor)` | Gets whether `compressor` contains an encryption stage. | +| `IsSupported` | `static bool IsSupported(string compressor)` | Gets whether every stage of `compressor` can be decoded. | +| `Stages` | `static string[] Stages(string compressor)` | Splits a method string into its stages. | +| `WithDictionary` | `static string WithDictionary(string compressor, long inputLength)` | Gives a bare `lzma` stage an explicit dictionary (the next power of two covering the input, 64 KiB to 64 MiB) so FreeArc's decoder does not reserve its much larger default. | + #### `FreeArcReader` -Reads FreeArc archives (.arc). This implementation parses a well-defined binary subset of the FreeArc container format that is produced by `FreeArcWriter` and understood by this reader. Binary layout (all integers are little-endian): 4 bytes — magic "ArC\x01"4 bytes — uint32 archive flags (reserved, currently 0)One or more blocks, each preceded by a 1-byte block type: 0x01 = directory block0x02 = data block0x00 = end-of-archive marker Directory block payload: uint32 — number of file entriesPer entry: uint16 nameLen + UTF-8 name + uint64 size + uint64 compressedSize + uint64 dataOffset + uint16 methodLen + ASCII method Data block payload: uint32 — payload length in bytespayload bytes (concatenated raw file data) +Reads real FreeArc archives (`.arc`, signature `ArC\x01`) as written by FreeArc 0.4x–0.67. Implements `IDisposable`. | Member | Signature | Summary | | --- | --- | --- | -| `FreeArcReader` | `FreeArcReader(Stream stream, bool leaveOpen = false)` | Initialises a new `FreeArcReader` and parses the archive. | -| `Magic` | `static readonly byte[] Magic` | Magic bytes at the start of every FreeArc archive. | -| `Entries` | `IReadOnlyList Entries { get; }` | Gets all file entries found in the archive directory. | +| `FreeArcReader` | `FreeArcReader(Stream stream, bool leaveOpen = false)` | Opens a FreeArc archive and reads its footer and directory blocks. | +| `Comment` | `string Comment { get; }` | Gets the archive comment, or an empty string. | +| `Entries` | `IReadOnlyList Entries { get; }` | Gets all files and directories recorded in the archive's directory blocks, in archive order. | +| `IsLocked` | `bool IsLocked { get; }` | Gets whether the archive is locked against further modification. | +| `SfxSize` | `long SfxSize { get; }` | Gets the size of the data preceding the archive proper (an SFX module), or zero. | | `Dispose` | `void Dispose()` | | -| `Extract` | `byte[] Extract(FreeArcEntry entry)` | Extracts and returns the raw (uncompressed) bytes for the specified entry. | +| `Extract` | `byte[] Extract(FreeArcEntry entry)` | Extracts the contents of `entry`, verifying its CRC-32. | #### `FreeArcWriter` -Builds minimal FreeArc archives (.arc) that can be read by `FreeArcReader`. All files are stored without compression (method "storing"). The writer produces the exact binary layout described in `FreeArcReader`: magic, archive flags, a single directory block, a single data block, and the end-of-archive marker. +Writes real FreeArc archives that FreeArc 0.67's `arc` and `unarc` list, test and extract. | Member | Signature | Summary | | --- | --- | --- | -| `FreeArcWriter` | `FreeArcWriter()` | | -| `AddFile` | `void AddFile(string name, byte[] data)` | Adds a file to the archive being built. | -| `Build` | `byte[] Build()` | Serialises the archive and returns it as a byte array. | +| `FreeArcWriter` | `FreeArcWriter(string method = "storing")` | Creates a writer that compresses the file block with `method`. | +| `Method` | `string Method { get; }` | Gets the method string used for the file block. | +| `AddDirectory` | `void AddDirectory(string name, DateTime? modified = null)` | Adds a directory entry. | +| `AddFile` | `void AddFile(string name, byte[] data, DateTime? modified = null)` | Adds a file. | +| `Build` | `byte[] Build()` | Builds the archive. | +| `WriteTo` | `void WriteTo(Stream output)` | Writes the archive to `output`, which must be positioned at its start. | ### Namespace `FileFormat.Freeze` diff --git a/docs/FREEARC-ON-DISK.md b/docs/FREEARC-ON-DISK.md new file mode 100644 index 000000000..b096b1751 --- /dev/null +++ b/docs/FREEARC-ON-DISK.md @@ -0,0 +1,130 @@ +# FreeArc on disk + +The container layout of FreeArc archives (`.arc`, signature `ArC\x01`) as FreeArc 0.4x–0.67 writes +them, and what `FileFormat.FreeArc` does with each part. + +## 🔎 Provenance + +- **Licence.** FreeArc's sources (Bulat Ziganshin, 2004–2014) are GPL-2.0; the 0.67 binaries carry + a freeware usage licence. Neither can be absorbed into this LGPL-3.0-or-later repository, so this + is rung 2 of the sourcing ladder: the sources were *read* to write this document, the + implementation was written from this document, and FreeArc 0.67 is the oracle. No FreeArc code, + file layout or identifier names were carried across. +- **Sources read.** The SVN snapshot mirrored at `github.com/svn2github/freearc`: `Unarc/ArcStructure.h` + (the C++ reader of footer and directory), `ArhiveStructure.hs`, `ArhiveDirectory.hs`, + `ByteStream.hs` and `Compression.hs` (the Haskell writer). +- **Oracle.** FreeArc 0.67 (2014-03-15) `Arc.exe` and `unarc.exe`, from the self-extracting + `FreeArc-console-0.67-alpha-win32.exe` (Wayback Machine copy of freearc.org/download/testing), + run on Windows 11. Every structure below was checked against hex dumps of archives it wrote; the + checked-in fixtures are in `Compression.Tests/FreeArc/ReferenceVectors/`. + +## 🧱 Primitives + +All fixed-width integers are little-endian. + +| Primitive | Encoding | +|-----------|----------| +| integer | Variable length, 1–9 bytes. The number of trailing one-bits in the first byte, *n*, says the value occupies *n*+1 bytes: read those bytes little-endian and shift right by *n*+1. So `xxxxxxx0` holds 7 bits, `…01` 14 bits, `…011` 21 bits, up to `01111111` + 7 bytes = 56 bits. A first byte `0xFF` is followed by a plain 64-bit value. Writers use the shortest form. Measured: `10` = 8, `AA` = 85, `31 A4` = 10508. | +| string | UTF-8 bytes, NUL-terminated. | +| list of *T* | An integer count, then the elements — except where a count is implied (see the directory block). | +| bool | One byte, 0 or 1. Lists of bools are *not* bit-packed. | +| CRC | CRC-32 (the zlib/PKZIP polynomial `0xEDB88320`, initial and final XOR `0xFFFFFFFF`), 4 bytes. `"Hello, FreeArc!\n"` → `2B27C831`. | +| time | 32-bit Unix seconds, UTC. | + +## 🗂️ Archive structure + +An archive is a sequence of blocks. Data blocks hold file contents; every other block is a +*control block* and is immediately followed by its *descriptor*: + +``` +signature "ArC\x01" 4 bytes +type integer 0 descriptor, 1 header, 2 data, 3 directory, 4 footer, 5 recovery +compressor string method that encoded the block +origsize integer decoded size +compsize integer encoded size; the block starts compsize bytes before the descriptor +crc CRC of the decoded block +dcrc CRC of all descriptor bytes before it +``` + +FreeArc 0.67 lays an archive out as: + +| Offset | Content | +|--------|---------| +| 0 | Header block: `ArC\x01` + version word `00 00 06 07` (8 bytes, `storing`), then its descriptor. Anything before the header block is an SFX module. | +| … | Data blocks (solid blocks), no descriptors. | +| … | Directory block (compressed with `-dm`, default `lzma:1mb:normal:bt4:32`), then its descriptor. | +| … | Footer block (same method), then its descriptor, which runs to the end of the file. | + +A reader starts at the end: the footer's descriptor begins within the last 4096 bytes. FreeArc takes +the last `ArC\x01` in that window; our reader scans backwards and takes the first candidate whose +descriptor CRC checks out and whose type is footer, which tolerates the signature appearing inside +compressed data. + +### Footer block + +``` +blocks list of (type integer, compressor string, relpos integer, origsize integer, compsize integer, crc CRC) +locked bool archive locked against modification +oldcomment list of 32-bit code points pre-UTF-8 comment, written empty by 0.67 +recovery string recovery-record setting (optional, absent in old archives) +comment list of bytes UTF-8 comment (optional) +``` + +`relpos` is the distance from the start of *this footer block* back to the listed block. FreeArc +0.67 lists the header block and every directory block (and the recovery block when there is one). +The trailing fields are optional: a reader stops at the end of the block. + +### Directory block + +The positions of data blocks are relative to the start of *this directory block*. The per-block and +per-file lists carry no counts of their own; their lengths are the block count and the file total. + +``` +nblocks integer +files[nblocks] integer each files in each solid block +methods[nblocks] string each compressor of each solid block +relpos[nblocks] integer each distance back from the directory block +compsize[nblocks] integer each +ndirs integer +dirs[ndirs] string each directory names, "/"-separated; "" for the root +-- nfiles = sum(files) -- +names[nfiles] string each base names +dirnum[nfiles] integer each index into dirs +size[nfiles] integer each +time[nfiles] time each +isdir[nfiles] bool each +crc[nfiles] CRC each 0 for directories +tag integer optional tagged fields would follow; 0 ends them (0.67 writes only 0) +``` + +Files belong to solid blocks in order: the first `files[0]` files are the contents of block 0 +concatenated, and so on. A data block's decoded size is therefore the sum of its files' sizes; it is +not stored anywhere. FreeArc puts directory entries (size 0) into a zero-length `storing` block of +their own. The full name of a file is `dirs[dirnum] + "/" + name` (or just `name` for the root). +A directory entry `a/b` is stored as name `b` in directory `a`. + +## 🧪 Methods + +A compressor string is one or more stages joined by `+`, each `name:param:param…`, applied left to +right on compression; extraction undoes them right to left. Seen from 0.67: + +| Method string | Meaning | Here | +|---------------|---------|------| +| `storing` | Uncompressed. | ✅ read + write | +| `lzma:32kb:normal:32[:pb1:lc4:lp1][:mc4]` | Raw LZMA1 range-coded stream, **no properties header**; the dictionary is the token with a size suffix, `lcN`/`lpN`/`pbN` override the defaults 3/0/2, everything else steers only the encoder. FreeArc shrinks the dictionary to the data size. | ✅ read + write (we write an end marker) | +| `ppmd:10:48mb` | PPMd var. I (order, memory). Our PPMd I model is not verified against FreeArc's stream. | ❌ refused | +| `tor:…`, `4x4:…`, `rep:…`, `lzp:…`, `grzip:…`, `dict:…`, `delta`, `exe`, `mm`, external compressors | FreeArc's own codecs and filters, no compatible implementation here. | ❌ refused | +| `…+aes-256/ctr:n1000:r0:i…:s…:c…` (also blowfish, serpent, twofish) | Encryption stage (`-p`, or `-hp` for headers too). | ❌ refused | + +A refused method still lists: only extraction of that block fails, with `NotSupportedException`. An +archive whose directory or footer is unreadable (`-hp`, or an unsupported `-dm` method) lists as +`FULL.arc` + `metadata.ini` with `parse_status=partial`. + +## ✍️ What our writer emits + +Header block, a zero-length `storing` block for directory entries (when there are any), one solid +block for all files (`storing` or `lzma:[:lcN:lpN:pbN]`), then a `storing` directory block +and a `storing` footer listing the header and directory blocks. For `storing` input in FreeArc's +order with FreeArc's timestamps this is byte-identical to `arc a -m0 -dmstoring` (pinned by +`Writer_Storing_ReproducesFreeArcByteForByte`). FreeArc 0.67's `unarc t/x` and `arc t/lb/x` accept +our `storing` and `lzma` archives and extract them byte-identically (`FreeArcOracleTests`). diff --git a/docs/catalogue/GAPS.md b/docs/catalogue/GAPS.md index 5ac828100..e32d9b445 100644 --- a/docs/catalogue/GAPS.md +++ b/docs/catalogue/GAPS.md @@ -169,7 +169,7 @@ running real-world samples. The file named at the end of each row is where the l | ALZip | `AlZip` | 3 | store and deflate only (AlZipReader.cs) | | APFS | `Apfs` | 3 | no decmpfs (LZVN/LZFSE) compressed files, no encryption (ApfsReader.cs) | | Compiled HTML Help (CHM) | `Chm` | 3 | content sections above 1 unsupported (ChmReader.cs) | -| FreeArc | `FreeArc` | 3 | reader/writer use a simplified private layout with no codecs; real FreeArc archives are not readable (FreeArcReader.cs) | +| FreeArc | `FreeArc` | 3 | only storing and lzma blocks decode; tornado/ppmd/lzp/grzip/rep/delta/exe and encryption are refused (FreeArcMethods.cs) | | NSIS installer | `Nsis` | 3 | solid installers cannot be extracted per entry (NsisReader.cs) | | NTFS | `Ntfs` | 3 | WOF (XPRESS/LZX) compressed files not decoded; LZNT1 is | | QCOW / QCOW2 | `Qcow2` | 3 | no encryption, backing files, zstd clusters or extended L2 (Qcow2Structures.cs) | @@ -212,6 +212,10 @@ running real-world samples. The file named at the end of each row is where the l writer and reader agree with each other. - **Stale comments.** The "(not supported)" comments in `ArcConstants.cs` describe methods the reader does decode. +- **Capability claims against real files.** `Zpaq` declares `CanCreate | CanModify`, but does not + read an archive written by the real tool. Its round-trip only proves that our writer and reader + agree with each other. (`FreeArc` now reads FreeArc 0.67's archives and FreeArc accepts ours; see + `docs/FREEARC-ON-DISK.md`.) ## ➕ Ours only diff --git a/docs/catalogue/reference-formats.csv b/docs/catalogue/reference-formats.csv index 516676341..56c5deac3 100644 --- a/docs/catalogue/reference-formats.csv +++ b/docs/catalogue/reference-formats.csv @@ -55,7 +55,7 @@ Spark (Acorn),spk;arc,archive,,,,,,,Y,1,https://en.wikipedia.org/wiki/Spark_(arc HA,ha,archive,,,,,,,Y,1,https://en.wikipedia.org/wiki/HA_(file_format),Ha,Y,Y,Y,PARTIAL,,stored only; HSC and ASC throw (HaReader.cs) SQX,sqx,archive,,,,,,,Y,1,https://en.wikipedia.org/wiki/SQX,Sqx,Y,Y,Y,OK,, UHARC,uha,archive,,,,,R,,Y,2,https://en.wikipedia.org/wiki/UHarc,Uharc,Y,Y,Y,PARTIAL,,stored and LZP only (UharcReader.cs) -FreeArc,arc;cdx,archive,,,,,R,fmt/1096,Y,3,https://en.wikipedia.org/wiki/FreeArc,FreeArc,Y,Y,Y,PARTIAL,,reader/writer use a simplified private layout with no codecs; real FreeArc archives are not readable (FreeArcReader.cs) +FreeArc,arc;cdx,archive,,,,,R,fmt/1096,Y,3,https://en.wikipedia.org/wiki/FreeArc,FreeArc,Y,Y,Y,PARTIAL,,only storing and lzma blocks decode; tornado/ppmd/lzp/grzip/rep/delta/exe and encryption are refused (FreeArcMethods.cs) ZPAQ,zpaq,archive,,,,,R,fmt/1097,RW,3,https://mattmahoney.net/dc/zpaq206.pdf,Zpaq,Y,Y,Y,PARTIAL,,reads only the stored blocks our own writer emits; ZPAQL-compressed blocks (every real zpaq level) throw (ZpaqReader.cs) PAQ (paq6/7/8 family),paq6;paq7;paq8;paq8l,archive,,,,,,,Y,1,https://mattmahoney.net/dc/paq.html,Paq8,Y,Y,,PARTIAL,,a single PAQ8 variant (.paq8l); the other PAQ versions are mutually incompatible KGB Archiver,kgb;kge,archive,,,,,R,,RW,2,,,,,,MISSING,, From dd3a154bb6417b99655613cbb9f85c1ef45f1086 Mon Sep 17 00:00:00 2001 From: Hawkynt Date: Mon, 26 Oct 2026 13:04:58 +0100 Subject: [PATCH 15/48] * regenerate references --- Hawkynt.FileFormats.Archives/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Hawkynt.FileFormats.Archives/README.md b/Hawkynt.FileFormats.Archives/README.md index c3d21dc19..fe0e8de9c 100644 --- a/Hawkynt.FileFormats.Archives/README.md +++ b/Hawkynt.FileFormats.Archives/README.md @@ -544,7 +544,7 @@ Use it when a .NET process needs to enumerate, extract, test, create, edit or in -Every public and protected member of all 2571 types, generated from the built assembly and its XML documentation, is in [REFERENCE.md](https://github.com/Hawkynt/CompressionWorkbench/blob/main/Hawkynt.FileFormats.Archives/REFERENCE.md). +Every public and protected member of all 2572 types, generated from the built assembly and its XML documentation, is in [REFERENCE.md](https://github.com/Hawkynt/CompressionWorkbench/blob/main/Hawkynt.FileFormats.Archives/REFERENCE.md). From 685d6276d0ff97617b32c946dac3ef8b314b2aac Mon Sep 17 00:00:00 2001 From: Hawkynt Date: Mon, 26 Oct 2026 13:05:02 +0100 Subject: [PATCH 16/48] * NSIS: real installer format, solid and non-solid, read-only The reader and writer used an invented layout: compression taken from the first-header flags, the block compression bit inverted, no script header. Real installers never parsed; the "writer" produced files only our reader accepted. Both are replaced. The reader follows NSIS's fileform.h: first header at a 512-byte boundary, compressor recognised from the data (zlib, bzip2, LZMA, stored), solid streams split on the fly, file names recovered by replaying SetOutPath/File from the script header, NSIS 2 and 3 string escapes, Unicode and ANSI, 32- and 64-bit headers, file times. Deflate gains the NSIS 2 stored-block rule (LEN without NLEN); bzip2 gains NSIS's header-less framing. Detection scans aligned first headers instead of a tail search. Creation, defrag and the fake writer are removed: nothing but makensis can produce a runnable installer. Oracle: 11 installers compiled by makensis 2.51 and 3.10 (zlib/bzip2/LZMA, solid and not, Unicode and ANSI); names, sizes and SHA-256 of every file match what 7-Zip 26.03 extracts. Sourcing: rung 1. NSIS sources (zlib/libpng) for layout and constants; 7-Zip's NSIS handler (LGPL-2.1+) for the signature table and dialect checks. --- .../Deflate/DeflateDecompressor.cs | 18 +- Compression.Core/REFERENCE.md | 2 + .../Streams/Bzip2/Bzip2Decompressor.cs | 60 +- Compression.Core/Streams/Bzip2/Bzip2Stream.cs | 17 + Compression.Lib/FormatDetector.cs | 33 +- Compression.Tests/Compression.Tests.csproj | 4 + .../ConversionMatrix/ConversionMatrixTests.cs | 7 +- .../Nsis/NsisReferenceVectorTests.cs | 153 +++ Compression.Tests/Nsis/NsisWriterTests.cs | 63 -- .../Nsis/ReferenceVectors/README.md | 20 + .../Nsis/ReferenceVectors/make-fixtures.py | 36 + .../ReferenceVectors/nsis2-bzip2-solid.exe.gz | Bin 0 -> 25279 bytes .../nsis2-lzma-nonsolid.exe.gz | Bin 0 -> 23913 bytes .../nsis2-zlib-nonsolid.exe.gz | Bin 0 -> 24982 bytes .../ReferenceVectors/nsis2-zlib-solid.exe.gz | Bin 0 -> 25380 bytes .../nsis3-bzip2-nonsolid.exe.gz | Bin 0 -> 26743 bytes .../ReferenceVectors/nsis3-bzip2-solid.exe.gz | Bin 0 -> 27487 bytes .../nsis3-lzma-nonsolid.exe.gz | Bin 0 -> 26174 bytes .../nsis3-lzma-solid-ansi.exe.gz | Bin 0 -> 25683 bytes .../ReferenceVectors/nsis3-lzma-solid.exe.gz | Bin 0 -> 26445 bytes .../nsis3-zlib-nonsolid.exe.gz | Bin 0 -> 27212 bytes .../ReferenceVectors/nsis3-zlib-solid.exe.gz | Bin 0 -> 27598 bytes .../Nsis/ReferenceVectors/oracle.tsv | 45 + .../FileFormat.Nsis/NsisCompression.cs | 10 +- .../FileFormat.Nsis/NsisConstants.cs | 80 +- .../FileFormats/FileFormat.Nsis/NsisEntry.cs | 33 +- .../FileFormat.Nsis/NsisFormatDescriptor.cs | 172 ++-- .../FileFormats/FileFormat.Nsis/NsisReader.cs | 954 ++++++++++++------ .../FileFormats/FileFormat.Nsis/NsisWriter.cs | 54 - .../THIRD-PARTY-NOTICE.NSIS.txt | 29 + Hawkynt.FileFormats.Archives/README.md | 2 +- Hawkynt.FileFormats.Archives/REFERENCE.md | 98 +- docs/catalogue/GAPS.md | 4 +- docs/catalogue/our-registry.csv | 2 +- docs/catalogue/reference-formats.csv | 2 +- 35 files changed, 1225 insertions(+), 673 deletions(-) create mode 100644 Compression.Tests/Nsis/NsisReferenceVectorTests.cs delete mode 100644 Compression.Tests/Nsis/NsisWriterTests.cs create mode 100644 Compression.Tests/Nsis/ReferenceVectors/README.md create mode 100644 Compression.Tests/Nsis/ReferenceVectors/make-fixtures.py create mode 100644 Compression.Tests/Nsis/ReferenceVectors/nsis2-bzip2-solid.exe.gz create mode 100644 Compression.Tests/Nsis/ReferenceVectors/nsis2-lzma-nonsolid.exe.gz create mode 100644 Compression.Tests/Nsis/ReferenceVectors/nsis2-zlib-nonsolid.exe.gz create mode 100644 Compression.Tests/Nsis/ReferenceVectors/nsis2-zlib-solid.exe.gz create mode 100644 Compression.Tests/Nsis/ReferenceVectors/nsis3-bzip2-nonsolid.exe.gz create mode 100644 Compression.Tests/Nsis/ReferenceVectors/nsis3-bzip2-solid.exe.gz create mode 100644 Compression.Tests/Nsis/ReferenceVectors/nsis3-lzma-nonsolid.exe.gz create mode 100644 Compression.Tests/Nsis/ReferenceVectors/nsis3-lzma-solid-ansi.exe.gz create mode 100644 Compression.Tests/Nsis/ReferenceVectors/nsis3-lzma-solid.exe.gz create mode 100644 Compression.Tests/Nsis/ReferenceVectors/nsis3-zlib-nonsolid.exe.gz create mode 100644 Compression.Tests/Nsis/ReferenceVectors/nsis3-zlib-solid.exe.gz create mode 100644 Compression.Tests/Nsis/ReferenceVectors/oracle.tsv delete mode 100644 Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Nsis/NsisWriter.cs create mode 100644 Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Nsis/THIRD-PARTY-NOTICE.NSIS.txt diff --git a/Compression.Core/Deflate/DeflateDecompressor.cs b/Compression.Core/Deflate/DeflateDecompressor.cs index 640504f1d..ca2d93897 100644 --- a/Compression.Core/Deflate/DeflateDecompressor.cs +++ b/Compression.Core/Deflate/DeflateDecompressor.cs @@ -104,6 +104,16 @@ private DeflateDecompressor(byte[] compressed, int outputCapacity) { /// Gets a value indicating whether the final block has been decoded. public bool IsFinished => this._state == State.Done; + /// + /// Gets or sets a value indicating whether stored blocks carry only LEN and no NLEN. + /// + /// + /// The inflate built into NSIS 2.x installers reads a stored block's 16-bit length and goes + /// straight to the data; its compiler writes no one's-complement copy. Set this before the + /// first read to decode such streams. RFC 1951 streams leave it . + /// + public bool StoredBlocksOmitComplement { get; set; } + /// /// Decompresses all data from the stream. /// @@ -320,9 +330,11 @@ private void ReadBlockHeader() { this._bitCnt -= drop; var len = this.GetBits(16); - var nlen = this.GetBits(16); - if ((len ^ nlen) != 0xFFFF) - throw new InvalidDataException("Invalid uncompressed block: LEN/NLEN mismatch."); + if (!this.StoredBlocksOmitComplement) { + var nlen = this.GetBits(16); + if ((len ^ nlen) != 0xFFFF) + throw new InvalidDataException("Invalid uncompressed block: LEN/NLEN mismatch."); + } this._storedLeft = (int)len; this._state = State.Stored; diff --git a/Compression.Core/REFERENCE.md b/Compression.Core/REFERENCE.md index 02761f7a1..ac9593fae 100644 --- a/Compression.Core/REFERENCE.md +++ b/Compression.Core/REFERENCE.md @@ -384,6 +384,7 @@ Decompresses data in the DEFLATE format (RFC 1951). | --- | --- | --- | | `DeflateDecompressor` | `DeflateDecompressor(Stream input)` | Initializes a new `DeflateDecompressor` for streaming decompression. | | `IsFinished` | `bool IsFinished { get; }` | Gets a value indicating whether the final block has been decoded. | +| `StoredBlocksOmitComplement` | `bool StoredBlocksOmitComplement { get; set; }` | Gets or sets a value indicating whether stored blocks carry only LEN and no NLEN. | | `UnconsumedBytes` | `int UnconsumedBytes { get; }` | Gets the number of whole bytes read from the underlying stream but not consumed by the DEFLATE data. Once the stream has ended on a seekable input this is zero, because the read-ahead has already been handed back by seeking. | | `DecompressAll` | `byte[] DecompressAll()` | Decompresses all data from the stream. | | `Decompress` | `int Decompress(Span output)` | Decompresses data into `output`, filling it unless the DEFLATE stream ends first. | @@ -9242,6 +9243,7 @@ Inherits `CompressionStream`. Implements `IAsyncDisposable`, `IDisposable`. | `CompressBlock` | `protected override void CompressBlock(byte[] buffer, int offset, int count)` | Compresses data from the provided buffer and writes it to the inner stream. | | `DecompressBlock` | `protected override int DecompressBlock(byte[] buffer, int offset, int count)` | Decompresses data from the inner stream into the provided buffer. | | `FinishCompression` | `protected override void FinishCompression()` | Called when the stream is being closed in Compress mode. Implementations should flush any remaining compressed data. | +| `OpenNsisDecoder` | `static Bzip2Stream OpenNsisDecoder(Stream stream, bool leaveOpen = false)` | Opens a decoder for the header-less bzip2 dialect embedded in NSIS installers: no "BZh" stream header, a single 0x31 byte before each block, 0x17 at the end, no CRCs. | ### Namespace `FileFormat.Gzip` diff --git a/Compression.Core/Streams/Bzip2/Bzip2Decompressor.cs b/Compression.Core/Streams/Bzip2/Bzip2Decompressor.cs index 0954bd3e9..40f187d3a 100644 --- a/Compression.Core/Streams/Bzip2/Bzip2Decompressor.cs +++ b/Compression.Core/Streams/Bzip2/Bzip2Decompressor.cs @@ -13,6 +13,7 @@ internal sealed class Bzip2Decompressor { private int _currentBlockPos; private bool _finished; private uint _combinedCrc; + private readonly bool _nsisVariant; /// /// Gets whether all blocks have been read. @@ -28,8 +29,13 @@ internal sealed class Bzip2Decompressor { /// Initializes a new bzip2 decompressor. /// /// The bit buffer for input (MSB-first). - public Bzip2Decompressor(BitBuffer bits) { + /// + /// Decode the header-less dialect NSIS installers carry: a block starts with the single byte + /// 0x31 and the stream ends with 0x17, with no CRCs and no randomisation bit. + /// + public Bzip2Decompressor(BitBuffer bits, bool nsisVariant = false) { this._bits = bits; + this._nsisVariant = nsisVariant; } /// @@ -61,6 +67,9 @@ public int Read(byte[] buffer, int offset, int count) { } private bool ReadNextBlock() { + if (this._nsisVariant) + return this.ReadNextNsisBlock(); + // Read 48-bit magic var high = this._bits.ReadBits(24); var low = this._bits.ReadBits(24); @@ -87,6 +96,41 @@ private bool ReadNextBlock() { if (randomized != 0) throw new InvalidDataException("Randomized bzip2 blocks are not supported."); + var blockData = this.DecodeBlockBody(); + + // Verify block CRC + var computedCrc = Crc32Bzip2(blockData); + if (computedCrc != blockCrc) + throw new InvalidDataException( + $"Bzip2 block CRC mismatch: expected 0x{blockCrc:X8}, computed 0x{computedCrc:X8}."); + + this._combinedCrc = ((this._combinedCrc << 1) | (this._combinedCrc >> 31)) ^ blockCrc; + + this._currentBlock = blockData; + this._currentBlockPos = 0; + return true; + } + + private const uint NsisBlockMarker = 0x31; + private const uint NsisEndMarker = 0x17; + + // NSIS keeps bzip2's entropy coding but trims the framing: one marker byte per block, no + // checksums and no randomised blocks (Source/bzip2/decompress.c in the NSIS tree). + private bool ReadNextNsisBlock() { + switch (this._bits.ReadBits(8)) { + case NsisEndMarker: + this._finished = true; + return false; + case NsisBlockMarker: + this._currentBlock = this.DecodeBlockBody(); + this._currentBlockPos = 0; + return true; + case var other: + throw new InvalidDataException($"Invalid NSIS bzip2 block marker: 0x{other:X2}"); + } + } + + private byte[] DecodeBlockBody() { // BWT original pointer (24 bits) var bwtIndex = (int)this._bits.ReadBits(24); @@ -189,19 +233,7 @@ private bool ReadNextBlock() { var rle1Data = BurrowsWheelerTransform.Inverse(bwtData, bwtIndex); // RLE1 decode - var blockData = Bzip2Compressor.Rle1Decode(rle1Data); - - // Verify block CRC - var computedCrc = Crc32Bzip2(blockData); - if (computedCrc != blockCrc) - throw new InvalidDataException( - $"Bzip2 block CRC mismatch: expected 0x{blockCrc:X8}, computed 0x{computedCrc:X8}."); - - this._combinedCrc = ((this._combinedCrc << 1) | (this._combinedCrc >> 31)) ^ blockCrc; - - this._currentBlock = blockData; - this._currentBlockPos = 0; - return true; + return Bzip2Compressor.Rle1Decode(rle1Data); } private bool[] ReadSymbolBitmap() { diff --git a/Compression.Core/Streams/Bzip2/Bzip2Stream.cs b/Compression.Core/Streams/Bzip2/Bzip2Stream.cs index 9b3429f7a..d50645024 100644 --- a/Compression.Core/Streams/Bzip2/Bzip2Stream.cs +++ b/Compression.Core/Streams/Bzip2/Bzip2Stream.cs @@ -33,8 +33,25 @@ public Bzip2Stream(Stream stream, CompressionStreamMode mode, this._blockSize100k = blockSize100k; } + private bool _nsisVariant; + + /// + /// Opens a decoder for the header-less bzip2 dialect embedded in NSIS installers: no "BZh" + /// stream header, a single 0x31 byte before each block, 0x17 at the end, no CRCs. + /// + /// The stream positioned at the first block marker. + /// Whether to leave the inner stream open. + /// A read-only decompressing stream. + public static Bzip2Stream OpenNsisDecoder(Stream stream, bool leaveOpen = false) + => new(stream, CompressionStreamMode.Decompress, 9, leaveOpen) { _nsisVariant = true }; + /// protected override int DecompressBlock(byte[] buffer, int offset, int count) { + if (!this._headerRead && this._nsisVariant) { + this._decompressor = new Bzip2Decompressor(new BitBuffer(InnerStream), nsisVariant: true); + this._headerRead = true; + } + if (!this._headerRead) { ReadHeader(); this._headerRead = true; diff --git a/Compression.Lib/FormatDetector.cs b/Compression.Lib/FormatDetector.cs index c97d2a111..25df6b418 100644 --- a/Compression.Lib/FormatDetector.cs +++ b/Compression.Lib/FormatDetector.cs @@ -504,10 +504,12 @@ private static Format DetectInstaller(string path) { var buf = new byte[2]; var isPe = fs.Read(buf, 0, 2) >= 2 && buf[0] == 'M' && buf[1] == 'Z'; - // NSIS/InnoSetup markers can live anywhere in the file (our own stub-less - // NSIS writer puts the "NullsoftInst" signature in a leading overlay - // header, not a PE overlay), so scan the whole file when it is small and - // the tail otherwise — independent of the MZ check, so a stub-less + // An NSIS first header sits right after the exe stub, at a multiple of 512 bytes (the + // exehead itself only looks there), so a large installer keeps it far from the tail. + if (HasNsisFirstHeader(fs)) return Format.Nsis; + + // Other installer markers can live anywhere in the file, so scan the whole file when it + // is small and the tail otherwise — independent of the MZ check, so a stub-less // installer image still re-detects as its own format. var scanLen = (int)Math.Min(fs.Length, 65536L); if (scanLen > 0) { @@ -516,7 +518,6 @@ private static Format DetectInstaller(string path) { var tail = new byte[scanLen]; var bytesRead = fs.Read(tail, 0, tail.Length); var tailSpan = tail.AsSpan(0, bytesRead); - if (ContainsBytes(tailSpan, "NullsoftInst"u8)) return Format.Nsis; if (ContainsBytes(tailSpan, "Inno Setup"u8)) return Format.InnoSetup; // PyInstaller "onefile" build: the CArchive MEI cookie sits near EOF, // after the PE image (and before any appended Authenticode signature). @@ -557,6 +558,28 @@ private static Format DetectInstaller(string path) { private static bool ContainsBytes(ReadOnlySpan haystack, ReadOnlySpan needle) => haystack.IndexOf(needle) >= 0; + /// + /// Looks for NSIS's firstheader (flags with only the low four bits in use, 0xDEADBEEF, + /// "NullsoftInst") at 512-byte boundaries in the first 8 MiB. + /// + private static bool HasNsisFirstHeader(Stream fs) { + const int alignment = 512; + var limit = Math.Min(fs.Length, 8L << 20); + var chunk = new byte[64 * 1024]; + for (long start = 0; start < limit; start += chunk.Length) { + fs.Position = start; + var read = fs.ReadAtLeast(chunk, chunk.Length, throwOnEndOfStream: false); + for (var i = 0; i + 20 <= read; i += alignment) + if ((chunk[i] & 0xF0) == 0 && chunk[i + 1] == 0 && chunk[i + 2] == 0 && chunk[i + 3] == 0 + && chunk[i + 4] == 0xEF && chunk[i + 5] == 0xBE && chunk[i + 6] == 0xAD && chunk[i + 7] == 0xDE + && chunk.AsSpan(i + 8, 12).SequenceEqual("NullsoftInst"u8)) + return true; + if (read < chunk.Length) + break; + } + return false; + } + /// The 8-byte PyInstaller CArchive magic cookie (MEI + version bytes). private static readonly byte[] PyInstallerCookie = [(byte)'M', (byte)'E', (byte)'I', 0x0C, 0x0B, 0x0A, 0x0B, 0x0E]; diff --git a/Compression.Tests/Compression.Tests.csproj b/Compression.Tests/Compression.Tests.csproj index 59dbe59f1..74893a303 100644 --- a/Compression.Tests/Compression.Tests.csproj +++ b/Compression.Tests/Compression.Tests.csproj @@ -71,6 +71,10 @@ BcacheFsVectors.%(Filename)%(Extension) + + + NsisVectors.%(Filename)%(Extension) + MobiVectors.%(Filename)%(Extension) diff --git a/Compression.Tests/ConversionMatrix/ConversionMatrixTests.cs b/Compression.Tests/ConversionMatrix/ConversionMatrixTests.cs index 0fa582c80..664cfe99d 100644 --- a/Compression.Tests/ConversionMatrix/ConversionMatrixTests.cs +++ b/Compression.Tests/ConversionMatrix/ConversionMatrixTests.cs @@ -37,10 +37,9 @@ public sealed record Pair(string SourceId, string TargetId) { new(StringComparer.OrdinalIgnoreCase) { "D64", "D71", "D81", "T64", "Cpm", "Atari8", "AppleDos", "ProDos", "Bbc", "ZxScl", "TrDos", "Mfs", - // Mfs1 folds names to 7-char DFS slots (HELLO.TXT -> HELLO.T); Nsis stores - // no per-block names and the reader exposes block_N. Both extract the exact - // stored bytes, so they round-trip by content, not by verbatim name. - "Mfs1", "Nsis", + // Mfs1 folds names to 7-char DFS slots (HELLO.TXT -> HELLO.T); it extracts the + // exact stored bytes, so it round-trips by content, not by verbatim name. + "Mfs1", }; // Case-folding targets (8.3 / uppercase) — compare names case-insensitively diff --git a/Compression.Tests/Nsis/NsisReferenceVectorTests.cs b/Compression.Tests/Nsis/NsisReferenceVectorTests.cs new file mode 100644 index 000000000..5f385f0c1 --- /dev/null +++ b/Compression.Tests/Nsis/NsisReferenceVectorTests.cs @@ -0,0 +1,153 @@ +using System.IO.Compression; +using System.Security.Cryptography; +using Compression.Lib; +using FileFormat.Nsis; + +namespace Compression.Tests.Nsis; + +/// +/// Real installers compiled by makensis 2.51 and 3.10 (see ReferenceVectors/README.md), checked +/// against what 7-Zip extracts from them (oracle.tsv). +/// +[TestFixture] +public class NsisReferenceVectorTests { + + private static readonly string[] Fixtures = [ + "nsis3-zlib-nonsolid.exe", "nsis3-zlib-solid.exe", "nsis3-bzip2-nonsolid.exe", "nsis3-bzip2-solid.exe", + "nsis3-lzma-nonsolid.exe", "nsis3-lzma-solid.exe", "nsis3-lzma-solid-ansi.exe", + "nsis2-zlib-nonsolid.exe", "nsis2-zlib-solid.exe", "nsis2-bzip2-solid.exe", "nsis2-lzma-nonsolid.exe", + ]; + + private static byte[] Load(string name) { + using var resource = typeof(NsisReferenceVectorTests).Assembly.GetManifestResourceStream("NsisVectors." + name + ".gz") + ?? throw new InvalidOperationException($"Missing embedded fixture {name}."); + using var gz = new GZipStream(resource, CompressionMode.Decompress); // BCL as the test-side oracle + using var ms = new MemoryStream(); + gz.CopyTo(ms); + return ms.ToArray(); + } + + private static Dictionary Oracle(string fixture) { + using var resource = typeof(NsisReferenceVectorTests).Assembly.GetManifestResourceStream("NsisVectors.oracle.tsv")!; + using var reader = new StreamReader(resource); + var result = new Dictionary(StringComparer.Ordinal); + while (reader.ReadLine() is { } line) { + if (line.StartsWith('#') || line.Length == 0) + continue; + var f = line.Split('\t'); + if (f[0] == fixture) + result[f[1]] = (long.Parse(f[2], System.Globalization.CultureInfo.InvariantCulture), f[3]); + } + return result; + } + + private static string Sha(byte[] data) => Convert.ToHexStringLower(SHA256.HashData(data)); + + [TestCaseSource(nameof(Fixtures))] + public void GivenRealInstaller_WhenListed_ThenNamesAndSizesMatch7Zip(string fixture) { + var oracle = Oracle(fixture); + Assert.That(oracle, Is.Not.Empty); + + var entries = new NsisFormatDescriptor().List(new MemoryStream(Load(fixture)), null); + + Assert.That(entries.Select(e => e.Name), Is.EquivalentTo(oracle.Keys)); + foreach (var e in entries) + Assert.That(e.OriginalSize, Is.EqualTo(oracle[e.Name].Size), e.Name); + } + + [TestCaseSource(nameof(Fixtures))] + public void GivenRealInstaller_WhenExtracted_ThenEveryFileMatches7Zip(string fixture) { + var oracle = Oracle(fixture); + var dir = Path.Combine(Path.GetTempPath(), "cwb-nsis-" + Guid.NewGuid().ToString("N")); + try { + new NsisFormatDescriptor().Extract(new MemoryStream(Load(fixture)), dir, null, null); + var written = Directory.GetFiles(dir, "*", SearchOption.AllDirectories) + .ToDictionary(p => Path.GetRelativePath(dir, p).Replace('\\', '/'), p => Sha(File.ReadAllBytes(p))); + Assert.That(written.Keys, Is.EquivalentTo(oracle.Keys)); + foreach (var (name, sha) in written) + Assert.That(sha, Is.EqualTo(oracle[name].Sha), name); + } finally { + if (Directory.Exists(dir)) + Directory.Delete(dir, recursive: true); + } + } + + [TestCase("nsis3-zlib-nonsolid.exe", NsisCompression.Zlib, false, true, true)] + [TestCase("nsis3-bzip2-solid.exe", NsisCompression.BZip2, true, true, true)] + [TestCase("nsis3-lzma-solid-ansi.exe", NsisCompression.Lzma, true, false, true)] + [TestCase("nsis2-zlib-nonsolid.exe", NsisCompression.Zlib, false, false, false)] + [TestCase("nsis2-bzip2-solid.exe", NsisCompression.BZip2, true, false, false)] + public void GivenRealInstaller_WhenOpened_ThenCompressorAndDialectAreRecognised(string fixture, NsisCompression method, bool solid, bool unicode, bool nsis3) { + using var reader = new NsisReader(new MemoryStream(Load(fixture))); + + Assert.Multiple(() => { + Assert.That(reader.Compression, Is.EqualTo(method)); + Assert.That(reader.IsSolid, Is.EqualTo(solid)); + Assert.That(reader.IsUnicode, Is.EqualTo(unicode)); + Assert.That(reader.IsNsis3, Is.EqualTo(nsis3)); + Assert.That(reader.FirstHeaderOffset % 512, Is.Zero); + }); + } + + [Test] + public void GivenSolidInstaller_WhenOnlyTheLastFileIsExtracted_ThenItMatches7Zip() { + var oracle = Oracle("nsis3-lzma-solid.exe"); + using var reader = new NsisReader(new MemoryStream(Load("nsis3-lzma-solid.exe"))); + var last = reader.Entries[^1]; + + var data = reader.Extract(last); + + Assert.That(Sha(data), Is.EqualTo(oracle[last.FileName].Sha)); + } + + [Test] + public void GivenRealInstaller_WhenListed_ThenFileTimesAreReported() { + var entries = new NsisFormatDescriptor().List(new MemoryStream(Load("nsis3-lzma-nonsolid.exe")), null); + Assert.That(entries.All(e => e.LastModified is { Year: >= 2020 }), Is.True); + } + + [Test] + public void GivenRealInstallerOnDisk_WhenDetected_ThenNsisIsChosen() { + var path = Path.Combine(Path.GetTempPath(), "cwb-nsis-" + Guid.NewGuid().ToString("N") + ".exe"); + try { + File.WriteAllBytes(path, Load("nsis3-zlib-solid.exe")); + Assert.That(FormatDetector.Detect(path), Is.EqualTo(FormatDetector.Format.Nsis)); + } finally { + File.Delete(path); + } + } + + [Test] + public void GivenInstallerCutInsideItsData_WhenListed_ThenAPartialMetadataEntryIsReturned() { + var full = Load("nsis3-lzma-solid.exe"); + using var probe = new NsisReader(new MemoryStream(full)); + var cut = full.AsSpan(0, (int)probe.FirstHeaderOffset + 40).ToArray(); + + var entries = new NsisFormatDescriptor().List(new MemoryStream(cut), null); + + Assert.That(entries.Select(e => e.Name), Is.EqualTo(new[] { "metadata.ini" })); + } + + [Test] + public void GivenFirstHeaderOffTheAlignment_WhenOpened_ThenNoInstallerIsFound() { + var full = Load("nsis3-zlib-nonsolid.exe"); + var shifted = new byte[full.Length + 1]; + full.CopyTo(shifted.AsSpan(1)); + + Assert.Throws(() => _ = new NsisReader(new MemoryStream(shifted))); + } + + [Test] + public void GivenNoStream_WhenOpened_ThenArgumentNullException() + => Assert.Throws(() => _ = new NsisReader(null!)); + + [Test] + public void GivenEmptyStream_WhenOpened_ThenInvalidDataException() + => Assert.Throws(() => _ = new NsisReader(new MemoryStream())); + + [Test] + public void GivenUnknownEntryName_WhenExtractedToMemory_ThenNoBytes() { + var bytes = new NsisFormatDescriptor().ExtractEntryToMemory(new MemoryStream(Load("nsis3-zlib-solid.exe")), "nope.txt", null); + Assert.That(bytes, Is.Empty); + } +} diff --git a/Compression.Tests/Nsis/NsisWriterTests.cs b/Compression.Tests/Nsis/NsisWriterTests.cs deleted file mode 100644 index e67057433..000000000 --- a/Compression.Tests/Nsis/NsisWriterTests.cs +++ /dev/null @@ -1,63 +0,0 @@ -using FileFormat.Nsis; - -namespace Compression.Tests.Nsis; - -[TestFixture] -public class NsisWriterTests { - - [Test, Category("HappyPath")] - public void Descriptor_ReportsWormCapability() { - var d = new NsisFormatDescriptor(); - Assert.That(d.Capabilities.HasFlag(Compression.Registry.FormatCapabilities.CanCreate), Is.True); - } - - [Test, Category("HappyPath"), Category("RoundTrip")] - public void Writer_SingleBlock_RoundTrips() { - var payload = "nsis test block"u8.ToArray(); - var w = new NsisWriter(); - w.AddFile("block_0", payload); - using var ms = new MemoryStream(); - w.WriteTo(ms); - ms.Position = 0; - - var r = new NsisReader(ms); - Assert.That(r.Entries, Has.Count.EqualTo(1)); - Assert.That(r.Extract(r.Entries[0]), Is.EqualTo(payload)); - } - - [Test, Category("HappyPath"), Category("RoundTrip")] - public void Writer_MultipleBlocks_AllRoundTrip() { - var p1 = "first"u8.ToArray(); - var p2 = new byte[] { 0xDE, 0xAD, 0xBE, 0xEF }; - var w = new NsisWriter(); - w.AddFile("a", p1); - w.AddFile("b", p2); - using var ms = new MemoryStream(); - w.WriteTo(ms); - ms.Position = 0; - - var r = new NsisReader(ms); - Assert.That(r.Entries, Has.Count.EqualTo(2)); - Assert.That(r.Extract(r.Entries[0]), Is.EqualTo(p1)); - Assert.That(r.Extract(r.Entries[1]), Is.EqualTo(p2)); - } - - [Test, Category("HappyPath"), Category("RoundTrip")] - public void Descriptor_Create_RoundTrips() { - var tmp = Path.GetTempFileName(); - try { - File.WriteAllBytes(tmp, "nsis descriptor"u8.ToArray()); - var d = new NsisFormatDescriptor(); - using var ms = new MemoryStream(); - ((Compression.Registry.IArchiveCreatable)d).Create( - ms, - [new Compression.Registry.ArchiveInputInfo(tmp, "data.bin", false)], - new Compression.Registry.FormatCreateOptions()); - ms.Position = 0; - var entries = d.List(ms, null); - Assert.That(entries, Has.Count.EqualTo(1)); - } finally { - File.Delete(tmp); - } - } -} diff --git a/Compression.Tests/Nsis/ReferenceVectors/README.md b/Compression.Tests/Nsis/ReferenceVectors/README.md new file mode 100644 index 000000000..3415297e5 --- /dev/null +++ b/Compression.Tests/Nsis/ReferenceVectors/README.md @@ -0,0 +1,20 @@ +# NSIS reference installers + +Real NSIS installers, compiled by the official NSIS compilers, never by CompressionWorkbench: + +| Compiler | Source | +| --- | --- | +| `makensis.exe` 3.10 | `nsis-3.10.zip` from https://sourceforge.net/projects/nsis/files/NSIS%203/3.10/ | +| `makensis.exe` 2.51 | `nsis-2.51.zip` from https://sourceforge.net/projects/nsis/files/NSIS%202/2.51/ | + +`make-fixtures.py` writes the payload (two copies of a short text, 3000 seeded random bytes so that +Deflate emits stored blocks, 32000 bytes of a repeated pattern) and one script per variant, then runs +the compiler: `python make-fixtures.py `. The file name says +compiler major version, `SetCompressor` and `/SOLID`; `-ansi` is `Unicode false` under NSIS 3 (NSIS 2 +is always ANSI). Each installer is stored gzip-compressed; nothing else was changed. + +`oracle.tsv` is what 7-Zip 26.03 (x64) extracts from each installer (`7z x`): path, size and SHA-256 +per file. The tests require our reader to produce exactly that set. + +NSIS is released under the zlib/libpng licence; the installers contain only the NSIS exehead stub +and the payload above. diff --git a/Compression.Tests/Nsis/ReferenceVectors/make-fixtures.py b/Compression.Tests/Nsis/ReferenceVectors/make-fixtures.py new file mode 100644 index 000000000..19c94726b --- /dev/null +++ b/Compression.Tests/Nsis/ReferenceVectors/make-fixtures.py @@ -0,0 +1,36 @@ +import os, random, subprocess, sys +W = sys.argv[1] # work dir +NSIS3 = sys.argv[2] # makensis 3 path +NSIS2 = sys.argv[3] # makensis 2 path +os.makedirs(os.path.join(W, 'payload', 'sub'), exist_ok=True) +os.chdir(W) +open('payload/readme.txt', 'wb').write(b'Hello from an NSIS fixture.\r\nLine two.\r\n') +open('payload/sub/readme-copy.txt', 'wb').write(b'Hello from an NSIS fixture.\r\nLine two.\r\n') +r = random.Random(1234) +open('payload/sub/random.bin', 'wb').write(bytes(r.getrandbits(8) for _ in range(3000))) +open('payload/sub/repeat.txt', 'w').write('abcdefgh' * 4000) + +def script(comp, solid, uni, out): + lines = [] + if uni: + lines.append(f'Unicode {uni}') + lines += ['Name "fixture"', f'OutFile "{out}"', 'RequestExecutionLevel user', 'InstallDir "$TEMP\\nsisfixture"', + f'SetCompressor /FINAL {"/SOLID " if solid else ""}{comp}', 'Page instfiles', 'Section', + 'SetOutPath "$INSTDIR"', 'File "payload\\readme.txt"', 'SetOutPath "$INSTDIR\\sub"', + 'File "payload\\sub\\random.bin"', 'File "payload\\sub\\repeat.txt"', 'File "payload\\sub\\readme-copy.txt"', + 'SectionEnd'] + return '\r\n'.join(lines) + '\r\n' + +jobs = [] +for comp in ('zlib', 'bzip2', 'lzma'): + for solid in (False, True): + tag = 'solid' if solid else 'nonsolid' + jobs.append((NSIS3, comp, solid, 'true', f'nsis3-{comp}-{tag}.exe')) + jobs.append((NSIS2, comp, solid, None, f'nsis2-{comp}-{tag}.exe')) +jobs.append((NSIS3, 'lzma', True, 'false', 'nsis3-lzma-solid-ansi.exe')) +jobs.append((NSIS3, 'zlib', False, 'false', 'nsis3-zlib-nonsolid-ansi.exe')) +for exe, comp, solid, uni, out in jobs: + nsi = out[:-4] + '.nsi' + open(nsi, 'w').write(script(comp, solid, uni, out)) + p = subprocess.run([exe, '-V1', nsi], capture_output=True, text=True) + print(out, p.returncode, os.path.getsize(out) if os.path.exists(out) else -1, p.stdout[-300:], p.stderr[-300:]) diff --git a/Compression.Tests/Nsis/ReferenceVectors/nsis2-bzip2-solid.exe.gz b/Compression.Tests/Nsis/ReferenceVectors/nsis2-bzip2-solid.exe.gz new file mode 100644 index 0000000000000000000000000000000000000000..6219154a29ac17c7592dbcfa7fddf88d57413441 GIT binary patch literal 25279 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 WGsmz0R%U%GZ1P|8>&=l5l>h+X!y>`} literal 0 HcmV?d00001 diff --git a/Compression.Tests/Nsis/ReferenceVectors/nsis2-lzma-nonsolid.exe.gz b/Compression.Tests/Nsis/ReferenceVectors/nsis2-lzma-nonsolid.exe.gz new file mode 100644 index 0000000000000000000000000000000000000000..14d0b8b7ed9c6dd7a1d4b536230440a900322dd4 GIT binary patch literal 23913 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 I^E993m6Qgs2Qm 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 l`PI_i6H$002jNg%$t+ literal 0 HcmV?d00001 diff --git a/Compression.Tests/Nsis/ReferenceVectors/nsis2-zlib-solid.exe.gz b/Compression.Tests/Nsis/ReferenceVectors/nsis2-zlib-solid.exe.gz new file mode 100644 index 0000000000000000000000000000000000000000..101046cbd26c710ee99b53ff37d765cfd9ef65c1 GIT binary patch literal 25380 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 TE$V^MEWZB&>+RFKsFwf$fLrio literal 0 HcmV?d00001 diff --git a/Compression.Tests/Nsis/ReferenceVectors/nsis3-bzip2-nonsolid.exe.gz b/Compression.Tests/Nsis/ReferenceVectors/nsis3-bzip2-nonsolid.exe.gz new file mode 100644 index 0000000000000000000000000000000000000000..864bd9797f5bdc0dcab8ba3a675b60b23db8d715 GIT binary patch literal 26743 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 literal 0 HcmV?d00001 diff --git a/Compression.Tests/Nsis/ReferenceVectors/nsis3-bzip2-solid.exe.gz b/Compression.Tests/Nsis/ReferenceVectors/nsis3-bzip2-solid.exe.gz new file mode 100644 index 0000000000000000000000000000000000000000..167cf1f69630034d865554b60a9a644648a8bd08 GIT binary patch literal 27487 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 literal 0 HcmV?d00001 diff --git a/Compression.Tests/Nsis/ReferenceVectors/nsis3-lzma-nonsolid.exe.gz b/Compression.Tests/Nsis/ReferenceVectors/nsis3-lzma-nonsolid.exe.gz new file mode 100644 index 0000000000000000000000000000000000000000..f94ce69fcc6a19a0d961a091b0a037af7c062035 GIT binary patch literal 26174 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
    @==>jZ(6Boy4ky>JUY?(qNV2= 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 KwO?=OoB#mb6`BqJ literal 0 HcmV?d00001 diff --git a/Compression.Tests/Nsis/ReferenceVectors/nsis3-lzma-solid.exe.gz b/Compression.Tests/Nsis/ReferenceVectors/nsis3-lzma-solid.exe.gz new file mode 100644 index 0000000000000000000000000000000000000000..d50eb18033cb7fa01d1885293c1927d8f71c08ab GIT binary patch literal 26445 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 literal 0 HcmV?d00001 diff --git a/Compression.Tests/Nsis/ReferenceVectors/nsis3-zlib-nonsolid.exe.gz b/Compression.Tests/Nsis/ReferenceVectors/nsis3-zlib-nonsolid.exe.gz new file mode 100644 index 0000000000000000000000000000000000000000..7b639b7eddb160c87b280a60599ab5e0dd3afd3b GIT binary patch literal 27212 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 fiA+(i-{^#$}Q3c1NS#AFVm1{grO{D+;r#PN~ literal 0 HcmV?d00001 diff --git a/Compression.Tests/Nsis/ReferenceVectors/nsis3-zlib-solid.exe.gz b/Compression.Tests/Nsis/ReferenceVectors/nsis3-zlib-solid.exe.gz new file mode 100644 index 0000000000000000000000000000000000000000..3404a6c693f80f5e2a7c028855ff01921a39fab5 GIT binary patch literal 27598 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 -/// Identifies the compression algorithm used in an NSIS installer. +/// Identifies the compressor an NSIS installer was built with (SetCompressor). ///
public enum NsisCompression { - /// No compression — data is stored verbatim. + /// Nothing is compressed: the header and every block are stored. None = 0, - /// Zlib/Deflate compression (2-byte zlib header + raw Deflate stream). + /// "zlib": raw Deflate with no zlib wrapper (NSIS 2's inflate also omits stored-block NLEN). Zlib = 1, - /// BZip2 block-sorted compression. + /// "bzip2": NSIS's header-less bzip2 dialect. BZip2 = 2, - /// LZMA compression (5-byte properties header + raw LZMA stream). + /// "lzma": a 5-byte properties header, then range-coded data ending in an end marker. Lzma = 3, } diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Nsis/NsisConstants.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Nsis/NsisConstants.cs index c72221e6e..2d1d6eeb4 100644 --- a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Nsis/NsisConstants.cs +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Nsis/NsisConstants.cs @@ -1,32 +1,68 @@ namespace FileFormat.Nsis; +/// +/// Values from NSIS's Source/exehead/fileform.h (zlib/libpng licence). +/// internal static class NsisConstants { - internal static readonly byte[] Signature = [ - 0xEF, 0xBE, 0xAD, 0xDE, - (byte)'N', (byte)'u', (byte)'l', (byte)'l', - (byte)'s', (byte)'o', (byte)'f', (byte)'t', - (byte)'I', (byte)'n', (byte)'s', (byte)'t' - ]; + /// FH_SIG: the second word of firstheader. + internal const uint FirstHeaderSignature = 0xDEADBEEF; + + /// FH_INT1..3: "NullsoftInst" as three little-endian words. + internal static ReadOnlySpan Magic => "NullsoftInst"u8; + + /// flags, siginfo, nsinst[3], length_of_header, length_of_all_following_data. + internal const int FirstHeaderSize = 28; + + /// FH_FLAGS_MASK: every other flag bit must be clear. + internal const int FirstHeaderFlagsMask = 15; + + /// The exehead looks for firstheader only at multiples of 512 bytes. + internal const int FirstHeaderAlignment = 512; - internal const int SignatureOffset = 4; - internal const int SignatureLength = 16; - internal const int FirstHeaderSize = 28; // flags(4) + sig(16) + header_size(4) + archive_size(4) + /// Bit 31 of a non-solid block's length word: the block is compressed. + internal const uint CompressedFlag = 0x80000000u; - internal const int CompressionMask = 0x0F; - internal const int SolidFlag = 0x10; + /// One entry: which plus MAX_ENTRY_OFFSETS (6) parameters. + internal const int EntrySize = 28; - internal const int CompNone = 0; - internal const int CompZlib = 1; - internal const int CompBzip2 = 2; - internal const int CompLzma = 3; + // Block indices into header.blocks (NB_*). Pages are always compiled in, so entries and strings + // keep these indices whether or not the optional background-font block follows. + internal const int BlockEntries = 2; + internal const int BlockStrings = 3; + internal const int BlockLangTables = 4; - // LZMA sub-header inside the compressed stream: 5-byte properties + 8-byte uncompressed size - internal const int LzmaPropSize = 5; - internal const int LzmaHeaderSize = 13; + // Opcodes that precede every optional one in the EW_* enum, so they hold in every NSIS 2/3 build. + internal const int OpCreateDir = 11; // EW_CREATEDIR: [path, ?SetOutPath, ?restrictAcl] + internal const int OpExtractFile = 20; // EW_EXTRACTFILE: [overwrite, name, data offset, time low, time high, allow ignore] - // Zlib: 2-byte header (CMF + FLG) before raw Deflate data - internal const int ZlibHeaderSize = 2; + // String escape codes. NSIS 3 (ANSI and Unicode) uses NS_*_CODE 1..4; NSIS 2 ANSI used 252..255. + internal const int Nsis3LangCode = 1, Nsis3ShellCode = 2, Nsis3VarCode = 3, Nsis3SkipCode = 4; + internal const int Nsis2SkipCode = 252, Nsis2VarCode = 253, Nsis2ShellCode = 254, Nsis2LangCode = 255; - // Bit 31 of a block-length word means the block is stored uncompressed - internal const uint UncompressedFlag = 0x80000000u; + // Variable indices (NSIS 2.26+ and 3.x): $0-$9 are 0-9, $R0-$R9 10-19, then these. + internal const int VarInstDir = 21; + internal const int VarOutDir = 22; + internal const int VarExeDir = 23; + internal const int VarTemp = 25; + internal const int VarPluginsDir = 26; + + internal static readonly string[] InternalVariables = [ + "CMDLINE", "INSTDIR", "OUTDIR", "EXEDIR", "LANGUAGE", "TEMP", "PLUGINSDIR", "EXEPATH", "EXEFILE", + "HWNDPARENT", "_CLICK", "_OUTDIR", + ]; + + /// + /// NSIS constant names by CSIDL value, as the compiler's shell-folder table assigns them + /// (CSIDL numbering per the Windows SDK's shlobj.h). Unused slots are null. + /// + internal static readonly string?[] ShellFolders = [ + "DESKTOP", "INTERNET", "SMPROGRAMS", "CONTROLS", "PRINTERS", "DOCUMENTS", "FAVORITES", "SMSTARTUP", + "RECENT", "SENDTO", "BITBUCKET", "STARTMENU", null, "MUSIC", "VIDEOS", null, + "DESKTOP", "DRIVES", "NETWORK", "NETHOOD", "FONTS", "TEMPLATES", "STARTMENU", "SMPROGRAMS", + "SMSTARTUP", "DESKTOP", "APPDATA", "PRINTHOOD", "LOCALAPPDATA", "ALTSTARTUP", "ALTSTARTUP", "FAVORITES", + "INTERNET_CACHE", "COOKIES", "HISTORY", "APPDATA", "WINDIR", "SYSDIR", "PROGRAM_FILES", "PICTURES", + "PROFILE", "SYSTEMX86", "PROGRAM_FILESX86", "PROGRAM_FILES_COMMON", "PROGRAM_FILES_COMMONX8", "TEMPLATES", "DOCUMENTS", "ADMINTOOLS", + "ADMINTOOLS", "CONNECTIONS", null, null, null, "MUSIC", "PICTURES", "VIDEOS", + "RESOURCES", "RESOURCES_LOCALIZED", "COMMON_OEM_LINKS", "CDBURN_AREA", null, "COMPUTERSNEARME", + ]; } diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Nsis/NsisEntry.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Nsis/NsisEntry.cs index 88039463f..51873163b 100644 --- a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Nsis/NsisEntry.cs +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Nsis/NsisEntry.cs @@ -1,16 +1,25 @@ namespace FileFormat.Nsis; /// -/// Represents a data block embedded in an NSIS installer. +/// A file an NSIS installer extracts: one File instruction of the install script. /// -/// The entry name. Will be a generated name such as "block_0" unless the -/// installer header was successfully parsed to recover actual file names. -/// The uncompressed size in bytes, or -1 when unknown (solid stream). -/// The compressed size in bytes, or -1 when unknown (solid stream). -/// Whether the entry represents a directory. -public sealed record NsisEntry( - string FileName, - long Size, - long CompressedSize, - bool IsDirectory -); +/// +/// The target path as the script names it, with forward slashes. A leading $INSTDIR is +/// dropped, as 7-Zip does; any other variable ($PLUGINSDIR, $SYSDIR, ...) stays. +/// +/// Offset of the file's length-prefixed block within the data section. +/// The file time the compiler recorded, in UTC, or when none. +public sealed record NsisEntry(string FileName, uint DataOffset, DateTime? LastModified) { + + /// Gets the uncompressed size in bytes, or -1 until the size has been resolved. + public long Size { get; internal set; } = -1; + + /// + /// Gets the stored size of the file's block, or -1 when the block lives inside a solid stream + /// and therefore has no size of its own. + /// + public long CompressedSize { get; internal set; } = -1; + + /// Gets whether the entry is a directory; NSIS File entries never are. + public bool IsDirectory => false; +} diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Nsis/NsisFormatDescriptor.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Nsis/NsisFormatDescriptor.cs index a44922962..c01ee3703 100644 --- a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Nsis/NsisFormatDescriptor.cs +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Nsis/NsisFormatDescriptor.cs @@ -1,152 +1,102 @@ #pragma warning disable CS1591 +using System.Globalization; +using System.Text; using Compression.Registry; using static Compression.Registry.FormatHelpers; namespace FileFormat.Nsis; /// -/// NSIS (Nullsoft Scriptable Install System) installer archive — PE stub plus compressed installer data. +/// NSIS (Nullsoft Scriptable Install System) installer: the files its install script extracts. /// /// References: /// -/// https://nsis.sourceforge.io — official NSIS project site and sources — the installer data layout is defined there -/// https://en.wikipedia.org/wiki/Nullsoft_Scriptable_Install_System — Wikipedia -/// https://www.7-zip.org — 7-Zip — widely used independent parser of NSIS installer payloads +/// https://github.com/kichik/nsis — NSIS sources; Source/exehead/fileform.h defines the layout (zlib/libpng licence) +/// https://nsis.sourceforge.io/Docs/ — NSIS documentation +/// https://www.7-zip.org — 7-Zip's NSIS handler, the reference reader this one is checked against /// /// -public sealed class NsisFormatDescriptor : IFormatDescriptor, IArchiveFormatOperations, IArchiveCreatable, IArchiveDefragmentable { +public sealed class NsisFormatDescriptor : IFormatDescriptor, IArchiveFormatOperations { - /// Rebuild-based defrag: extracts then re-creates the NSIS data block in listing order. - public void Defragment(Stream archive) - => this.Defragment(archive, new DefragOptions { Mode = DefragMode.ConsolidateAtStart }); - - /// Rebuild-based defrag: extracts then re-creates the NSIS data block per the requested mode. - public void Defragment(Stream archive, DefragOptions options) { - DefragRebuilder.Rebuild(archive, options, - readEntries: stream => { - var r = new NsisReader(stream); - return r.Entries.Where(e => !e.IsDirectory).Select(e => (e.FileName, r.Extract(e))); - }, - buildImage: files => { - using var ms = new MemoryStream(); - var w = new NsisWriter(); - foreach (var (n, d) in files) w.AddFile(n, d); - w.WriteTo(ms); - return ms.ToArray(); - }); - } - /// - /// Gets the id. - /// public string Id => "Nsis"; - /// - /// Gets the display name. - /// public string DisplayName => "NSIS"; - /// - /// Gets the category. - /// public FormatCategory Category => FormatCategory.Archive; - /// - /// Gets the capabilities. - /// public FormatCapabilities Capabilities => - FormatCapabilities.CanList | FormatCapabilities.CanExtract | FormatCapabilities.CanCreate | - FormatCapabilities.CanTest | FormatCapabilities.SupportsMultipleEntries | - FormatCapabilities.SupportsDirectories; - /// - /// Gets the default extension. - /// + FormatCapabilities.CanList | FormatCapabilities.CanExtract | FormatCapabilities.CanTest | + FormatCapabilities.SupportsMultipleEntries | FormatCapabilities.SupportsDirectories; public string DefaultExtension => ".exe"; - /// - /// Gets the extensions. - /// + // Detection is by the "NullsoftInst" first header (FormatDetector.DetectInstaller), not by ".exe". public IReadOnlyList Extensions => []; - /// - /// Gets the compound extensions. - /// public IReadOnlyList CompoundExtensions => []; - /// - /// Gets the magic signatures. - /// public IReadOnlyList MagicSignatures => []; - /// - /// Gets the methods. - /// - public IReadOnlyList Methods => [new("nsis", "NSIS")]; - /// - /// Gets the tar compression format id. - /// + public IReadOnlyList Methods => [new("zlib", "zlib"), new("bzip2", "bzip2"), new("lzma", "LZMA"), new("stored", "Stored")]; public string? TarCompressionFormatId => null; - /// - /// Gets the family. - /// public AlgorithmFamily Family => AlgorithmFamily.Archive; - /// - /// Gets the description. - /// - public string Description => "NSIS installer archive (Nullsoft Scriptable Install System)"; + public string Description => "NSIS installer (Nullsoft Scriptable Install System): the files of its install script"; - /// - /// Lists the entries in the supplied container. - /// public List List(Stream stream, string? password) { - var r = new NsisReader(stream); - return r.Entries.Select((e, i) => new ArchiveEntryInfo(i, e.FileName, e.Size, e.CompressedSize, - "nsis", e.IsDirectory, false, null)).ToList(); + NsisReader reader; + try { + reader = new NsisReader(stream, leaveOpen: true); + reader.ResolveSizes(); + } catch (Exception ex) when (ex is InvalidDataException or NotSupportedException or EndOfStreamException) { + var note = Metadata(null, ex.Message); + return [new ArchiveEntryInfo(0, "metadata.ini", note.Length, note.Length, "stored", false, false, null, Kind: "metadata")]; + } + + var method = MethodName(reader); + return reader.Entries.Select((e, i) => new ArchiveEntryInfo(i, e.FileName, e.Size, e.CompressedSize < 0 ? e.Size : e.CompressedSize, + method, false, false, e.LastModified)).ToList(); } - /// - /// Decodes the supplied input. - /// public void Extract(Stream stream, string outputDir, string? password, string[]? files) { - var r = new NsisReader(stream); - foreach (var e in r.Entries) { - if (e.IsDirectory) continue; - if (files != null && !MatchesFilter(e.FileName, files)) continue; - WriteFile(outputDir, e.FileName, r.Extract(e)); + NsisReader reader; + try { + reader = new NsisReader(stream, leaveOpen: true); + } catch (Exception ex) when (ex is InvalidDataException or NotSupportedException or EndOfStreamException) { + WriteFile(outputDir, "metadata.ini", Metadata(null, ex.Message)); + return; } + + var wanted = reader.Entries.Where(e => files == null || MatchesFilter(e.FileName, files)).ToList(); + reader.ExtractMany(wanted, (e, data) => WriteFile(outputDir, e.FileName, data)); } - /// - /// Opens a single entry as a bounded read-only stream. The reader produces - /// the decoded bytes per entry; the matched bytes are wrapped in a - /// sized - /// to their logical length. - /// + /// Opens one entry as a bounded read-only stream. public Stream OpenEntry(Stream archive, string entryName, string? password) { ArgumentNullException.ThrowIfNull(archive); ArgumentNullException.ThrowIfNull(entryName); - if (archive.CanSeek) archive.Position = 0; - var r = new NsisReader(archive); - foreach (var e in r.Entries) { - if (e.IsDirectory) continue; - if (!string.Equals(e.FileName, entryName, StringComparison.OrdinalIgnoreCase)) continue; - var bytes = r.Extract(e); - return new Compression.Registry.Streaming.BoundedEntryStream( - new MemoryStream(bytes, writable: false), bytes.Length, leaveOpen: false); - } - return new Compression.Registry.Streaming.BoundedEntryStream( - new MemoryStream(System.Array.Empty(), writable: false), 0, leaveOpen: false); + var bytes = this.ExtractEntryToMemory(archive, entryName, password); + return new Compression.Registry.Streaming.BoundedEntryStream(new MemoryStream(bytes, writable: false), bytes.Length, leaveOpen: false); } - /// Native in-memory single-entry extraction routed through the bounded . + /// Decodes one entry into memory; an unknown name yields no bytes. public byte[] ExtractEntryToMemory(Stream archive, string entryName, string? password) { - using var s = this.OpenEntry(archive, entryName, password); - using var memoryStream = new MemoryStream(); - s.CopyTo(memoryStream); - return memoryStream.ToArray(); + ArgumentNullException.ThrowIfNull(archive); + ArgumentNullException.ThrowIfNull(entryName); + if (archive.CanSeek) + archive.Position = 0; + using var reader = new NsisReader(archive, leaveOpen: true); + var entry = reader.Entries.FirstOrDefault(e => string.Equals(e.FileName, entryName, StringComparison.OrdinalIgnoreCase)); + return entry == null ? [] : reader.Extract(entry); } - /// - /// Performs the create operation. - /// - public void Create(Stream output, IReadOnlyList inputs, FormatCreateOptions options) { - var w = new NsisWriter(); - foreach (var i in inputs) { - if (i.IsDirectory) continue; - w.AddFile(i.ArchiveName, i.ReadContent()); - } - w.WriteTo(output); + private static string MethodName(NsisReader reader) { + var name = reader.Compression switch { + NsisCompression.Zlib => "zlib", + NsisCompression.BZip2 => "bzip2", + NsisCompression.Lzma => "lzma", + _ => "stored", + }; + return reader.IsSolid ? name + ":solid" : name; + } + + private static byte[] Metadata(NsisReader? reader, string? error) { + var sb = new StringBuilder(); + sb.Append("format=nsis\n"); + sb.Append(CultureInfo.InvariantCulture, $"parse_status={(reader == null ? "partial" : "ok")}\n"); + if (error != null) + sb.Append("error=").Append(error.Replace('\n', ' ')).Append('\n'); + return Encoding.UTF8.GetBytes(sb.ToString()); } } diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Nsis/NsisReader.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Nsis/NsisReader.cs index 0e1f331d6..9fdac647a 100644 --- a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Nsis/NsisReader.cs +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Nsis/NsisReader.cs @@ -1,421 +1,725 @@ using System.Buffers.Binary; +using System.Text; using Compression.Core.Deflate; using Compression.Core.Dictionary.Lzma; +using FileFormat.Bzip2; namespace FileFormat.Nsis; /// -/// Reads data blocks from an NSIS (Nullsoft Scriptable Install System) installer executable. +/// Reads the files an NSIS (Nullsoft Scriptable Install System) installer carries. /// /// -/// NSIS installers are Windows PE executables that carry compressed payload data in the file -/// overlay (bytes after the last PE section). This reader locates that overlay, validates the -/// NSIS first-header signature, and enumerates the embedded data blocks. -/// -/// Full file-name recovery requires executing the compiled NSIS install script, which is out of -/// scope for a static reader. Entries are therefore named "block_N" in the order they appear in -/// the data section. -/// -/// Supported compression methods: None (store), Zlib (Deflate), BZip2, LZMA. +/// Layout, from NSIS's own Source/exehead/fileform.h and fileform.c +/// (zlib/libpng licence): the exe stub, then at a multiple of 512 bytes the 28-byte +/// firstheader (flags, 0xDEADBEEF, "NullsoftInst", header length, archive length), then +/// either +/// +/// non-solid: a length-prefixed header block followed by one +/// length-prefixed block per file, each compressed on its own (bit 31 of the length word set) +/// or stored; or +/// solid: one compressed stream holding the same length-prefixed blocks, +/// lengths then without the compression bit. +/// +/// The header holds the install script as an array of 28-byte instructions plus a string +/// table. File names are recovered by replaying SetOutPath (EW_CREATEDIR) and +/// File (EW_EXTRACTFILE) the way 7-Zip's NSIS handler (LGPL-2.1+) does; its compressor +/// signature table and NSIS 2/3 string-code detection were the model for the ones here. /// public sealed class NsisReader : IDisposable { + private readonly Stream _stream; private readonly bool _leaveOpen; + private readonly long _streamStart; // absolute offset just past firstheader + private readonly long _nonSolidDataStart; // absolute offset of data-section offset 0 (non-solid) + private readonly byte[] _header; + private readonly int _stringsOffset; + private readonly int _stringChars; + private readonly List _entries = []; + private bool _sizesResolved; + private bool _disposed; - private readonly int _compressionType; - private readonly bool _isSolid; - private readonly long _overlayOffset; // absolute stream position of the NSIS first-header - private readonly long _headerDataOffset; // absolute stream position of the compressed header - private readonly int _headerDataSize; // compressed size of header block (0 = not known) - private readonly long _dataOffset; // absolute stream position of first data block - private readonly List _entries; + /// Gets the files the install script extracts, in script order. + public IReadOnlyList Entries => this._entries; - private bool _disposed; + /// Gets the compressor the installer was built with. + public NsisCompression Compression { get; } - /// Gets the data blocks found in the installer. - public IReadOnlyList Entries => _entries; + /// Gets whether the header and files share one compressed stream (/SOLID). + public bool IsSolid { get; } - /// - /// Gets the compression method used by this installer. - /// - public NsisCompression Compression => (NsisCompression)_compressionType; + /// Gets whether the installer's strings are UTF-16 (Unicode true, NSIS 3). + public bool IsUnicode { get; } - /// - /// Gets whether the installer uses solid (single-stream) compression. - /// - public bool IsSolid => _isSolid; + /// Gets whether the strings use the NSIS 3 escape codes rather than NSIS 2's. + public bool IsNsis3 { get; } - // ------------------------------------------------------------------------- - // Construction / parsing - // ------------------------------------------------------------------------- + /// Gets whether the header was written for a 64-bit exehead. + public bool Is64Bit { get; } + + /// Gets whether the LZMA stream carries the x86 branch-filter flag byte. + public bool HasFilterFlag { get; } + + /// Gets the file offset of firstheader. + public long FirstHeaderOffset { get; } + + /// Gets firstheader.flags (FH_FLAGS_*: 1 = uninstaller, 2 = silent, 4 = no CRC, 8 = force CRC). + public int FirstHeaderFlags { get; } + + /// Gets the uncompressed size of the script header. + public int HeaderLength { get; } + + /// Gets length_of_all_following_data: firstheader, data and CRC. + public int ArchiveLength { get; } /// - /// Opens an NSIS installer from a stream. The stream must be seekable. + /// Opens an NSIS installer. /// - /// A seekable stream positioned at the start of the PE executable. + /// A seekable stream holding the whole installer executable. /// Whether to leave open on dispose. + /// No NSIS first header, or a header that does not parse. + /// An LZMA stream behind the x86 branch filter. public NsisReader(Stream stream, bool leaveOpen = false) { ArgumentNullException.ThrowIfNull(stream); if (!stream.CanSeek) throw new ArgumentException("Stream must be seekable.", nameof(stream)); + this._stream = stream; + this._leaveOpen = leaveOpen; + + this.FirstHeaderOffset = FindFirstHeader(stream); + Span fh = stackalloc byte[NsisConstants.FirstHeaderSize]; + stream.Position = this.FirstHeaderOffset; + stream.ReadExactly(fh); + this.FirstHeaderFlags = BinaryPrimitives.ReadInt32LittleEndian(fh); + this.HeaderLength = BinaryPrimitives.ReadInt32LittleEndian(fh[20..]); + this.ArchiveLength = BinaryPrimitives.ReadInt32LittleEndian(fh[24..]); + if (this.HeaderLength <= 0 || this.HeaderLength > stream.Length * 64L) + throw new InvalidDataException($"Implausible NSIS header length {this.HeaderLength}."); + + this._streamStart = this.FirstHeaderOffset + NsisConstants.FirstHeaderSize; + Span sig = stackalloc byte[12]; + stream.Position = this._streamStart; + if (stream.ReadAtLeast(sig, sig.Length, throwOnEndOfStream: false) < sig.Length) + throw new InvalidDataException("NSIS data is truncated."); + + // The compressor is not recorded anywhere; it is recognised by the first bytes of the data, + // exactly as the table in 7-Zip's NsisIn.cpp lays out: + // LL LL LL LL (== header length) non-solid, header stored + // 5D 00 00 dd dd dd dd 00 solid LZMA ([00|01] before it: filter flag byte) + // SS SS SS 80 [ff] 5D 00 00 ... non-solid LZMA + // SS SS SS 80 31 tt non-solid bzip2 + // SS SS SS 80 .. non-solid Deflate + // 31 tt solid bzip2 + // anything else solid Deflate + var firstWord = BinaryPrimitives.ReadUInt32LittleEndian(sig); + bool filterFlag; + if (firstWord == (uint)this.HeaderLength) { + this.Compression = NsisCompression.None; + filterFlag = false; + } else if (IsLzma(sig, out filterFlag)) { + this.Compression = NsisCompression.Lzma; + this.IsSolid = true; + } else if (sig[3] == 0x80) { + this.Compression = IsLzma(sig[4..], out filterFlag) ? NsisCompression.Lzma + : IsBzip2(sig[4..]) ? NsisCompression.BZip2 + : NsisCompression.Zlib; + } else { + this.Compression = IsBzip2(sig) ? NsisCompression.BZip2 : NsisCompression.Zlib; + this.IsSolid = true; + } + this.HasFilterFlag = filterFlag; + + if (this.IsSolid) { + this._header = this.ReadSolidHeader(); + } else { + var blockLength = firstWord & ~NsisConstants.CompressedFlag; + this._nonSolidDataStart = this._streamStart + 4 + blockLength; + this._header = this.ReadBlock(this._streamStart); + if (this._header.Length != this.HeaderLength) + throw new InvalidDataException($"NSIS header block holds {this._header.Length} bytes, the first header promises {this.HeaderLength}."); + } - _stream = stream; - _leaveOpen = leaveOpen; - _entries = []; - - _overlayOffset = FindOverlay(); - stream.Position = _overlayOffset; - - // Read the NSIS first-header (28 bytes) - Span hdr = stackalloc byte[NsisConstants.FirstHeaderSize]; - stream.ReadExactly(hdr); - - // Validate signature at offset 4 within the first-header - if (!hdr.Slice(NsisConstants.SignatureOffset, NsisConstants.SignatureLength) - .SequenceEqual(NsisConstants.Signature)) - throw new InvalidDataException("NSIS signature not found at the expected overlay position."); - - var flags = BinaryPrimitives.ReadInt32LittleEndian(hdr); - _compressionType = flags & NsisConstants.CompressionMask; - _isSolid = (flags & NsisConstants.SolidFlag) != 0; - _headerDataSize = BinaryPrimitives.ReadInt32LittleEndian(hdr[20..]); - // archive_size at hdr[24..] — not currently used beyond validation - - _headerDataOffset = _overlayOffset + NsisConstants.FirstHeaderSize; - _dataOffset = _headerDataOffset + _headerDataSize; - - ScanDataBlocks(); + // NSIS 3's Deflate is stock; NSIS 2's stored blocks lack NLEN. Which one applies is known + // only from the strings, so the header itself was read with the stock rule first and the + // NSIS 2 rule as the fallback (DecodeBlock, ReadSolidHeader). + (this.Is64Bit, this._stringsOffset, this._stringChars, this.IsUnicode, this.IsNsis3) = this.ParseLayout(); + this.CollectEntries(); } - // ------------------------------------------------------------------------- - // Extraction - // ------------------------------------------------------------------------- + // ── public operations ─────────────────────────────────────────────── /// - /// Extracts the raw (decompressed) data for the given entry. + /// Returns the decompressed bytes of one entry. /// - /// An entry obtained from . - /// The decompressed bytes. + /// An entry from . public byte[] Extract(NsisEntry entry) { - ObjectDisposedException.ThrowIf(_disposed, this); + ObjectDisposedException.ThrowIf(this._disposed, this); ArgumentNullException.ThrowIfNull(entry); + byte[]? result = null; + this.ExtractMany([entry], (_, data) => result = data); + return result ?? throw new InvalidDataException($"NSIS data block for '{entry.FileName}' was not found."); + } - if (_isSolid) - throw new NotSupportedException( - "Extraction of individual entries from solid NSIS installers is not supported. " + - "Use ExtractSolidStream to obtain the full decompressed stream."); - - var index = _entries.IndexOf(entry); - if (index < 0) - throw new ArgumentException("Entry does not belong to this archive.", nameof(entry)); - - // Seek to the block - var blockPos = GetBlockOffset(index); - _stream.Position = blockPos; - - // Read 4-byte length prefix - Span lenBuf = stackalloc byte[4]; - _stream.ReadExactly(lenBuf); - var word = BinaryPrimitives.ReadUInt32LittleEndian(lenBuf); - - var stored = (word & NsisConstants.UncompressedFlag) != 0; - var compressedSize = (int)(word & ~NsisConstants.UncompressedFlag); + /// + /// Decodes the given entries, calling once per entry. A solid installer + /// is decoded in a single forward pass that stops after the last requested block. + /// + /// Entries from . + /// Receives each entry with its bytes. + public void ExtractMany(IEnumerable entries, Action sink) { + ObjectDisposedException.ThrowIf(this._disposed, this); + ArgumentNullException.ThrowIfNull(entries); + ArgumentNullException.ThrowIfNull(sink); + var byOffset = entries.GroupBy(e => e.DataOffset).ToDictionary(g => (long)g.Key, g => g.ToArray()); + if (byOffset.Count == 0) + return; - var compressedData = new byte[compressedSize]; - _stream.ReadExactly(compressedData); + if (!this.IsSolid) { + foreach (var (offset, group) in byOffset.OrderBy(kv => kv.Key)) { + var data = this.ReadBlock(this._nonSolidDataStart + offset); + foreach (var e in group) + sink(e, data); + } + return; + } - return stored ? compressedData : DecompressBlock(compressedData); + var pending = byOffset.Count; + this.WalkSolid( + wants: (offset, _) => byOffset.ContainsKey(offset), + deliver: (offset, data) => { + foreach (var e in byOffset[offset]) + sink(e, data); + return --pending > 0; + }); + if (pending > 0) + throw new InvalidDataException("The NSIS solid stream ended before every requested file."); } /// - /// Decompresses the entire solid data stream and returns it as a single byte array. - /// Only meaningful when is . + /// Fills in (and, for non-solid installers, ) + /// for every entry. Compressed blocks have to be decoded to learn their size. /// - public byte[] ExtractSolidStream() { - ObjectDisposedException.ThrowIf(_disposed, this); + public void ResolveSizes() { + ObjectDisposedException.ThrowIf(this._disposed, this); + if (this._sizesResolved) + return; - _stream.Position = _dataOffset; - using var slice = new SubStream(_stream, _stream.Length - _dataOffset, leaveOpen: true); - return DecompressFull(slice); + var byOffset = this._entries.GroupBy(e => (long)e.DataOffset).ToDictionary(g => g.Key, g => g.ToArray()); + if (!this.IsSolid) { + foreach (var (offset, group) in byOffset) { + var (stored, compressed) = this.MeasureBlock(this._nonSolidDataStart + offset); + foreach (var e in group) { + e.Size = stored; + e.CompressedSize = compressed; + } + } + } else if (byOffset.Count > 0) { + var pending = byOffset.Count; + this.WalkSolid( + wants: (offset, length) => { + if (!byOffset.TryGetValue(offset, out var group)) + return false; + foreach (var e in group) + e.Size = length; + if (--pending == 0) + throw new StopDecoding(); + return false; + }, + deliver: (_, _) => true); + } + this._sizesResolved = true; } - // ------------------------------------------------------------------------- - // IDisposable - // ------------------------------------------------------------------------- - /// public void Dispose() { - if (_disposed) return; - _disposed = true; - if (!_leaveOpen) - _stream.Dispose(); + if (this._disposed) + return; + this._disposed = true; + if (!this._leaveOpen) + this._stream.Dispose(); } - // ------------------------------------------------------------------------- - // Private helpers - // ------------------------------------------------------------------------- + // ── locating and decoding ─────────────────────────────────────────── - /// - /// Finds the overlay (data after the last PE section) by parsing the DOS/PE headers. - /// Falls back to scanning for the NSIS signature when the stream does not start with a PE. - /// - private long FindOverlay() { - _stream.Position = 0; - - // Try proper PE parsing first - var overlay = TryFindOverlayViaPe(); - if (overlay >= 0) { - // Confirm there is an NSIS signature at that position - if (HasNsisSignatureAt(overlay)) - return overlay; - - // The overlay might start further in if there is a stub before the NSIS header. - // Fall through to scan. + private static long FindFirstHeader(Stream stream) { + Span buf = stackalloc byte[NsisConstants.FirstHeaderSize]; + for (long pos = 0; pos + NsisConstants.FirstHeaderSize <= stream.Length; pos += NsisConstants.FirstHeaderAlignment) { + stream.Position = pos; + if (stream.ReadAtLeast(buf, buf.Length, throwOnEndOfStream: false) < buf.Length) + break; + if ((BinaryPrimitives.ReadInt32LittleEndian(buf) & ~NsisConstants.FirstHeaderFlagsMask) == 0 + && BinaryPrimitives.ReadUInt32LittleEndian(buf[4..]) == NsisConstants.FirstHeaderSignature + && buf.Slice(8, 12).SequenceEqual(NsisConstants.Magic)) + return pos; } - - // Fallback: linear scan from start - return ScanForSignature(); + throw new InvalidDataException("No NSIS first header found."); } - private long TryFindOverlayViaPe() { - try { - _stream.Position = 0; - using var reader = new BinaryReader(_stream, System.Text.Encoding.ASCII, leaveOpen: true); - - // DOS header: "MZ" - if (reader.ReadUInt16() != 0x5A4D) // 'MZ' - return -1; - - // e_lfanew at offset 0x3C - _stream.Position = 0x3C; - var peOffset = reader.ReadInt32(); - if (peOffset <= 0 || peOffset + 24 > _stream.Length) - return -1; - - _stream.Position = peOffset; - var peSig = reader.ReadUInt32(); - if (peSig != 0x00004550) // 'PE\0\0' - return -1; - - reader.ReadUInt16(); // Machine - var numSections = reader.ReadUInt16(); - reader.ReadUInt32(); // TimeDateStamp - reader.ReadUInt32(); // PointerToSymbolTable - reader.ReadUInt32(); // NumberOfSymbols - var sizeOfOptionalHeader = reader.ReadUInt16(); - reader.ReadUInt16(); // Characteristics - - long sectionTableOffset = peOffset + 24 + sizeOfOptionalHeader; - if (sectionTableOffset + numSections * 40L > _stream.Length) - return -1; - - long maxEnd = 0; - _stream.Position = sectionTableOffset; - for (var i = 0; i < numSections; ++i) { - // Section header is 40 bytes: - // 0..7 Name - // 8 VirtualSize - // 12 VirtualAddress - // 16 SizeOfRawData - // 20 PointerToRawData - // 24..39 other fields - var secHdr = reader.ReadBytes(40); - var rawSize = BinaryPrimitives.ReadUInt32LittleEndian(secHdr.AsSpan(16)); - var rawPtr = BinaryPrimitives.ReadUInt32LittleEndian(secHdr.AsSpan(20)); - long end = rawPtr + rawSize; - if (end > maxEnd) - maxEnd = end; - } - - return maxEnd > 0 ? maxEnd : -1; - } catch { - return -1; + private static bool IsLzma(ReadOnlySpan p, out bool filterFlag) { + filterFlag = false; + if (LooksLikeLzmaProperties(p)) + return true; + if (p[0] <= 1 && LooksLikeLzmaProperties(p[1..])) { + filterFlag = true; + return true; } + return false; } - private bool HasNsisSignatureAt(long position) { - if (position + NsisConstants.FirstHeaderSize > _stream.Length) - return false; + // lc=3 lp=0 pb=2 (0x5D), then a dictionary size below 2^31 that is a multiple of 64 KiB. + private static bool LooksLikeLzmaProperties(ReadOnlySpan p) + => p.Length >= 7 && p[0] == 0x5D && p[1] == 0 && p[2] == 0 && p[5] == 0 && (p[6] & 0x80) == 0; + + private static bool IsBzip2(ReadOnlySpan p) => p[0] == 0x31 && p[1] < 14; - _stream.Position = position + NsisConstants.SignatureOffset; - Span buf = stackalloc byte[NsisConstants.SignatureLength]; - if (!TryReadExact(_stream, buf)) - return false; + /// Reads one length-prefixed block of a non-solid installer. + private byte[] ReadBlock(long absoluteOffset) { + var (compressed, length) = this.ReadLengthWord(absoluteOffset); + if (!compressed) { + var raw = new byte[length]; + this._stream.ReadExactly(raw); + return raw; + } - return buf.SequenceEqual(NsisConstants.Signature); + using var output = new MemoryStream(); + this.DecodeBlock(absoluteOffset + 4, length, output); + return output.ToArray(); } - private long ScanForSignature() { - // Scan in 4-byte steps looking for the first 4 bytes of the signature (0xEFBEADDE) - const int bufSize = 65536; - var buf = new byte[bufSize + NsisConstants.SignatureLength]; - long pos = 0; + private (long Size, long Compressed) MeasureBlock(long absoluteOffset) { + var (compressed, length) = this.ReadLengthWord(absoluteOffset); + if (!compressed) + return (length, length); + using var counter = new CountingSink(); + this.DecodeBlock(absoluteOffset + 4, length, counter); + return (counter.Count, length); + } - _stream.Position = 0; - while (pos < _stream.Length) { - var read = _stream.Read(buf, 0, buf.Length); - if (read < NsisConstants.SignatureLength) - break; + private (bool Compressed, int Length) ReadLengthWord(long absoluteOffset) { + if (absoluteOffset < this._streamStart || absoluteOffset + 4 > this._stream.Length) + throw new InvalidDataException("NSIS data offset lies outside the file."); + Span word = stackalloc byte[4]; + this._stream.Position = absoluteOffset; + this._stream.ReadExactly(word); + var value = BinaryPrimitives.ReadUInt32LittleEndian(word); + var compressed = (value & NsisConstants.CompressedFlag) != 0 && this.Compression != NsisCompression.None; + var length = (long)(value & ~NsisConstants.CompressedFlag); + if (absoluteOffset + 4 + length > this._stream.Length) + throw new InvalidDataException("NSIS data block runs past the end of the file."); + return (compressed, (int)length); + } - for (var i = 0; i <= read - NsisConstants.SignatureLength; i++) { - if (buf[i] == 0xEF && buf[i + 1] == 0xBE && - buf[i + 2] == 0xAD && buf[i + 3] == 0xDE) { - var candidate = pos + i - NsisConstants.SignatureOffset; - if (candidate >= 0 && HasNsisSignatureAt(candidate)) - return candidate; - } + private void DecodeBlock(long absoluteOffset, int length, Stream output) { + // NSIS 2's inflate takes a stored block's LEN without NLEN; NSIS 3 is stock zlib. Before the + // strings have told the dialect apart (the header block itself) the stock rule is tried first. + var nsisDeflate = this._header is null ? (bool?)null : !this.IsNsis3; + if (nsisDeflate is null && this.Compression == NsisCompression.Zlib) { + var start = output.Position; + try { + this.DecodeBounded(absoluteOffset, length, output, nsisDeflate: false); + return; + } catch (InvalidDataException) { + output.SetLength(start); + output.Position = start; } - - // Rewind so we don't miss a signature that straddles a buffer boundary - pos += bufSize; - _stream.Position = pos; + nsisDeflate = true; } - - throw new InvalidDataException("NSIS signature not found in stream."); + this.DecodeBounded(absoluteOffset, length, output, nsisDeflate ?? false); } - /// - /// Iterates the non-solid data section to build the entry list. - /// For solid archives a single synthetic entry is added instead. - /// - private void ScanDataBlocks() { - if (_isSolid) { - // Solid: single entry for the whole compressed stream - var solidSize = _stream.Length - _dataOffset; - _entries.Add(new NsisEntry("solid_stream", -1, solidSize, false)); - return; - } - - // Non-solid: walk successive 4+N blocks until we run out of data or hit EOF - _stream.Position = _dataOffset; - var index = 0; - var lenBufArr = new byte[4]; + private void DecodeBounded(long absoluteOffset, int length, Stream output, bool nsisDeflate) { + this._stream.Position = absoluteOffset; + using var bounded = new SubStream(this._stream, length, leaveOpen: true); + this.Decode(bounded, output, nsisDeflate); + } - while (_stream.Position + 4 <= _stream.Length) { - if (!TryReadExact(_stream, lenBufArr)) + /// Decodes one compressed NSIS stream from into . + private void Decode(Stream input, Stream output, bool nsisDeflate) { + switch (this.Compression) { + case NsisCompression.Lzma: { + if (this.HasFilterFlag) { + var flag = input.ReadByte(); + if (flag < 0) + throw new InvalidDataException("NSIS LZMA stream is truncated."); + if (flag > 1) + throw new InvalidDataException($"Invalid NSIS LZMA filter flag {flag}."); + if (flag == 1) + throw new NotSupportedException("NSIS LZMA streams behind the x86 branch filter (seen only in 7-Zip's own installer) are not supported."); + } + var props = new byte[5]; + input.ReadExactly(props); + new LzmaDecoder(input, props).Decode(output); break; - Span lenBuf = lenBufArr; - - var word = BinaryPrimitives.ReadUInt32LittleEndian(lenBuf); - - // A zero word at the end of the section is the sentinel used by some NSIS versions. - if (word == 0) + } + case NsisCompression.Zlib: { + var inflater = new DeflateDecompressor(input) { StoredBlocksOmitComplement = nsisDeflate }; + var buffer = new byte[81920]; + while (true) { + var n = inflater.Decompress(buffer); + if (n <= 0) + break; + output.Write(buffer, 0, n); + } + if (!inflater.IsFinished) + throw new InvalidDataException("NSIS Deflate stream is truncated."); break; - - var stored = (word & NsisConstants.UncompressedFlag) != 0; - var compressedSize = (int)(word & ~NsisConstants.UncompressedFlag); - - if (compressedSize < 0 || _stream.Position + compressedSize > _stream.Length) + } + case NsisCompression.BZip2: { + using var bz = Bzip2Stream.OpenNsisDecoder(input, leaveOpen: true); + bz.CopyTo(output); break; + } + default: + input.CopyTo(output); + break; + } + } - var uncompressedSize = stored ? compressedSize : -1L; - _entries.Add(new NsisEntry( - $"block_{index}", - uncompressedSize, - compressedSize, - false)); - - _stream.Position += compressedSize; - ++index; + private byte[] ReadSolidHeader() { + byte[]? header = null; + try { + this.WalkSolid(wants: (_, _) => false, deliver: (_, _) => true, onHeader: data => header = data, nsisDeflate: false); + } catch (InvalidDataException) when (this.Compression == NsisCompression.Zlib) { + // A stored block without NLEN: an NSIS 2 stream. + header = null; + this.WalkSolid(wants: (_, _) => false, deliver: (_, _) => true, onHeader: data => header = data, nsisDeflate: true); } + return header ?? throw new InvalidDataException("NSIS solid stream ended inside the header."); } /// - /// Returns the absolute stream position of the length-prefix word for the block at - /// by replaying the block list from . + /// Runs the solid stream through a , which splits it into the header + /// block and the data blocks. /// - private long GetBlockOffset(int targetIndex) { - _stream.Position = _dataOffset; - var lenBufArr = new byte[4]; - - for (var i = 0; i < targetIndex; ++i) { - _stream.ReadExactly(lenBufArr); - var word = BinaryPrimitives.ReadUInt32LittleEndian(lenBufArr); - var size = (int)(word & ~NsisConstants.UncompressedFlag); - _stream.Position += size; + /// Called with each data block's offset and length; return true to receive its bytes. + /// Receives a wanted block; return false once nothing more is needed. + /// Receives the header block; when null the header is skipped. + /// Decode stored Deflate blocks the NSIS 2 way; defaults to what the strings showed. + private void WalkSolid(Func wants, Func deliver, Action? onHeader = null, bool? nsisDeflate = null) { + var sink = new SolidSink(this.HeaderLength, wants, deliver, onHeader); + var nsis2 = nsisDeflate ?? !this.IsNsis3; + try { + this._stream.Position = this._streamStart; + var remaining = this._stream.Length - this._streamStart; + using var bounded = new SubStream(this._stream, remaining, leaveOpen: true); + this.Decode(bounded, sink, nsis2); + } catch (StopDecoding) { + // The sink has everything it was asked for. } - - return _stream.Position; } - // ------------------------------------------------------------------------- - // Decompression helpers - // ------------------------------------------------------------------------- - - private byte[] DecompressBlock(byte[] data) => - _compressionType switch { - NsisConstants.CompNone => data, - NsisConstants.CompZlib => DecompressZlib(data), - NsisConstants.CompBzip2 => DecompressBzip2(data), - NsisConstants.CompLzma => DecompressLzma(data), - _ => throw new NotSupportedException($"Unsupported NSIS compression type: {_compressionType}") - }; - - private byte[] DecompressFull(Stream s) => - _compressionType switch { - NsisConstants.CompNone => ReadAllBytes(s), - NsisConstants.CompZlib => DecompressZlibStream(s), - NsisConstants.CompBzip2 => DecompressBzip2Stream(s), - NsisConstants.CompLzma => DecompressLzmaStream(s), - _ => throw new NotSupportedException($"Unsupported NSIS compression type: {_compressionType}") - }; - - // Zlib = 2-byte zlib header + raw Deflate - private static byte[] DecompressZlib(byte[] data) { - if (data.Length < NsisConstants.ZlibHeaderSize) - throw new InvalidDataException("Zlib block too short."); - var deflateData = data.AsSpan(NsisConstants.ZlibHeaderSize); - return DeflateDecompressor.Decompress(deflateData); + // ── header parsing ────────────────────────────────────────────────── + + private (bool Is64Bit, int StringsOffset, int StringChars, bool Unicode, bool Nsis3) ParseLayout() { + var h = this._header; + // header = flags, blocks[8] of {offset, num}; the offset is pointer-sized for a 64-bit + // exehead (12-byte packed records). A 64-bit layout shows as eight zero high words. + var is64 = h.Length >= 4 + 12 * 8; + for (var k = 0; is64 && k < 8; ++k) + if (ReadInt32(h, 4 + 12 * k + 4) != 0) + is64 = false; + var recordSize = is64 ? 12 : 8; + if (h.Length < 4 + recordSize * 8) + throw new InvalidDataException("NSIS header is too short for its block table."); + + int Offset(int block) => ReadInt32(h, 4 + recordSize * block); + int Count(int block) => ReadInt32(h, 4 + recordSize * block + recordSize - 4); + + var entriesOffset = Offset(NsisConstants.BlockEntries); + var entriesCount = Count(NsisConstants.BlockEntries); + var stringsOffset = Offset(NsisConstants.BlockStrings); + var langOffset = Offset(NsisConstants.BlockLangTables); + if (entriesOffset < 0 || stringsOffset < 0 || langOffset < stringsOffset || langOffset > h.Length || entriesOffset > h.Length) + throw new InvalidDataException("NSIS header block table is inconsistent."); + if (entriesCount < 0 || (long)entriesCount * NsisConstants.EntrySize > h.Length - entriesOffset) + throw new InvalidDataException("NSIS instruction table runs past the header."); + + var tableBytes = langOffset - stringsOffset; + if (tableBytes < 2 || h[langOffset - 1] != 0) + throw new InvalidDataException("NSIS string table is not terminated."); + // The table starts with the empty string; a UTF-16 table therefore starts with two zero bytes. + var unicode = h[stringsOffset] == 0 && h[stringsOffset + 1] == 0; + if (unicode && ((tableBytes & 1) != 0 || h[langOffset - 2] != 0)) + throw new InvalidDataException("NSIS UTF-16 string table is malformed."); + var chars = unicode ? tableBytes / 2 : tableBytes; + return (is64, stringsOffset, chars, unicode, DetectNsis3(h.AsSpan(stringsOffset, tableBytes), unicode)); } - private static byte[] DecompressZlibStream(Stream s) { - // Skip 2-byte zlib header - Span skip = stackalloc byte[NsisConstants.ZlibHeaderSize]; - s.ReadExactly(skip); - var decompressor = new DeflateDecompressor(s); - return decompressor.DecompressAll(); + /// + /// NSIS 3 escapes a variable as 0x03 plus a coded short with both high bits set; NSIS 2 used + /// 0xFD. Unicode installers are always NSIS 3. For ANSI ones, count both patterns. + /// + private static bool DetectNsis3(ReadOnlySpan table, bool unicode) { + if (unicode) + return true; + int nsis3 = 0, nsis2 = 0; + for (var i = 0; i + 2 < table.Length; ++i) { + if ((table[i + 1] & 0x80) == 0 || (table[i + 2] & 0x80) == 0) + continue; + if (table[i] == NsisConstants.Nsis3VarCode) + ++nsis3; + else if (table[i] == NsisConstants.Nsis2VarCode) + ++nsis2; + } + return nsis3 >= nsis2; } - private static byte[] DecompressBzip2(byte[] data) { - using var ms = new MemoryStream(data); - return DecompressBzip2Stream(ms); + private void CollectEntries() { + var h = this._header; + var recordSize = this.Is64Bit ? 12 : 8; + var entriesOffset = ReadInt32(h, 4 + recordSize * NsisConstants.BlockEntries); + var entriesCount = ReadInt32(h, 4 + recordSize * NsisConstants.BlockEntries + recordSize - 4); + + var outDir = "$INSTDIR"; + var seen = new HashSet<(string, uint)>(); + Span p = stackalloc int[6]; + for (var i = 0; i < entriesCount; ++i) { + var at = entriesOffset + i * NsisConstants.EntrySize; + var opcode = ReadInt32(h, at); + for (var k = 0; k < 6; ++k) + p[k] = ReadInt32(h, at + 4 + 4 * k); + + switch (opcode) { + case NsisConstants.OpCreateDir when p[1] != 0: { + // SetOutPath. "$OUTDIR\x" is relative to the current output directory. + var path = this.RenderString(p[0], out var leadingVar); + if (leadingVar == NsisConstants.VarOutDir) + path = outDir + path["$OUTDIR".Length..]; + outDir = path; + break; + } + case NsisConstants.OpExtractFile: { + var name = this.RenderString(p[1], out var leadingVar); + var absolute = leadingVar is NsisConstants.VarInstDir or NsisConstants.VarOutDir or NsisConstants.VarExeDir + or NsisConstants.VarTemp or NsisConstants.VarPluginsDir or ShellFolderMarker + || IsAbsolutePath(name); + var full = absolute ? name : outDir.TrimEnd('\\') + "\\" + (name.Length == 0 ? "file" : name); + if (full.StartsWith("$INSTDIR\\", StringComparison.OrdinalIgnoreCase)) + full = full["$INSTDIR\\".Length..].TrimStart('\\'); + full = full.Replace('\\', '/'); + var offset = (uint)p[2]; + if (!seen.Add((full, offset))) + break; + this._entries.Add(new NsisEntry(full, offset, ToFileTime(p[3], p[4]))); + break; + } + } + } } - private static byte[] DecompressBzip2Stream(Stream s) { - using var bzip2 = new FileFormat.Bzip2.Bzip2Stream( - s, global::Compression.Core.Streams.CompressionStreamMode.Decompress, leaveOpen: true); - using var result = new MemoryStream(); - bzip2.CopyTo(result); - return result.ToArray(); - } + private static bool IsAbsolutePath(string s) + => (s.Length >= 2 && s[0] == '\\' && s[1] == '\\') || (s.Length >= 2 && char.IsAsciiLetter(s[0]) && s[1] == ':'); - private static byte[] DecompressLzma(byte[] data) { - using var ms = new MemoryStream(data); - return DecompressLzmaStream(ms); + private static DateTime? ToFileTime(int low, int high) { + var ticks = ((long)(uint)high << 32) | (uint)low; + if (ticks <= 0 || ticks == -1 || ticks > DateTime.MaxValue.ToFileTimeUtc()) + return null; + return DateTime.FromFileTimeUtc(ticks); } - private static byte[] DecompressLzmaStream(Stream s) { - // NSIS LZMA sub-header: 5-byte properties + 8-byte uncompressed size (LE int64) - Span lzmaHdr = stackalloc byte[NsisConstants.LzmaHeaderSize]; - s.ReadExactly(lzmaHdr); + // ── strings ───────────────────────────────────────────────────────── + + private const int ShellFolderMarker = -2; + + /// + /// Renders a script string with its variables spelled out ($INSTDIR, $R0, + /// $SYSDIR, ...). reports what the string starts with: + /// a variable index, for a shell folder, or -1. + /// + private string RenderString(int index, out int leadingVar) { + leadingVar = -1; + if (index < 0) + return $"$(LSTR_{-(index + 1)})"; + if (index >= this._stringChars) + return string.Empty; + + var sb = new StringBuilder(); + int langCode, shellCode, varCode, skipCode; + if (this.IsNsis3) + (langCode, shellCode, varCode, skipCode) = (NsisConstants.Nsis3LangCode, NsisConstants.Nsis3ShellCode, NsisConstants.Nsis3VarCode, NsisConstants.Nsis3SkipCode); + else + (langCode, shellCode, varCode, skipCode) = (NsisConstants.Nsis2LangCode, NsisConstants.Nsis2ShellCode, NsisConstants.Nsis2VarCode, NsisConstants.Nsis2SkipCode); + + var pos = index; + var first = true; + while (pos < this._stringChars) { + var c = this.CharAt(pos++); + if (c == 0) + break; + if (c == langCode || c == shellCode || c == varCode) { + // Two bytes follow: one UTF-16 unit, or two ANSI bytes. Low byte first either way. + int b0, b1; + if (this.IsUnicode) { + var w = pos < this._stringChars ? this.CharAt(pos++) : 0; + (b0, b1) = (w & 0xFF, w >> 8); + } else { + b0 = pos < this._stringChars ? this.CharAt(pos++) : 0; + b1 = pos < this._stringChars ? this.CharAt(pos++) : 0; + } + var data = ((b1 & 0x7F) << 7) | (b0 & 0x7F); + if (c == varCode) { + if (first) + leadingVar = data; + sb.Append('$').Append(VariableName(data)); + } else if (c == shellCode) { + if (first) + leadingVar = ShellFolderMarker; + sb.Append(this.ShellFolderName(b0, b1)); + } else { + sb.Append("$(LSTR_").Append(data).Append(')'); + } + } else if (c == skipCode) { + if (pos < this._stringChars) + sb.Append(ToChar(this.CharAt(pos++))); + } else { + sb.Append(ToChar(c)); + } + first = false; + } + return sb.ToString(); + } - var props = lzmaHdr[..NsisConstants.LzmaPropSize].ToArray(); - var uncompressedSize = BinaryPrimitives.ReadInt64LittleEndian(lzmaHdr[NsisConstants.LzmaPropSize..]); + private int CharAt(int index) => this.IsUnicode + ? BinaryPrimitives.ReadUInt16LittleEndian(this._header.AsSpan(this._stringsOffset + index * 2)) + : this._header[this._stringsOffset + index]; + + // ANSI strings are in the compiling machine's code page, which the file does not record; + // Latin-1 keeps every byte distinct and round-trips the ASCII that file names nearly always are. + private static char ToChar(int c) => (char)c; + + private static string VariableName(int index) => index switch { + < 10 => index.ToString(System.Globalization.CultureInfo.InvariantCulture), + < 20 => "R" + (index - 10).ToString(System.Globalization.CultureInfo.InvariantCulture), + _ when index - 20 < NsisConstants.InternalVariables.Length => NsisConstants.InternalVariables[index - 20], + _ => "_" + (index - 20 - NsisConstants.InternalVariables.Length).ToString(System.Globalization.CultureInfo.InvariantCulture) + "_", + }; + + private string ShellFolderName(int index1, int index2) { + // Bit 7 set: the path comes from HKLM\Software\Microsoft\Windows\CurrentVersion, value name + // in the string table at (index1 & 0x3F); bit 6 asks for the 64-bit registry view. + if ((index1 & 0x80) != 0) { + var valueName = this.RenderString(index1 & 0x3F, out _); + var name = valueName switch { + "ProgramFilesDir" => "$PROGRAMFILES", + "CommonFilesDir" => "$COMMONFILES", + _ => "$_REGISTRY_(" + valueName + ")", + }; + return (index1 & 0x40) != 0 ? name + "64" : name; + } + var folders = NsisConstants.ShellFolders; + if (index1 < folders.Length && folders[index1] is { } a) + return "$" + a; + if (index2 < folders.Length && folders[index2] is { } b) + return "$" + b; + return "$_SHELL_" + index1.ToString(System.Globalization.CultureInfo.InvariantCulture) + "_"; + } - var decoder = new LzmaDecoder(s, props, uncompressedSize); - return decoder.Decode(); + private static int ReadInt32(byte[] data, int offset) + => offset >= 0 && offset + 4 <= data.Length ? BinaryPrimitives.ReadInt32LittleEndian(data.AsSpan(offset)) : 0; + + // ── solid stream splitting ────────────────────────────────────────── + + private sealed class StopDecoding : Exception; + + /// Counts bytes written to it and discards them. + private sealed class CountingSink : Stream { + public long Count { get; private set; } + public override bool CanRead => false; + public override bool CanSeek => false; + public override bool CanWrite => true; + public override long Length => this.Count; + public override long Position { get => this.Count; set => throw new NotSupportedException(); } + public override void Flush() { } + public override int Read(byte[] buffer, int offset, int count) => throw new NotSupportedException(); + public override long Seek(long offset, SeekOrigin origin) => throw new NotSupportedException(); + public override void SetLength(long value) => throw new NotSupportedException(); + public override void Write(byte[] buffer, int offset, int count) => this.Count += count; + public override void Write(ReadOnlySpan buffer) => this.Count += buffer.Length; } - // ------------------------------------------------------------------------- - // Low-level I/O helpers - // ------------------------------------------------------------------------- + /// + /// Write-only stream that splits a decoded solid stream into its blocks as the decoder + /// produces them: the header block first, then data blocks whose offsets count from the end of + /// the header block. It throws once its caller needs nothing more. + /// + private sealed class SolidSink(int headerLength, Func wants, Func deliver, Action? onHeader) : Stream { + private readonly byte[] _word = new byte[4]; + private int _wordFill; + private bool _inBlock; + private long _blockOffset = -1; // -1 = the header block + private long _nextOffset = -1; + private long _remaining; + private byte[]? _buffer; + private int _bufferFill; + + public override bool CanRead => false; + public override bool CanSeek => false; + public override bool CanWrite => true; + public override long Length => throw new NotSupportedException(); + public override long Position { get => throw new NotSupportedException(); set => throw new NotSupportedException(); } + public override void Flush() { } + public override int Read(byte[] buffer, int offset, int count) => throw new NotSupportedException(); + public override long Seek(long offset, SeekOrigin origin) => throw new NotSupportedException(); + public override void SetLength(long value) => throw new NotSupportedException(); + public override void Write(byte[] buffer, int offset, int count) => this.Write(buffer.AsSpan(offset, count)); + + public override void Write(ReadOnlySpan data) { + while (!data.IsEmpty) { + if (!this._inBlock) { + var take = Math.Min(4 - this._wordFill, data.Length); + data[..take].CopyTo(this._word.AsSpan(this._wordFill)); + this._wordFill += take; + data = data[take..]; + if (this._wordFill < 4) + return; + this._wordFill = 0; + this.BeginBlock((int)(BinaryPrimitives.ReadUInt32LittleEndian(this._word) & 0x7FFFFFFF)); + continue; + } - private static bool TryReadExact(Stream s, Span buf) => - s.ReadAtLeast(buf, buf.Length, throwOnEndOfStream: false) == buf.Length; + var n = (int)Math.Min(this._remaining, data.Length); + if (this._buffer != null) + data[..n].CopyTo(this._buffer.AsSpan(this._bufferFill)); + this._bufferFill += n; + this._remaining -= n; + data = data[n..]; + if (this._remaining == 0) + this.EndBlock(); + } + } + + private void BeginBlock(int length) { + this._blockOffset = this._nextOffset; + this._nextOffset = this._blockOffset < 0 ? 0 : this._blockOffset + 4 + length; + bool want; + if (this._blockOffset < 0) { + if (length != headerLength) + throw new InvalidDataException($"NSIS solid stream starts with a {length}-byte block, the first header promises {headerLength}."); + want = onHeader != null; + } else + want = wants(this._blockOffset, length); + + this._buffer = want ? new byte[length] : null; + this._bufferFill = 0; + this._remaining = length; + this._inBlock = true; + if (length == 0) + this.EndBlock(); + } - private static byte[] ReadAllBytes(Stream s) { - using var ms = new MemoryStream(); - s.CopyTo(ms); - return ms.ToArray(); + private void EndBlock() { + this._inBlock = false; + var data = this._buffer; + this._buffer = null; + if (this._blockOffset < 0) { + if (data != null) { + onHeader!(data); + throw new StopDecoding(); + } + return; + } + if (data != null && !deliver(this._blockOffset, data)) + throw new StopDecoding(); + } } } diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Nsis/NsisWriter.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Nsis/NsisWriter.cs deleted file mode 100644 index 722d36929..000000000 --- a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Nsis/NsisWriter.cs +++ /dev/null @@ -1,54 +0,0 @@ -#pragma warning disable CS1591 -using System.Buffers.Binary; - -namespace FileFormat.Nsis; - -/// -/// Writes a minimal NSIS-formatted file. No PE stub is emitted — the reader's -/// ScanForSignature fallback finds the NSIS overlay via linear scan when -/// PE parsing fails. Files are stored uncompressed as individual data blocks -/// (non-solid). Roundtrips through . -/// -/// Note: the produced file has no executable code and cannot be "run" to -/// install — the NSIS format is primarily an installer stub + overlay data, -/// and emitting a functional installer would require shipping a signed PE stub -/// which is out of scope for a compression toolkit. -/// -public sealed class NsisWriter { - private readonly List _blocks = []; - - /// - /// Performs the add file operation. - /// - public void AddFile(string name, byte[] data) { - ArgumentNullException.ThrowIfNull(data); - // NSIS data blocks have no embedded file names (the reader names them - // "block_N"); we simply treat each input as one opaque block. - _blocks.Add(data); - } - - /// - /// Writes the to to the supplied output. - /// - public void WriteTo(Stream output) { - // ── NSIS first-header (28 bytes) ── - Span hdr = stackalloc byte[NsisConstants.FirstHeaderSize]; - BinaryPrimitives.WriteInt32LittleEndian(hdr[..4], NsisConstants.CompNone); // flags: stored, non-solid - NsisConstants.Signature.CopyTo(hdr[NsisConstants.SignatureOffset..]); - BinaryPrimitives.WriteInt32LittleEndian(hdr.Slice(20, 4), 0); // header_size = 0 (no script header) - // archive_size (int32 LE) = total size of data blocks area — informational; reader doesn't enforce - var blocksSize = 0; - foreach (var b in _blocks) blocksSize += 4 + b.Length; - BinaryPrimitives.WriteInt32LittleEndian(hdr.Slice(24, 4), blocksSize); - output.Write(hdr); - - // ── Data blocks: each = 4-byte length (with UncompressedFlag) + raw data ── - Span lenBuf = stackalloc byte[4]; - foreach (var data in _blocks) { - var word = (uint)data.Length | NsisConstants.UncompressedFlag; // stored - BinaryPrimitives.WriteUInt32LittleEndian(lenBuf, word); - output.Write(lenBuf); - output.Write(data); - } - } -} diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Nsis/THIRD-PARTY-NOTICE.NSIS.txt b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Nsis/THIRD-PARTY-NOTICE.NSIS.txt new file mode 100644 index 000000000..2836dc9fb --- /dev/null +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Nsis/THIRD-PARTY-NOTICE.NSIS.txt @@ -0,0 +1,29 @@ +The NSIS reader in this directory was written from these sources: + +1. NSIS (Nullsoft Scriptable Install System), https://github.com/kichik/nsis, master as of + 2026-10-19: Source/exehead/fileform.h, fileform.c, util.c (installer layout, opcodes, + string escape codes) and Source/bzip2/decompress.c (the header-less bzip2 framing: block + marker 0x31, end marker 0x17, no CRCs). The structures and constants were taken over; the + code here is a new C# implementation. + + Copyright (C) 1999-2026 Nullsoft and Contributors. zlib/libpng license: + + This software is provided 'as-is', without any express or implied warranty. In no event + will the authors be held liable for any damages arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, including commercial + applications, and to alter it and redistribute it freely, subject to the following + restrictions: + + 1. The origin of this software must not be misrepresented; you must not claim that you + wrote the original software. If you use this software in a product, an acknowledgment + in the product documentation would be appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be misrepresented + as being the original software. + 3. This notice may not be removed or altered from any source distribution. + +2. 7-Zip, https://github.com/ip7z/7zip, CPP/7zip/Archive/Nsis/NsisIn.cpp and NsisDecode.cpp + (GNU LGPL 2.1 or later), Copyright (C) Igor Pavlov: the compressor-signature table, the + NSIS 2 / NSIS 3 string-dialect check, the NSIS 2 stored-block rule (LEN without NLEN), the + shell-folder name table and the rule for naming files relative to $INSTDIR. Adapted into + this LGPL-3.0-or-later code base. diff --git a/Hawkynt.FileFormats.Archives/README.md b/Hawkynt.FileFormats.Archives/README.md index fe0e8de9c..10be4b4ca 100644 --- a/Hawkynt.FileFormats.Archives/README.md +++ b/Hawkynt.FileFormats.Archives/README.md @@ -190,7 +190,7 @@ Every State, Test, Maintenance, Compress/Decompress and Demux/Mux/Remux cell is | [JAR](https://en.wikipedia.org/wiki/JAR_(file_format)) | `Jar` | `.jar` | R/W | ✅ | defrag · wipe | | [docs.oracle.com](https://docs.oracle.com/en-us/javase/8/docs/technotes/guides/jar/jar.html) | | [MSI](https://en.wikipedia.org/wiki/Windows_Installer) | `Msi` | `.msi` `.msp` `.mst` | R/W | ✅ | wipe | CFB envelope; a functional Installer database is not synthesised | [Microsoft Learn](https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-cfb/) | | [MSIX](https://en.wikipedia.org/wiki/MSIX) | `Msix` | `.msix` `.msixbundle` | R/W | ✅ | defrag · wipe | Unsigned fresh package output | [Microsoft Learn](https://learn.microsoft.com/en-us/windows/msix/) | -| [NSIS](https://en.wikipedia.org/wiki/Nullsoft_Scriptable_Install_System) | `Nsis` | | WORM | ✅ | defrag | Extraction plus overlay-oriented output, not an installer compiler; some versions expose no per-file extraction | [nsis.sourceforge.io](https://nsis.sourceforge.io/Docs/) | +| [NSIS](https://en.wikipedia.org/wiki/Nullsoft_Scriptable_Install_System) | `Nsis` | | R | ✅ | — | Files of the install script, zlib/bzip2/LZMA, solid or not, NSIS 2 and 3; checked against 7-Zip. LZMA behind the x86 branch filter is refused | [nsis.sourceforge.io](https://nsis.sourceforge.io/Docs/) | | [NuGet .nupkg](https://en.wikipedia.org/wiki/NuGet) | `NuPkg` | `.nupkg` | R/W | ✅ | defrag · wipe | | [Microsoft Learn](https://learn.microsoft.com/nuget/reference/nuspec) | | [OVA](https://en.wikipedia.org/wiki/Open_Virtualization_Format) | `Ova` | `.ova` | WORM | ✅ | — | Stays WORM: the manifest must cover every member | [dmtf.org](https://www.dmtf.org/standards/ovf) | | [Pack200](https://en.wikipedia.org/wiki/Pack200) | `Pack200` | `.pack` | R | ✅ | — | Listing only: class names are decoded from a subset of bands; full `.class` reconstruction and creation are not implemented | [docs.oracle.com](https://docs.oracle.com/javase/8/docs/technotes/guides/pack200/pack-spec.html) | diff --git a/Hawkynt.FileFormats.Archives/REFERENCE.md b/Hawkynt.FileFormats.Archives/REFERENCE.md index 0df10d396..d982c7b79 100644 --- a/Hawkynt.FileFormats.Archives/REFERENCE.md +++ b/Hawkynt.FileFormats.Archives/REFERENCE.md @@ -22992,87 +22992,85 @@ Implements `IArchiveFormatOperations`, `IArchiveInMemoryExtract`, `IFormatDescri ### Namespace `FileFormat.Nsis` -[`NsisCompression`](#nsiscompression) · [`NsisEntry`](#nsisentry) · [`NsisFormatDescriptor`](#nsisformatdescriptor) · [`NsisReader`](#nsisreader) · [`NsisWriter`](#nsiswriter) +[`NsisCompression`](#nsiscompression) · [`NsisEntry`](#nsisentry) · [`NsisFormatDescriptor`](#nsisformatdescriptor) · [`NsisReader`](#nsisreader) #### `NsisCompression` -Identifies the compression algorithm used in an NSIS installer. +Identifies the compressor an NSIS installer was built with (`SetCompressor`). | Value | Numeric | Summary | | --- | --- | --- | -| `None` | `0` | No compression — data is stored verbatim. | -| `Zlib` | `1` | Zlib/Deflate compression (2-byte zlib header + raw Deflate stream). | -| `BZip2` | `2` | BZip2 block-sorted compression. | -| `Lzma` | `3` | LZMA compression (5-byte properties header + raw LZMA stream). | +| `None` | `0` | Nothing is compressed: the header and every block are stored. | +| `Zlib` | `1` | "zlib": raw Deflate with no zlib wrapper (NSIS 2's inflate also omits stored-block NLEN). | +| `BZip2` | `2` | "bzip2": NSIS's header-less bzip2 dialect. | +| `Lzma` | `3` | "lzma": a 5-byte properties header, then range-coded data ending in an end marker. | #### `NsisEntry` -Represents a data block embedded in an NSIS installer. +A file an NSIS installer extracts: one `File` instruction of the install script. Implements `IEquatable`. | Member | Signature | Summary | | --- | --- | --- | -| `NsisEntry` | `NsisEntry(string FileName, long Size, long CompressedSize, bool IsDirectory)` | Represents a data block embedded in an NSIS installer. | -| `CompressedSize` | `long CompressedSize { get; init; }` | The compressed size in bytes, or -1 when unknown (solid stream). | -| `FileName` | `string FileName { get; init; }` | The entry name. Will be a generated name such as "block_0" unless the installer header was successfully parsed to recover actual file names. | -| `IsDirectory` | `bool IsDirectory { get; init; }` | Whether the entry represents a directory. | -| `Size` | `long Size { get; init; }` | The uncompressed size in bytes, or -1 when unknown (solid stream). | +| `NsisEntry` | `NsisEntry(string FileName, uint DataOffset, DateTime? LastModified)` | A file an NSIS installer extracts: one `File` instruction of the install script. | +| `CompressedSize` | `long CompressedSize { get; }` | Gets the stored size of the file's block, or -1 when the block lives inside a solid stream and therefore has no size of its own. | +| `DataOffset` | `uint DataOffset { get; init; }` | Offset of the file's length-prefixed block within the data section. | +| `FileName` | `string FileName { get; init; }` | The target path as the script names it, with forward slashes. A leading `$INSTDIR` is dropped, as 7-Zip does; any other variable (`$PLUGINSDIR`, `$SYSDIR`, ...) stays. | +| `IsDirectory` | `bool IsDirectory { get; }` | Gets whether the entry is a directory; NSIS `File` entries never are. | +| `LastModified` | `DateTime? LastModified { get; init; }` | The file time the compiler recorded, in UTC, or `null` when none. | +| `Size` | `long Size { get; }` | Gets the uncompressed size in bytes, or -1 until the size has been resolved. | #### `NsisFormatDescriptor` -NSIS (Nullsoft Scriptable Install System) installer archive — PE stub plus compressed installer data. References: `https://nsis.sourceforge.io` — official NSIS project site and sources — the installer data layout is defined there`https://en.wikipedia.org/wiki/Nullsoft_Scriptable_Install_System` — Wikipedia`https://www.7-zip.org` — 7-Zip — widely used independent parser of NSIS installer payloads +NSIS (Nullsoft Scriptable Install System) installer: the files its install script extracts. References: `https://github.com/kichik/nsis` — NSIS sources; `Source/exehead/fileform.h` defines the layout (zlib/libpng licence)`https://nsis.sourceforge.io/Docs/` — NSIS documentation`https://www.7-zip.org` — 7-Zip's NSIS handler, the reference reader this one is checked against -Implements `IArchiveCreatable`, `IArchiveDefragmentable`, `IArchiveFormatOperations`, `IFormatDescriptor`. +Implements `IArchiveFormatOperations`, `IFormatDescriptor`. | Member | Signature | Summary | | --- | --- | --- | | `NsisFormatDescriptor` | `NsisFormatDescriptor()` | | -| `Capabilities` | `FormatCapabilities Capabilities { get; }` | Gets the capabilities. | -| `Category` | `FormatCategory Category { get; }` | Gets the category. | -| `CompoundExtensions` | `IReadOnlyList CompoundExtensions { get; }` | Gets the compound extensions. | -| `DefaultExtension` | `string DefaultExtension { get; }` | Gets the default extension. | -| `Description` | `string Description { get; }` | Gets the description. | -| `DisplayName` | `string DisplayName { get; }` | Gets the display name. | -| `Extensions` | `IReadOnlyList Extensions { get; }` | Gets the extensions. | -| `Family` | `AlgorithmFamily Family { get; }` | Gets the family. | -| `Id` | `string Id { get; }` | Gets the id. | -| `MagicSignatures` | `IReadOnlyList MagicSignatures { get; }` | Gets the magic signatures. | -| `Methods` | `IReadOnlyList Methods { get; }` | Gets the methods. | -| `TarCompressionFormatId` | `string TarCompressionFormatId { get; }` | Gets the tar compression format id. | -| `Create` | `void Create(Stream output, IReadOnlyList inputs, FormatCreateOptions options)` | Performs the create operation. | -| `Defragment` | `void Defragment(Stream archive)` | Rebuild-based defrag: extracts then re-creates the NSIS data block in listing order. | -| `Defragment` | `void Defragment(Stream archive, DefragOptions options)` | Rebuild-based defrag: extracts then re-creates the NSIS data block per the requested mode. | -| `ExtractEntryToMemory` | `byte[] ExtractEntryToMemory(Stream archive, string entryName, string password)` | Native in-memory single-entry extraction routed through the bounded `OpenEntry`. | -| `Extract` | `void Extract(Stream stream, string outputDir, string password, string[] files)` | Decodes the supplied input. | -| `List` | `List List(Stream stream, string password)` | Lists the entries in the supplied container. | -| `OpenEntry` | `Stream OpenEntry(Stream archive, string entryName, string password)` | Opens a single entry as a bounded read-only stream. The reader produces the decoded bytes per entry; the matched bytes are wrapped in a `BoundedEntryStream` sized to their logical length. | +| `Capabilities` | `FormatCapabilities Capabilities { get; }` | | +| `Category` | `FormatCategory Category { get; }` | | +| `CompoundExtensions` | `IReadOnlyList CompoundExtensions { get; }` | | +| `DefaultExtension` | `string DefaultExtension { get; }` | | +| `Description` | `string Description { get; }` | | +| `DisplayName` | `string DisplayName { get; }` | | +| `Extensions` | `IReadOnlyList Extensions { get; }` | | +| `Family` | `AlgorithmFamily Family { get; }` | | +| `Id` | `string Id { get; }` | | +| `MagicSignatures` | `IReadOnlyList MagicSignatures { get; }` | | +| `Methods` | `IReadOnlyList Methods { get; }` | | +| `TarCompressionFormatId` | `string TarCompressionFormatId { get; }` | | +| `ExtractEntryToMemory` | `byte[] ExtractEntryToMemory(Stream archive, string entryName, string password)` | Decodes one entry into memory; an unknown name yields no bytes. | +| `Extract` | `void Extract(Stream stream, string outputDir, string password, string[] files)` | | +| `List` | `List List(Stream stream, string password)` | | +| `OpenEntry` | `Stream OpenEntry(Stream archive, string entryName, string password)` | Opens one entry as a bounded read-only stream. | #### `NsisReader` -Reads data blocks from an NSIS (Nullsoft Scriptable Install System) installer executable. +Reads the files an NSIS (Nullsoft Scriptable Install System) installer carries. Implements `IDisposable`. | Member | Signature | Summary | | --- | --- | --- | -| `NsisReader` | `NsisReader(Stream stream, bool leaveOpen = false)` | Opens an NSIS installer from a stream. The stream must be seekable. | -| `Compression` | `NsisCompression Compression { get; }` | Gets the compression method used by this installer. | -| `Entries` | `IReadOnlyList Entries { get; }` | Gets the data blocks found in the installer. | -| `IsSolid` | `bool IsSolid { get; }` | Gets whether the installer uses solid (single-stream) compression. | +| `NsisReader` | `NsisReader(Stream stream, bool leaveOpen = false)` | Opens an NSIS installer. | +| `ArchiveLength` | `int ArchiveLength { get; }` | Gets `length_of_all_following_data`: firstheader, data and CRC. | +| `Compression` | `NsisCompression Compression { get; }` | Gets the compressor the installer was built with. | +| `Entries` | `IReadOnlyList Entries { get; }` | Gets the files the install script extracts, in script order. | +| `FirstHeaderFlags` | `int FirstHeaderFlags { get; }` | Gets `firstheader.flags` (FH_FLAGS_*: 1 = uninstaller, 2 = silent, 4 = no CRC, 8 = force CRC). | +| `FirstHeaderOffset` | `long FirstHeaderOffset { get; }` | Gets the file offset of `firstheader`. | +| `HasFilterFlag` | `bool HasFilterFlag { get; }` | Gets whether the LZMA stream carries the x86 branch-filter flag byte. | +| `HeaderLength` | `int HeaderLength { get; }` | Gets the uncompressed size of the script header. | +| `Is64Bit` | `bool Is64Bit { get; }` | Gets whether the header was written for a 64-bit exehead. | +| `IsNsis3` | `bool IsNsis3 { get; }` | Gets whether the strings use the NSIS 3 escape codes rather than NSIS 2's. | +| `IsSolid` | `bool IsSolid { get; }` | Gets whether the header and files share one compressed stream (`/SOLID`). | +| `IsUnicode` | `bool IsUnicode { get; }` | Gets whether the installer's strings are UTF-16 (`Unicode true`, NSIS 3). | | `Dispose` | `void Dispose()` | | -| `ExtractSolidStream` | `byte[] ExtractSolidStream()` | Decompresses the entire solid data stream and returns it as a single byte array. Only meaningful when `IsSolid` is `true`. | -| `Extract` | `byte[] Extract(NsisEntry entry)` | Extracts the raw (decompressed) data for the given entry. | - -#### `NsisWriter` - -Writes a minimal NSIS-formatted file. No PE stub is emitted — the reader's `ScanForSignature` fallback finds the NSIS overlay via linear scan when PE parsing fails. Files are stored uncompressed as individual data blocks (non-solid). Roundtrips through `NsisReader`. Note: the produced file has no executable code and cannot be "run" to install — the NSIS format is primarily an installer stub + overlay data, and emitting a functional installer would require shipping a signed PE stub which is out of scope for a compression toolkit. - -| Member | Signature | Summary | -| --- | --- | --- | -| `NsisWriter` | `NsisWriter()` | | -| `AddFile` | `void AddFile(string name, byte[] data)` | Performs the add file operation. | -| `WriteTo` | `void WriteTo(Stream output)` | Writes the to to the supplied output. | +| `ExtractMany` | `void ExtractMany(IEnumerable entries, Action sink)` | Decodes the given entries, calling `sink` once per entry. A solid installer is decoded in a single forward pass that stops after the last requested block. | +| `Extract` | `byte[] Extract(NsisEntry entry)` | Returns the decompressed bytes of one entry. | +| `ResolveSizes` | `void ResolveSizes()` | Fills in `Size` (and, for non-solid installers, `CompressedSize`) for every entry. Compressed blocks have to be decoded to learn their size. | ### Namespace `FileFormat.NuFx` diff --git a/docs/catalogue/GAPS.md b/docs/catalogue/GAPS.md index e32d9b445..3085c4ea5 100644 --- a/docs/catalogue/GAPS.md +++ b/docs/catalogue/GAPS.md @@ -24,7 +24,7 @@ exists. It warns when a capability letter has drifted from the live descriptor. | Gap type | Rows | Meaning | | --- | ---: | --- | | `MISSING` | 240 | a source lists it; no descriptor or building block covers it | -| `READ-ONLY-BUT-SOURCES-WRITE` | 23 | we only read it; a source or the format's own tool writes it | +| `READ-ONLY-BUT-SOURCES-WRITE` | 24 | we only read it; a source or the format's own tool writes it | | `PARTIAL` | 41 | covered, but the reader handles only part of the format (see the table below) | | `OK` | 221 | covered with no known gap against what the sources list | | `OURS-ONLY` | 458 | in our registry, listed by none of the seven sources | @@ -133,6 +133,7 @@ Every catalogued row where a source records write support (7-Zip, libarchive, an | Acronis True Image | `AcronisTib`, `AcronisTibx` | Acronis True Image | Wikipedia | | BeeGFS | `BeeGfs` | beegfs-setup-storage | Wikipedia | | BitRock InstallBuilder | `BitRock` | InstallBuilder | UniExtract | +| NSIS installer | `Nsis` | makensis | 7-Zip, XADMaster, UniExtract | | GPFS / IBM Storage Scale | `Gpfs` | mmcrfs | Wikipedia | | GlusterFS | `GlusterFs` | gluster volume create | Wikipedia | | HxC Floppy Emulator (HFE) | `Hfe` | HxC Floppy Emulator tool | PRONOM | @@ -170,7 +171,6 @@ running real-world samples. The file named at the end of each row is where the l | APFS | `Apfs` | 3 | no decmpfs (LZVN/LZFSE) compressed files, no encryption (ApfsReader.cs) | | Compiled HTML Help (CHM) | `Chm` | 3 | content sections above 1 unsupported (ChmReader.cs) | | FreeArc | `FreeArc` | 3 | only storing and lzma blocks decode; tornado/ppmd/lzp/grzip/rep/delta/exe and encryption are refused (FreeArcMethods.cs) | -| NSIS installer | `Nsis` | 3 | solid installers cannot be extracted per entry (NsisReader.cs) | | NTFS | `Ntfs` | 3 | WOF (XPRESS/LZX) compressed files not decoded; LZNT1 is | | QCOW / QCOW2 | `Qcow2` | 3 | no encryption, backing files, zstd clusters or extended L2 (Qcow2Structures.cs) | | SquashFS | `SquashFs` | 3 | SquashFS v4 only; v1-v3 rejected (SquashFsSuperblock.cs) | diff --git a/docs/catalogue/our-registry.csv b/docs/catalogue/our-registry.csv index b9f718474..22ea9daba 100644 --- a/docs/catalogue/our-registry.csv +++ b/docs/catalogue/our-registry.csv @@ -353,7 +353,7 @@ format,Nrbf,.NET BinaryFormatter / NRBF object graph,Archive,,.nrbf,Y,Y,Y, format,Nrg,NRG,Archive,,.nrg,Y,Y,Y,Y format,Nsa,NSA,Archive,,.nsa,Y,Y,Y,Y format,Nsf,NES Sound Format,Audio,,.nsf;.nsfe,Y,Y,, -format,Nsis,NSIS,Archive,,,Y,Y,Y, +format,Nsis,NSIS,Archive,,,Y,Y,, format,NsPack,NsPack (Win32 PE),Archive,,,Y,Y,, format,Nss,NSS (Novell Storage Services),Archive,Y,.nss,Y,Y,Y, format,Ntfs,NTFS,Archive,Y,.ntfs;.img,Y,Y,Y,Y diff --git a/docs/catalogue/reference-formats.csv b/docs/catalogue/reference-formats.csv index 56c5deac3..64935c806 100644 --- a/docs/catalogue/reference-formats.csv +++ b/docs/catalogue/reference-formats.csv @@ -210,7 +210,7 @@ MacBinary,bin;macbin,encoding,,,R,,R,fmt/1761;fmt/1762;fmt/1763,,3,https://en.wi AppleSingle / AppleDouble,as;adouble,encoding,,,R,,,fmt/967;fmt/968,,2,https://www.rfc-editor.org/rfc/rfc1740,AppleSingle;AppleDouble,Y,Y,Y,OK,, Intel HEX,hex;ihex,firmware,R,,,,,,,1,https://en.wikipedia.org/wiki/Intel_HEX,IntelHex,Y,Y,Y,OK,, Motorola S-record,srec;s19;mot,firmware,,,,R,,,,1,https://en.wikipedia.org/wiki/SREC_(file_format),Srec,Y,Y,,OK,, -NSIS installer,exe;nsis,installer,R,,R,,R,,,3,https://nsis.sourceforge.io/,Nsis,Y,Y,,PARTIAL,,solid installers cannot be extracted per entry (NsisReader.cs) +NSIS installer,exe;nsis,installer,R,,R,,R,,,3,https://nsis.sourceforge.io/,Nsis,Y,,,READ-ONLY-BUT-SOURCES-WRITE,makensis,"LZMA behind the x86 branch filter refused; uninstaller payload not listed (NsisReader.cs)" Inno Setup,exe,installer,,,,,R,,,1,https://jrsoftware.org/isinfo.php,InnoSetup,Y,Y,,PARTIAL,,listing only; file extraction throws for every Inno version (InnoSetupReader.cs) InstallShield (cab / exe),exe;cab;ex_;hdr,installer,,,,,R,fmt/1466,,2,,,,,,MISSING,, Wise Installer,exe,installer,,,,,R,,,1,,,,,,MISSING,, From 720047749353f43ec70b441d5ed181cff4f2e68b Mon Sep 17 00:00:00 2001 From: Hawkynt Date: Mon, 26 Oct 2026 13:05:40 +0100 Subject: [PATCH 17/48] * regenerate references --- Hawkynt.FileFormats.Archives/README.md | 2 +- docs/catalogue/GAPS.md | 2 +- docs/catalogue/reference-formats.csv | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Hawkynt.FileFormats.Archives/README.md b/Hawkynt.FileFormats.Archives/README.md index 10be4b4ca..dccf473d1 100644 --- a/Hawkynt.FileFormats.Archives/README.md +++ b/Hawkynt.FileFormats.Archives/README.md @@ -544,7 +544,7 @@ Use it when a .NET process needs to enumerate, extract, test, create, edit or in -Every public and protected member of all 2572 types, generated from the built assembly and its XML documentation, is in [REFERENCE.md](https://github.com/Hawkynt/CompressionWorkbench/blob/main/Hawkynt.FileFormats.Archives/REFERENCE.md). +Every public and protected member of all 2571 types, generated from the built assembly and its XML documentation, is in [REFERENCE.md](https://github.com/Hawkynt/CompressionWorkbench/blob/main/Hawkynt.FileFormats.Archives/REFERENCE.md). diff --git a/docs/catalogue/GAPS.md b/docs/catalogue/GAPS.md index 3085c4ea5..9bb95c1b8 100644 --- a/docs/catalogue/GAPS.md +++ b/docs/catalogue/GAPS.md @@ -25,7 +25,7 @@ exists. It warns when a capability letter has drifted from the live descriptor. | --- | ---: | --- | | `MISSING` | 240 | a source lists it; no descriptor or building block covers it | | `READ-ONLY-BUT-SOURCES-WRITE` | 24 | we only read it; a source or the format's own tool writes it | -| `PARTIAL` | 41 | covered, but the reader handles only part of the format (see the table below) | +| `PARTIAL` | 40 | covered, but the reader handles only part of the format (see the table below) | | `OK` | 221 | covered with no known gap against what the sources list | | `OURS-ONLY` | 458 | in our registry, listed by none of the seven sources | diff --git a/docs/catalogue/reference-formats.csv b/docs/catalogue/reference-formats.csv index 64935c806..0184360a7 100644 --- a/docs/catalogue/reference-formats.csv +++ b/docs/catalogue/reference-formats.csv @@ -210,7 +210,7 @@ MacBinary,bin;macbin,encoding,,,R,,R,fmt/1761;fmt/1762;fmt/1763,,3,https://en.wi AppleSingle / AppleDouble,as;adouble,encoding,,,R,,,fmt/967;fmt/968,,2,https://www.rfc-editor.org/rfc/rfc1740,AppleSingle;AppleDouble,Y,Y,Y,OK,, Intel HEX,hex;ihex,firmware,R,,,,,,,1,https://en.wikipedia.org/wiki/Intel_HEX,IntelHex,Y,Y,Y,OK,, Motorola S-record,srec;s19;mot,firmware,,,,R,,,,1,https://en.wikipedia.org/wiki/SREC_(file_format),Srec,Y,Y,,OK,, -NSIS installer,exe;nsis,installer,R,,R,,R,,,3,https://nsis.sourceforge.io/,Nsis,Y,,,READ-ONLY-BUT-SOURCES-WRITE,makensis,"LZMA behind the x86 branch filter refused; uninstaller payload not listed (NsisReader.cs)" +NSIS installer,exe;nsis,installer,R,,R,,R,,,3,https://nsis.sourceforge.io/,Nsis,Y,,,READ-ONLY-BUT-SOURCES-WRITE,makensis,LZMA behind the x86 branch filter refused; uninstaller payload not listed (NsisReader.cs) Inno Setup,exe,installer,,,,,R,,,1,https://jrsoftware.org/isinfo.php,InnoSetup,Y,Y,,PARTIAL,,listing only; file extraction throws for every Inno version (InnoSetupReader.cs) InstallShield (cab / exe),exe;cab;ex_;hdr,installer,,,,,R,fmt/1466,,2,,,,,,MISSING,, Wise Installer,exe,installer,,,,,R,,,1,,,,,,MISSING,, From ffc73b38f2fb86816213d95ad1d70dc238fa763c Mon Sep 17 00:00:00 2001 From: Hawkynt Date: Mon, 26 Oct 2026 13:05:44 +0100 Subject: [PATCH 18/48] + PartitionedDisk write support, 4Kn GPT, BSD/Amiga/Sun/SGI labels, resolver descent MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit + partitioned disks: 4Kn GPT, GPT backup recovery, BSD/Amiga RDB/Sun/SGI labels Symptom: a GPT disk with 4096-byte logical blocks was not recognised (the header was only looked for at byte 512), a damaged primary GPT lost the whole table, and bare BSD disklabels, Amiga RDB, Sun and SGI disks were not recognised at all. PartitionEditor's GPT LastUsableLBA overlapped the first backup entry sector, partitions could be added inside the GPT's own structures, and every rewrite replaced unique partition GUIDs, attribute bits and the disk GUID. Root cause: GptParser, MbrParser and PartitionEditor hard-coded 512-byte LBAs; the detector knew GPT, MBR and APM only; the editor validated partitions against the disk length, not the usable LBA range. Fix: the block size is the one at which LBA 1 holds a CRC-valid header (512 or 4096); a primary header or entry array failing its CRC falls back to the backup at AlternateLBA / the last LBA. MBR/EBR parsing takes the block size; the EBR walk stops at loops, at links leaving the extended partition and at EBRs without 0x55AA; a lone protective 0xEE entry is no partition. New readers for the stand-alone BSD disklabel, Amiga RDB (checksummed RDSK/PART chain), Sun label (magic + XOR checksum) and SGI volume header (magic + sum checksum), probed after GPT/MBR/APM. The editor counts in the disk's block size, refuses ranges outside [FirstUsableLBA, LastUsableLBA] (also before ConvertMbrToGpt writes), puts LastUsableLBA before the backup array, keeps existing entries' unique GUIDs and attributes and the disk GUID, and can write an empty GPT/MBR. Sourcing: rung 3 — UEFI 2.10 §5.2/§5.3 for MBR/GPT; 4.4BSD disklabel.h, AmigaOS NDK hardblocks.h/filehandler.h, Sun dklabel.h/vtoc.h and IRIX dvh.h for the label layouts and checksum rules. util-linux sfdisk/fdisk and GNU parted (GPL) were used only as black-box oracles: fdisk -b 4096 and sfdisk-written tables are read at the offsets they report, and parted mklabel amiga/sun/dvh/bsd labels at parted's offsets. parted's BSD labels do not satisfy the dkcksum rule (measured), so a stand-alone BSD label is accepted on its two magics and sane geometry instead. + PartitionedDisk: edit partition filesystems in place, add/remove partitions, create disks Symptom: a raw partitioned disk was read-only; files inside a partition could not be edited, partitions not added or removed, and no disk could be created from partition images. The partition-aware TryAdd/TryRemove the virtual-disk descriptors use wrote straight into the partition (a refusal half-way left a half-edited volume), accepted the generic re-create default as an "editor", deleted the wrong entry on MBR disks with an extended partition (detector and editor index differently), and could place a new partition over the backup GPT. Root cause: no write path on the descriptor; inner edits had no staging; whole-partition deletes used list indices instead of the entry itself. Fix: StagedWindowStream holds a partition edit's writes in 4 KiB pages, refuses writes or SetLength past the partition, and commits only after every edit in the call succeeded. TryAdd/TryRemove route PartitionN_Type/path through the partition filesystem's own Add/Remove (refused when it only has the interface's re-create default), resolve BSD slices, plan new partitions (1 MiB-aligned, inside the usable range, table capacity checked) before writing anything, and delete entries by their start and size. PartitionedDiskFormatDescriptor implements IArchiveModifiable, IArchiveCreatable (partition images on a fresh GPT or MBR, scheme/sectorSize options, loose files refused) and IArchiveWriteConstraints; purge is not offered. Every refusal leaves the image byte-identical. The shell evaluates drops against the folder being browsed, so a file dropped into a partition folder is accepted. Sourcing: rung 3 — UEFI 2.10 §5.2/§5.3 for the table layouts; the inner edits are the existing filesystem editors. Verified against GPL tools as oracles only: sgdisk -v ("No problems found"), sfdisk --verify, parted and fdisk -b 4096 read the created disks at our offsets; fsck.vfat -n and e2fsck -fn are clean after in-place adds/removes on an sfdisk-built GPT disk, mcopy and debugfs read the edits back, and no byte outside the partitions changes. # NestedStreamResolver descends into raw partitioned disks Symptom: ResolveDeepest on a raw MBR/GPT disk image (not wrapped in a VHD/VMDK/...) found no filesystem, and filesystems whose superblock lies past 4 KiB were not recognised at any level. Root cause: partition tables were only tried below a virtual-disk container, and format detection matched magic bytes in a fixed 4 KiB header. Fix: detection goes through FormatDetector.DetectByContent (the disk-image probe plus signatures as deep as the deepest registered one), after the fixed-VHD footer check; a PartitionedDisk result descends into its partitions, BSD slices included. Sourcing: no format work; reuses the content probe and partition readers. --- ARCHITECTURE.md | 18 +- Compression.Core/DiskImage/AmigaRdbParser.cs | 153 ++++++++ .../DiskImage/BsdDisklabelParser.cs | 37 ++ Compression.Core/DiskImage/GptParser.cs | 275 ++++++++++--- Compression.Core/DiskImage/MbrParser.cs | 66 ++-- Compression.Core/DiskImage/PartitionEditor.cs | 344 ++++++++++++----- .../DiskImage/PartitionTableDetector.cs | 135 +++++-- .../DiskImage/PartitionedDiskLister.cs | 362 +++++++++++++----- Compression.Core/DiskImage/SgiDvhParser.cs | 86 +++++ .../DiskImage/StagedWindowStream.cs | 153 ++++++++ Compression.Core/DiskImage/SunVtocParser.cs | 100 +++++ Compression.Core/REFERENCE.md | 133 ++++++- .../PartitionedDiskFormatDescriptor.cs | 236 ++++++++++-- Compression.Lib/FormatDetector.DiskImage.cs | 7 +- Compression.Lib/FormatDetector.cs | 2 +- Compression.Lib/NestedStreamResolver.cs | 72 ++-- .../ViewModels/MainViewModel.cs | 4 +- .../Views/PartitionsWindow.cs | 4 +- .../PartitionSchemeDetectionTests.cs | 317 +++++++++++++++ .../DiskImage/PartitionedDiskExternalTests.cs | 258 +++++++++++++ .../DiskImage/PartitionedDiskWriteTests.cs | 279 ++++++++++++++ .../NativeUI/ShellContentDetectionTests.cs | 20 +- .../Nested/NestedStreamResolverTests.cs | 24 ++ README.md | 4 + docs/catalogue/our-registry.csv | 2 +- docs/catalogue/reference-formats.csv | 8 +- 26 files changed, 2686 insertions(+), 413 deletions(-) create mode 100644 Compression.Core/DiskImage/AmigaRdbParser.cs create mode 100644 Compression.Core/DiskImage/SgiDvhParser.cs create mode 100644 Compression.Core/DiskImage/StagedWindowStream.cs create mode 100644 Compression.Core/DiskImage/SunVtocParser.cs create mode 100644 Compression.Tests/DiskImage/PartitionSchemeDetectionTests.cs create mode 100644 Compression.Tests/DiskImage/PartitionedDiskExternalTests.cs create mode 100644 Compression.Tests/DiskImage/PartitionedDiskWriteTests.cs diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index ca1218294..53444bf50 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -105,15 +105,27 @@ Candidate formats from earlier stages are validated by parsing their headers and |---|----------|--------| | 1 | A signature of ≥ 0.9 confidence and ≥ 4 bytes inside sector 0 | That format (VHDX, QCOW2, VMDK, XFS, SquashFS, gzip, …) | | 2 | ISO 9660 / UDF volume descriptors at 32 KiB | `Iso` / `Udf` — ahead of any partition table, so a hybrid ISO whose system area carries an MBR or GPT browses as the ISO | -| 3 | GPT header at LBA 1 whose CRC32 matches (UEFI 2.10 §5.3.2) | `PartitionedDisk` | +| 3 | GPT header at LBA 1 whose CRC32 matches (UEFI 2.10 §5.3.2), at 512- or 4096-byte logical blocks | `PartitionedDisk` | | 4 | Sector 0 ends in 0x55AA: validated MBR table vs. volume boot record (FAT BPB, NTFS/exFAT OEM ID) | Table only → `PartitionedDisk`; boot record only → that filesystem; both → `PartitionedDisk` only if a partition holds a recognisable filesystem | | 5 | Apple Partition Map | `PartitionedDisk` | -| 6 | A filesystem superblock signature of ≥ 0.75 confidence, up to the deepest one registered (ZFS at 128 KiB) | That filesystem | +| 6 | A checksummed SGI volume header, Sun label or Amiga Rigid Disk Block, or a stand-alone BSD disklabel (both magics, sane geometry) | `PartitionedDisk` | +| 7 | A filesystem superblock signature of ≥ 0.75 confidence, up to the deepest one registered (ZFS at 128 KiB) | That filesystem | -A valid MBR (UEFI 2.10 §5.2.1) has a boot indicator of 0x00 or 0x80 in all four entries, and each used entry starts at LBA ≥ 1 inside the image, is at least one sector long and does not overlap another used entry. A trailing 0x55AA alone does not make a partition table: every FAT, NTFS and exFAT boot sector has one. Bytes that prove nothing stay `Unknown`, so noise named `.img` is no longer handed to the FAT reader. A `.img` path that does not exist yet, or is empty, still resolves to FAT as the create target. The probe reads 40 KiB, and reads further, out to the deepest filesystem signature, only for stage 6. It never scans the image. +A valid MBR (UEFI 2.10 §5.2.1) has a boot indicator of 0x00 or 0x80 in all four entries, and each used entry starts at LBA ≥ 1 inside the image, is at least one sector long and does not overlap another used entry. A trailing 0x55AA alone does not make a partition table: every FAT, NTFS and exFAT boot sector has one. Bytes that prove nothing stay `Unknown`, so noise named `.img` is no longer handed to the FAT reader. A `.img` path that does not exist yet, or is empty, still resolves to FAT as the create target. The probe reads 40 KiB, and reads further, out to the deepest filesystem signature, only for stage 7. It never scans the image. `PartitionedDisk` lists each partition as a `PartitionN_Type/` directory holding the filesystem detected inside it (`InnerFsDetector`, which also reads past 4 KiB to find ISO 9660, UDF, JFS, btrfs and ZFS). A partition it does not recognise becomes a single `PartitionN_Type.raw` entry. Partitions are read through a `PartitionWindowStream` and never copied out. `OpenEntry` hands back the window itself, or the inner filesystem's entry stream over it. Virtual-disk containers (VHD, VHDX, VMDK, QCOW2, VDI, Bochs) are detected by their own signatures and run the same partition-aware listing over their guest disk. +Tables: GPT at 512- or 4096-byte logical blocks (the block size is the one at which LBA 1 holds a CRC-valid header; a damaged primary falls back to the backup header), MBR with its EBR chain of logical partitions, APM, a BSD disklabel inside a BSD slice or standing alone, Amiga RDB, Sun and SGI labels. Writing: + +| Operation | How | Refused when | +|-----------|-----|--------------| +| Add/remove `PartitionN_Type/path` | The partition's own filesystem editor runs in place on a `StagedWindowStream`: writes are staged and reach the disk only when every edit in the call succeeded | No recognised filesystem; its editor is only the generic re-create default; the filesystem refuses (full, unsupported case); it would grow past the partition | +| Add a root-level filesystem or `*.raw`/`*.img` image | New GPT/MBR entry after the last partition, 1 MiB-aligned where room allows, inside the usable LBA range | No free space; table full; not a partition image | +| Remove `PartitionN_Type` | `PartitionEditor.DeletePartition` (GPT, MBR, logical); the sectors stay | BSD/RDB/Sun/SGI/APM tables | +| `Create` | Partition images on a fresh GPT (`scheme=gpt`, default) or MBR, `sectorSize=512`/`4096`, partitions 1 MiB-aligned | A loose file; more than 128 (GPT) / 4 (MBR) images | + +Every refusal leaves the image byte-identical. `sgdisk -v`, `sfdisk --verify`, `parted`, `fdisk -b 4096`, `fsck.vfat` and `e2fsck` check the results (`PartitionedDiskExternalTests`). Resizing a partition is not an archive operation; the partition editor window does it through `PartitionEditor.ResizePartition` and the registered filesystem resizers. + `FormatDetector.DetectByContent(Stream)` runs the same probe over a seekable stream, such as an entry inside a container, without a file on disk. `FormatDetector.DetectCached(path)` is `Detect` with a cache keyed on path, length and last-write time, for UI state that is re-evaluated on every repaint. --- diff --git a/Compression.Core/DiskImage/AmigaRdbParser.cs b/Compression.Core/DiskImage/AmigaRdbParser.cs new file mode 100644 index 000000000..049a15207 --- /dev/null +++ b/Compression.Core/DiskImage/AmigaRdbParser.cs @@ -0,0 +1,153 @@ +using System.Buffers.Binary; +using System.Text; + +namespace Compression.Core.DiskImage; + +/// +/// Parses the Amiga Rigid Disk Block (RDB) partition scheme. Big-endian throughout. +/// +/// +/// +/// The RDSK block may sit in any of the first 16 blocks of the disk +/// (RDB_LOCATION_LIMIT). It links, by block number, a chain of PART blocks; each +/// carries the partition's drive name (a BCPL string) and a DosEnvec whose geometry — +/// low/high cylinder, surfaces, blocks per track, block size in longwords — places the +/// partition on the disk, plus the DosType naming its filesystem (DOS\1 = FFS, +/// PFS\3, LNX\0, …). Every block carries a checksum: the 32-bit sum of its first +/// SummedLongs longwords is zero. +/// +/// +/// A partition's byte range is LowCyl × Surfaces × BlocksPerTrack × SizeBlock × 4 for the +/// start and (HighCyl − LowCyl + 1) × Surfaces × BlocksPerTrack × SizeBlock × 4 for the +/// length. +/// +/// References: +/// +/// AmigaOS NDK, devices/hardblocks.h — struct RigidDiskBlock, struct PartitionBlock, RDB_LOCATION_LIMIT. +/// AmigaOS NDK, dos/filehandler.h — struct DosEnvec field order. +/// +/// +public static class AmigaRdbParser { + + private const uint RdskId = 0x5244534B; // "RDSK" + private const uint PartId = 0x50415254; // "PART" + private const uint EndOfList = 0xFFFFFFFF; + private const int SearchBlockSize = 512; + private const int LocationLimit = 16; + private const int MaxPartitions = 128; + + // RigidDiskBlock field offsets. + private const int RdbSummedLongs = 4; + private const int RdbBlockBytes = 16; + private const int RdbPartitionList = 28; + + // PartitionBlock field offsets. + private const int PbNext = 16; + private const int PbDriveName = 36; + private const int PbEnvironment = 128; + + // DosEnvec longword indices. + private const int DeTableSize = 0; + private const int DeSizeBlock = 1; + private const int DeSurfaces = 3; + private const int DeBlocksPerTrack = 5; + private const int DeLowCyl = 9; + private const int DeHighCyl = 10; + private const int DeDosType = 16; + + /// Reports whether a checksummed RDSK block sits in the first 16 blocks. + /// A seekable stream over the whole disk. + public static bool IsRdb(Stream disk) => FindRdb(disk) >= 0; + + /// Parses every partition the RDB's PART chain describes. + /// A seekable stream over the whole disk. + /// No valid RDB is present. + public static List Parse(Stream disk) { + var rdbBlock = FindRdb(disk); + if (rdbBlock < 0) throw new InvalidDataException("No Amiga Rigid Disk Block (RDSK) in the first 16 blocks."); + + var rdb = ReadBlock(disk, (long)rdbBlock * SearchBlockSize, SearchBlockSize); + var blockBytes = (int)BinaryPrimitives.ReadUInt32BigEndian(rdb.AsSpan(RdbBlockBytes)); + if (blockBytes is < 256 or > 65536 || (blockBytes & (blockBytes - 1)) != 0) blockBytes = SearchBlockSize; + + var result = new List(); + var seen = new HashSet(); + var next = BinaryPrimitives.ReadUInt32BigEndian(rdb.AsSpan(RdbPartitionList)); + while (next != EndOfList && result.Count < MaxPartitions && seen.Add(next)) { + var offset = (long)next * blockBytes; + if (offset + blockBytes > disk.Length) break; + var block = ReadBlock(disk, offset, blockBytes); + if (BinaryPrimitives.ReadUInt32BigEndian(block) != PartId || !ChecksumOk(block)) break; + + uint Env(int i) => BinaryPrimitives.ReadUInt32BigEndian(block.AsSpan(PbEnvironment + i * 4)); + var tableSize = Env(DeTableSize); + if (tableSize >= DeHighCyl) { + var bytesPerBlock = (long)Env(DeSizeBlock) * 4; + var cylinderBytes = (long)Env(DeSurfaces) * Env(DeBlocksPerTrack) * bytesPerBlock; + var low = Env(DeLowCyl); + var high = Env(DeHighCyl); + if (cylinderBytes > 0 && high >= low) { + var dosType = tableSize >= DeDosType ? Env(DeDosType) : 0; + result.Add(new PartitionEntry { + Index = result.Count, + StartOffset = low * cylinderBytes, + Size = (high - low + 1L) * cylinderBytes, + TypeName = DosTypeName(dosType), + TypeCode = $"0x{dosType:X8}", + Name = DriveName(block.AsSpan(PbDriveName, 32)), + Source = "RDB" + }); + } + } + + next = BinaryPrimitives.ReadUInt32BigEndian(block.AsSpan(PbNext)); + } + return result; + } + + private static int FindRdb(Stream disk) { + if (!disk.CanSeek) return -1; + for (var i = 0; i < LocationLimit; ++i) { + var offset = (long)i * SearchBlockSize; + if (offset + SearchBlockSize > disk.Length) break; + var block = ReadBlock(disk, offset, SearchBlockSize); + if (BinaryPrimitives.ReadUInt32BigEndian(block) == RdskId && ChecksumOk(block)) + return i; + } + return -1; + } + + /// The block's first SummedLongs longwords sum to zero (mod 2^32). + private static bool ChecksumOk(ReadOnlySpan block) { + var summed = BinaryPrimitives.ReadUInt32BigEndian(block[RdbSummedLongs..]); + if (summed < 4 || summed * 4L > block.Length) return false; + uint sum = 0; + for (var i = 0; i < summed; ++i) + sum += BinaryPrimitives.ReadUInt32BigEndian(block[(i * 4)..]); + return sum == 0; + } + + /// A BCPL string: a length byte followed by that many characters. + private static string DriveName(ReadOnlySpan bstr) { + var length = Math.Min(bstr[0], (byte)31); + return Encoding.Latin1.GetString(bstr.Slice(1, length)); + } + + /// Renders a DosType as its four characters, the last as a digit (DOS\1 → DOS1). + private static string DosTypeName(uint dosType) { + if (dosType == 0) return "Amiga"; + Span chars = stackalloc char[4]; + for (var i = 0; i < 4; ++i) { + var b = (byte)(dosType >> (24 - i * 8)); + chars[i] = b is >= 0x20 and < 0x7F ? (char)b : (char)('0' + b % 10); + } + return new string(chars); + } + + private static byte[] ReadBlock(Stream disk, long offset, int size) { + var buffer = new byte[size]; + disk.Position = offset; + _ = disk.ReadAtLeast(buffer, size, throwOnEndOfStream: false); + return buffer; + } +} diff --git a/Compression.Core/DiskImage/BsdDisklabelParser.cs b/Compression.Core/DiskImage/BsdDisklabelParser.cs index 87e94fd23..50e573697 100644 --- a/Compression.Core/DiskImage/BsdDisklabelParser.cs +++ b/Compression.Core/DiskImage/BsdDisklabelParser.cs @@ -61,6 +61,43 @@ public static class BsdDisklabelParser { /// true if a disklabel is present. public static bool IsDisklabel(Stream slice) => FindLabelOffset(slice) >= 0; + /// + /// Reports whether carries a disklabel that stands on its own — no MBR + /// slice around it, as a "dangerously dedicated" FreeBSD disk or a NetBSD/OpenBSD disk on a + /// non-PC port writes it. With nothing else vouching for the bytes the label must prove + /// itself structurally: d_magic and d_magic2 both present 132 bytes apart, a + /// sector size that is a power of two in [512, 8192], a partition count within + /// MAXPARTITIONS, and every used partition starting inside the disk. + /// + /// + /// d_checksum is deliberately not required: the labels GNU parted 3.x writes + /// (mklabel bsd) do not satisfy the 4.4BSD dkcksum XOR rule, and neither the + /// Linux kernel nor libblkid checks it — the two magics are what both rely on. + /// + /// A seekable stream over the whole disk. + public static bool IsStandaloneDisklabel(Stream disk) { + var labelOffset = FindLabelOffset(disk); + if (labelOffset < 0) return false; + var label = new byte[PartitionsOffset + MaxPartitions * PartitionRecordSize]; + disk.Position = labelOffset; + var read = disk.ReadAtLeast(label, label.Length, throwOnEndOfStream: false); + if (read < PartitionsOffset) return false; + var span = label.AsSpan(0, read); + if (ReadU32(span, Magic2Offset) != DiskMagic) return false; + var secSize = ReadU32(span, 40); + if (secSize is < 512 or > 8192 || (secSize & (secSize - 1)) != 0) return false; + var npartitions = BinaryPrimitives.ReadUInt16LittleEndian(span[NPartitionsOffset..]); + if (npartitions is 0 or > MaxPartitions) return false; + if (PartitionsOffset + npartitions * PartitionRecordSize > span.Length) return false; + var diskSectors = (ulong)disk.Length / secSize; + for (var i = 0; i < npartitions; ++i) { + var size = ReadU32(span, PartitionsOffset + i * PartitionRecordSize); + var offset = ReadU32(span, PartitionsOffset + i * PartitionRecordSize + 4); + if (size != 0 && offset >= diskSectors) return false; + } + return true; + } + /// /// Parses the BSD disklabel contained in and returns /// its filesystem partitions. diff --git a/Compression.Core/DiskImage/GptParser.cs b/Compression.Core/DiskImage/GptParser.cs index 9ebfb2180..de13f9df4 100644 --- a/Compression.Core/DiskImage/GptParser.cs +++ b/Compression.Core/DiskImage/GptParser.cs @@ -5,18 +5,34 @@ namespace Compression.Core.DiskImage; /// /// Parses GPT (GUID Partition Table) headers and partition entries. -/// GPT header is at LBA 1 (offset 512 for 512-byte sectors), with partition entries starting at LBA 2+. /// +/// +/// +/// The header lives at LBA 1, so its byte offset depends on the disk's logical block size: +/// 512 on a classic or 512e drive, 4096 on a 4Kn drive. Neither the protective MBR nor the +/// header records the block size, so it is found the way the UEFI specification implies: the +/// block size is the one for which LBA 1 holds a header whose CRC32 matches and that names +/// itself as LBA 1 (UEFI 2.10, §5.3.2). Every LBA in the header and the entry array is then +/// counted in that block size. +/// +/// +/// When the primary header or its entry array fails its CRC, the backup header at the last +/// LBA is used instead, as §5.3.2 directs. +/// +/// public static class GptParser { /// GPT signature: "EFI PART". private static ReadOnlySpan Signature => "EFI PART"u8; - /// Standard sector size. - private const int SectorSize = 512; + /// Logical block sizes probed for the header at LBA 1, in probe order. + public static IReadOnlyList SupportedSectorSizes { get; } = [512, 4096]; - /// GPT header offset (LBA 1). - private const int HeaderOffset = SectorSize; + /// Classic sector size, used when nothing else is known. + private const int DefaultSectorSize = 512; + + /// Bytes of the image needed to see LBA 1 at every supported block size. + public const int ProbeBytes = 4096 * 2; /// Minimum GPT header size. private const int MinHeaderSize = 92; @@ -24,28 +40,159 @@ public static class GptParser { /// Size of each GPT partition entry (minimum). private const int MinEntrySize = 128; + /// Upper bound on the entry array the parser will read (UEFI allows any count; real tables hold 128). + private const long MaxEntryArrayBytes = 16L * 1024 * 1024; + + /// Layout facts read from the header that was used to parse the table. + /// Logical block size every LBA is counted in. + /// The LBA the used header sits at (1 for the primary). + /// The LBA of the other header. + /// First LBA a partition may occupy. + /// Last LBA a partition may occupy. + /// The disk GUID. + /// Starting LBA of the entry array the used header points at. + /// Number of entries in the array. + /// Size of one entry in bytes. + /// true when the primary was unusable and the backup was read. + public sealed record HeaderInfo( + int SectorSize, ulong MyLba, ulong AlternateLba, ulong FirstUsableLba, ulong LastUsableLba, + Guid DiskGuid, ulong EntriesLba, uint EntryCount, uint EntrySize, bool FromBackup); + /// - /// Checks whether the given data contains a valid GPT header at LBA 1. + /// Checks whether LBA 1 carries the "EFI PART" signature at any supported block size. /// - /// At least 1024 bytes of disk image data starting at LBA 0. - /// true if a valid GPT signature is found at LBA 1. - public static bool IsGpt(ReadOnlySpan data) - => data.Length >= HeaderOffset + MinHeaderSize - && data.Slice(HeaderOffset, 8).SequenceEqual(Signature); + /// The start of the image (at least 1024 bytes for 512-byte blocks, 8 KiB for 4 KiB blocks). + public static bool IsGpt(ReadOnlySpan data) { + foreach (var size in SupportedSectorSizes) + if (data.Length >= size + MinHeaderSize && data.Slice(size, 8).SequenceEqual(Signature)) + return true; + return false; + } /// /// Checks that LBA 1 holds a GPT header that is internally consistent, not merely the - /// "EFI PART" signature: the header size lies in [92, 512], the header's own CRC32 matches - /// (computed with the CRC field zeroed, UEFI 2.10 §5.3.2), it names itself as LBA 1 and its - /// partition entries are 128 x 2^n bytes each, as the specification requires. + /// "EFI PART" signature, at any supported block size: see . + /// + /// The start of the image. + public static bool HasValidHeader(ReadOnlySpan data) => DetectSectorSize(data) > 0; + + /// + /// The logical block size for which LBA 1 holds a valid GPT header, or 0 when none does. /// - /// At least the first 1024 bytes of the image. - public static bool HasValidHeader(ReadOnlySpan data) { - if (!IsGpt(data)) return false; + /// The start of the image; 8 KiB covers every supported block size. + public static int DetectSectorSize(ReadOnlySpan data) { + foreach (var size in SupportedSectorSizes) + if (HasValidHeader(data, size)) + return size; + return 0; + } + + /// + /// Checks that LBA 1, counted in -byte blocks, holds a GPT header + /// that is internally consistent: the header size lies in [92, block size], the header's own + /// CRC32 matches (computed with the CRC field zeroed, UEFI 2.10 §5.3.2), it names itself as + /// LBA 1 and its partition entries are 128 x 2^n bytes each, as the specification requires. + /// + public static bool HasValidHeader(ReadOnlySpan data, int sectorSize) { + if (data.Length < sectorSize + MinHeaderSize) return false; + var header = data.Slice(sectorSize, Math.Min(sectorSize, data.Length - sectorSize)); + return IsValidHeaderBlock(header, sectorSize, expectedMyLba: 1); + } + + /// + /// The partition table's layout facts, or null when the image carries no usable GPT. + /// Uses the same header would. + /// + public static HeaderInfo? ReadHeader(Stream diskData) { + try { + return Locate(diskData, lenient: true)?.Info; + } catch (Exception ex) when (ex is IOException or InvalidDataException or ArgumentException) { + return null; + } + } + + /// + /// Parses all partitions from a GPT disk image, at whichever block size its header validates. + /// + /// The full disk image as a readable stream. + /// A list of partition entries. + public static List Parse(Stream diskData) => Parse(diskData, out _); + + /// + /// Parses all partitions and reports the header that described them. + /// + /// No GPT header at LBA 1 at any supported block size. + public static List Parse(Stream diskData, out HeaderInfo info) { + var located = Locate(diskData, lenient: true) + ?? throw new InvalidDataException("Invalid GPT: missing 'EFI PART' signature at LBA 1."); + info = located.Info; + return ParseEntries(located.Entries, info); + } + + private sealed record Located(HeaderInfo Info, byte[] Entries); - var header = data.Slice(HeaderOffset, Math.Min(SectorSize, data.Length - HeaderOffset)); + /// + /// Finds the header to trust: a primary whose header and entry-array CRCs both match; else + /// the backup it (or the end of the disk) points at, with the same checks; else, when + /// , a primary that carries only the signature — the reading older + /// images written without CRCs rely on. + /// + private static Located? Locate(Stream disk, bool lenient) { + var head = ReadAt(disk, 0, (int)Math.Min(ProbeBytes, disk.Length)); + foreach (var size in SupportedSectorSizes) { + if (!HasValidHeader(head, size)) continue; + var header = head.AsSpan(size, Math.Min(size, head.Length - size)); + if (TryReadEntries(disk, header, size, out var entries)) + return new Located(ToInfo(header, size, fromBackup: false), entries); + + // Entry array damaged: the backup describes the same table. + if (TryLocateBackup(disk, size, BinaryPrimitives.ReadUInt64LittleEndian(header[32..])) is { } backup) + return backup; + } + + // No primary validates: look for a backup at the end of the disk. + foreach (var size in SupportedSectorSizes) { + if (!IsGpt(head) && !HasProtectiveEntry(head)) break; + if (disk.Length < 2L * size) continue; + if (TryLocateBackup(disk, size, (ulong)(disk.Length / size - 1)) is { } backup) + return backup; + } + + if (!lenient) return null; + foreach (var size in SupportedSectorSizes) { + if (head.Length < size + MinHeaderSize || !head.AsSpan(size, 8).SequenceEqual(Signature)) continue; + var header = head.AsSpan(size, Math.Min(size, head.Length - size)); + var entrySize = BinaryPrimitives.ReadUInt32LittleEndian(header[84..]); + if (entrySize < MinEntrySize) + throw new InvalidDataException($"GPT entry size {entrySize} is smaller than minimum {MinEntrySize}."); + if (!TryReadEntryBytes(disk, header, size, out var entries)) + throw new InvalidDataException("GPT entry array lies outside the image."); + return new Located(ToInfo(header, size, fromBackup: false), entries); + } + return null; + } + + private static Located? TryLocateBackup(Stream disk, int sectorSize, ulong backupLba) { + var offset = (long)backupLba * sectorSize; + if (backupLba < 2 || offset + sectorSize > disk.Length) return null; + var block = ReadAt(disk, offset, sectorSize); + if (block.Length < sectorSize || !IsValidHeaderBlock(block, sectorSize, backupLba)) return null; + return TryReadEntries(disk, block, sectorSize, out var entries) + ? new Located(ToInfo(block, sectorSize, fromBackup: true), entries) + : null; + } + + private static bool HasProtectiveEntry(ReadOnlySpan head) { + if (head.Length < 512 || head[510] != 0x55 || head[511] != 0xAA) return false; + for (var i = 0; i < 4; ++i) + if (head[0x1BE + i * 16 + 4] == 0xEE) return true; + return false; + } + + private static bool IsValidHeaderBlock(ReadOnlySpan header, int sectorSize, ulong expectedMyLba) { + if (header.Length < MinHeaderSize || !header[..8].SequenceEqual(Signature)) return false; var headerSize = BinaryPrimitives.ReadUInt32LittleEndian(header[12..]); - if (headerSize < MinHeaderSize || headerSize > SectorSize || headerSize > header.Length) return false; + if (headerSize < MinHeaderSize || headerSize > sectorSize || headerSize > header.Length) return false; Span copy = stackalloc byte[(int)headerSize]; header[..(int)headerSize].CopyTo(copy); @@ -56,69 +203,71 @@ public static bool HasValidHeader(ReadOnlySpan data) { var myLba = BinaryPrimitives.ReadUInt64LittleEndian(header[24..]); var entrySize = BinaryPrimitives.ReadUInt32LittleEndian(header[84..]); var entryCount = BinaryPrimitives.ReadUInt32LittleEndian(header[80..]); - return myLba == 1 + return myLba == expectedMyLba && entrySize >= MinEntrySize && (entrySize & (entrySize - 1)) == 0 && entryCount is > 0 and <= 65536; } - /// - /// Parses all partitions from a GPT disk image. - /// - /// The full disk image as a readable stream. - /// A list of partition entries. - public static List Parse(Stream diskData) { - // Read GPT header at LBA 1. - var header = new byte[SectorSize]; - diskData.Position = HeaderOffset; - diskData.ReadExactly(header); - - if (!header.AsSpan(0, 8).SequenceEqual(Signature)) - throw new InvalidDataException("Invalid GPT: missing 'EFI PART' signature at LBA 1."); - - var revision = BinaryPrimitives.ReadUInt32LittleEndian(header.AsSpan(8)); - var headerSize = BinaryPrimitives.ReadUInt32LittleEndian(header.AsSpan(12)); - var partitionEntryLba = BinaryPrimitives.ReadUInt64LittleEndian(header.AsSpan(72)); - var numberOfEntries = BinaryPrimitives.ReadUInt32LittleEndian(header.AsSpan(80)); - var entrySize = BinaryPrimitives.ReadUInt32LittleEndian(header.AsSpan(84)); - - if (entrySize < MinEntrySize) - throw new InvalidDataException($"GPT entry size {entrySize} is smaller than minimum {MinEntrySize}."); - - // Read all partition entries. - var totalSize = (long)numberOfEntries * entrySize; - var entryData = new byte[totalSize]; - diskData.Position = (long)partitionEntryLba * SectorSize; - diskData.ReadExactly(entryData); + private static bool TryReadEntries(Stream disk, ReadOnlySpan header, int sectorSize, out byte[] entries) { + if (!TryReadEntryBytes(disk, header, sectorSize, out entries)) return false; + var expected = BinaryPrimitives.ReadUInt32LittleEndian(header[88..]); + return Compression.Core.Checksums.Crc32.Compute(entries) == expected; + } + private static bool TryReadEntryBytes(Stream disk, ReadOnlySpan header, int sectorSize, out byte[] entries) { + entries = []; + var entriesLba = BinaryPrimitives.ReadUInt64LittleEndian(header[72..]); + var count = BinaryPrimitives.ReadUInt32LittleEndian(header[80..]); + var size = BinaryPrimitives.ReadUInt32LittleEndian(header[84..]); + var total = (long)count * size; + if (total <= 0 || total > MaxEntryArrayBytes) return false; + if (entriesLba > (ulong)(long.MaxValue / sectorSize)) return false; + var offset = (long)entriesLba * sectorSize; + if (offset < 0 || offset + total > disk.Length) return false; + entries = ReadAt(disk, offset, (int)total); + return entries.Length == total; + } + + private static HeaderInfo ToInfo(ReadOnlySpan header, int sectorSize, bool fromBackup) => new( + sectorSize, + BinaryPrimitives.ReadUInt64LittleEndian(header[24..]), + BinaryPrimitives.ReadUInt64LittleEndian(header[32..]), + BinaryPrimitives.ReadUInt64LittleEndian(header[40..]), + BinaryPrimitives.ReadUInt64LittleEndian(header[48..]), + ReadMixedEndianGuid(header[56..]), + BinaryPrimitives.ReadUInt64LittleEndian(header[72..]), + BinaryPrimitives.ReadUInt32LittleEndian(header[80..]), + BinaryPrimitives.ReadUInt32LittleEndian(header[84..]), + fromBackup); + + private static List ParseEntries(byte[] entryData, HeaderInfo info) { var result = new List(); var index = 0; + var entrySize = (int)info.EntrySize; + var sectorSize = info.SectorSize; - for (var i = 0; i < (int)numberOfEntries; i++) { - var offset = (int)(i * entrySize); - var entry = entryData.AsSpan(offset, (int)entrySize); + for (var i = 0; i < (int)info.EntryCount; i++) { + var entry = entryData.AsSpan(i * entrySize, entrySize); // Read type GUID (mixed endian: first 3 components LE, last 2 BE). var typeGuid = ReadMixedEndianGuid(entry); if (typeGuid == Guid.Empty) continue; // Unused entry. - // Read unique GUID. - var uniqueGuid = ReadMixedEndianGuid(entry[16..]); - var firstLba = BinaryPrimitives.ReadUInt64LittleEndian(entry[32..]); var lastLba = BinaryPrimitives.ReadUInt64LittleEndian(entry[40..]); var attributes = BinaryPrimitives.ReadUInt64LittleEndian(entry[48..]); + if (lastLba < firstLba || firstLba > (ulong)(long.MaxValue / sectorSize) || lastLba > (ulong)(long.MaxValue / sectorSize)) + continue; // An inverted or impossible range describes no data. // Read UTF-16LE name (up to 36 characters = 72 bytes, starting at offset 56). - var nameLen = Math.Min(72, (int)entrySize - 56); + var nameLen = Math.Min(72, entrySize - 56); var name = Encoding.Unicode.GetString(entry.Slice(56, nameLen)).TrimEnd('\0'); - var sizeBytes = (long)(lastLba - firstLba + 1) * SectorSize; - result.Add(new() { Index = index++, - StartOffset = (long)firstLba * SectorSize, - Size = sizeBytes, + StartOffset = (long)firstLba * sectorSize, + Size = (long)(lastLba - firstLba + 1) * sectorSize, TypeName = PartitionTypeDatabase.GetGptTypeName(typeGuid), IsActive = (attributes & 0x04) != 0, // Legacy BIOS bootable attribute. TypeCode = typeGuid.ToString("D").ToUpperInvariant(), @@ -130,6 +279,14 @@ public static List Parse(Stream diskData) { return result; } + private static byte[] ReadAt(Stream disk, long offset, int count) { + if (count <= 0) return []; + var buffer = new byte[count]; + disk.Position = offset; + var read = disk.ReadAtLeast(buffer, count, throwOnEndOfStream: false); + return read == count ? buffer : buffer[..read]; + } + /// /// Reads a GUID in GPT mixed-endian format: first 3 components are little-endian, /// last 2 are big-endian (stored as-is). diff --git a/Compression.Core/DiskImage/MbrParser.cs b/Compression.Core/DiskImage/MbrParser.cs index 4e6688499..351b5ebe2 100644 --- a/Compression.Core/DiskImage/MbrParser.cs +++ b/Compression.Core/DiskImage/MbrParser.cs @@ -5,6 +5,7 @@ namespace Compression.Core.DiskImage; /// /// Parses MBR (Master Boot Record) partition tables, including extended/logical partition chains. /// The MBR sits at LBA 0 (offset 0) of a disk image, with 4 primary partition entries at offset 0x1BE. +/// The entries count in logical blocks: 512 bytes on a classic or 512e disk, 4096 on a 4Kn disk. /// public static class MbrParser { @@ -20,6 +21,9 @@ public static class MbrParser { /// Standard sector size. private const int SectorSize = 512; + /// Cap on logical partitions walked in one chain, so a damaged or hostile chain cannot spin. + private const int MaxLogicalPartitions = 256; + /// /// Checks whether the given data starts with a valid MBR. /// @@ -44,7 +48,8 @@ public static bool IsMbr(ReadOnlySpan data) /// /// At least the first 512 bytes of the image. /// Length of the whole image in bytes. - public static bool HasValidPartitionTable(ReadOnlySpan sector0, long diskLength) { + /// Logical block size the entries' LBAs are counted in. + public static bool HasValidPartitionTable(ReadOnlySpan sector0, long diskLength, int sectorSize = SectorSize) { if (!IsMbr(sector0)) return false; Span<(ulong Start, ulong End)> used = stackalloc (ulong, ulong)[4]; @@ -57,10 +62,10 @@ public static bool HasValidPartitionTable(ReadOnlySpan sector0, long diskL if (entry.Type == 0x00) continue; if (entry.LbaStart == 0 || entry.SectorCount == 0) return false; - var start = (ulong)entry.LbaStart * SectorSize; + var start = (ulong)entry.LbaStart * (ulong)sectorSize; if (start >= (ulong)diskLength) return false; - var end = start + (ulong)entry.SectorCount * SectorSize; + var end = start + (ulong)entry.SectorCount * (ulong)sectorSize; for (var j = 0; j < count; ++j) if (start < used[j].End && used[j].Start < end) return false; @@ -73,8 +78,9 @@ public static bool HasValidPartitionTable(ReadOnlySpan sector0, long diskL /// Parses all partitions from an MBR, including extended/logical partitions. /// /// The full disk image as a readable stream. + /// Logical block size the entries' LBAs are counted in (512, or 4096 on a 4Kn disk). /// A list of partition entries. - public static List Parse(Stream diskData) { + public static List Parse(Stream diskData, int sectorSize = SectorSize) { var mbr = new byte[SectorSize]; diskData.Position = 0; diskData.ReadExactly(mbr); @@ -90,15 +96,13 @@ public static List Parse(Stream diskData) { if (entry.Type == 0x00) continue; - if (entry.Type is 0x05 or 0x0F or 0x85) { - // Extended partition: walk the chain. - var extStart = entry.LbaStart; - ParseExtendedChain(diskData, extStart, extStart, result, ref index); + if (IsExtended(entry.Type)) { + ParseExtendedChain(diskData, entry.LbaStart, entry.LbaStart, entry.SectorCount, sectorSize, result, ref index); } else { result.Add(new() { Index = index++, - StartOffset = (long)entry.LbaStart * SectorSize, - Size = (long)entry.SectorCount * SectorSize, + StartOffset = (long)entry.LbaStart * sectorSize, + Size = (long)entry.SectorCount * sectorSize, TypeName = PartitionTypeDatabase.GetMbrTypeName(entry.Type), IsActive = entry.IsActive, TypeCode = $"0x{entry.Type:X2}", @@ -115,8 +119,9 @@ public static List Parse(Stream diskData) { /// Operates on a 512-byte buffer (no stream needed). /// /// The first 512 bytes of the disk image. + /// Logical block size the entries' LBAs are counted in. /// A list of primary partition entries (excluding empty entries). - public static List ParsePrimary(ReadOnlySpan mbr) { + public static List ParsePrimary(ReadOnlySpan mbr, int sectorSize = SectorSize) { if (mbr.Length < SectorSize) throw new ArgumentException("MBR data must be at least 512 bytes.", nameof(mbr)); @@ -130,35 +135,50 @@ public static List ParsePrimary(ReadOnlySpan mbr) { result.Add(new() { Index = index++, - StartOffset = (long)entry.LbaStart * SectorSize, - Size = (long)entry.SectorCount * SectorSize, + StartOffset = (long)entry.LbaStart * sectorSize, + Size = (long)entry.SectorCount * sectorSize, TypeName = PartitionTypeDatabase.GetMbrTypeName(entry.Type), IsActive = entry.IsActive, TypeCode = $"0x{entry.Type:X2}", - Source = entry.Type is 0x05 or 0x0F or 0x85 ? "MBR (Extended Container)" : "MBR" + Source = IsExtended(entry.Type) ? "MBR (Extended Container)" : "MBR" }); } return result; } - private static void ParseExtendedChain(Stream diskData, uint ebrLba, uint extStart, List result, ref int index) { + private static bool IsExtended(byte type) => type is 0x05 or 0x0F or 0x85; + + /// + /// Walks the chain of extended boot records. Each EBR's first entry is a logical partition + /// whose start is relative to that EBR; its second entry links to the next EBR, relative to + /// the start of the extended partition. The walk stops at a loop, at an EBR without the boot + /// signature, at a link that leaves the extended partition, and after + /// records. + /// + private static void ParseExtendedChain(Stream diskData, uint ebrLba, uint extStart, uint extSectors, int sectorSize, + List result, ref int index) { var seen = new HashSet(); + var extEnd = (ulong)extStart + extSectors; - while (ebrLba != 0 && seen.Add(ebrLba)) { + while (ebrLba != 0 && seen.Count < MaxLogicalPartitions && seen.Add(ebrLba)) { + if (ebrLba < extStart || ebrLba >= extEnd) + break; var ebr = new byte[SectorSize]; - diskData.Position = (long)ebrLba * SectorSize; - if (diskData.Read(ebr) < SectorSize) + diskData.Position = (long)ebrLba * sectorSize; + if (diskData.ReadAtLeast(ebr, SectorSize, throwOnEndOfStream: false) < SectorSize) + break; + if (BinaryPrimitives.ReadUInt16LittleEndian(ebr.AsSpan(510)) != BootSignature) break; // Entry 0: the logical partition (relative to this EBR's LBA). var logical = ParseEntry(ebr.AsSpan(PartitionTableOffset)); if (logical.Type != 0x00 && logical.SectorCount > 0) { - var logicalLba = ebrLba + logical.LbaStart; + var logicalLba = (long)ebrLba + logical.LbaStart; result.Add(new() { Index = index++, - StartOffset = (long)logicalLba * SectorSize, - Size = (long)logical.SectorCount * SectorSize, + StartOffset = logicalLba * sectorSize, + Size = (long)logical.SectorCount * sectorSize, TypeName = PartitionTypeDatabase.GetMbrTypeName(logical.Type), IsActive = logical.IsActive, TypeCode = $"0x{logical.Type:X2}", @@ -171,7 +191,9 @@ private static void ParseExtendedChain(Stream diskData, uint ebrLba, uint extSta if (next.Type == 0x00 || next.SectorCount == 0) break; - ebrLba = extStart + next.LbaStart; + var nextLba = (ulong)extStart + next.LbaStart; + if (nextLba > uint.MaxValue) break; + ebrLba = (uint)nextLba; } } diff --git a/Compression.Core/DiskImage/PartitionEditor.cs b/Compression.Core/DiskImage/PartitionEditor.cs index 150dc5510..33684d6d8 100644 --- a/Compression.Core/DiskImage/PartitionEditor.cs +++ b/Compression.Core/DiskImage/PartitionEditor.cs @@ -36,9 +36,16 @@ namespace Compression.Core.DiskImage; /// public sealed class PartitionEditor { - /// Standard sector size used by the editor. + /// + /// The classic logical block size, and the one a disk without a GPT is assumed to use unless + /// the caller says otherwise. A 4Kn GPT disk is edited in 4096-byte blocks: see + /// . + /// public const int SectorSize = 512; + /// Logical block sizes the editor supports. + public static IReadOnlyList SupportedSectorSizes => GptParser.SupportedSectorSizes; + private const int MbrSignatureOffset = 510; private const ushort MbrBootSignature = 0xAA55; private const int MbrTableOffset = 0x1BE; @@ -49,10 +56,11 @@ public sealed class PartitionEditor { private const int GptHeaderSize = 92; private const int DefaultGptEntrySize = 128; private const int GptEntryCount = 128; - private const int GptReservedSectors = 33; // 32 sectors of entries + 1 sector of header private static ReadOnlySpan GptSignature => "EFI PART"u8; private readonly Stream _stream; + private readonly int _requestedSectorSize; + private int _sectorSize; private PartitionScheme _scheme; private readonly List _entries = []; @@ -60,25 +68,103 @@ public sealed class PartitionEditor { // defaults applied when initialising a fresh GPT). private uint _gptEntrySize = DefaultGptEntrySize; private uint _gptEntryCount = GptEntryCount; + private Guid? _gptDiskGuid; /// Partition scheme currently in use on the disk image. public PartitionScheme Scheme => this._scheme; + /// + /// The logical block size every LBA on this disk is counted in: the size at which the GPT + /// header validated, or — for an MBR or blank disk — the size the editor was opened with. + /// + public int LogicalSectorSize => this._sectorSize; + /// /// Opens an editor over the given disk-image stream. The stream must be /// readable, writable, and seekable. The scheme (MBR/GPT/None) is /// auto-detected from the on-disk signature. /// - public PartitionEditor(Stream stream) { + public PartitionEditor(Stream stream) : this(stream, SectorSize) { } + + /// + /// Opens an editor over the given disk-image stream, counting LBAs in + /// -byte blocks unless a GPT on the disk validates at another + /// supported block size — the table on the disk decides, since rewriting it at a different + /// size would move every partition. + /// + /// Readable, writable, seekable disk image. + /// 512 or 4096. + public PartitionEditor(Stream stream, int sectorSize) { ArgumentNullException.ThrowIfNull(stream); if (!stream.CanRead) throw new ArgumentException("Stream must be readable.", nameof(stream)); if (!stream.CanWrite) throw new ArgumentException("Stream must be writable.", nameof(stream)); if (!stream.CanSeek) throw new ArgumentException("Stream must be seekable.", nameof(stream)); + if (!SupportedSectorSizes.Contains(sectorSize)) + throw new ArgumentOutOfRangeException(nameof(sectorSize), sectorSize, "Logical sector size must be 512 or 4096."); this._stream = stream; + this._requestedSectorSize = sectorSize; + this._sectorSize = sectorSize; this.Reload(); } + /// + /// Writes an empty partition table of over the start (and, for GPT, + /// the end) of and returns an editor over it. A GPT gets the + /// standard 128 entries of 128 bytes, its backup at the last LBA and a protective MBR. + /// + /// Readable, writable, seekable target, already at the disk's full length. + /// or . + /// 512 or 4096. + public static PartitionEditor CreateEmpty(Stream stream, PartitionScheme scheme, int sectorSize = SectorSize) { + ArgumentNullException.ThrowIfNull(stream); + if (!SupportedSectorSizes.Contains(sectorSize)) + throw new ArgumentOutOfRangeException(nameof(sectorSize), sectorSize, "Logical sector size must be 512 or 4096."); + if (stream.Length % sectorSize != 0) + throw new ArgumentException($"Disk length {stream.Length} is not a whole number of {sectorSize}-byte sectors.", nameof(stream)); + + // Clear whatever table the bytes held, so the editor starts from a blank disk. + var editor = new PartitionEditor(stream, sectorSize); + editor._entries.Clear(); + editor._gptRawSlots.Clear(); + editor._sectorSize = sectorSize; + switch (scheme) { + case PartitionScheme.Gpt: + editor._scheme = PartitionScheme.Gpt; + editor._gptEntrySize = DefaultGptEntrySize; + editor._gptEntryCount = GptEntryCount; + editor._gptDiskGuid = null; + editor.RewriteGpt(); + break; + case PartitionScheme.Mbr: + if (stream.Length / sectorSize > uint.MaxValue) + throw new InvalidOperationException("An MBR cannot address a disk of more than 2^32 sectors; use GPT."); + editor._scheme = PartitionScheme.Mbr; + editor.InitializeEmptyMbr(); + break; + default: + throw new ArgumentOutOfRangeException(nameof(scheme), scheme, "Only GPT and MBR tables can be created."); + } + return editor; + } + + /// Sectors the GPT entry array occupies at the current block size. + private long GptEntrySectors => ((long)this._gptEntrySize * this._gptEntryCount + this._sectorSize - 1) / this._sectorSize; + + /// First LBA a GPT partition may use: after the protective MBR, the header and the entry array. + private long GptFirstUsableLba => 2 + this.GptEntrySectors; + + /// Last LBA a GPT partition may use: before the backup entry array and the backup header. + private long GptLastUsableLba => this._stream.Length / this._sectorSize - this.GptEntrySectors - 2; + + /// + /// The byte range partitions may occupy under the current scheme: everything after LBA 0 for + /// MBR; between the primary and backup GPT structures for GPT. + /// + public (long Start, long End) UsableRange => this._scheme == PartitionScheme.Gpt + ? (this.GptFirstUsableLba * this._sectorSize, (this.GptLastUsableLba + 1) * this._sectorSize) + : (this._sectorSize, this._stream.Length / this._sectorSize * this._sectorSize); + /// /// Convenience factory for an editor backed by an /// container (VHD/VHDX/VMDK/QCOW2/VDI). The caller is responsible for @@ -115,9 +201,10 @@ public IReadOnlyList ListPartitions() /// Range overlaps an existing /// partition or exceeds the disk length. public void AddPartition(long startByteOffset, long lengthBytes, PartitionType type, string? label) { - ValidateRange(startByteOffset, lengthBytes); + this.ValidateRange(startByteOffset, lengthBytes); this.RequireFits(startByteOffset, lengthBytes); this.RequireNoOverlap(startByteOffset, lengthBytes); + this.RequireUsable(startByteOffset, lengthBytes); if (this._scheme == PartitionScheme.None) { // No table yet — promote to MBR. @@ -185,7 +272,7 @@ public void AddPartition(long startByteOffset, long lengthBytes, PartitionType t /// No extended container exists, /// range outside container, or overlap detected. public void AddLogicalPartition(long startByteOffset, long lengthBytes, PartitionType type, string? label) { - ValidateRange(startByteOffset, lengthBytes); + this.ValidateRange(startByteOffset, lengthBytes); if (this._scheme != PartitionScheme.Mbr) throw new InvalidOperationException("Logical partitions only exist in MBR layouts."); @@ -204,13 +291,13 @@ public void AddLogicalPartition(long startByteOffset, long lengthBytes, Partitio var existingLogicals = this._entries.Count(e => e.Source == "EBR"); if (existingLogicals == 0) { // First logical: container_start + 1 sector is the earliest legal data offset. - if (startByteOffset < container.StartOffset + SectorSize) + if (startByteOffset < container.StartOffset + this._sectorSize) throw new InvalidOperationException( - $"First logical must start at or after container_start + 1 sector ({container.StartOffset + SectorSize}); got {startByteOffset}."); + $"First logical must start at or after container_start + 1 sector ({container.StartOffset + this._sectorSize}); got {startByteOffset}."); } else { // Subsequent logical needs an EBR sector before it. - var ebrLba = (startByteOffset / SectorSize) - 1; - var ebrStart = ebrLba * SectorSize; + var ebrLba = (startByteOffset / this._sectorSize) - 1; + var ebrStart = ebrLba * this._sectorSize; if (ebrStart <= container.StartOffset) throw new InvalidOperationException( $"Logical start ({startByteOffset}) leaves no room for an EBR sector inside the extended container [{container.StartOffset}..{container.StartOffset + container.Size})."); @@ -221,8 +308,8 @@ public void AddLogicalPartition(long startByteOffset, long lengthBytes, Partitio $"Logical end ({startByteOffset + lengthBytes}) exceeds extended container end ({container.StartOffset + container.Size})."); // Overlap check: EBR + data for non-first; just data for first (EBR is at container start). - var checkStart = existingLogicals == 0 ? startByteOffset : startByteOffset - SectorSize; - var checkLength = existingLogicals == 0 ? lengthBytes : SectorSize + lengthBytes; + var checkStart = existingLogicals == 0 ? startByteOffset : startByteOffset - this._sectorSize; + var checkLength = existingLogicals == 0 ? lengthBytes : this._sectorSize + lengthBytes; this.RequireNoOverlap(checkStart, checkLength); var entry = new PartitionEntry { @@ -278,9 +365,9 @@ public void PurgePartition(int index) { // For logicals also zero the preceding EBR sector. if (e.Source == "EBR") { - var ebrStart = e.StartOffset - SectorSize; + var ebrStart = e.StartOffset - this._sectorSize; if (ebrStart >= 0) - this.ZeroRange(ebrStart, SectorSize); + this.ZeroRange(ebrStart, this._sectorSize); } this.DeletePartition(index); @@ -319,11 +406,22 @@ public void ConvertMbrToGpt() { }); } + // A partition inside the GPT's own structures would be overwritten by them: refuse before + // writing anything. + this._gptEntrySize = DefaultGptEntrySize; + this._gptEntryCount = GptEntryCount; + var firstUsable = this.GptFirstUsableLba * this._sectorSize; + var lastUsableEnd = (this.GptLastUsableLba + 1) * this._sectorSize; + foreach (var e in translated) + if (e.StartOffset < firstUsable || e.StartOffset + e.Size > lastUsableEnd) + throw new InvalidOperationException( + $"Partition [{e.StartOffset}..{e.StartOffset + e.Size}) overlaps where the GPT's own structures go " + + $"(usable range [{firstUsable}..{lastUsableEnd})); converting would overwrite its data."); + this._entries.Clear(); this._entries.AddRange(translated); this._scheme = PartitionScheme.Gpt; - this._gptEntrySize = DefaultGptEntrySize; - this._gptEntryCount = GptEntryCount; + this._gptDiskGuid = null; this.RewriteGpt(); // Also rewrites the protective MBR. } @@ -359,12 +457,16 @@ public void ConvertGptToMbr() { }); } - // Zero out primary GPT (header + entry array, LBAs 1..33) and backup - // GPT (last 33 sectors) before writing the MBR. - this.ZeroRange(GptHeaderLba * SectorSize, (long)GptReservedSectors * SectorSize); - var backupStart = this._stream.Length - (long)GptReservedSectors * SectorSize; - if (backupStart > 0) - this.ZeroRange(backupStart, (long)GptReservedSectors * SectorSize); + if (translated.Any(e => (e.StartOffset + e.Size) / this._sectorSize > uint.MaxValue)) + throw new InvalidOperationException("A partition ends past 2^32 sectors, which an MBR entry cannot address."); + + // Zero out primary GPT (header + entry array) and backup GPT (entry array + header at the + // end) before writing the MBR. Both lie outside the usable range, so no partition is touched. + var reserved = (this.GptEntrySectors + 1) * this._sectorSize; + this.ZeroRange(GptHeaderLba * (long)this._sectorSize, reserved); + var backupStart = this._stream.Length / this._sectorSize * this._sectorSize - reserved; + if (backupStart > reserved) + this.ZeroRange(backupStart, reserved); this._entries.Clear(); this._entries.AddRange(translated); @@ -508,8 +610,8 @@ private static bool MatchesAtOffset(byte[] probe, MagicSignature sig) { public void ResizePartition(int index, long newSizeBytes) { this.RequireValidIndex(index); if (newSizeBytes <= 0) throw new ArgumentOutOfRangeException(nameof(newSizeBytes)); - if (newSizeBytes % SectorSize != 0) - throw new ArgumentException($"New size must be sector-aligned ({SectorSize} bytes).", nameof(newSizeBytes)); + if (newSizeBytes % this._sectorSize != 0) + throw new ArgumentException($"New size must be sector-aligned ({this._sectorSize} bytes).", nameof(newSizeBytes)); var resizer = InPlaceFilesystemResizer ?? throw new InvalidOperationException( @@ -527,6 +629,9 @@ public void ResizePartition(int index, long newSizeBytes) { if (newEnd > this._stream.Length) throw new InvalidOperationException( $"New partition end ({newEnd}) exceeds disk length ({this._stream.Length})."); + if (newEnd > this.UsableRange.End) + throw new InvalidOperationException( + $"New partition end ({newEnd}) runs into the backup partition table (usable end {this.UsableRange.End})."); if (!isShrink) { foreach (var other in this._entries) { if (other.Index == e.Index) continue; @@ -658,14 +763,17 @@ public PartitionTableVerification Verify() { /// public void Reload() { this._entries.Clear(); + this._gptRawSlots.Clear(); + this._gptDiskGuid = null; + this._sectorSize = this._requestedSectorSize; if (this._stream.Length < SectorSize * 2L) { this._scheme = PartitionScheme.None; return; } - var head = new byte[Math.Min(4096, (int)this._stream.Length)]; + var head = new byte[(int)Math.Min(GptParser.ProbeBytes, this._stream.Length)]; this._stream.Position = 0; - var read = this._stream.Read(head, 0, head.Length); + var read = this._stream.ReadAtLeast(head, head.Length, throwOnEndOfStream: false); if (read < SectorSize) { this._scheme = PartitionScheme.None; return; @@ -673,22 +781,24 @@ public void Reload() { if (GptParser.IsGpt(head)) { try { - var parsed = GptParser.Parse(this._stream); - // Read entry size from the on-disk header for round-trip preservation. - this._stream.Position = (long)GptHeaderLba * SectorSize; - Span hdr = stackalloc byte[GptHeaderSize]; - this._stream.ReadExactly(hdr); - this._gptEntryCount = BinaryPrimitives.ReadUInt32LittleEndian(hdr[80..]); - this._gptEntrySize = BinaryPrimitives.ReadUInt32LittleEndian(hdr[84..]); - if (this._gptEntrySize < DefaultGptEntrySize) this._gptEntrySize = DefaultGptEntrySize; - if (this._gptEntryCount == 0) this._gptEntryCount = GptEntryCount; + var parsed = GptParser.Parse(this._stream, out var info); + // Keep the on-disk layout (block size, entry size/count, disk GUID) for round-trip preservation. + this._sectorSize = info.SectorSize; + this._gptEntryCount = info.EntryCount == 0 ? GptEntryCount : info.EntryCount; + this._gptEntrySize = info.EntrySize < DefaultGptEntrySize ? DefaultGptEntrySize : info.EntrySize; + this._gptDiskGuid = info.DiskGuid == Guid.Empty ? null : info.DiskGuid; + var entryArray = new byte[(long)info.EntryCount * info.EntrySize]; + this._stream.Position = (long)info.EntriesLba * info.SectorSize; + this._stream.ReadExactly(entryArray); + this.CaptureGptSlots(entryArray); this._scheme = PartitionScheme.Gpt; this._entries.AddRange(parsed); this.ReindexAll(); return; - } catch { + } catch (Exception ex) when (ex is IOException or InvalidDataException or ArgumentException or OverflowException) { // Fall through to MBR. + this._sectorSize = this._requestedSectorSize; } } @@ -697,9 +807,9 @@ public void Reload() { // Use the full parser so logical entries are included as well. List parsed; try { - parsed = MbrParser.Parse(this._stream); - } catch { - parsed = [.. MbrParser.ParsePrimary(head)]; + parsed = MbrParser.Parse(this._stream, this._sectorSize); + } catch (Exception ex) when (ex is IOException or InvalidDataException or ArgumentException) { + parsed = [.. MbrParser.ParsePrimary(head, this._sectorSize)]; } // MbrParser.Parse returns primaries (non-extended) plus EBR-discovered @@ -708,7 +818,7 @@ public void Reload() { this._stream.Position = 0; var sector0 = new byte[SectorSize]; this._stream.ReadExactly(sector0); - var primariesFromTable = MbrParser.ParsePrimary(sector0); + var primariesFromTable = MbrParser.ParsePrimary(sector0, this._sectorSize); var entries = new List(); foreach (var p in primariesFromTable) entries.Add(p); @@ -726,13 +836,13 @@ public void Reload() { // ── Overlap / validation helpers ─────────────────────────────────── - private static void ValidateRange(long startByteOffset, long lengthBytes) { + private void ValidateRange(long startByteOffset, long lengthBytes) { if (startByteOffset < 0) throw new ArgumentOutOfRangeException(nameof(startByteOffset)); if (lengthBytes <= 0) throw new ArgumentOutOfRangeException(nameof(lengthBytes)); - if (startByteOffset % SectorSize != 0) - throw new ArgumentException($"Start offset must be sector-aligned ({SectorSize} bytes).", nameof(startByteOffset)); - if (lengthBytes % SectorSize != 0) - throw new ArgumentException($"Length must be a multiple of sector size ({SectorSize} bytes).", nameof(lengthBytes)); + if (startByteOffset % this._sectorSize != 0) + throw new ArgumentException($"Start offset must be sector-aligned ({this._sectorSize} bytes).", nameof(startByteOffset)); + if (lengthBytes % this._sectorSize != 0) + throw new ArgumentException($"Length must be a multiple of sector size ({this._sectorSize} bytes).", nameof(lengthBytes)); } private void RequireFits(long startByteOffset, long lengthBytes) { @@ -741,6 +851,22 @@ private void RequireFits(long startByteOffset, long lengthBytes) { $"Partition end ({startByteOffset + lengthBytes}) exceeds disk length ({this._stream.Length})."); } + /// + /// A partition must stay clear of the table itself: LBA 0 for MBR, and for GPT the primary + /// header and entry array at the front and their backups at the end (UEFI 2.10, §5.3.1 — + /// FirstUsableLBA / LastUsableLBA). An MBR entry also cannot address past 2^32 sectors. + /// + private void RequireUsable(long startByteOffset, long lengthBytes) { + var (usableStart, usableEnd) = this.UsableRange; + if (startByteOffset < usableStart || startByteOffset + lengthBytes > usableEnd) + throw new InvalidOperationException( + $"Partition [{startByteOffset}..{startByteOffset + lengthBytes}) leaves the usable range [{usableStart}..{usableEnd}) " + + "and would overwrite the partition table."); + if (this._scheme != PartitionScheme.Gpt + && ((startByteOffset + lengthBytes) / this._sectorSize > uint.MaxValue)) + throw new InvalidOperationException("An MBR entry cannot address past 2^32 sectors; use GPT."); + } + private void RequireNoOverlap(long startByteOffset, long lengthBytes) { foreach (var existing in this._entries) { // Extended container is allowed to encompass its logicals — skip it @@ -825,8 +951,8 @@ private void RewriteMbr() { entry[1] = 0xFE; entry[2] = 0xFF; entry[3] = 0xFF; entry[4] = mbrByte; entry[5] = 0xFE; entry[6] = 0xFF; entry[7] = 0xFF; - BinaryPrimitives.WriteUInt32LittleEndian(entry[8..], (uint)(e.StartOffset / SectorSize)); - BinaryPrimitives.WriteUInt32LittleEndian(entry[12..], (uint)(e.Size / SectorSize)); + BinaryPrimitives.WriteUInt32LittleEndian(entry[8..], (uint)(e.StartOffset / this._sectorSize)); + BinaryPrimitives.WriteUInt32LittleEndian(entry[12..], (uint)(e.Size / this._sectorSize)); primarySlot++; } @@ -853,12 +979,12 @@ private void RewriteEbrChain() { .OrderBy(e => e.StartOffset) .ToList(); - var containerStartLba = (uint)(container.StartOffset / SectorSize); + var containerStartLba = (uint)(container.StartOffset / this._sectorSize); // Always zero the first sector of the container first — when the chain // shrinks (logicals removed), we don't want a stale EBR lingering. The // active first EBR will be rewritten below if logicals.Count > 0. - this.ZeroRange(container.StartOffset, SectorSize); + this.ZeroRange(container.StartOffset, this._sectorSize); if (logicals.Count == 0) { this._stream.Flush(); @@ -867,14 +993,14 @@ private void RewriteEbrChain() { for (var i = 0; i < logicals.Count; ++i) { var logical = logicals[i]; - var dataLba = (uint)(logical.StartOffset / SectorSize); + var dataLba = (uint)(logical.StartOffset / this._sectorSize); // EBR location: first logical -> container start; subsequent -> data-1. var ebrLba = i == 0 ? containerStartLba : dataLba - 1; - var ebrOffset = (long)ebrLba * SectorSize; + var ebrOffset = (long)ebrLba * this._sectorSize; var sector = new byte[SectorSize]; - if (ebrOffset + SectorSize <= this._stream.Length) { + if (ebrOffset + this._sectorSize <= this._stream.Length) { this._stream.Position = ebrOffset; this._stream.ReadExactly(sector); Array.Clear(sector, MbrTableOffset, 4 * MbrEntrySize); @@ -889,14 +1015,14 @@ private void RewriteEbrChain() { entry[4] = mbrByte; entry[5] = 0xFE; entry[6] = 0xFF; entry[7] = 0xFF; BinaryPrimitives.WriteUInt32LittleEndian(entry[8..], dataLba - ebrLba); - BinaryPrimitives.WriteUInt32LittleEndian(entry[12..], (uint)(logical.Size / SectorSize)); + BinaryPrimitives.WriteUInt32LittleEndian(entry[12..], (uint)(logical.Size / this._sectorSize)); } // Entry 1: pointer to next EBR (relative to extended container start), // or all-zero on the last EBR. if (i + 1 < logicals.Count) { var nextLogical = logicals[i + 1]; - var nextDataLba = (uint)(nextLogical.StartOffset / SectorSize); + var nextDataLba = (uint)(nextLogical.StartOffset / this._sectorSize); var nextEbrLba = nextDataLba - 1; var entry = sector.AsSpan(MbrTableOffset + MbrEntrySize, MbrEntrySize); @@ -905,7 +1031,7 @@ private void RewriteEbrChain() { entry[4] = 0x05; entry[5] = 0xFE; entry[6] = 0xFF; entry[7] = 0xFF; BinaryPrimitives.WriteUInt32LittleEndian(entry[8..], nextEbrLba - containerStartLba); - var nextLastLba = nextDataLba + (uint)(nextLogical.Size / SectorSize) - 1; + var nextLastLba = nextDataLba + (uint)(nextLogical.Size / this._sectorSize) - 1; BinaryPrimitives.WriteUInt32LittleEndian(entry[12..], nextLastLba - nextEbrLba + 1); } @@ -918,15 +1044,24 @@ private void RewriteEbrChain() { // ── GPT writers ──────────────────────────────────────────────────── + /// + /// Writes the protective MBR, the primary header and entry array at LBA 1/2, and the backup + /// entry array and header at the end of the disk (UEFI 2.10, §5.3). LastUsableLBA is the LBA + /// before the backup entry array, so the two never overlap. Entries that already existed keep + /// their unique GUID and attribute bits; the disk keeps its GUID. + /// private void RewriteGpt() { - var totalSectors = this._stream.Length / SectorSize; - if (totalSectors < 34 + GptReservedSectors) - throw new InvalidOperationException( - $"Stream too small for GPT layout ({this._stream.Length} bytes); need at least {(34 + GptReservedSectors) * SectorSize}."); - + var totalSectors = this._stream.Length / this._sectorSize; var entrySize = (int)this._gptEntrySize; var entryCount = (int)this._gptEntryCount; var entryArrayBytes = entrySize * entryCount; + var entrySectors = this.GptEntrySectors; + var reservedSectors = entrySectors + 1; + var firstUsable = 2 + entrySectors; + var lastUsable = totalSectors - reservedSectors - 1; + if (lastUsable < firstUsable) + throw new InvalidOperationException( + $"Stream too small for GPT layout ({this._stream.Length} bytes); need more than {(firstUsable + reservedSectors) * this._sectorSize}."); // Build entry array. var entriesBuf = new byte[entryArrayBytes]; @@ -934,35 +1069,34 @@ private void RewriteGpt() { var e = this._entries[i]; var slot = entriesBuf.AsSpan(i * entrySize, entrySize); var typeGuid = Guid.TryParse(e.TypeCode, out var g) ? g : Guid.Empty; + var known = this._gptRawSlots.TryGetValue(e.StartOffset, out var raw) && raw.Length == entrySize; + if (known) raw.CopyTo(slot); WriteMixedEndianGuid(slot, typeGuid); - WriteMixedEndianGuid(slot[16..], DeriveUniqueGuid(i, e.StartOffset)); - var firstLba = (ulong)(e.StartOffset / SectorSize); - var lastLba = (ulong)((e.StartOffset + e.Size) / SectorSize - 1); + if (!known) WriteMixedEndianGuid(slot[16..], DeriveUniqueGuid(i, e.StartOffset)); + var firstLba = (ulong)(e.StartOffset / this._sectorSize); + var lastLba = (ulong)((e.StartOffset + e.Size) / this._sectorSize - 1); BinaryPrimitives.WriteUInt64LittleEndian(slot[32..], firstLba); BinaryPrimitives.WriteUInt64LittleEndian(slot[40..], lastLba); - BinaryPrimitives.WriteUInt64LittleEndian(slot[48..], e.IsActive ? 0x04UL : 0UL); - var name = e.Name ?? string.Empty; - var nameBytes = Encoding.Unicode.GetBytes(name); + var attributes = known ? BinaryPrimitives.ReadUInt64LittleEndian(slot[48..]) & ~0x04UL : 0UL; + BinaryPrimitives.WriteUInt64LittleEndian(slot[48..], attributes | (e.IsActive ? 0x04UL : 0UL)); var nameMax = Math.Min(72, entrySize - 56); if (nameMax > 0) { - var copyLen = Math.Min(nameMax, nameBytes.Length); - nameBytes.AsSpan(0, copyLen).CopyTo(slot[56..]); + slot.Slice(56, nameMax).Clear(); + var nameBytes = Encoding.Unicode.GetBytes(e.Name ?? string.Empty); + nameBytes.AsSpan(0, Math.Min(nameMax, nameBytes.Length) & ~1).CopyTo(slot[56..]); } } var entriesCrc = Crc32.Compute(entriesBuf); - - // Number of sectors needed for the entry array. - var entrySectors = (entryArrayBytes + SectorSize - 1) / SectorSize; - var reservedSectors = Math.Max(GptReservedSectors, entrySectors + 1); + var diskGuid = this._gptDiskGuid ??= this.DeriveDiskGuid(); // Primary header at LBA 1. var primaryHeader = BuildGptHeader( myLba: 1, altLba: (ulong)(totalSectors - 1), - firstUsableLba: (ulong)(2 + entrySectors), - lastUsableLba: (ulong)(totalSectors - reservedSectors), - diskGuid: this.DeriveDiskGuid(), + firstUsableLba: (ulong)firstUsable, + lastUsableLba: (ulong)lastUsable, + diskGuid: diskGuid, entriesLba: 2, entriesCrc: entriesCrc, entryCount: entryCount, @@ -972,9 +1106,9 @@ private void RewriteGpt() { var backupHeader = BuildGptHeader( myLba: (ulong)(totalSectors - 1), altLba: 1, - firstUsableLba: (ulong)(2 + entrySectors), - lastUsableLba: (ulong)(totalSectors - reservedSectors), - diskGuid: this.DeriveDiskGuid(), + firstUsableLba: (ulong)firstUsable, + lastUsableLba: (ulong)lastUsable, + diskGuid: diskGuid, entriesLba: backupEntriesLba, entriesCrc: entriesCrc, entryCount: entryCount, @@ -983,23 +1117,39 @@ private void RewriteGpt() { // Protective MBR at LBA 0. this.WriteProtectiveMbr(totalSectors); - var headerSector = new byte[SectorSize]; + var headerSector = new byte[this._sectorSize]; primaryHeader.CopyTo(headerSector, 0); - this._stream.Position = SectorSize; + this._stream.Position = this._sectorSize; this._stream.Write(headerSector); - this._stream.Position = 2L * SectorSize; + this._stream.Position = 2L * this._sectorSize; this._stream.Write(entriesBuf); - this._stream.Position = (long)backupEntriesLba * SectorSize; + this._stream.Position = (long)backupEntriesLba * this._sectorSize; this._stream.Write(entriesBuf); Array.Clear(headerSector); backupHeader.CopyTo(headerSector, 0); - this._stream.Position = (totalSectors - 1) * SectorSize; + this._stream.Position = (totalSectors - 1) * this._sectorSize; this._stream.Write(headerSector); this._stream.Flush(); + this.CaptureGptSlots(entriesBuf); + } + + /// Raw entry-array slots by partition start, so a rewrite keeps unique GUIDs and attributes. + private readonly Dictionary _gptRawSlots = []; + + private void CaptureGptSlots(ReadOnlySpan entryArray) { + this._gptRawSlots.Clear(); + var size = (int)this._gptEntrySize; + for (var i = 0; (i + 1) * size <= entryArray.Length; ++i) { + var slot = entryArray.Slice(i * size, size); + if (slot[..16].IndexOfAnyExcept((byte)0) < 0) continue; + var firstLba = BinaryPrimitives.ReadUInt64LittleEndian(slot[32..]); + if (firstLba > (ulong)(long.MaxValue / this._sectorSize)) continue; + this._gptRawSlots[(long)firstLba * this._sectorSize] = slot.ToArray(); + } } private void WriteProtectiveMbr(long totalSectors) { @@ -1092,7 +1242,7 @@ private void VerifyMbr(List issues) { var container = this.FindExtendedContainer(); if (container is not null) { foreach (var logical in this._entries.Where(p => p.Source == "EBR")) { - if (logical.StartOffset < container.StartOffset + SectorSize) + if (logical.StartOffset < container.StartOffset + this._sectorSize) issues.Add($"Logical #{logical.Index} starts before container_start + 1 sector."); if (logical.StartOffset + logical.Size > container.StartOffset + container.Size) issues.Add($"Logical #{logical.Index} data extends past extended container end."); @@ -1101,14 +1251,24 @@ private void VerifyMbr(List issues) { } private void VerifyGpt(List issues) { - if (this._stream.Length < (34 + GptReservedSectors) * SectorSize) { + if (this.GptLastUsableLba < this.GptFirstUsableLba) { issues.Add("Stream too small to hold primary + backup GPT."); return; } + var (usableStart, usableEnd) = this.UsableRange; + var ordered = this._entries.OrderBy(e => e.StartOffset).ToList(); + for (var i = 0; i < ordered.Count; ++i) { + var e = ordered[i]; + if (e.StartOffset < usableStart || e.StartOffset + e.Size > usableEnd) + issues.Add($"Partition #{e.Index} [{e.StartOffset}..{e.StartOffset + e.Size}) lies outside the usable range [{usableStart}..{usableEnd})."); + if (i > 0 && ordered[i - 1].StartOffset + ordered[i - 1].Size > e.StartOffset) + issues.Add($"Partition #{ordered[i - 1].Index} overlaps partition #{e.Index}."); + } + // Primary header. - this._stream.Position = (long)GptHeaderLba * SectorSize; - var headerSector = new byte[SectorSize]; + this._stream.Position = (long)GptHeaderLba * this._sectorSize; + var headerSector = new byte[this._sectorSize]; this._stream.ReadExactly(headerSector); var primaryOk = VerifyGptHeader(headerSector, isPrimary: true, expectedMyLba: 1, issues, out var entriesLba, out var entryCount, out var entrySize, out var entriesCrc); @@ -1118,7 +1278,7 @@ private void VerifyGpt(List issues) { issues.Add($"GPT entry array size {entryBytes} out of range."); } else { var buf = new byte[entryBytes]; - this._stream.Position = (long)entriesLba * SectorSize; + this._stream.Position = (long)entriesLba * this._sectorSize; this._stream.ReadExactly(buf); var crc = Crc32.Compute(buf); if (crc != entriesCrc) @@ -1127,9 +1287,9 @@ private void VerifyGpt(List issues) { } // Backup header. - var totalSectors = this._stream.Length / SectorSize; - this._stream.Position = (totalSectors - 1) * SectorSize; - var backupSector = new byte[SectorSize]; + var totalSectors = this._stream.Length / this._sectorSize; + this._stream.Position = (totalSectors - 1) * this._sectorSize; + var backupSector = new byte[this._sectorSize]; this._stream.ReadExactly(backupSector); var backupOk = VerifyGptHeader(backupSector, isPrimary: false, expectedMyLba: (ulong)(totalSectors - 1), issues, out var backupEntriesLba, out var backupEntryCount, out var backupEntrySize, out var backupEntriesCrc); @@ -1138,7 +1298,7 @@ private void VerifyGpt(List issues) { var entryBytes = (long)backupEntryCount * backupEntrySize; if (entryBytes > 0 && entryBytes <= int.MaxValue) { var buf = new byte[entryBytes]; - this._stream.Position = (long)backupEntriesLba * SectorSize; + this._stream.Position = (long)backupEntriesLba * this._sectorSize; this._stream.ReadExactly(buf); var crc = Crc32.Compute(buf); if (crc != backupEntriesCrc) @@ -1166,7 +1326,7 @@ private static bool VerifyGptHeader(byte[] sector, bool isPrimary, ulong expecte return false; } var headerSize = BinaryPrimitives.ReadUInt32LittleEndian(sector.AsSpan(12)); - if (headerSize < GptHeaderSize || headerSize > SectorSize) { + if (headerSize < GptHeaderSize || headerSize > sector.Length) { issues.Add($"{label} GPT header size {headerSize} out of range."); return false; } diff --git a/Compression.Core/DiskImage/PartitionTableDetector.cs b/Compression.Core/DiskImage/PartitionTableDetector.cs index c87e1b495..93d234c13 100644 --- a/Compression.Core/DiskImage/PartitionTableDetector.cs +++ b/Compression.Core/DiskImage/PartitionTableDetector.cs @@ -4,89 +4,158 @@ namespace Compression.Core.DiskImage; /// /// Detects and parses partition tables from raw disk data. -/// Tries GPT first (since GPT disks also have a protective MBR), then falls back to MBR. /// +/// +/// Probe order, first hit wins: +/// +/// GPT, at 512- or 4096-byte logical blocks — ahead of the MBR, because a GPT +/// disk carries a protective (or hybrid) MBR too; +/// SGI volume header and Sun label — sector-0 labels with a magic and a +/// checksum, so they are certain when they match, and their last bytes could otherwise pass +/// for an MBR boot signature; +/// MBR, with its extended/logical (EBR) chain; +/// Apple Partition Map; +/// a stand-alone BSD disklabel (no MBR around it), both magics and its geometry verified; +/// an Amiga Rigid Disk Block in the first 16 blocks, checksum verified. +/// +/// public static class PartitionTableDetector { /// /// Result of partition table detection, including the scheme used and the discovered partitions. /// public sealed class DetectionResult { - /// The partition scheme detected: "GPT", "MBR", "APM", or "None". + /// The partition scheme detected: "GPT", "MBR", "APM", "BSD", "RDB", "Sun", "SGI", or "None". public required string Scheme { get; init; } /// Discovered partitions. Empty if no partition table was found. public required List Partitions { get; init; } + + /// Logical block size the table counts in (512 unless a 4Kn GPT was found). + public int SectorSize { get; init; } = 512; } /// Minimum data size needed to attempt detection (GPT header is at offset 512). private const int MinimumSize = 1024; + private static DetectionResult None => new() { Scheme = "None", Partitions = [] }; + /// /// Attempts to detect a partition table in the given stream. - /// Tries GPT first (higher precedence), then MBR. /// Returns an empty partition list if no valid partition table is found. /// /// A seekable stream containing raw disk image data. /// Detection result with scheme name and partitions. public static DetectionResult Detect(Stream diskData) { if (!diskData.CanSeek || diskData.Length < MinimumSize) - return new DetectionResult { Scheme = "None", Partitions = [] }; + return None; - // Read the first 1024 bytes for quick signature checks. - // Clamp against Length as long first to avoid overflow on multi-GiB disks. - var header = new byte[(int)Math.Min(4096L, diskData.Length)]; + // Enough to see LBA 1 at every supported block size, and an APM map at 2048-byte blocks. + var header = new byte[(int)Math.Min(GptParser.ProbeBytes, diskData.Length)]; diskData.Position = 0; - var bytesRead = diskData.Read(header, 0, header.Length); + var bytesRead = diskData.ReadAtLeast(header, header.Length, throwOnEndOfStream: false); diskData.Position = 0; if (bytesRead < MinimumSize) - return new DetectionResult { Scheme = "None", Partitions = [] }; + return None; + var head = header.AsSpan(0, bytesRead); - // Try GPT first (GPT disks have a protective MBR, so GPT takes priority). - if (GptParser.IsGpt(header.AsSpan(0, bytesRead))) { + // GPT first (GPT disks have a protective MBR, so GPT takes priority). + if (GptParser.IsGpt(head) || HasProtectiveEntry(head)) { try { - var gptPartitions = GptParser.Parse(diskData); + var gptPartitions = GptParser.Parse(diskData, out var info); if (gptPartitions.Count > 0) - return new DetectionResult { Scheme = "GPT", Partitions = gptPartitions }; - } catch { + return new DetectionResult { Scheme = "GPT", Partitions = gptPartitions, SectorSize = info.SectorSize }; + } catch (Exception ex) when (ex is IOException or InvalidDataException or ArgumentException or OverflowException) { // GPT parsing failed — fall through to MBR. } } + if (SgiDvhParser.IsDvh(head)) + return Bounded("SGI", SgiDvhParser.Parse(head), diskData.Length); + if (SunVtocParser.IsSunLabel(head)) + return Bounded("Sun", SunVtocParser.Parse(head), diskData.Length); + // Try MBR. - if (MbrParser.IsMbr(header.AsSpan(0, bytesRead))) { + if (MbrParser.IsMbr(head)) { try { - var mbrPartitions = MbrParser.Parse(diskData); - // Filter out partitions that reference data beyond the stream. - var validPartitions = mbrPartitions - .Where(p => p.StartOffset >= 0 && p.StartOffset < diskData.Length && p.Size > 0) - .ToList(); - if (validPartitions.Count > 0) - return new DetectionResult { Scheme = "MBR", Partitions = validPartitions }; - } catch { + // A protective entry describes the GPT, not data; with no readable GPT it holds nothing. + var mbrPartitions = MbrParser.Parse(diskData).Where(p => p.TypeCode != "0xEE").ToList(); + var result = Bounded("MBR", mbrPartitions, diskData.Length); + if (result.Partitions.Count > 0) + return result; + } catch (Exception ex) when (ex is IOException or InvalidDataException or ArgumentException) { // MBR parsing failed — fall through to APM. } } // Try APM (Apple Partition Map). APM disks carry neither an MBR boot // signature nor a GPT header, so this is reached only when both above fail. - if (ApmParser.IsApm(header.AsSpan(0, bytesRead))) { + if (ApmParser.IsApm(head)) { try { - var apmPartitions = ApmParser.Parse(diskData); - var validApm = apmPartitions - .Where(p => p.StartOffset >= 0 && p.StartOffset < diskData.Length && p.Size > 0) - .ToList(); - if (validApm.Count > 0) - return new DetectionResult { Scheme = "APM", Partitions = validApm }; - } catch { - // APM parsing failed — no partition table. + var apm = Bounded("APM", ApmParser.Parse(diskData), diskData.Length); + if (apm.Partitions.Count > 0) + return apm; + } catch (Exception ex) when (ex is IOException or InvalidDataException or ArgumentException) { + // APM parsing failed — try the remaining schemes. + } + } + + try { + if (BsdDisklabelParser.IsStandaloneDisklabel(diskData)) { + var bsd = Bounded("BSD", BsdDisklabelParser.Parse(diskData, 0), diskData.Length); + if (bsd.Partitions.Count > 0) + return bsd; } + if (AmigaRdbParser.IsRdb(diskData)) { + var rdb = Bounded("RDB", AmigaRdbParser.Parse(diskData), diskData.Length); + if (rdb.Partitions.Count > 0) + return rdb; + } + } catch (Exception ex) when (ex is IOException or InvalidDataException or ArgumentException) { + // An unreadable label holds nothing. + } finally { + diskData.Position = 0; } - return new DetectionResult { Scheme = "None", Partitions = [] }; + return None; } + /// + /// Whether the first sector holds a partition table of a scheme that has no MBR-style + /// boot signature to go on — SGI, Sun, a stand-alone BSD disklabel or an Amiga RDB — each + /// verified by its own checksum (BSD: by its two magics and geometry). Used by content detection, which has already ruled out + /// GPT, MBR and APM by then. + /// + public static bool HasSelfValidatingLabel(Stream disk) { + if (!disk.CanSeek || disk.Length < MinimumSize) return false; + var saved = disk.Position; + try { + var sector0 = new byte[512]; + disk.Position = 0; + if (disk.ReadAtLeast(sector0, 512, throwOnEndOfStream: false) < 512) return false; + return SgiDvhParser.IsDvh(sector0) || SunVtocParser.IsSunLabel(sector0) + || BsdDisklabelParser.IsStandaloneDisklabel(disk) || AmigaRdbParser.IsRdb(disk); + } catch (Exception ex) when (ex is IOException or InvalidDataException or ArgumentException) { + return false; + } finally { + disk.Position = saved; + } + } + + private static bool HasProtectiveEntry(ReadOnlySpan head) { + if (!MbrParser.IsMbr(head)) return false; + for (var i = 0; i < 4; ++i) + if (head[0x1BE + i * 16 + 4] == 0xEE) return true; + return false; + } + + /// Keeps only partitions that start inside the image and have a size. + private static DetectionResult Bounded(string scheme, List partitions, long length) => new() { + Scheme = scheme, + Partitions = partitions.Where(p => p.StartOffset >= 0 && p.StartOffset < length && p.Size > 0).ToList(), + }; + /// /// Attempts to detect a partition table in the given byte array. /// Convenience overload that wraps the data in a . diff --git a/Compression.Core/DiskImage/PartitionedDiskLister.cs b/Compression.Core/DiskImage/PartitionedDiskLister.cs index dfe67ccad..54316a58c 100644 --- a/Compression.Core/DiskImage/PartitionedDiskLister.cs +++ b/Compression.Core/DiskImage/PartitionedDiskLister.cs @@ -87,7 +87,8 @@ private static bool TryListBsdSlices(Stream disk, PartitionEntry part, string pr /// private static bool TryReadBsdSlices(Stream disk, PartitionEntry part, out List slices) { slices = []; - if (part.Size <= 0 || part.StartOffset < 0 || part.StartOffset >= disk.Length) + // A slice of a disklabel can start at the label itself; it does not nest a second time. + if (part.Source == "BSD" || part.Size <= 0 || part.StartOffset < 0 || part.StartOffset >= disk.Length) return false; try { using var window = new PartitionWindowStream(disk, part.StartOffset, part.Size); @@ -178,160 +179,309 @@ public static string MakePartitionPrefix(PartitionEntry part) { return $"Partition{part.Index + 1}_{safeName}"; } + // ── Partition addressing ────────────────────────────────────────────── + + /// + /// One listed partition: a top-level partition, or a slice of a BSD disklabel nested inside + /// one, with the prefix its entries are listed under. + /// + /// The table entry (for a BSD slice, the slice's own entry). + /// The listing prefix, e.g. Partition1_FAT32 or Partition1_FreeBSD/Partition1_4_2BSD. + /// Byte offset of the partition on the disk. + /// Bytes of the partition that lie inside the image. + /// Whether this is a slice inside a BSD disklabel rather than a table entry. + public sealed record PartitionTarget(PartitionEntry Partition, string Prefix, long Offset, long Size, bool IsBsdSlice); + + /// + /// Every partition the listing shows a prefix for, in listing order: top-level partitions, + /// with a BSD-disklabel container replaced by its slices. + /// + public static List EnumerateTargets(Stream disk, PartitionTableDetector.DetectionResult detection) { + var result = new List(); + foreach (var part in detection.Partitions) { + var prefix = MakePartitionPrefix(part); + if (TryReadBsdSlices(disk, part, out var slices)) { + foreach (var slice in slices) + result.Add(new PartitionTarget(slice, $"{prefix}/{MakePartitionPrefix(slice)}", slice.StartOffset, + Clamp(disk, slice), IsBsdSlice: true)); + continue; + } + result.Add(new PartitionTarget(part, prefix, part.StartOffset, Clamp(disk, part), IsBsdSlice: false)); + } + return result; + } + + private static long Clamp(Stream disk, PartitionEntry part) + => Math.Max(0, Math.Min(part.Size, disk.Length - part.StartOffset)); + + /// + /// Finds the partition an entry name addresses. is the rest of the + /// name below the partition's prefix — empty when the name is the partition itself + /// (PartitionN_Type or PartitionN_Type.raw). + /// + public static PartitionTarget? Resolve(IEnumerable targets, string entryName, out string innerPath) { + var name = entryName.Replace('\\', '/').Trim('/'); + innerPath = string.Empty; + PartitionTarget? best = null; + foreach (var t in targets) { + if (name.Equals(t.Prefix, StringComparison.Ordinal) || name.Equals(t.Prefix + ".raw", StringComparison.Ordinal)) { + innerPath = string.Empty; + return t; + } + if (name.StartsWith(t.Prefix + "/", StringComparison.Ordinal) && (best is null || t.Prefix.Length > best.Prefix.Length)) + best = t; + } + if (best is not null) innerPath = name[(best.Prefix.Length + 1)..]; + return best; + } + + /// + /// Whether edits through its own code for + /// (Add or Remove) rather than the interface's generic extract → re-create + /// default, which re-creates the volume and loses what its writer does not reproduce. + /// + public static bool HasNativeEditor(IArchiveModifiable modifier, string method) { + var map = modifier.GetType().GetInterfaceMap(typeof(IArchiveModifiable)); + for (var i = 0; i < map.InterfaceMethods.Length; ++i) { + var m = map.InterfaceMethods[i]; + if (m.Name != method || m.GetParameters().Length != 2) continue; + return map.TargetMethods[i].DeclaringType != typeof(IArchiveModifiable); + } + return false; + } + // ── Add / Remove (partition-aware) ──────────────────────────────────── /// - /// Partition-aware . Returns true - /// when a partition table was present and at least one input was dispatched - /// through the partition-aware path; false when no partition table - /// exists so the caller can fall through to the existing single-FS path. + /// Partition-aware . + /// Returns false when no partition table exists (or the stream is read-only) so the + /// caller can fall through to its single-filesystem path. /// /// /// Two input shapes are recognised: /// - /// Partition<N>_<Type>/<inner> — - /// add the file to partition N's inner filesystem (delegated to its - /// ). - /// No prefix — treat the input bytes as a raw filesystem - /// image, find free space past the last existing partition, write a new - /// partition entry (FS type detected via ), - /// and copy the bytes into the new partition window. + /// PartitionN_Type/inner/path — adds the file to that partition's + /// filesystem through the filesystem's own in-place editor, working on a staged window over + /// the partition: it can neither write outside the partition nor grow past it. + /// A root-level filesystem image (recognised by content, or named + /// *.raw/*.img/PartitionN_…) — becomes a new partition in the free + /// space after the last one, 1 MiB-aligned where room allows, inside the table's usable + /// range. GPT and MBR tables only. /// + /// + /// Every edit is planned and staged before anything is written; a refusal — a filesystem with + /// no lossless in-place editor, a full volume, no free space, a full table — throws + /// and leaves the disk byte-identical. + /// /// public static bool TryAdd(Stream disk, IReadOnlyList inputs) { if (!disk.CanWrite) return false; var detection = PartitionTableDetector.Detect(disk); if (detection.Partitions.Count == 0) return false; + var targets = EnumerateTargets(disk, detection); - PartitionEditor? editor = null; + var innerAdds = new Dictionary>(); + var newPartitions = new List(); foreach (var input in inputs) { - if (input.IsDirectory) continue; - var data = input.InMemoryContent ?? File.ReadAllBytes(input.FullPath); - var name = input.ArchiveName.Replace('\\', '/'); - - if (TryParsePartitionPrefix(name, out var partIdx, out var innerPath) - && partIdx < detection.Partitions.Count) { - var part = detection.Partitions[partIdx]; - using var window = new PartitionWindowStream(disk, part.StartOffset, part.Size); - var innerDesc = InnerFsDetector.Detect(window); - if (innerDesc is not IArchiveModifiable mod) - throw new InvalidOperationException( - $"Partition {partIdx + 1} ({part.TypeName}) has no writable filesystem reader; cannot Add '{innerPath}'."); - window.Position = 0; - mod.Add(window, new[] { ArchiveInputInfo.InMemory(innerPath, data) }); + if (input.IsDirectory || string.IsNullOrEmpty(input.ArchiveName)) continue; + var target = Resolve(targets, input.ArchiveName, out var innerPath); + if (target is not null && innerPath.Length > 0) { + if (!innerAdds.TryGetValue(target, out var list)) innerAdds[target] = list = []; + list.Add(input with { ArchiveName = innerPath }); continue; } - - // Root-level FS image drop → new partition past the last existing one. - editor ??= new PartitionEditor(disk); - var ptype = DetectInputPartitionType(data); - var lengthAligned = AlignUp(data.LongLength, SectorSize); - var startOffset = FindAppendOffset(editor.ListPartitions(), disk.Length, lengthAligned); - if (startOffset < 0) + if (target is not null) + throw new InvalidOperationException( + $"'{input.ArchiveName}' names an existing partition; remove it first to replace it."); + if (input.ArchiveName.Replace('\\', '/').Trim('/').Contains('/')) throw new InvalidOperationException( - $"Not enough free space at the end of the disk to land a {data.LongLength}-byte filesystem image."); - editor.AddPartition(startOffset, lengthAligned, ptype, label: null); - disk.Position = startOffset; - disk.Write(data, 0, data.Length); - // Pad the partition window with zeros to its sector-aligned length. - var pad = lengthAligned - data.Length; - if (pad > 0) { - var zeros = new byte[512]; - var remaining = pad; - while (remaining > 0) { - var chunk = (int)Math.Min(remaining, zeros.Length); - disk.Write(zeros, 0, chunk); - remaining -= chunk; - } + $"'{input.ArchiveName}' is not inside any partition of this disk."); + newPartitions.Add(input); + } + + // Stage every filesystem edit first: nothing reaches the disk until all of them succeed. + var staged = innerAdds.Select(kv => StageInnerEdit(disk, kv.Key, "Add", + (mod, window) => mod.Add(window, kv.Value))).ToList(); + var plan = newPartitions.Count > 0 ? PlanNewPartitions(disk, detection, newPartitions) : []; + + foreach (var window in staged) window.Commit(); + if (plan.Count > 0) { + var editor = new PartitionEditor(disk, detection.SectorSize); + foreach (var (input, start, length, type, label) in plan) { + WritePartitionData(disk, input, start, length); + editor.AddPartition(start, length, type, label); } } + disk.Flush(); return true; } /// - /// Partition-aware . Returns true - /// when a partition table was present and at least one entry was removed; - /// false if no partition table was detected. Entry name shapes: - /// Partition<N>_<Type>/<inner> deletes an inner-FS - /// file; Partition<N>_<Type> or - /// Partition<N>_<Type>.raw deletes the whole partition. + /// Partition-aware . Returns + /// false when no partition table exists (or the stream is read-only). Entry name shapes: + /// PartitionN_Type/inner removes a file — or a folder with everything beneath it — + /// through the partition filesystem's own in-place editor; PartitionN_Type or + /// PartitionN_Type.raw deletes the partition's table entry (GPT and MBR, including + /// logical partitions), leaving its sectors as they were. /// + /// + /// A name that addresses nothing, a filesystem without a lossless in-place editor, or a + /// whole-partition delete on a scheme the editor cannot rewrite is refused with the disk left + /// byte-identical. + /// public static bool TryRemove(Stream disk, string[] entryNames) { if (!disk.CanWrite) return false; var detection = PartitionTableDetector.Detect(disk); if (detection.Partitions.Count == 0) return false; - - PartitionEditor? editor = null; - foreach (var rawName in entryNames) { - var name = rawName.Replace('\\', '/'); - - if (TryParsePartitionPrefix(name, out var partIdx, out var innerPath) - && partIdx < detection.Partitions.Count) { - var part = detection.Partitions[partIdx]; - using var window = new PartitionWindowStream(disk, part.StartOffset, part.Size); - var innerDesc = InnerFsDetector.Detect(window); - if (innerDesc is IArchiveModifiable mod) { - window.Position = 0; - mod.Remove(window, new[] { innerPath }); - } + var targets = EnumerateTargets(disk, detection); + + var innerRemoves = new Dictionary>(); + var deletions = new List(); + foreach (var rawName in entryNames ?? []) { + var target = Resolve(targets, rawName, out var innerPath) + ?? throw new FileNotFoundException($"'{rawName}' is not on this disk.", rawName); + if (innerPath.Length > 0) { + if (!innerRemoves.TryGetValue(target, out var list)) innerRemoves[target] = list = []; + list.Add(innerPath); continue; } + if (detection.Scheme is not ("GPT" or "MBR") || target.IsBsdSlice) + throw new InvalidOperationException( + $"Deleting '{target.Prefix}' would need a {(target.IsBsdSlice ? "BSD disklabel" : detection.Scheme)} table writer; only GPT and MBR entries can be deleted."); + if (!deletions.Contains(target)) deletions.Add(target); + } - // Whole-partition delete: "Partition3_FAT12" or "Partition3_FAT12.raw" - var stripped = name.EndsWith(".raw", StringComparison.OrdinalIgnoreCase) ? name[..^4] : name; - if (TryParsePartitionIndex(stripped, out var idx) && idx < detection.Partitions.Count) { - editor ??= new PartitionEditor(disk); - editor.DeletePartition(idx); + var staged = innerRemoves.Select(kv => StageInnerEdit(disk, kv.Key, "Remove", + (mod, window) => mod.Remove(window, [.. kv.Value]))).ToList(); + + PartitionEditor? editor = null; + var editorIndices = new List(); + if (deletions.Count > 0) { + editor = new PartitionEditor(disk, detection.SectorSize); + foreach (var target in deletions) { + var entry = editor.ListPartitions().FirstOrDefault(e => + e.StartOffset == target.Partition.StartOffset && e.Size == target.Partition.Size + && e.Source != "MBR (Extended Container)") + ?? throw new InvalidOperationException($"'{target.Prefix}' has no entry the partition editor can delete."); + editorIndices.Add(entry.Index); } } + + foreach (var window in staged) window.Commit(); + if (editor is not null) + foreach (var index in editorIndices.OrderDescending()) + editor.DeletePartition(index); + disk.Flush(); return true; } - private static bool TryParsePartitionPrefix(string entryName, out int partitionIndex, out string innerPath) { - partitionIndex = -1; - innerPath = string.Empty; - var slash = entryName.IndexOf('/'); - if (slash <= 0) return false; - var head = entryName[..slash]; - if (!TryParsePartitionIndex(head, out partitionIndex)) return false; - innerPath = entryName[(slash + 1)..]; - return innerPath.Length > 0; + /// + /// Runs a filesystem edit against a staged window over . The edit + /// must go through the filesystem's own in-place editor; one that would only re-create the + /// volume is refused, as is one that throws. Nothing is written until the caller commits. + /// + private static StagedWindowStream StageInnerEdit(Stream disk, PartitionTarget target, string method, + Action edit) { + var window = new StagedWindowStream(disk, target.Offset, target.Size); + var descriptor = InnerFsDetector.Detect(window); + if (descriptor is not IArchiveModifiable modifier) + throw new InvalidOperationException( + $"{target.Prefix} holds {(descriptor is null ? "no filesystem CompressionWorkbench recognises" : $"a {descriptor.DisplayName} volume CompressionWorkbench cannot edit")}; nothing was changed."); + if (!HasNativeEditor(modifier, method)) + throw new InvalidOperationException( + $"{target.Prefix}: {descriptor.DisplayName} can only be edited by re-creating the volume, which would not preserve it; nothing was changed."); + try { + window.Position = 0; + edit(modifier, window); + } catch (Exception ex) when (ex is IOException or NotSupportedException or InvalidDataException + or ArgumentException or InvalidOperationException) { + throw new InvalidOperationException($"{target.Prefix} ({descriptor.DisplayName}) refused the edit: {ex.Message}", ex); + } + return window; } - private static bool TryParsePartitionIndex(string head, out int zeroBasedIndex) { - zeroBasedIndex = -1; - if (!head.StartsWith("Partition", StringComparison.Ordinal)) return false; - var us = head.IndexOf('_'); - if (us <= 9) return false; - if (!int.TryParse(head[9..us], out var oneBased) || oneBased <= 0) return false; - zeroBasedIndex = oneBased - 1; - return true; + private static List<(ArchiveInputInfo Input, long Start, long Length, PartitionType Type, string? Label)> PlanNewPartitions( + Stream disk, PartitionTableDetector.DetectionResult detection, List inputs) { + if (detection.Scheme is not ("GPT" or "MBR")) + throw new InvalidOperationException($"New partitions can only be added to a GPT or MBR table, not {detection.Scheme}."); + + var probe = new PartitionEditor(new ReadOnlyProbe(disk), detection.SectorSize); + var sectorSize = probe.LogicalSectorSize; + var (usableStart, usableEnd) = probe.UsableRange; + var existing = probe.ListPartitions(); + var primaries = existing.Count(e => e.Source != "EBR"); + var capacity = probe.Scheme == PartitionScheme.Gpt ? 128 : 4; + if ((probe.Scheme == PartitionScheme.Gpt ? existing.Count : primaries) + inputs.Count > capacity) + throw new InvalidOperationException( + $"The {detection.Scheme} table has room for {capacity} partitions; adding {inputs.Count} would exceed it."); + + var cursor = Math.Max(usableStart, existing.Count == 0 ? 0 : existing.Max(e => e.StartOffset + e.Size)); + var plan = new List<(ArchiveInputInfo, long, long, PartitionType, string?)>(); + foreach (var input in inputs) { + using var content = OpenInput(input); + var type = DetectInputPartitionType(content); + var nameLooksLikeImage = Path.GetFileName(input.ArchiveName) is var leaf + && (leaf.EndsWith(".raw", StringComparison.OrdinalIgnoreCase) || leaf.EndsWith(".img", StringComparison.OrdinalIgnoreCase) + || leaf.StartsWith("Partition", StringComparison.Ordinal)); + if (type == PartitionType.Unknown && !nameLooksLikeImage) + throw new InvalidOperationException( + $"'{input.ArchiveName}' is neither a filesystem image nor a raw partition image (*.raw/*.img); a disk holds partitions, not loose files."); + if (content.Length <= 0) + throw new InvalidOperationException($"'{input.ArchiveName}' is empty; a partition needs at least one sector."); + + var length = AlignUp(content.Length, sectorSize); + var aligned = AlignUp(cursor, MiB); + var start = aligned + length <= usableEnd ? aligned : AlignUp(cursor, sectorSize); + if (start + length > usableEnd) + throw new InvalidOperationException( + $"Not enough free space after the last partition for '{input.ArchiveName}' ({content.Length:N0} bytes); nothing was changed."); + plan.Add((input, start, length, type == PartitionType.Unknown ? PartitionType.Linux : type, + Path.GetFileNameWithoutExtension(input.ArchiveName))); + cursor = start + length; + } + return plan; } - private const int SectorSize = 512; + private const long MiB = 1024 * 1024; - private static long AlignUp(long value, int alignment) - => (value + alignment - 1) / alignment * alignment; + private static Stream OpenInput(ArchiveInputInfo input) + => input.InMemoryContent is { } bytes + ? new MemoryStream(bytes, writable: false) + : new FileStream(input.FullPath, FileMode.Open, FileAccess.Read, FileShare.Read); - private static long FindAppendOffset(IReadOnlyList existing, long diskLength, long lengthBytes) { - long highest = SectorSize; // skip MBR - foreach (var e in existing) { - var end = e.StartOffset + e.Size; - if (end > highest) highest = end; - } - highest = AlignUp(highest, SectorSize); - return highest + lengthBytes <= diskLength ? highest : -1; + private static void WritePartitionData(Stream disk, ArchiveInputInfo input, long start, long length) { + using var content = OpenInput(input); + disk.Position = start; + content.CopyTo(disk); + var pad = length - content.Length; + if (pad > 0) disk.Write(new byte[pad]); } + /// A view that satisfies 's writable-stream check but refuses writes — for planning only. + private sealed class ReadOnlyProbe(Stream inner) : Stream { + public override bool CanRead => true; + public override bool CanSeek => true; + public override bool CanWrite => true; + public override long Length => inner.Length; + public override long Position { get => inner.Position; set => inner.Position = value; } + public override void Flush() { } + public override int Read(byte[] buffer, int offset, int count) => inner.Read(buffer, offset, count); + public override long Seek(long offset, SeekOrigin origin) => inner.Seek(offset, origin); + public override void SetLength(long value) => throw new NotSupportedException(); + public override void Write(byte[] buffer, int offset, int count) => throw new NotSupportedException("Planning view."); + } + + private static long AlignUp(long value, long alignment) + => (value + alignment - 1) / alignment * alignment; + /// /// Maps the input bytes to a logical by running - /// over a wrapping memory stream and translating - /// the resulting descriptor ID. + /// over the input and translating the resulting descriptor ID; + /// when no filesystem is recognised. /// - private static PartitionType DetectInputPartitionType(byte[] data) { + private static PartitionType DetectInputPartitionType(Stream data) { if (data.Length < 512) return PartitionType.Unknown; - using var ms = new MemoryStream(data, writable: false); - var desc = InnerFsDetector.Detect(ms); + var desc = InnerFsDetector.Detect(data); if (desc is null) return PartitionType.Unknown; return desc.Id switch { "Fat" => PartitionType.Fat32Lba, diff --git a/Compression.Core/DiskImage/SgiDvhParser.cs b/Compression.Core/DiskImage/SgiDvhParser.cs new file mode 100644 index 000000000..581104172 --- /dev/null +++ b/Compression.Core/DiskImage/SgiDvhParser.cs @@ -0,0 +1,86 @@ +using System.Buffers.Binary; + +namespace Compression.Core.DiskImage; + +/// +/// Parses the SGI disk volume header (DVH) in sector 0 — the IRIX partition scheme. Big-endian. +/// +/// +/// +/// The header opens with the magic 0x0BE5A941 and carries a checksum chosen so that the +/// 32-bit sum of all 128 big-endian longwords of the 512-byte sector is zero. Sixteen partition +/// records at byte 312 each hold a length and a first block (512-byte blocks) and a type. The +/// volume partition (type 6, conventionally slot 10) covers the whole disk and is not listed; +/// the volume-header partition (type 0) is, since it holds the boot files. +/// +/// References: +/// +/// Silicon Graphics, IRIX sys/dvh.h — struct volume_header, VHMAGIC, partition types, checksum rule. +/// +/// +public static class SgiDvhParser { + + private const int LabelSize = 512; + private const uint Magic = 0x0BE5A941; + private const int PartitionsOffset = 312; + private const int PartitionCount = 16; + private const int PartitionRecordSize = 12; + private const uint VolumeType = 6; + + /// Reports whether is an SGI volume header with a valid checksum. + public static bool IsDvh(ReadOnlySpan sector0) { + if (sector0.Length < LabelSize || BinaryPrimitives.ReadUInt32BigEndian(sector0) != Magic) return false; + uint sum = 0; + for (var i = 0; i < LabelSize; i += 4) + sum += BinaryPrimitives.ReadUInt32BigEndian(sector0[i..]); + return sum == 0; + } + + /// Parses the header's partitions, excluding the whole-volume partition and empty slots. + /// Sector 0 is not an SGI volume header. + public static List Parse(ReadOnlySpan sector0) { + if (!IsDvh(sector0)) throw new InvalidDataException("Sector 0 is not a checksummed SGI volume header."); + + var result = new List(); + for (var i = 0; i < PartitionCount; ++i) { + var record = sector0[(PartitionsOffset + i * PartitionRecordSize)..]; + var blocks = BinaryPrimitives.ReadUInt32BigEndian(record); + var first = BinaryPrimitives.ReadUInt32BigEndian(record[4..]); + var type = BinaryPrimitives.ReadUInt32BigEndian(record[8..]); + if (blocks == 0 || type == VolumeType) continue; + + result.Add(new PartitionEntry { + Index = result.Count, + StartOffset = (long)first * LabelSize, + Size = (long)blocks * LabelSize, + TypeName = TypeName(type), + TypeCode = $"0x{type:X2}", + Name = i.ToString(System.Globalization.CultureInfo.InvariantCulture), + Source = "SGI" + }); + } + return result; + } + + private static string TypeName(uint type) => type switch { + 0x00 => "SGI volhdr", + 0x01 => "SGI trkrepl", + 0x02 => "SGI secrepl", + 0x03 => "SGI raw", + 0x04 => "SGI bsd", + 0x05 => "SGI sysv", + 0x06 => "SGI volume", + 0x07 => "SGI efs", + 0x08 => "SGI lvol", + 0x09 => "SGI rlvol", + 0x0A => "SGI xfs", + 0x0B => "SGI xfslog", + 0x0C => "SGI xlv", + 0x0D => "SGI xvm", + 0x82 => "Linux swap", + 0x83 => "Linux native", + 0x8E => "Linux LVM", + 0xFD => "Linux RAID", + _ => $"SGI type 0x{type:X2}" + }; +} diff --git a/Compression.Core/DiskImage/StagedWindowStream.cs b/Compression.Core/DiskImage/StagedWindowStream.cs new file mode 100644 index 000000000..62b53b8c2 --- /dev/null +++ b/Compression.Core/DiskImage/StagedWindowStream.cs @@ -0,0 +1,153 @@ +namespace Compression.Core.DiskImage; + +/// +/// A writable, fixed-length window over a range of a disk whose writes are held back until +/// . Reads see the staged writes on top of the disk's bytes, so a +/// filesystem editor working through the window behaves exactly as it would on a standalone +/// image; but nothing reaches the disk unless the whole edit finishes and the caller commits. +/// An editor that throws half-way, or that tries to grow its volume past the partition, leaves +/// the disk byte-identical. +/// +/// +/// Writes are staged in 4 KiB pages, so the memory held is proportional to what the edit +/// touches, not to the partition. +/// +public sealed class StagedWindowStream : Stream { + private const int PageSize = 4096; + + private readonly Stream _disk; + private readonly long _offset; + private readonly long _length; + private readonly Dictionary _pages = []; + private long _position; + private bool _committed; + + /// Opens a staged window of bytes at on . + public StagedWindowStream(Stream disk, long offset, long length) { + ArgumentNullException.ThrowIfNull(disk); + if (!disk.CanSeek || !disk.CanRead) throw new ArgumentException("The disk must be readable and seekable.", nameof(disk)); + ArgumentOutOfRangeException.ThrowIfNegative(offset); + ArgumentOutOfRangeException.ThrowIfNegative(length); + this._disk = disk; + this._offset = offset; + this._length = length; + } + + /// Whether any write has been staged. + public bool HasChanges => this._pages.Count > 0; + + /// + public override bool CanRead => true; + /// + public override bool CanSeek => true; + /// + public override bool CanWrite => !this._committed; + /// + public override long Length => this._length; + + /// + public override long Position { + get => this._position; + set { + ArgumentOutOfRangeException.ThrowIfNegative(value); + this._position = value; + } + } + + /// + public override int Read(byte[] buffer, int offset, int count) => this.Read(buffer.AsSpan(offset, count)); + + /// + public override int Read(Span buffer) { + if (this._position >= this._length) return 0; + var total = (int)Math.Min(buffer.Length, this._length - this._position); + var done = 0; + while (done < total) { + var pos = this._position + done; + var pageIndex = pos / PageSize; + var inPage = (int)(pos % PageSize); + var chunk = Math.Min(total - done, PageSize - inPage); + if (this._pages.TryGetValue(pageIndex, out var page)) { + page.AsSpan(inPage, chunk).CopyTo(buffer.Slice(done, chunk)); + } else { + this._disk.Position = this._offset + pos; + var read = this._disk.ReadAtLeast(buffer.Slice(done, chunk), chunk, throwOnEndOfStream: false); + if (read < chunk) buffer.Slice(done + read, chunk - read).Clear(); + } + done += chunk; + } + this._position += total; + return total; + } + + /// + public override void Write(byte[] buffer, int offset, int count) => this.Write(buffer.AsSpan(offset, count)); + + /// + public override void Write(ReadOnlySpan buffer) { + if (this._committed) throw new InvalidOperationException("The staged window has already been committed."); + if (this._position + buffer.Length > this._length) + throw new IOException( + $"Write at {this._position} for {buffer.Length} bytes runs past the end of the {this._length}-byte partition."); + var done = 0; + while (done < buffer.Length) { + var pos = this._position + done; + var pageIndex = pos / PageSize; + var inPage = (int)(pos % PageSize); + var chunk = Math.Min(buffer.Length - done, PageSize - inPage); + buffer.Slice(done, chunk).CopyTo(this.PageFor(pageIndex).AsSpan(inPage, chunk)); + done += chunk; + } + this._position += buffer.Length; + } + + private byte[] PageFor(long pageIndex) { + if (this._pages.TryGetValue(pageIndex, out var page)) return page; + page = new byte[PageSize]; + var pageStart = pageIndex * PageSize; + var valid = (int)Math.Min(PageSize, this._length - pageStart); + this._disk.Position = this._offset + pageStart; + _ = this._disk.ReadAtLeast(page.AsSpan(0, valid), valid, throwOnEndOfStream: false); + this._pages[pageIndex] = page; + return page; + } + + /// + public override long Seek(long offset, SeekOrigin origin) { + this.Position = origin switch { + SeekOrigin.Begin => offset, + SeekOrigin.Current => this._position + offset, + SeekOrigin.End => this._length + offset, + _ => throw new ArgumentOutOfRangeException(nameof(origin)), + }; + return this._position; + } + + /// + /// A partition cannot grow from inside: asking for more than its length fails, and asking for + /// less leaves the trailing bytes where they are, as unused space inside the partition. + /// + public override void SetLength(long value) { + if (value > this._length) + throw new IOException($"The filesystem asked for {value} bytes, but its partition holds {this._length}."); + } + + /// Staged writes stay staged; only writes them. + public override void Flush() { } + + /// Writes every staged page to the disk, in disk order, then flushes it. + public void Commit() { + if (this._committed) return; + if (this._pages.Count > 0 && !this._disk.CanWrite) + throw new NotSupportedException("The disk is read-only."); + foreach (var (pageIndex, page) in this._pages.OrderBy(p => p.Key)) { + var pageStart = pageIndex * PageSize; + var valid = (int)Math.Min(PageSize, this._length - pageStart); + this._disk.Position = this._offset + pageStart; + this._disk.Write(page, 0, valid); + } + this._disk.Flush(); + this._committed = true; + this._pages.Clear(); + } +} diff --git a/Compression.Core/DiskImage/SunVtocParser.cs b/Compression.Core/DiskImage/SunVtocParser.cs new file mode 100644 index 000000000..4896b639e --- /dev/null +++ b/Compression.Core/DiskImage/SunVtocParser.cs @@ -0,0 +1,100 @@ +using System.Buffers.Binary; + +namespace Compression.Core.DiskImage; + +/// +/// Parses the Sun disk label (SunOS / Solaris SPARC "VTOC" label) in sector 0. Big-endian. +/// +/// +/// +/// The 512-byte label ends in the magic 0xDABE at byte 508 and a checksum at 510 chosen +/// so that the XOR of all 256 big-endian 16-bit words is zero. Eight partition records at byte +/// 444 hold a start cylinder and a length in sectors; a cylinder is ntrks × nsect +/// sectors, from the geometry fields at bytes 436 and 438. The VTOC at byte 128 tags each +/// slice (root, swap, usr, whole disk, Linux native, …) and is recognised by its sanity word +/// 0x600DDEEE; a label without one still describes its partitions. +/// +/// +/// The whole-disk slice (tag 5, conventionally slice 2) overlaps every other slice and is not +/// listed. +/// +/// References: +/// +/// Sun Microsystems, sys/dklabel.h — struct dk_label layout, DKL_MAGIC, checksum rule. +/// Sun Microsystems, sys/vtoc.h — slice tag values (V_BOOT, V_ROOT, V_BACKUP, …) and VTOC_SANE. +/// +/// +public static class SunVtocParser { + + private const int LabelSize = 512; + private const ushort Magic = 0xDABE; + private const int MagicOffset = 508; + private const uint VtocSane = 0x600DDEEE; + private const int VtocSanityOffset = 188; + private const int VtocInfosOffset = 142; + private const int NtrksOffset = 436; + private const int NsectOffset = 438; + private const int PartitionsOffset = 444; + private const int PartitionCount = 8; + private const ushort WholeDiskTag = 5; + + /// Reports whether is a Sun label with a valid checksum. + public static bool IsSunLabel(ReadOnlySpan sector0) { + if (sector0.Length < LabelSize) return false; + if (BinaryPrimitives.ReadUInt16BigEndian(sector0[MagicOffset..]) != Magic) return false; + ushort xor = 0; + for (var i = 0; i < LabelSize; i += 2) + xor ^= BinaryPrimitives.ReadUInt16BigEndian(sector0[i..]); + return xor == 0; + } + + /// Parses the label's slices, excluding the whole-disk slice and empty slots. + /// Sector 0 is not a Sun label. + public static List Parse(ReadOnlySpan sector0) { + if (!IsSunLabel(sector0)) throw new InvalidDataException("Sector 0 is not a checksummed Sun disk label."); + + var ntrks = BinaryPrimitives.ReadUInt16BigEndian(sector0[NtrksOffset..]); + var nsect = BinaryPrimitives.ReadUInt16BigEndian(sector0[NsectOffset..]); + var cylinderSectors = (long)ntrks * nsect; + var hasVtoc = BinaryPrimitives.ReadUInt32BigEndian(sector0[VtocSanityOffset..]) == VtocSane; + + var result = new List(); + for (var i = 0; i < PartitionCount; ++i) { + var record = sector0[(PartitionsOffset + i * 8)..]; + var startCylinder = BinaryPrimitives.ReadUInt32BigEndian(record); + var sectors = BinaryPrimitives.ReadUInt32BigEndian(record[4..]); + if (sectors == 0) continue; + + var tag = hasVtoc ? BinaryPrimitives.ReadUInt16BigEndian(sector0[(VtocInfosOffset + i * 4)..]) : (ushort)0; + if (tag == WholeDiskTag || (!hasVtoc && i == 2)) continue; + + result.Add(new PartitionEntry { + Index = result.Count, + StartOffset = startCylinder * cylinderSectors * LabelSize, + Size = (long)sectors * LabelSize, + TypeName = TagName(tag), + TypeCode = $"0x{tag:X2}", + Name = ((char)('a' + i)).ToString(), + Source = "Sun" + }); + } + return result; + } + + private static string TagName(ushort tag) => tag switch { + 0x00 => "Unassigned", + 0x01 => "Boot", + 0x02 => "SunOS root", + 0x03 => "SunOS swap", + 0x04 => "SunOS usr", + 0x05 => "Whole disk", + 0x06 => "SunOS stand", + 0x07 => "SunOS var", + 0x08 => "SunOS home", + 0x82 => "Linux swap", + 0x83 => "Linux native", + 0x8E => "Linux LVM", + 0xFD => "Linux raid autodetect", + _ => $"Sun tag 0x{tag:X2}" + }; +} diff --git a/Compression.Core/REFERENCE.md b/Compression.Core/REFERENCE.md index ac9593fae..86510a075 100644 --- a/Compression.Core/REFERENCE.md +++ b/Compression.Core/REFERENCE.md @@ -3609,7 +3609,16 @@ Implements `IBuildingBlock`. ### Namespace `Compression.Core.DiskImage` -[`ApmParser`](#apmparser) · [`BsdDisklabelParser`](#bsddisklabelparser) · [`ClusterAllocator`](#clusterallocator) · [`DeferredPayloads`](#deferredpayloads) · [`ExtBlockGroupGeometry`](#extblockgroupgeometry) · [`ExtBlockGroupGeometry.ExtGeometry`](#extblockgroupgeometryextgeometry) · [`ExtentCopy`](#extentcopy) · [`FilePayload`](#filepayload) · [`GptParser`](#gptparser) · [`ImageAccessor`](#imageaccessor) · [`MbrParser`](#mbrparser) · [`MbrWrapper`](#mbrwrapper) · [`MbrWrapper.PartitionType`](#mbrwrapperpartitiontype) · [`PartitionEditor`](#partitioneditor) · [`PartitionEntry`](#partitionentry) · [`PartitionScheme`](#partitionscheme) · [`PartitionTableDetector`](#partitiontabledetector) · [`PartitionTableDetector.DetectionResult`](#partitiontabledetectordetectionresult) · [`PartitionTableVerification`](#partitiontableverification) · [`PartitionType`](#partitiontype) · [`PartitionTypeDatabase`](#partitiontypedatabase) · [`PartitionTypeMapping`](#partitiontypemapping) · [`PartitionWindowStream`](#partitionwindowstream) · [`PartitionedDiskLister`](#partitioneddisklister) · [`SparseBlockImage`](#sparseblockimage) +[`AmigaRdbParser`](#amigardbparser) · [`ApmParser`](#apmparser) · [`BsdDisklabelParser`](#bsddisklabelparser) · [`ClusterAllocator`](#clusterallocator) · [`DeferredPayloads`](#deferredpayloads) · [`ExtBlockGroupGeometry`](#extblockgroupgeometry) · [`ExtBlockGroupGeometry.ExtGeometry`](#extblockgroupgeometryextgeometry) · [`ExtentCopy`](#extentcopy) · [`FilePayload`](#filepayload) · [`GptParser`](#gptparser) · [`GptParser.HeaderInfo`](#gptparserheaderinfo) · [`ImageAccessor`](#imageaccessor) · [`MbrParser`](#mbrparser) · [`MbrWrapper`](#mbrwrapper) · [`MbrWrapper.PartitionType`](#mbrwrapperpartitiontype) · [`PartitionEditor`](#partitioneditor) · [`PartitionEntry`](#partitionentry) · [`PartitionScheme`](#partitionscheme) · [`PartitionTableDetector`](#partitiontabledetector) · [`PartitionTableDetector.DetectionResult`](#partitiontabledetectordetectionresult) · [`PartitionTableVerification`](#partitiontableverification) · [`PartitionType`](#partitiontype) · [`PartitionTypeDatabase`](#partitiontypedatabase) · [`PartitionTypeMapping`](#partitiontypemapping) · [`PartitionWindowStream`](#partitionwindowstream) · [`PartitionedDiskLister`](#partitioneddisklister) · [`PartitionedDiskLister.PartitionTarget`](#partitioneddisklisterpartitiontarget) · [`SgiDvhParser`](#sgidvhparser) · [`SparseBlockImage`](#sparseblockimage) · [`StagedWindowStream`](#stagedwindowstream) · [`SunVtocParser`](#sunvtocparser) + +#### `AmigaRdbParser` + +Parses the Amiga Rigid Disk Block (RDB) partition scheme. Big-endian throughout. + +| Member | Signature | Summary | +| --- | --- | --- | +| `IsRdb` | `static bool IsRdb(Stream disk)` | Reports whether a checksummed `RDSK` block sits in the first 16 blocks. | +| `Parse` | `static List Parse(Stream disk)` | Parses every partition the RDB's `PART` chain describes. | #### `ApmParser` @@ -3627,6 +3636,7 @@ Parses the 4.4BSD `disklabel` that FreeBSD/NetBSD/OpenBSD write into a BSD slice | Member | Signature | Summary | | --- | --- | --- | | `IsDisklabel` | `static bool IsDisklabel(Stream slice)` | Reports whether a BSD disklabel magic is present at either candidate offset within the given slice stream. | +| `IsStandaloneDisklabel` | `static bool IsStandaloneDisklabel(Stream disk)` | Reports whether `disk` carries a disklabel that stands on its own — no MBR slice around it, as a "dangerously dedicated" FreeBSD disk or a NetBSD/OpenBSD disk on a non-PC port writes it. With nothing else vouching for the bytes the label must prove itself structurally: `d_magic` and `d_magic2` both present 132 bytes apart, a sector size that is a power of two in [512, 8192], a partition count within `MAXPARTITIONS`, and every used partition starting inside the disk. | | `Parse` | `static List Parse(Stream slice, long sliceStartByteOffset = 0)` | Parses the BSD disklabel contained in `slice` and returns its filesystem partitions. | #### `ClusterAllocator` @@ -3716,13 +3726,39 @@ Implements `IEquatable`. #### `GptParser` -Parses GPT (GUID Partition Table) headers and partition entries. GPT header is at LBA 1 (offset 512 for 512-byte sectors), with partition entries starting at LBA 2+. +Parses GPT (GUID Partition Table) headers and partition entries. + +| Member | Signature | Summary | +| --- | --- | --- | +| `ProbeBytes` | `const int ProbeBytes` | Bytes of the image needed to see LBA 1 at every supported block size. | +| `SupportedSectorSizes` | `static IReadOnlyList SupportedSectorSizes { get; }` | Logical block sizes probed for the header at LBA 1, in probe order. | +| `DetectSectorSize` | `static int DetectSectorSize(ReadOnlySpan data)` | The logical block size for which LBA 1 holds a valid GPT header, or 0 when none does. | +| `HasValidHeader` | `static bool HasValidHeader(ReadOnlySpan data)` | Checks that LBA 1 holds a GPT header that is internally consistent, not merely the "EFI PART" signature, at any supported block size: see `HasValidHeader`. | +| `HasValidHeader` | `static bool HasValidHeader(ReadOnlySpan data, int sectorSize)` | Checks that LBA 1, counted in `sectorSize`-byte blocks, holds a GPT header that is internally consistent: the header size lies in [92, block size], the header's own CRC32 matches (computed with the CRC field zeroed, UEFI 2.10 §5.3.2), it names itself as LBA 1 and its partition entries are 128 x 2^n bytes each, as the specification requires. | +| `IsGpt` | `static bool IsGpt(ReadOnlySpan data)` | Checks whether LBA 1 carries the "EFI PART" signature at any supported block size. | +| `Parse` | `static List Parse(Stream diskData)` | Parses all partitions from a GPT disk image, at whichever block size its header validates. | +| `Parse` | `static List Parse(Stream diskData, out HeaderInfo info)` | Parses all partitions and reports the header that described them. | +| `ReadHeader` | `static HeaderInfo ReadHeader(Stream diskData)` | The partition table's layout facts, or `null` when the image carries no usable GPT. Uses the same header `Parse` would. | + +#### `GptParser.HeaderInfo` + +Layout facts read from the header that was used to parse the table. + +Implements `IEquatable`. | Member | Signature | Summary | | --- | --- | --- | -| `HasValidHeader` | `static bool HasValidHeader(ReadOnlySpan data)` | Checks that LBA 1 holds a GPT header that is internally consistent, not merely the "EFI PART" signature: the header size lies in [92, 512], the header's own CRC32 matches (computed with the CRC field zeroed, UEFI 2.10 §5.3.2), it names itself as LBA 1 and its partition entries are 128 x 2^n bytes each, as the specification requires. | -| `IsGpt` | `static bool IsGpt(ReadOnlySpan data)` | Checks whether the given data contains a valid GPT header at LBA 1. | -| `Parse` | `static List Parse(Stream diskData)` | Parses all partitions from a GPT disk image. | +| `HeaderInfo` | `HeaderInfo(int SectorSize, ulong MyLba, ulong AlternateLba, ulong FirstUsableLba, ulong LastUsableLba, Guid DiskGuid, ulong EntriesLba, uint EntryCount, uint EntrySize, bool FromBackup)` | Layout facts read from the header that was used to parse the table. | +| `AlternateLba` | `ulong AlternateLba { get; init; }` | The LBA of the other header. | +| `DiskGuid` | `Guid DiskGuid { get; init; }` | The disk GUID. | +| `EntriesLba` | `ulong EntriesLba { get; init; }` | Starting LBA of the entry array the used header points at. | +| `EntryCount` | `uint EntryCount { get; init; }` | Number of entries in the array. | +| `EntrySize` | `uint EntrySize { get; init; }` | Size of one entry in bytes. | +| `FirstUsableLba` | `ulong FirstUsableLba { get; init; }` | First LBA a partition may occupy. | +| `FromBackup` | `bool FromBackup { get; init; }` | `true` when the primary was unusable and the backup was read. | +| `LastUsableLba` | `ulong LastUsableLba { get; init; }` | Last LBA a partition may occupy. | +| `MyLba` | `ulong MyLba { get; init; }` | The LBA the used header sits at (1 for the primary). | +| `SectorSize` | `int SectorSize { get; init; }` | Logical block size every LBA is counted in. | #### `ImageAccessor` @@ -3749,14 +3785,14 @@ Implements `IDisposable`. #### `MbrParser` -Parses MBR (Master Boot Record) partition tables, including extended/logical partition chains. The MBR sits at LBA 0 (offset 0) of a disk image, with 4 primary partition entries at offset 0x1BE. +Parses MBR (Master Boot Record) partition tables, including extended/logical partition chains. The MBR sits at LBA 0 (offset 0) of a disk image, with 4 primary partition entries at offset 0x1BE. The entries count in logical blocks: 512 bytes on a classic or 512e disk, 4096 on a 4Kn disk. | Member | Signature | Summary | | --- | --- | --- | -| `HasValidPartitionTable` | `static bool HasValidPartitionTable(ReadOnlySpan sector0, long diskLength)` | Checks whether sector 0 holds a partition table that is actually usable, rather than merely ending in the 0x55AA boot signature — which every FAT, NTFS and exFAT volume boot record does as well. | +| `HasValidPartitionTable` | `static bool HasValidPartitionTable(ReadOnlySpan sector0, long diskLength, int sectorSize = 512)` | Checks whether sector 0 holds a partition table that is actually usable, rather than merely ending in the 0x55AA boot signature — which every FAT, NTFS and exFAT volume boot record does as well. | | `IsMbr` | `static bool IsMbr(ReadOnlySpan data)` | Checks whether the given data starts with a valid MBR. | -| `ParsePrimary` | `static List ParsePrimary(ReadOnlySpan mbr)` | Parses the 4 primary partition entries from an MBR without following extended chains. Operates on a 512-byte buffer (no stream needed). | -| `Parse` | `static List Parse(Stream diskData)` | Parses all partitions from an MBR, including extended/logical partitions. | +| `ParsePrimary` | `static List ParsePrimary(ReadOnlySpan mbr, int sectorSize = 512)` | Parses the 4 primary partition entries from an MBR without following extended chains. Operates on a 512-byte buffer (no stream needed). | +| `Parse` | `static List Parse(Stream diskData, int sectorSize = 512)` | Parses all partitions from an MBR, including extended/logical partitions. | #### `MbrWrapper` @@ -3788,15 +3824,20 @@ Read/write partition-table editor for raw disk images. Handles MBR (4 primary en | Member | Signature | Summary | | --- | --- | --- | | `PartitionEditor` | `PartitionEditor(Stream stream)` | Opens an editor over the given disk-image stream. The stream must be readable, writable, and seekable. The scheme (MBR/GPT/None) is auto-detected from the on-disk signature. | -| `SectorSize` | `const int SectorSize` | Standard sector size used by the editor. | +| `PartitionEditor` | `PartitionEditor(Stream stream, int sectorSize)` | Opens an editor over the given disk-image stream, counting LBAs in `sectorSize`-byte blocks unless a GPT on the disk validates at another supported block size — the table on the disk decides, since rewriting it at a different size would move every partition. | +| `SectorSize` | `const int SectorSize` | The classic logical block size, and the one a disk without a GPT is assumed to use unless the caller says otherwise. A 4Kn GPT disk is edited in 4096-byte blocks: see `LogicalSectorSize`. | | `InPlaceFilesystemConverter` | `static Func InPlaceFilesystemConverter { get; set; }` | Pluggable in-place filesystem-variant converter. Set by the higher-level `Compression.Lib` layer at startup (it can reference the per-family FileSystem.* projects, which Core cannot). When non-null, `ConvertFilesystem` attempts a metadata-only conversion via this delegate before falling back to `false`. Contract: takes (partitionStream, sourceFsId, targetFsId), returns `true` if the conversion succeeded entirely via metadata edits, `false` if no in-place path exists for the pair (the caller should then do a full migration: extract files → FormatPartition → re-import). | | `InPlaceFilesystemResizer` | `static Func InPlaceFilesystemResizer { get; set; }` | Pluggable in-place filesystem-resizer. Set by the higher-level `Compression.Lib` layer at startup (Core cannot reference FileSystem.* projects, so the actual resizer lives there). The contract is: (partitionStream, fsId, newSizeBytes, isShrink) → bool Returns `true` when the resize succeeded entirely via in-place edits, `false` when no in-place path exists for the fsId (the caller should fall back to a full extract → reformat → re-import). | +| `LogicalSectorSize` | `int LogicalSectorSize { get; }` | The logical block size every LBA on this disk is counted in: the size at which the GPT header validated, or — for an MBR or blank disk — the size the editor was opened with. | | `Scheme` | `PartitionScheme Scheme { get; }` | Partition scheme currently in use on the disk image. | +| `SupportedSectorSizes` | `static IReadOnlyList SupportedSectorSizes { get; }` | Logical block sizes the editor supports. | +| `UsableRange` | `ValueTuple UsableRange { get; }` | The byte range partitions may occupy under the current scheme: everything after LBA 0 for MBR; between the primary and backup GPT structures for GPT. | | `AddLogicalPartition` | `void AddLogicalPartition(long startByteOffset, long lengthBytes, PartitionType type, string label)` | Adds a new logical partition inside the existing MBR extended container. The byte range must lie entirely within the extended container and not overlap any existing logical (each logical occupies its EBR sector plus the data range). | | `AddPartition` | `void AddPartition(long startByteOffset, long lengthBytes, PartitionType type, string label)` | Adds a new primary partition entry covering [`startByteOffset`, `startByteOffset` + `lengthBytes`). | | `ConvertFilesystem` | `bool ConvertFilesystem(int partitionIndex, string newFsId)` | Attempts an in-place filesystem-variant conversion of the partition at `partitionIndex`. Reads the partition's current contents as a substream, dispatches to `InPlaceFilesystemConverter` (set by the Compression.Lib bootstrap), and returns the converter's answer. Returns `false` when:No converter has been registered (Core-only build).The source/target pair has no metadata-only conversion path (e.g. FAT → ext, NTFS → exFAT — any cross-family conversion).The image geometry rules out the requested target (e.g. a tiny FAT12 floppy can't fit FAT32's 32-reserved-sector overhead). In any of these cases the caller is expected to fall back to a full extract → reformat → re-import migration. | | `ConvertGptToMbr` | `void ConvertGptToMbr()` | Reads the current GPT partition table, takes the first 4 entries (MBR hard limit), zero-fills both GPT header areas, and writes a fresh MBR with the translated entries. | | `ConvertMbrToGpt` | `void ConvertMbrToGpt()` | Reads the current MBR partition table, drops it, then rewrites the equivalent GPT layout: protective MBR at LBA 0, primary GPT header at LBA 1, entries starting at LBA 2, backup GPT at the end of the disk. Translates MBR type bytes to GPT GUIDs via `PartitionTypeMapping`. The extended container (if present) is dropped — its logical children are promoted to top-level GPT entries. | +| `CreateEmpty` | `static PartitionEditor CreateEmpty(Stream stream, PartitionScheme scheme, int sectorSize = 512)` | Writes an empty partition table of `scheme` over the start (and, for GPT, the end) of `stream` and returns an editor over it. A GPT gets the standard 128 entries of 128 bytes, its backup at the last LBA and a protective MBR. | | `DeletePartition` | `void DeletePartition(int index)` | Deletes the partition at the given index. The partition byte range is not modified — see `PurgePartition` to zero it. | | `FormatPartition` | `void FormatPartition(int index, string formatId, FormatCreateOptions options)` | Writes a fresh filesystem image of the given `formatId` into the partition's byte range. The format must be registered with `FormatRegistry` and support `IArchiveCreatable`. The resulting bytes must fit within the partition (an exception is thrown otherwise). | | `ListPartitions` | `IReadOnlyList ListPartitions()` | Returns a snapshot of the current partition table. | @@ -3834,14 +3875,15 @@ Partition scheme detected on a disk image. #### `PartitionTableDetector` -Detects and parses partition tables from raw disk data. Tries GPT first (since GPT disks also have a protective MBR), then falls back to MBR. +Detects and parses partition tables from raw disk data. | Member | Signature | Summary | | --- | --- | --- | -| `Detect` | `static DetectionResult Detect(Stream diskData)` | Attempts to detect a partition table in the given stream. Tries GPT first (higher precedence), then MBR. Returns an empty partition list if no valid partition table is found. | +| `Detect` | `static DetectionResult Detect(Stream diskData)` | Attempts to detect a partition table in the given stream. Returns an empty partition list if no valid partition table is found. | | `Detect` | `static DetectionResult Detect(byte[] diskData)` | Attempts to detect a partition table in the given byte array. Convenience overload that wraps the data in a `MemoryStream`. | | `ExtractPartitionData` | `static byte[] ExtractPartitionData(Stream diskData, PartitionEntry partition)` | Extracts partition data from a disk image stream. Returns the raw bytes of the partition at the given offset and size. | | `ExtractPartitionData` | `static byte[] ExtractPartitionData(byte[] diskData, PartitionEntry partition)` | Extracts partition data from a byte array. | +| `HasSelfValidatingLabel` | `static bool HasSelfValidatingLabel(Stream disk)` | Whether the first sector holds a partition table of a scheme that has no MBR-style boot signature to go on — SGI, Sun, a stand-alone BSD disklabel or an Amiga RDB — each verified by its own checksum (BSD: by its two magics and geometry). Used by content detection, which has already ruled out GPT, MBR and APM by then. | #### `PartitionTableDetector.DetectionResult` @@ -3851,7 +3893,8 @@ Result of partition table detection, including the scheme used and the discovere | --- | --- | --- | | `DetectionResult` | `DetectionResult()` | | | `Partitions` | `List Partitions { get; init; }` | Discovered partitions. Empty if no partition table was found. | -| `Scheme` | `string Scheme { get; init; }` | The partition scheme detected: "GPT", "MBR", "APM", or "None". | +| `Scheme` | `string Scheme { get; init; }` | The partition scheme detected: "GPT", "MBR", "APM", "BSD", "RDB", "Sun", "SGI", or "None". | +| `SectorSize` | `int SectorSize { get; init; }` | Logical block size the table counts in (512 unless a 4Kn GPT was found). | #### `PartitionTableVerification` @@ -3941,11 +3984,38 @@ Partition-aware archive surface for raw disk image streams (VHD/VHDX/VMDK/Qcow2/ | Member | Signature | Summary | | --- | --- | --- | +| `EnumerateTargets` | `static List EnumerateTargets(Stream disk, DetectionResult detection)` | Every partition the listing shows a prefix for, in listing order: top-level partitions, with a BSD-disklabel container replaced by its slices. | | `Extract` | `static bool Extract(Stream disk, string outputDir, string password, string[] files)` | Extracts entries across every partition into per-partition subdirectories of `outputDir`. Returns `true` if a partition table was detected and handled; `false` if no partition table was found (caller falls through to the unpartitioned path). | +| `HasNativeEditor` | `static bool HasNativeEditor(IArchiveModifiable modifier, string method)` | Whether `modifier` edits through its own code for `method` (`Add` or `Remove`) rather than the interface's generic extract → re-create default, which re-creates the volume and loses what its writer does not reproduce. | | `List` | `static List List(Stream disk, string password)` | Lists entries across every partition. Returns `null` if no partition table is present so the caller can fall through to the unpartitioned path. | | `MakePartitionPrefix` | `static string MakePartitionPrefix(PartitionEntry part)` | The directory name a partition is listed under: `Partition{N}_{TypeName}`, with N one-based and the type name reduced to letters, digits, '-' and '_'. | -| `TryAdd` | `static bool TryAdd(Stream disk, IReadOnlyList inputs)` | Partition-aware `Add`. Returns `true` when a partition table was present and at least one input was dispatched through the partition-aware path; `false` when no partition table exists so the caller can fall through to the existing single-FS path. | -| `TryRemove` | `static bool TryRemove(Stream disk, string[] entryNames)` | Partition-aware `Remove`. Returns `true` when a partition table was present and at least one entry was removed; `false` if no partition table was detected. Entry name shapes: `Partition_/` deletes an inner-FS file; `Partition_` or `Partition_.raw` deletes the whole partition. | +| `Resolve` | `static PartitionTarget Resolve(IEnumerable targets, string entryName, out string innerPath)` | Finds the partition an entry name addresses. `innerPath` is the rest of the name below the partition's prefix — empty when the name is the partition itself (`PartitionN_Type` or `PartitionN_Type.raw`). | +| `TryAdd` | `static bool TryAdd(Stream disk, IReadOnlyList inputs)` | Partition-aware `Add`. Returns `false` when no partition table exists (or the stream is read-only) so the caller can fall through to its single-filesystem path. | +| `TryRemove` | `static bool TryRemove(Stream disk, string[] entryNames)` | Partition-aware `Remove`. Returns `false` when no partition table exists (or the stream is read-only). Entry name shapes: `PartitionN_Type/inner` removes a file — or a folder with everything beneath it — through the partition filesystem's own in-place editor; `PartitionN_Type` or `PartitionN_Type.raw` deletes the partition's table entry (GPT and MBR, including logical partitions), leaving its sectors as they were. | + +#### `PartitionedDiskLister.PartitionTarget` + +One listed partition: a top-level partition, or a slice of a BSD disklabel nested inside one, with the prefix its entries are listed under. + +Implements `IEquatable`. + +| Member | Signature | Summary | +| --- | --- | --- | +| `PartitionTarget` | `PartitionTarget(PartitionEntry Partition, string Prefix, long Offset, long Size, bool IsBsdSlice)` | One listed partition: a top-level partition, or a slice of a BSD disklabel nested inside one, with the prefix its entries are listed under. | +| `IsBsdSlice` | `bool IsBsdSlice { get; init; }` | Whether this is a slice inside a BSD disklabel rather than a table entry. | +| `Offset` | `long Offset { get; init; }` | Byte offset of the partition on the disk. | +| `Partition` | `PartitionEntry Partition { get; init; }` | The table entry (for a BSD slice, the slice's own entry). | +| `Prefix` | `string Prefix { get; init; }` | The listing prefix, e.g. `Partition1_FAT32` or `Partition1_FreeBSD/Partition1_4_2BSD`. | +| `Size` | `long Size { get; init; }` | Bytes of the partition that lie inside the image. | + +#### `SgiDvhParser` + +Parses the SGI disk volume header (DVH) in sector 0 — the IRIX partition scheme. Big-endian. + +| Member | Signature | Summary | +| --- | --- | --- | +| `IsDvh` | `static bool IsDvh(ReadOnlySpan sector0)` | Reports whether `sector0` is an SGI volume header with a valid checksum. | +| `Parse` | `static List Parse(ReadOnlySpan sector0)` | Parses the header's partitions, excluding the whole-volume partition and empty slots. | #### `SparseBlockImage` @@ -3965,6 +4035,39 @@ Sparse, block-addressed image buffer. Only the blocks a writer actually touches | `WriteTo` | `void WriteTo(Stream output)` | Writes the volume from the current position, extending the stream to its full size. | | `Write` | `void Write(long offset, ReadOnlySpan data)` | Copies `data` to `offset`, spanning blocks as needed. | +#### `StagedWindowStream` + +A writable, fixed-length window over a range of a disk whose writes are held back until `Commit`. Reads see the staged writes on top of the disk's bytes, so a filesystem editor working through the window behaves exactly as it would on a standalone image; but nothing reaches the disk unless the whole edit finishes and the caller commits. An editor that throws half-way, or that tries to grow its volume past the partition, leaves the disk byte-identical. + +Inherits `Stream`. Implements `IAsyncDisposable`, `IDisposable`. + +| Member | Signature | Summary | +| --- | --- | --- | +| `StagedWindowStream` | `StagedWindowStream(Stream disk, long offset, long length)` | Opens a staged window of `length` bytes at `offset` on `disk`. | +| `CanRead` | `override bool CanRead { get; }` | | +| `CanSeek` | `override bool CanSeek { get; }` | | +| `CanWrite` | `override bool CanWrite { get; }` | | +| `HasChanges` | `bool HasChanges { get; }` | Whether any write has been staged. | +| `Length` | `override long Length { get; }` | | +| `Position` | `override long Position { get; set; }` | | +| `Commit` | `void Commit()` | Writes every staged page to the disk, in disk order, then flushes it. | +| `Flush` | `override void Flush()` | Staged writes stay staged; only `Commit` writes them. | +| `Read` | `override int Read(Span buffer)` | | +| `Read` | `override int Read(byte[] buffer, int offset, int count)` | | +| `Seek` | `override long Seek(long offset, SeekOrigin origin)` | | +| `SetLength` | `override void SetLength(long value)` | A partition cannot grow from inside: asking for more than its length fails, and asking for less leaves the trailing bytes where they are, as unused space inside the partition. | +| `Write` | `override void Write(ReadOnlySpan buffer)` | | +| `Write` | `override void Write(byte[] buffer, int offset, int count)` | | + +#### `SunVtocParser` + +Parses the Sun disk label (SunOS / Solaris SPARC "VTOC" label) in sector 0. Big-endian. + +| Member | Signature | Summary | +| --- | --- | --- | +| `IsSunLabel` | `static bool IsSunLabel(ReadOnlySpan sector0)` | Reports whether `sector0` is a Sun label with a valid checksum. | +| `Parse` | `static List Parse(ReadOnlySpan sector0)` | Parses the label's slices, excluding the whole-disk slice and empty slots. | + ### Namespace `Compression.Core.DiskImage.Raid` [`ImsmContainer`](#imsmcontainer) · [`ImsmDisk`](#imsmdisk) · [`ImsmMetadataParser`](#imsmmetadataparser) · [`ImsmVolume`](#imsmvolume) · [`Md09SuperblockParser`](#md09superblockparser) · [`Md1SuperblockParser`](#md1superblockparser) · [`RaidArray`](#raidarray) · [`RaidAssembledStream`](#raidassembledstream) · [`RaidAssembler`](#raidassembler) · [`RaidLevel`](#raidlevel) · [`RaidMember`](#raidmember) · [`RaidMemberMetadata`](#raidmembermetadata) · [`RaidMetadataFormat`](#raidmetadataformat) diff --git a/Compression.Lib/FileFormats/FileFormat.PartitionedDisk/PartitionedDiskFormatDescriptor.cs b/Compression.Lib/FileFormats/FileFormat.PartitionedDisk/PartitionedDiskFormatDescriptor.cs index d0d66502b..03d905c3a 100644 --- a/Compression.Lib/FileFormats/FileFormat.PartitionedDisk/PartitionedDiskFormatDescriptor.cs +++ b/Compression.Lib/FileFormats/FileFormat.PartitionedDisk/PartitionedDiskFormatDescriptor.cs @@ -1,4 +1,5 @@ #pragma warning disable CS1591 +using System.Text.RegularExpressions; using Compression.Core.DiskImage; using Compression.Registry; @@ -15,15 +16,25 @@ namespace FileFormat.PartitionedDisk; /// /// There is no signature to register. The format is claimed by /// FormatDetector's disk-image probe only after the table has been validated: a GPT header -/// whose CRC32 matches, a legacy MBR whose four entries all carry a legal boot indicator and -/// describe non-overlapping ranges that start inside the image, or an Apple Partition Map. No -/// extension is claimed either: .img, .raw, .dd and .bin are just -/// as often a bare filesystem or something else entirely, and it is the content that decides. +/// whose CRC32 matches (at 512- or 4096-byte logical blocks), a legacy MBR whose four entries all +/// carry a legal boot indicator and describe non-overlapping ranges that start inside the image, +/// an Apple Partition Map, or a checksummed SGI volume header, Sun label, stand-alone BSD +/// disklabel or Amiga Rigid Disk Block. No extension is claimed either: .img, +/// .raw, .dd and .bin are just as often a bare filesystem or something else +/// entirely, and it is the content that decides. /// /// /// Partitions are read through a window over the image, never copied out, so browsing a /// multi-gigabyte disk touches only the sectors each filesystem reader asks for. /// +/// +/// Editing goes through two paths. A file inside a partition is added or removed by that +/// partition's own filesystem editor, working in place on a staged window over the partition — +/// refused when the filesystem has no lossless in-place editor, and committed only when the whole +/// edit succeeds. Whole partitions are added (a root-level filesystem or *.raw image) and +/// deleted (PartitionN_Type) on GPT and MBR tables. lays partition +/// images out on a fresh GPT or MBR disk. +/// /// References: /// /// UEFI Specification 2.10, §5.2 (legacy MBR) and §5.3 (GUID Partition Table) @@ -31,7 +42,8 @@ namespace FileFormat.PartitionedDisk; /// https://en.wikipedia.org/wiki/Disk_image — overview /// /// -public sealed class PartitionedDiskFormatDescriptor : IFormatDescriptor, IArchiveFormatOperations { +public sealed class PartitionedDiskFormatDescriptor : IFormatDescriptor, IArchiveFormatOperations, IArchiveModifiable, IArchiveCreatable, + IArchiveWriteConstraints { /// Gets the id. public string Id => "PartitionedDisk"; /// Gets the display name. @@ -41,7 +53,8 @@ public sealed class PartitionedDiskFormatDescriptor : IFormatDescriptor, IArchiv /// Gets the capabilities. public FormatCapabilities Capabilities => FormatCapabilities.CanList | FormatCapabilities.CanExtract | FormatCapabilities.CanTest | - FormatCapabilities.SupportsMultipleEntries; + FormatCapabilities.CanCreate | FormatCapabilities.CanModify | + FormatCapabilities.SupportsMultipleEntries | FormatCapabilities.SupportsDirectories; /// Gets the default extension. public string DefaultExtension => ".img"; /// Gets the extensions — none: generic disk-image extensions are settled by content. @@ -58,7 +71,7 @@ public sealed class PartitionedDiskFormatDescriptor : IFormatDescriptor, IArchiv public AlgorithmFamily Family => AlgorithmFamily.Archive; /// Gets the description. public string Description => - "Raw whole-disk image (MBR, GPT or APM); each partition browses as the filesystem inside it."; + "Raw whole-disk image (GPT, MBR, APM, BSD, Amiga RDB, Sun, SGI); each partition browses as the filesystem inside it."; private const string WholeDiskEntry = "disk.raw"; @@ -94,36 +107,208 @@ public void Extract(Stream stream, string outputDir, string? password, string[]? /// /// Opens an entry without extracting the partition around it: a PartitionN_Type.raw /// entry is a read-only window over the partition's sectors, and a file inside a recognised - /// filesystem is opened by that filesystem's reader over the same window. + /// filesystem is opened by that filesystem's reader over the same window — for a BSD slice, + /// the window over the slice. /// public Stream OpenEntry(Stream archive, string entryName, string? password) { ArgumentNullException.ThrowIfNull(archive); ArgumentException.ThrowIfNullOrWhiteSpace(entryName); - var name = entryName.Replace('\\', '/'); - var table = PartitionTableDetector.Detect(archive); - foreach (var part in table.Partitions) { - var prefix = PartitionedDiskLister.MakePartitionPrefix(part); - - if (name.Equals(prefix + ".raw", StringComparison.Ordinal)) - return new ReadOnlyWindow(new PartitionWindowStream(archive, part.StartOffset, ClampedSize(archive, part))); - - if (!name.StartsWith(prefix + "/", StringComparison.Ordinal)) - continue; - - var window = new PartitionWindowStream(archive, part.StartOffset, ClampedSize(archive, part)); - if (BsdDisklabelParser.IsDisklabel(window)) - break; // slices nest one level deeper; the lister's own layout handles them + var targets = PartitionedDiskLister.EnumerateTargets(archive, PartitionTableDetector.Detect(archive)); + if (PartitionedDiskLister.Resolve(targets, entryName, out var innerPath) is { } target) { + var window = new PartitionWindowStream(archive, target.Offset, target.Size); + if (innerPath.Length == 0) + return new ReadOnlyWindow(window); if (InnerFsDetector.Detect(window) is IArchiveFormatOperations inner) { window.Position = 0; - return inner.OpenEntry(window, name[(prefix.Length + 1)..], password); + return inner.OpenEntry(window, innerPath, password); } } - // BSD slices, and anything else the lister nests deeper, take the extracting default. return ((IArchiveFormatOperations)new ExtractingView(this)).OpenEntry(archive, entryName, password); } + // ── IArchiveModifiable ───────────────────────────────────────────── + + /// + /// Adds files inside partitions (PartitionN_Type/path) through each partition + /// filesystem's own in-place editor, and root-level filesystem or *.raw images as new + /// partitions. Refusals leave the disk byte-identical: see + /// . + /// + /// The edit was refused; nothing was written. + public void Add(Stream archive, IReadOnlyList inputs) { + ArgumentNullException.ThrowIfNull(archive); + ArgumentNullException.ThrowIfNull(inputs); + if (!PartitionedDiskLister.TryAdd(archive, inputs)) + throw new InvalidOperationException("The image carries no partition table that can be edited."); + } + + /// + /// Removes files inside partitions through each partition filesystem's own in-place editor, + /// and deletes whole partitions (PartitionN_Type) from GPT and MBR tables. Refusals + /// leave the disk byte-identical: see . + /// + /// The edit was refused; nothing was written. + /// A name addresses nothing on the disk; nothing was written. + public void Remove(Stream archive, string[] entryNames) { + ArgumentNullException.ThrowIfNull(archive); + if (!PartitionedDiskLister.TryRemove(archive, entryNames ?? [])) + throw new InvalidOperationException("The image carries no partition table that can be edited."); + } + + /// + /// Not offered: emptying a whole disk would mean deleting every partition, which is a + /// partition-table decision, not a maintenance verb — each volume is maintained on its own. + /// + public bool CanPurgeToEmpty => false; + + // ── IArchiveWriteConstraints ─────────────────────────────────────── + + /// + /// Inside a partition (PartitionN_Type/…) any file goes to that partition's filesystem, + /// which has the last word. At the disk root only partition images belong: a filesystem image, + /// or a raw image named *.raw/*.img/PartitionN_…. + /// + public bool CanAccept(ArchiveInputInfo input, out string? reason) { + ArgumentNullException.ThrowIfNull(input); + reason = null; + var name = input.ArchiveName.Replace('\\', '/').Trim('/'); + if (input.IsDirectory || name.Contains('/') || IsNamedPartitionImage(name)) return true; + try { + using var content = OpenInput(input); + if (DetectPartitionType(content) is not null) return true; + } catch (Exception ex) when (ex is IOException or UnauthorizedAccessException) { + // unreadable: refuse below + } + reason = $"'{name}' is not a partition image; open a partition's folder to add files to its filesystem."; + return false; + } + + /// No ceiling of its own: each partition's filesystem bounds what it holds. + public long? MaxTotalArchiveSize => null; + + /// Summary for drop tooltips. + public string AcceptedInputsDescription => + "inside a partition folder: files for its filesystem; at the disk root: filesystem or *.raw/*.img partition images"; + + private static bool IsNamedPartitionImage(string name) { + var leaf = Path.GetFileName(name); + return leaf.EndsWith(".raw", StringComparison.OrdinalIgnoreCase) + || leaf.EndsWith(".img", StringComparison.OrdinalIgnoreCase) + || PartitionName.IsMatch(leaf); + } + + // ── IArchiveCreatable ────────────────────────────────────────────── + + private static readonly Regex PartitionName = new(@"^Partition(\d+)_", RegexOptions.CultureInvariant); + + /// + /// Writes a fresh disk holding one partition per input image. An input must be a filesystem + /// image (recognised by content) or be named as a raw partition image (*.raw, + /// *.img, or PartitionN_… as this format lists them); a loose file is refused. + /// + /// + /// + /// Layout: the first partition starts at 1 MiB and each further one at the next 1 MiB + /// boundary — the alignment sgdisk, parted and Windows use — sized to its image + /// rounded up to whole sectors. Inputs named PartitionN_… are placed in N order, + /// others in the order given. The partition type follows the image's filesystem. + /// + /// + /// Options (): scheme = gpt + /// (default, up to 128 partitions, named after the input) or mbr (up to 4 primaries, + /// below 2^32 sectors); sectorSize = 512 (default) or 4096 for a 4Kn disk. + /// + /// + /// No inputs, a loose file, or an unknown option value. + public void Create(Stream output, IReadOnlyList inputs, FormatCreateOptions options) { + ArgumentNullException.ThrowIfNull(output); + ArgumentNullException.ThrowIfNull(inputs); + options ??= new FormatCreateOptions(); + + var scheme = (options.GetString("scheme") ?? "gpt").ToLowerInvariant() switch { + "gpt" => PartitionScheme.Gpt, + "mbr" or "dos" or "msdos" => PartitionScheme.Mbr, + var other => throw new ArgumentException($"Unknown partition scheme '{other}'; use gpt or mbr.", nameof(options)), + }; + var sectorSize = int.TryParse(options.GetString("sectorSize") ?? "512", out var ss) ? ss : 0; + if (!PartitionEditor.SupportedSectorSizes.Contains(sectorSize)) + throw new ArgumentException("sectorSize must be 512 or 4096.", nameof(options)); + + var images = inputs.Where(i => !i.IsDirectory && !string.IsNullOrEmpty(i.ArchiveName)).ToList(); + if (images.Count == 0) + throw new ArgumentException("A partitioned disk needs at least one partition image.", nameof(inputs)); + if (images.All(i => PartitionName.IsMatch(Path.GetFileName(i.ArchiveName)))) + images = [.. images.OrderBy(i => int.Parse(PartitionName.Match(Path.GetFileName(i.ArchiveName)).Groups[1].Value, + System.Globalization.CultureInfo.InvariantCulture))]; + + var capacity = scheme == PartitionScheme.Gpt ? 128 : 4; + if (images.Count > capacity) + throw new ArgumentException($"A {scheme} table holds at most {capacity} partitions; {images.Count} images were given.", nameof(inputs)); + + // Plan the layout before writing anything. + const long alignment = 1024 * 1024; + var layout = new List<(ArchiveInputInfo Input, long Start, long Length, PartitionType Type)>(); + var cursor = alignment; + foreach (var image in images) { + using var content = OpenInput(image); + var type = DetectPartitionType(content); + if (type is null && !IsNamedPartitionImage(image.ArchiveName)) + throw new ArgumentException( + $"'{image.ArchiveName}' is neither a filesystem image nor a raw partition image (*.raw/*.img); a disk holds partitions, not loose files.", + nameof(inputs)); + if (content.Length == 0) + throw new ArgumentException($"'{image.ArchiveName}' is empty; a partition needs at least one sector.", nameof(inputs)); + var length = (content.Length + sectorSize - 1) / sectorSize * sectorSize; + layout.Add((image, cursor, length, type ?? PartitionType.Linux)); + cursor = (cursor + length + alignment - 1) / alignment * alignment; + } + + var lastEnd = layout[^1].Start + layout[^1].Length; + var trailer = scheme == PartitionScheme.Gpt ? (16384L + sectorSize - 1) / sectorSize * sectorSize + sectorSize : 0; + var diskLength = (lastEnd + trailer + sectorSize - 1) / sectorSize * sectorSize; + if (scheme == PartitionScheme.Mbr && diskLength / sectorSize > uint.MaxValue) + throw new ArgumentException("The images need more than 2^32 sectors, which an MBR cannot address; use scheme=gpt.", nameof(options)); + + output.SetLength(0); + output.SetLength(diskLength); + var editor = PartitionEditor.CreateEmpty(output, scheme, sectorSize); + foreach (var (input, start, length, type) in layout) { + using (var content = OpenInput(input)) { + output.Position = start; + content.CopyTo(output); + } + editor.AddPartition(start, length, type, scheme == PartitionScheme.Gpt ? GptLabel(input.ArchiveName) : null); + } + output.Flush(); + } + + /// A GPT name from the input's file name: without extension and PartitionN_ prefix, at most 36 UTF-16 units. + private static string GptLabel(string archiveName) { + var stem = Path.GetFileNameWithoutExtension(archiveName.Replace('\\', '/')); + stem = PartitionName.Replace(stem, ""); + return stem.Length > 36 ? stem[..36] : stem; + } + + private static Stream OpenInput(ArchiveInputInfo input) + => input.InMemoryContent is { } bytes + ? new MemoryStream(bytes, writable: false) + : new FileStream(input.FullPath, FileMode.Open, FileAccess.Read, FileShare.Read); + + /// The partition type an image's filesystem calls for, or null when no filesystem is recognised. + private static PartitionType? DetectPartitionType(Stream image) { + if (image.Length < 512) return null; + return InnerFsDetector.Detect(image)?.Id switch { + null => null, + "Fat" => PartitionType.Fat32Lba, + "ExFat" or "Ntfs" or "Hpfs" => PartitionType.NtfsExfat, + "HfsPlus" or "Hfs" => PartitionType.AppleHfsPlus, + "Apfs" => PartitionType.AppleApfs, + _ => PartitionType.Linux, + }; + } + /// Exposes List/Extract without the OpenEntry override, to reach the interface default. private sealed class ExtractingView(PartitionedDiskFormatDescriptor owner) : IArchiveFormatOperations { public List List(Stream stream, string? password) => owner.List(stream, password); @@ -131,9 +316,6 @@ public void Extract(Stream stream, string outputDir, string? password, string[]? => owner.Extract(stream, outputDir, password, files); } - private static long ClampedSize(Stream disk, PartitionEntry part) - => Math.Max(0, Math.Min(part.Size, disk.Length - part.StartOffset)); - /// Read-only view of a partition window: browsing must never write to the disk. private sealed class ReadOnlyWindow(Stream inner) : Stream { public override bool CanRead => inner.CanRead; diff --git a/Compression.Lib/FormatDetector.DiskImage.cs b/Compression.Lib/FormatDetector.DiskImage.cs index ab71f72b6..c5774e52f 100644 --- a/Compression.Lib/FormatDetector.DiskImage.cs +++ b/Compression.Lib/FormatDetector.DiskImage.cs @@ -64,12 +64,15 @@ private static IFormatDescriptor[] FilesystemDescriptors { /// virtual-disk containers, compressed streams, filesystems that start at byte 0; /// ISO 9660 / UDF volume descriptors at 32 KiB — ahead of any partition /// table, so a hybrid ISO whose system area carries an MBR or GPT browses as the ISO; - /// a GPT header whose CRC32 matches → ; + /// a GPT header whose CRC32 matches, at 512- or 4096-byte logical blocks → + /// ; /// sector 0 ending in 0x55AA: a validated MBR table versus a volume boot record /// (FAT BPB, NTFS/exFAT/… OEM signature). A valid table with no boot record is the disk; a boot /// record with no valid table is the filesystem; when both parse, the disk wins only if one of /// its partitions holds a recognisable filesystem; /// an Apple Partition Map → ; + /// a checksummed SGI volume header or Sun label, a stand-alone BSD disklabel (both magics) or a checksummed + /// Amiga Rigid Disk Block → ; /// when is set, a filesystem superblock /// signature (≥ 0.75 confidence) anywhere up to the deepest registered one (ZFS at 128 KiB). /// @@ -105,6 +108,8 @@ internal static Format DetectDiskImageByContent(Stream stream, bool includeSuper if (ApmParser.IsApm(head)) return Format.PartitionedDisk; + if (PartitionTableDetector.HasSelfValidatingLabel(stream)) return Format.PartitionedDisk; + if (!includeSuperblocks) return Format.Unknown; var deep = (int)Math.Min(FormatDetector._maxFilesystemMagicExtent, length); diff --git a/Compression.Lib/FormatDetector.cs b/Compression.Lib/FormatDetector.cs index 25df6b418..849934333 100644 --- a/Compression.Lib/FormatDetector.cs +++ b/Compression.Lib/FormatDetector.cs @@ -152,7 +152,7 @@ private static Format DetectByMagicFromFile(string path) { } /// Get the descriptor for a format, or null if no descriptor exists (Sfx, Iso, Udf). - private static IFormatDescriptor? GetDesc(Format f) { + internal static IFormatDescriptor? GetDesc(Format f) { EnsureRegistryMapped(); return FormatDetector._formatToDesc!.GetValueOrDefault(f); } diff --git a/Compression.Lib/NestedStreamResolver.cs b/Compression.Lib/NestedStreamResolver.cs index bafaf9f4f..bf6183c91 100644 --- a/Compression.Lib/NestedStreamResolver.cs +++ b/Compression.Lib/NestedStreamResolver.cs @@ -115,6 +115,10 @@ public void DisposeAll() { var desc = DetectFormat(current); if (desc == null) return null; + // A raw whole-disk image: the filesystems are inside its partitions, not at byte 0. + if (desc.Id == PartitionedDiskId) + return TryDescendPartitions(current, ownership, pathSegments, depth + 1); + // If it's a disk image container, try to open the virtual disk stream if (DiskImageFormatIds.Contains(desc.Id)) { var virtualStream = TryOpenVirtualDisk(current, desc.Id); @@ -155,13 +159,14 @@ public void DisposeAll() { if (detection.Scheme == "None" || detection.Partitions.Count == 0) return null; - // Try each partition, preferring the first that yields a writable FS - foreach (var part in detection.Partitions) { - if (part.Size <= 0 || part.StartOffset < 0 || part.StartOffset >= diskStream.Length) + // Try each partition — a BSD slice container contributes its slices — preferring the first + // that yields a writable FS. + foreach (var target in PartitionedDiskLister.EnumerateTargets(diskStream, detection)) { + var part = target.Partition; + if (target.Size <= 0 || target.Offset < 0 || target.Offset >= diskStream.Length) continue; - var actualSize = Math.Min(part.Size, diskStream.Length - part.StartOffset); - var partStream = new WritableSubStream(diskStream, part.StartOffset, actualSize); + var partStream = new WritableSubStream(diskStream, target.Offset, target.Size); // Don't add to ownership — it doesn't own the underlying stream var partSegments = new List(pathSegments) { @@ -175,48 +180,41 @@ public void DisposeAll() { return null; } + private const string PartitionedDiskId = "PartitionedDisk"; + + /// + /// Identifies the stream: a fixed VHD by its footer first (its first bytes are the guest + /// disk's own), then by content — the disk-image probe that recognises a raw partitioned + /// disk, and signatures as deep as the deepest registered one (superblocks at 32/64/128 KiB + /// included) rather than a fixed 4 KiB — then the FAT boot-sector heuristic. + /// private static IFormatDescriptor? DetectFormat(Stream stream) { if (stream.Length < 4) return null; var savedPos = stream.Position; try { - stream.Position = 0; - var headerSize = (int)Math.Min(4096, stream.Length); - var header = new byte[headerSize]; - var bytesRead = 0; - while (bytesRead < headerSize) { - var n = stream.Read(header, bytesRead, headerSize - bytesRead); - if (n == 0) break; - bytesRead += n; - } - - var headerSpan = header.AsSpan(0, bytesRead); - IFormatDescriptor? best = null; - var bestConfidence = 0.0; - - foreach (var desc in FormatRegistry.All) { - foreach (var sig in desc.MagicSignatures) { - if (MatchesMagic(headerSpan, sig) && sig.Confidence > bestConfidence) { - bestConfidence = sig.Confidence; - best = desc; - } - } - } - - if (best != null) return best; - // Heuristic: VHD fixed-disk detection — the "conectix" footer is at the // END of the file (offset = length - 512), not at offset 0. The registry // magic signature only checks offset 0 (which works for dynamic VHD). if (stream.Length >= 512 && stream.CanSeek) { stream.Position = stream.Length - 512; Span footer = stackalloc byte[8]; - if (stream.Read(footer) == 8 && "conectix"u8.SequenceEqual(footer)) { + if (stream.ReadAtLeast(footer, 8, throwOnEndOfStream: false) == 8 && "conectix"u8.SequenceEqual(footer)) { var vhdDesc = FormatRegistry.GetById("Vhd"); if (vhdDesc != null) return vhdDesc; } } + var format = FormatDetector.DetectByContent(stream); + if (format != FormatDetector.Format.Unknown && FormatDetector.GetDesc(format) is { } byContent) + return byContent; + + stream.Position = 0; + var headerSize = (int)Math.Min(4096, stream.Length); + var header = new byte[headerSize]; + var bytesRead = stream.ReadAtLeast(header, headerSize, throwOnEndOfStream: false); + var headerSpan = header.AsSpan(0, bytesRead); + // Heuristic: FAT detection (no magic, BPB-based) if (bytesRead >= 64 && headerSpan[0] is 0xEB or 0xE9) { var bytesPerSector = (int)(headerSpan[11] | (headerSpan[12] << 8)); @@ -234,18 +232,6 @@ public void DisposeAll() { } } - private static bool MatchesMagic(ReadOnlySpan header, MagicSignature sig) { - if (header.Length < sig.Offset + sig.Bytes.Length) return false; - var slice = header.Slice(sig.Offset, sig.Bytes.Length); - if (sig.Mask != null) { - for (var i = 0; i < sig.Bytes.Length; i++) - if ((slice[i] & sig.Mask[i]) != (sig.Bytes[i] & sig.Mask[i])) - return false; - return true; - } - return slice.SequenceEqual(sig.Bytes); - } - /// + /// Logical sector size the table counts in: 512, or 4096 on a 4Kn GPT disk. public sealed record PartitionListResult( PartitionScheme Scheme, - IReadOnlyList Partitions); + IReadOnlyList Partitions, + int SectorSize = PartitionEditor.SectorSize); /// /// Lists all partitions in the given image. @@ -60,7 +62,22 @@ public static PartitionListResult List(string imagePath) { .Select(p => new PartitionInfo(p.Index, p.Source, p.StartOffset, p.Size, p.TypeCode, p.TypeName, p.Name, p.IsActive)) .ToList() .AsReadOnly(); - return new PartitionListResult(editor.Scheme, snapshot); + return new PartitionListResult(editor.Scheme, snapshot, editor.LogicalSectorSize); + } + + /// + /// with the range given in the disk's own logical sectors — 512 bytes, or + /// 4096 on a 4Kn GPT disk — as fdisk/sgdisk count them. + /// + /// The logical sector size the LBAs were counted in. + public static int AddBySectors( + string imagePath, long startLba, long lengthSectors, + PartitionType type, string? label = null) { + ArgumentOutOfRangeException.ThrowIfNegative(startLba); + ArgumentOutOfRangeException.ThrowIfNegativeOrZero(lengthSectors); + var sectorSize = List(imagePath).SectorSize; + Add(imagePath, checked(startLba * sectorSize), checked(lengthSectors * sectorSize), type, label); + return sectorSize; } /// diff --git a/Compression.NativeUI/Views/PartitionDialogs.cs b/Compression.NativeUI/Views/PartitionDialogs.cs index 5622e1bc0..254f9a8ba 100644 --- a/Compression.NativeUI/Views/PartitionDialogs.cs +++ b/Compression.NativeUI/Views/PartitionDialogs.cs @@ -14,6 +14,7 @@ internal sealed class AddPartitionDialog : Form { private const int LabelWidth = 120; private readonly long _diskBytes; + private readonly int _sectorSize; private readonly Label _heading = new(); private readonly TextBox _startLba = new(); private readonly TextBox _lengthSectors = new(); @@ -24,8 +25,9 @@ internal sealed class AddPartitionDialog : Form { private readonly Button _cancel = new() { Text = "Cancel", DialogResult = DialogResult.Cancel }; private readonly ToolTip _toolTips = new(); - public AddPartitionDialog(long diskBytes, bool isLogical) { + public AddPartitionDialog(long diskBytes, bool isLogical, int sectorSize = PartitionEditor.SectorSize) { this._diskBytes = diskBytes; + this._sectorSize = sectorSize; this.Text = "Add Partition"; this.ClientSize = new(460, 340); @@ -46,18 +48,18 @@ public AddPartitionDialog(long diskBytes, bool isLogical) { } this._type.SelectedItem = PartitionType.Linux; - // Start at sector 2048 (one mebibyte in), leaving room for the MBR, and suggest either the + // Start one mebibyte in (sector 2048, or 256 on a 4Kn disk), leaving room for the table, and suggest either the // first 64 MiB or whatever is left if the disk is smaller. - const int DefaultStartLba = 2048; - var totalLba = Math.Max(0, diskBytes / PartitionEditor.SectorSize); - var suggestedLength = Math.Max(1, Math.Min(64L * 1024 * 1024 / PartitionEditor.SectorSize, Math.Max(1, totalLba - DefaultStartLba))); + var defaultStartLba = 1024 * 1024 / sectorSize; + var totalLba = Math.Max(0, diskBytes / sectorSize); + var suggestedLength = Math.Max(1, Math.Min(64L * 1024 * 1024 / sectorSize, Math.Max(1, totalLba - defaultStartLba))); - this._startLba.Text = DefaultStartLba.ToString(); + this._startLba.Text = defaultStartLba.ToString(); this._lengthSectors.Text = suggestedLength.ToString(); - this._hint.Text = $"Disk size: {diskBytes:N0} bytes ({totalLba:N0} sectors of 512 B)."; + this._hint.Text = $"Disk size: {diskBytes:N0} bytes ({totalLba:N0} sectors of {sectorSize} B)."; - this._toolTips.SetToolTip(this._startLba, "Sector index from the start of the disk. Each sector is 512 bytes."); - this._toolTips.SetToolTip(this._lengthSectors, "Number of 512-byte sectors. Multiply by 512 to get bytes."); + this._toolTips.SetToolTip(this._startLba, $"Sector index from the start of the disk. Each sector is {sectorSize} bytes."); + this._toolTips.SetToolTip(this._lengthSectors, $"Number of {sectorSize}-byte sectors. Multiply by {sectorSize} to get bytes."); this._ok.Click += (_, _) => this.OnOk(); this._cancel.Click += (_, _) => this.Close(); @@ -110,8 +112,8 @@ private void OnOk() { return; } - var startBytes = startLba * PartitionEditor.SectorSize; - var lengthBytes = lengthLba * PartitionEditor.SectorSize; + var startBytes = startLba * this._sectorSize; + var lengthBytes = lengthLba * this._sectorSize; if (startBytes + lengthBytes > this._diskBytes) { MessageBox.Show(this, $"Partition end ({startBytes + lengthBytes:N0}) exceeds disk size ({this._diskBytes:N0}).", diff --git a/Compression.NativeUI/Views/PartitionsWindow.cs b/Compression.NativeUI/Views/PartitionsWindow.cs index 5005e789f..6f484e4c4 100644 --- a/Compression.NativeUI/Views/PartitionsWindow.cs +++ b/Compression.NativeUI/Views/PartitionsWindow.cs @@ -310,7 +310,7 @@ private void UpdateSelectionActions() { private void OnAdd(bool isLogical) { if (this._editor is not { } editor || this._guestStream is not { } guest) return; - var dialog = new AddPartitionDialog(guest.Length, isLogical); + var dialog = new AddPartitionDialog(guest.Length, isLogical, editor.LogicalSectorSize); if (dialog.ShowDialog(this) != DialogResult.OK) return; try { diff --git a/Compression.Tests/Cli/PartitionCliTests.cs b/Compression.Tests/Cli/PartitionCliTests.cs index d22ce552d..b06478637 100644 --- a/Compression.Tests/Cli/PartitionCliTests.cs +++ b/Compression.Tests/Cli/PartitionCliTests.cs @@ -267,4 +267,61 @@ public void Verify_OnBlankImage_ReportsNoScheme() { if (File.Exists(path)) File.Delete(path); } } + + // ── Logical sector size ───────────────────────────────────────────── + + private static string CreateEmptyGpt(int sectorSize, int sectors) { + var path = Path.Combine(Path.GetTempPath(), $"cwb-partcli-{Guid.NewGuid():N}.partcli-test"); + using (var fs = new FileStream(path, FileMode.CreateNew, FileAccess.ReadWrite)) { + fs.SetLength((long)sectorSize * sectors); + PartitionEditor.CreateEmpty(fs, PartitionScheme.Gpt, sectorSize); + } + return path; + } + + [TestCase(512, 2048L)] + [TestCase(4096, 256L)] + [Category("HappyPath")] + public void Given_GptDisk_When_AddedBySectors_Then_LbasCountInTheDisksOwnSectorSize(int sectorSize, long startLba) { + var path = CreateEmptyGpt(sectorSize, 4096); + try { + var used = PartitionOperations.AddBySectors(path, startLba, 1024, PartitionType.Linux, "data"); + + var result = PartitionOperations.List(path); + Assert.That(used, Is.EqualTo(sectorSize)); + Assert.That(result.SectorSize, Is.EqualTo(sectorSize)); + Assert.That(result.Partitions.Single().StartOffset, Is.EqualTo(startLba * sectorSize)); + Assert.That(result.Partitions.Single().Size, Is.EqualTo(1024L * sectorSize)); + } finally { + if (File.Exists(path)) File.Delete(path); + } + } + + [Test, Category("Boundary")] + public void Given_4KnGpt_When_AddedPastTheLastUsableSector_Then_RefusedAndTableUnchanged() { + var path = CreateEmptyGpt(4096, 1024); + try { + var before = File.ReadAllBytes(path); + // 1024 blocks: LastUsableLBA is 1024 - 4 entry blocks - 1 header - 1 = 1018. + Assert.That(() => PartitionOperations.AddBySectors(path, 256, 1018 - 256 + 2, PartitionType.Linux), + Throws.InvalidOperationException); + Assert.That(File.ReadAllBytes(path), Is.EqualTo(before)); + Assert.That(() => PartitionOperations.AddBySectors(path, 256, 1018 - 256 + 1, PartitionType.Linux), Throws.Nothing); + } finally { + if (File.Exists(path)) File.Delete(path); + } + } + + [TestCase(-1L, 8L)] + [TestCase(256L, 0L)] + [Category("ErrorPath")] + public void Given_NegativeStartOrEmptyLength_When_AddedBySectors_Then_Refused(long startLba, long length) { + var path = CreateEmptyGpt(4096, 1024); + try { + Assert.That(() => PartitionOperations.AddBySectors(path, startLba, length, PartitionType.Linux), + Throws.InstanceOf()); + } finally { + if (File.Exists(path)) File.Delete(path); + } + } } From dfd763c9d37fdde7b1598aab108fcfc931e19f88 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 26 Oct 2026 12:07:04 +0000 Subject: [PATCH 23/48] * refresh the application screenshot --- screenshots/main-window.png | Bin 65657 -> 66093 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/screenshots/main-window.png b/screenshots/main-window.png index e3795c0d04a8041389e0aaa3edc8cc5c89e36820..bf88801e9a99bf1f40e4ecad6833433b3753c894 100644 GIT binary patch literal 66093 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 literal 65657 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

J-t(C?D*vNbSd$Mpldw%6G^3`$t6)P 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 O*JNyHeySLKDeAvN*8HCU From c6d48b5733a749ea6a401af0d4b881d27b6c0a69 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 26 Oct 2026 12:07:21 +0000 Subject: [PATCH 24/48] * refresh the archive browser screenshot --- docs/screenshots/archive-browser.png | Bin 66518 -> 65657 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/screenshots/archive-browser.png b/docs/screenshots/archive-browser.png index de88d7dd43f38a733fe5557dd0e66b254aa140ee..e3795c0d04a8041389e0aaa3edc8cc5c89e36820 100644 GIT binary patch literal 65657 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

J-t(C?D*vNbSd$Mpldw%6G^3`$t6)P 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 O*JNyHeySLKDeAvN*8HCU literal 66518 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 Kj%4xcAO8X%gq{lk From 1ab5fe62eb4155d15b83ceb5150c9161790835bc Mon Sep 17 00:00:00 2001 From: Hawkynt Date: Mon, 26 Oct 2026 13:07:39 +0100 Subject: [PATCH 25/48] * CVF codecs: clean-room DS/JM/SQ reimplementation, SD-4 encoder with back-references * CvfLzCodec (DS-0-x, JM-0-x, SQ-0-0 and the Stacker dispatch) is replaced by an independent implementation (MsdblLzCodec + ClusterMatchFinder) written from docs/CVF-CODECS-ON-DISK.md and the dmsdos reference vectors. Public API unchanged; CvfLzMethod moves to its own file. Clean-room reimplementation from docs/CVF-CODECS-ON-DISK.md; the implementer did not read the previous code or dmsdos sources (rung 3/4 spec + black-box oracle). * The DS/JM encoder now writes a sync after every 512 decoded bytes and never lets a match cross a 512-byte boundary - measured in all 16 dmsdos DS/JM reference streams and recorded in the spec. A sync followed only by zero padding ends a short cluster (tail reads zero). * Auto in the codec keeps the smaller of DS and JM; GenuineDvr3Writer's Auto also tries SQ. + Sd4Codec rewritten from the spec: the encoder emits short/long matches with every length extension and run-coded code-length tables, codes built by package-merge (optimal, complete, 15-bit limit). Within 10% of the dmsdos SD-4 encoder on the five reference samples; dmsdos reads our SD-4 volumes (and 15-bit-deep main codes) byte-exact. + BB_StackerSd4 building block. # Stacker: a compressed run that needs every sector of its cluster reads as stored (AMAP has no flag for it), so ForceCompress wrote clusters dmsdos and our reader returned verbatim. Such a cluster is now stored raw; verified by dmsdos and our reader. + DmsdosOracle: the dmsdos gates run through WSL on Windows as well as natively on Linux; the existing Stacker/DriveSpace 3/DoubleSpace driver-proof tests use it. + Boundary tests for every CVF codec: empty/1-byte clusters, 512/8K/32K clusters, incompressible data, maximum match lengths and distances, malformed streams. ! Fragmented DriveSpace 3 clusters and fragmented/suballocated Stacker clusters are still refused; they follow in a separate change. --- .../StackerSd4/StackerSd4BuildingBlock.cs | 39 ++ .../FileSystems/Cvf/ClusterMatchFinder.cs | 81 +++ .../FileSystems/Cvf/CvfLzCodec.cs | 387 +++-------- .../FileSystems/Cvf/CvfLzMethod.cs | 23 + .../FileSystems/Cvf/MsdblLzCodec.cs | 268 ++++++++ .../FileSystems/Cvf/PackageMerge.cs | 65 ++ Compression.Core/FileSystems/Cvf/Sd4Codec.cs | 599 ++++++++++-------- Compression.Core/REFERENCE.md | 54 +- .../Cvf/CvfCodecBoundaryTests.cs | 188 ++++++ .../DoubleSpace/DoubleSpaceHugeVolumeTests.cs | 8 +- .../DriveSpace3GenuineDmsdosTests.cs | 9 +- .../DriveSpace3GenuineMaintenanceTests.cs | 8 +- .../DriveSpace3/DriveSpace3HugeVolumeTests.cs | 8 +- Compression.Tests/ExternalFsInteropTests.cs | 9 +- .../Stacker/GenuineStackerCodecOracleTests.cs | 187 ++++++ .../Stacker/GenuineStackerDmsdosTests.cs | 9 +- .../Stacker/StackerHugeVolumeTests.cs | 8 +- Compression.Tests/Support/DmsdosOracle.cs | 53 ++ .../GenuineDvr3Writer.cs | 7 +- .../FileSystem.Stacker/FORMAT-NOTES.md | 2 +- .../GenuineStackerWriter.cs | 9 +- .../StackerFormatDescriptor.cs | 3 +- Hawkynt.FileFormats.FileSystems/REFERENCE.md | 2 +- docs/CVF-CODECS-ON-DISK.md | 26 +- 24 files changed, 1452 insertions(+), 600 deletions(-) create mode 100644 Compression.Core/Dictionary/StackerSd4/StackerSd4BuildingBlock.cs create mode 100644 Compression.Core/FileSystems/Cvf/ClusterMatchFinder.cs create mode 100644 Compression.Core/FileSystems/Cvf/CvfLzMethod.cs create mode 100644 Compression.Core/FileSystems/Cvf/MsdblLzCodec.cs create mode 100644 Compression.Core/FileSystems/Cvf/PackageMerge.cs create mode 100644 Compression.Tests/Cvf/CvfCodecBoundaryTests.cs create mode 100644 Compression.Tests/Stacker/GenuineStackerCodecOracleTests.cs create mode 100644 Compression.Tests/Support/DmsdosOracle.cs diff --git a/Compression.Core/Dictionary/StackerSd4/StackerSd4BuildingBlock.cs b/Compression.Core/Dictionary/StackerSd4/StackerSd4BuildingBlock.cs new file mode 100644 index 000000000..7fb8ff544 --- /dev/null +++ b/Compression.Core/Dictionary/StackerSd4/StackerSd4BuildingBlock.cs @@ -0,0 +1,39 @@ +using System.Buffers.Binary; +using Compression.Core.FileSystems.Cvf; +using Compression.Registry; + +namespace Compression.Core.Dictionary.StackerSd4; + +///

+/// Stacker 4's SD-4 codec as a raw primitive: LZ77 over a 2720-byte window, Huffman-coded with a +/// run-length coded code table (docs/CVF-CODECS-ON-DISK.md). The building-block wrapper stores +/// the uncompressed size (32-bit little-endian) before one SD-4 stream covering the whole input. +/// +public sealed class StackerSd4BuildingBlock : IBuildingBlock { + /// + public string Id => "BB_StackerSd4"; + /// + public string DisplayName => "Stacker SD-4"; + /// + public string Description => "Stac Stacker 4 cluster codec: LZ77 (2720-byte window) with canonical Huffman codes and a run-length coded table"; + /// + public AlgorithmFamily Family => AlgorithmFamily.Dictionary; + + /// + public byte[] Compress(ReadOnlySpan data) { + var stream = Sd4Codec.Encode(data, level: 3); + var result = new byte[4 + stream.Length]; + BinaryPrimitives.WriteInt32LittleEndian(result, data.Length); + stream.CopyTo(result, 4); + return result; + } + + /// + public byte[] Decompress(ReadOnlySpan data) { + if (data.Length < 4) throw new InvalidDataException("Stacker SD-4: missing size header."); + var size = BinaryPrimitives.ReadInt32LittleEndian(data); + if (size < 0) throw new InvalidDataException("Stacker SD-4: negative size."); + var stream = data[4..].ToArray(); + return Sd4Codec.Decode(stream, stream.Length, size); + } +} diff --git a/Compression.Core/FileSystems/Cvf/ClusterMatchFinder.cs b/Compression.Core/FileSystems/Cvf/ClusterMatchFinder.cs new file mode 100644 index 000000000..54708d990 --- /dev/null +++ b/Compression.Core/FileSystems/Cvf/ClusterMatchFinder.cs @@ -0,0 +1,81 @@ +namespace Compression.Core.FileSystems.Cvf; + +/// +/// Hash-chain LZ77 match finder over one cluster, shared by the DS/JM and SD-4 encoders. Every match +/// it reports lies wholly inside the cluster: no CVF codec carries a dictionary from one cluster to +/// the next. +/// +internal sealed class ClusterMatchFinder { + private const int HashBits = 13; + private const int MinLength = 3; + + private readonly byte[] _data; + private readonly int[] _head = new int[1 << HashBits]; + private readonly int[] _previous; + private readonly int _maxDistance; + private readonly int _maxLength; + private readonly int _maxChain; + private readonly int _niceLength; + private int _inserted; + + /// The cluster. + /// The farthest distance the format can express. + /// The longest match the format can express. + /// Search effort, 1 (fastest) and up: how many earlier positions with the same + /// hash are tried, and how long a match must be to end the search early. + public ClusterMatchFinder(byte[] data, int maxDistance, int maxLength, int level) { + this._data = data; + this._previous = new int[data.Length]; + this._maxDistance = maxDistance; + this._maxLength = maxLength; + (this._maxChain, this._niceLength) = level switch { + <= 1 => (16, 64), + 2 => (64, 258), + 3 => (256, 1024), + _ => (1024, int.MaxValue), + }; + Array.Fill(this._head, -1); + } + + /// + /// The longest match for the bytes at , preferring the nearest on ties; + /// (0, 0) when there is none of at least three bytes. Positions before + /// are indexed first, so calls must come in ascending order. + /// + /// Where the match starts. + /// Exclusive bound the match may not run past; the cluster end when omitted. + public (int Length, int Distance) Find(int position, int end = int.MaxValue) { + this.IndexUpTo(position); + var data = this._data; + var limit = Math.Min(this._maxLength, Math.Min(data.Length, end) - position); + if (limit < MinLength) return (0, 0); + + int bestLength = 0, bestDistance = 0; + var candidate = this._head[Hash(data, position)]; + for (var chain = this._maxChain; candidate >= 0 && chain > 0; --chain, candidate = this._previous[candidate]) { + var distance = position - candidate; + if (distance > this._maxDistance) break; + if (data[candidate + bestLength] != data[position + bestLength]) continue; + + var length = 0; + while (length < limit && data[candidate + length] == data[position + length]) ++length; + if (length <= bestLength) continue; + + (bestLength, bestDistance) = (length, distance); + if (length == limit || length >= this._niceLength) break; + } + return bestLength >= MinLength ? (bestLength, bestDistance) : (0, 0); + } + + private void IndexUpTo(int position) { + var last = Math.Min(position, this._data.Length - MinLength + 1); + for (; this._inserted < last; ++this._inserted) { + var h = Hash(this._data, this._inserted); + this._previous[this._inserted] = this._head[h]; + this._head[h] = this._inserted; + } + } + + private static int Hash(byte[] data, int position) + => (int)(((uint)data[position] << 16 | (uint)data[position + 1] << 8 | data[position + 2]) * 2654435761u >> (32 - HashBits)); +} diff --git a/Compression.Core/FileSystems/Cvf/CvfLzCodec.cs b/Compression.Core/FileSystems/Cvf/CvfLzCodec.cs index 414453bd2..118ed3a0d 100644 --- a/Compression.Core/FileSystems/Cvf/CvfLzCodec.cs +++ b/Compression.Core/FileSystems/Cvf/CvfLzCodec.cs @@ -1,324 +1,135 @@ -#pragma warning disable CS1591 -using System; -using System.Collections.Generic; -using System.IO; +using System.Buffers.Binary; using Compression.Core.Deflate; -using Compression.Core.Streams; namespace Compression.Core.FileSystems.Cvf; /// -/// Per-cluster compression methods of the DoubleSpace/DriveSpace/Stacker CVF -/// family (see docs/CVF-CODECS-ON-DISK.md). and -/// are the Stacker 3 and Stacker 4 codecs. -/// -public enum CvfLzMethod { Stored, Ds, Jm, Auto, Sq, Sd4, Sd3 } - -/// -/// Genuine DoubleSpace/DriveSpace per-cluster compression codec (DS-0-x and -/// JM-0-x), verified byte-exact against the independent dmsdos decoder. The -/// bitstream packs bits LSB-first into little-endian 16-bit words; a cluster -/// payload is a 16-bit magic ("DS"=0x5344 / "MJ"=0x4D4A) + 16-bit -/// version + an LZ77 token stream terminated by the 0x113f sync. +/// Per-cluster codecs of the DoubleSpace / DriveSpace / DriveSpace 3 / Stacker compressed volumes, +/// implemented from docs/CVF-CODECS-ON-DISK.md. An MSDBL cluster payload starts with a 16-bit +/// magic and a 16-bit version — "DS" (DS-0-x), "JM" (JM-0-x) or "SQ" (SQ-0-0, +/// raw DEFLATE) — followed by the token stream; a Stacker payload carries no method field and is +/// recognised by its first word. /// public static class CvfLzCodec { - public const uint DS_0_0 = 0x00005344; - public const uint JM_0_0 = 0x00004D4A; - public const uint SQ_0_0 = 0x00005153; - - private const int DsMagic = 0x5344; - private const int JmMagic = 0x4D4A; - private const int SqMagic = 0x5153; - private const int Sync = 0x113f; - private const int MaxLen = 512; // safe for both (DS replen<=512, JM<=513) - - // ── bit writer: bit i -> word[i/16] bit i%16, words stored little-endian ─── - private sealed class BitWriter { - private readonly List _words = []; - private int _bit; - public void Put(int value, int n) { - for (var i = 0; i < n; i++, this._bit++) { - var w = this._bit >> 4; - while (this._words.Count <= w) this._words.Add(0); - if (((value >> i) & 1) != 0) this._words[w] |= (ushort)(1 << (this._bit & 15)); - } - } - public byte[] ToBytes() { - var b = new byte[this._words.Count * 2]; - for (var i = 0; i < this._words.Count; i++) { - b[i * 2] = (byte)this._words[i]; - b[i * 2 + 1] = (byte)(this._words[i] >> 8); - } - return b; - } - } - - // ── bit reader: faithful port of dmsdos dblb_* ───────────────────────────── - private sealed class BitReader { - private static readonly uint[] Mask = - [0x0, 0x1, 0x3, 0x7, 0xF, 0x1F, 0x3F, 0x7F, 0xFF, - 0x1FF, 0x3FF, 0x7FF, 0xFFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF]; - private readonly byte[] _d; - private readonly int _len; - private uint _buf; - private int _pb = 32; - private int _pd; - private readonly int _pe; - public BitReader(byte[] d, int len) { this._d = d; this._len = len; this._pe = (len + 1) >> 1; } - private ushort Word(int i) { - var o = i * 2; - var lo = o < this._len ? this._d[o] : 0; - var hi = o + 1 < this._len ? this._d[o + 1] : 0; - return (ushort)(lo | (hi << 8)); - } - public uint Peek() { - if (this._pb >= 16) { - this._buf >>= 16; this._pb -= 16; - if (this._pd < this._pe) this._buf |= (uint)Word(this._pd++) << 16; - } - return this._buf >> this._pb; - } - public void Skip(int n) => this._pb += n; - public uint ReadN(int n) { var u = this.Peek(); this._pb += n; return u & Mask[n]; } + /// Method header of a DS-0-0 payload, read as a little-endian 32-bit word. + public const uint DS_0_0 = 'D' | 'S' << 8; - public int RdOffs() { - var u = this.Peek(); - switch (u & 3) { - case 0: case 2: this._pb += 1 + 6; return (int)(63 & (u >> 1)); - case 1: this._pb += 2 + 8; return (int)((255 & (u >> 2)) + 64); - default: this._pb += 2 + 12; return (int)((4095 & (u >> 2)) + 320); - } - } - public int RdLen() { - var u = this.Peek(); - switch (u & 15) { - case 1: case 3: case 5: case 7: case 9: case 11: case 13: case 15: this._pb += 1; return 3; - case 2: case 6: case 10: case 14: this._pb += 3; return (int)((1 & (u >> 2)) + 4); - case 4: case 12: this._pb += 5; return (int)((3 & (u >> 3)) + 6); - case 8: this._pb += 7; return (int)((7 & (u >> 4)) + 10); - } - switch ((u >> 4) & 15) { - case 1: case 3: case 5: case 7: case 9: case 11: case 13: case 15: this._pb += 9; return (int)((15 & (u >> 5)) + 18); - case 2: case 6: case 10: case 14: this._pb += 11; return (int)((31 & (u >> 6)) + 34); - case 4: case 12: this._pb += 13; return (int)((63 & (u >> 7)) + 66); - case 8: this._pb += 15; return (int)((127 & (u >> 8)) + 130); - } - this._pb += 9; - if ((u & 256) != 0) return (int)this.ReadN(8) + 258; - return -1; - } - } + /// Method header of a JM-0-0 payload, read as a little-endian 32-bit word. + public const uint JM_0_0 = 'J' | 'M' << 8; - // ── length / offset encoders (inverse of RdLen / RdOffs) ─────────────────── - private static void PutLen(BitWriter w, int v) { // v = rdlen value, 3..513 - var x = v - 2; - var c = 0; - while ((1 << (c + 1)) <= x) c++; - w.Put(1 << c, c + 1); // c zero bits then a 1 - w.Put(x - (1 << c), c); // c data bits - } - - private static void PutOffs(BitWriter w, int off) { - if (off <= 63) { w.Put(0, 1); w.Put(off, 6); } - else if (off <= 319) { w.Put(1, 2); w.Put(off - 64, 8); } - else { w.Put(3, 2); w.Put(off - 320, 12); } - } + /// Method header of an SQ-0-0 payload, read as a little-endian 32-bit word. + public const uint SQ_0_0 = 'S' | 'Q' << 8; - // =========================================================================== - // Compression - // =========================================================================== + private const ushort Sd4Signature = 0x0081; + private const int HeaderBytes = 4; /// - /// Compresses one cluster. Returns the payload (4-byte method header + token - /// stream, padded to a 2-byte word), or null if it would not be smaller - /// than the raw cluster (caller stores raw instead). + /// Compresses one cluster. Returns the payload, or when it would not be + /// smaller than the raw cluster (the caller then stores the cluster raw). /// public static byte[]? Compress(ReadOnlySpan data, CvfLzMethod method, int level) { - var bytes = Encode(data, method, level); - if (bytes is null) return null; - return bytes.Length < data.Length ? bytes : null; - } - - /// Encodes a cluster with the given method, always returning the - /// payload (4-byte header + token stream), or null for - /// / unsupported methods. The caller decides - /// whether the result fits the cluster's sector budget. - public static byte[]? Encode(ReadOnlySpan data, CvfLzMethod method, int level) { - switch (method) { - case CvfLzMethod.Ds: return CompressDs(data, level); - case CvfLzMethod.Jm: return CompressJm(data, level); - case CvfLzMethod.Sq: return CompressSq(data); - case CvfLzMethod.Sd4: return Sd4Codec.Encode(data); - case CvfLzMethod.Sd3: return Sd3Codec.Encode(data); - case CvfLzMethod.Auto: - // Per-cluster best-of: each cluster carries its own method header, so we - // pick whichever codec yields the smallest payload for this cluster. - byte[]?[] cands = [CompressDs(data, level), CompressJm(data, level), CompressSq(data)]; - byte[]? best = null; - foreach (var c in cands) if (c is not null && (best is null || c.Length < best.Length)) best = c; - return best; - default: return null; - } + var payload = Encode(data, method, level); + return payload is not null && payload.Length < data.Length ? payload : null; } - private static byte[] CompressDs(ReadOnlySpan data, int level) { - var w = new BitWriter(); - w.Put(DsMagic, 16); - w.Put(0, 16); // version 0 (DS-0-0) - var src = data.ToArray(); - var pos = 0; - while (pos < src.Length) { - var (mlen, moff) = FindMatch(src, pos, 4415, 2, level); - if (mlen >= 2) { - if (moff <= 63) w.Put(0 | (moff << 2), 8); - else if (moff <= 319) w.Put(3 | ((moff - 64) << 3), 11); - else w.Put(7 | ((moff - 320) << 3), 15); - PutLen(w, mlen + 1); // DS: copy length = rdlen - 1 - pos += mlen; - } else { - var b = src[pos++]; - if (b < 128) w.Put(2 | (b << 2), 9); - else w.Put(1 | ((b & 127) << 2), 9); - } - } - w.Put(7, 3); w.Put(Sync - 320, 12); // final sync - return w.ToBytes(); - } - - private static byte[] CompressJm(ReadOnlySpan data, int level) { - var w = new BitWriter(); - w.Put(JmMagic, 16); - w.Put(0, 16); // version 0 (JM-0-0) - var src = data.ToArray(); - var pos = 0; - while (pos < src.Length) { - var (mlen, moff) = FindMatch(src, pos, 4415, 3, level); - if (mlen >= 3) { - w.Put(1, 2); // match token - PutOffs(w, moff); - PutLen(w, mlen); // JM: copy length = rdlen - pos += mlen; - } else { - var b = src[pos++]; - if (b < 128) w.Put(b << 1, 8); - else w.Put(3 | ((b & 127) << 2), 9); - } - } - w.Put(1, 2); w.Put(3, 2); w.Put(Sync - 320, 12); // final sync (rdn(2)=1 + rdoffs 0x113f) - return w.ToBytes(); - } - - // SQ-0-0 (DriveSpace 3 "Ultra") is, byte-for-byte, "SQ" + 16-bit version + a - // raw RFC-1951 DEFLATE stream: dmsdos sq_dec's fixed-Huffman table, length and - // distance base/extra tables, and bit-reversed LSB-first packing all match - // DEFLATE exactly, so our Deflate encoder produces a genuine SQ body. - private static byte[] CompressSq(ReadOnlySpan data) { - using var ms = new MemoryStream(); - ms.WriteByte(0x53); ms.WriteByte(0x51); ms.WriteByte(0); ms.WriteByte(0); // "SQ", version 0 - using (var ds = new RawDeflateStream(ms, CompressionStreamMode.Compress, DeflateCompressionLevel.Default, leaveOpen: true)) - ds.Write(data); - return ms.ToArray(); - } - - private static byte[] DecompressSq(byte[] payload, int inLen, int outLen) { - using var ins = new MemoryStream(payload, 4, inLen - 4); - using var ds = new RawDeflateStream(ins, CompressionStreamMode.Decompress); - var outp = new byte[outLen]; - var n = 0; int r; - while (n < outLen && (r = ds.Read(outp, n, outLen - n)) > 0) n += r; - return outp; - } - - // Greedy longest-match finder. level scales the search depth (chain length). - private static (int Len, int Off) FindMatch(byte[] src, int pos, int maxOff, int minLen, int level) { - var bestLen = 0; var bestOff = 0; - var start = Math.Max(0, pos - maxOff); - var limit = Math.Min(MaxLen, src.Length - pos); - if (limit < minLen) return (0, 0); - var probes = level <= 0 ? 256 : level * 1024; - for (var cand = pos - 1; cand >= start && probes-- > 0; cand--) { - if (src[cand] != src[pos]) continue; - var l = 1; - while (l < limit && src[cand + l] == src[pos + l]) l++; - if (l > bestLen) { bestLen = l; bestOff = pos - cand; if (l >= limit) break; } - } - return bestLen >= minLen ? (bestLen, bestOff) : (0, 0); - } - - // =========================================================================== - // Decompression - // =========================================================================== + /// + /// Encodes a cluster with the given method and always returns the payload, or + /// for . The caller decides whether the + /// result fits the cluster's sector budget. keeps the smaller of DS + /// and JM. + /// + public static byte[]? Encode(ReadOnlySpan data, CvfLzMethod method, int level) => method switch { + CvfLzMethod.Ds => EncodeMsdbl(data, MsdblDialect.Ds, level), + CvfLzMethod.Jm => EncodeMsdbl(data, MsdblDialect.Jm, level), + CvfLzMethod.Auto => Smaller(EncodeMsdbl(data, MsdblDialect.Ds, level), EncodeMsdbl(data, MsdblDialect.Jm, level)), + CvfLzMethod.Sq => EncodeSq(data, level), + CvfLzMethod.Sd3 => Sd3Codec.Encode(data), + CvfLzMethod.Sd4 => Sd4Codec.Encode(data, level), + _ => null, + }; - /// Decompresses a cluster payload to exactly bytes. + /// + /// Decompresses an MSDBL cluster payload (DS, JM or SQ, told apart by its header) to exactly + /// bytes. + /// + /// Unknown method header or a malformed stream. public static byte[] Decompress(byte[] payload, int inLen, int outLen) { - var method = (uint)(payload[0] | (payload[1] << 8) | (payload[2] << 16) | (payload[3] << 24)); - var magic16 = (int)(method & 0xFFFF); - if (magic16 == SqMagic) return DecompressSq(payload, inLen, outLen); - if (magic16 == 0x0081) return Sd4Codec.Decode(payload, inLen, outLen); - var br = new BitReader(payload, inLen); - var read = br.ReadN(16); - if (read != (uint)magic16) throw new InvalidDataException($"CVF codec: bad magic 0x{read:X4}"); - br.ReadN(16); // version - var outp = new byte[outLen]; - var p = 0; - if (magic16 == DsMagic) DecodeDs(br, outp, ref p); - else if (magic16 == JmMagic) DecodeJm(br, outp, ref p); - else throw new InvalidDataException($"CVF codec: unsupported method 0x{method:X8}"); - return outp; + var input = payload.AsSpan(0, Math.Min(inLen, payload.Length)); + if (input.Length < HeaderBytes) throw new InvalidDataException("CVF: cluster payload shorter than its method header."); + + var output = new byte[outLen]; + var stream = input[HeaderBytes..]; + switch (BinaryPrimitives.ReadUInt16LittleEndian(input)) { + case (ushort)DS_0_0: MsdblLzCodec.Decode(stream, output, MsdblDialect.Ds, stopAtEndOfInput: false); break; + case (ushort)JM_0_0: MsdblLzCodec.Decode(stream, output, MsdblDialect.Jm, stopAtEndOfInput: false); break; + case (ushort)SQ_0_0: DecodeSq(stream, output); break; + case var magic: throw new InvalidDataException($"CVF: unknown cluster method header 0x{magic:X4}."); + } + return output; } /// /// Decompresses a Stacker cluster payload to bytes. Stacker records no /// method per cluster; the payload's first little-endian word selects it — 0x0081 SD-4, - /// 0x5344 ("DS") the DoubleSpace codec, anything else SD-3, whose first token is always a + /// 0x5344 ("DS") the DoubleSpace grammar, anything else SD-3, whose first token is always a /// literal and so can never begin with either word. /// + /// A malformed stream. public static byte[] DecompressStacker(byte[] payload, int inLen, int outLen) { - ArgumentNullException.ThrowIfNull(payload); - if (inLen < 2) throw new InvalidDataException("Stacker cluster payload is too short."); - return (payload[0] | (payload[1] << 8)) switch { - 0x0081 => Sd4Codec.Decode(payload, inLen, outLen), - DsMagic => Decompress(payload, inLen, outLen), - _ => Sd3Codec.Decode(payload.AsSpan(0, inLen), outLen), - }; + var input = payload.AsSpan(0, Math.Min(inLen, payload.Length)); + var word = input.Length >= 2 ? BinaryPrimitives.ReadUInt16LittleEndian(input) : -1; + switch (word) { + case Sd4Signature: + return Sd4Codec.Decode(payload, input.Length, outLen); + case (int)DS_0_0 when input.Length >= HeaderBytes: + var output = new byte[outLen]; + MsdblLzCodec.Decode(input[HeaderBytes..], output, MsdblDialect.Ds, stopAtEndOfInput: true); + return output; + default: + return Sd3Codec.Decode(input, outLen); + } } - private static void DecodeDs(BitReader br, byte[] outp, ref int p) { - while (p < outp.Length) { - var u = br.Peek(); - switch (u & 3) { - case 0: br.Skip(8); Copy(outp, ref p, (int)((u >> 2) & 63), br, -1); break; - case 1: br.Skip(9); outp[p++] = (byte)((u >> 2) | 128); break; - case 2: br.Skip(9); outp[p++] = (byte)((u >> 2) & 127); break; - default: - int off; - if ((u & 4) != 0) { br.Skip(15); off = (int)((u >> 3) & 4095) + 320; } - else { br.Skip(11); off = (int)((u >> 3) & 255) + 64; } - Copy(outp, ref p, off, br, -1); - break; - } - } + private static byte[] EncodeMsdbl(ReadOnlySpan data, MsdblDialect dialect, int level) { + var writer = new LsbBitWriter(); + WriteHeader(writer, dialect == MsdblDialect.Ds ? DS_0_0 : JM_0_0); + MsdblLzCodec.Encode(data, writer, dialect, level); + return writer.ToArray(alignment: 2); } - private static void DecodeJm(BitReader br, byte[] outp, ref int p) { - while (p < outp.Length) { - var u = br.Peek(); - switch (u & 3) { - case 0: case 2: br.Skip(8); outp[p++] = (byte)((u >> 1) & 127); break; - case 1: br.Skip(2); Copy(outp, ref p, br.RdOffs(), br, 0); break; - default: br.Skip(9); outp[p++] = (byte)(((u >> 2) & 127) | 128); break; + private static byte[] EncodeSq(ReadOnlySpan data, int level) { + var deflateLevel = level switch { + <= 1 => DeflateCompressionLevel.Fast, + 2 => DeflateCompressionLevel.Default, + 3 => DeflateCompressionLevel.Best, + _ => DeflateCompressionLevel.Maximum, + }; + var stream = DeflateCompressor.Compress(data, deflateLevel); + var payload = new byte[HeaderBytes + stream.Length + (stream.Length & 1)]; + BinaryPrimitives.WriteUInt32LittleEndian(payload, SQ_0_0); + stream.CopyTo(payload, HeaderBytes); + return payload; + } + + // The DEFLATE stream ends at its final block or when the cluster is full, whichever comes first. + private static void DecodeSq(ReadOnlySpan stream, Span output) { + try { + using var input = new MemoryStream(stream.ToArray(), writable: false); + var inflater = new DeflateDecompressor(input); + var filled = 0; + while (filled < output.Length) { + var n = inflater.Decompress(output[filled..]); + if (n == 0) break; + filled += n; } + } catch (Exception e) when (e is IOException or ArgumentException or IndexOutOfRangeException) { + throw new InvalidDataException("SQ: malformed DEFLATE stream.", e); } } - private static void Copy(byte[] outp, ref int p, int off, BitReader br, int k) { - if (off == Sync) return; // sync token mid-stream (shouldn't fill) - var len = br.RdLen() + k; - // Past the end of the input every token reads as a zero-distance, invalid-length match, so - // these checks also guarantee that a truncated stream terminates. - if (len <= 0) throw new InvalidDataException("CVF codec: invalid match length."); - if (off <= 0 || off > p) throw new InvalidDataException("CVF codec: match reaches before the start of the cluster."); - var src = p - off; - for (var i = 0; i < len && p < outp.Length; i++) outp[p++] = outp[src + i]; + private static void WriteHeader(LsbBitWriter writer, uint header) { + for (var i = 0; i < HeaderBytes; ++i) writer.WriteByte((byte)(header >> (8 * i))); } + + private static byte[] Smaller(byte[] a, byte[] b) => b.Length < a.Length ? b : a; } diff --git a/Compression.Core/FileSystems/Cvf/CvfLzMethod.cs b/Compression.Core/FileSystems/Cvf/CvfLzMethod.cs new file mode 100644 index 000000000..acfcc979d --- /dev/null +++ b/Compression.Core/FileSystems/Cvf/CvfLzMethod.cs @@ -0,0 +1,23 @@ +namespace Compression.Core.FileSystems.Cvf; + +/// +/// Per-cluster compression methods of the DoubleSpace/DriveSpace/Stacker CVF family (see +/// docs/CVF-CODECS-ON-DISK.md). and are the Stacker 3 and +/// Stacker 4 codecs. +/// +public enum CvfLzMethod { + /// No compression; the cluster is stored as is. + Stored = 0, + /// DoubleSpace DS-0-x LZ77. + Ds = 1, + /// DriveSpace JM-0-x LZ77 (DriveSpace 3 Normal/High). + Jm = 2, + /// Per cluster the smaller of and , both of which every MSDBL volume reads. + Auto = 3, + /// DriveSpace 3 SQ-0-0 (Ultra): a raw DEFLATE stream behind the method header. + Sq = 4, + /// Stacker 4 SD-4: Huffman-coded LZ77 behind the header word 0x0081. + Sd4 = 5, + /// Stacker 3 SD-3: a bare LZS stream closed by a check byte. + Sd3 = 6, +} diff --git a/Compression.Core/FileSystems/Cvf/MsdblLzCodec.cs b/Compression.Core/FileSystems/Cvf/MsdblLzCodec.cs new file mode 100644 index 000000000..ba8d954ca --- /dev/null +++ b/Compression.Core/FileSystems/Cvf/MsdblLzCodec.cs @@ -0,0 +1,268 @@ +namespace Compression.Core.FileSystems.Cvf; + +/// The two Microsoft LZ77 token grammars of docs/CVF-CODECS-ON-DISK.md. +internal enum MsdblDialect { + /// DoubleSpace DS-0-x: two-bit literal tags, matches copy one byte less than their length code. + Ds, + /// DriveSpace JM-0-x: one-bit tag for low literals, matches copy their full length code. + Jm, +} + +/// +/// The DS-0-x / JM-0-x token stream (without the 4-byte method header): bits LSB-first from +/// consecutive bytes, literals and back-references of up to 4414 bytes distance, and the sync marker +/// (distance 4415) that closes every cluster. +/// +internal static class MsdblLzCodec { + /// The all-ones 12-bit long distance, which is the sync marker rather than a match. + public const int SyncDistance = 320 + 0xFFF; + + /// The farthest real match. + public const int MaxDistance = SyncDistance - 1; + + /// The longest length code: nine-step prefix, 2 + 2^8 + 255. + private const int MaxLengthCode = 513; + + private const int MaxLengthPrefix = 8; + + /// Decoded bytes between two sync markers in an encoded cluster: one sector. + private const int SyncInterval = 512; + + // ── decoding ──────────────────────────────────────────────────────────── + + /// + /// Decodes the token stream in until is full. + /// + /// The token stream, starting right after the method header. + /// The cluster; bytes not written stay as they are (zero). + /// DS or JM. + /// + /// Stacker's use of the DS grammar: a stream that runs out (or reaches its zero padding) before the + /// cluster is full ends there instead of being an error. + /// + /// The number of bytes decoded. + /// The stream is malformed or ends early. + public static int Decode(ReadOnlySpan stream, Span output, MsdblDialect dialect, bool stopAtEndOfInput) { + var reader = new LsbBitReader(stream); + var position = 0; + while (position < output.Length) { + var token = dialect == MsdblDialect.Ds ? ReadDsToken(ref reader) : ReadJmToken(ref reader); + if (reader.Overran) { + if (stopAtEndOfInput) break; + throw new InvalidDataException($"{dialect}: token stream ends after {position} of {output.Length} bytes."); + } + + if (token.Distance == 0) { // literal (a real match never has distance 0) + if (token.Length != 0) { + if (stopAtEndOfInput) break; // zero padding read as a distance-0 match + throw new InvalidDataException($"{dialect}: match with distance 0."); + } + output[position++] = token.Literal; + continue; + } + + if (token.Distance == SyncDistance) { + // A cluster whose data ends before its nominal size is closed by a sync with nothing but + // padding behind it; the remainder of the cluster reads as zero. + if (reader.RestIsZero) break; + continue; + } + + var length = ReadLengthCode(ref reader); + if (reader.Overran) { + if (stopAtEndOfInput) break; + throw new InvalidDataException($"{dialect}: token stream ends inside a match."); + } + if (length < 0) throw new InvalidDataException($"{dialect}: length code has more than {MaxLengthPrefix} leading zeros."); + if (dialect == MsdblDialect.Ds) --length; + if (token.Distance > position) throw new InvalidDataException($"{dialect}: match reaches before the start of the cluster."); + + length = Math.Min(length, output.Length - position); + for (var end = position + length; position < end; ++position) + output[position] = output[position - token.Distance]; + } + return position; + } + + /// A literal ( 0, 0) or the distance of a match/sync. + private readonly record struct Token(byte Literal, int Distance, int Length = 0); + + private static Token ReadDsToken(ref LsbBitReader reader) { + var first = reader.Read(1); + var second = reader.Read(1); + return (first, second) switch { + (0, 0) => Match(reader.Read(6)), + (1, 0) => new((byte)(0x80 | reader.Read(7)), 0), + (0, 1) => new((byte)reader.Read(7), 0), + _ => reader.Read(1) == 0 ? Match(64 + reader.Read(8)) : Match(320 + reader.Read(12)), + }; + } + + private static Token ReadJmToken(ref LsbBitReader reader) { + if (reader.Read(1) == 0) return new((byte)reader.Read(7), 0); + if (reader.Read(1) == 1) return new((byte)(0x80 | reader.Read(7)), 0); + if (reader.Read(1) == 0) return Match(reader.Read(6)); + return reader.Read(1) == 0 ? Match(64 + reader.Read(8)) : Match(320 + reader.Read(12)); + } + + // Distance 0 cannot be a literal here: flag it with a non-zero length so the caller rejects it. + private static Token Match(int distance) => new(0, distance, distance == 0 ? 1 : 0); + + /// Reads z zeros, a one, then z bits: 2 + 2^z + v; -1 for nine zeros. + private static int ReadLengthCode(ref LsbBitReader reader) { + var prefix = 0; + while (reader.Read(1) == 0) { + if (++prefix > MaxLengthPrefix) return -1; + if (reader.Overran) return 0; + } + return 2 + (1 << prefix) + reader.Read(prefix); + } + + // ── encoding ──────────────────────────────────────────────────────────── + + /// + /// Encodes as a token stream with a sync marker after every 512 decoded + /// bytes and after the last one, appended to . As in the streams the dmsdos + /// compressors write, no match runs across a 512-byte boundary (distances still reach back across + /// them), so every sector of the cluster ends on a sync. + /// + public static void Encode(ReadOnlySpan data, LsbBitWriter writer, MsdblDialect dialect, int level) { + // A DS match copies one byte less than its length code, so its shortest copy is two bytes and its + // longest 512; the finder reports matches of three bytes and more. + var maxCopy = dialect == MsdblDialect.Ds ? MaxLengthCode - 1 : MaxLengthCode; + var copyBias = dialect == MsdblDialect.Ds ? 1 : 0; + var bytes = data.ToArray(); + var finder = new ClusterMatchFinder(bytes, MaxDistance, maxCopy, level); + + var sectorStart = 0; + do { + var sectorEnd = Math.Min(sectorStart + SyncInterval, bytes.Length); + var position = sectorStart; + var pending = finder.Find(position, sectorEnd); + while (position < sectorEnd) { + var (length, distance) = pending; + if (length == 0) { + WriteLiteral(writer, dialect, bytes[position]); + pending = ++position < sectorEnd ? finder.Find(position, sectorEnd) : default; + continue; + } + + // One step of lazy evaluation: a longer match starting at the next byte wins over this one. + var next = position + 1 < sectorEnd ? finder.Find(position + 1, sectorEnd) : default; + if (next.Length > length) { + WriteLiteral(writer, dialect, bytes[position]); + ++position; + pending = next; + continue; + } + + WriteMatch(writer, dialect, distance, length + copyBias); + position += length; + pending = position < sectorEnd ? finder.Find(position, sectorEnd) : default; + } + WriteSync(writer, dialect); + sectorStart = sectorEnd; + } while (sectorStart < bytes.Length); + } + + private static void WriteLiteral(LsbBitWriter writer, MsdblDialect dialect, byte value) { + var high = value >= 0x80; + if (dialect == MsdblDialect.Ds) + writer.Write(high ? 0b01 : 0b10, 2); // read order: "1 0" high, "0 1" low + else if (high) + writer.Write(0b11, 2); + else + writer.Write(0, 1); + writer.Write(value & 0x7F, 7); + } + + private static void WriteMatch(LsbBitWriter writer, MsdblDialect dialect, int distance, int lengthCode) { + WriteDistance(writer, dialect, distance); + var prefix = 31 - int.LeadingZeroCount(lengthCode - 2); + writer.Write(1 << prefix, prefix + 1); // `prefix` zeros, then a one + writer.Write(lengthCode - 2 - (1 << prefix), prefix); + } + + private static void WriteSync(LsbBitWriter writer, MsdblDialect dialect) => WriteDistance(writer, dialect, SyncDistance); + + private static void WriteDistance(LsbBitWriter writer, MsdblDialect dialect, int distance) { + if (dialect == MsdblDialect.Ds) { + switch (distance) { + case < 64: writer.Write(0b00, 2); writer.Write(distance, 6); break; + case < 320: writer.Write(0b011, 3); writer.Write(distance - 64, 8); break; + default: writer.Write(0b111, 3); writer.Write(distance - 320, 12); break; + } + return; + } + + writer.Write(0b01, 2); // read order: "1 0" + switch (distance) { + case < 64: writer.Write(0, 1); writer.Write(distance, 6); break; + case < 320: writer.Write(0b01, 2); writer.Write(distance - 64, 8); break; + default: writer.Write(0b11, 2); writer.Write(distance - 320, 12); break; + } + } +} + +/// Reads bits LSB-first from consecutive bytes; past the end it yields zeros and records the overrun. +internal ref struct LsbBitReader { + private readonly ReadOnlySpan _data; + private int _next; + private ulong _buffer; + private int _count; + + public LsbBitReader(ReadOnlySpan data) => this._data = data; + + /// True once a read has needed bits beyond the end of the data. + public readonly bool Overran => (long)this._next * 8 - this._count > (long)this._data.Length * 8; + + /// True when every bit not yet read is zero. + public readonly bool RestIsZero => this._buffer == 0 && (this._next >= this._data.Length || !this._data[this._next..].ContainsAnyExcept((byte)0)); + + /// Reads (at most 24) bits, the first read becoming the least significant. + public int Read(int count) { + while (this._count < count) { + if (this._next < this._data.Length) this._buffer |= (ulong)this._data[this._next] << this._count; + ++this._next; + this._count += 8; + } + var value = (int)(this._buffer & ((1UL << count) - 1)); + this._buffer >>= count; + this._count -= count; + return value; + } +} + +/// Writes bits LSB-first into consecutive bytes. +internal sealed class LsbBitWriter { + private byte[] _bytes = new byte[256]; + private int _length; + private ulong _accumulator; + private int _count; + + /// Appends a whole byte; only valid at a byte boundary. + public void WriteByte(byte value) => this.Write(value, 8); + + /// Appends the low (at most 32) bits of , least significant first. + public void Write(int value, int count) { + this._accumulator |= ((ulong)(uint)value & ((1UL << count) - 1)) << this._count; + this._count += count; + while (this._count >= 8) { + this.Push((byte)this._accumulator); + this._accumulator >>= 8; + this._count -= 8; + } + } + + /// Flushes the partial byte and pads with zero bytes to a multiple of . + public byte[] ToArray(int alignment) { + if (this._count > 0) this.Write(0, 8 - this._count); + while (this._length % alignment != 0) this.Push(0); + return this._bytes.AsSpan(0, this._length).ToArray(); + } + + private void Push(byte value) { + if (this._length == this._bytes.Length) Array.Resize(ref this._bytes, this._bytes.Length * 2); + this._bytes[this._length++] = value; + } +} diff --git a/Compression.Core/FileSystems/Cvf/PackageMerge.cs b/Compression.Core/FileSystems/Cvf/PackageMerge.cs new file mode 100644 index 000000000..1074b827c --- /dev/null +++ b/Compression.Core/FileSystems/Cvf/PackageMerge.cs @@ -0,0 +1,65 @@ +namespace Compression.Core.FileSystems.Cvf; + +/// +/// Optimal length-limited prefix code lengths by the package-merge algorithm (Larmore and Hirschberg, +/// "A fast algorithm for optimal length-limited Huffman codes", JACM 37(3), 1990). The result is +/// always a complete code — Kraft sum exactly one — which SD-4 requires of both its codes. +/// +internal static class PackageMerge { + /// + /// Code lengths for (zero frequency = unused, length 0), none longer + /// than . + /// + /// Fewer than two used symbols, or more than 2^maxLength. + public static int[] Lengths(ReadOnlySpan frequencies, int maxLength) { + var lengths = new int[frequencies.Length]; + var leaves = new List(); + for (var s = 0; s < frequencies.Length; ++s) + if (frequencies[s] > 0) leaves.Add(s); + if (leaves.Count < 2 || leaves.Count > 1L << maxLength) + throw new ArgumentException($"package-merge needs 2..2^{maxLength} used symbols, got {leaves.Count}.", nameof(frequencies)); + + var freq = frequencies.ToArray(); + leaves.Sort((a, b) => freq[a] != freq[b] ? freq[a].CompareTo(freq[b]) : a.CompareTo(b)); + + // Nodes: a leaf (Symbol >= 0) or a package of two nodes from the previous level. + var nodes = new List<(long Weight, int Symbol, int Left, int Right)>(); + var leafNodes = new List(leaves.Count); + foreach (var s in leaves) { + leafNodes.Add(nodes.Count); + nodes.Add((freq[s], s, -1, -1)); + } + + var level = leafNodes; + for (var depth = 1; depth < maxLength; ++depth) { + var packages = new List(level.Count / 2); + for (var i = 0; i + 1 < level.Count; i += 2) { + packages.Add(nodes.Count); + nodes.Add((nodes[level[i]].Weight + nodes[level[i + 1]].Weight, -1, level[i], level[i + 1])); + } + + // Merge the packages into the leaves by weight; leaves first on ties. + var merged = new List(leafNodes.Count + packages.Count); + int a = 0, b = 0; + while (a < leafNodes.Count || b < packages.Count) + merged.Add(b >= packages.Count || (a < leafNodes.Count && nodes[leafNodes[a]].Weight <= nodes[packages[b]].Weight) + ? leafNodes[a++] + : packages[b++]); + level = merged; + } + + // Each appearance of a leaf among the first 2n - 2 items adds one bit to its code. + var stack = new Stack(); + for (var i = 0; i < 2 * leaves.Count - 2; ++i) stack.Push(level[i]); + while (stack.Count > 0) { + var node = nodes[stack.Pop()]; + if (node.Symbol >= 0) { + ++lengths[node.Symbol]; + continue; + } + stack.Push(node.Left); + stack.Push(node.Right); + } + return lengths; + } +} diff --git a/Compression.Core/FileSystems/Cvf/Sd4Codec.cs b/Compression.Core/FileSystems/Cvf/Sd4Codec.cs index 394d2c0d9..58c188081 100644 --- a/Compression.Core/FileSystems/Cvf/Sd4Codec.cs +++ b/Compression.Core/FileSystems/Cvf/Sd4Codec.cs @@ -1,315 +1,418 @@ -#pragma warning disable CS1591 -using System; -using System.IO; - namespace Compression.Core.FileSystems.Cvf; /// -/// Genuine Stacker 4 (SD-4, cluster header 0x0081) per-cluster codec, as -/// specified in docs/CVF-CODECS-ON-DISK.md. SD-4 is Huffman-coded LZ77: a -/// helper code (22 symbols: lengths 0..15 and six run tokens) transmits the 0x150 -/// code lengths of the main code, whose symbols are the 256 literals, 63 short-match -/// tokens, 16 long-match tokens and the end token. -/// -/// reads the complete format — run tokens, short and long -/// matches with length extensions — and is pinned to streams the dmsdos SD-4 -/// encoder wrote. emits an all-literals stream (main code -/// over the cluster's byte frequencies, no match tokens), which the dmsdos driver -/// reads back byte-exact. The bitstream is MSB-first within little-endian 16-bit -/// words; codes are canonical and MSB-first. -/// +/// Stacker 4 (SD-4, cluster header 0x0081) per-cluster codec, implemented from +/// docs/CVF-CODECS-ON-DISK.md. SD-4 is Huffman-coded LZ77: a helper code (code lengths 0..15 +/// and six run tokens) transmits the 336 code lengths of the main code, whose symbols are the 256 +/// literals, 63 short-match tokens, 16 long-match tokens and the end token. Bits are read MSB-first +/// from little-endian 16-bit words; both codes are canonical and complete. /// public static class Sd4Codec { - private const int MaxLen = 10; // keep table2 codes within the decoder's fast table (bn<=10) - - // ── MSB-first bit writer into 16-bit little-endian words ─────────────────── - private sealed class BitWriter { - private readonly System.Collections.Generic.List _words = []; - private uint _cur; - private int _bits; - public void Put(int value, int n) { - for (var i = n - 1; i >= 0; i--) { - this._cur = (this._cur << 1) | (uint)((value >> i) & 1); - if (++this._bits == 16) { this._words.Add((ushort)this._cur); this._cur = 0; this._bits = 0; } - } - } - public byte[] ToBytes() { - if (this._bits > 0) { this._cur <<= 16 - this._bits; this._words.Add((ushort)this._cur); } - var b = new byte[this._words.Count * 2]; - for (var i = 0; i < this._words.Count; i++) { b[i * 2] = (byte)this._words[i]; b[i * 2 + 1] = (byte)(this._words[i] >> 8); } - return b; - } - } - - // ── MSB-first bit reader (mirror of sd4b_rd*) ────────────────────────────── - private sealed class BitReader { - private readonly byte[] _d; private readonly int _len; private long _buf; private int _pb; private int _pd; private readonly int _pe; - public BitReader(byte[] d, int len) { this._d = d; this._len = len; this._pe = (len + 1) >> 1; } - private ushort Word(int i) { var o = i * 2; var lo = o < this._len ? this._d[o] : 0; var hi = o + 1 < this._len ? this._d[o + 1] : 0; return (ushort)(lo | (hi << 8)); } - public int ReadN(int n) { - if (this._pb < n) { this._buf = (this._buf << 16) | (this._pd < this._pe ? Word(this._pd++) : 0u); this._pb += 16; if (this._pb < n) { this._buf = (this._buf << 16) | (this._pd < this._pe ? Word(this._pd++) : 0u); this._pb += 16; } } - this._pb -= n; - return (int)((this._buf >> this._pb) & ((1u << n) - 1)); - } - } - - // ── canonical Huffman: lengths -> (code,len) per symbol, matching sd4b_rdhufi - private static (int[] Code, int[] Len) Canonical(byte[] lengths) { - var cdLn = new int[17]; - foreach (var l in lengths) if (l is > 0 and < 16) cdLn[l]++; - var firstCode = new int[17]; - int us = 0; - for (var i = 1; i <= 16; i++) { firstCode[i] = us; us += cdLn[i]; us <<= 1; } - var next = (int[])firstCode.Clone(); - var code = new int[lengths.Length]; - var len = new int[lengths.Length]; - for (var s = 0; s < lengths.Length; s++) { var l = lengths[s]; if (l == 0) continue; code[s] = next[l]++; len[s] = l; } - return (code, len); - } - - // ── length-limited Huffman code lengths from frequencies ─────────────────── - private static byte[] HuffmanLengths(int[] freq, int maxLen) { - var n = freq.Length; - var lengths = new byte[n]; - var nodes = new System.Collections.Generic.List<(long F, int Sym, int Left, int Right)>(); - for (var s = 0; s < n; s++) if (freq[s] > 0) nodes.Add((freq[s], s, -1, -1)); - if (nodes.Count == 0) return lengths; - if (nodes.Count == 1) { lengths[nodes[0].Sym] = 1; FixKraft(lengths, maxLen); return lengths; } - - var all = new System.Collections.Generic.List<(long F, int Sym, int Left, int Right)>(nodes); - var live = new System.Collections.Generic.List(); - for (var i = 0; i < all.Count; i++) live.Add(i); - while (live.Count > 1) { - live.Sort((a, b) => all[a].F.CompareTo(all[b].F)); - var a = live[0]; var b = live[1]; - live.RemoveRange(0, 2); - all.Add((all[a].F + all[b].F, -1, a, b)); - live.Add(all.Count - 1); - } - AssignDepth(all, live[0], 0, lengths); - FixKraft(lengths, maxLen); - return lengths; - } - - private static void AssignDepth(System.Collections.Generic.List<(long F, int Sym, int Left, int Right)> all, int node, int depth, byte[] lengths) { - var nd = all[node]; - if (nd.Sym >= 0) { lengths[nd.Sym] = (byte)Math.Max(1, depth); return; } - AssignDepth(all, nd.Left, depth + 1, lengths); - AssignDepth(all, nd.Right, depth + 1, lengths); - } - - // Clamp to maxLen and repair the Kraft sum so the code is complete. - private static void FixKraft(byte[] lengths, int maxLen) { - for (var i = 0; i < lengths.Length; i++) if (lengths[i] > maxLen) lengths[i] = (byte)maxLen; - // Kraft sum in units of 2^-maxLen. - long total = 0; - foreach (var l in lengths) if (l > 0) total += 1L << (maxLen - l); - var full = 1L << maxLen; - // Over-full: lengthen some short codes. - while (total > full) { - for (var i = 0; i < lengths.Length && total > full; i++) { - if (lengths[i] > 0 && lengths[i] < maxLen) { total -= 1L << (maxLen - lengths[i]); lengths[i]++; total += 1L << (maxLen - lengths[i]); } - } - } - // Under-full: shorten codes to fill the space (keeps it complete). - var guard = 0; - while (total < full && guard++ < 100000) { - for (var i = 0; i < lengths.Length && total < full; i++) { - if (lengths[i] > 1) { - var delta = 1L << (maxLen - lengths[i]); - if (total + delta <= full) { total += delta; lengths[i]--; } // shortening adds delta again - } - } - if (guard > 99999) break; - } - } + private const int Signature = 0x0081; + private const int HelperSymbols = 22; // code lengths 0..15, run tokens 16..21 + private const int MainSymbols = 0x150; // literals 0..255, tokens 1..80 + private const int MaxCodeLength = 15; + private const int FirstToken = 0x100 - 1; // main symbol of token t is FirstToken + t + private const int FirstLongToken = 64; + private const int EndToken = 80; + private const int ShortMaxLength = 5; + private const int LongMinLength = 6; + private const int LongTokenMaxLength = 21; + private const int MaxMatchLength = LongTokenMaxLength + 0xF + 0xFF + 0xFFF + 0xFFFF; // every extension saturated - public static byte[] Encode(ReadOnlySpan data) { - // table2: Huffman over 0x150 symbols — 256 literals + the end token 0x14F - // (sd4_decomp reads an explicit end token when the output fills). A complete - // code needs >= 2 symbols, so empty/uniform clusters get a nominal literal. - var freq = new int[0x150]; - foreach (var b in data) freq[b]++; - freq[0x14F] = Math.Max(1, freq[0x14F]); // end symbol always present - var nz = 0; foreach (var f in freq) if (f > 0) nz++; - for (var i = 0; i < 256 && nz < 2; i++) if (freq[i] == 0) { freq[i] = 1; nz++; } - var clen = HuffmanLengths(freq, MaxLen); // 0x150 code-lengths - var bmax2 = 0; foreach (var l in clen) if (l > bmax2) bmax2 = l; - if (bmax2 == 0) bmax2 = 1; - - // table1: Huffman over the frequency of each length-VALUE (0..bmax2) in clen. - var lvFreq = new int[0x16]; - foreach (var v in clen) lvFreq[v]++; - var l1 = HuffmanLengths(lvFreq, 7); // table1 bn capped at 7 by the decoder - var bmax1 = 0; foreach (var l in l1) if (l > bmax1) bmax1 = l; - if (bmax1 == 0) bmax1 = 1; - - var (t1code, t1len) = Canonical(l1); - var (t2code, t2len) = Canonical(clen); - - var w = new BitWriter(); - w.Put(0x81, 16); // SD-4 magic - w.Put(0, 3); // start = rdn(3)+1 = 1 - w.Put(bmax2, 5); // ie = bmax2 - w.Put(l1[0], 4); // ca[0] = bmax1 field (length-value 0) - for (var i = 1; i <= bmax2; i++) w.Put(l1[i], 4); // ca[1..bmax2] - for (var i = 0x10; i <= 0x15; i++) w.Put(0, 4); // RLE tokens unused - // emit the 0x150 code-lengths as table1 length-value codes. - foreach (var v in clen) w.Put(t1code[v], t1len[v]); - // emit data as table2 literal codes, then the end token (read by sd4_decomp - // via len_150 bits once the output is full). - foreach (var b in data) w.Put(t2code[b], t2len[b]); - w.Put(t2code[0x14F], t2len[0x14F]); - return w.ToBytes(); - } - - // ── decoding (docs/CVF-CODECS-ON-DISK.md, "SD-4") ────────────────────────── - - private const int HelperSymbols = 0x16; // code lengths 0..15 + run tokens 1..6 - private const int MainSymbols = 0x150; // literals 0..255 + tokens 1..0x50 - private const int EndToken = 0x50; - private const int FirstLongToken = 0x40; - - // Short-match classes: token t (1..0x3F) is class (t-1)/3 with length 3 + (t-1)%3; the offset is - // ShortBase[class] plus ShortBits[class] extra bits. - private static readonly int[] ShortBits = [0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9]; + // Short-match distance classes (token t = 1..63: class (t-1)/3, length 3 + (t-1)%3). private static readonly int[] ShortBase = [1, 2, 3, 4, 6, 8, 12, 16, 24, 32, 48, 64, 96, 128, 192, 256, 384, 512, 768, 1024, 1536]; + private static readonly int[] ShortBits = [0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9]; - // Long-match offset classes, chosen by a 2-bit selector. + // Long-match distance classes, picked by a 2-bit selector. + private static readonly int[] LongBase = [1, 33, 161, 673]; private static readonly int[] LongBits = [5, 7, 9, 11]; - private static readonly int[] LongBase = [0x1, 0x21, 0xA1, 0x2A1]; - // Escalating length extensions of a long match whose token says 21. + // A long match whose token says 21 carries these extensions, each taken only while the previous one saturated. private static readonly int[] LengthExtensionBits = [4, 8, 12, 16]; + private static readonly int ShortMaxDistance = ShortBase[^1] + (1 << ShortBits[^1]) - 1; // 2047 + private static readonly int LongMaxDistance = LongBase[^1] + (1 << LongBits[^1]) - 1; // 2720 + + // ── decoding ──────────────────────────────────────────────────────────── + /// /// Decodes one SD-4 cluster payload into bytes. A stream that ends (end /// token) before the cluster is full leaves the tail zero. /// - /// Bad magic, an inconsistent code table, or a match that reaches before the cluster start. + /// Bad signature, an inconsistent code table, or a match that reaches before the cluster start. public static byte[] Decode(byte[] payload, int inLen, int outLen) { - var r = new BitReader(payload, inLen); - if (r.ReadN(16) != 0x81) throw new InvalidDataException("SD-4: bad magic."); - - // Helper-table code lengths: symbol 0, symbols first..last, then the six run tokens. - var first = r.ReadN(3) + 1; - var last = r.ReadN(5); - if (first > last || last > 15) throw new InvalidDataException("SD-4: helper table range is invalid."); - var helperLengths = new byte[HelperSymbols]; - helperLengths[0] = (byte)r.ReadN(4); - for (var i = first; i <= last; ++i) helperLengths[i] = (byte)r.ReadN(4); - for (var i = 0x10; i < HelperSymbols; ++i) helperLengths[i] = (byte)r.ReadN(4); - var helper = new CanonicalDecoder(helperLengths); - - var mainLengths = new byte[MainSymbols]; - for (var n = 0; n < MainSymbols;) { - var symbol = helper.Decode(r); - if (symbol < 0x10) { mainLengths[n++] = (byte)symbol; continue; } - if (n == 0 && symbol >= 0x13) throw new InvalidDataException("SD-4: length repeat with no previous length."); - var (value, count) = (symbol - 0x0F) switch { - 1 => ((byte)0, 2), - 2 => ((byte)0, 3), - 3 => ((byte)0, ZeroRunLength(r)), - 4 => (mainLengths[n - 1], 2), - 5 => (mainLengths[n - 1], 3), - _ => (mainLengths[n - 1], RepeatRunLength(r)), - }; - count = Math.Min(count, MainSymbols - n); - mainLengths.AsSpan(n, count).Fill(value); - n += count; - } - var main = new CanonicalDecoder(mainLengths); + var reader = new MsbWordReader(payload.AsSpan(0, Math.Min(inLen, payload.Length))); + if (reader.Read(16) != Signature) throw new InvalidDataException("SD-4: bad signature."); + var main = new CanonicalDecoder(ReadMainLengths(ref reader)); var output = new byte[outLen]; - var p = 0; - while (p < outLen) { - var symbol = main.Decode(r); - if (symbol < 0x100) { output[p++] = (byte)symbol; continue; } + var position = 0; + while (position < outLen) { + var symbol = main.Decode(ref reader); + if (symbol <= 0xFF) { + output[position++] = (byte)symbol; + continue; + } - var token = symbol - 0xFF; + var token = symbol - FirstToken; if (token == EndToken) break; - int length, offset; + int length, distance; if (token < FirstLongToken) { var cls = (token - 1) / 3; length = 3 + (token - 1) % 3; - offset = ShortBase[cls] + r.ReadN(ShortBits[cls]); + distance = ShortBase[cls] + reader.Read(ShortBits[cls]); } else { - var cls = r.ReadN(2); - offset = LongBase[cls] + r.ReadN(LongBits[cls]); - length = token - FirstLongToken + 6; - var saturated = 21; + var selector = reader.Read(2); + distance = LongBase[selector] + reader.Read(LongBits[selector]); + length = token - 58; + var saturated = LongTokenMaxLength; foreach (var bits in LengthExtensionBits) { if (length != saturated) break; - var extra = r.ReadN(bits); - length += extra; + length += reader.Read(bits); saturated += (1 << bits) - 1; } } - if (offset > p) throw new InvalidDataException("SD-4: match reaches before the start of the cluster."); - length = Math.Min(length, outLen - p); // the reference driver clips an overlong final match - for (var k = 0; k < length; ++k, ++p) output[p] = output[p - offset]; + if (distance > position) throw new InvalidDataException("SD-4: match reaches before the start of the cluster."); + length = Math.Min(length, outLen - position); + for (var end = position + length; position < end; ++position) + output[position] = output[position - distance]; } return output; } - // Run token 3: 4 + 3 bits; a saturated 7 continues with 7-bit groups while they read 0x7F. - private static int ZeroRunLength(BitReader r) { - var v = r.ReadN(3); + private static byte[] ReadMainLengths(ref MsbWordReader reader) { + var first = reader.Read(3) + 1; + var last = reader.Read(5); + if (first > last || last > MaxCodeLength) throw new InvalidDataException("SD-4: helper length range is invalid."); + + var helperLengths = new byte[HelperSymbols]; + helperLengths[0] = (byte)reader.Read(4); + for (var i = first; i <= last; ++i) helperLengths[i] = (byte)reader.Read(4); + for (var i = 16; i < HelperSymbols; ++i) helperLengths[i] = (byte)reader.Read(4); + var helper = new CanonicalDecoder(helperLengths); + + var lengths = new byte[MainSymbols]; + for (var n = 0; n < MainSymbols;) { + var symbol = helper.Decode(ref reader); + if (symbol < 16) { + lengths[n++] = (byte)symbol; + continue; + } + if (symbol >= 19 && n == 0) throw new InvalidDataException("SD-4: length repeat with no previous length."); + var (value, count) = symbol switch { + 16 => ((byte)0, 2), + 17 => ((byte)0, 3), + 18 => ((byte)0, ReadZeroRun(ref reader)), + 19 => (lengths[n - 1], 2), + 20 => (lengths[n - 1], 3), + _ => (lengths[n - 1], ReadRepeatRun(ref reader)), + }; + count = Math.Min(count, MainSymbols - n); + lengths.AsSpan(n, count).Fill(value); + n += count; + } + return lengths; + } + + // Helper symbol 18: 4 + 3 bits; a 7 continues with 7-bit groups while they read 0x7F. + private static int ReadZeroRun(ref MsbWordReader reader) { + var v = reader.Read(3); var n = 4 + v; if (v == 7) - do { v = r.ReadN(7); n += v; } while (v == 0x7F); + do n += v = reader.Read(7); while (v == 0x7F); return n; } - // Run token 6: 4 + 3-bit groups, continuing while a group reads 7. - private static int RepeatRunLength(BitReader r) { + // Helper symbol 21: 4 + 3-bit groups, continuing while a group reads 7. + private static int ReadRepeatRun(ref MsbWordReader reader) { var n = 4; int v; - do { v = r.ReadN(3); n += v; } while (v == 7); + do n += v = reader.Read(3); while (v == 7); return n; } + // ── encoding ──────────────────────────────────────────────────────────── + + /// Encodes one cluster with back-references, Huffman-coded behind a run-length coded code table. + /// The cluster. + /// 1 (fastest) and up; deeper match search at higher levels. + public static byte[] Encode(ReadOnlySpan data, int level = 2) + => Encode(data, level, matches: true); + + /// Encodes with back-references switched off when is false — a + /// literals-only stream whose code depth follows the byte statistics alone (used to probe decoders). + internal static byte[] Encode(ReadOnlySpan data, int level, bool matches) { + var symbols = matches ? Parse(data, level) : LiteralsOnly(data); + + var mainFrequencies = new long[MainSymbols]; + foreach (var s in symbols) ++mainFrequencies[s.Symbol]; + EnsureTwoSymbols(mainFrequencies, 0); + var mainLengths = PackageMerge.Lengths(mainFrequencies, MaxCodeLength); + + var runs = RunLengthCode(mainLengths); + var helperFrequencies = new long[HelperSymbols]; + foreach (var r in runs) ++helperFrequencies[r.Symbol]; + EnsureTwoSymbols(helperFrequencies, helperFrequencies[0] == 0 ? 0 : 16); + var helperLengths = PackageMerge.Lengths(helperFrequencies, MaxCodeLength); + + var writer = new MsbWordWriter(); + writer.Write(Signature, 16); + WriteHelperHeader(writer, mainLengths, helperLengths); + + WriteSymbols(writer, runs, helperLengths); + WriteSymbols(writer, symbols, mainLengths); + return writer.ToArray(); + } + + /// A symbol of the main or helper code followed by its extra-bit fields, in stream order. + private readonly record struct CodedSymbol(int Symbol, params (int Value, int Bits)[] Extras); + + private static void WriteSymbols(MsbWordWriter writer, List symbols, int[] lengths) { + var codes = CanonicalCodes(lengths); + foreach (var s in symbols) { + writer.Write(codes[s.Symbol], lengths[s.Symbol]); + foreach (var (value, bits) in s.Extras) writer.Write(value, bits); + } + } + + private static List LiteralsOnly(ReadOnlySpan data) { + var symbols = new List(data.Length + 1); + foreach (var b in data) symbols.Add(new(b)); + symbols.Add(new(FirstToken + EndToken)); + return symbols; + } + + private static List Parse(ReadOnlySpan data, int level) { + var bytes = data.ToArray(); + var finder = new ClusterMatchFinder(bytes, LongMaxDistance, MaxMatchLength, level); + var symbols = new List(bytes.Length / 2 + 2); + + var position = 0; + var pending = Usable(finder.Find(0)); + while (position < bytes.Length) { + if (pending.Length == 0) { + symbols.Add(new(bytes[position], [])); + pending = Usable(finder.Find(++position)); + continue; + } + + var next = position + 1 < bytes.Length ? Usable(finder.Find(position + 1)) : (Length: 0, Distance: 0); + if (next.Length > pending.Length) { + symbols.Add(new(bytes[position], [])); + ++position; + pending = next; + continue; + } + + symbols.Add(MatchSymbol(pending.Length, pending.Distance)); + position += pending.Length; + pending = position < bytes.Length ? Usable(finder.Find(position)) : (Length: 0, Distance: 0); + } + + symbols.Add(new(FirstToken + EndToken, [])); + return symbols; + } + + // Lengths 3..5 only reach as far as the short classes; everything longer may use the long ones. + private static (int Length, int Distance) Usable((int Length, int Distance) match) + => match.Length is > 0 and <= ShortMaxLength && match.Distance > ShortMaxDistance ? (0, 0) : match; + + private static CodedSymbol MatchSymbol(int length, int distance) { + if (length <= ShortMaxLength) { + var cls = ClassOf(ShortBase, ShortBits, distance); + var token = 1 + cls * 3 + (length - 3); + return new(FirstToken + token, [(distance - ShortBase[cls], ShortBits[cls])]); + } + + var selector = ClassOf(LongBase, LongBits, distance); + var extras = new List<(int, int)> { (selector, 2), (distance - LongBase[selector], LongBits[selector]) }; + var longToken = FirstLongToken + Math.Min(length, LongTokenMaxLength) - LongMinLength; + var remaining = length - LongTokenMaxLength; + foreach (var bits in LengthExtensionBits) { + if (remaining < 0) break; + var max = (1 << bits) - 1; + extras.Add((Math.Min(remaining, max), bits)); + remaining -= max; // continues only when this extension saturated + } + return new(FirstToken + longToken, [.. extras]); + } + + private static int ClassOf(int[] bases, int[] bits, int distance) { + for (var c = bases.Length - 1; c >= 0; --c) + if (distance >= bases[c]) + return distance < bases[c] + (1 << bits[c]) ? c : throw new ArgumentOutOfRangeException(nameof(distance)); + throw new ArgumentOutOfRangeException(nameof(distance)); + } + + // A complete prefix code needs at least two symbols; give a spare one a nominal count. + private static void EnsureTwoSymbols(long[] frequencies, int spare) { + var used = frequencies.Count(f => f > 0); + for (var s = spare; used < 2 && s < frequencies.Length; ++s) + if (frequencies[s] == 0) { frequencies[s] = 1; ++used; } + } + /// - /// Canonical MSB-first prefix code: codes ascend with length and, within a length, with symbol - /// number. The code must be complete (Kraft sum exactly one) with lengths of at most 15 bits. + /// Transmits the main code lengths as helper symbols: a length as itself, runs of zeros as tokens + /// 16/17/18, repeats of the previous length as tokens 19/20/21. + /// + private static List RunLengthCode(int[] lengths) { + var runs = new List(); + for (var i = 0; i < lengths.Length;) { + var value = lengths[i]; + var run = 1; + while (i + run < lengths.Length && lengths[i + run] == value) ++run; + i += run; + + if (value == 0) { + runs.Add(run switch { + 1 => new(0), + 2 => new(16), + 3 => new(17), + < 11 => new(18, (run - 4, 3)), + _ => new(18, [(7, 3), .. Groups(run - 11, 7)]), + }); + continue; + } + + runs.Add(new(value)); + var repeats = run - 1; + switch (repeats) { + case 0: break; + case 1: runs.Add(new(value)); break; + case 2: runs.Add(new(19)); break; + case 3: runs.Add(new(20)); break; + default: runs.Add(new(21, [.. Groups(repeats - 4, 3)])); break; + } + } + return runs; + } + + /// + /// Splits into -bit groups where every group but the + /// last is saturated (all ones) and the last is not, which is how the decoder knows to stop. + /// + private static IEnumerable<(int Value, int Bits)> Groups(int total, int bits) { + var saturated = (1 << bits) - 1; + for (; total >= saturated; total -= saturated) yield return (saturated, bits); + yield return (total, bits); + } + + + private static void WriteHelperHeader(MsbWordWriter writer, int[] mainLengths, int[] helperLengths) { + int shortest = MaxCodeLength, longest = 1; + foreach (var l in mainLengths) { + if (l == 0) continue; + shortest = Math.Min(shortest, l); + longest = Math.Max(longest, l); + } + var first = Math.Min(shortest, 8); + writer.Write(first - 1, 3); + writer.Write(longest, 5); + writer.Write(helperLengths[0], 4); + for (var i = first; i <= longest; ++i) writer.Write(helperLengths[i], 4); + for (var i = 16; i < HelperSymbols; ++i) writer.Write(helperLengths[i], 4); + } + + /// Canonical codes: ascending by length, then by symbol, each the previous plus one. + private static int[] CanonicalCodes(int[] lengths) { + var perLength = new int[MaxCodeLength + 1]; + foreach (var l in lengths) ++perLength[l]; + perLength[0] = 0; + var next = new int[MaxCodeLength + 2]; + for (var len = 1; len <= MaxCodeLength; ++len) next[len + 1] = (next[len] + perLength[len]) << 1; + var codes = new int[lengths.Length]; + for (var s = 0; s < lengths.Length; ++s) + if (lengths[s] != 0) codes[s] = next[lengths[s]]++; + return codes; + } + + /// + /// Canonical MSB-first prefix code decoder. The code must be complete (Kraft sum exactly one) with + /// lengths of at most 15 bits. /// private sealed class CanonicalDecoder { - private readonly int[] _count = new int[16]; + private readonly int[] _perLength = new int[MaxCodeLength + 1]; private readonly int[] _symbols; public CanonicalDecoder(ReadOnlySpan lengths) { foreach (var l in lengths) { - if (l > 15) throw new InvalidDataException("SD-4: code length above 15."); - ++this._count[l]; + if (l > MaxCodeLength) throw new InvalidDataException("SD-4: code length above 15."); + ++this._perLength[l]; } - this._count[0] = 0; - var left = 1; - for (var len = 1; len <= 15; ++len) { - left = (left << 1) - this._count[len]; - if (left < 0) throw new InvalidDataException("SD-4: over-subscribed code table."); + this._perLength[0] = 0; + var free = 1; + for (var len = 1; len <= MaxCodeLength; ++len) { + free = (free << 1) - this._perLength[len]; + if (free < 0) throw new InvalidDataException("SD-4: over-subscribed code table."); } - if (left != 0) throw new InvalidDataException("SD-4: incomplete code table."); + if (free != 0) throw new InvalidDataException("SD-4: incomplete code table."); - var offsets = new int[16]; - for (var len = 1; len < 15; ++len) offsets[len + 1] = offsets[len] + this._count[len]; - this._symbols = new int[offsets[15] + this._count[15]]; + var offsets = new int[MaxCodeLength + 2]; + for (var len = 1; len <= MaxCodeLength; ++len) offsets[len + 1] = offsets[len] + this._perLength[len]; + this._symbols = new int[offsets[MaxCodeLength + 1]]; for (var s = 0; s < lengths.Length; ++s) if (lengths[s] != 0) this._symbols[offsets[lengths[s]]++] = s; } - public int Decode(BitReader r) { - int code = 0, firstCode = 0, index = 0; - for (var len = 1; len <= 15; ++len) { - code |= r.ReadN(1); - var count = this._count[len]; - if (code - firstCode < count) return this._symbols[index + code - firstCode]; + public int Decode(ref MsbWordReader reader) { + int code = 0, first = 0, index = 0; + for (var len = 1; len <= MaxCodeLength; ++len) { + code |= reader.Read(1); + var count = this._perLength[len]; + if (code - first < count) return this._symbols[index + code - first]; index += count; - firstCode = (firstCode + count) << 1; + first = (first + count) << 1; code <<= 1; } throw new InvalidDataException("SD-4: undecodable bit sequence."); } } + + /// Reads bits MSB-first from little-endian 16-bit words; zeros past the end. + private ref struct MsbWordReader { + private readonly ReadOnlySpan _data; + private int _next; + private uint _buffer; + private int _count; + + public MsbWordReader(ReadOnlySpan data) => this._data = data; + + public int Read(int count) { + if (count == 0) return 0; + while (this._count < count) { + var lo = this._next < this._data.Length ? this._data[this._next] : 0; + var hi = this._next + 1 < this._data.Length ? this._data[this._next + 1] : 0; + this._next += 2; + this._buffer = this._buffer << 16 | (uint)(lo | hi << 8); + this._count += 16; + } + this._count -= count; + return (int)(this._buffer >> this._count) & ((1 << count) - 1); + } + } + + /// Writes bits MSB-first into little-endian 16-bit words. + private sealed class MsbWordWriter { + private readonly List _bytes = []; + private int _word; + private int _count; + + public void Write(int value, int count) { + for (var i = count - 1; i >= 0; --i) { + this._word = this._word << 1 | (value >> i & 1); + if (++this._count < 16) continue; + this._bytes.Add((byte)this._word); + this._bytes.Add((byte)(this._word >> 8)); + (this._word, this._count) = (0, 0); + } + } + + public byte[] ToArray() { + if (this._count > 0) this.Write(0, 16 - this._count); + return [.. this._bytes]; + } + } } diff --git a/Compression.Core/REFERENCE.md b/Compression.Core/REFERENCE.md index 86510a075..5ce0d6fd2 100644 --- a/Compression.Core/REFERENCE.md +++ b/Compression.Core/REFERENCE.md @@ -3335,6 +3335,26 @@ SQX multimedia compressor/decompressor using delta coders (E0-E4) and arithmetic | `Decode` | `static byte[] Decode(byte[] compressed, int originalSize)` | Decompresses multimedia data. | | `Encode` | `static byte[] Encode(ReadOnlySpan data)` | Compresses multimedia data using automatic delta order selection + arithmetic coding. | +### Namespace `Compression.Core.Dictionary.StackerSd4` + +[`StackerSd4BuildingBlock`](#stackersd4buildingblock) + +#### `StackerSd4BuildingBlock` + +Stacker 4's SD-4 codec as a raw primitive: LZ77 over a 2720-byte window, Huffman-coded with a run-length coded code table (`docs/CVF-CODECS-ON-DISK.md`). The building-block wrapper stores the uncompressed size (32-bit little-endian) before one SD-4 stream covering the whole input. + +Implements `IBuildingBlock`. + +| Member | Signature | Summary | +| --- | --- | --- | +| `StackerSd4BuildingBlock` | `StackerSd4BuildingBlock()` | | +| `Description` | `string Description { get; }` | | +| `DisplayName` | `string DisplayName { get; }` | | +| `Family` | `AlgorithmFamily Family { get; }` | | +| `Id` | `string Id { get; }` | | +| `Compress` | `byte[] Compress(ReadOnlySpan data)` | | +| `Decompress` | `byte[] Decompress(ReadOnlySpan data)` | | + ### Namespace `Compression.Core.Dictionary.SuffixTree` [`SuffixTreeBuildingBlock`](#suffixtreebuildingblock) @@ -5747,17 +5767,17 @@ Implements `IEquatable`. #### `CvfLzCodec` -Genuine DoubleSpace/DriveSpace per-cluster compression codec (DS-0-x and JM-0-x), verified byte-exact against the independent dmsdos decoder. The bitstream packs bits LSB-first into little-endian 16-bit words; a cluster payload is a 16-bit magic (`"DS"`=0x5344 / `"MJ"`=0x4D4A) + 16-bit version + an LZ77 token stream terminated by the 0x113f sync. +Per-cluster codecs of the DoubleSpace / DriveSpace / DriveSpace 3 / Stacker compressed volumes, implemented from `docs/CVF-CODECS-ON-DISK.md`. An MSDBL cluster payload starts with a 16-bit magic and a 16-bit version — `"DS"` (DS-0-x), `"JM"` (JM-0-x) or `"SQ"` (SQ-0-0, raw DEFLATE) — followed by the token stream; a Stacker payload carries no method field and is recognised by its first word. | Member | Signature | Summary | | --- | --- | --- | -| `DS_0_0` | `const uint DS_0_0` | | -| `JM_0_0` | `const uint JM_0_0` | | -| `SQ_0_0` | `const uint SQ_0_0` | | -| `Compress` | `static byte[] Compress(ReadOnlySpan data, CvfLzMethod method, int level)` | Compresses one cluster. Returns the payload (4-byte method header + token stream, padded to a 2-byte word), or `null` if it would not be smaller than the raw cluster (caller stores raw instead). | -| `DecompressStacker` | `static byte[] DecompressStacker(byte[] payload, int inLen, int outLen)` | Decompresses a Stacker cluster payload to `outLen` bytes. Stacker records no method per cluster; the payload's first little-endian word selects it — `0x0081` SD-4, `0x5344` ("DS") the DoubleSpace codec, anything else SD-3, whose first token is always a literal and so can never begin with either word. | -| `Decompress` | `static byte[] Decompress(byte[] payload, int inLen, int outLen)` | Decompresses a cluster payload to exactly `outLen` bytes. | -| `Encode` | `static byte[] Encode(ReadOnlySpan data, CvfLzMethod method, int level)` | Encodes a cluster with the given method, always returning the payload (4-byte header + token stream), or `null` for `Stored` / unsupported methods. The caller decides whether the result fits the cluster's sector budget. | +| `DS_0_0` | `const uint DS_0_0` | Method header of a DS-0-0 payload, read as a little-endian 32-bit word. | +| `JM_0_0` | `const uint JM_0_0` | Method header of a JM-0-0 payload, read as a little-endian 32-bit word. | +| `SQ_0_0` | `const uint SQ_0_0` | Method header of an SQ-0-0 payload, read as a little-endian 32-bit word. | +| `Compress` | `static byte[] Compress(ReadOnlySpan data, CvfLzMethod method, int level)` | Compresses one cluster. Returns the payload, or `null` when it would not be smaller than the raw cluster (the caller then stores the cluster raw). | +| `DecompressStacker` | `static byte[] DecompressStacker(byte[] payload, int inLen, int outLen)` | Decompresses a Stacker cluster payload to `outLen` bytes. Stacker records no method per cluster; the payload's first little-endian word selects it — `0x0081` SD-4, `0x5344` ("DS") the DoubleSpace grammar, anything else SD-3, whose first token is always a literal and so can never begin with either word. | +| `Decompress` | `static byte[] Decompress(byte[] payload, int inLen, int outLen)` | Decompresses an MSDBL cluster payload (DS, JM or SQ, told apart by its header) to exactly `outLen` bytes. | +| `Encode` | `static byte[] Encode(ReadOnlySpan data, CvfLzMethod method, int level)` | Encodes a cluster with the given method and always returns the payload, or `null` for `Stored`. The caller decides whether the result fits the cluster's sector budget. `Auto` keeps the smaller of DS and JM. | #### `CvfLzMethod` @@ -5765,13 +5785,13 @@ Per-cluster compression methods of the DoubleSpace/DriveSpace/Stacker CVF family | Value | Numeric | Summary | | --- | --- | --- | -| `Stored` | `0` | | -| `Ds` | `1` | | -| `Jm` | `2` | | -| `Auto` | `3` | | -| `Sq` | `4` | | -| `Sd4` | `5` | | -| `Sd3` | `6` | | +| `Stored` | `0` | No compression; the cluster is stored as is. | +| `Ds` | `1` | DoubleSpace DS-0-x LZ77. | +| `Jm` | `2` | DriveSpace JM-0-x LZ77 (DriveSpace 3 Normal/High). | +| `Auto` | `3` | Per cluster the smaller of `Ds` and `Jm`, both of which every MSDBL volume reads. | +| `Sq` | `4` | DriveSpace 3 SQ-0-0 (Ultra): a raw DEFLATE stream behind the method header. | +| `Sd4` | `5` | Stacker 4 SD-4: Huffman-coded LZ77 behind the header word `0x0081`. | +| `Sd3` | `6` | Stacker 3 SD-3: a bare LZS stream closed by a check byte. | #### `Sd3Codec` @@ -5784,12 +5804,12 @@ Stacker 3 ("SD-3") per-cluster codec, as specified in `docs/CVF-CODECS-ON-DISK.m #### `Sd4Codec` -Genuine Stacker 4 (SD-4, cluster header `0x0081`) per-cluster codec, as specified in `docs/CVF-CODECS-ON-DISK.md`. SD-4 is Huffman-coded LZ77: a helper code (22 symbols: lengths 0..15 and six run tokens) transmits the 0x150 code lengths of the main code, whose symbols are the 256 literals, 63 short-match tokens, 16 long-match tokens and the end token. `Decode` reads the complete format — run tokens, short and long matches with length extensions — and is pinned to streams the dmsdos SD-4 encoder wrote. `Encode` emits an all-literals stream (main code over the cluster's byte frequencies, no match tokens), which the dmsdos driver reads back byte-exact. The bitstream is MSB-first within little-endian 16-bit words; codes are canonical and MSB-first. +Stacker 4 (SD-4, cluster header `0x0081`) per-cluster codec, implemented from `docs/CVF-CODECS-ON-DISK.md`. SD-4 is Huffman-coded LZ77: a helper code (code lengths 0..15 and six run tokens) transmits the 336 code lengths of the main code, whose symbols are the 256 literals, 63 short-match tokens, 16 long-match tokens and the end token. Bits are read MSB-first from little-endian 16-bit words; both codes are canonical and complete. | Member | Signature | Summary | | --- | --- | --- | | `Decode` | `static byte[] Decode(byte[] payload, int inLen, int outLen)` | Decodes one SD-4 cluster payload into `outLen` bytes. A stream that ends (end token) before the cluster is full leaves the tail zero. | -| `Encode` | `static byte[] Encode(ReadOnlySpan data)` | | +| `Encode` | `static byte[] Encode(ReadOnlySpan data, int level = 2)` | Encodes one cluster with back-references, Huffman-coded behind a run-length coded code table. | ### Namespace `Compression.Core.Image` diff --git a/Compression.Tests/Cvf/CvfCodecBoundaryTests.cs b/Compression.Tests/Cvf/CvfCodecBoundaryTests.cs new file mode 100644 index 000000000..ab1057dbd --- /dev/null +++ b/Compression.Tests/Cvf/CvfCodecBoundaryTests.cs @@ -0,0 +1,188 @@ +using Compression.Core.FileSystems.Cvf; + +namespace Compression.Tests.Cvf; + +/// +/// Boundary behaviour of every CVF cluster codec (docs/CVF-CODECS-ON-DISK.md): empty and one-byte +/// clusters, the three cluster sizes the volumes use, incompressible data, and the longest match length +/// and farthest distance each grammar can express — one past each must still round-trip, by falling back +/// to a shorter form. +/// +[TestFixture] +public sealed class CvfCodecBoundaryTests { + + private static readonly CvfLzMethod[] AllMethods = [CvfLzMethod.Ds, CvfLzMethod.Jm, CvfLzMethod.Sq, CvfLzMethod.Sd3, CvfLzMethod.Sd4]; + + private static bool IsStacker(CvfLzMethod method) => method is CvfLzMethod.Sd3 or CvfLzMethod.Sd4; + + private static byte[] RoundTrip(byte[] data, CvfLzMethod method, int level = 2) { + var payload = CvfLzCodec.Encode(data, method, level)!; + return IsStacker(method) + ? CvfLzCodec.DecompressStacker(payload, payload.Length, data.Length) + : CvfLzCodec.Decompress(payload, payload.Length, data.Length); + } + + private static byte[] Random(int length, int seed) { + var data = new byte[length]; + new Random(seed).NextBytes(data); + return data; + } + + [Test, Category("Codec")] + public void GivenAnEmptyCluster_WhenEncodedAndDecoded_ThenNothingComesBack([ValueSource(nameof(AllMethods))] CvfLzMethod method) + => Assert.That(RoundTrip([], method), Is.Empty); + + [Test, Category("Codec")] + public void GivenAOneByteCluster_WhenEncodedAndDecoded_ThenTheByteComesBack( + [ValueSource(nameof(AllMethods))] CvfLzMethod method, [Values(0x00, 0x7F, 0x80, 0xFF)] int value) + => Assert.That(RoundTrip([(byte)value], method), Is.EqualTo(new[] { (byte)value })); + + [Test, Category("Codec")] + public void GivenAClusterOfEachVolumeSize_WhenEncodedAndDecoded_ThenItIsByteExact( + [ValueSource(nameof(AllMethods))] CvfLzMethod method, [Values(512, 8192, 32768)] int size, + [Values("text", "zeros", "random")] string shape) { + var data = shape switch { + "zeros" => new byte[size], + "random" => Random(size, size), + _ => CvfSamples.Get("text-32k")[..size], + }; + + Assert.That(RoundTrip(data, method), Is.EqualTo(data)); + } + + [Test, Category("Codec")] + public void GivenIncompressibleData_WhenCompressed_ThenTheCallerIsToldToStoreIt([Values(CvfLzMethod.Ds, CvfLzMethod.Jm, CvfLzMethod.Sq, CvfLzMethod.Sd4)] CvfLzMethod method) + => Assert.That(CvfLzCodec.Compress(Random(8192, 99), method, 2), Is.Null); + + [Test, Category("Codec")] + public void GivenCompressibleData_WhenCompressed_ThenThePayloadIsSmaller([ValueSource(nameof(AllMethods))] CvfLzMethod method) { + var data = CvfSamples.Get("text-8k"); + + Assert.That(CvfLzCodec.Compress(data, method, 2)!.Length, Is.LessThan(data.Length / 2)); + } + + // DS copies at most 512 bytes per match, JM 513; SD-4's long matches extend at 21, 36, 291 and 4386. + [Test, Category("Codec")] + public void GivenARunAroundEachMaximumMatchLength_WhenEncodedAndDecoded_ThenItIsByteExact( + [ValueSource(nameof(AllMethods))] CvfLzMethod method, + [Values(2, 3, 5, 6, 20, 21, 22, 35, 36, 37, 290, 291, 292, 511, 512, 513, 514, 1025, 4385, 4386, 4387, 8191)] int runLength) { + var data = Random(8192 + 64, runLength); + data.AsSpan(17, runLength).Fill(data[16]); // a literal then a run: one long distance-1 match + + Assert.That(RoundTrip(data, method), Is.EqualTo(data)); + } + + // DS/JM reach 4414 (4415 is the sync marker); SD-4 short matches 2047, long ones 2720; SD-3 2047. + [Test, Category("Codec")] + public void GivenARepeatAtEachDistanceBoundary_WhenEncodedAndDecoded_ThenItIsByteExact( + [ValueSource(nameof(AllMethods))] CvfLzMethod method, + [Values(1, 63, 64, 319, 320, 2047, 2048, 2720, 2721, 4414, 4415, 4416)] int distance, + [Values(3, 5, 6, 40)] int length) { + var data = Random(distance + length + 32, distance * 7 + length); + data.AsSpan(8, length).CopyTo(data.AsSpan(8 + distance)); + + Assert.That(RoundTrip(data, method), Is.EqualTo(data)); + } + + [Test, Category("Codec")] + public void GivenADsOrJmPayload_WhenEncoded_ThenItCarriesTheMethodHeaderAndAWholeNumberOfWords( + [Values(CvfLzMethod.Ds, CvfLzMethod.Jm, CvfLzMethod.Sq)] CvfLzMethod method) { + var payload = CvfLzCodec.Encode(CvfSamples.Get("x86-8k"), method, 1)!; + var expected = method switch { CvfLzMethod.Ds => "DS\0\0"u8.ToArray(), CvfLzMethod.Jm => "JM\0\0"u8.ToArray(), _ => "SQ\0\0"u8.ToArray() }; + + Assert.Multiple(() => { + Assert.That(payload[..4], Is.EqualTo(expected)); + Assert.That(payload.Length % 2, Is.Zero); + }); + } + + [Test, Category("Codec")] + public void GivenAutoMethod_WhenEncoded_ThenTheSmallerOfDsAndJmIsKept() { + var data = CvfSamples.Get("table-8k"); + var ds = CvfLzCodec.Encode(data, CvfLzMethod.Ds, 2)!; + var jm = CvfLzCodec.Encode(data, CvfLzMethod.Jm, 2)!; + + Assert.That(CvfLzCodec.Encode(data, CvfLzMethod.Auto, 2)!.Length, Is.EqualTo(Math.Min(ds.Length, jm.Length))); + } + + [Test, Category("Codec")] + public void GivenStoredMethod_WhenEncoded_ThenThereIsNoPayload() + => Assert.That(CvfLzCodec.Encode(CvfSamples.Get("text-8k"), CvfLzMethod.Stored, 2), Is.Null); + + [Test, Category("Codec")] + public void GivenAPayloadPaddedToWholeSectors_WhenDecoded_ThenThePaddingIsIgnored( + [Values(CvfLzMethod.Ds, CvfLzMethod.Jm, CvfLzMethod.Sq)] CvfLzMethod method) { + var data = CvfSamples.Get("dir-8k"); + var payload = CvfLzCodec.Encode(data, method, 2)!; + var padded = new byte[(payload.Length + 511) / 512 * 512]; + payload.CopyTo(padded, 0); + + Assert.That(CvfLzCodec.Decompress(padded, padded.Length, data.Length), Is.EqualTo(data)); + } + + // A file's last cluster may hold fewer sectors than the cluster: its stream closes with the sync and + // the rest of the cluster reads as zero. + [Test, Category("Codec")] + public void GivenAStreamShorterThanTheCluster_WhenDecoded_ThenTheTailIsZero([Values(CvfLzMethod.Ds, CvfLzMethod.Jm)] CvfLzMethod method) { + var data = CvfSamples.Get("text-8k")[..1536]; + var payload = CvfLzCodec.Encode(data, method, 2)!; + + var cluster = CvfLzCodec.Decompress(payload, payload.Length, 8192); + + Assert.Multiple(() => { + Assert.That(cluster[..1536], Is.EqualTo(data)); + Assert.That(cluster[1536..], Is.All.EqualTo((byte)0)); + }); + } + + [Test, Category("Codec")] + public void GivenATruncatedStream_WhenDecoded_ThenItIsRejected([Values(CvfLzMethod.Ds, CvfLzMethod.Jm)] CvfLzMethod method) { + var payload = CvfLzCodec.Encode(CvfSamples.Get("text-8k"), method, 2)!; + + Assert.That(() => CvfLzCodec.Decompress(payload[..(payload.Length / 2)], payload.Length / 2, 8192), Throws.InstanceOf()); + } + + [Test, Category("Codec")] + public void GivenAnUnknownMethodHeader_WhenDecoded_ThenItIsRejected() + => Assert.That(() => CvfLzCodec.Decompress("XY\0\0\0\0\0\0"u8.ToArray(), 8, 512), Throws.InstanceOf()); + + [Test, Category("Codec")] + public void GivenAPayloadShorterThanItsHeader_WhenDecoded_ThenItIsRejected() + => Assert.That(() => CvfLzCodec.Decompress([0x44, 0x53], 2, 512), Throws.InstanceOf()); + + [Test, Category("Codec")] + public void GivenAMatchBeforeTheClusterStart_WhenDecoded_ThenItIsRejected() { + // DS: "0 0" + distance 5 (LSB-first) then a length code — with nothing decoded yet. + var writer = new LsbBitWriter(); + foreach (var b in "DS\0\0"u8) writer.WriteByte(b); + writer.Write(0b00, 2); writer.Write(5, 6); writer.Write(1, 1); + var payload = writer.ToArray(2); + + Assert.That(() => CvfLzCodec.Decompress(payload, payload.Length, 512), Throws.InstanceOf()); + } + + [Test, Category("Codec")] + public void GivenALengthCodeWithNineLeadingZeros_WhenDecoded_ThenItIsRejected() { + var writer = new LsbBitWriter(); + foreach (var b in "JM\0\0"u8) writer.WriteByte(b); + writer.Write(0x41, 8); // literal 'A' ("0" + 7 bits) + writer.Write(0b01, 2); writer.Write(0, 1); writer.Write(1, 6); // match, distance 1 + writer.Write(0, 9); writer.Write(1, 1); // nine zeros: invalid + var payload = writer.ToArray(2); + + Assert.That(() => CvfLzCodec.Decompress(payload, payload.Length, 512), Throws.InstanceOf()); + } + + [Test, Category("Codec")] + public void GivenDifferentLevels_WhenEncoded_ThenEveryLevelRoundTripsAndHigherIsNoLarger( + [Values(CvfLzMethod.Ds, CvfLzMethod.Jm, CvfLzMethod.Sd4)] CvfLzMethod method) { + var data = CvfSamples.Get("x86-8k"); + var sizes = new List(); + foreach (var level in new[] { 1, 2, 3, 4 }) { + Assert.That(RoundTrip(data, method, level), Is.EqualTo(data), $"level {level}"); + sizes.Add(CvfLzCodec.Encode(data, method, level)!.Length); + } + + Assert.That(sizes[^1], Is.LessThanOrEqualTo(sizes[0])); + } +} diff --git a/Compression.Tests/DoubleSpace/DoubleSpaceHugeVolumeTests.cs b/Compression.Tests/DoubleSpace/DoubleSpaceHugeVolumeTests.cs index 9d53e7c56..15e22d666 100644 --- a/Compression.Tests/DoubleSpace/DoubleSpaceHugeVolumeTests.cs +++ b/Compression.Tests/DoubleSpace/DoubleSpaceHugeVolumeTests.cs @@ -41,8 +41,7 @@ public void Large_Volume_RoundTrips_ViaReader() { [Test, Category("DriverProof")] public void Large_Volume_IsReadByRealDmsdosDriver() { - var build = DmsdosCache.EnsureTools(); - if (build is null) Assert.Ignore("dmsdos unavailable."); + DmsdosOracle.Require(); var files = BigSet(150, 16 * 1024, 2); // ~300 clusters var w = new GenuineCvfWriter { CompressionMethod = CvfLzMethod.Auto, CompressionLevel = 1 }; @@ -52,13 +51,12 @@ public void Large_Volume_IsReadByRealDmsdosDriver() { var cvf = Path.Combine(Path.GetTempPath(), $"cwb-dblhuge-{Guid.NewGuid():N}.cvf"); try { File.WriteAllBytes(cvf, image); - var (_, det) = DmsdosCache.RunTool(DmsdosCache.CvfTest(build!), $"\"{cvf}\" -v"); + var det = Encoding.ASCII.GetBytes(DmsdosOracle.Detect(cvf)); Assert.That(Encoding.ASCII.GetString(det), Does.Contain("drivespace CVF (version 2)")); foreach (var idx in new[] { 0, 50, 100, 149 }) { var (name, data) = files[idx]; - var (exit, raw) = DmsdosCache.RunTool(DmsdosCache.DcRead(build!), $"\"{cvf}\" /{name} raw"); + var (exit, payload) = DmsdosOracle.ReadFile(cvf, name); Assert.That(exit, Is.EqualTo(0), $"dcread {name}"); - var payload = DmsdosCache.PayloadAfterDiagnostics(raw); Assert.That(payload.AsSpan(0, data.Length).ToArray(), Is.EqualTo(data), $"{name} byte-exact"); } } finally { try { File.Delete(cvf); } catch { } } diff --git a/Compression.Tests/DriveSpace3/DriveSpace3GenuineDmsdosTests.cs b/Compression.Tests/DriveSpace3/DriveSpace3GenuineDmsdosTests.cs index e26bee17e..7b322a90d 100644 --- a/Compression.Tests/DriveSpace3/DriveSpace3GenuineDmsdosTests.cs +++ b/Compression.Tests/DriveSpace3/DriveSpace3GenuineDmsdosTests.cs @@ -30,9 +30,7 @@ private static (string Name, byte[] Data)[] SampleFiles() { [TestCase(CvfLzMethod.Sq)] [TestCase(CvfLzMethod.Auto)] public void GenuineDvr3_IsMountedAndReadByteExact_ByRealDmsdosDriver(CvfLzMethod method) { - var build = DmsdosCache.EnsureTools(); - if (build is null) - Assert.Ignore("dmsdos tools unavailable (need Linux + git + cmake + C compiler, or set CWB_DMSDOS_BUILD). Skipping driver-proof gate."); + DmsdosOracle.Require(); var files = SampleFiles(); var writer = new GenuineDvr3Writer { CompressionMethod = method, CompressionLevel = 2 }; @@ -44,7 +42,7 @@ public void GenuineDvr3_IsMountedAndReadByteExact_ByRealDmsdosDriver(CvfLzMethod File.WriteAllBytes(cvfPath, image); // 1. Detection: the real driver must recognise it as DriveSpace 3. - var (_, detOut) = DmsdosCache.RunTool(DmsdosCache.CvfTest(build!), $"\"{cvfPath}\" -v"); + var detOut = Encoding.ASCII.GetBytes(DmsdosOracle.Detect(cvfPath)); var detected = Encoding.ASCII.GetString(detOut); Assert.That(detected, Does.Contain("drivespace 3 CVF"), $"dmsdos did not detect a genuine DriveSpace 3 CVF; got: {detected.Trim()}"); @@ -52,9 +50,8 @@ public void GenuineDvr3_IsMountedAndReadByteExact_ByRealDmsdosDriver(CvfLzMethod // 2. Read-back (write proof): every file must decompress byte-exact // through the real driver — i.e. our writer's output is genuine. foreach (var (name, expected) in files) { - var (exit, raw) = DmsdosCache.RunTool(DmsdosCache.DcRead(build!), $"\"{cvfPath}\" /{name} raw"); + var (exit, payload) = DmsdosOracle.ReadFile(cvfPath, name); Assert.That(exit, Is.EqualTo(0), $"dcread failed for {name}"); - var payload = DmsdosCache.PayloadAfterDiagnostics(raw); Assert.That(payload.Length, Is.GreaterThanOrEqualTo(expected.Length), $"dcread returned too few bytes for {name}"); Assert.That(payload.AsSpan(0, expected.Length).ToArray(), Is.EqualTo(expected), diff --git a/Compression.Tests/DriveSpace3/DriveSpace3GenuineMaintenanceTests.cs b/Compression.Tests/DriveSpace3/DriveSpace3GenuineMaintenanceTests.cs index ddc22e12c..25f7566c3 100644 --- a/Compression.Tests/DriveSpace3/DriveSpace3GenuineMaintenanceTests.cs +++ b/Compression.Tests/DriveSpace3/DriveSpace3GenuineMaintenanceTests.cs @@ -70,8 +70,7 @@ public void Add_Then_Remove_RoundTrips() { [Test, Category("DriverProof")] public void RebuiltImage_StillReadByRealDmsdosDriver() { - var build = DmsdosCache.EnsureTools(); - if (build is null) Assert.Ignore("dmsdos unavailable."); + DmsdosOracle.Require(); var d = new DriveSpace3FormatDescriptor(); using var ms = new MemoryStream(); ms.Write(MakeGenuine()); ms.Position = 0; @@ -81,12 +80,11 @@ public void RebuiltImage_StillReadByRealDmsdosDriver() { var cvf = Path.Combine(Path.GetTempPath(), $"cwb-dvr3reb-{Guid.NewGuid():N}.cvf"); try { File.WriteAllBytes(cvf, img); - var (_, det) = DmsdosCache.RunTool(DmsdosCache.CvfTest(build!), $"\"{cvf}\" -v"); + var det = Encoding.ASCII.GetBytes(DmsdosOracle.Detect(cvf)); Assert.That(Encoding.ASCII.GetString(det), Does.Contain("drivespace 3 CVF")); foreach (var (n, data) in Seed) { - var (exit, raw) = DmsdosCache.RunTool(DmsdosCache.DcRead(build!), $"\"{cvf}\" /{n} raw"); + var (exit, payload) = DmsdosOracle.ReadFile(cvf, n); Assert.That(exit, Is.EqualTo(0), $"dcread {n}"); - var payload = DmsdosCache.PayloadAfterDiagnostics(raw); Assert.That(payload.AsSpan(0, data.Length).ToArray(), Is.EqualTo(data), $"{n} byte-exact after rebuild"); } } finally { try { File.Delete(cvf); } catch { } } diff --git a/Compression.Tests/DriveSpace3/DriveSpace3HugeVolumeTests.cs b/Compression.Tests/DriveSpace3/DriveSpace3HugeVolumeTests.cs index bda8d7eda..01bf2fa30 100644 --- a/Compression.Tests/DriveSpace3/DriveSpace3HugeVolumeTests.cs +++ b/Compression.Tests/DriveSpace3/DriveSpace3HugeVolumeTests.cs @@ -68,8 +68,7 @@ public void Large_Volume_FullReadWrite_AddRemove_ViaDescriptor() { [Test, Category("DriverProof")] public void Large_Volume_IsReadByRealDmsdosDriver() { - var build = DmsdosCache.EnsureTools(); - if (build is null) Assert.Ignore("dmsdos unavailable."); + DmsdosOracle.Require(); var files = BigSet(120, 64 * 1024, 2); // ~240 clusters, mixed var w = new GenuineDvr3Writer { CompressionMethod = CvfLzMethod.Auto, CompressionLevel = 1 }; @@ -79,14 +78,13 @@ public void Large_Volume_IsReadByRealDmsdosDriver() { var cvf = Path.Combine(Path.GetTempPath(), $"cwb-dvr3huge-{Guid.NewGuid():N}.cvf"); try { File.WriteAllBytes(cvf, image); - var (_, det) = DmsdosCache.RunTool(DmsdosCache.CvfTest(build!), $"\"{cvf}\" -v"); + var det = Encoding.ASCII.GetBytes(DmsdosOracle.Detect(cvf)); Assert.That(Encoding.ASCII.GetString(det), Does.Contain("drivespace 3 CVF")); // sample a handful across the volume foreach (var idx in new[] { 0, 37, 80, 119 }) { var (name, data) = files[idx]; - var (exit, raw) = DmsdosCache.RunTool(DmsdosCache.DcRead(build!), $"\"{cvf}\" /{name} raw"); + var (exit, payload) = DmsdosOracle.ReadFile(cvf, name); Assert.That(exit, Is.EqualTo(0), $"dcread {name}"); - var payload = DmsdosCache.PayloadAfterDiagnostics(raw); Assert.That(payload.AsSpan(0, data.Length).ToArray(), Is.EqualTo(data), $"{name} byte-exact"); } } finally { try { File.Delete(cvf); } catch { } } diff --git a/Compression.Tests/ExternalFsInteropTests.cs b/Compression.Tests/ExternalFsInteropTests.cs index 616ce7d8f..772c3b401 100644 --- a/Compression.Tests/ExternalFsInteropTests.cs +++ b/Compression.Tests/ExternalFsInteropTests.cs @@ -2303,9 +2303,7 @@ public void DoubleSpace_OurImage_DmsdosAccepts(Compression.Core.FileSystems.Cvf. // mount it, and read every file back byte-exact. The feature-rich // DoubleSpaceWriter emits a self-consistent (non-genuine) layout; the // driver-genuine emitter is GenuineCvfWriter, proven here. - var build = DmsdosCache.EnsureTools(); - if (build is null) - Assert.Ignore("dmsdos tools unavailable (need Linux + git + cmake + C compiler, or set CWB_DMSDOS_BUILD)."); + DmsdosOracle.Require(); var files = new (string Name, byte[] Data)[] { ("HELLO.TXT", SmallText), @@ -2318,14 +2316,13 @@ public void DoubleSpace_OurImage_DmsdosAccepts(Compression.Core.FileSystems.Cvf. var cvfPath = Path.Combine(this._tmpDir, "dblspace_genuine.cvf"); File.WriteAllBytes(cvfPath, image); - var (_, det) = DmsdosCache.RunTool(DmsdosCache.CvfTest(build!), $"\"{cvfPath}\" -v"); + var det = Encoding.ASCII.GetBytes(DmsdosOracle.Detect(cvfPath)); Assert.That(Encoding.ASCII.GetString(det), Does.Contain("drivespace CVF (version 2)"), "dmsdos did not detect our CVF as a genuine DoubleSpace/DriveSpace v2 volume"); foreach (var (name, expected) in files) { - var (exit, raw) = DmsdosCache.RunTool(DmsdosCache.DcRead(build!), $"\"{cvfPath}\" /{name} raw"); + var (exit, payload) = DmsdosOracle.ReadFile(cvfPath, name); Assert.That(exit, Is.EqualTo(0), $"dcread failed for {name}"); - var payload = DmsdosCache.PayloadAfterDiagnostics(raw); Assert.That(payload.Length, Is.GreaterThanOrEqualTo(expected.Length), $"short read for {name}"); Assert.That(payload.AsSpan(0, expected.Length).ToArray(), Is.EqualTo(expected), $"{name} did not read back byte-exact through the dmsdos driver"); diff --git a/Compression.Tests/Stacker/GenuineStackerCodecOracleTests.cs b/Compression.Tests/Stacker/GenuineStackerCodecOracleTests.cs new file mode 100644 index 000000000..4db2bebb1 --- /dev/null +++ b/Compression.Tests/Stacker/GenuineStackerCodecOracleTests.cs @@ -0,0 +1,187 @@ +using System.Text; +using Compression.Core.FileSystems.Cvf; +using Compression.Tests.Cvf; +using Compression.Tests.Support; +using FileSystem.Stacker; + +namespace Compression.Tests.Stacker; + +/// +/// Stacker cluster codecs against the dmsdos driver as a black box (Linux natively, Windows through +/// WSL): volumes our writer builds must read back byte-exact through dcread and through our own +/// reader. Covers the SD-4 encoder with back-references and the whole-cluster ForceCompress case. +/// +[TestFixture] +public sealed class GenuineStackerCodecOracleTests { + private const int ClusterBytes = 8192; + + private string _dir = null!; + + [SetUp] + public void SetUp() => Directory.CreateDirectory(this._dir = Path.Combine(Path.GetTempPath(), $"cwb-stac-oracle-{Guid.NewGuid():N}")); + + [TearDown] + public void TearDown() { + try { Directory.Delete(this._dir, true); } catch (IOException) { /* best effort */ } + } + + private static byte[] Build(CvfLzMethod method, bool force, params (string Name, byte[] Data)[] files) { + var writer = new GenuineStackerWriter { CompressionMethod = method, CompressionLevel = 3, ForceCompress = force }; + foreach (var (n, d) in files) writer.AddFile(n, d); + return writer.Build(); + } + + private static void AssertOurReaderReads(byte[] image, (string Name, byte[] Data)[] files) { + using var reader = new GenuineStackerReader(new MemoryStream(image)); + foreach (var (name, expected) in files) + Assert.That(reader.Extract(reader.Entries.Single(e => e.Name == name)), Is.EqualTo(expected), $"our reader: {name}"); + } + + private void AssertDmsdosReads(byte[] image, (string Name, byte[] Data)[] files) { + var path = Path.Combine(this._dir, "stac.cvf"); + File.WriteAllBytes(path, image); + Assert.That(DmsdosOracle.Detect(path), Does.Contain("stacker"), "dmsdos does not detect the volume"); + foreach (var (name, expected) in files) { + var (exit, data) = DmsdosOracle.ReadFile(path, name); + Assert.That(exit, Is.Zero, $"dcread failed for {name}"); + Assert.That(data.Length, Is.GreaterThanOrEqualTo(expected.Length), $"dcread returned too few bytes for {name}"); + Assert.That(data[..expected.Length], Is.EqualTo(expected), $"dmsdos: {name}"); + } + } + + /// A cluster whose SD-3 payload needs all 16 sectors: 15 sectors < payload ≤ 16 sectors. + internal static byte[] WholeClusterPayloadData() { + var random = new byte[ClusterBytes]; + new Random(4711).NextBytes(random); + int lo = 0, hi = ClusterBytes; // number of random bytes; the rest repeats one byte + while (lo < hi) { + var mid = (lo + hi) / 2; + var size = Sd3Codec.Encode(Mix(random, mid)).Length; + if (size <= 15 * 512) lo = mid + 1; else hi = mid; + } + var data = Mix(random, lo); + var sectors = (Sd3Codec.Encode(data).Length + 511) / 512; + Assume.That(sectors, Is.EqualTo(16), "could not construct a whole-cluster SD-3 payload"); + return data; + + static byte[] Mix(byte[] random, int count) { + var d = new byte[ClusterBytes]; + random.AsSpan(0, count).CopyTo(d); + return d; + } + } + + [Test, Category("Codec")] + public void GivenForceCompress_WhenACompressedClusterNeedsAllSectors_ThenItIsStoredAndReadsBackExact() { + var data = WholeClusterPayloadData(); + (string, byte[])[] files = [("FULL.BIN", data)]; + + var image = Build(CvfLzMethod.Sd3, force: true, files); + + AssertOurReaderReads(image, files); + } + + [Test, Category("DriverProof")] + public void GivenForceCompress_WhenACompressedClusterNeedsAllSectors_ThenDmsdosReadsItBackExact() { + DmsdosOracle.Require(); + (string, byte[])[] files = [("FULL.BIN", WholeClusterPayloadData())]; + + AssertDmsdosReads(Build(CvfLzMethod.Sd3, force: true, files), files); + } + + private static (string, byte[])[] CodecSamples() { + var text = Encoding.ASCII.GetBytes(string.Concat(Enumerable.Repeat("SD-4 encoder verification line with some repetition.\r\n", 600))); + var runs = new byte[3 * ClusterBytes]; + for (var i = 0; i < runs.Length; ++i) runs[i] = (byte)(i / 5000); // long matches: every extension + return [ + ("TEXT.TXT", text), + ("RUNS.BIN", runs), + ("SAMPTEXT.TXT", CvfSamples.Get("text-8k")), + ("SAMPX86.BIN", CvfSamples.Get("x86-8k")), + ("SAMPTAB.BIN", CvfSamples.Get("table-8k")), + ("SAMPALPH.BIN", CvfSamples.Get("alphabet-8k")), + ("SAMPDIR.BIN", CvfSamples.Get("dir-8k")), + ("ONE.BIN", [0x5A]), + ]; + } + + [Test, Category("DriverProof")] + public void GivenSd4ClustersWithBackReferences_WhenReadByDmsdos_ThenEveryFileIsByteExact([Values(CvfLzMethod.Sd4, CvfLzMethod.Auto)] CvfLzMethod method) { + DmsdosOracle.Require(); + var files = CodecSamples(); + var image = Build(method, force: false, files); + + AssertDmsdosReads(image, files); + AssertOurReaderReads(image, files); + } + + /// + /// One cluster whose byte counts grow just faster than Fibonacci (1, 1, 3, 5, 9, 15, … 1973, each + /// the sum of the two before plus one, so no tie lets a code stay shallow), the rest one more value: + /// an optimal code over them is 16 bits deep, so a literals-only SD-4 stream needs the full 15-bit + /// limit. + /// + internal static byte[] SkewedCluster() { + var data = new List(ClusterBytes); + int a = 1, b = 1; + for (var symbol = 0; symbol < 16; ++symbol, (a, b) = (b, a + b + 1)) + data.AddRange(Enumerable.Repeat((byte)(symbol * 13), a)); + data.AddRange(Enumerable.Repeat((byte)250, ClusterBytes - data.Count)); + var array = data.ToArray(); + new Random(1).Shuffle(array); + return array; + } + + // The 5-bit "last" field after the signature word is the longest main-code length. + private static int LongestMainCode(byte[] payload) => (payload[2] | payload[3] << 8) >> 8 & 0x1F; + + [Test, Category("Codec")] + public void GivenSkewedLiterals_WhenSd4Encoded_ThenTheMainCodeUsesTheFull15BitsAndRoundTrips() { + var data = SkewedCluster(); + var payload = Sd4Codec.Encode(data, level: 2, matches: false); + + Assert.Multiple(() => { + Assert.That(LongestMainCode(payload), Is.EqualTo(15)); + Assert.That(Sd4Codec.Decode(payload, payload.Length, data.Length), Is.EqualTo(data)); + }); + } + + // A stored volume whose one cluster is then rewritten as a compressed run holding the given payload. + private static byte[] VolumeWithClusterPayload(byte[] cluster, byte[] payload) { + var image = Build(CvfLzMethod.Stored, force: false, ("SKEW.BIN", cluster)); + const int amapEntry = (2 + 3) * 512 + 2 * 3; // AMAP area 0 for cluster 2 (FAT start 2) + var sector = image[amapEntry] | image[amapEntry + 1] << 8; + var sectors = (payload.Length + 511) / 512; + Assume.That(sectors, Is.LessThan(16), "payload must be shorter than the cluster"); + Array.Clear(image, sector * 512, 16 * 512); + payload.CopyTo(image, sector * 512); + image[amapEntry + 2] = (byte)(sectors - 1); // flags 0: compressed + return image; + } + + [Test, Category("Codec")] + public void GivenAPatchedSd4Cluster_WhenReadByOurReader_ThenItIsByteExact() { + var data = SkewedCluster(); + (string, byte[])[] files = [("SKEW.BIN", data)]; + + AssertOurReaderReads(VolumeWithClusterPayload(data, Sd4Codec.Encode(data, 2, matches: false)), files); + } + + [Test, Category("DriverProof")] + public void GivenSd4CodesOf15Bits_WhenReadByDmsdos_ThenTheClusterIsByteExact() { + DmsdosOracle.Require(); + var data = SkewedCluster(); + (string, byte[])[] files = [("SKEW.BIN", data)]; + + AssertDmsdosReads(VolumeWithClusterPayload(data, Sd4Codec.Encode(data, 2, matches: false)), files); + } + + [Test, Category("Codec")] + public void GivenSd4Clusters_WhenEncoded_ThenTheyAreWithinTenPercentOfTheDmsdosEncoder( + [Values("text-8k", "x86-8k", "table-8k", "alphabet-8k", "dir-8k")] string sample) { + var ours = Sd4Codec.Encode(CvfSamples.Get(sample), level: 3).Length; + var theirs = CvfReferenceVectorTests.Load($"{sample}.sd4").Length; + + Assert.That(ours, Is.LessThanOrEqualTo(theirs * 11 / 10), $"ours {ours} B, dmsdos {theirs} B"); + } +} diff --git a/Compression.Tests/Stacker/GenuineStackerDmsdosTests.cs b/Compression.Tests/Stacker/GenuineStackerDmsdosTests.cs index efa89ffb3..439273de3 100644 --- a/Compression.Tests/Stacker/GenuineStackerDmsdosTests.cs +++ b/Compression.Tests/Stacker/GenuineStackerDmsdosTests.cs @@ -30,9 +30,7 @@ private static (string Name, byte[] Data)[] SampleFiles() { [TestCase(CvfLzMethod.Sd3)] [TestCase(CvfLzMethod.Auto)] public void GenuineStacker_IsMountedAndReadByteExact_ByRealDmsdosDriver(CvfLzMethod method) { - var build = DmsdosCache.EnsureTools(); - if (build is null) - Assert.Ignore("dmsdos tools unavailable (need Linux + git + cmake + C compiler, or set CWB_DMSDOS_BUILD). Skipping driver-proof gate."); + DmsdosOracle.Require(); var files = SampleFiles(); var writer = new GenuineStackerWriter { CompressionMethod = method, CompressionLevel = 2 }; @@ -44,16 +42,15 @@ public void GenuineStacker_IsMountedAndReadByteExact_ByRealDmsdosDriver(CvfLzMet File.WriteAllBytes(cvfPath, image); // 1. Detection. - var (_, detOut) = DmsdosCache.RunTool(DmsdosCache.CvfTest(build!), $"\"{cvfPath}\" -v"); + var detOut = Encoding.ASCII.GetBytes(DmsdosOracle.Detect(cvfPath)); var detected = Encoding.ASCII.GetString(detOut); Assert.That(detected, Does.Contain("stacker version 3 CVF"), $"dmsdos did not detect a genuine Stacker 3 CVF; got: {detected.Trim()}"); // 2. Write proof: the real driver reads every file back byte-exact. foreach (var (name, expected) in files) { - var (exit, raw) = DmsdosCache.RunTool(DmsdosCache.DcRead(build!), $"\"{cvfPath}\" /{name} raw"); + var (exit, payload) = DmsdosOracle.ReadFile(cvfPath, name); Assert.That(exit, Is.EqualTo(0), $"dcread failed for {name}"); - var payload = DmsdosCache.PayloadAfterDiagnostics(raw); Assert.That(payload.Length, Is.GreaterThanOrEqualTo(expected.Length), $"dcread returned too few bytes for {name}"); Assert.That(payload.AsSpan(0, expected.Length).ToArray(), Is.EqualTo(expected), diff --git a/Compression.Tests/Stacker/StackerHugeVolumeTests.cs b/Compression.Tests/Stacker/StackerHugeVolumeTests.cs index eeb6b1fd6..1eb1abd9a 100644 --- a/Compression.Tests/Stacker/StackerHugeVolumeTests.cs +++ b/Compression.Tests/Stacker/StackerHugeVolumeTests.cs @@ -40,8 +40,7 @@ public void Above512Clusters_RoundTrips_ViaReader() { [Test, Category("DriverProof")] public void Above512Clusters_IsReadByRealDmsdosDriver() { - var build = DmsdosCache.EnsureTools(); - if (build is null) Assert.Ignore("dmsdos unavailable."); + DmsdosOracle.Require(); var files = BigSet(300, 16 * 1024, 2); // ~600 clusters var w = new GenuineStackerWriter { CompressionMethod = CvfLzMethod.Auto, CompressionLevel = 1 }; @@ -51,13 +50,12 @@ public void Above512Clusters_IsReadByRealDmsdosDriver() { var cvf = Path.Combine(Path.GetTempPath(), $"cwb-stachuge-{Guid.NewGuid():N}.cvf"); try { File.WriteAllBytes(cvf, image); - var (_, det) = DmsdosCache.RunTool(DmsdosCache.CvfTest(build!), $"\"{cvf}\" -v"); + var det = Encoding.ASCII.GetBytes(DmsdosOracle.Detect(cvf)); Assert.That(Encoding.ASCII.GetString(det), Does.Contain("stacker")); foreach (var idx in new[] { 0, 100, 200, 299 }) { var (name, data) = files[idx]; - var (exit, raw) = DmsdosCache.RunTool(DmsdosCache.DcRead(build!), $"\"{cvf}\" /{name} raw"); + var (exit, payload) = DmsdosOracle.ReadFile(cvf, name); Assert.That(exit, Is.EqualTo(0), $"dcread {name}"); - var payload = DmsdosCache.PayloadAfterDiagnostics(raw); Assert.That(payload.AsSpan(0, data.Length).ToArray(), Is.EqualTo(data), $"{name} byte-exact"); } } finally { try { File.Delete(cvf); } catch { } } diff --git a/Compression.Tests/Support/DmsdosOracle.cs b/Compression.Tests/Support/DmsdosOracle.cs new file mode 100644 index 000000000..94a1465e5 --- /dev/null +++ b/Compression.Tests/Support/DmsdosOracle.cs @@ -0,0 +1,53 @@ +namespace Compression.Tests.Support; + +/// +/// The GPL dmsdos tools as a black-box oracle on any host: natively on Linux (built by +/// ), through WSL on Windows (cloned and built once under +/// ~/.cache/cwb-dmsdos inside the distro). Only the tools' behaviour is used — volumes go in, +/// detection text and file contents come out. +/// +internal static class DmsdosOracle { + private static readonly Lazy Build = new(Locate); + + /// Skips the calling test when the tools cannot be had on this machine. + public static void Require() { + if (Build.Value is null) + Assert.Ignore("dmsdos tools unavailable (need Linux or WSL with git + cmake + a C compiler, or CWB_DMSDOS_BUILD)."); + } + + /// What cvftest -v makes of the volume. + public static string Detect(string cvfPath) + => FsInteropToolbox.RunWsl($"'{Build.Value}/cvftest' {FsInteropToolbox.WinToWsl(cvfPath)} -v 2>&1").StdOut; + + /// + /// Reads from the root of the volume with dcread … raw; the bytes are + /// the whole clusters the driver decoded, so callers compare the first file-size bytes. + /// + public static (int Exit, byte[] Data) ReadFile(string cvfPath, string name) { + var outFile = $"{cvfPath}.{name}.out"; + try { + var r = FsInteropToolbox.RunWsl( + $"'{Build.Value}/dcread' {FsInteropToolbox.WinToWsl(cvfPath)} /{name} raw > {FsInteropToolbox.WinToWsl(outFile)} 2>/dev/null"); + var raw = File.Exists(outFile) ? File.ReadAllBytes(outFile) : []; + return (r.ExitCode, DmsdosCache.PayloadAfterDiagnostics(raw)); + } finally { + try { File.Delete(outFile); } catch (IOException) { /* best effort */ } + } + } + + private static string? Locate() { + if (!OperatingSystem.IsWindows()) return DmsdosCache.EnsureTools(); + if (!FsInteropToolbox.WslAvailable) return null; + + const string script = + "set -e; d=$HOME/.cache/cwb-dmsdos; " + + "if [ ! -x $d/build/dcread ] || [ ! -x $d/build/cvftest ]; then " + + "command -v git >/dev/null && command -v cmake >/dev/null && command -v cc >/dev/null; " + + "mkdir -p $d; [ -d $d/src/.git ] || git clone -q --depth 1 " + DmsdosCache.RepoUrl + " $d/src; " + + "cmake -S $d/src -B $d/build -DCMAKE_BUILD_TYPE=Release -DCMAKE_POLICY_VERSION_MINIMUM=3.5 >/dev/null 2>&1; " + + "cmake --build $d/build -j 2 >/dev/null 2>&1; fi; echo $d/build"; + var result = FsInteropToolbox.RunWsl(script); + var lines = result.StdOut.Split('\n', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); + return result.ExitCode == 0 && lines.Length > 0 ? lines[^1] : null; + } +} diff --git a/Hawkynt.FileFormats.FileSystems/FileSystems/FileSystem.DriveSpace3/GenuineDvr3Writer.cs b/Hawkynt.FileFormats.FileSystems/FileSystems/FileSystem.DriveSpace3/GenuineDvr3Writer.cs index 97ae13e73..bff647676 100644 --- a/Hawkynt.FileFormats.FileSystems/FileSystems/FileSystem.DriveSpace3/GenuineDvr3Writer.cs +++ b/Hawkynt.FileFormats.FileSystems/FileSystems/FileSystem.DriveSpace3/GenuineDvr3Writer.cs @@ -66,6 +66,8 @@ public sealed class GenuineDvr3Writer { /// smaller of compressed/stored is chosen per cluster (auto-best).
public bool ForceCompress { get; init; } + private static byte[] Smaller(byte[] a, byte[] b) => b.Length < a.Length ? b : a; + /// Adds a file to the root directory of the compressed volume. public void AddFile(string name, byte[] data) { ArgumentNullException.ThrowIfNull(name); @@ -120,7 +122,10 @@ public byte[] Build() { var physCursor = physDataStart; var layout = new List(); foreach (var (cl, full) in clusterFull) { - var comp = CvfLzCodec.Encode(full, this.CompressionMethod, this.CompressionLevel); + // Auto covers every codec a DriveSpace 3 volume reads: DS/JM (the codec's Auto) and SQ. + var comp = this.CompressionMethod == CvfLzMethod.Auto + ? Smaller(CvfLzCodec.Encode(full, CvfLzMethod.Auto, this.CompressionLevel)!, CvfLzCodec.Encode(full, CvfLzMethod.Sq, this.CompressionLevel)!) + : CvfLzCodec.Encode(full, this.CompressionMethod, this.CompressionLevel); var ksize = comp is null ? Spc : (comp.Length + Ss - 1) / Ss; if (comp is not null && ksize <= Spc && (ksize < Spc || this.ForceCompress)) { layout.Add(new ClusterPlan(cl, comp, ksize, true, physCursor)); diff --git a/Hawkynt.FileFormats.FileSystems/FileSystems/FileSystem.Stacker/FORMAT-NOTES.md b/Hawkynt.FileFormats.FileSystems/FileSystems/FileSystem.Stacker/FORMAT-NOTES.md index b1d46e809..687195d16 100644 --- a/Hawkynt.FileFormats.FileSystems/FileSystems/FileSystem.Stacker/FORMAT-NOTES.md +++ b/Hawkynt.FileFormats.FileSystems/FileSystems/FileSystem.Stacker/FORMAT-NOTES.md @@ -12,7 +12,7 @@ > [`docs/CVF-CODECS-ON-DISK.md`](../../../docs/CVF-CODECS-ON-DISK.md). The reader > decodes the full SD-4 format (run tokens, short and long matches), pinned to > clusters the dmsdos SD-3/SD-4 compressors wrote (`CvfReferenceVectorTests`); the -> writer's SD-4 output is literals-only. The AMAP flag nibble is honoured: +> writer's SD-4 output uses back-references and run-coded tables, read back by dmsdos. The AMAP flag nibble is honoured: > fragmented and suballocated clusters are refused, not guessed at. > - **The legacy `StackerWriter` (invented `STKMAP01` trailer) is NOT genuine:** > `dmsdos` panics on it. It is retained only for self-round-trip. diff --git a/Hawkynt.FileFormats.FileSystems/FileSystems/FileSystem.Stacker/GenuineStackerWriter.cs b/Hawkynt.FileFormats.FileSystems/FileSystems/FileSystem.Stacker/GenuineStackerWriter.cs index 718afd2d2..fe11ba9dc 100644 --- a/Hawkynt.FileFormats.FileSystems/FileSystems/FileSystem.Stacker/GenuineStackerWriter.cs +++ b/Hawkynt.FileFormats.FileSystems/FileSystems/FileSystem.Stacker/GenuineStackerWriter.cs @@ -74,7 +74,10 @@ public sealed class GenuineStackerWriter { /// Codec effort (search depth). Higher = better ratio, slower. public int CompressionLevel { get; init; } = 1; - /// Keep a compressed cluster even if it does not shrink (auto-best off). + /// Keep a compressed cluster even if it does not shrink (auto-best off). Stacker cannot + /// record a compressed run that fills a whole cluster — such a run reads as stored — so a payload that + /// needs every sector of its cluster is stored raw regardless; any shorter payload is kept compressed + /// either way, which leaves this option without effect on Stacker volumes. public bool ForceCompress { get; init; } private readonly List<(string Name, byte[] Data)> _files = []; @@ -147,7 +150,9 @@ public byte[] Build() { _ => CvfLzCodec.Encode(full, CvfLzMethod.Ds, this.CompressionLevel), }; var ksize = comp is null ? Spc : (comp.Length + Ss - 1) / Ss; - if (comp is not null && ksize < Spc || (comp is not null && this.ForceCompress && ksize <= Spc)) { + // A run as long as the cluster always reads as stored (the AMAP has no flag for a whole-cluster + // compressed run), so a payload needing all Spc sectors is stored raw even under ForceCompress. + if (comp is not null && ksize < Spc) { layout.Add(new ClusterPlan(cl, comp!, ksize, physCursor)); physCursor += ksize; } else { diff --git a/Hawkynt.FileFormats.FileSystems/FileSystems/FileSystem.Stacker/StackerFormatDescriptor.cs b/Hawkynt.FileFormats.FileSystems/FileSystems/FileSystem.Stacker/StackerFormatDescriptor.cs index 63e9ac31f..be615e7ae 100644 --- a/Hawkynt.FileFormats.FileSystems/FileSystems/FileSystem.Stacker/StackerFormatDescriptor.cs +++ b/Hawkynt.FileFormats.FileSystems/FileSystems/FileSystem.Stacker/StackerFormatDescriptor.cs @@ -154,7 +154,8 @@ public sealed class StackerFormatDescriptor : IFormatDescriptor, IArchiveFormatO new FormatOptionDescriptor( Key: "ForceCompress", DisplayName: "Force compression", Kind: FormatOptionKind.Boolean, Default: "false", - Description: "Keep the compressed form even when it does not shrink a cluster.", + Description: "Keep the compressed form even when it does not shrink a cluster. A compressed run " + + "filling a whole cluster cannot be told from a stored one on Stacker, so such a cluster is still stored.", DependsOn: "Compatibility=Genuine"), ]; diff --git a/Hawkynt.FileFormats.FileSystems/REFERENCE.md b/Hawkynt.FileFormats.FileSystems/REFERENCE.md index 446cc52d5..a53eb4bf9 100644 --- a/Hawkynt.FileFormats.FileSystems/REFERENCE.md +++ b/Hawkynt.FileFormats.FileSystems/REFERENCE.md @@ -12929,7 +12929,7 @@ Builds a genuine Stac Electronics STACVOL — the on-disk shape a real Stacker d | `GenuineStackerWriter` | `GenuineStackerWriter()` | | | `CompressionLevel` | `int CompressionLevel { get; init; }` | Codec effort (search depth). Higher = better ratio, slower. | | `CompressionMethod` | `CvfLzMethod CompressionMethod { get; init; }` | Per-cluster compression: Stored (default), Sd3 (Stacker 3), Sd4 (Stacker 4), Ds, or Auto (smallest of Ds/Sd3/Sd4 per cluster). The Stacker driver tells them apart by the payload's first word — 0x0081 SD-4, 0x5344 ("DS") the DoubleSpace codec, anything else SD-3. JM/SQ map to Ds. | -| `ForceCompress` | `bool ForceCompress { get; init; }` | Keep a compressed cluster even if it does not shrink (auto-best off). | +| `ForceCompress` | `bool ForceCompress { get; init; }` | Keep a compressed cluster even if it does not shrink (auto-best off). Stacker cannot record a compressed run that fills a whole cluster — such a run reads as stored — so a payload that needs every sector of its cluster is stored raw regardless; any shorter payload is kept compressed either way, which leaves this option without effect on Stacker volumes. | | `Timestamp` | `DateTime Timestamp { get; init; }` | Creation/modification timestamp stamped on every file entry. Default (before 1980) leaves the FAT date/time fields zero. | | `Version` | `int Version { get; init; }` | Stacker major version recorded in the decoded superblock (< 410 ⇒ v3). | | `VolumeLabel` | `string VolumeLabel { get; init; }` | Optional inner-volume label (≤11 chars). Empty = no label entry. | diff --git a/docs/CVF-CODECS-ON-DISK.md b/docs/CVF-CODECS-ON-DISK.md index b2c7052ed..26b757432 100644 --- a/docs/CVF-CODECS-ON-DISK.md +++ b/docs/CVF-CODECS-ON-DISK.md @@ -3,7 +3,8 @@ The per-cluster compression formats of the DOS compressed-volume family: Microsoft DoubleSpace / DriveSpace (DS-0-x, JM-0-x), DriveSpace 3 (JM-0-1 "High", SQ-0-0 "Ultra") and Stac Stacker (SD-3, SD-4). `Compression.Core.FileSystems.Cvf` (`CvfLzCodec`, `Sd3Codec`, -`Sd4Codec`) implements this document; the container layouts (MDFAT, AMAP, BitFAT) live in the +`Sd4Codec`) implements this document — it was written from this document and the reference vectors +alone, with dmsdos run only as a black box; the container layouts (MDFAT, AMAP, BitFAT) live in the `FORMAT-NOTES.md` beside each file-system reader. ## 📚 Provenance @@ -45,6 +46,10 @@ its kind), together with whether the run fills a whole cluster: | 1 | 0 | **fragmented** (first sector starts `0xED`, piece count, 4-byte piece list) | stored (directory) | | 1 | 1 | **suballocated** (signature `0x1234` at the sector end) | suballocated | +A compressed cluster can therefore never occupy all of its cluster's sectors: a run that long reads +as stored whatever its content (the table above). A writer whose +compressed payload needs every sector stores the cluster raw instead. + Fragmented and suballocated clusters are refused by `GenuineStackerReader` — no sample of either has been verified. @@ -85,6 +90,17 @@ decoder does not require the final sync. Copies may overlap (distance shorter than length) and are performed byte by byte. +**Measured: one sync per sector.** In all 16 DS/JM reference streams (8 KiB and 32 KiB clusters) +the dmsdos compressors emit a sync after every 512 decoded bytes, not only after the last one, and +no match runs across a 512-byte boundary (0 of all matches) — distances do reach back across +boundaries (up to 4414). Our encoder writes the same shape. The decoder accepts syncs anywhere. + +**A cluster shorter than its nominal size** (a file's last cluster, MDFAT decoded size below the +cluster) ends with a sync followed by nothing but zero padding; decoding stops there and the rest of +the cluster reads as zero. A sync with non-zero bits behind it is a mid-stream marker and decoding +continues. Stacker's use of the DS grammar also ends where the stream runs out or reaches its zero +padding (a `0 0` token with distance 0). + ## 🔢 SQ-0-0 Bytes `53 51` ("SQ"), a 16-bit version (0), then a raw **RFC 1951 DEFLATE** stream: the same block @@ -166,6 +182,12 @@ is extended by 4 bits; if the sum is 36, by 8 more; at 291 by 12 more; at 4386 b not needed to recover the data). A match reaching before the cluster start is invalid; a final match longer than the space left is clipped. +**Our encoder** emits short and long matches (all four length extensions), literals and the end +token; it transmits the code lengths with all six run tokens and builds both codes with package-merge +(optimal, length-limited, always complete). Measured: dmsdos reads main codes 15 bits deep +(`GivenSd4CodesOf15Bits_WhenReadByDmsdos_ThenTheClusterIsByteExact`), so the encoder uses the format's +full 15-bit limit for both codes. + ## ✅ Verification * `Compression.Tests/Cvf/ReferenceVectors/` — 32 cluster payloads written by the dmsdos @@ -179,8 +201,6 @@ match longer than the space left is clipped. ## ⚠️ Not covered -* **Our SD-4 encoder emits literals only.** The decoder reads the whole format; an encoder that - emits match and run tokens has not been written. * **DriveSpace 3 fragmented clusters** (an MDFAT flag dmsdos itself describes as guessed) and **Stacker fragmented / suballocated clusters** are not read. * No Microsoft or Stac tool has produced or read any of these streams on this machine. From 148a6229d322df75d7381b2713a2c6065050d9aa Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 26 Oct 2026 12:08:07 +0000 Subject: [PATCH 26/48] * refresh the archive browser screenshot --- docs/screenshots/archive-browser.png | Bin 66518 -> 66630 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/screenshots/archive-browser.png b/docs/screenshots/archive-browser.png index de88d7dd43f38a733fe5557dd0e66b254aa140ee..27445a0db06cc4a4e7e4207f9b8865c437514210 100644 GIT binary patch delta 28390 zcmcG01yoe)8n)+pR1i@FDG@oebc3`G0!k_=-5_1kv5i4RN<=`w0TJmKkZz=qbKjV=iYy<|7W>mnAx-Ai}!oqC%&GSKi9tcIrHs1DB)&1^Cz5VH!QRUi_R_M zuBBV+)L2tGVMW_7st+gKd|=+4l0z(M-z8+Jb^AWSZ5C>}TRVrrM>P0VH|LfVk1+Sk55haqPi{B()QfXVh$ZpPwUHbO8qHjD_kbt7Bg}`wc9V84U;X-EG#Tsfw8UZ z*Kug`|ThJK3Rh-E@oU7Sx$KgG~!nKdaaknWq9Z z;9|=|^8G~yhe7AI)X}=uD{Tgm*&8)Aeh242>~7BVcP82l6j}F>?AR<7%~D;0 zh{{APdKE&MrT5K}a<*$%ku*PZP zj2cHqhQbHTy-{lgoZK*0y;x}Mnrfg-a+mkJwVbqfM04R)JRyOm3{<_l#__eGLy;}? zaRSE&ET4}Pf0D;6^b})v@kn{U21`_pK(;+i9UUF*U#XKM_8Y^|kH+=T4}03sPYVm( zLK{MbofZk8Wf9srd=s6Pp`L+`o`EkV@ewM_-;|8QwMVL}KWl}zAYM^GL!O2c<+Zh8 z9C|hf@7wc3Lhu;gXi7;*En`b~L>B$>(zTi+h4uCg{VSvbu8X+3&TV6S2sAWaL(kjA zA77l`Q5ocOA3`>&gXiLIZtO+7l(%_ocZ}>8_-sk_-|I{`#;*Tlk*k?VHt`cj=OzV| zbFf1zeeRs2I6l#ANLH4GT9@wh>E}hdy3x57hxY5O`3|;L7;^HC#C+*oi@dx% z+7~ZSf)vNw>00rn0?Wg)!qDnCH2PD_;6R^BPBw+e=z3gT;BaxGI`ld<>dpIyg%0!r z>ftZE@h3Gj912B5MJE=pYC)8IGBNDLyOt55@$a+s4gB(!C`z}#jv7>9hYDGcWFl5O zVXu~iXO|2+dsMSL7?w zwb~q?pRe{IQ0%5ZWowKmFg@JfBUNL%B2!p0%D6u!>Snkx{9bYSIyQCvo-of=vilcN zZikhbm}6J{<2ovSDl&dnT3U&j8Q0db!{$hSHtp4>e%GM+ZZKzFmx$yl#dqvZPR)62 z>pMGd@;@1Opie+!~7fJecd2HuETc4H869Xyp zmim~GebDF=m*Jwot&57e5sqdGP`+tEa!6Sbfs4h&0H3pSUUq^!ipyg;20AR|n7`H3 zTHX}FrNbOLf5pgk)WqWG$fI5S=>6MB=J3XRtbdwTV&HV-!T5L$!#7itc>C15%Oh_L@5`bwXJKgH&=)_iXcVZ`~T}@4GdpTaG z(B1lIQ3LUc9ra9Tdsfh@Uf;-Qf`-DyE|U}?;<Y+!y6A}`XAx5vwiQqUlH@7meO>uJ0mF>pxLy8?Rglnp+ zCw;v-k2DiLCtMeGUR-&4Ls(dgx;m5kIYl|V#xt3i~^hPdY5_c$T?iUF8owwoX{t_GYy0jXsB7Ip}#_D0rvuy~)^^k8IEO*2R@= zj-{i5o5GffC=^OrNtv&6X)wpUw`dczNx4R89`;zQpE65+pVYE3?-g1dz02TPnCgc| zJ1763rE;jUDXp#i5}gl5104s}q&Vpdt@ZWq#XMRXY|AaLwB6rtI@?TxS}WdKER1@q zRBk|PJ=q2YiIZ%%Ju7xmMiQLiDLPM_Msbe!gOE`IBA9X%OSQhvA-Od(chnoF+&1sD zu+Wt;T+#b7_=);*=k4d(A5cNp{JD8}Fohm2nBz@Mu5~I3Wo^GoQ~ocDT%p|-l&^Av z{0AZH+IQb<`$yVDZqo7aC~GaY$I0R0t&e+u)Eymx9&(y(ExO?ixGXb=kb8BYF>^d- zX=x1${V_BP=c(PdXGe;qU8t*{zq}+Nw!2ZRI+og-;Rwy3=<%k5Vs4u6x73T3x{GBQ z4d^v~{%lNrXI(8Fk6pejL>n=^RW(MN+M8Y;`sU;P8%P4D(vtJxZZAyro{c-tDdR^a zJwI0`4;{Fu9C&VI9>vK{2&R&%Xb)G~QzN6T|K&=f%5sOVZs+>OjK?*be8ptGa>}i(Ja~ja(rO+r(3aww|Jru8LbR z^F2L1A&maE!_+q%T6LQRCux$q=j%m1TqLd1A?@V141^wgk9SgRU(4deU8MYiez;1R zfBd0mxu?*vTv43j`j%vHqIC3Kn&A1z=9QC7@>d1QRt9a0x0e^%GOUAZo`g?)eSWT7 zXV0r^#Q-cbh*x5w9;|wW^Od&cyRN+~+`2=K(w~)*{jwb!gTyrp9?uQt3q+P5>q-h2 zV;~N_j0p`boYfgU$jr=49j%sL;0*f3&f&3k(F$fJo-)Wc_?t0U(ITRv7CJ$vkg#%k zj2tNL`ScC+9eAf!zvyR!1xYjCYFDHi z?+deDS$&bu1Oi8N@aGi~-PQ6lRc9}`%R5(Zp@PlEC#Ezs76fc$?%g~5sG*#zDQdA; zVA+diQB4tcS$+W>2BZgov)UkDnT)Z3u&=$p)NB0Q_8Jk9h9re0D#+J23p!$ZsHu5& zd+u;JGFMQrM(os5ct{ok$D02JGD#0T5)cK=io9kJ5ZK0Q<&&`KYn!1RS`IA6QodX#o1dQEr1srC#{|WwV*S`HY5^h8 zTU8AW4d2@BwW1wSOpO$`C&T zdA?3fUF}>Yig0j?Qe*QWSjHBhcBaD9SZmN(Anxe;Dev@lv_oHGH9{)T338>OZ{DC# zhx=2FRZ;8A3Wv;=wxw!t|+ zpdi0`o?1n)a8IBk&axLPU_Fv;TRuG&Bb2``kJ{*Nj|t>E|L9@n>)_xAr>SBngM*Ev zgF4i}@Xh1r-z+KNPt!T97O15P)3LU& zm{-OKf3}SY)(ae5I}}n@?tE6`nsGrl!NiY*Rr^btM0f_csn8)zgt$joRH`g49PkKz zs|N-e>IOYr`$*xW{IgztTvLH|^kJ^B>L4EOf>z-^Yzon?z4-Fol#K zZ52P&yHFYvt(z+|b?k$zH~uo7R}V&2AE`vGf6Pj2oHU=MtLKVtHeUIm+D@+nNRkx0 z7yXC}JzC$9^YC>>GO|8ezQkbzg^SH(GG#opA9j7(?U$NLG~+_(Dj03YG|(TyxZx%- z>UcGGw!RJ|rie+FFMeK19}1H>`MB84 z3~I~%1wO^4UdhYi6@apN88N59-*<5yY>5mm41;ez$?r=oH)`nr=350mICaW|i&{=b zVVV{`lv4jdZjZ>phxW7WJ9X@z@F!a(&YdzyAc8DaZH{esy1}0?#Y&!{gPb3DdmkN(QP^z_6~2 ze-v~?+;QBw&}&;zR1`?b_bDShoWM|Hr{Ut#fb+%q8^{~#Ee@cB9GHhNMY$$g)oV3= zLeY!0oNx!+LhN+)q(R5J$H@Ef_md{qj%z2!4RS=ditG$Db}ekuFD_t0mV$%*rd!fA zs*DB$QKze3NG=VSo142WANZUV6T3a^PDjtEo~-TW+DAZTYfFvPOpoStYp6GnXbjCZ zzVPGG8dU6t_vl$FeF${Ryb-TJ`c<(PO|Ne6Xiv&d2zjaN&u^(5&JkXjRK{rGT)sNw zqNmaoY*ZIj-pk6tVLOvC>^IZuF+-W(td);X&hNRsg|q*fSRJi}ot)k9&Q37j#`3&? zJNgZQ80t^C-9M&w^78WZg!k&8t)-E44G`nSb1=1RT8ee3G`J!%n- z%Cl)!PCfMWvbF~3kyUbXC|GjNv1zUjoScddxz|x<@F_z&p0Uh&d}{Vem%YYL%7Q>f zaZv%gUP=AHfF@3RoK~-NM1;hPp!%k!vdmsOT!y2x5zjx5mM` z7727c0~`8@RGj#=)?S|FJj1+a<4^3u<3>g$ho^}(f?^~*rVKsJgLF@wTIo3Ya@v*O zbee>oHT27K_+%fgxIIIJEHz~7tv1-KtXkX8fH$Ay(^IEisr?C_)K5r#WToI?@B~Q! z{s&_Y2mbX7HLFvLg2J`4r%pkqPTlasHBfTkehD9Us=@HrLw<(;d_xcxIC6-fb-}vf zvNSX|qd47UsuG%?6>Z*#SN%L(j-6WA9{qayEEhNygtU708~Eas;;Ud46_;Ad&&<@f zh0pQ}^?|ylmE6~UsgdY`SNV`WE-|t1Wee5X2{-68&*}Af24`=M*jCZKvo6?yc&{ja zq1BxIZE>sa>7nEhp;eI4c=V*m^TYT41bJUQ*f&Pu)5C{qh&wjZ@=IyeZ5?e5(uVq0 zR!dBDXVKj@pb+JKOU_jSU%I44cU2S#CU;x8T_Ce`yo!amjGLxfgYQP;Sj0VP9w;Pe z!SjpKgp3Uvz!w^E_4xLaYCNd&--CHn1s%0lgUq()i_W?7iUjII@lufD5g2Y1;D)2M zQ8!H@!_j(J?^wmf82~@z-?746E^KV?taTljO z*9=RXT6SbyQSl@Jo4e38WehDc$w%bm>P8AlXY*WR|%u<7O4K|Momg>G(o0f%3ZPN75f zWl5*k&05nm;~QQyYt_m}KHg}%?R$sYVrb`lPtU%KWJC6(QLViG4jjSY5`k}_heP8s zJ91@hlL&!)@$qq!@`#1DrV62C7U^)>cl z5kuv@618=;taz6=w7-<)yF4jB_S4xPhTdH{efl(`v~+V?YHBLO!(z2`L7oIQ?V=4( zQ*@`QE%nD01N6!#RWXX!e&Dn3r=6D#v)LJMi7LSr`G{&6Y7ws%txV=iRg{&Lt%tg6 ze8%v=wMPTwaQt|UM=Qd!Y0i1N_;SVYNkaa{i$*@d*#z-KD-Q^{J;N-M`V%$-^r+wlsL}f*$;6trNuJ zDpJQ3IC`w4W;1)6^UWWGIoQ~iY-Ac1ck!;C`?+smAX>!9eeU%NvU(6C*KTeW@k+^R zGkDaCKQeR>3kXtZ+xi0>4tD$D6<9aFRhxkL2b1PO&O>8m`nN7~YA?{Yc@eYGi&zG<_{j*wq zBz@6w-=9tv@sP>?Gzf{OPH~(MS?VT*=0Bi5+`It4ai4^!^7EweML4FOdROz8VCuOP z|63$CV>H_CzBLE3)7K z{Y2mw>MqSMo|1i|x7|rv9!yQ%2o0JEl?h!#Dg~R*jY!@#5%P(DVQNb3<@5~XXEvh? zj&o~M07DQK>QhABTpik7r{K2@HZ#fHS*gM`s=FJnM14ms%&@;96cVQtKDxn^t*e7x zjguA@62hSdNHs(2dvYqMWu(k7pIs-XdF!`y2=NNUu)2c-zdJPckL_mr%5;v~ya|1g z_HdJeu-zNEiCKstNV#%8RQm|?UR%UJj8Te|os~teIlX(Va+Ow`Qj60p4-~;o5#q<$ zx1U2=o*V6f=}}Z-o_*+JvmjAy`Ma(z09;dw5tx{n0R)=g*luDw3Ujc|K}0mM<2VDo7E_6R=Hzp}$3Wt& zmyn&EJqw_V_(Vk9A1}Et-noEF4c`u7->h*L4ewy=<|k zpkvb9k@G!jk+>0ZriO-w78ZNhv@E#@6dUrcj0_0^Orj$F^hx1w)6>%c*CS?rXh{R$ zS;@TPe*=NYjN$9u#fh=1uXu_sxfB?9Q7L&Nk?NvGD2E8#V_z|SaEl+!BTe}pREL`uh30iOTwM*cgbMw z`I4Otm3zANCABk$Hgwm-XN30xR)?FL+lG1WZ8cmA%G6)$9;n=~ znH$VVj!If*J6EvyDkxxe>ynDGgsAt$rBJ`scv1JCPF2Y6H(ng=e;=XsE>or9BE0-P z`SNW=em)HpYuWAjnOUOJq~Og{BVou)xH5xZ>s|?o%_oJr1ce3d;b%Mbk(B{?@7p&x z@jA)7PI~^Yx!FnL_3ms{czFZBMxSK|l!)eD1|%LKGczG=SBih#`dQPn)7|om2fCWA z9=|b`WCHL>LAO5mOMV3XIYGK63m@ltnh=pr->8nnzy8?_uvZF!O1rMQ$tp~WH;5y` zmUWOS3Ca&G9+|4Ot26e2wB>A>SU9_0nfp>v-1EaOU!qo&c)7tkiJO|5-zD)6oX-9# z%-vTk2k2G+TN=)xmzA4KDQsaZ0hPB;Kn&Vt4o>6m%!v}^*3)z>K`HKk9li%TWUEc{ z9(Gd^=Rf2&V>`hyfo$)21`km#(@inQ{U5)wiS0eA>uJ73CAQdm%mbC5rQ$ojrEI0w z^>jDeOf6l>q-vUNfIf2>V4?C$RA7COsE5p2zmq&uf;B3=RBivxg+x|*7j!on|3 z))2x<(qI0NaWKi#iSe6iK(4N1Z#PRzPahoWb-A-V)G}u<=8o|7^-WHmE6=XwHgVpX zF#JO@L2q=jhTs}7UFEhLT`0+>BOK{~NAKv;>T8~Bhqk|XQug%^3>B*`*gfX7mW z)@b(!>aO1_lg)OtZOpe$Gn)~TRR}zgh{+ZBu&8C+)<=RKYj?hJ_(9%{l~tRiN*m*e z2zyzKv;6QKl&xTeiL|Gce?Ih)W?|Lw5n9`yW2qfHo9=*~^QqR_rlC*B_@OK3z`0JD zyc>(^(rDB~n8w)}7B{#IW&x7}vf5Qq8@FAyg4U!$59maoy z6GGmG2>w`QLnwQ$LHPf}S{bUV{)dr&(!qCe^!)!347eEvUw!2)9a8h3ihby}Y9Fn@ zDJp8TTdmp|?OQuJmR6u?)7i`bsDf2#F=mJXmav#|K$1$EYnIE^5`Dc34~$njjIY5w## zAb_CD^hWid@An3Nf?SbIeD=?YxB#jG&~!YjtLL_t^Rlyv5uSn$cM_LHJ3Bf+ZR$ht zJ3|Kjfg&TLf^QzQY{@?r_RtaEi2OY+PEG)tcQq9i63joDv%Y=_>x zeYSn&0Q!Jpc(TpkqNj zFgqrZ>n8-AandF!o8Jpq$Y9TCB<1*$mq!9;uV!l-5mEV)C0f~M70KZl3ILpv$GV6D zR*@1F^cA-Ho?6ou|2awa6wN}VzF&rIx;EDaO1&uJ;CNo42*{ zjntpJ4q%pSPZ#= zjg9xzKyK^Vm#Cf9wy0>$eB0p^ov5B`L%lbsS=m=R?_I%b1d@~Hl4MjUndVi^-Mbh3 z1JXr(s-GAEDCJ47GGcs*SPya>%a;WON-oAr;Ij+5NH;n@>(d)WaqP9OSb0B)q*d*( zA$K9yqRi69h8>wSHwJk1QAg*AGn%CiXR5GHawh_e%O@4Gql%!Q%+!Qiyi&YKtctN_ zk;`SJ2nB=W*a!_tJ(PZLbSZ_v`B&o5(cUISMn;B_bU@O=RJ`vwew)Wfl{Jm(Xt}H6 zWlw`z!4hVqSa*-^(*vmLMcj)^EP5Fq2oUUGS=-#qnqa(cV(L9~@I1KcMPy_o_Y1hQ zzKj`_r5)O&W6SpkhAPK9u;JyHlERGMwBF2^pzDW5H+aTfg9*w+KrxSo5J^fmR2+68 zBZpN^&1f>6g3L5ezI?Tpcy;;GQtXk!`JhU-7IwaPfr13ewM>L51HX*=ad>`8?Z!_lYf00H@gT4GH7Wr9+Yl*mnTTLLOnDv&t)&IFn1(9+0nsjCw#(Nl$<5_?zP1w zP_y-;6>WX*C>1=Jrm8(Y^3!Bs@qD}D>lMvu5~(1-&3&C!v+Q6a!qxW$D ztZYt^OGE?W6&UP+E$MNAeP@4-iE-Z>At*YRZ&eEa5YR7=H}`V0Xr=iq`Z8Ar@}-wY zD4g`G=52Z9=`n?!g=R4*Eq+j6Unw!psgFK>EMhv9kCC!E(8XD8p3k)`!(=)(N|`Yx zVmS164Xcx=wy<2Bu8ka$o+h|sk^fc%h>w*NoP~m10@B) zxU*76#Lmuh50}CI{`1sj*91Q)Z$|^5R zUqs_tvaqO=&R~1IFp1LJ7TqaV8?WmP@S9AthRP6^85``bK~w7JeeVsV??RadQ|Qr5 zVNgvdAZ@0_gN`(Ax`d$un#W=SYhr}Oy*kwML*BkFR&yL%j6mSzY90a&)&!%Xy|cq! z!R|SsGt(TpZ=({A9I82~k<-^JE0;vFT78PSyw|P}5rqV#mNzTU$fH1Jun~bbbH)A{ zuLE{Ourm>IQ$goBZbuu$l@Aq~#D#{25*T8hJ_lNp7tZJ@210JySBs`v5`$M>M-*6>@)Mly|&U){Tzq-T|rL(2F$%Tb-%~# zIhvdL!k;Uj-wGe-N9ChSYG$^Slb!7-W07L2DQvi$@R^K^?53cQg{h8?4&Uu~8TwEe z9i0!mIv^W*asd8Xx{seI^V0}1yR2iT*-eSUs^A^PV7x$7AV^vK!4?7FWK?RAFUJyz;7 zA1^vt^fJ3GJq`HR7NrQUXZ`5G!9mjOZ0r89;&HTxN-Bv9|IwkT{PEs?PuthiKy%m) z#ac%d@R(sNJ3h1eD^~TU2uPg0$hxEot}Py|AY-w0{8GcCa_H-b7zYQoWw+psleV`pncw%JxR)GvXCL zs^|)<+srcR**8^(wPBjZ_fc8^2_S{cq!0J)CKD$X1gsTGytHEP<52UG8jGcm?wbqwTul#jVC z+Th8-dH*MxFSoLgB zyayL6DJh9R>QPC20+{?m_f69llz{nA-%v?O|2iq}MV!psTw(+-u9b-SKn}V#F#VAk zh1X6dDu8X901kin2E_Ech9+l z5|FrTzMp4%{h>rNV^2P(fwbfhFVFd?i1${5mv<-H<67H}$M@pm^aU1K2BxN_%rm}S zLD13D<5DlOsIk%vmN;(Pr-XeN`uw2cIDcz0S72ookg(++{6(F|XD*4mV*2_X!cE|+ z7%3F@AwC`i;;8e)AP>u5?$gcqU=r^#)KK}}laB*R2nq^l_nZfGvO@U>RhRSg1+1Q` z>tX4iE?(CJbn>(>x6pJ;q=Bi$K(aJ?+3Ok0fa(V>leY|Fmh6*8GUSab5U}nybVI2| z400;TD#!PXUNcST+hT5f9P=-9JSqzPCA@Ka5p&##X7nM*<0rNmIpE>oP)xie6VEL! zj;XAytgjdanli0?tZSZidt$55u${9*%8aVn$awrV7NdAiUMJI7Lqfc~GVz=bL9oYG zZA|$u>NohU{qD+__NKKZhZFX&he9%1UI!1VTk4ItxRx|?T~nexx--%R9aDE_yiQYL z<+bwol8&+Bn?Q9YZroR&@9J6hj0Y*iL9I=4{fIE*O81XktXtA*WCwHEipQ*Wqtc0u zm9;j2oX@7|hIcP$k&leRT7wEp12#iBQ){`F^CG#asf|buY0I?$$akVHL!;QcZ1zLKu=1p}ERuWafoX#DrbTlk@6pnBV{4w^-iAgZMJJ=8c8RBCt9Q&@IzmVfV<7SR zs1ADRY_0BN+$t=}O(>>Wu^ZQP9FS9fp$^1tT9`9e8{)CGM$ zJUxn?9joE8?8OiJZj}!DkzXZ&_x-SVE}e4A%iLFAe_!RRxV1BjazFDkqa*L>2r2 z%r~E4Aa4kuA4i^ij}8fc_@rayysjJ-6@{{0UT}UQ|M(KsLxiNHAyPAR)pewzsiLIF z7ln~sa0@E?3f5g({y%}`n_p*d|np6xrupi{%0U1qwFha2Wnmpy;5%TgB`%iI+C*ci&8QMzmmeI z2)rtm20|R-)y9T@L0wqakc zl=_4{FE{-90!+LCjXdJj;Jtf5S9EE4*cyPD5OT+1@|D7{M?!qO2}`JCEnr2-PYQj| zdr$tcCVa5q1QGzbp}!P{{W2!O_Jk+nf({w~2q2L0rRTpL#~41&%x`UMEOy+^V33rP zlk569JG6lY0>UR>Wd39LIb1zT#xF?2oX5@o$a#>Ek|O>KH1cVq3B_kLQYndY-*|hM z?x&-pxR;mM1V?_yOMZh(PT{JJDR;Wzj(u5K3Ac++lB%8#IAdmQZ8hEWUbo<({VI?; z7w6j=wVm9au$}TX_{F;iFKm^}*er1)0?K>>mIRC7H&^oLkfD_~^-o@Zf=fH{|5)0E zL{wgbc*)8RQ~_W0x1xz3nu)px@HBZMK>I(`TYnkY|7~1De;wFo{KDm;MB2-5pQgSe zV=*tCK6nIFgJ4vEsw#>fSHxwka;i}sEMawlSNq#y*5ANS3I<6M-$Hq>IJFAX73RW& za;`#GGB!njcI}61WszE`RX!6y#izyT;*1)|jaQlj(yrH9y)Xp{{W}L)X$MCEP;}G$ z6KszPjVK}}hfN&ALQc^Si-8U_*Rq=s@pxg#4e+wt9UaUA{ao7c-Mt|wI~7a)75oFb z2%z#ervU^Fz{K#v)3DGIP=6kO>RFf_{ivArN2>2n=$yVe`qQXS3S`)>a&A$1nCm%6TqDlcqw+)06 zu89_FegYqR3-R#vcbwsXUYjZ9a+aIXR}FAbF2*w*wKPzuJZ4zS9kInO4Ik_pb+`Wn zKD^IQUUmi1Zw9ep1>_x;a5o?2Y=-^QNWL&8zyAN2>o+h z{xyJq$`JLCrWC37{(hcU5Uh?V^tc3r5a41BD^qB0G5&;6D_UDc>*_)AOyuj=)i}A# z6RRapBc8fB5eb(o&Ck^4TK)z!Wqyb7p#LD~`5!U7KR|ePKwStJu6wQZNkB!@^y)Iu zg*_Vo;l}7iW9*!q08)KNhl7Lq4&d@{FAbh^dc*-CX9u!fIvJkMuxl51?!E?+R{-%* z?Co>8!;cE2F2(;iu+Px`4gIbeMPL);ug&WMBFuFlpS=c51HiFjX=#Z%yDdriUfjd9 zn^~3LY6KMO9iQV~UX-CDJWBvykFYXP@o&NFkdbd>5M}FtlZd4ysT1z`wPY+C(7-Pj zb1=`>XHB4lo!gQ}Qa$nqaxHMFi=38AJf~7T%*~0H7RheGCkAwZ=A*lIkM3rMqcJ`O z%8_?Ht(ri%tE6A>@Bp$s@#Cu~)CUmn^6ch1&Rx2$g4WD63tGP3onlT>cvD!MeR}Z& z1QP!Occ1ge(LB8TTqFo%GZu2u?C;hX&!%+GKW}e8+=HAq+I}J; zBBH*d9ew^x>tnLpPIMRIe)-!0iZQD0IpfOOe?e2_u+3gDvE(K-}YNWws+GTdxE zk``fVnh+@o1p4fFdQOM6PU@t+Q+}kx-k(kYXgDH#Pabs#)L&bWk&|yO3?}Mf#DrE~ zHBaEmloM|L$G#=Q$4v+BBW_lCSQ;gu%pGoEa2b}Vcxp*?sWS;+bqz(Xea2vSt z5LS*8{%1uTbm9Na48ox<+FBgWxi?yfM+#^mLrY6x=dSt}M?hcpw=D1-Hv+kef(4&h(^> zWm(s?JT<8LG8`R4Km(|p%rdiYszcgCJ^^CgnJIh!jUwb_OMT~&9meay1L;6Y>`>O}=RYKBx`2L`ka$+=dB|Rk>bL_GU|~Kl zN!c|pgTP66yxTjwILT{Po8u!JF6O%O(Y-rG)Z_7XlA3&W62b>+#ga#n;Zc9d4n@48 zx=5u_YIB&5{MiRVjlAKiljN7ZK4E&|ryz&!!3_>(edC*_r)6^wfd&Q4&2Ed$ud}n> zhvLHSvrl||?*-HU2hDnpEFf#B6dCFHEIW|F@E9EpSbvR?NP+=+>|}DMtU8jBZltBT zxw%o9B~&I?sJx)^dr8;f8FknjF9vU8+ZjLlJHPzHMV3e*i(7Qm+<6S8pbiF%mZ1t;0GyB0- zl(Tu_$H2x)b)9ni;qDqIpoJ270B|8#2ngx^K2c7X`$kIXEnR%Cp@%F04bBe0&}tY-Mg{LvIG z7bkz-7IcO1bRa!^T**(ku|036SSrt6>c|GtI7aDYPZ6|A$~(q)ujOR7*%8d0Ossso zJgKv(L_;M`gFp@j5M+y<6*3;fJ7E1nyaH?g@6fplT1_YR{vE4`n_^ zml5w+%=**rg$(a+1(9=!h>JtEDqUcfkexIaNM%3&W4&|4CnPM`9KmHh))9Z{x=504 zu0`whVbK)TPF5HRB>`TQ<^nXtfPZXw_h5HD=(-6%gcX%Knf-*7N&-MDres}iuCL!& zaSKE)AlB16ZVkLHq;F_QgM4%4CbqAwRgobCwX-_|lrpxf?Jt1_*8fB+WE-!3a2){y zX5Ng7DBU6&5$aWE8yg$lXw77mlX9B=5AFF zGurRh`Mh{Cs&7D17cie&Gl4IY?*6#$??_hx} zDm#SeH;wB1cORMz;NzcsdH*Y%@P`R=>U)KG%be45H`PBVfa&I7{h%_%>K1f~HTDw? z7b3mERm4``R9|`{tp7TRMZ{QoW--EV>F zK{0KCM@Prdvu^1M6n8XuaCE5{tX}EP@CJ(@aQAd%XUfFh|2B0T@U5omk(=S;vC1!N z-9ws`>|}+ZZ!-12b#$jzTK1&5Ee&jfd$y@_<>^E|rDBtJXE%S7i|Vu$mOL6Qq7CoW!I)>uwj zILKFM{i=ES$Q&`mj=bNIN^a* zLixYVg-A)PfF-}#5kfC!&nAOik@d$7x8D7`xsbR*ldB2bADzh(=e*9JJ_Qh&iox3r z?Deg!m^`nSSy}e$+Zdx0k@OAWKTVAVjW)DBk*sVZ6A|MhDn@vefG~=VkTHmFpP$n+ zBs&pdH2m`aS7EfF=kz;{cJ4&Ab3yN$rk~uwW5SxsFN8D>Jhm2Q5dDj=7iwaJr;Us( z6{)#KAHtKpf&x@YQU9bY%GWpkO-emb&D1Gk**j3+ED!UvJA2wip1bq83xOB6lo=I7 zT#gRF0t9^EY+?s?m3>^G82Ez-1NxH+gX;t?0=c{hvk!tk{8)g2^itfEZ@Uj(V}rV* zrBi{v@p99gZ$6O|JGtmuXVw`<)8g{=mJhq@;uO3EHPTc|eMP%tRWCuIGL7vW1$!er zdTsspb(_=){7DE^nq`@ucr0?W0i5u3Q&cu%e0rSSif%8XqDwwTNwnC-1JJtEcLsaX zw-0 zpZ(QQ5pScCnb#o))f;nzdI~6&AhQ6I1|ad}`kgRimN*$HxML@JWF>1o8n@bBt6v$U zp3k@^pI1a>Se3qPYw4M;4G>>jTZ_&c{~L$li;JLRp9l;Ch2BoJfZV&cAmYnKi$RX- zd9Pe7dte985wY-J1Qg@GC*>JPI(=GXal(CGhHr&_(gbc)XIo4HDxk0Afv^rpr5AmT z2Kv7d)sm(?%yo#*ynXt6=o(@80UN)Qx9#x2@%cNsoopYAhV@q#*^|X2{p;UmUMGoH z;*8Z;ZwRB{2|BehO%IFlTKg;e9cOO-`c_D6B~i#oBMx-+0;XD_?w=93#N!l@JCBHGE_2pqscEq9eG zN>PgKHG(=f9&g5S5G$_#CKXC;oWz}I)ho!HFYYGgI0}o3(kgU_9}#uWG4Fm$4eQND zCEb);3EcP3ksOI+sR290G*xO2)o!zGHenu9XRF_Vh-mNr@PJdh`1KeILf!EZuT{HI?m*=iC^o(q9u{As2`tz&$`HrELUk=vDf#fm zl(_~IV+Y4eGX~0LIkAlOZ!!TaLzQ4$QG2-qzS9&`jfRid-%VHY0)K*EFlA1*!G)2+)G&a=UQO#)!UiWDpXev)Xo zlVDo`64RHk3eq4H5&O3Bm?FgQW&2t+G+XIoGL>4GE2Pc2Hab=X+(j0p`x&Nr4)iX7 zG6&>xLHT+h0fITydA`p8xU&GvIPlvh4SO3YPtl6Nr%?7`1!yZ%phxAJ*s^_KGKS>} z396~jYBaqMRzI8b0GNZgEA}wSegY^1u^3{e*0(|A0#EHBcwPBuMGp)h|14S*`l(Qx z9hsS#*(Sxx#>UMn&8!KY_H;X=c=8SPc` zdVm`k=a-HS&-Xw*Ov%YVl+5Em$?R_gZsC*(3pHy8T)Lv|Q`e?g2Ko=ZcO5_xj(8=0 zyazbTVt2qMHv+J?5R({#e`y~<6D+d+nz^tT$k!Le?JBaJ*{oN9<3d+g7jTb5CE7lS z;OOYsZ@9J?1;cCbA`9G5u}1;~We|am(3$kX%=W?JXnCLWcqAOFt6M!ox00rG&>36) zQ#>Je>41Xh8kcEWXsBx4))J897E}<2ti? z3a@*0=9cxqqp+4JKBI<>h;-qf`v=t*d*c13+Y{i+t*AuXX-u40S<5l&4*@Isq1R1J z67P?Ov;94)O4x4os67Qa^u_;&{8`pm)VsFzpXJY)R@NE6#p8*S6a{x|@RL&CV7@%C z9Jd~mQNTB060+D$cH*Ycbvx0?0ucW^Sb)mcNZ^nEP5-Q0@Eul8f=&n(TTI@OzwEkdy+V=3_s_m$-%hyWa&j;>*9BPFa zLFIUdsZM+QNF=PCw#XeQwh=8;fg1*QY~hApCw zTjisEjxM$v1M?T`)&S-Ztni3;FwxQ)RJOOL9LNRQ6|?bH`K#hKOM6(pD2RDk4oq=S zh|uR~*h%Dg@Cgfh07C-UvjjF5@$nHOh7Q)zZ;oQ-7hk5aN(NJaTD4;I`jU`Sf1Uv) z#sW0uEk(#=;W`3D_;-zX-e0IjLKvkm0lSmSt7SqlIXp&ADaV`J7_jd^j&*lReJ#-9 zhDSscdUe*aVbJA3YwA5txAY0r-4vppJM9wZz&;>{K#UGyWcsq4)_d?5g6gWTiS32t z^=;MHe~p2TCY~NrL4BV3eVP9L5ZY$A)CI!4xqaGuckYp2kl26N6z4kvg5tAo@TC>M zcs%Y0syoChn&*4lZb082`}`bbfEc{rn0*Mt)C{n49e8>w)YRZov+ETaS{kkEb}~SW zbO-CLwA9tfo%Y^kW%T)=y?BGc7^B)W|&>tK#r{!t?i=vK(o^NwD%jo5$JLWyyR`sK`Sb_5089gutz~(#C(XECifWEd zKv2M3Pa%(A^lj1EvoY8VH5J7En;K8DCqMP znMP+v+tTihf_>vgWbW3tv>Y9-O&NgQt5i}#5*0XfE=L2Elz@N$hhjSLzRVxcJU^r5 zktep#w=$e*o*f0uqynjPWA@^rhjmrbV50>BG1aISXU_udWIAxyGR9m29;+J$;#cy= z{9#aj)U71h3@2vig|AWva2oJo()LU@2S%u4`(@(69vcf`Y=A*KPYu*wT()DM6hz(c z(Y*!v6d1r_))Rjvv^2D|NZEP*WSfG1^G!9?6_0@Ef7Zt*{_}{Vi({04WkN)RdGKvi zPjqbS5xys_^P*M%_ylw;eVaL554{ZNizEE2A`($b$&WjB?AJ-zmbd53Fi4Jk^uw%^ zSh9WwhF+rUh@vwcwkCbw>TMn!0Qy3F#wl8{y|PBpXFTjt*-~VYuMnmzhZeR$|4<-( z^qfAXU4h+J-*SUlNGD`HHvV<$N%&ScWkog@PyP)9rf`24Ot?j^nx`wr!TPJJg8YXu z0Yeg6sXLef$FE7vT{FvJwu(KcpQ`1W*S3LyP~#kri#R6z+X|2o3UCg3>Li zzQx(m$-MiMBnVFa0RfnIrTO+tk!Gm{z(U71NVA0LqpFuoDNqspu$YF-f{i&gG#rI;EQM(n@#H^Sgfi=0xS9k-C@8kRFSavSoVy8R-WGj!U~8tS z#!w=}%Gp)9LC6dvh-Q!jNr?K;nYBF2bxN~$+U=T)7 zKoABI87ZQaARuG}fuSo^x~TLLsSyZ#qcjx(=_LXpO^75Sy~Kb>ZvxUo?q3lJ@QM z)15Wr&IXO~nUWz>h(2^#Vz)W)kzN{Cfb48+Rpb65s=MPwZyvRO3=#$#z)~a3c^-Zl z9}7FX*=-%3G8EXaYSMlD#o>_$UM`!f6Y8wz-WgPF+Xpew0z_><;>}$49h{Hdb9Y{E z=-#lP;Bf%n18hv_z-9yJn39rIe5E&7%~cp!c4u-kArO;$2y(KFjL$FxtGzlZKAt!d z7J0V77=sYHAa>`2S6}fZ;mCt)2jLPY)zp~vu*9!wxO z56ZhVMc*=hu})S}DgWLY`&;}7oj#Jo{(EN=o3i0M2b1#U|1+fYU)pHfw>Ma&BfNkM z0{Rad1e>zgKOJs=#dWhyTmJ>KOHNKc%gvpPHV5)Pa8vZJy%Puc0BJGauY}IO6?i*3 zJCO_P4?(R}F2#aEfih&NFOMC${URMlhT<_M>a6@`9_S&Ku5wVgh#Cj<$i2M}lwV=1 z75W|sq@fD`i=Jfs9t4lFaz;Jhm-U-^$qLoi)YLS0-IiKfT+C;5I+a0B1D9)Gl)8Gg zD~&0ZyESfba7Ya>=}LM!ppFi(drol#`KtDt`uZQ(-uPnrel$r%30FAY9e>5$bLO%o zWxO_M(Fn7>+%=MECIcM#pK5dGJ%4o8Ar5@La{?qtIFxtyC^;hp8t7W2Mk)XR(@VBb z{khb<9{Vi)qafQ1OeLv=M}@(#5}r4O{$wRlQOt^E<*E(?ohm{%2-3|TR#V{7OXWS6 zd6G{IRoeb9tNJTpx>X&Ozx^*s`KFZk9xXQI-vh}wgR;NX#PlDm`cjtfB50B5VbIj5 z06;iTJ6%p?>D4XnonGid-s9qrWn~!|HqEY@RDU0sOVev>y@o*8qt)m2;oOzr4%GBa z@+oJ~*lp9&Z=O%S;?oB9Mu}q9(JzydQd0vqI^l^SxPysRo4+?3I_QQkApTRs&eQ!t z{dkxir1K9#isY8DvNFJZk`pCZd1TD8^;7?j$iT@hHZWAQHHdpm4%I=ASXjzvIO?!Q z0W=z%Pw7p?F;{IwDA)SdYwXcYuE^p{SBC-fEU)5Absq8}0cB zV;t$+sgwf95Wth@EIG%!ui5UcyyMd8|hE zUSmgsxDs`Tb|I@9;3y!#f}9$AT`N_5DPB`Jf?pQux<~g7I>|A6e(a?`{%L8esJL%H zhd0}Fpu>S2t{asnZt-tfY?78j0zej=TURD=bwa(0ZCVWUS64#en>_Qq zE8#p`0&F~TO5plOHXHx0OI*E`hGMk|;?~F>I*RDY@2q&5od&N8nSO^;bl&Q!y^@i)$9FV(C#*%w{&wilWw~6<36WC*A6*l8xPZg&0NGFUf6TvD0>oKhPyETVHT2mgS# zu$AF`AeAW@NEP(|t;j=1QCs|l5a%f)Pgcb*S@t6+aX*Ub9kd2+wB2;KE(nA4e9nwz zEFAV!a_;o?Z4QX6h$hX5U>1JWYHdSv9*%!aZ-J9%vTSGfDtXBGmqPI;5VC`9M`H`;6+9rz=bfVrC#kS7=ue(^!@_qmwFPm$E2evD?S#H!2u%b=ymB>{;8lFcIfr{^-gsq=SL81Yo z++bXcdT#qzW0eBM{gs`awb&OjT}r^vNI(w~>BR%%$@d(}19!N@mdz$wQhAvLIOO(T z*n`3O4YH+VNP-49;5W0=AsxPe>1_Hl)v(v-6tj&L-f8A+2z#{*j><2BA4 z?ymBO$X`{IT|wBg92ayIRG6BvM_ig|IUwsPRqp(XOAgDs$mgyWxK;`VNF+hZVb(@o zaPh`^(De#QXfQhLa$jgX>4it{o}8~Tw#8%ynzh!{7gt=rb>jAeTQntvV(Om%2N4Bf zsL`~dq~dE|_ircMDH7S83JuC9tdUb-oIHE?I1!=�c>h*)qJgxitOneF>34ZtTfY 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 delta 28164 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 U8ok6 Date: Mon, 26 Oct 2026 13:08:34 +0100 Subject: [PATCH 27/48] * regenerate references --- Compression.Core/README.md | 2 +- docs/catalogue/our-registry.csv | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Compression.Core/README.md b/Compression.Core/README.md index e918da817..e5e126063 100644 --- a/Compression.Core/README.md +++ b/Compression.Core/README.md @@ -205,7 +205,7 @@ Use the concrete version you intend to consume; this document does not predict a -Every public and protected member of all 734 types, generated from the built assembly and its XML documentation, is in [REFERENCE.md](https://github.com/Hawkynt/CompressionWorkbench/blob/main/Compression.Core/REFERENCE.md). +Every public and protected member of all 735 types, generated from the built assembly and its XML documentation, is in [REFERENCE.md](https://github.com/Hawkynt/CompressionWorkbench/blob/main/Compression.Core/REFERENCE.md). diff --git a/docs/catalogue/our-registry.csv b/docs/catalogue/our-registry.csv index a9ce7575f..746cbf749 100644 --- a/docs/catalogue/our-registry.csv +++ b/docs/catalogue/our-registry.csv @@ -734,6 +734,7 @@ block,bb:BB_Shoco,Shoco,Dictionary,,,,Y,Y, block,bb:BB_Shrink,Shrink,Dictionary,,,,Y,Y, block,bb:BB_Snappy,Snappy,Dictionary,,,,Y,Y, block,bb:BB_Sqx,SQX,Dictionary,,,,Y,Y, +block,bb:BB_StackerSd4,Stacker SD-4,Dictionary,,,,Y,Y, block,bb:BB_SuffixTree,Suffix Tree Compression,Dictionary,,,,Y,Y, block,bb:BB_tANS,tANS,Entropy,,,,Y,Y, block,bb:BB_Tunstall,Tunstall Coding,Entropy,,,,Y,Y, From 481be6f822db61bdbb513efded10e5ede66d1e27 Mon Sep 17 00:00:00 2001 From: Hawkynt Date: Mon, 26 Oct 2026 13:08:38 +0100 Subject: [PATCH 28/48] * Inno Setup: real file extraction, setup data 1.3 to 7.1, read-only The reader listed nothing real and threw on every extraction; the writer emitted a bare version string. Both are replaced. The reader locates the setup loader offset table (0x30 or RCDATA 11111, 32- and 64-bit tables), parses setup-0 for every known layout (ambiguous tags retried as innoextract does), decodes setup-1 chunks (stored, zlib, bzip2, LZMA, LZMA2; embedded or setup-N.bin slices), undoes the x86 call filters, names files the way innoextract does ({app}\x -> app/x, collision rules) and checks every file against the checksum the compiler stored. Encrypted files and the 16-bit 1.2.x format are refused. Creation is removed. LZMA2: an LZMA chunk without reset after an uncompressed 0x02 chunk continues the coder state (xz spec, liblzma, LZMA SDK); our decoder wrongly demanded a reset, which real Inno installers tripped over. 0x01 now also invalidates properties and state, as those decoders do. Oracle: installers compiled by ISCC 5.6.1 (ANSI and Unicode) and 6.0.5 with every compressor, and the official 5.6.1/6.0.5 installers, match innoextract 1.9 file for file; the official 6.4.3 and 7.1.0 installers (beyond any innoextract) extract with every file matching its stored SHA-256. Sourcing: rung 1. innoextract (zlib licence) converted for 1.3 to 6.4.0.1; Inno Setup's own Shared.Struct.pas / Setup.MainFunc.pas / Compression.Base.pas (Inno Setup License) for the layouts 6.4.2 to 7.0.0.3. Notices beside the code. --- .../Dictionary/Lzma/Lzma2Decoder.cs | 9 +- Compression.Lib/FormatDetector.cs | 5 +- Compression.Tests/Compression.Tests.csproj | 4 + .../ConversionMatrix/ConversionMatrixTests.cs | 1 - .../InnoSetup/InnoSetupReaderTests.cs | 328 -------- .../InnoSetupReferenceVectorTests.cs | 179 ++++ .../InnoSetup/InnoSetupWriterTests.cs | 53 -- .../InnoSetup/ReferenceVectors/README.md | 30 + .../inno561a-lzma2-solid.exe.gz | Bin 0 -> 282483 bytes .../ReferenceVectors/inno561a-zip.exe.gz | Bin 0 -> 294901 bytes .../inno561u-lzma-solid.exe.gz | Bin 0 -> 438266 bytes .../ReferenceVectors/inno605-bzip.exe.gz | Bin 0 -> 987732 bytes .../ReferenceVectors/make-fixtures.py | 36 + .../InnoSetup/ReferenceVectors/oracle.tsv | 17 + .../FileFormat.InnoSetup/InnoCodec.cs | 217 +++++ .../FileFormat.InnoSetup/InnoCursor.cs | 114 +++ .../FileFormat.InnoSetup/InnoLoader.cs | 183 +++++ .../InnoSetupConstants.cs | 19 - .../FileFormat.InnoSetup/InnoSetupEntry.cs | 25 +- .../InnoSetupFormatDescriptor.cs | 144 ++-- .../FileFormat.InnoSetup/InnoSetupInfo.cs | 765 ++++++++++++++++++ .../FileFormat.InnoSetup/InnoSetupReader.cs | 683 ++++++++-------- .../FileFormat.InnoSetup/InnoSetupWriter.cs | 34 - .../FileFormat.InnoSetup/InnoVersion.cs | 239 ++++++ .../THIRD-PARTY-NOTICE.InnoSetup.txt | 33 + Hawkynt.FileFormats.Archives/README.md | 2 +- Hawkynt.FileFormats.Archives/REFERENCE.md | 118 ++- docs/catalogue/GAPS.md | 2 +- docs/catalogue/our-registry.csv | 2 +- docs/catalogue/reference-formats.csv | 2 +- 30 files changed, 2319 insertions(+), 925 deletions(-) delete mode 100644 Compression.Tests/InnoSetup/InnoSetupReaderTests.cs create mode 100644 Compression.Tests/InnoSetup/InnoSetupReferenceVectorTests.cs delete mode 100644 Compression.Tests/InnoSetup/InnoSetupWriterTests.cs create mode 100644 Compression.Tests/InnoSetup/ReferenceVectors/README.md create mode 100644 Compression.Tests/InnoSetup/ReferenceVectors/inno561a-lzma2-solid.exe.gz create mode 100644 Compression.Tests/InnoSetup/ReferenceVectors/inno561a-zip.exe.gz create mode 100644 Compression.Tests/InnoSetup/ReferenceVectors/inno561u-lzma-solid.exe.gz create mode 100644 Compression.Tests/InnoSetup/ReferenceVectors/inno605-bzip.exe.gz create mode 100644 Compression.Tests/InnoSetup/ReferenceVectors/make-fixtures.py create mode 100644 Compression.Tests/InnoSetup/ReferenceVectors/oracle.tsv create mode 100644 Hawkynt.FileFormats.Archives/FileFormats/FileFormat.InnoSetup/InnoCodec.cs create mode 100644 Hawkynt.FileFormats.Archives/FileFormats/FileFormat.InnoSetup/InnoCursor.cs create mode 100644 Hawkynt.FileFormats.Archives/FileFormats/FileFormat.InnoSetup/InnoLoader.cs delete mode 100644 Hawkynt.FileFormats.Archives/FileFormats/FileFormat.InnoSetup/InnoSetupConstants.cs create mode 100644 Hawkynt.FileFormats.Archives/FileFormats/FileFormat.InnoSetup/InnoSetupInfo.cs delete mode 100644 Hawkynt.FileFormats.Archives/FileFormats/FileFormat.InnoSetup/InnoSetupWriter.cs create mode 100644 Hawkynt.FileFormats.Archives/FileFormats/FileFormat.InnoSetup/InnoVersion.cs create mode 100644 Hawkynt.FileFormats.Archives/FileFormats/FileFormat.InnoSetup/THIRD-PARTY-NOTICE.InnoSetup.txt diff --git a/Compression.Core/Dictionary/Lzma/Lzma2Decoder.cs b/Compression.Core/Dictionary/Lzma/Lzma2Decoder.cs index e4fc7ad37..590141f32 100644 --- a/Compression.Core/Dictionary/Lzma/Lzma2Decoder.cs +++ b/Compression.Core/Dictionary/Lzma/Lzma2Decoder.cs @@ -84,8 +84,13 @@ public byte[] Decode() { if (controlByte <= 0x02) { // Uncompressed chunk — 0x01 resets the dictionary, 0x02 continues it if (controlByte == 0x01) { + // A dictionary reset also invalidates properties and state: the next LZMA chunk + // must carry both (xz format 1.1.0, LZMA2 control byte 0x01; liblzma and the LZMA + // SDK both enforce it). lzma.ResetDictionary(); needDictionaryReset = false; + hasProperties = false; + needStateReset = true; } else if (needDictionaryReset) throw new InvalidDataException("LZMA2: The first chunk must reset the dictionary."); @@ -100,8 +105,8 @@ public byte[] Decode() { ArrayPool.Shared.Return(uncompressed); } - // Raw bytes carry no coder state, so the next LZMA chunk has to reset it. - needStateReset = true; + // 0x02 leaves the coder state alone: a following LZMA chunk without a reset continues + // the state of the last LZMA chunk, with the raw bytes in its dictionary. continue; } diff --git a/Compression.Lib/FormatDetector.cs b/Compression.Lib/FormatDetector.cs index 849934333..92c019bf3 100644 --- a/Compression.Lib/FormatDetector.cs +++ b/Compression.Lib/FormatDetector.cs @@ -508,6 +508,10 @@ private static Format DetectInstaller(string path) { // exehead itself only looks there), so a large installer keeps it far from the tail. if (HasNsisFirstHeader(fs)) return Format.Nsis; + // Inno Setup: the setup loader's offset table (at 0x30 or in RCDATA #11111) points at the + // setup-0 version tag, wherever in the file that is. + if (isPe && FileFormat.InnoSetup.InnoSetupReader.IsInnoSetup(fs)) return Format.InnoSetup; + // Other installer markers can live anywhere in the file, so scan the whole file when it // is small and the tail otherwise — independent of the MZ check, so a stub-less // installer image still re-detects as its own format. @@ -518,7 +522,6 @@ private static Format DetectInstaller(string path) { var tail = new byte[scanLen]; var bytesRead = fs.Read(tail, 0, tail.Length); var tailSpan = tail.AsSpan(0, bytesRead); - if (ContainsBytes(tailSpan, "Inno Setup"u8)) return Format.InnoSetup; // PyInstaller "onefile" build: the CArchive MEI cookie sits near EOF, // after the PE image (and before any appended Authenticode signature). if (ContainsBytes(tailSpan, PyInstallerCookie)) return Format.PyInstaller; diff --git a/Compression.Tests/Compression.Tests.csproj b/Compression.Tests/Compression.Tests.csproj index 74893a303..743dde10c 100644 --- a/Compression.Tests/Compression.Tests.csproj +++ b/Compression.Tests/Compression.Tests.csproj @@ -75,6 +75,10 @@ NsisVectors.%(Filename)%(Extension) + + + InnoVectors.%(Filename)%(Extension) + MobiVectors.%(Filename)%(Extension) diff --git a/Compression.Tests/ConversionMatrix/ConversionMatrixTests.cs b/Compression.Tests/ConversionMatrix/ConversionMatrixTests.cs index 664cfe99d..0527c4ec6 100644 --- a/Compression.Tests/ConversionMatrix/ConversionMatrixTests.cs +++ b/Compression.Tests/ConversionMatrix/ConversionMatrixTests.cs @@ -144,7 +144,6 @@ public static IEnumerable Grid() { { "G64", "[other] G64 GCR disk; exposed as track_NN.bin not original names" }, { "GameMaker", "[other] GameMaker data.win; exposed as chunks/GEN8.bin not original names" }, { "Ghost", "[other] Norton Ghost image; exposed as partitionN.bin not original names" }, - { "InnoSetup", "[other] Inno Setup installer; re-lists as the single .exe stub, names lost" }, { "Lfd", "[other] LucasArts LFD; entries renamed DATA. / RMAP.resource" }, { "LhF", "[other] LhF Amiga disk; exposed as track_NNN.raw not original names" }, { "Lnk", "[other] Windows .lnk; exposed as header.bin/linkinfo.bin not a file tree" }, diff --git a/Compression.Tests/InnoSetup/InnoSetupReaderTests.cs b/Compression.Tests/InnoSetup/InnoSetupReaderTests.cs deleted file mode 100644 index 33bc3c05b..000000000 --- a/Compression.Tests/InnoSetup/InnoSetupReaderTests.cs +++ /dev/null @@ -1,328 +0,0 @@ -using System.Buffers.Binary; -using System.Text; -using Compression.Core.Deflate; -using FileFormat.InnoSetup; - -namespace Compression.Tests.InnoSetup; - -/// -/// Tests for . -/// All tests use synthetic PE + Inno Setup payloads constructed in-memory; -/// no external installer binary is required. -/// -[TestFixture] -public class InnoSetupReaderTests { - - // --------------------------------------------------------------------------- - // Helpers — build minimal synthetic PE + Inno overlay - // --------------------------------------------------------------------------- - - /// - /// Builds a minimal 32-bit PE stub followed by an Inno Setup modern overlay. - /// The Setup.0 payload is a zlib-compressed block containing a set of Pascal - /// strings that represent fake file entries. - /// - private static byte[] BuildSyntheticInstaller( - string innoVersion, - IEnumerable filenames, - bool useLegacySig = false) { - - using var ms = new MemoryStream(); - - // --- Minimal PE stub --------------------------------------------------- - // MZ header - ms.WriteByte((byte)'M'); - ms.WriteByte((byte)'Z'); - // Pad to offset 0x3C (58 bytes of padding) - ms.Write(new byte[0x3A]); - // e_lfanew = 0x40 (64) - Span ptrBuf = stackalloc byte[4]; - BinaryPrimitives.WriteUInt32LittleEndian(ptrBuf, 0x40); - ms.Write(ptrBuf); - - // PE signature at 0x40 - ms.Write("PE\0\0"u8); - // COFF header (20 bytes) - // Machine = 0x014C (x86), NumberOfSections = 1 - Span coff = stackalloc byte[20]; - BinaryPrimitives.WriteUInt16LittleEndian(coff, 0x014C); // Machine - BinaryPrimitives.WriteUInt16LittleEndian(coff[2..], 1); // NumSections - // SizeOfOptionalHeader = 0 (we skip the optional header entirely) - BinaryPrimitives.WriteUInt16LittleEndian(coff[16..], 0); - ms.Write(coff); - - // Section table (40 bytes for one section) - // Name = ".text\0\0\0", VirtualSize = 0, VirtualAddress = 0, - // SizeOfRawData = 16, PointerToRawData = 0x40 + 4 + 20 + 40 = 0x80 - var sectionRawPtr = (uint)(0x40 + 4 + 20 + 40); // = 0x80 - var sectionRawSize = 16u; - Span sec = stackalloc byte[40]; - ".text\0\0\0"u8.CopyTo(sec); - BinaryPrimitives.WriteUInt32LittleEndian(sec[16..], sectionRawSize); - BinaryPrimitives.WriteUInt32LittleEndian(sec[20..], sectionRawPtr); - ms.Write(sec); - - // Raw section data (16 zero bytes at 0x80) - ms.Write(new byte[16]); - - // Overlay starts at sectionRawPtr + sectionRawSize = 0x80 + 0x10 = 0x90 - // Pad to 0x90 if needed - while (ms.Length < 0x90) - ms.WriteByte(0); - - // --- Inno Setup overlay ------------------------------------------------ - if (useLegacySig) { - // Legacy: "rDlPtS" + 2 version bytes (major, minor) - ms.Write("rDlPtS"u8); - ms.WriteByte(1); // major - ms.WriteByte(6); // minor - } else { - // Modern: "Inno Setup Setup Data (" + version + ")\0" - var sigStr = $"Inno Setup Setup Data ({innoVersion})\0"; - ms.Write(Encoding.ASCII.GetBytes(sigStr)); - } - - // Build the decompressed Setup.0 payload: Pascal strings for each filename - var decompressedHeader = BuildPascalStringPayload(filenames); - - // Compress with zlib (raw Deflate with zlib framing) - var zlibData = CompressZlib(decompressedHeader); - - // 4-byte header CRC (we write zero — the reader does not verify) - Span crcBuf = stackalloc byte[4]; - ms.Write(crcBuf); - - // 4-byte compressed size - Span szBuf = stackalloc byte[4]; - BinaryPrimitives.WriteUInt32LittleEndian(szBuf, (uint)zlibData.Length); - ms.Write(szBuf); - - // Compressed Setup.0 data - ms.Write(zlibData); - - return ms.ToArray(); - } - - private static byte[] BuildPascalStringPayload(IEnumerable values) { - using var ms = new MemoryStream(); - var lenBuf = new byte[4]; - foreach (var v in values) { - var bytes = Encoding.UTF8.GetBytes(v); - BinaryPrimitives.WriteUInt32LittleEndian(lenBuf, (uint)bytes.Length); - ms.Write(lenBuf); - ms.Write(bytes); - } - return ms.ToArray(); - } - - private static byte[] CompressZlib(byte[] data) { - // Compress with DeflateCompressor then wrap in zlib framing (CMF+FLG header + Adler-32 trailer) - var deflateBytes = DeflateCompressor.Compress(data); - - // Compute Adler-32 - uint a = 1, b = 0; - foreach (var byt in data) { - a = (a + byt) % 65521; - b = (b + a) % 65521; - } - var adler32 = (b << 16) | a; - - using var zlibMs = new MemoryStream(); - zlibMs.WriteByte(0x78); // CMF: method=8, windowBits=7 (32KB) - zlibMs.WriteByte(0x9C); // FLG: (0x78*256 + FLG) % 31 == 0 → FLG=0x9C - zlibMs.Write(deflateBytes); - Span adlerBuf = stackalloc byte[4]; - BinaryPrimitives.WriteUInt32BigEndian(adlerBuf, adler32); - zlibMs.Write(adlerBuf); - return zlibMs.ToArray(); - } - - // --------------------------------------------------------------------------- - // Happy-path tests - // --------------------------------------------------------------------------- - - [Test] - [Category("HappyPath")] - public void Constructor_ModernSignature_DetectsVersion() { - var installer = BuildSyntheticInstaller("5.5.3", ["setup.exe", "readme.txt"]); - using var ms = new MemoryStream(installer); - var reader = new InnoSetupReader(ms); - Assert.That(reader.Version, Is.EqualTo("5.5.3")); - } - - [Test] - [Category("HappyPath")] - public void Constructor_Version6_DetectsVersion() { - var installer = BuildSyntheticInstaller("6.2.0", ["app.exe"]); - using var ms = new MemoryStream(installer); - var reader = new InnoSetupReader(ms); - Assert.That(reader.Version, Is.EqualTo("6.2.0")); - } - - [Test] - [Category("HappyPath")] - public void Constructor_LegacySignature_DetectsVersionBytes() { - var installer = BuildSyntheticInstaller("", [], useLegacySig: true); - using var ms = new MemoryStream(installer); - var reader = new InnoSetupReader(ms); - // Legacy version is encoded as "major.minor" from the two bytes after the magic - Assert.That(reader.Version, Is.EqualTo("1.6")); - } - - [Test] - [Category("HappyPath")] - public void Entries_ContainsFilenamesFromHeader() { - var filenames = new[] { "notepad.exe", "readme.txt", "license.rtf" }; - var installer = BuildSyntheticInstaller("5.5.3", filenames); - using var ms = new MemoryStream(installer); - var reader = new InnoSetupReader(ms); - - var entryNames = reader.Entries.Select(e => e.FileName).ToList(); - // Each filename should appear in the parsed entries - foreach (var f in filenames) - Assert.That(entryNames, Has.Member(f), - $"Expected entry '{f}' to be present in parsed entries."); - } - - [Test] - [Category("HappyPath")] - public void Entries_IsReadOnlyList() { - var installer = BuildSyntheticInstaller("5.5.3", ["app.exe"]); - using var ms = new MemoryStream(installer); - var reader = new InnoSetupReader(ms); - Assert.That(reader.Entries, Is.InstanceOf>()); - } - - [Test] - [Category("HappyPath")] - public void Version_IsNotNullOrEmpty() { - var installer = BuildSyntheticInstaller("6.0.5", ["a.dll"]); - using var ms = new MemoryStream(installer); - var reader = new InnoSetupReader(ms); - Assert.That(reader.Version, Is.Not.Null.And.Not.Empty); - } - - [Test] - [Category("HappyPath")] - public void Entries_InnoConstantPaths_AreIncluded() { - // Inno Setup uses constant strings like {app}\program.exe as dest dirs - var filenames = new[] { "{app}\\program.exe", "{sys}\\helper.dll" }; - var installer = BuildSyntheticInstaller("5.6.1", filenames); - using var ms = new MemoryStream(installer); - var reader = new InnoSetupReader(ms); - - var entryNames = reader.Entries.Select(e => e.FileName).ToList(); - Assert.That(entryNames, Has.Member("{app}\\program.exe").Or.Member("{app}\\program.exe".Replace('\\', '/'))); - } - - // --------------------------------------------------------------------------- - // Entry record tests - // --------------------------------------------------------------------------- - - [Test] - [Category("HappyPath")] - public void Entry_DefaultSizeFields_AreMinusOne() { - var installer = BuildSyntheticInstaller("5.5.3", ["setup.exe"]); - using var ms = new MemoryStream(installer); - var reader = new InnoSetupReader(ms); - - // All entries from heuristic parsing have unknown sizes - Assert.That(reader.Entries.All(e => e.Size == -1 && e.CompressedSize == -1), - Is.True, "Heuristically parsed entries should report Size=-1 and CompressedSize=-1."); - } - - [Test] - [Category("HappyPath")] - public void Entry_IsDirectory_IsFalseForFiles() { - var installer = BuildSyntheticInstaller("5.5.3", ["app.exe", "data.bin"]); - using var ms = new MemoryStream(installer); - var reader = new InnoSetupReader(ms); - - Assert.That(reader.Entries.All(e => !e.IsDirectory), - Is.True, "All heuristically parsed entries should have IsDirectory=false."); - } - - // --------------------------------------------------------------------------- - // Extract — not supported for heuristically parsed entries - // --------------------------------------------------------------------------- - - [Test] - [Category("Exception")] - public void Extract_ThrowsNotSupportedException() { - var installer = BuildSyntheticInstaller("5.5.3", ["app.exe"]); - using var ms = new MemoryStream(installer); - var reader = new InnoSetupReader(ms); - - // Heuristically parsed entries carry CompressedSize=-1, so Extract throws - if (reader.Entries.Count > 0) - Assert.Throws(() => reader.Extract(reader.Entries[0])); - } - - [Test] - [Category("Exception")] - public void Extract_DirectoryEntry_ThrowsInvalidOperationException() { - var dirEntry = new InnoSetupEntry("{app}", "", -1, -1, IsDirectory: true); - // We need a reader to call Extract on; use a minimal valid installer - var installer = BuildSyntheticInstaller("5.5.3", []); - using var ms = new MemoryStream(installer); - var reader = new InnoSetupReader(ms); - - Assert.Throws(() => reader.Extract(dirEntry)); - } - - // --------------------------------------------------------------------------- - // Error handling - // --------------------------------------------------------------------------- - - [Test] - [Category("Exception")] - public void Constructor_NullStream_ThrowsArgumentNullException() { - Assert.Throws(() => _ = new InnoSetupReader(null!)); - } - - [Test] - [Category("Exception")] - public void Constructor_RandomBytes_ThrowsInvalidDataException() { - var rng = new Random(42); - var junk = new byte[512]; - rng.NextBytes(junk); - // Ensure it does not start with MZ to skip PE parsing - junk[0] = 0x00; - - using var ms = new MemoryStream(junk); - Assert.Throws(() => _ = new InnoSetupReader(ms)); - } - - [Test] - [Category("Exception")] - public void Constructor_MzButNoInnoSig_ThrowsInvalidDataException() { - // Build a minimal MZ file with no Inno signature - var data = new byte[512]; - data[0] = (byte)'M'; - data[1] = (byte)'Z'; - // e_lfanew points past end of buffer — FindSignature will scan and fail - BinaryPrimitives.WriteUInt32LittleEndian(data.AsSpan(0x3C), 0x100); - - using var ms = new MemoryStream(data); - Assert.Throws(() => _ = new InnoSetupReader(ms)); - } - - // --------------------------------------------------------------------------- - // Signature position — overlay at non-zero offset - // --------------------------------------------------------------------------- - - [Test] - [Category("HappyPath")] - public void Constructor_SignatureInOverlay_ParsedCorrectly() { - // The PE overlay is at 0x90 in our synthetic installer; ensure the reader - // finds the signature there and not at position 0. - var installer = BuildSyntheticInstaller("5.4.2", ["setup.exe", "unins000.exe"]); - using var ms = new MemoryStream(installer); - var reader = new InnoSetupReader(ms); - - Assert.Multiple(() => { - Assert.That(reader.Version, Is.EqualTo("5.4.2")); - Assert.That(reader.Entries, Is.Not.Empty); - }); - } -} diff --git a/Compression.Tests/InnoSetup/InnoSetupReferenceVectorTests.cs b/Compression.Tests/InnoSetup/InnoSetupReferenceVectorTests.cs new file mode 100644 index 000000000..d72c4d207 --- /dev/null +++ b/Compression.Tests/InnoSetup/InnoSetupReferenceVectorTests.cs @@ -0,0 +1,179 @@ +using System.IO.Compression; +using System.Security.Cryptography; +using Compression.Lib; +using FileFormat.InnoSetup; + +namespace Compression.Tests.InnoSetup; + +/// +/// Real installers compiled by ISCC 5.6.1 and 6.0.5 (see ReferenceVectors/README.md), checked +/// against what innoextract 1.9 extracts from them (oracle.tsv). +/// +[TestFixture] +public class InnoSetupReferenceVectorTests { + + private static readonly string[] Fixtures = [ + "inno561a-zip.exe", "inno561a-lzma2-solid.exe", "inno561u-lzma-solid.exe", "inno605-bzip.exe", + ]; + + private static byte[] Load(string name) { + using var resource = typeof(InnoSetupReferenceVectorTests).Assembly.GetManifestResourceStream("InnoVectors." + name + ".gz") + ?? throw new InvalidOperationException($"Missing embedded fixture {name}."); + using var gz = new GZipStream(resource, CompressionMode.Decompress); // BCL as the test-side oracle + using var ms = new MemoryStream(); + gz.CopyTo(ms); + return ms.ToArray(); + } + + private static Dictionary Oracle(string fixture) { + using var resource = typeof(InnoSetupReferenceVectorTests).Assembly.GetManifestResourceStream("InnoVectors.oracle.tsv")!; + using var reader = new StreamReader(resource); + var result = new Dictionary(StringComparer.Ordinal); + while (reader.ReadLine() is { } line) { + if (line.StartsWith('#') || line.Length == 0) + continue; + var f = line.Split('\t'); + if (f[0] == fixture) + result[f[1]] = (long.Parse(f[2], System.Globalization.CultureInfo.InvariantCulture), f[3]); + } + return result; + } + + private static string Sha(byte[] data) => Convert.ToHexStringLower(SHA256.HashData(data)); + + [TestCaseSource(nameof(Fixtures))] + public void GivenRealInstaller_WhenListed_ThenNamesAndSizesMatchInnoextract(string fixture) { + var oracle = Oracle(fixture); + Assert.That(oracle, Is.Not.Empty); + + var entries = new InnoSetupFormatDescriptor().List(new MemoryStream(Load(fixture)), null); + + Assert.That(entries.Select(e => e.Name), Is.EquivalentTo(oracle.Keys)); + foreach (var e in entries) + Assert.That(e.OriginalSize, Is.EqualTo(oracle[e.Name].Size), e.Name); + } + + [TestCaseSource(nameof(Fixtures))] + public void GivenRealInstaller_WhenExtracted_ThenEveryFileMatchesInnoextract(string fixture) { + var oracle = Oracle(fixture); + var dir = Path.Combine(Path.GetTempPath(), "cwb-inno-" + Guid.NewGuid().ToString("N")); + try { + new InnoSetupFormatDescriptor().Extract(new MemoryStream(Load(fixture)), dir, null, null); + var written = Directory.GetFiles(dir, "*", SearchOption.AllDirectories) + .ToDictionary(p => Path.GetRelativePath(dir, p).Replace('\\', '/'), p => Sha(File.ReadAllBytes(p))); + Assert.That(written.Keys, Is.EquivalentTo(oracle.Keys)); + foreach (var (name, sha) in written) + Assert.That(sha, Is.EqualTo(oracle[name].Sha), name); + } finally { + if (Directory.Exists(dir)) + Directory.Delete(dir, recursive: true); + } + } + + [TestCase("inno561a-zip.exe", InnoCompression.Zlib, false)] + [TestCase("inno561a-lzma2-solid.exe", InnoCompression.Lzma2, false)] + [TestCase("inno561u-lzma-solid.exe", InnoCompression.Lzma1, true)] + [TestCase("inno605-bzip.exe", InnoCompression.BZip2, true)] + public void GivenRealInstaller_WhenOpened_ThenVersionAndCompressorAreRecognised(string fixture, InnoCompression method, bool unicode) { + var reader = new InnoSetupReader(new MemoryStream(Load(fixture))); + Assert.Multiple(() => { + Assert.That(reader.Compression, Is.EqualTo(method)); + Assert.That(reader.Version.IsUnicode, Is.EqualTo(unicode)); + Assert.That(reader.AppName, Is.EqualTo("Fixture")); + Assert.That(reader.AppVersion, Is.EqualTo("1.0")); + }); + } + + [Test] + public void GivenRealInstallerOnDisk_WhenDetected_ThenInnoSetupIsChosen() { + var path = Path.Combine(Path.GetTempPath(), "cwb-inno-" + Guid.NewGuid().ToString("N") + ".exe"); + try { + File.WriteAllBytes(path, Load("inno561a-zip.exe")); + Assert.That(FormatDetector.Detect(path), Is.EqualTo(FormatDetector.Format.InnoSetup)); + } finally { + File.Delete(path); + } + } + + [Test] + public void GivenInstallerWithOneCorruptedPayloadByte_WhenExtracted_ThenTheChecksumRefusesIt() { + var data = Load("inno561a-zip.exe"); + var reader = new InnoSetupReader(new MemoryStream(data)); + var original = reader.Extract(reader.Entries.First(e => e.FileName == "app/sub/repeat.txt")); + Assert.That(original, Has.Length.EqualTo(32000)); + + // Corrupt a byte inside the last setup-1 chunk. + var lastChunk = data.AsSpan().LastIndexOf("zlb\x1a"u8); + Assert.That(lastChunk, Is.GreaterThan(0)); + data[lastChunk + 20] ^= 0xFF; + var corrupted = new InnoSetupReader(new MemoryStream(data)); + Assert.That(() => corrupted.ExtractMany(corrupted.Entries, (_, _) => { }), + Throws.InstanceOf().Or.InstanceOf()); + } + + [Test] + public void GivenInstallerCutBeforeItsHeaders_WhenListed_ThenAPartialMetadataEntryIsReturned() { + var data = Load("inno561a-zip.exe"); + var tag = data.AsSpan().IndexOf("Inno Setup Setup Data"u8); + Assert.That(tag, Is.GreaterThan(0)); + var cut = data.AsSpan(0, tag + 100).ToArray(); + var entries = new InnoSetupFormatDescriptor().List(new MemoryStream(cut), null); + Assert.That(entries.Select(e => e.Name), Is.EqualTo(new[] { "metadata.ini" })); + } + + [TestCase("{app}\\bin\\x.dll", "app/bin/x.dll")] + [TestCase("{app}\\..\\up.txt", "up.txt")] + [TestCase("{{literal}\\a.txt", "{literal}/a.txt")] + [TestCase("{app}\\a:b?.txt", "app/a$b$.txt")] + [TestCase("{code:GetDir|x}\\f", "code$GetDir$x/f")] + public void GivenDestination_WhenConverted_ThenInnoextractNamingIsUsed(string destination, string expected) + => Assert.That(InnoSetupReader.ConvertPath(destination), Is.EqualTo(expected)); + + [Test] + public void GivenNoStream_WhenOpened_ThenArgumentNullException() + => Assert.Throws(() => _ = new InnoSetupReader(null!)); + + [Test] + public void GivenRandomBytes_WhenOpened_ThenInvalidDataException() + => Assert.That(() => new InnoSetupReader(new MemoryStream(new byte[4096])), Throws.InstanceOf()); + + /// + /// Installers newer than any available innoextract (CWB_INNO_SELFCHECK: a directory of *.exe): + /// every file must come out with the checksum the compiler stored for it. + /// + [Test] + public void GivenLocalInstallersWithoutOracle_WhenExtracted_ThenEveryStoredChecksumMatches() { + var dir = Environment.GetEnvironmentVariable("CWB_INNO_SELFCHECK"); + if (string.IsNullOrEmpty(dir) || !Directory.Exists(dir)) + Assert.Ignore("CWB_INNO_SELFCHECK not set."); + foreach (var path in Directory.GetFiles(dir!, "*.exe")) { + using var fs = File.OpenRead(path); + var reader = new InnoSetupReader(fs); + var count = 0; + reader.ExtractMany(reader.Entries, (_, _) => ++count); + File.AppendAllLines(Path.Combine(dir!, "selfcheck.txt"), + [$"{Path.GetFileName(path)}: {reader.VersionText}, {count} files", .. reader.Entries.Select(e => $" {e.FileName}\t{e.Size}")]); + Assert.That(count, Is.EqualTo(reader.Entries.Count).And.GreaterThan(0), path); + } + } + + /// + /// Further installers on this machine (set CWB_INNO_FIXTURES to a directory of *.exe with an + /// oracle.tsv beside them, same format): every file must match innoextract. + /// + [Test] + public void GivenLocalInstallers_WhenExtracted_ThenEveryFileMatchesTheirOracle() { + var dir = Environment.GetEnvironmentVariable("CWB_INNO_FIXTURES"); + if (string.IsNullOrEmpty(dir) || !File.Exists(Path.Combine(dir, "oracle.tsv"))) + Assert.Ignore("CWB_INNO_FIXTURES not set."); + var oracle = File.ReadAllLines(Path.Combine(dir!, "oracle.tsv")).Where(l => l.Length > 0 && !l.StartsWith('#')) + .Select(l => l.Split('\t')).GroupBy(f => f[0]).ToDictionary(g => g.Key, g => g.ToDictionary(f => f[1], f => f[3])); + foreach (var (fixture, files) in oracle) { + using var fs = File.OpenRead(Path.Combine(dir!, fixture)); + var reader = new InnoSetupReader(fs); + var got = new Dictionary(); + reader.ExtractMany(reader.Entries, (e, data) => got[e.FileName] = Sha(data)); + Assert.That(got, Is.EquivalentTo(files), fixture); + } + } +} diff --git a/Compression.Tests/InnoSetup/InnoSetupWriterTests.cs b/Compression.Tests/InnoSetup/InnoSetupWriterTests.cs deleted file mode 100644 index 7224a7d53..000000000 --- a/Compression.Tests/InnoSetup/InnoSetupWriterTests.cs +++ /dev/null @@ -1,53 +0,0 @@ -using FileFormat.InnoSetup; - -namespace Compression.Tests.InnoSetup; - -[TestFixture] -public class InnoSetupWriterTests { - - [Test, Category("HappyPath")] - public void Descriptor_ReportsWormCapability() { - var d = new InnoSetupFormatDescriptor(); - Assert.That(d.Capabilities.HasFlag(Compression.Registry.FormatCapabilities.CanCreate), Is.True); - } - - [Test, Category("HappyPath")] - public void Writer_ProducesValidSignature() { - var w = new InnoSetupWriter(); - using var ms = new MemoryStream(); - w.WriteTo(ms); - var bytes = ms.ToArray(); - Assert.That(System.Text.Encoding.ASCII.GetString(bytes, 0, 23), Is.EqualTo("Inno Setup Setup Data (")); - } - - [Test, Category("HappyPath")] - public void Writer_PassesThroughReader() { - var w = new InnoSetupWriter(); - using var ms = new MemoryStream(); - w.WriteTo(ms); - ms.Position = 0; - // Reader doesn't throw on empty Setup.0 — returns empty entries list. - var r = new InnoSetupReader(ms); - Assert.That(r.Version, Is.EqualTo("1.0")); - Assert.That(r.Entries, Is.Empty); - } - - [Test, Category("HappyPath")] - public void Descriptor_Create_ProducesValidFile() { - var tmp = Path.GetTempFileName(); - try { - File.WriteAllBytes(tmp, "inno test"u8.ToArray()); - var d = new InnoSetupFormatDescriptor(); - using var ms = new MemoryStream(); - ((Compression.Registry.IArchiveCreatable)d).Create( - ms, - [new Compression.Registry.ArchiveInputInfo(tmp, "payload.bin", false)], - new Compression.Registry.FormatCreateOptions()); - ms.Position = 0; - // Listing should not throw even if entries are empty. - Assert.DoesNotThrow(() => d.List(ms, null)); - } finally { - File.Delete(tmp); - } - } -} diff --git a/Compression.Tests/InnoSetup/ReferenceVectors/README.md b/Compression.Tests/InnoSetup/ReferenceVectors/README.md new file mode 100644 index 000000000..b6616b02e --- /dev/null +++ b/Compression.Tests/InnoSetup/ReferenceVectors/README.md @@ -0,0 +1,30 @@ +# Inno Setup reference installers + +Real Inno Setup installers, compiled by the official Inno Setup compilers (never by +CompressionWorkbench): + +| Compiler | Source | +| --- | --- | +| `ISCC.exe` 5.6.1 (ANSI) | `innosetup-5.6.1.exe` from https://files.jrsoftware.org/is/5/ | +| `ISCC.exe` 5.6.1 (Unicode) | `innosetup-5.6.1-unicode.exe` from https://files.jrsoftware.org/is/5/ | +| `ISCC.exe` 6.0.5 | `innosetup-6.0.5.exe` from https://github.com/jrsoftware/issrc/releases/tag/is-6_0_5 | + +The compilers were taken out of those distributions with innoextract 1.9, never by running the +installers. `make-fixtures.py` writes the payload (two copies of a short text, 3000 seeded random +bytes, 32000 bytes of a repeated pattern) and one script per variant, then runs the compiler: +`python make-fixtures.py zip lzma2:solid ...`. File names say compiler +version (`a` ANSI, `u` Unicode), `Compression=` and `SolidCompression=yes`. Each installer is stored +gzip-compressed and otherwise unchanged. + +`oracle.tsv` is what innoextract 1.9 extracts from each installer (`innoextract -e`): path, size +and SHA-256 per file. The tests require our reader to produce exactly that set. + +Inno Setup is distributed under the Inno Setup License (Jordan Russell, Martijn Laan): permissive, +retaining its copyright notices; the installers contain only its setup loader, setup program and +the payload above. + +Not embedded (too large), checked locally with the opt-in tests in `InnoSetupReferenceVectorTests`: +the official `innosetup-5.6.1.exe`, `innosetup-5.6.1-unicode.exe` and `innosetup-6.0.5.exe` match +innoextract 1.9 file for file (`CWB_INNO_FIXTURES`); `innosetup-6.4.3.exe` (103 files) and +`innosetup-7.1.0-x86.exe` (137 files), newer than any innoextract, extract with every file matching +the SHA-256 the compiler stored for it (`CWB_INNO_SELFCHECK`). diff --git a/Compression.Tests/InnoSetup/ReferenceVectors/inno561a-lzma2-solid.exe.gz b/Compression.Tests/InnoSetup/ReferenceVectors/inno561a-lzma2-solid.exe.gz new file mode 100644 index 0000000000000000000000000000000000000000..747d459aa09c1aa37f6d9d2a4eec703e206799e4 GIT binary patch literal 282483 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 z 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

kD}65KoQ`>_tZo9e*|mI% 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 z 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 z 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

sh|(h?AIP@g<>zIJE1n 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А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%0Ah7)_@4;RFuLVR|vo`*BZKrpH7O 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

9W&?i9;>!eMMRPi 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�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

!@+v;)cWISN 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

ySjZynP6`i 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�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

X9v3fZX6g1PZqN)o0i_}<@V9jnHoXpd^&vP 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 literal 0 HcmV?d00001 diff --git a/Compression.Tests/InnoSetup/ReferenceVectors/make-fixtures.py b/Compression.Tests/InnoSetup/ReferenceVectors/make-fixtures.py new file mode 100644 index 000000000..ebb31e229 --- /dev/null +++ b/Compression.Tests/InnoSetup/ReferenceVectors/make-fixtures.py @@ -0,0 +1,36 @@ +import os, random, subprocess, sys +# usage: mkinno.py [variants...] variant = compression[:solid] +W, tag, iscc = sys.argv[1], sys.argv[2], sys.argv[3] +variants = sys.argv[4:] or ['zip', 'bzip', 'lzma', 'lzma2:solid', 'none'] +os.makedirs(os.path.join(W, 'payload', 'sub'), exist_ok=True) +os.chdir(W) +open('payload/readme.txt', 'wb').write(b'Hello from an Inno Setup fixture.\r\nLine two.\r\n') +open('payload/sub/readme-copy.txt', 'wb').write(b'Hello from an Inno Setup fixture.\r\nLine two.\r\n') +r = random.Random(1234) +open('payload/sub/random.bin', 'wb').write(bytes(r.getrandbits(8) for _ in range(3000))) +open('payload/sub/repeat.txt', 'w').write('abcdefgh' * 4000) +for v in variants: + comp, _, solid = v.partition(':') + name = f'inno{tag}-{comp}{"-solid" if solid else ""}' + iss = f'''[Setup] +AppName=Fixture +AppVersion=1.0 +DefaultDirName={{tmp}}\\innofixture +OutputDir=. +OutputBaseFilename={name} +Compression={comp} +SolidCompression={"yes" if solid else "no"} +PrivilegesRequired=lowest +Uninstallable=no +DisableProgramGroupPage=yes + +[Files] +Source: "payload\\readme.txt"; DestDir: "{{app}}" +Source: "payload\\sub\\random.bin"; DestDir: "{{app}}\\sub" +Source: "payload\\sub\\repeat.txt"; DestDir: "{{app}}\\sub" +Source: "payload\\sub\\readme-copy.txt"; DestDir: "{{app}}\\sub" +''' + open(name + '.iss', 'w').write(iss) + p = subprocess.run([iscc, '/Q', name + '.iss'], capture_output=True, text=True) + out = name + '.exe' + print(name, p.returncode, os.path.getsize(out) if os.path.exists(out) else -1, p.stdout[-300:], p.stderr[-300:]) diff --git a/Compression.Tests/InnoSetup/ReferenceVectors/oracle.tsv b/Compression.Tests/InnoSetup/ReferenceVectors/oracle.tsv new file mode 100644 index 000000000..a691ecf40 --- /dev/null +++ b/Compression.Tests/InnoSetup/ReferenceVectors/oracle.tsv @@ -0,0 +1,17 @@ +# fixture path size sha256 -- produced by innoextract 1.9 "innoextract -e" +inno561a-lzma2-solid.exe app/readme.txt 46 62981db4724efbd958840214ca8eb0a9a45f06a565a9254ad5890b0a68d3491b +inno561a-lzma2-solid.exe app/sub/random.bin 3000 ea9a04acd72963e6c050896f128a26ced2a8a41696550c6cf4a81fb57f530a91 +inno561a-lzma2-solid.exe app/sub/readme-copy.txt 46 62981db4724efbd958840214ca8eb0a9a45f06a565a9254ad5890b0a68d3491b +inno561a-lzma2-solid.exe app/sub/repeat.txt 32000 755a009b306c9e7bedbb976fbf50710eb9dddd63e9e17ac59ca8d32769fd7627 +inno561a-zip.exe app/readme.txt 46 62981db4724efbd958840214ca8eb0a9a45f06a565a9254ad5890b0a68d3491b +inno561a-zip.exe app/sub/random.bin 3000 ea9a04acd72963e6c050896f128a26ced2a8a41696550c6cf4a81fb57f530a91 +inno561a-zip.exe app/sub/readme-copy.txt 46 62981db4724efbd958840214ca8eb0a9a45f06a565a9254ad5890b0a68d3491b +inno561a-zip.exe app/sub/repeat.txt 32000 755a009b306c9e7bedbb976fbf50710eb9dddd63e9e17ac59ca8d32769fd7627 +inno561u-lzma-solid.exe app/readme.txt 46 62981db4724efbd958840214ca8eb0a9a45f06a565a9254ad5890b0a68d3491b +inno561u-lzma-solid.exe app/sub/random.bin 3000 ea9a04acd72963e6c050896f128a26ced2a8a41696550c6cf4a81fb57f530a91 +inno561u-lzma-solid.exe app/sub/readme-copy.txt 46 62981db4724efbd958840214ca8eb0a9a45f06a565a9254ad5890b0a68d3491b +inno561u-lzma-solid.exe app/sub/repeat.txt 32000 755a009b306c9e7bedbb976fbf50710eb9dddd63e9e17ac59ca8d32769fd7627 +inno605-bzip.exe app/readme.txt 46 62981db4724efbd958840214ca8eb0a9a45f06a565a9254ad5890b0a68d3491b +inno605-bzip.exe app/sub/random.bin 3000 ea9a04acd72963e6c050896f128a26ced2a8a41696550c6cf4a81fb57f530a91 +inno605-bzip.exe app/sub/readme-copy.txt 46 62981db4724efbd958840214ca8eb0a9a45f06a565a9254ad5890b0a68d3491b +inno605-bzip.exe app/sub/repeat.txt 32000 755a009b306c9e7bedbb976fbf50710eb9dddd63e9e17ac59ca8d32769fd7627 diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.InnoSetup/InnoCodec.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.InnoSetup/InnoCodec.cs new file mode 100644 index 000000000..fe9a14af3 --- /dev/null +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.InnoSetup/InnoCodec.cs @@ -0,0 +1,217 @@ +using System.Buffers.Binary; +using Compression.Core.Checksums; +using Compression.Core.Deflate; +using Compression.Core.Dictionary.Lzma; +using FileFormat.Bzip2; + +namespace FileFormat.InnoSetup; + +///

+/// The decoding pieces of an Inno Setup installer: setup-0 header blocks, setup-1 chunk +/// streams, the x86 call/jump filters and the per-file checksums. Converted from innoextract +/// (src/stream/block.cpp, chunk.cpp, lzma.cpp, exefilter.hpp; zlib licence). +/// +internal static class InnoCodec { + + /// + /// Reads one setup-0 block at the stream's position: a CRC'd header, then the payload split + /// into 4096-byte CRC'd sub-blocks, compressed as a whole. Leaves the stream after the block. + /// + public static byte[] ReadHeaderBlock(Stream stream, InnoVersion version) { + Span h = stackalloc byte[9]; + stream.ReadExactly(h[..4]); + var expectedCrc = BinaryPrimitives.ReadUInt32LittleEndian(h); + long storedSize; + InnoCompression compression; + if (version.AtLeast(6, 7, 0)) { + // TCompressedBlockHeader: StoredSize Int64, Compressed Boolean (issrc Compression.Base.pas). + Span wide = stackalloc byte[9]; + stream.ReadExactly(wide); + if (Crc32.Compute(wide) != expectedCrc) + throw new InvalidDataException("Inno Setup block header CRC mismatch."); + storedSize = BinaryPrimitives.ReadInt64LittleEndian(wide); + compression = wide[8] != 0 ? InnoCompression.Lzma1 : InnoCompression.Stored; + } else if (version.AtLeast(4, 0, 9)) { + stream.ReadExactly(h[4..9]); + if (Crc32.Compute(h[4..9]) != expectedCrc) + throw new InvalidDataException("Inno Setup block header CRC mismatch."); + storedSize = BinaryPrimitives.ReadUInt32LittleEndian(h[4..]); + compression = h[8] != 0 ? (version.AtLeast(4, 1, 6) ? InnoCompression.Lzma1 : InnoCompression.Zlib) : InnoCompression.Stored; + } else { + Span old = stackalloc byte[8]; + stream.ReadExactly(old); + if (Crc32.Compute(old) != expectedCrc) + throw new InvalidDataException("Inno Setup block header CRC mismatch."); + var compressedSize = BinaryPrimitives.ReadUInt32LittleEndian(old); + var uncompressedSize = BinaryPrimitives.ReadUInt32LittleEndian(old[4..]); + (storedSize, compression) = compressedSize == uint.MaxValue ? (uncompressedSize, InnoCompression.Stored) : (compressedSize, InnoCompression.Zlib); + storedSize += (storedSize + 4095) / 4096 * 4; + } + if (storedSize > stream.Length - stream.Position) + throw new InvalidDataException("Inno Setup block runs past the end of the file."); + + var raw = new byte[storedSize]; + stream.ReadExactly(raw); + var payload = new MemoryStream(raw.Length); + for (var p = 0; p < raw.Length;) { + if (raw.Length - p < 5) + throw new InvalidDataException("Inno Setup block ends inside a sub-block header."); + var crc = BinaryPrimitives.ReadUInt32LittleEndian(raw.AsSpan(p)); + var len = Math.Min(4096, raw.Length - p - 4); + var chunk = raw.AsSpan(p + 4, len); + if (Crc32.Compute(chunk) != crc) + throw new InvalidDataException("Inno Setup sub-block CRC mismatch."); + payload.Write(chunk); + p += 4 + len; + } + payload.Position = 0; + return compression switch { + InnoCompression.Stored => payload.ToArray(), + InnoCompression.Zlib => Decompress(InnoCompression.Zlib, payload, -1), + _ => Decompress(InnoCompression.Lzma1, payload, -1), + }; + } + + /// + /// Decompresses an Inno stream. is the number of bytes wanted, or -1 + /// to decode to the end of the stream. + /// + public static byte[] Decompress(InnoCompression compression, Stream input, long length) { + var output = new MemoryStream(length > 0 && length < int.MaxValue ? (int)length : 0); + switch (compression) { + case InnoCompression.Stored: + CopyUpTo(input, output, length); + break; + case InnoCompression.Zlib: { + Span zhdr = stackalloc byte[2]; + input.ReadExactly(zhdr); + if ((zhdr[0] & 0x0F) != 8 || ((zhdr[0] << 8) | zhdr[1]) % 31 != 0) + throw new InvalidDataException("Inno Setup zlib stream has no zlib header."); + var inflater = new DeflateDecompressor(input); + CopyUpTo(new DecompressorReader(inflater), output, length); + break; + } + case InnoCompression.BZip2: { + using var bz = new Bzip2Stream(input, Compression.Core.Streams.CompressionStreamMode.Decompress, leaveOpen: true); + CopyUpTo(bz, output, length); + break; + } + case InnoCompression.Lzma1: { + var props = new byte[5]; + input.ReadExactly(props); + if (props[0] > 9 * 5 * 5) + throw new InvalidDataException("Invalid Inno Setup LZMA properties."); + new LzmaDecoder(input, props, length).Decode(output); + break; + } + case InnoCompression.Lzma2: { + var prop = input.ReadByte(); + if (prop is < 0 or > 40) + throw new InvalidDataException("Invalid Inno Setup LZMA2 properties."); + var dictionary = prop == 40 ? int.MaxValue : (int)Math.Min(int.MaxValue, (2L | ((uint)prop & 1)) << (prop / 2 + 11)); + var decoded = new Lzma2Decoder(input, dictionary).Decode(); + output.Write(decoded, 0, length < 0 ? decoded.Length : (int)Math.Min(length, decoded.Length)); + break; + } + default: + throw new NotSupportedException($"Inno Setup compression {compression} is not supported."); + } + if (length >= 0 && output.Length < length) + throw new InvalidDataException("Inno Setup data stream ended early."); + return output.ToArray(); + } + + private static void CopyUpTo(Stream input, Stream output, long length) { + var buffer = new byte[81920]; + var remaining = length < 0 ? long.MaxValue : length; + while (remaining > 0) { + var n = input.Read(buffer, 0, (int)Math.Min(buffer.Length, remaining)); + if (n <= 0) + break; + output.Write(buffer, 0, n); + remaining -= n; + } + } + + /// Adapts a to a read-only stream. + private sealed class DecompressorReader(DeflateDecompressor inflater) : Stream { + public override bool CanRead => true; + public override bool CanSeek => false; + public override bool CanWrite => false; + public override long Length => throw new NotSupportedException(); + public override long Position { get => throw new NotSupportedException(); set => throw new NotSupportedException(); } + public override void Flush() { } + public override int Read(byte[] buffer, int offset, int count) => inflater.Decompress(buffer.AsSpan(offset, count)); + public override long Seek(long offset, SeekOrigin origin) => throw new NotSupportedException(); + public override void SetLength(long value) => throw new NotSupportedException(); + public override void Write(byte[] buffer, int offset, int count) => throw new NotSupportedException(); + } + + // ── x86 call/jump filters (exefilter.hpp) ─────────────────────────── + + /// Undoes the compiler's call-instruction optimisation on a whole file, in place. + public static void Unfilter(InnoExeFilter filter, Span data) { + switch (filter) { + case InnoExeFilter.Filter4108: Unfilter4108(data); break; + case InnoExeFilter.Filter5200: Unfilter5200(data, flipHighByte: false); break; + case InnoExeFilter.Filter5309: Unfilter5200(data, flipHighByte: true); break; + } + } + + private static void Unfilter4108(Span data) { + uint addr = 0; + var left = 0; + uint addrOffset = 5; + for (var i = 0; i < data.Length; ++i, ++addrOffset) { + var b = data[i]; + if (left == 0) { + if (b is 0xE8 or 0xE9) { + addr = ~addrOffset + 1; + left = 4; + } + } else { + addr += b; + data[i] = (byte)addr; + addr >>= 8; + --left; + } + } + } + + private static void Unfilter5200(Span data, bool flipHighByte) { + const int blockSize = 0x10000; + var i = 0; + while (i < data.Length) { + var b = data[i++]; + if (b is not (0xE8 or 0xE9)) + continue; + // i is now the number of bytes consumed, the "offset" after reading the opcode. + if (blockSize - ((i - 1) % blockSize) < 5) + continue; // instructions that span 64 KiB blocks are left alone + if (i + 4 > data.Length) + break; + var a = data.Slice(i, 4); + i += 4; + if (a[3] is 0x00 or 0xFF) { + var addr = (uint)i & 0xFFFFFF; + var rel = (uint)(a[0] | (a[1] << 8) | (a[2] << 16)) - addr; + a[0] = (byte)rel; + a[1] = (byte)(rel >> 8); + a[2] = (byte)(rel >> 16); + if (flipHighByte && (rel & 0x800000) != 0) + a[3] = (byte)~a[3]; + } + } + } + + // ── checksums ─────────────────────────────────────────────────────── + + public static bool Verify(InnoChecksumKind kind, byte[] expected, ReadOnlySpan data) => kind switch { + InnoChecksumKind.Adler32 => BinaryPrimitives.ReadUInt32LittleEndian(expected) == Adler32.Compute(data), + InnoChecksumKind.Crc32 => BinaryPrimitives.ReadUInt32LittleEndian(expected) == Crc32.Compute(data), + InnoChecksumKind.Md5 => Md5.Compute(data).AsSpan().SequenceEqual(expected), + InnoChecksumKind.Sha1 => Sha1.Compute(data).AsSpan().SequenceEqual(expected), + InnoChecksumKind.Sha256 => Sha256.Compute(data).AsSpan().SequenceEqual(expected), + _ => false, + }; +} diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.InnoSetup/InnoCursor.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.InnoSetup/InnoCursor.cs new file mode 100644 index 000000000..238963765 --- /dev/null +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.InnoSetup/InnoCursor.cs @@ -0,0 +1,114 @@ +using System.Buffers.Binary; +using System.Text; + +namespace FileFormat.InnoSetup; + +/// +/// Little-endian reader over a decoded setup-0 block, with the Inno Setup primitives: +/// length-prefixed strings, one-byte enums and packed flag sets. +/// +/// +/// Values outside an enum's range and flag bits beyond the known ones are counted in +/// ; a header that parses with warnings is the signal (as in innoextract) +/// that a different layout of an ambiguous version should be tried. +/// +internal sealed class InnoCursor(byte[] data) { + private int _pos; + + public int Warnings { get; set; } + public int Position => this._pos; + public bool AtEnd => this._pos >= data.Length; + + private ReadOnlySpan Take(int n) { + if (n < 0 || this._pos + n > data.Length) + throw new InvalidDataException("Inno Setup header data ended early."); + var span = data.AsSpan(this._pos, n); + this._pos += n; + return span; + } + + public byte U8() => this.Take(1)[0]; + public bool Bool() => this.U8() != 0; + public short I16() => BinaryPrimitives.ReadInt16LittleEndian(this.Take(2)); + public ushort U16() => BinaryPrimitives.ReadUInt16LittleEndian(this.Take(2)); + public int I32() => BinaryPrimitives.ReadInt32LittleEndian(this.Take(4)); + public uint U32() => BinaryPrimitives.ReadUInt32LittleEndian(this.Take(4)); + public long I64() => BinaryPrimitives.ReadInt64LittleEndian(this.Take(8)); + public ulong U64() => BinaryPrimitives.ReadUInt64LittleEndian(this.Take(8)); + public byte[] Bytes(int n) => this.Take(n).ToArray(); + public void Skip(int n) => this.Take(n); + + /// A 32-bit length followed by that many bytes. + public byte[] BinString() { + var n = this.I32(); + if (n < 0) + throw new InvalidDataException("Negative Inno Setup string length."); + return this.Bytes(n); + } + + public void SkipString() => this.Skip(this.CheckedLength()); + + private int CheckedLength() { + var n = this.I32(); + if (n < 0) + throw new InvalidDataException("Negative Inno Setup string length."); + return n; + } + + /// A string in the installer's text encoding (UTF-16LE for Unicode installers). + public string Text(Encoding encoding) => encoding.GetString(this.BinString()); + + /// A one-byte enum with known values. + public int Enum(int count) { + var v = this.U8(); + if (v >= count) + ++this.Warnings; + return v; + } + + /// + /// A set of flags known at compile time: one byte per eight flags, + /// with three-byte sets padded to four. + /// + public ulong Flags(int count, bool pad32 = true) { + var bytes = (count + 7) / 8; + ulong value = 0; + for (var i = 0; i < bytes; ++i) + value |= (ulong)this.U8() << (8 * i); + if (bytes == 3 && pad32) + this.U8(); + if (count < 64 && (value >> count) != 0) + ++this.Warnings; + return value; + } + + /// Starts reading a flag set whose members depend on the version. + public FlagReader BeginFlags(bool pad32 = true) => new(this, pad32); + + /// Reads the flags of a version-dependent set one declaration at a time. + internal sealed class FlagReader(InnoCursor cursor, bool pad32) { + private int _bit; + private int _bytes; + private byte _current; + + /// Declares the next flag and returns whether it is set. + public bool Next() { + if (this._bit == 0) { + this._current = cursor.U8(); + ++this._bytes; + } + var set = (this._current & (1 << this._bit)) != 0; + this._bit = (this._bit + 1) & 7; + return set; + } + + /// Declares a flag only when ; absent flags read as false. + public bool NextIf(bool present) => present && this.Next(); + + /// Finishes the set (three-byte sets carry a padding byte). + public void End() { + if (this._bytes == 3 && pad32) + cursor.U8(); + } + } +} diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.InnoSetup/InnoLoader.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.InnoSetup/InnoLoader.cs new file mode 100644 index 000000000..12da359d7 --- /dev/null +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.InnoSetup/InnoLoader.cs @@ -0,0 +1,183 @@ +using System.Buffers.Binary; +using Compression.Core.Checksums; + +namespace FileFormat.InnoSetup; + +/// +/// Where the setup headers (setup-0) and file data (setup-1) sit inside a setup executable. +/// +/// File offset of the setup-0 version tag. +/// File offset of embedded setup-1 data, or 0 when the data lives in external setup-N.bin slices. +/// Whether a setup loader offset table was found (false: the input is a bare setup-0). +internal sealed record InnoOffsets(long HeaderOffset, long DataOffset, bool TableFound); + +/// +/// Locates the setup loader's offset table: at 0x30 ("Inno" magic, before 5.1.5) or in the +/// RCDATA resource #11111 (5.1.5+). Converted from innoextract's src/loader/offsets.cpp +/// (zlib licence); the 64-bit table (revision 2) follows TSetupLdrOffsetTable in Inno Setup's +/// Shared.Struct.pas. +/// +internal static class InnoLoader { + private const uint ExeHeaderMagic = 0x6F6E6E49; // "Inno" + private const int ResourceId = 11111; + + private static readonly (byte[] Magic, uint Version)[] LoaderMagics = [ + ([.. "rDlPtS02"u8, 0x87, (byte)'e', (byte)'V', (byte)'x'], InnoVersion.V(1, 2, 10)), + ([.. "rDlPtS04"u8, 0x87, (byte)'e', (byte)'V', (byte)'x'], InnoVersion.V(4, 0, 0)), + ([.. "rDlPtS05"u8, 0x87, (byte)'e', (byte)'V', (byte)'x'], InnoVersion.V(4, 0, 3)), + ([.. "rDlPtS06"u8, 0x87, (byte)'e', (byte)'V', (byte)'x'], InnoVersion.V(4, 0, 10)), + ([.. "rDlPtS07"u8, 0x87, (byte)'e', (byte)'V', (byte)'x'], InnoVersion.V(4, 1, 6)), + ([.. "rDlPtS"u8, 0xCD, 0xE6, 0xD7, (byte)'{', 0x0B, (byte)'*'], InnoVersion.V(5, 1, 5)), + ([.. "nS5W7dT"u8, 0x83, 0xAA, 0x1B, 0x0F, (byte)'j'], InnoVersion.V(5, 1, 5)), + ]; + + public static InnoOffsets Locate(Stream stream) { + if (TryExeHeader(stream) is { } fromHeader) + return fromHeader; + if (FindRcData(stream, ResourceId) is { } resourceOffset && TryTable(stream, resourceOffset) is { } fromResource) + return fromResource; + return new(0, 0, false); + } + + private static InnoOffsets? TryExeHeader(Stream stream) { + if (stream.Length < 0x3C) + return null; + Span b = stackalloc byte[12]; + stream.Position = 0x30; + if (stream.ReadAtLeast(b, 12, throwOnEndOfStream: false) < 12) + return null; + if (BinaryPrimitives.ReadUInt32LittleEndian(b) != ExeHeaderMagic) + return null; + var table = BinaryPrimitives.ReadUInt32LittleEndian(b[4..]); + if (table != ~BinaryPrimitives.ReadUInt32LittleEndian(b[8..])) + return null; + return TryTable(stream, table); + } + + private static InnoOffsets? TryTable(Stream stream, long position) { + if (position < 0 || position + 64 > stream.Length) + return null; + var raw = new byte[64]; + stream.Position = position; + var n = stream.ReadAtLeast(raw, raw.Length, throwOnEndOfStream: false); + var t = raw.AsSpan(0, n); + + uint version = uint.MaxValue; + foreach (var (magic, v) in LoaderMagics) + if (t[..12].SequenceEqual(magic)) { + version = v; + break; + } + + var p = 12; + uint revision = 0; + if (version >= InnoVersion.V(5, 1, 5)) { + revision = BinaryPrimitives.ReadUInt32LittleEndian(t[p..]); + p += 4; + } + + if (revision >= 2) { + // TSetupLdrOffsetTable v2: TotalSize i64, OffsetEXE i64, UncompressedSizeEXE u32, CRCEXE i32, + // Offset0 i64, Offset1 i64, ReservedPadding u32, TableCRC i32. + var offset0 = BinaryPrimitives.ReadInt64LittleEndian(t[(p + 24)..]); + var offset1 = BinaryPrimitives.ReadInt64LittleEndian(t[(p + 32)..]); + var crc = BinaryPrimitives.ReadUInt32LittleEndian(t[(p + 44)..]); + if (Crc32.Compute(t[..(p + 44)]) != crc) + return null; + return new(offset0, offset1, true); + } + + p += 4; // total size + p += 4; // exe offset + if (version < InnoVersion.V(4, 1, 6)) p += 4; // exe compressed size + p += 4; // exe uncompressed size + p += 4; // exe checksum + if (version < InnoVersion.V(4, 0, 0)) p += 4; // message offset (not covered by the CRC) + var header = BinaryPrimitives.ReadUInt32LittleEndian(t[p..]); + var data = BinaryPrimitives.ReadUInt32LittleEndian(t[(p + 4)..]); + return new(header, data, true); + } + + /// Finds the file offset of an RT_RCDATA resource with the given numeric id. + internal static long? FindRcData(Stream stream, int id) { + try { + var head = new byte[4096]; + stream.Position = 0; + var n = stream.ReadAtLeast(head, head.Length, throwOnEndOfStream: false); + if (n < 0x40 || head[0] != 'M' || head[1] != 'Z') + return null; + var pe = BinaryPrimitives.ReadInt32LittleEndian(head.AsSpan(0x3C)); + if (pe < 0 || pe + 24 > n || BinaryPrimitives.ReadUInt32LittleEndian(head.AsSpan(pe)) != 0x00004550) + return null; + var sections = BinaryPrimitives.ReadUInt16LittleEndian(head.AsSpan(pe + 6)); + var optSize = BinaryPrimitives.ReadUInt16LittleEndian(head.AsSpan(pe + 20)); + var opt = pe + 24; + var magic = BinaryPrimitives.ReadUInt16LittleEndian(head.AsSpan(opt)); + var dirBase = opt + (magic == 0x20B ? 112 : 96); + if (dirBase + 24 > n) + return null; + var resRva = BinaryPrimitives.ReadUInt32LittleEndian(head.AsSpan(dirBase + 16)); + if (resRva == 0) + return null; + + var sectionTable = opt + optSize; + long RvaToOffset(uint rva) { + for (var i = 0; i < sections; ++i) { + var s = sectionTable + 40 * i; + if (s + 40 > n) break; + var va = BinaryPrimitives.ReadUInt32LittleEndian(head.AsSpan(s + 12)); + var vsize = Math.Max(BinaryPrimitives.ReadUInt32LittleEndian(head.AsSpan(s + 8)), BinaryPrimitives.ReadUInt32LittleEndian(head.AsSpan(s + 16))); + var raw = BinaryPrimitives.ReadUInt32LittleEndian(head.AsSpan(s + 20)); + if (rva >= va && rva < va + vsize) + return raw + (rva - va); + } + return -1; + } + + var root = RvaToOffset(resRva); + if (root < 0) + return null; + var typeDir = FindEntry(stream, root, root, 10); + if (typeDir is not { } td || !td.IsDirectory) return null; + var nameDir = FindEntry(stream, root, td.Offset, id); + if (nameDir is not { } nd || !nd.IsDirectory) return null; + var lang = FirstEntry(stream, root, nd.Offset); + if (lang is not { } ld || ld.IsDirectory) return null; + Span dataEntry = stackalloc byte[8]; + stream.Position = ld.Offset; + stream.ReadExactly(dataEntry); + var off = RvaToOffset(BinaryPrimitives.ReadUInt32LittleEndian(dataEntry)); + return off < 0 ? null : off; + } catch (Exception ex) when (ex is IOException or ArgumentException or InvalidDataException) { + return null; + } + } + + private static (long Offset, bool IsDirectory)? FindEntry(Stream stream, long root, long dir, int id) { + Span h = stackalloc byte[16]; + stream.Position = dir; + if (stream.ReadAtLeast(h, 16, throwOnEndOfStream: false) < 16) return null; + var named = BinaryPrimitives.ReadUInt16LittleEndian(h[12..]); + var ids = BinaryPrimitives.ReadUInt16LittleEndian(h[14..]); + Span e = stackalloc byte[8]; + for (var i = 0; i < named + ids; ++i) { + stream.Position = dir + 16 + 8 * i; + stream.ReadExactly(e); + var name = BinaryPrimitives.ReadUInt32LittleEndian(e); + var target = BinaryPrimitives.ReadUInt32LittleEndian(e[4..]); + if ((name & 0x80000000) == 0 && name == id) + return (root + (target & 0x7FFFFFFF), (target & 0x80000000) != 0); + } + return null; + } + + private static (long Offset, bool IsDirectory)? FirstEntry(Stream stream, long root, long dir) { + Span h = stackalloc byte[24]; + stream.Position = dir; + if (stream.ReadAtLeast(h, 24, throwOnEndOfStream: false) < 24) return null; + var count = BinaryPrimitives.ReadUInt16LittleEndian(h[12..]) + BinaryPrimitives.ReadUInt16LittleEndian(h[14..]); + if (count == 0) return null; + var target = BinaryPrimitives.ReadUInt32LittleEndian(h[20..]); + return (root + (target & 0x7FFFFFFF), (target & 0x80000000) != 0); + } +} diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.InnoSetup/InnoSetupConstants.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.InnoSetup/InnoSetupConstants.cs deleted file mode 100644 index c78bf1619..000000000 --- a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.InnoSetup/InnoSetupConstants.cs +++ /dev/null @@ -1,19 +0,0 @@ -namespace FileFormat.InnoSetup; - -internal static class InnoSetupConstants { - internal const string SignaturePrefix = "Inno Setup Setup Data ("; - internal static readonly byte[] LegacyMagic = "rDlPtS"u8.ToArray(); - - // Offset of the 4-byte PE header pointer inside the MZ stub - internal const int PeHeaderPtrOffset = 0x3C; - - // Magic bytes that begin a PE optional header - internal const ushort PeMagicPe32 = 0x010B; - internal const ushort PeMagicPe32Plus = 0x020B; - - // LZMA sub-header: 5-byte properties only (no size field — size is unknown / end-marker) - internal const int LzmaPropSize = 5; - - // Scan window: how far past the PE overlay start we search for the Inno signature - internal const int ScanWindow = 512 * 1024; // 512 KB -} diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.InnoSetup/InnoSetupEntry.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.InnoSetup/InnoSetupEntry.cs index f28b93423..5401b4e58 100644 --- a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.InnoSetup/InnoSetupEntry.cs +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.InnoSetup/InnoSetupEntry.cs @@ -1,17 +1,16 @@ namespace FileFormat.InnoSetup; /// -/// Represents a file or directory entry listed in an Inno Setup installer. +/// A file an Inno Setup installer installs. /// -/// The source filename or a generated name when parsing fails. -/// The destination directory string from the installer header, or empty. -/// The uncompressed file size in bytes, or -1 when unknown. -/// The compressed size in bytes, or -1 when unknown. -/// Whether this entry represents a directory rather than a file. -public sealed record InnoSetupEntry( - string FileName, - string DestDir, - long Size, - long CompressedSize, - bool IsDirectory -); +/// +/// The destination path with Inno constants spelled as directories, as innoextract writes it: +/// {app}\bin\x.dll becomes app/bin/x.dll. +/// +/// The uncompressed size in bytes. +/// The file time the compiler recorded (UTC), or null. +/// Index of the file location (data entry) holding the bytes. +public sealed record InnoSetupEntry(string FileName, long Size, DateTime? LastModified, int DataIndex) { + /// Gets whether the entry is a directory; Inno [Files] entries never are. + public bool IsDirectory => false; +} diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.InnoSetup/InnoSetupFormatDescriptor.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.InnoSetup/InnoSetupFormatDescriptor.cs index be6d7ab99..1f45e5e0f 100644 --- a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.InnoSetup/InnoSetupFormatDescriptor.cs +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.InnoSetup/InnoSetupFormatDescriptor.cs @@ -1,133 +1,87 @@ #pragma warning disable CS1591 +using System.Text; using Compression.Registry; using static Compression.Registry.FormatHelpers; namespace FileFormat.InnoSetup; /// -/// Inno Setup installer package (PE stub + Setup.0 data blob). +/// Inno Setup installer: the files of its [Files] section. /// /// References: /// -/// https://jrsoftware.org/isinfo.php — official Inno Setup site (Jordan Russell) -/// https://github.com/dscharrer/innoextract — innoextract — de-facto reference for the undocumented installer data layout -/// https://en.wikipedia.org/wiki/Inno_Setup — Wikipedia +/// https://jrsoftware.org/isinfo.php — Inno Setup; https://github.com/jrsoftware/issrc holds its sources (Shared.Struct.pas defines the records) +/// https://github.com/dscharrer/innoextract — innoextract (zlib licence), the extractor this reader was converted from and is checked against /// /// -public sealed class InnoSetupFormatDescriptor : IFormatDescriptor, IArchiveFormatOperations, IArchiveCreatable { - /// - /// Gets the id. - /// +public sealed class InnoSetupFormatDescriptor : IFormatDescriptor, IArchiveFormatOperations { public string Id => "InnoSetup"; - /// - /// Gets the display name. - /// public string DisplayName => "Inno Setup"; - /// - /// Gets the category. - /// public FormatCategory Category => FormatCategory.Archive; - /// - /// Gets the capabilities. - /// public FormatCapabilities Capabilities => - FormatCapabilities.CanList | FormatCapabilities.CanExtract | FormatCapabilities.CanCreate | - FormatCapabilities.CanTest | FormatCapabilities.SupportsMultipleEntries | - FormatCapabilities.SupportsDirectories; - /// - /// Gets the default extension. - /// + FormatCapabilities.CanList | FormatCapabilities.CanExtract | FormatCapabilities.CanTest | + FormatCapabilities.SupportsMultipleEntries | FormatCapabilities.SupportsDirectories; public string DefaultExtension => ".exe"; - /// - /// Gets the extensions. - /// + // Detected by content (FormatDetector.DetectInstaller), never by ".exe". public IReadOnlyList Extensions => []; - /// - /// Gets the compound extensions. - /// public IReadOnlyList CompoundExtensions => []; - /// - /// Gets the magic signatures. - /// public IReadOnlyList MagicSignatures => []; - /// - /// Gets the methods. - /// - public IReadOnlyList Methods => [new("innosetup", "Inno Setup")]; - /// - /// Gets the tar compression format id. - /// + public IReadOnlyList Methods => + [new("stored", "Stored"), new("zlib", "zlib"), new("bzip2", "bzip2"), new("lzma", "LZMA"), new("lzma2", "LZMA2")]; public string? TarCompressionFormatId => null; - /// - /// Gets the family. - /// public AlgorithmFamily Family => AlgorithmFamily.Archive; - /// - /// Gets the description. - /// - public string Description => "Inno Setup installer archive"; + public string Description => "Inno Setup installer: the files of its [Files] section, checksum-verified"; - /// - /// Lists the entries in the supplied container. - /// public List List(Stream stream, string? password) { - var r = new InnoSetupReader(stream); - return r.Entries.Select((e, i) => new ArchiveEntryInfo(i, e.FileName, e.Size, e.CompressedSize, - "innosetup", e.IsDirectory, false, null)).ToList(); + InnoSetupReader reader; + try { + reader = new InnoSetupReader(stream); + } catch (Exception ex) when (ex is InvalidDataException or NotSupportedException or EndOfStreamException) { + var note = Metadata(ex.Message); + return [new ArchiveEntryInfo(0, "metadata.ini", note.Length, note.Length, "stored", false, false, null, Kind: "metadata")]; + } + var method = MethodName(reader.Compression); + return reader.Entries.Select((e, i) => new ArchiveEntryInfo(i, e.FileName, e.Size, e.Size, method, false, + reader.IsEncrypted, e.LastModified)).ToList(); } - /// - /// Decodes the supplied input. - /// public void Extract(Stream stream, string outputDir, string? password, string[]? files) { - var r = new InnoSetupReader(stream); - foreach (var e in r.Entries) { - if (e.IsDirectory) continue; - if (files != null && !MatchesFilter(e.FileName, files)) continue; - WriteFile(outputDir, e.FileName, r.Extract(e)); + InnoSetupReader reader; + try { + reader = new InnoSetupReader(stream); + } catch (Exception ex) when (ex is InvalidDataException or NotSupportedException or EndOfStreamException) { + WriteFile(outputDir, "metadata.ini", Metadata(ex.Message)); + return; } + var wanted = reader.Entries.Where(e => files == null || MatchesFilter(e.FileName, files)).ToList(); + reader.ExtractMany(wanted, (e, data) => WriteFile(outputDir, e.FileName, data)); } - /// - /// Opens a single entry as a bounded read-only stream. The reader produces - /// the decoded bytes per entry; the matched bytes are wrapped in a - /// sized - /// to their logical length. - /// + /// Opens one entry as a bounded read-only stream. public Stream OpenEntry(Stream archive, string entryName, string? password) { - ArgumentNullException.ThrowIfNull(archive); - ArgumentNullException.ThrowIfNull(entryName); - if (archive.CanSeek) archive.Position = 0; - var r = new InnoSetupReader(archive); - foreach (var e in r.Entries) { - if (!string.Equals(e.FileName, entryName, StringComparison.OrdinalIgnoreCase)) continue; - var bytes = r.Extract(e); - return new Compression.Registry.Streaming.BoundedEntryStream( - new MemoryStream(bytes, writable: false), bytes.Length, leaveOpen: false); - } - return new Compression.Registry.Streaming.BoundedEntryStream( - new MemoryStream(System.Array.Empty(), writable: false), 0, leaveOpen: false); + var bytes = this.ExtractEntryToMemory(archive, entryName, password); + return new Compression.Registry.Streaming.BoundedEntryStream(new MemoryStream(bytes, writable: false), bytes.Length, leaveOpen: false); } - /// Native in-memory single-entry extraction routed through the bounded . + /// Decodes one entry into memory; an unknown name yields no bytes. public byte[] ExtractEntryToMemory(Stream archive, string entryName, string? password) { - using var s = this.OpenEntry(archive, entryName, password); - using var memoryStream = new MemoryStream(); - s.CopyTo(memoryStream); - return memoryStream.ToArray(); + ArgumentNullException.ThrowIfNull(archive); + ArgumentNullException.ThrowIfNull(entryName); + if (archive.CanSeek) + archive.Position = 0; + var reader = new InnoSetupReader(archive); + var entry = reader.Entries.FirstOrDefault(e => string.Equals(e.FileName, entryName, StringComparison.OrdinalIgnoreCase)); + return entry == null ? [] : reader.Extract(entry); } - /// - /// Performs the create operation. - /// - public void Create(Stream output, IReadOnlyList inputs, FormatCreateOptions options) { - byte[]? embedded = null; - foreach (var i in inputs) { - if (i.IsDirectory) continue; - embedded = i.ReadContent(); - break; - } - new InnoSetupWriter().WriteTo(output, embedded); - } + private static string MethodName(InnoCompression c) => c switch { + InnoCompression.Zlib => "zlib", + InnoCompression.BZip2 => "bzip2", + InnoCompression.Lzma1 => "lzma", + InnoCompression.Lzma2 => "lzma2", + _ => "stored", + }; + private static byte[] Metadata(string error) + => Encoding.UTF8.GetBytes($"format=innosetup\nparse_status=partial\nerror={error.Replace('\n', ' ')}\n"); } diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.InnoSetup/InnoSetupInfo.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.InnoSetup/InnoSetupInfo.cs new file mode 100644 index 000000000..656d2e017 --- /dev/null +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.InnoSetup/InnoSetupInfo.cs @@ -0,0 +1,765 @@ +using System.Text; + +namespace FileFormat.InnoSetup; + +/// Compression of a setup-1 chunk. +public enum InnoCompression { + /// Stored. + Stored, + /// zlib (with the two-byte zlib header). + Zlib, + /// bzip2. + BZip2, + /// LZMA with Inno's five-byte properties header. + Lzma1, + /// LZMA2 with Inno's one-byte dictionary-size header. + Lzma2, + /// A value the header does not define. + Unknown, +} + +/// Encryption of a setup-1 chunk. +public enum InnoEncryption { + /// Not encrypted. + None, + /// ARC4 keyed with MD5(salt + password) (4.2.2 – 5.3.8). + Arc4Md5, + /// ARC4 keyed with SHA-1(salt + password) (5.3.9 – 6.3.x). + Arc4Sha1, + /// XChaCha20 keyed by PBKDF2-SHA256 (6.4+). + XChaCha20, +} + +/// A [Files] entry of the install script. +internal sealed record InnoFileEntry( + string Source, string Destination, string Languages, uint Location, ulong ExternalSize, + bool DeleteAfterInstall, bool Bits32, bool Bits64, bool IgnoreVersion, bool PromptIfOlder, + bool CompareTimeStamp, bool OverwriteSameVersion, bool ReplaceSameVersionIfContentsDiffer, + bool IsUninstallerExe); + +/// A [Dirs] entry of the install script. +internal sealed record InnoDirectoryEntry(string Name, bool DeleteAfterInstall); + +/// Where one file's bytes live in setup-1 (a "file location" / data entry). +internal sealed record InnoDataEntry( + uint FirstSlice, uint LastSlice, ulong ChunkOffset, ulong FileOffset, ulong FileSize, ulong ChunkSize, + InnoChecksumKind ChecksumKind, byte[] Checksum, DateTime? Timestamp, ulong FileVersion, + bool VersionInfoValid, InnoCompression Compression, InnoEncryption Encryption, InnoExeFilter Filter); + +/// Kind of the per-file checksum. +internal enum InnoChecksumKind { Adler32, Crc32, Md5, Sha1, Sha256 } + +/// The x86 call/jump address transform applied to executables before compression. +internal enum InnoExeFilter { None, Filter4108, Filter5200, Filter5309 } + +/// +/// Parses the setup-0 header blocks: the setup header, every entry list that precedes the file +/// locations, and the file locations themselves. +/// +/// +/// Converted from innoextract (https://github.com/dscharrer/innoextract, zlib licence), +/// src/setup/*.cpp: each loader below consumes the same fields in the same version-dependent +/// order. Only the values the extractor needs are kept. +/// +internal sealed class InnoSetupInfo { + public required InnoVersion Version { get; init; } + public string AppName { get; private set; } = ""; + public string AppVersion { get; private set; } = ""; + public string BaseFilename { get; private set; } = ""; + public InnoCompression Compression { get; private set; } = InnoCompression.Zlib; + public bool EncryptionUsed { get; set; } + public uint SlicesPerDisk { get; private set; } = 1; + public Encoding TextEncoding { get; private set; } = Encoding.Unicode; + public List Files { get; } = []; + public List Directories { get; } = []; + public List DataEntries { get; } = []; + public int LanguageCount { get; private set; } + public string SevenZipLibraryName { get; private set; } = ""; + + // header counts + private uint _languages, _messages, _permissions, _types, _components, _tasks, _directories, _files, + _dataEntries, _issigKeys, _icons, _ini, _registry, _delete, _uninstallDelete, _run, _uninstallRun; + private byte[] _appNameRaw = [], _appVersionRaw = [], _baseFilenameRaw = []; + + static InnoSetupInfo() => Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); + + private InnoVersion V => this.Version; + + /// Parses the primary header block (header, languages ... run entries, images). + public void LoadPrimary(byte[] block, out int warnings, out bool trailing) { + var c = new InnoCursor(block); + this.LoadHeader(c); + + // Languages decide the text encoding of ANSI installers. + var codepages = new List(); + for (var i = 0; i < this._languages; ++i) + codepages.Add(this.LoadLanguage(c)); + this.LanguageCount = codepages.Count; + if (this.V.IsUnicode) + this.TextEncoding = Encoding.Unicode; + else { + var cp = codepages.Count == 0 || codepages.Contains(1252) ? 1252 : codepages[0]; + try { + this.TextEncoding = Encoding.GetEncoding(cp); + } catch (Exception ex) when (ex is ArgumentException or NotSupportedException) { + this.TextEncoding = Encoding.GetEncoding(1252); + } + } + + this.AppName = this.TextEncoding.GetString(this._appNameRaw); + this.AppVersion = this.TextEncoding.GetString(this._appVersionRaw); + this.BaseFilename = this.TextEncoding.GetString(this._baseFilenameRaw); + + if (this.V.Below(4, 0, 0)) + this.LoadWizardAndDecompressor(c); + + for (var i = 0; i < this._messages; ++i) this.SkipMessage(c); + for (var i = 0; i < this._permissions; ++i) c.SkipString(); + for (var i = 0; i < this._types; ++i) this.SkipType(c); + for (var i = 0; i < this._components; ++i) this.SkipComponent(c); + for (var i = 0; i < this._tasks; ++i) this.SkipTask(c); + for (var i = 0; i < this._directories; ++i) this.Directories.Add(this.LoadDirectory(c)); + for (var i = 0; i < this._issigKeys; ++i) { c.SkipString(); c.SkipString(); c.SkipString(); } + for (var i = 0; i < this._files; ++i) this.Files.Add(this.LoadFile(c)); + for (var i = 0; i < this._icons; ++i) this.SkipIcon(c); + for (var i = 0; i < this._ini; ++i) this.SkipIni(c); + for (var i = 0; i < this._registry; ++i) this.SkipRegistry(c); + for (var i = 0; i < this._delete; ++i) this.SkipDelete(c); + for (var i = 0; i < this._uninstallDelete; ++i) this.SkipDelete(c); + for (var i = 0; i < this._run; ++i) this.SkipRun(c); + for (var i = 0; i < this._uninstallRun; ++i) this.SkipRun(c); + + if (this.V.AtLeast(4, 0, 0)) + this.LoadWizardAndDecompressor(c); + + warnings = c.Warnings; + trailing = !c.AtEnd; + } + + /// Parses the secondary header block: the file locations. + public void LoadData(byte[] block, out int warnings, out bool trailing) { + var c = new InnoCursor(block); + for (var i = 0; i < this._dataEntries; ++i) + this.DataEntries.Add(this.LoadDataEntry(c)); + warnings = c.Warnings; + trailing = !c.AtEnd; + } + + // ── header (src/setup/header.cpp) ──────────────────────────────────── + + private void LoadHeader(InnoCursor c) { + var v = this.V; + if (v.Below(1, 3, 0)) c.U32(); + this._appNameRaw = c.BinString(); + c.SkipString(); // app_versioned_name + if (v.AtLeast(1, 3, 0)) c.SkipString(); // app_id + c.SkipString(); // copyright + if (v.AtLeast(1, 3, 0)) { c.SkipString(); c.SkipString(); } // publisher, publisher url + if (v.AtLeast(5, 1, 13)) c.SkipString(); // support phone + if (v.AtLeast(1, 3, 0)) { c.SkipString(); c.SkipString(); this._appVersionRaw = c.BinString(); } // support url, updates url, version + c.SkipString(); // default dir name + c.SkipString(); // default group name + if (v.Below(3, 0, 0)) c.SkipString(); // uninstall icon name + this._baseFilenameRaw = c.BinString(); + if (v.AtLeast(1, 3, 0) && v.Below(5, 2, 5)) { c.SkipString(); c.SkipString(); c.SkipString(); } // license, info before/after + if (v.AtLeast(1, 3, 3)) c.SkipString(); // uninstall files dir + if (v.AtLeast(1, 3, 6)) { c.SkipString(); c.SkipString(); } // uninstall name, icon + if (v.AtLeast(1, 3, 14)) c.SkipString(); // app mutex + if (v.AtLeast(3, 0, 0)) { c.SkipString(); c.SkipString(); } // default user name, organisation + if (v.AtLeast(4, 0, 0) || (v.IsIsx && v.AtLeast(3, 0, 6, 1))) c.SkipString(); // default serial + if ((v.AtLeast(4, 0, 0) && v.Below(5, 2, 5)) || (v.IsIsx && v.AtLeast(1, 3, 24))) c.SkipString(); // compiled code + if (v.AtLeast(4, 2, 4)) { c.SkipString(); c.SkipString(); c.SkipString(); c.SkipString(); } // readme, contact, comments, modify path + if (v.AtLeast(5, 3, 8)) c.SkipString(); // create uninstall registry key + if (v.AtLeast(5, 3, 10)) c.SkipString(); // uninstallable + if (v.AtLeast(5, 5, 0)) c.SkipString(); // close applications filter + if (v.AtLeast(5, 5, 6)) c.SkipString(); // setup mutex + if (v.AtLeast(5, 6, 1)) { c.SkipString(); c.SkipString(); } // changes environment, associations + if (v.AtLeast(6, 3, 0)) { c.SkipString(); c.SkipString(); } // architectures allowed / 64-bit mode expressions + // From here on the layout follows Inno Setup's own Shared.Struct.pas (issrc), not innoextract. + if (v.AtLeast(6, 4, 2)) c.SkipString(); // close applications filter excludes + if (v.AtLeast(6, 5, 0)) this.SevenZipLibraryName = this.Str(c); + if (v.AtLeast(6, 7, 0)) for (var i = 0; i < 5; ++i) c.SkipString(); // UsePrevious* expressions + if (v.AtLeast(5, 2, 5)) { c.SkipString(); c.SkipString(); c.SkipString(); } // license, info before/after + if (v.AtLeast(5, 2, 1) && v.Below(5, 3, 10)) c.SkipString(); // uninstaller signature + if (v.AtLeast(5, 2, 5)) c.SkipString(); // compiled code + + if (v.AtLeast(2, 0, 6) && !v.IsUnicode) { + c.Skip(32); // lead-byte set (256 bits); .NET's DBCS encodings know their lead bytes + } + + this._languages = v.AtLeast(4, 0, 0) ? c.U32() : v.AtLeast(2, 0, 1) ? 1u : 0u; + this._messages = v.AtLeast(4, 2, 1) ? c.U32() : 0; + this._permissions = v.AtLeast(4, 1, 0) ? c.U32() : 0; + if (v.AtLeast(2, 0, 0) || v.IsIsx) { this._types = c.U32(); this._components = c.U32(); } + if (v.AtLeast(2, 0, 0) || (v.IsIsx && v.AtLeast(1, 3, 17))) this._tasks = c.U32(); + this._directories = c.U32(); + if (v.AtLeast(6, 5, 0)) this._issigKeys = c.U32(); + this._files = c.U32(); + this._dataEntries = c.U32(); + this._icons = c.U32(); + this._ini = c.U32(); + this._registry = c.U32(); + this._delete = c.U32(); + this._uninstallDelete = c.U32(); + this._run = c.U32(); + this._uninstallRun = c.U32(); + if (v.AtLeast(7, 0, 0, 3)) c.U32(); // compiled code version + + int licenseSize = 0, infoBeforeSize = 0, infoAfterSize = 0; + if (v.Below(1, 3, 0)) { licenseSize = c.I32(); infoBeforeSize = c.I32(); infoAfterSize = c.I32(); } + + this.SkipWindowsVersionRange(c); + + if (v.Below(6, 4, 0, 1)) c.U32(); // back color + if (v.AtLeast(1, 3, 3) && v.Below(6, 4, 0, 1)) c.U32(); // back color 2 + if (v.Below(5, 5, 7)) c.U32(); // image back color + if ((v.AtLeast(2, 0, 0) && v.Below(5, 0, 4)) || v.IsIsx) c.U32(); // small image back color + + if (v.AtLeast(6, 6, 0)) { c.U32(); c.U32(); c.Enum(3); } // resize percent x/y, dark style + else if (v.AtLeast(6, 0, 0)) { c.Enum(2); c.U32(); c.U32(); } // wizard style, resize percent x/y + if (v.AtLeast(5, 5, 7)) c.Enum(3); // image alpha format + var colors = v.AtLeast(6, 7, 0) ? 3 : 2; + if (v.AtLeast(6, 5, 2)) c.Skip(4 * colors); // image, small image (, wizard) back colors + if (v.AtLeast(6, 6, 0)) c.Skip(4 * colors); // their dynamic-dark variants + if (v.AtLeast(6, 6, 1)) c.Skip(v.AtLeast(6, 7, 0) ? 2 : 1); // image (, back image) opacity + if (v.AtLeast(6, 7, 0)) c.Enum(3); // light control styling + + if (v.AtLeast(6, 5, 0)) { } // encryption moved to the header outside the blocks + else if (v.AtLeast(6, 4, 0)) c.Skip(4); // password check (XChaCha20) + else if (v.AtLeast(5, 3, 9)) c.Skip(20); // SHA-1 + else if (v.AtLeast(4, 2, 0)) c.Skip(16); // MD5 + else c.Skip(4); // CRC32 + if (v.AtLeast(6, 5, 0)) { } + else if (v.AtLeast(6, 4, 0)) c.Skip(44); // PBKDF2 salt + iterations + base nonce + else if (v.AtLeast(4, 2, 2)) c.Skip(8); // salt + + if (v.AtLeast(4, 0, 0)) { c.I64(); this.SlicesPerDisk = c.U32(); } // extra disk space, slices per disk + else c.I32(); + + if ((v.AtLeast(2, 0, 0) && v.Below(5, 0, 0)) || (v.IsIsx && v.AtLeast(1, 3, 4))) c.Enum(3); // install mode + if (v.AtLeast(1, 3, 0)) c.Enum(3); // uninstall log mode + if (v.AtLeast(5, 0, 0)) { } // uninstall style is implied + else if (v.AtLeast(2, 0, 0) || (v.IsIsx && v.AtLeast(1, 3, 13))) c.Enum(2); + if (v.AtLeast(1, 3, 6)) c.Enum(3); // dir exists warning + if (v.IsIsx && v.AtLeast(2, 0, 10) && v.Below(3, 0, 0)) c.I32(); // code line offset + if (v.AtLeast(3, 0, 0) && v.Below(3, 0, 3)) c.Enum(3); // restart + if (v.AtLeast(5, 3, 7)) c.Enum(4); // privileges required + else if (v.AtLeast(3, 0, 4) || (v.IsIsx && v.AtLeast(3, 0, 3))) c.Enum(3); + if (v.AtLeast(5, 7, 0)) c.Flags(2); // privileges required overrides + if (v.AtLeast(4, 0, 10)) { c.Enum(3); c.Enum(3); } // show language dialog, language detection + + var compressionSet = false; + if (v.AtLeast(5, 3, 9)) { this.Compression = c.Enum(5) switch { 0 => InnoCompression.Stored, 1 => InnoCompression.Zlib, 2 => InnoCompression.BZip2, 3 => InnoCompression.Lzma1, 4 => InnoCompression.Lzma2, _ => InnoCompression.Unknown }; compressionSet = true; } + else if (v.AtLeast(4, 2, 6)) { this.Compression = c.Enum(4) switch { 0 => InnoCompression.Stored, 1 => InnoCompression.Zlib, 2 => InnoCompression.BZip2, 3 => InnoCompression.Lzma1, _ => InnoCompression.Unknown }; compressionSet = true; } + else if (v.AtLeast(4, 2, 5)) { this.Compression = c.Enum(3) switch { 0 => InnoCompression.Stored, 1 => InnoCompression.BZip2, 2 => InnoCompression.Lzma1, _ => InnoCompression.Unknown }; compressionSet = true; } + else if (v.AtLeast(4, 1, 5)) { this.Compression = c.Enum(3) switch { 0 => InnoCompression.Zlib, 1 => InnoCompression.BZip2, 2 => InnoCompression.Lzma1, _ => InnoCompression.Unknown }; compressionSet = true; } + + if (v.AtLeast(6, 3, 0)) { } + else if (v.AtLeast(5, 6, 0)) { c.Flags(5); c.Flags(5); } // architectures allowed / 64-bit mode + else if (v.AtLeast(5, 1, 0)) { c.Flags(4); c.Flags(4); } + + if (v.AtLeast(5, 2, 1) && v.Below(5, 3, 10)) { c.U32(); c.U32(); } // signed uninstaller size, checksum + if (v.AtLeast(5, 3, 3)) { c.Enum(3); c.Enum(3); } // disable dir page, disable program group page + if (v.AtLeast(5, 5, 0)) c.U64(); // uninstall display size + else if (v.AtLeast(5, 3, 6)) c.U32(); + + if (v.Value == InnoVersion.V(5, 3, 10, 1) || v.Value == InnoVersion.V(5, 4, 2, 1) || v.Value == InnoVersion.V(5, 5, 0, 1)) + c.U8(); // the modified variant's extra byte + + bool bzipUsed; + if (v.AtLeast(6, 5, 0)) { + c.Flags(v.AtLeast(6, 7, 0) ? 57 : v.AtLeast(6, 6, 0) ? 46 : 43); + bzipUsed = false; + } else + bzipUsed = this.LoadHeaderFlags(c); + if (!compressionSet) + this.Compression = bzipUsed ? InnoCompression.BZip2 : InnoCompression.Zlib; + + if (v.Below(1, 3, 0)) + c.Skip(Math.Max(0, licenseSize) + Math.Max(0, infoBeforeSize) + Math.Max(0, infoAfterSize)); + } + + /// header::load_flags; returns the "bzip used" flag of pre-4.1.5 versions. + private bool LoadHeaderFlags(InnoCursor c) { + var v = this.V; + var f = c.BeginFlags(); + f.Next(); // disable startup prompt + f.NextIf(v.Below(5, 3, 10)); // uninstallable + f.Next(); // create app dir + f.NextIf(v.Below(5, 3, 3)); // disable dir page + f.NextIf(v.Below(1, 3, 6)); // disable dir exists warning + f.NextIf(v.Below(5, 3, 3)); // disable program group page + f.Next(); // allow no icons + f.NextIf(v.Below(3, 0, 0) || v.AtLeast(3, 0, 3)); // always restart + f.NextIf(v.Below(1, 3, 3)); // back solid + f.Next(); // always use personal group + if (v.Below(6, 4, 0, 1)) { f.Next(); f.Next(); f.Next(); f.Next(); } // window visible/caption/resizable/maximized + f.Next(); // enable dir doesn't exist warning + f.NextIf(v.Below(4, 1, 2)); // disable append dir + f.Next(); // password + f.NextIf(v.AtLeast(1, 2, 6)); // allow root directory + f.NextIf(v.AtLeast(1, 2, 14)); // disable finished page + f.NextIf(v.Below(3, 0, 4)); // admin privileges required + f.NextIf(v.Below(3, 0, 0)); // always create uninstall icon + f.NextIf(v.Below(1, 3, 6)); // overwrite uninst reg entries + f.NextIf(v.Below(5, 6, 1)); // changes associations + f.NextIf(v.AtLeast(1, 3, 0) && v.Below(5, 3, 8)); // create uninstall reg key + f.NextIf(v.AtLeast(1, 3, 1)); // use previous app dir + f.NextIf(v.AtLeast(1, 3, 3) && v.Below(6, 4, 0, 1)); // back color horizontal + f.NextIf(v.AtLeast(1, 3, 10)); // use previous group + f.NextIf(v.AtLeast(1, 3, 20)); // update uninstall log app name + f.NextIf(v.AtLeast(2, 0, 0) || (v.IsIsx && v.AtLeast(1, 3, 10))); // use previous setup type + if (v.AtLeast(2, 0, 0)) { f.Next(); f.Next(); f.Next(); f.Next(); f.Next(); f.Next(); } // ready memo .. disable ready page + if (v.AtLeast(2, 0, 7)) { f.Next(); f.Next(); } // always show dir/group on ready page + var bzipUsed = f.NextIf(v.AtLeast(2, 0, 17) && v.Below(4, 1, 5)); + f.NextIf(v.AtLeast(2, 0, 18)); // allow UNC path + if (v.AtLeast(3, 0, 0)) { f.Next(); f.Next(); } // user info page, use previous user info + f.NextIf(v.AtLeast(3, 0, 1)); // uninstall restart computer + f.NextIf(v.AtLeast(3, 0, 3)); // restart if needed by run + f.NextIf(v.AtLeast(4, 0, 0) || (v.IsIsx && v.AtLeast(3, 0, 3))); // show tasks tree lines + f.NextIf(v.AtLeast(4, 0, 0) && v.Below(4, 0, 10)); // show language dialog + f.NextIf(v.AtLeast(4, 0, 1) && v.Below(4, 0, 10)); // detect language using locale + f.NextIf(v.AtLeast(4, 0, 9)); // allow cancel during install + f.NextIf(v.AtLeast(4, 1, 3)); // wizard image stretch + if (v.AtLeast(4, 1, 8)) { f.Next(); f.Next(); } // append default dir/group name + this.EncryptionUsed = f.NextIf(v.AtLeast(4, 2, 2)); + f.NextIf(v.AtLeast(5, 0, 4) && v.Below(5, 6, 1)); // changes environment + f.NextIf(v.AtLeast(5, 1, 7) && !v.IsUnicode); // show undisplayable languages + f.NextIf(v.AtLeast(5, 1, 13)); // setup logging + f.NextIf(v.AtLeast(5, 2, 1)); // signed uninstaller + f.NextIf(v.AtLeast(5, 3, 8)); // use previous language + f.NextIf(v.AtLeast(5, 3, 9)); // disable welcome page + if (v.AtLeast(5, 5, 0)) { f.Next(); f.Next(); f.Next(); } // close/restart applications, allow network drive + f.NextIf(v.AtLeast(5, 5, 7)); // force close applications + if (v.AtLeast(6, 0, 0)) { f.Next(); f.Next(); f.Next(); } // app name has consts, use previous privileges, wizard resizable + f.NextIf(v.AtLeast(6, 3, 0)); // uninstall logging + f.End(); + return bzipUsed; + } + + private void SkipWindowsVersionRange(InnoCursor c) { + for (var i = 0; i < 2; ++i) { + // win version, nt version: [build u16] minor u8 major u8; then nt service pack + if (this.V.AtLeast(1, 3, 19)) c.U16(); + c.U8(); c.U8(); + if (this.V.AtLeast(1, 3, 19)) c.U16(); + c.U8(); c.U8(); + if (this.V.AtLeast(1, 3, 19)) { c.U8(); c.U8(); } + } + } + + private void LoadWizardAndDecompressor(InnoCursor c) { + var v = this.V; + void SkipImages() { + var count = v.AtLeast(5, 6, 0) ? c.U32() : 1; + for (var i = 0; i < count; ++i) + c.SkipString(); + } + if (v.AtLeast(6, 6, 0)) { + // Light and dynamic-dark sets of wizard, small (and from 6.7.0 background) images; -1 = none. + var sets = v.AtLeast(6, 7, 0) ? 6 : 4; + for (var s = 0; s < sets; ++s) { + var count = c.I32(); + for (var i = 0; i < count; ++i) + c.SkipString(); + } + } else { + SkipImages(); + if (v.AtLeast(2, 0, 0) || v.IsIsx) + SkipImages(); + } + if (this.Compression == InnoCompression.BZip2 + || (this.Compression == InnoCompression.Lzma1 && v.Value == InnoVersion.V(4, 1, 5)) + || (this.Compression == InnoCompression.Zlib && v.AtLeast(4, 2, 6))) + c.SkipString(); // decompressor dll + if (v.AtLeast(6, 5, 0) && this.SevenZipLibraryName.Length > 0) + c.SkipString(); // 7-Zip library + if (this.EncryptionUsed && v.Below(6, 4, 0)) + c.SkipString(); // decryption dll + } + + private string Str(InnoCursor c) => this.TextEncoding.GetString(c.BinString()); + + // ── entries (src/setup/*.cpp) ──────────────────────────────────────── + + private int LoadLanguage(InnoCursor c) { + var v = this.V; + if (v.AtLeast(6, 6, 0)) { + for (var i = 0; i < 8; ++i) c.SkipString(); // name, language name, dialog font, welcome font; data, license, info before/after + c.U16(); // language id + c.Skip(4 * 4); // dialog font size, base scale height, base scale width, welcome font size + c.Bool(); // right to left + return 1200; + } + if (v.AtLeast(4, 0, 0)) c.SkipString(); // name + c.SkipString(); // language name + if (v.Value == InnoVersion.V(5, 5, 7, 1)) c.SkipString(); + c.SkipString(); c.SkipString(); c.SkipString(); c.SkipString(); // dialog, title, welcome, copyright fonts + if (v.AtLeast(4, 0, 0)) c.SkipString(); // data + if (v.AtLeast(4, 0, 1)) { c.SkipString(); c.SkipString(); c.SkipString(); } // license, info before/after + var languageId = c.U32(); + var codepage = 1252; + if (v.Below(4, 2, 2)) + codepage = DefaultCodepage(languageId); + else if (!v.IsUnicode) { + codepage = (int)c.U32(); + if (codepage == 0) codepage = 1252; + } else if (v.Below(5, 3, 0)) + c.U32(); + c.U32(); // dialog font size + if (v.Below(4, 1, 0)) c.U32(); // dialog font standard height + c.U32(); c.U32(); c.U32(); // title, welcome, copyright font sizes + if (v.Value == InnoVersion.V(5, 5, 7, 1)) c.U32(); + if (v.AtLeast(5, 2, 3)) c.Bool(); // right to left + return codepage; + } + + private void SkipMessage(InnoCursor c) { + c.SkipString(); c.SkipString(); c.I32(); + } + + private void SkipConditions(InnoCursor c) { + var v = this.V; + if (v.AtLeast(2, 0, 0) || (v.IsIsx && v.AtLeast(1, 3, 8))) c.SkipString(); // components + if (v.AtLeast(2, 0, 0) || (v.IsIsx && v.AtLeast(1, 3, 17))) c.SkipString(); // tasks + if (v.AtLeast(4, 0, 1)) c.SkipString(); // languages + if (v.AtLeast(4, 0, 0) || (v.IsIsx && v.AtLeast(1, 3, 24))) c.SkipString(); // check + if (v.AtLeast(4, 1, 0)) { c.SkipString(); c.SkipString(); } // after/before install + } + + private string ReadConditionsLanguages(InnoCursor c) { + var v = this.V; + var languages = ""; + if (v.AtLeast(2, 0, 0) || (v.IsIsx && v.AtLeast(1, 3, 8))) c.SkipString(); + if (v.AtLeast(2, 0, 0) || (v.IsIsx && v.AtLeast(1, 3, 17))) c.SkipString(); + if (v.AtLeast(4, 0, 1)) languages = this.Str(c); + if (v.AtLeast(4, 0, 0) || (v.IsIsx && v.AtLeast(1, 3, 24))) c.SkipString(); + if (v.AtLeast(4, 1, 0)) { c.SkipString(); c.SkipString(); } + return languages; + } + + private void SkipType(InnoCursor c) { + var v = this.V; + c.SkipString(); c.SkipString(); // name, description + if (v.AtLeast(4, 0, 1)) c.SkipString(); // languages + if (v.AtLeast(4, 0, 0) || (v.IsIsx && v.AtLeast(1, 3, 24))) c.SkipString(); // check + this.SkipWindowsVersionRange(c); + c.Flags(1); + if (v.AtLeast(4, 0, 3)) c.Enum(4); + if (v.AtLeast(4, 0, 0)) c.U64(); else c.U32(); + } + + private void SkipComponent(InnoCursor c) { + var v = this.V; + c.SkipString(); c.SkipString(); c.SkipString(); // name, description, types + if (v.AtLeast(4, 0, 1)) c.SkipString(); + if (v.AtLeast(4, 0, 0) || (v.IsIsx && v.AtLeast(1, 3, 24))) c.SkipString(); + if (v.AtLeast(4, 0, 0)) c.U64(); else c.U32(); // extra disk space + if (v.AtLeast(6, 7, 0)) c.U8(); // level + else if (v.AtLeast(4, 0, 0) || (v.IsIsx && v.AtLeast(3, 0, 3))) c.I32(); // level + if (v.AtLeast(4, 0, 0) || (v.IsIsx && v.AtLeast(3, 0, 4))) c.Bool(); // used + this.SkipWindowsVersionRange(c); + if (v.AtLeast(4, 2, 3)) c.Flags(5); + else if (v.AtLeast(3, 0, 8) || (v.IsIsx && v.AtLeast(3, 0, 6, 1))) c.Flags(4); + else c.Flags(3); + if (v.AtLeast(4, 0, 0)) c.U64(); + else if (v.AtLeast(2, 0, 0) || (v.IsIsx && v.AtLeast(1, 3, 24))) c.U32(); + } + + private void SkipTask(InnoCursor c) { + var v = this.V; + c.SkipString(); c.SkipString(); c.SkipString(); c.SkipString(); // name, description, group, components + if (v.AtLeast(4, 0, 1)) c.SkipString(); + if (v.AtLeast(4, 0, 0) || (v.IsIsx && v.AtLeast(1, 3, 24))) c.SkipString(); + if (v.AtLeast(6, 7, 0)) c.U8(); + else if (v.AtLeast(4, 0, 0) || (v.IsIsx && v.AtLeast(3, 0, 3))) c.I32(); + if (v.AtLeast(4, 0, 0) || (v.IsIsx && v.AtLeast(3, 0, 4))) c.Bool(); + this.SkipWindowsVersionRange(c); + var f = c.BeginFlags(); + f.Next(); f.Next(); + f.NextIf(v.AtLeast(2, 0, 5)); + f.NextIf(v.AtLeast(2, 0, 6)); + f.NextIf(v.AtLeast(4, 2, 3)); + f.End(); + } + + private InnoDirectoryEntry LoadDirectory(InnoCursor c) { + var v = this.V; + if (v.Below(1, 3, 0)) c.U32(); + var name = this.Str(c); + this.SkipConditions(c); + if (v.AtLeast(4, 0, 11) && v.Below(4, 1, 0)) c.SkipString(); // permissions + if (v.AtLeast(2, 0, 11)) c.U32(); // attributes + this.SkipWindowsVersionRange(c); + if (v.AtLeast(4, 1, 0)) c.I16(); // permission index + var options = v.AtLeast(5, 2, 0) ? c.Flags(5) : c.Flags(3); + return new(name, (options & 2) != 0); + } + + private InnoFileEntry LoadFile(InnoCursor c) { + var v = this.V; + if (v.AtLeast(6, 5, 0)) + return this.LoadModernFile(c); + if (v.Below(1, 3, 0)) c.U32(); + var source = this.Str(c); + var destination = this.Str(c); + c.SkipString(); // install font name + if (v.AtLeast(5, 2, 5)) c.SkipString(); // strong assembly name + var languages = this.ReadConditionsLanguages(c); + this.SkipWindowsVersionRange(c); + var location = c.U32(); + c.U32(); // attributes + var externalSize = v.AtLeast(4, 0, 0) ? c.U64() : c.U32(); + var copyModeOptions = (ignoreVersion: false, promptIfOlder: false); + if (v.Below(3, 0, 5)) { + switch (c.Enum(4)) { + case 0: copyModeOptions = (false, true); break; + case 1: copyModeOptions = (false, true); break; + case 2: copyModeOptions = (true, true); break; + } + } + if (v.AtLeast(4, 1, 0)) c.I16(); // permission + + var f = c.BeginFlags(); + f.Next(); // confirm overwrite + f.Next(); // never uninstall + f.Next(); // restart replace + var deleteAfterInstall = f.Next(); + f.Next(); f.Next(); f.Next(); // register server, register type lib, shared file + f.NextIf(v.Below(2, 0, 0) && !v.IsIsx); // is readme file + var compareTimeStamp = f.Next(); + f.Next(); // font is not truetype + f.NextIf(v.AtLeast(1, 2, 5)); // skip if source doesn't exist + f.NextIf(v.AtLeast(1, 2, 6)); // overwrite read only + var overwriteSameVersion = false; + if (v.AtLeast(1, 3, 21)) { overwriteSameVersion = f.Next(); f.Next(); } // custom dest name + f.NextIf(v.AtLeast(1, 3, 25)); // only if dest file exists + f.NextIf(v.AtLeast(2, 0, 5)); // no reg error + f.NextIf(v.AtLeast(3, 0, 1)); // unins restart delete + var ignoreVersion = copyModeOptions.ignoreVersion; + var promptIfOlder = copyModeOptions.promptIfOlder; + if (v.AtLeast(3, 0, 5)) { f.Next(); ignoreVersion |= f.Next(); promptIfOlder |= f.Next(); } // only if doesn't exist, ignore version, prompt if older + f.NextIf(v.AtLeast(4, 0, 0) || (v.IsIsx && v.AtLeast(3, 0, 6, 1))); // don't copy + f.NextIf(v.AtLeast(4, 0, 5)); // unins remove read only + f.NextIf(v.AtLeast(4, 1, 8)); // recurse subdirs external + var replaceSameIfDiffer = f.NextIf(v.AtLeast(4, 2, 1)); + f.NextIf(v.AtLeast(4, 2, 5)); // don't verify checksum + f.NextIf(v.AtLeast(5, 0, 3)); // unins no shared file prompt + f.NextIf(v.AtLeast(5, 1, 0)); // create all subdirs + bool bits32 = false, bits64 = false; + if (v.AtLeast(5, 1, 2)) { bits32 = f.Next(); bits64 = f.Next(); } + if (v.AtLeast(5, 2, 0)) { f.Next(); f.Next(); f.Next(); } // external size preset, set/unset ntfs compression + f.NextIf(v.AtLeast(5, 2, 5)); // gac install + f.End(); + var type = v.AtLeast(5, 0, 0) ? c.Enum(2) : c.Enum(3); + return new(source, destination, languages, location, externalSize, deleteAfterInstall, bits32, bits64, + ignoreVersion, promptIfOlder, compareTimeStamp, overwriteSameVersion, replaceSameIfDiffer, type == 1); + } + + /// TSetupFileEntry as of 6.5.0 (issrc Shared.Struct.pas). + private InnoFileEntry LoadModernFile(InnoCursor c) { + var v = this.V; + var source = this.Str(c); + var destination = this.Str(c); + c.SkipString(); c.SkipString(); // install font name, strong assembly name + c.SkipString(); c.SkipString(); // components, tasks + var languages = this.Str(c); + for (var i = 0; i < 8; ++i) c.SkipString(); // check, after/before install, excludes, download source/user/password, archive password + c.SkipString(); // ISSigAllowedKeys (AnsiString) + c.Skip(32 + 1); // verification hash and type + this.SkipWindowsVersionRange(c); + var location = c.U32(); + c.U32(); // attributes + var externalSize = c.U64(); + c.I16(); // permission + var bitness = v.AtLeast(7, 0, 0, 3) ? c.U8() : 0; + var flags = c.Flags(v.AtLeast(6, 7, 0) ? 57 : 34); + bool Bit(int n) => (flags & (1UL << n)) != 0; + var type = c.Enum(2); + var bits32 = v.AtLeast(7, 0, 0, 3) ? bitness == 1 : Bit(26); + var bits64 = v.AtLeast(7, 0, 0, 3) ? bitness == 2 : Bit(27); + return new(source, destination, languages, location, externalSize, Bit(3), bits32, bits64, + Bit(17), Bit(18), Bit(7), Bit(11), Bit(22), type == 1); + } + + private void SkipIcon(InnoCursor c) { + var v = this.V; + if (v.Below(1, 3, 0)) c.U32(); + for (var i = 0; i < 6; ++i) c.SkipString(); // name, filename, parameters, working dir, icon file, comment + this.SkipConditions(c); + if (v.AtLeast(5, 3, 5)) c.SkipString(); // app user model id + if (v.AtLeast(6, 1, 0)) c.Skip(16); // toast activator CLSID + this.SkipWindowsVersionRange(c); + c.I32(); // icon index + if (v.AtLeast(1, 3, 24)) c.I32(); // show command + if (v.AtLeast(1, 3, 15)) c.Enum(3); // close on exit + if (v.AtLeast(2, 0, 7)) c.U16(); // hotkey + var f = c.BeginFlags(); + f.Next(); + f.NextIf(v.Below(1, 3, 26)); + f.Next(); + f.Next(); + f.NextIf(v.AtLeast(5, 0, 3) && v.Below(6, 3, 0)); + f.NextIf(v.AtLeast(5, 4, 2)); + f.NextIf(v.AtLeast(5, 5, 0)); + f.NextIf(v.AtLeast(6, 1, 0)); + f.End(); + } + + private void SkipIni(InnoCursor c) { + var v = this.V; + if (v.Below(1, 3, 0)) c.U32(); + for (var i = 0; i < 4; ++i) c.SkipString(); // file, section, key, value + this.SkipConditions(c); + this.SkipWindowsVersionRange(c); + c.Flags(5); + } + + private void SkipRegistry(InnoCursor c) { + var v = this.V; + if (v.Below(1, 3, 0)) c.U32(); + c.SkipString(); c.SkipString(); c.SkipString(); // key, name, value + this.SkipConditions(c); + if (v.AtLeast(4, 0, 11) && v.Below(4, 1, 0)) c.SkipString(); // permissions + this.SkipWindowsVersionRange(c); + c.U32(); // hive + if (v.AtLeast(4, 1, 0)) c.I16(); // permission + if (v.AtLeast(5, 2, 5)) c.Enum(7); else c.Enum(6); // type + if (v.AtLeast(7, 0, 0, 3)) { c.U8(); c.Flags(10); return; } // bitness, options + var f = c.BeginFlags(); + f.Next(); f.Next(); // create value if doesn't exist, unins delete value + f.Next(); f.Next(); f.Next(); // unins clear value, delete entire key, delete entire key if empty + f.NextIf(v.AtLeast(1, 2, 6)); + if (v.AtLeast(1, 3, 9)) { f.Next(); f.Next(); } + f.NextIf(v.AtLeast(1, 3, 12)); + f.NextIf(v.AtLeast(1, 3, 16)); + if (v.AtLeast(5, 1, 0)) { f.Next(); f.Next(); } + f.End(); + } + + private void SkipDelete(InnoCursor c) { + var v = this.V; + if (v.Below(1, 3, 0)) c.U32(); + c.SkipString(); + this.SkipConditions(c); + this.SkipWindowsVersionRange(c); + c.Enum(3); + } + + private void SkipRun(InnoCursor c) { + var v = this.V; + if (v.Below(1, 3, 0)) c.U32(); + c.SkipString(); c.SkipString(); c.SkipString(); // name, parameters, working dir + if (v.AtLeast(1, 3, 9)) c.SkipString(); // run once id + if (v.AtLeast(2, 0, 2)) c.SkipString(); // status message + if (v.AtLeast(5, 1, 13)) c.SkipString(); // verb + if (v.AtLeast(2, 0, 0) || v.IsIsx) c.SkipString(); // description + this.SkipConditions(c); + if (v.AtLeast(7, 0, 0, 3)) c.SkipString(); // OnLog + this.SkipWindowsVersionRange(c); + if (v.AtLeast(1, 3, 24)) c.I32(); // show command + c.Enum(3); // wait + if (v.AtLeast(7, 0, 0, 3)) { c.U8(); c.Flags(10); return; } // bitness, options + var f = c.BeginFlags(); + f.NextIf(v.AtLeast(1, 2, 3)); + f.NextIf(v.AtLeast(1, 3, 9) || (v.IsIsx && v.AtLeast(1, 3, 8))); + if (v.AtLeast(2, 0, 0)) { f.Next(); f.Next(); f.Next(); f.Next(); } + f.NextIf(v.AtLeast(2, 0, 8)); + if (v.AtLeast(5, 1, 10)) { f.Next(); f.Next(); } + f.NextIf(v.AtLeast(5, 2, 0)); + f.NextIf(v.AtLeast(6, 1, 0)); + f.NextIf(v.AtLeast(6, 3, 0)); + f.End(); + } + + private static readonly DateTime FileTimeEpoch = new(1601, 1, 1, 0, 0, 0, DateTimeKind.Utc); + + private InnoDataEntry LoadDataEntry(InnoCursor c) { + var v = this.V; + var firstSlice = c.U32(); + var lastSlice = c.U32(); + if (v.Below(4, 0, 0)) { + if (firstSlice >= 1 && lastSlice >= 1) { --firstSlice; --lastSlice; } else ++c.Warnings; + } + ulong chunkOffset = v.AtLeast(6, 5, 2) ? c.U64() : c.U32(); + ulong fileOffset = v.AtLeast(4, 0, 1) ? c.U64() : 0; + ulong fileSize, chunkSize; + if (v.AtLeast(4, 0, 0)) { fileSize = c.U64(); chunkSize = c.U64(); } else { fileSize = c.U32(); chunkSize = c.U32(); } + + InnoChecksumKind kind; + byte[] checksum; + if (v.AtLeast(6, 4, 0)) { kind = InnoChecksumKind.Sha256; checksum = c.Bytes(32); } + else if (v.AtLeast(5, 3, 9)) { kind = InnoChecksumKind.Sha1; checksum = c.Bytes(20); } + else if (v.AtLeast(4, 2, 0)) { kind = InnoChecksumKind.Md5; checksum = c.Bytes(16); } + else if (v.AtLeast(4, 0, 1)) { kind = InnoChecksumKind.Crc32; checksum = c.Bytes(4); } + else { kind = InnoChecksumKind.Adler32; checksum = c.Bytes(4); } + + var filetime = c.I64(); + DateTime? timestamp = filetime > 0 && filetime < DateTime.MaxValue.ToFileTimeUtc() ? DateTime.FromFileTimeUtc(filetime) : null; + var versionMs = c.U32(); + var versionLs = c.U32(); + + if (v.AtLeast(6, 4, 3)) + return this.FinishModernDataEntry(c, firstSlice, lastSlice, chunkOffset, fileOffset, fileSize, chunkSize, checksum, timestamp, versionMs, versionLs); + + var f = c.BeginFlags(); + var versionInfoValid = f.Next(); + f.Next(); // version info not valid + var bzipped = f.NextIf(v.AtLeast(2, 0, 17) && v.Below(4, 0, 1)); + f.NextIf(v.AtLeast(4, 0, 10)); // timestamp in UTC + f.NextIf(v.AtLeast(4, 1, 0)); // is uninstaller exe + var callInstructionOptimized = f.NextIf(v.AtLeast(4, 1, 8)); + f.NextIf(v.AtLeast(4, 2, 0)); // touch + var encrypted = f.NextIf(v.AtLeast(4, 2, 2)); + var compressed = v.AtLeast(4, 2, 5) ? f.Next() : true; + f.NextIf(v.AtLeast(5, 1, 13)); // solid break + if (v.AtLeast(5, 5, 7) && v.Below(6, 3, 0)) { f.Next(); f.Next(); } // sign, sign once + f.End(); + if (v.AtLeast(6, 3, 0)) c.Enum(4); // sign mode + + var compression = compressed ? this.Compression : InnoCompression.Stored; + if (bzipped) + compression = InnoCompression.BZip2; + var encryption = !encrypted ? InnoEncryption.None + : v.AtLeast(6, 4, 0) ? InnoEncryption.XChaCha20 + : v.AtLeast(5, 3, 9) ? InnoEncryption.Arc4Sha1 + : InnoEncryption.Arc4Md5; + var filter = !callInstructionOptimized ? InnoExeFilter.None + : v.Below(5, 2, 0) ? InnoExeFilter.Filter4108 + : v.Below(5, 3, 9) ? InnoExeFilter.Filter5200 + : InnoExeFilter.Filter5309; + + return new(firstSlice, lastSlice, chunkOffset, fileOffset, fileSize, chunkSize, kind, checksum, timestamp, + ((ulong)versionMs << 32) | versionLs, versionInfoValid, compression, encryption, filter); + } + + // 6.4.3+: Flags = (VersionInfoValid, TimeStampInUTC, CallInstructionOptimized, ChunkEncrypted, ChunkCompressed), no Sign. + private InnoDataEntry FinishModernDataEntry(InnoCursor c, uint firstSlice, uint lastSlice, ulong chunkOffset, ulong fileOffset, + ulong fileSize, ulong chunkSize, byte[] checksum, DateTime? timestamp, uint versionMs, uint versionLs) { + var flags = c.Flags(5); + var compression = (flags & 16) != 0 ? this.Compression : InnoCompression.Stored; + var encryption = (flags & 8) != 0 ? InnoEncryption.XChaCha20 : InnoEncryption.None; + var filter = (flags & 4) != 0 ? InnoExeFilter.Filter5309 : InnoExeFilter.None; + return new(firstSlice, lastSlice, chunkOffset, fileOffset, fileSize, chunkSize, InnoChecksumKind.Sha256, checksum, timestamp, + ((ulong)versionMs << 32) | versionLs, (flags & 1) != 0, compression, encryption, filter); + } + + private static int DefaultCodepage(uint languageId) => languageId switch { + 0x0401 or 0x0420 or 0x0429 or 0x0801 or 0x0c01 or 0x1001 or 0x1401 or 0x1801 or 0x1c01 or 0x2001 or 0x2401 + or 0x2801 or 0x2c01 or 0x3001 or 0x3401 or 0x3801 or 0x3c01 or 0x4001 => 1256, + 0x0402 or 0x0419 or 0x0422 or 0x0423 or 0x042f or 0x043f or 0x0440 or 0x0444 or 0x0450 or 0x082c or 0x0843 or 0x0c1a => 1251, + 0x0404 or 0x0c04 or 0x1404 => 950, + 0x0405 or 0x040e or 0x0415 or 0x0418 or 0x041a or 0x041b or 0x041c or 0x0424 or 0x081a => 1250, + 0x0408 => 1253, + 0x040d => 1255, + 0x0411 => 932, + 0x0412 => 949, + 0x041e => 874, + 0x041f or 0x042c or 0x0443 => 1254, + 0x0425 or 0x0426 or 0x0427 => 1257, + 0x042a => 1258, + 0x0492 => 28604, + 0x0804 or 0x1004 => 936, + _ => 1252, + }; +} diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.InnoSetup/InnoSetupReader.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.InnoSetup/InnoSetupReader.cs index e72f89559..d9e80e7b6 100644 --- a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.InnoSetup/InnoSetupReader.cs +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.InnoSetup/InnoSetupReader.cs @@ -1,408 +1,413 @@ -using System.Buffers.Binary; using System.Text; -using Compression.Core.Deflate; -using Compression.Core.Dictionary.Lzma; namespace FileFormat.InnoSetup; /// -/// Reads Inno Setup installer metadata from a Windows PE executable. +/// Reads the files an Inno Setup installer carries. /// /// -/// -/// Inno Setup installers are PE executables with an embedded compressed data block -/// appended after the last PE section (the "PE overlay"). The overlay begins with -/// a null-terminated version string such as -/// "Inno Setup Setup Data (5.5.3) (u)" and is followed by a CRC-32 word, -/// a compressed-size word, and the Setup.0 compressed header block. -/// -/// -/// The Setup.0 block is compressed with zlib for versions below 4.2.6 and with -/// LZMA1 for 4.2.6 and later. After decompression the block contains Pascal-style -/// strings (4-byte little-endian length prefix + UTF-8 bytes) that encode the app -/// name, version, file names, destination directories, and other metadata. -/// -/// -/// Extraction of individual files (Setup.1) is only supported when the file data -/// is non-solid; solid installers throw . -/// +/// Layout: the setup loader exe holds an offset table (at 0x30 before 5.1.5, otherwise in +/// RCDATA resource 11111) pointing at setup-0 (a 64-byte version tag and two compressed header +/// blocks) and setup-1 (the file data as "zlb\x1a" chunks, embedded or in setup-N.bin slices). +/// Header block one holds the setup header and every script section; block two holds the file +/// locations: chunk, offset inside the decompressed chunk, size and checksum. +/// Converted from innoextract (https://github.com/dscharrer/innoextract, zlib licence). +/// Every extracted file is checked against the checksum the compiler stored for it, so a file +/// either comes out exactly as the compiler stored it or the extraction fails. /// public sealed class InnoSetupReader { + private readonly Stream _stream; + private readonly InnoOffsets _offsets; + private readonly InnoSetupInfo _info; private readonly List _entries = []; - private readonly long _setup0Offset; // absolute stream position of the compressed Setup.0 payload - private readonly long _setup1Offset; // absolute stream position of Setup.1 (file data block) + private readonly string? _sliceDirectory; + + /// Gets the setup-data version. + public InnoVersion Version => this._info.Version; + + /// Gets the version as text, e.g. "5.5.7 (unicode)". + public string VersionText => this._info.Version.ToString(); - // ------------------------------------------------------------------------- - // Public API - // ------------------------------------------------------------------------- + /// Gets the application name from the setup header. + public string AppName => this._info.AppName; - /// Gets the Inno Setup version string detected in the overlay, e.g. "5.5.3". - public string Version { get; } + /// Gets the application version from the setup header. + public string AppVersion => this._info.AppVersion; - /// Gets the list of entries parsed from the Setup.0 header. + /// Gets the compressor the files were stored with. + public InnoCompression Compression => this._info.Compression; + + /// Gets whether some files are encrypted. + public bool IsEncrypted => this._info.EncryptionUsed; + + /// Gets the files, named and filtered the way innoextract extracts them. public IReadOnlyList Entries => this._entries; /// - /// Opens an Inno Setup installer from a seekable stream. + /// Opens an Inno Setup installer (setup.exe) or a bare setup-0 file. /// - /// A seekable stream positioned at the start of the PE file. - /// Thrown when is null. - /// - /// Thrown when no Inno Setup signature can be found in the stream. - /// + /// A seekable stream over the whole file. + /// No Inno Setup data, or headers that do not parse. + /// The 16-bit Inno Setup 1.2.x format. public InnoSetupReader(Stream stream) { ArgumentNullException.ThrowIfNull(stream); + if (!stream.CanSeek) + throw new ArgumentException("Stream must be seekable.", nameof(stream)); this._stream = stream; - - var overlayOffset = FindOverlayOffset(stream); - var (versionString, sigEnd, isLegacy) = FindSignature(stream, overlayOffset); - this.Version = versionString; - - // sigEnd points to the byte immediately after the null-terminator of the - // version string. From here: 4-byte header CRC, 4-byte compressed size, - // then the compressed Setup.0 payload. - stream.Position = sigEnd; - Span hdr = stackalloc byte[8]; - stream.ReadExactly(hdr); - // uint headerCrc = BinaryPrimitives.ReadUInt32LittleEndian(hdr); // not verified here - var compressedSize = (int)BinaryPrimitives.ReadUInt32LittleEndian(hdr[4..]); - - this._setup0Offset = stream.Position; - - // Read the compressed Setup.0 block - var compressedData = new byte[compressedSize]; - stream.ReadExactly(compressedData); - - this._setup1Offset = stream.Position; // Setup.1 starts right after Setup.0 - - // Decompress: try LZMA first (4.2.6+), then fall back to zlib (Deflate) - byte[]? decompressed = null; - if (!isLegacy) - decompressed = TryDecompressLzma(compressedData); - if (decompressed is null) - decompressed = TryDecompressZlib(compressedData); - - if (decompressed is not null) - ParseHeader(decompressed); + this._offsets = InnoLoader.Locate(stream); + if (stream is FileStream fs) + this._sliceDirectory = Path.GetDirectoryName(Path.GetFullPath(fs.Name)); + + if (this._offsets.HeaderOffset < 0 || this._offsets.HeaderOffset + 64 > stream.Length) + throw new InvalidDataException("Inno Setup headers lie outside the file."); + var tag = new byte[64]; + stream.Position = this._offsets.HeaderOffset; + stream.ReadExactly(tag); + var version = InnoVersion.Parse(tag); + this._info = this.LoadInfo(version); + this.BuildEntries(); } /// - /// Attempts to extract the data for from the Setup.1 block. + /// 6.5.0+: a CRC32 and TSetupEncryptionHeader (EncryptionUse, KDF salt, iterations, base nonce, + /// password test) follow the version tag. Returns whether files are encrypted; refuses + /// installers whose headers are encrypted too. /// - /// The entry to extract. - /// The decompressed file bytes. - /// Thrown when is null. - /// - /// Thrown when the installer uses a solid archive or an unsupported compression format. - /// - public byte[] Extract(InnoSetupEntry entry) { - ArgumentNullException.ThrowIfNull(entry); - - if (entry.IsDirectory) - throw new InvalidOperationException("Cannot extract a directory entry."); - - if (entry.CompressedSize < 0) - throw new NotSupportedException( - "Extraction is not supported for this installer: file data offsets are unavailable."); - - // Non-solid: each file is prefixed by a 4-byte compressed-size word inside - // the Setup.1 stream. We recorded the per-file offset in InnoSetupEntry via - // the DestDir field hack only for entries that carry an explicit _setup1Pos. - // For the simplified reader we only expose extraction when CompressedSize is known. - throw new NotSupportedException( - "Individual file extraction from Setup.1 is not yet implemented for this installer version."); + private static bool ReadEncryptionHeader(Stream stream, InnoVersion v) { + if (v.Below(6, 5, 0)) + return false; + Span h = stackalloc byte[4 + 49]; + stream.ReadExactly(h); + if (System.Buffers.Binary.BinaryPrimitives.ReadUInt32LittleEndian(h) != global::Compression.Core.Checksums.Crc32.Compute(h[4..])) + throw new InvalidDataException("Inno Setup encryption header CRC mismatch."); + return h[4] switch { + 0 => false, + 1 => true, + 2 => throw new NotSupportedException("This Inno Setup installer encrypts its headers too; a password is needed."), + _ => throw new InvalidDataException($"Unknown Inno Setup encryption mode {h[4]}."), + }; } - // ------------------------------------------------------------------------- - // PE overlay detection - // ------------------------------------------------------------------------- - /// - /// Parses the PE header to find the offset of the PE overlay (the byte - /// immediately following the last PE section's raw data). - /// Returns 0 if the stream does not look like a PE file. + /// Cheap detection: a setup loader offset table whose setup-0 starts with an Inno Setup + /// version tag. /// - private static long FindOverlayOffset(Stream stream) { - stream.Position = 0; - Span mz = stackalloc byte[2]; - if (stream.Read(mz) < 2 || mz[0] != (byte)'M' || mz[1] != (byte)'Z') - return 0; - - // Read e_lfanew at offset 0x3C - stream.Position = InnoSetupConstants.PeHeaderPtrOffset; - Span ptrBuf = stackalloc byte[4]; - if (stream.Read(ptrBuf) < 4) - return 0; - - var peOffset = (long)BinaryPrimitives.ReadUInt32LittleEndian(ptrBuf); - - // Validate PE signature "PE\0\0" - stream.Position = peOffset; - Span peSig = stackalloc byte[4]; - if (stream.Read(peSig) < 4 - || peSig[0] != (byte)'P' || peSig[1] != (byte)'E' - || peSig[2] != 0 || peSig[3] != 0) - return 0; - - // COFF header is 20 bytes starting at peOffset+4 - // NumberOfSections at offset +2, SizeOfOptionalHeader at offset +16 - Span coff = stackalloc byte[20]; - if (stream.Read(coff) < 20) - return 0; - - var numSections = BinaryPrimitives.ReadUInt16LittleEndian(coff[2..]); - var optHeaderSize = BinaryPrimitives.ReadUInt16LittleEndian(coff[16..]); - - // Skip the optional header - var sectionTableOffset = stream.Position + optHeaderSize; - - // Each section header is 40 bytes. - // PointerToRawData at +20, SizeOfRawData at +16 - var maxEnd = 0L; - stream.Position = sectionTableOffset; - Span sec = stackalloc byte[40]; - for (var i = 0; i < numSections; ++i) { - if (stream.Read(sec) < 40) - break; - var rawSize = (long)BinaryPrimitives.ReadUInt32LittleEndian(sec[16..]); - var rawPtr = (long)BinaryPrimitives.ReadUInt32LittleEndian(sec[20..]); - if (rawPtr > 0 && rawSize > 0) { - var end = rawPtr + rawSize; - if (end > maxEnd) - maxEnd = end; - } + public static bool IsInnoSetup(Stream stream) { + ArgumentNullException.ThrowIfNull(stream); + try { + var offsets = InnoLoader.Locate(stream); + if (!offsets.TableFound || offsets.HeaderOffset < 0 || offsets.HeaderOffset + 64 > stream.Length) + return false; + var tag = new byte[64]; + stream.Position = offsets.HeaderOffset; + stream.ReadExactly(tag); + return tag.AsSpan().IndexOf("Inno Setup"u8) >= 0; + } catch (Exception ex) when (ex is IOException or InvalidDataException or ArgumentException) { + return false; } - - return maxEnd > 0 ? maxEnd : 0; } - // ------------------------------------------------------------------------- - // Signature scanning - // ------------------------------------------------------------------------- - - /// - /// Scans from for the Inno Setup version - /// signature. Returns the version string, the stream position immediately - /// after the null terminator, and whether this is a legacy (pre-4.x) format. - /// - private static (string Version, long SigEnd, bool IsLegacy) FindSignature( - Stream stream, long startOffset) { - - var scanEnd = Math.Min( - startOffset + InnoSetupConstants.ScanWindow, - stream.Length); - - // Modern: "Inno Setup Setup Data (" + version + ")\0" - var prefixBytes = Encoding.ASCII.GetBytes(InnoSetupConstants.SignaturePrefix); - - // Legacy: "rDlPtS" magic - var legacyBytes = InnoSetupConstants.LegacyMagic; - - // Read the scan region into a buffer - stream.Position = startOffset; - var regionLen = (int)(scanEnd - startOffset); - var region = new byte[regionLen]; - var read = 0; - while (read < regionLen) { - var n = stream.Read(region, read, regionLen - read); - if (n == 0) break; - read += n; + // Ambiguous or unknown tags: try the listed layout, then each later one, and keep the first + // that parses cleanly (no warnings, no trailing bytes) -- innoextract's rule. + private InnoSetupInfo LoadInfo(InnoVersion version) { + InnoSetupInfo? fallback = null; + Exception? firstError = null; + var candidate = (InnoVersion?)version; + var tryOthers = !version.IsKnown || version.IsAmbiguous; + while (candidate is { } v) { + try { + var info = new InnoSetupInfo { Version = v }; + this._stream.Position = this._offsets.HeaderOffset + 64; + var encryptedFiles = ReadEncryptionHeader(this._stream, v); + info.LoadPrimary(InnoCodec.ReadHeaderBlock(this._stream, v), out var w1, out var t1); + info.EncryptionUsed |= encryptedFiles; + info.LoadData(InnoCodec.ReadHeaderBlock(this._stream, v), out var w2, out var t2); + if (w1 + w2 == 0 && !t1 && !t2) + return info; + fallback ??= info; + } catch (Exception ex) when (ex is InvalidDataException or EndOfStreamException or ArgumentException) { + firstError ??= ex; + } + if (!tryOthers) + break; + candidate = v.Next(); + tryOthers = candidate is { IsAmbiguous: true }; } - regionLen = read; - - // Search for modern signature - for (var i = 0; i <= regionLen - prefixBytes.Length; ++i) { - if (!region.AsSpan(i, prefixBytes.Length).SequenceEqual(prefixBytes)) - continue; + return fallback ?? throw new InvalidDataException($"Inno Setup {version} headers could not be parsed: {firstError?.Message}", firstError); + } - // Found prefix — read until null terminator to get the full string - var end = i + prefixBytes.Length; - while (end < regionLen && region[end] != 0) - ++end; + // ── naming and selection (innoextract cli/extract.cpp, setup/filename.cpp) ────────── - if (end >= regionLen) - continue; // no null terminator in scan window + private void BuildEntries() { + var chosen = new Dictionary(StringComparer.Ordinal); + var order = new List(); + foreach (var file in this._info.Files) { + if (file.Location >= this._info.DataEntries.Count) + continue; // external file, copied from the target system + var path = ConvertPath(file.Destination); + if (path.Length == 0) + continue; + var key = path.ToLowerInvariant(); + if (!chosen.TryGetValue(key, out var existing)) { + chosen[key] = (file, path); + order.Add(key); + continue; + } + var skip = HandleCollision(existing.File, this._info.DataEntries[(int)existing.File.Location], file, this._info.DataEntries[(int)file.Location]); + if (!skip) + chosen[key] = (file, file.IsUninstallerExe ? existing.Path : path); + } - var versionStr = Encoding.ASCII.GetString(region, i + prefixBytes.Length, - end - (i + prefixBytes.Length)); - // Strip trailing ")" and flags like " (u)" - var closeParen = versionStr.IndexOf(')'); - if (closeParen > 0) - versionStr = versionStr[..closeParen]; + foreach (var key in order) { + var (file, path) = chosen[key]; + var data = this._info.DataEntries[(int)file.Location]; + this._entries.Add(new InnoSetupEntry(path, (long)data.FileSize, data.Timestamp, (int)file.Location)); + } + } - var sigEnd = startOffset + end + 1; // +1 to skip the '\0' - return (versionStr, sigEnd, false); + /// innoextract's handle_collision: true when the new file loses to the one already chosen. + private static bool HandleCollision(InnoFileEntry oldFile, InnoDataEntry oldData, InnoFileEntry newFile, InnoDataEntry newData) { + var allowTimestamp = true; + if (!newFile.IgnoreVersion) { + if (oldData.VersionInfoValid) { + allowTimestamp = false; + if (!newData.VersionInfoValid || oldData.FileVersion > newData.FileVersion) { + if (!newFile.PromptIfOlder) + return true; + } else if (newData.FileVersion == oldData.FileVersion && !newFile.OverwriteSameVersion) { + if (newFile.ReplaceSameVersionIfContentsDiffer && oldData.Checksum.AsSpan().SequenceEqual(newData.Checksum)) + return true; + if (!newFile.CompareTimeStamp) + return true; + allowTimestamp = true; + } + } else if (newData.VersionInfoValid) + allowTimestamp = false; + } + if (allowTimestamp && newFile.CompareTimeStamp) { + if (newData.Timestamp == oldData.Timestamp) + return true; + if (newData.Timestamp < oldData.Timestamp && !newFile.PromptIfOlder) + return true; } + return false; + } - // Search for legacy signature - for (var i = 0; i <= regionLen - legacyBytes.Length; ++i) { - if (!region.AsSpan(i, legacyBytes.Length).SequenceEqual(legacyBytes)) + /// + /// Expands Inno constants to directory names ({app} → app, {{ → {), replaces characters that + /// are unsafe in paths with '$', and normalises the separators and . / .. segments. + /// + internal static string ConvertPath(string path) { + var i = 0; + var expanded = Expand(path, ref i, close: false); + var parts = new List(); + foreach (var segment in expanded.Split('\\', '/')) { + if (segment.Length == 0 || segment == ".") continue; - - // Legacy format: version is the next two bytes after the 6-byte magic - var vByte1 = i + legacyBytes.Length < regionLen ? region[i + legacyBytes.Length] : 0; - var vByte2 = i + legacyBytes.Length + 1 < regionLen ? region[i + legacyBytes.Length + 1] : 0; - var versionStr = $"{vByte1}.{vByte2}"; - - // In legacy format, the 8-byte magic is followed directly by header data - // (no null terminator needed — advance past magic + 2 version bytes) - var sigEnd = startOffset + i + legacyBytes.Length + 2; - return (versionStr, sigEnd, true); + if (segment == "..") { + if (parts.Count > 0) + parts.RemoveAt(parts.Count - 1); + continue; + } + parts.Add(segment); } - - throw new InvalidDataException( - "Inno Setup signature not found. The stream may not be an Inno Setup installer."); + return string.Join('/', parts); } - // ------------------------------------------------------------------------- - // Decompression - // ------------------------------------------------------------------------- - - private static byte[]? TryDecompressLzma(byte[] data) { - if (data.Length < InnoSetupConstants.LzmaPropSize) - return null; - - try { - var props = data[..InnoSetupConstants.LzmaPropSize]; - using var ms = new MemoryStream(data, InnoSetupConstants.LzmaPropSize, - data.Length - InnoSetupConstants.LzmaPropSize); - var decoder = new LzmaDecoder(ms, props); - return decoder.Decode(); - } catch { - return null; + private static string Expand(string s, ref int i, bool close) { + var sb = new StringBuilder(); + while (i < s.Length) { + var c = s[i]; + if (c != '{' && c != '}') { + sb.Append(IsUnsafe(c) ? '$' : c); + ++i; + continue; + } + ++i; + if (c == '}') { + if (close) + break; + sb.Append('}'); + continue; + } + if (i < s.Length && s[i] == '{') { + sb.Append('{'); + ++i; + continue; + } + var name = Expand(s, ref i, close: true); + foreach (var ch in name) + sb.Append(IsUnsafe(ch) ? '$' : ch); } + return sb.ToString(); } - private static byte[]? TryDecompressZlib(byte[] data) { - // zlib: 2-byte header (CMF + FLG), then raw Deflate, then 4-byte Adler-32 - if (data.Length < 6) - return null; + private static bool IsUnsafe(char c) => c < 32 || c is '<' or '>' or ':' or '"' or '|' or '?' or '*'; - try { - // Strip the 2-byte zlib header and 4-byte trailer - using var deflateStream = new MemoryStream(data, 2, data.Length - 6); - var decompressor = new DeflateDecompressor(deflateStream); - return decompressor.DecompressAll(); - } catch { - return null; - } - } + // ── extraction ────────────────────────────────────────────────────── - // ------------------------------------------------------------------------- - // Header parsing - // ------------------------------------------------------------------------- + /// Returns the bytes of one entry, verified against the stored checksum. + public byte[] Extract(InnoSetupEntry entry) { + ArgumentNullException.ThrowIfNull(entry); + byte[]? result = null; + this.ExtractMany([entry], (_, data) => result = data); + return result!; + } /// - /// Scans the decompressed Setup.0 block for Pascal strings and builds the - /// entry list. Because the exact binary layout varies across dozens of - /// sub-versions, this uses a heuristic scan rather than a fixed struct. + /// Decodes the given entries; each chunk is decompressed once for all the files it holds. /// - private void ParseHeader(byte[] data) { - // Strategy: walk through the data collecting adjacent Pascal strings. - // A Pascal string is: 4-byte LE length (0 < len <= 65535) followed by - // len bytes of printable UTF-8 / ASCII text. Groups of 3+ consecutive - // such strings that look like (sourceName, destDir, destName) are treated - // as file entries. - using var ms = new MemoryStream(data); - using var br = new BinaryReader(ms, Encoding.UTF8, leaveOpen: true); - - var strings = new List<(long Pos, string Value)>(); - - // First pass: collect all plausible Pascal strings - while (ms.Position + 4 < data.Length) { - var pos = ms.Position; - int len; - try { len = br.ReadInt32(); } catch { break; } - - if (len is > 0 and <= 65535 && ms.Position + len <= data.Length) { - var bytes = br.ReadBytes(len); - // Accept if content is printable ASCII / UTF-8 (no control chars except CR/LF/TAB) - if (LooksPrintable(bytes)) { - var str = Encoding.UTF8.GetString(bytes); - strings.Add((pos, str)); - continue; - } - // Not a valid string — back up by len and try again - ms.Position -= len; + public void ExtractMany(IEnumerable entries, Action sink) { + ArgumentNullException.ThrowIfNull(entries); + ArgumentNullException.ThrowIfNull(sink); + var byChunk = entries + .GroupBy(e => { + var d = this._info.DataEntries[e.DataIndex]; + return (d.FirstSlice, d.ChunkOffset, d.ChunkSize, d.Compression, d.Encryption); + }) + .OrderBy(g => g.Key.FirstSlice).ThenBy(g => g.Key.ChunkOffset); + + foreach (var chunk in byChunk) { + if (chunk.Key.Encryption != InnoEncryption.None) + throw new NotSupportedException("Encrypted Inno Setup files are not supported."); + var needed = chunk.Max(e => this._info.DataEntries[e.DataIndex].FileOffset + this._info.DataEntries[e.DataIndex].FileSize); + if (needed > int.MaxValue) + throw new NotSupportedException("Inno Setup chunks larger than 2 GiB are not supported."); + var decoded = this.ReadChunk(chunk.Key.FirstSlice, chunk.Key.ChunkOffset, chunk.Key.ChunkSize, chunk.Key.Compression, (long)needed); + foreach (var e in chunk) { + var d = this._info.DataEntries[e.DataIndex]; + var bytes = decoded.AsSpan((int)d.FileOffset, (int)d.FileSize).ToArray(); + InnoCodec.Unfilter(d.Filter, bytes); + if (!InnoCodec.Verify(d.ChecksumKind, d.Checksum, bytes)) + throw new InvalidDataException($"Inno Setup {d.ChecksumKind} checksum mismatch for '{e.FileName}'."); + sink(e, bytes); } - // Advance by 1 byte and retry - ms.Position = pos + 1; } + } - // Second pass: group consecutive strings into file entries. - // Inno Setup file entries contain at minimum: - // [0] source/dest filename - // [1] dest directory (often starts with "{app}" or similar) - // We output one entry per string that looks like a file path. - var seen = new HashSet(StringComparer.OrdinalIgnoreCase); - foreach (var (_, value) in strings) { - if (value.Length < 2) - continue; + private static ReadOnlySpan ChunkMagic => "zlb\x1a"u8; - // Likely a filename: contains a dot and no path seps, or looks like an - // Inno constant path like {app}\foo.exe - if (LooksLikeFilename(value) && seen.Add(value)) { - this._entries.Add(new InnoSetupEntry( - FileName: value, - DestDir: "", - Size: -1, - CompressedSize: -1, - IsDirectory: false)); - } + private byte[] ReadChunk(uint slice, ulong offset, ulong size, InnoCompression compression, long needed) { + using var slices = new SliceReader(this, slice, (long)offset); + Span magic = stackalloc byte[4]; + slices.ReadExactly(magic); + if (!magic.SequenceEqual(ChunkMagic)) + throw new InvalidDataException("Inno Setup chunk has no \"zlb\\x1a\" magic."); + using var bounded = new BoundedReader(slices, (long)size); + try { + return InnoCodec.Decompress(compression, bounded, needed); + } catch (InvalidDataException ex) { + throw new InvalidDataException($"Inno Setup chunk at slice {slice} offset {offset} ({compression}, {size} bytes): {ex.Message}", ex); } + } - // If we found nothing useful, add a single synthetic entry so callers - // know parsing occurred but file names were not recoverable. - if (this._entries.Count == 0 && strings.Count > 0) { - // Expose the first few strings as-is so the caller sees some metadata - foreach (var (_, value) in strings.Take(8)) { - if (value.Length < 2 || !seen.Add(value)) continue; - this._entries.Add(new InnoSetupEntry( - FileName: value, - DestDir: "", - Size: -1, - CompressedSize: -1, - IsDirectory: false)); + /// Opens setup-1 slice ; returns the stream and its data start/end. + private (Stream Stream, long Start, long End, bool Owned) OpenSlice(uint index) { + if (this._offsets.DataOffset != 0) { + if (index != 0) + throw new InvalidDataException("An Inno Setup installer with embedded data has only one slice."); + return (this._stream, this._offsets.DataOffset, this._stream.Length, false); + } + if (this._sliceDirectory == null) + throw new NotSupportedException("This installer keeps its files in external setup-N.bin slices, which need a file path to locate."); + + var perDisk = Math.Max(1u, this._info.SlicesPerDisk); + var suffix = perDisk == 1 ? $"{index + 1}" : $"{index / perDisk + 1}{(char)('a' + index % perDisk)}"; + var bases = new[] { this._info.BaseFilename, "setup" }.Where(b => b.Length > 0).Distinct(StringComparer.OrdinalIgnoreCase); + foreach (var b in bases) { + var name = b + "-" + suffix + ".bin"; + var path = Directory.EnumerateFiles(this._sliceDirectory) + .FirstOrDefault(p => string.Equals(Path.GetFileName(p), name, StringComparison.OrdinalIgnoreCase)); + if (path == null) + continue; + var fs = File.OpenRead(path); + Span head = stackalloc byte[16]; + fs.ReadExactly(head[..12]); + long total; + if (head[..8].SequenceEqual("idska32\x1a"u8) || head[..8].SequenceEqual("idska16\x1a"u8)) + total = System.Buffers.Binary.BinaryPrimitives.ReadUInt32LittleEndian(head[8..]); + else if (head[..8].SequenceEqual("idskb32\x1a"u8)) { + fs.ReadExactly(head[12..16]); + total = System.Buffers.Binary.BinaryPrimitives.ReadInt64LittleEndian(head[8..]); + } else { + fs.Dispose(); + throw new InvalidDataException($"'{name}' is not an Inno Setup slice."); } + if (total > fs.Length) + total = fs.Length; + return (fs, 0, total, true); } + throw new InvalidDataException($"Inno Setup slice {index + 1} ({string.Join(" or ", bases.Select(b => b + "-" + suffix + ".bin"))}) was not found."); } - // ------------------------------------------------------------------------- - // Helpers - // ------------------------------------------------------------------------- - - private static bool LooksPrintable(byte[] bytes) { - if (bytes.Length == 0) return false; - var nonPrintable = 0; - foreach (var b in bytes) { - if (b < 0x09 || (b >= 0x0E && b < 0x20)) - ++nonPrintable; + /// Reads setup-1 data sequentially across slice boundaries. + private sealed class SliceReader : Stream { + private readonly InnoSetupReader _owner; + private uint _slice; + private (Stream Stream, long Start, long End, bool Owned) _current; + private long _pos; + + public SliceReader(InnoSetupReader owner, uint slice, long offset) { + this._owner = owner; + this._slice = slice; + this._current = owner.OpenSlice(slice); + this._pos = this._current.Start + offset; + if (this._pos > this._current.End) + throw new InvalidDataException("Inno Setup chunk offset lies outside its slice."); } - // Allow up to 5% non-printable bytes (for UTF-8 multibyte sequences) - return nonPrintable <= bytes.Length / 20 + 1; - } - private static bool LooksLikeFilename(string s) { - // Must not be purely numeric or very short - if (s.Length < 3) return false; - - // Reject strings that are clearly not filenames (too many spaces, etc.) - var spaceRatio = s.Count(c => c == ' ') * 10 / s.Length; - if (spaceRatio > 4) return false; + public override int Read(byte[] buffer, int offset, int count) { + while (this._pos >= this._current.End) { + if (this._owner._offsets.DataOffset != 0) + return 0; + if (this._current.Owned) + this._current.Stream.Dispose(); + ++this._slice; + this._current = this._owner.OpenSlice(this._slice); + this._pos = this._current.Stream.Position; // just past the slice header + } + this._current.Stream.Position = this._pos; + var n = this._current.Stream.Read(buffer, offset, (int)Math.Min(count, this._current.End - this._pos)); + this._pos += n; + return n; + } - // Accept if it has an extension (dot followed by 1-6 alpha chars) - var dot = s.LastIndexOf('.'); - if (dot > 0 && dot < s.Length - 1) { - var ext = s[(dot + 1)..]; - if (ext.Length is >= 1 and <= 6 && ext.All(char.IsAsciiLetterOrDigit)) - return true; + protected override void Dispose(bool disposing) { + if (disposing && this._current.Owned) + this._current.Stream.Dispose(); + base.Dispose(disposing); } - // Accept Inno constant paths like {app}, {sys}, {win}, {tmp} - if (s.StartsWith('{') && s.Contains('}')) - return true; + public override bool CanRead => true; + public override bool CanSeek => false; + public override bool CanWrite => false; + public override long Length => throw new NotSupportedException(); + public override long Position { get => throw new NotSupportedException(); set => throw new NotSupportedException(); } + public override void Flush() { } + public override long Seek(long offset, SeekOrigin origin) => throw new NotSupportedException(); + public override void SetLength(long value) => throw new NotSupportedException(); + public override void Write(byte[] buffer, int offset, int count) => throw new NotSupportedException(); + } - return false; + /// Limits a stream to a number of bytes. + private sealed class BoundedReader(Stream inner, long length) : Stream { + private long _left = length; + public override int Read(byte[] buffer, int offset, int count) { + if (this._left <= 0) + return 0; + var n = inner.Read(buffer, offset, (int)Math.Min(count, this._left)); + this._left -= n; + return n; + } + public override bool CanRead => true; + public override bool CanSeek => false; + public override bool CanWrite => false; + public override long Length => throw new NotSupportedException(); + public override long Position { get => throw new NotSupportedException(); set => throw new NotSupportedException(); } + public override void Flush() { } + public override long Seek(long offset, SeekOrigin origin) => throw new NotSupportedException(); + public override void SetLength(long value) => throw new NotSupportedException(); + public override void Write(byte[] buffer, int offset, int count) => throw new NotSupportedException(); } } diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.InnoSetup/InnoSetupWriter.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.InnoSetup/InnoSetupWriter.cs deleted file mode 100644 index 49af4ceb8..000000000 --- a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.InnoSetup/InnoSetupWriter.cs +++ /dev/null @@ -1,34 +0,0 @@ -#pragma warning disable CS1591 -using System.Buffers.Binary; -using System.Text; - -namespace FileFormat.InnoSetup; - -/// -/// Writes a minimal Inno Setup header. No PE stub is emitted; the reader scans -/// from offset 0 for the Inno signature when it can't parse a PE. -/// Setup.0 is emitted as an empty compressed block — the reader's LZMA + -/// zlib decompression both fail gracefully on empty input, leaving the entry -/// list empty. This is detection-only WORM; producing a functional installer -/// requires bundling a signed PE stub which is out of scope. -/// -public sealed class InnoSetupWriter { - /// - /// Writes the to to the supplied output. - /// - public void WriteTo(Stream output, byte[]? embeddedData = null) { - // ── Inno signature: "Inno Setup Setup Data (1.0)\0" ── - var sig = Encoding.ASCII.GetBytes(InnoSetupConstants.SignaturePrefix + "1.0)\0"); - output.Write(sig); - - // ── 4-byte CRC + 4-byte compressedSize (both zero) ── - Span hdr = stackalloc byte[8]; - BinaryPrimitives.WriteUInt32LittleEndian(hdr, 0); // header CRC (not verified) - BinaryPrimitives.WriteUInt32LittleEndian(hdr[4..], 0); // compressedSize = 0 (empty Setup.0) - output.Write(hdr); - - // Optional embedded payload — reader doesn't parse anything past this point - // when compressedSize is 0, so the bytes are opaque. - if (embeddedData != null) output.Write(embeddedData); - } -} diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.InnoSetup/InnoVersion.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.InnoSetup/InnoVersion.cs new file mode 100644 index 000000000..2c5f37153 --- /dev/null +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.InnoSetup/InnoVersion.cs @@ -0,0 +1,239 @@ +using System.Text; + +namespace FileFormat.InnoSetup; + +/// +/// The setup-data version an Inno Setup installer was written with, packed as +/// (a << 24) | (b << 16) | (c << 8) | d. +/// +/// +/// The 64-byte version tag that opens setup-0 ("Inno Setup Setup Data (5.5.7) (u)") names the +/// layout of everything after it. Some releases changed the layout without changing the tag; for +/// those the parser retries with the next known version (), as innoextract does. +/// The table of known tags is innoextract's (src/setup/version.cpp, zlib licence). +/// +public readonly record struct InnoVersion(uint Value, bool IsUnicode, bool IsIsx, bool IsKnown) { + + /// Packs a version number. + public static uint V(int a, int b, int c, int d = 0) => (uint)((a << 24) | (b << 16) | (c << 8) | d); + + /// Gets the major version. + public int Major => (int)(this.Value >> 24); + /// Gets the minor version. + public int Minor => (int)((this.Value >> 16) & 0xFF); + /// Gets the patch version. + public int Patch => (int)((this.Value >> 8) & 0xFF); + /// Gets the fourth version component (variant or build). + public int Build => (int)(this.Value & 0xFF); + + /// True when this version is at least a.b.c.d. + public bool AtLeast(int a, int b, int c, int d = 0) => this.Value >= V(a, b, c, d); + + /// True when this version is below a.b.c.d. + public bool Below(int a, int b, int c, int d = 0) => this.Value < V(a, b, c, d); + + /// + public override string ToString() { + var s = $"{this.Major}.{this.Minor}.{this.Patch}" + (this.Build != 0 ? $".{this.Build}" : ""); + if (this.IsUnicode) s += " (unicode)"; + if (this.IsIsx) s += " (isx)"; + return s; + } + + private sealed record Known(string Name, uint Value, bool Unicode, bool Isx); + + private static readonly Known[] KnownVersions = [ + new("Inno Setup Setup Data (1.3.3)", V(1, 3, 3, 0), false, false), + new("Inno Setup Setup Data (1.3.9)", V(1, 3, 9, 0), false, false), + new("Inno Setup Setup Data (1.3.10)", V(1, 3, 10, 0), false, false), + new("Inno Setup Setup Data (1.3.10) with ISX (1.3.10)", V(1, 3, 10, 0), false, true), + new("Inno Setup Setup Data (1.3.12) with ISX (1.3.12.1)", V(1, 3, 12, 1), false, true), + new("Inno Setup Setup Data (1.3.21)", V(1, 3, 21, 0), false, false), + new("Inno Setup Setup Data (1.3.21) with ISX (1.3.17)", V(1, 3, 21, 0), false, true), + new("Inno Setup Setup Data (1.3.24)", V(1, 3, 24, 0), false, false), + new("Inno Setup Setup Data (1.3.21) with ISX (1.3.24)", V(1, 3, 24, 0), false, true), + new("Inno Setup Setup Data (1.3.25)", V(1, 3, 25, 0), false, false), + new("Inno Setup Setup Data (1.3.25) with ISX (1.3.25)", V(1, 3, 25, 0), false, true), + new("Inno Setup Setup Data (2.0.0)", V(2, 0, 0, 0), false, false), + new("Inno Setup Setup Data (2.0.1)", V(2, 0, 1, 0), false, false), + new("Inno Setup Setup Data (2.0.2)", V(2, 0, 2, 0), false, false), + new("Inno Setup Setup Data (2.0.5)", V(2, 0, 5, 0), false, false), + new("Inno Setup Setup Data (2.0.6a)", V(2, 0, 6, 0), false, false), + new("Inno Setup Setup Data (2.0.6a) with ISX (2.0.3)", V(2, 0, 6, 0), false, true), + new("Inno Setup Setup Data (2.0.7)", V(2, 0, 7, 0), false, false), + new("Inno Setup Setup Data (2.0.8)", V(2, 0, 8, 0), false, false), + new("Inno Setup Setup Data (2.0.8) with ISX (2.0.3)", V(2, 0, 8, 0), false, true), + new("Inno Setup Setup Data (2.0.8) with ISX (2.0.10)", V(2, 0, 10, 0), false, true), + new("Inno Setup Setup Data (2.0.11)", V(2, 0, 11, 0), false, false), + new("Inno Setup Setup Data (2.0.11) with ISX (2.0.11)", V(2, 0, 11, 0), false, true), + new("Inno Setup Setup Data (2.0.17)", V(2, 0, 17, 0), false, false), + new("Inno Setup Setup Data (2.0.17) with ISX (2.0.11)", V(2, 0, 17, 0), false, true), + new("Inno Setup Setup Data (2.0.18)", V(2, 0, 18, 0), false, false), + new("Inno Setup Setup Data (2.0.18) with ISX (2.0.11)", V(2, 0, 18, 0), false, true), + new("Inno Setup Setup Data (3.0.0a)", V(3, 0, 0, 0), false, false), + new("Inno Setup Setup Data (3.0.1)", V(3, 0, 1, 0), false, false), + new("Inno Setup Setup Data (3.0.1) with ISX (3.0.0)", V(3, 0, 1, 0), false, true), + new("Inno Setup Setup Data (3.0.3)", V(3, 0, 3, 0), false, false), + new("Inno Setup Setup Data (3.0.3) with ISX (3.0.3)", V(3, 0, 3, 0), false, true), + new("Inno Setup Setup Data (3.0.4)", V(3, 0, 4, 0), false, false), + new("My Inno Setup Extensions Setup Data (3.0.4)", V(3, 0, 4, 0), false, true), + new("Inno Setup Setup Data (3.0.5)", V(3, 0, 5, 0), false, false), + new("My Inno Setup Extensions Setup Data (3.0.6.1)", V(3, 0, 6, 1), false, true), + new("Inno Setup Setup Data (4.0.0a)", V(4, 0, 0, 0), false, false), + new("Inno Setup Setup Data (4.0.1)", V(4, 0, 1, 0), false, false), + new("Inno Setup Setup Data (4.0.3)", V(4, 0, 3, 0), false, false), + new("Inno Setup Setup Data (4.0.5)", V(4, 0, 5, 0), false, false), + new("Inno Setup Setup Data (4.0.9)", V(4, 0, 9, 0), false, false), + new("Inno Setup Setup Data (4.0.10)", V(4, 0, 10, 0), false, false), + new("Inno Setup Setup Data (4.0.11)", V(4, 0, 11, 0), false, false), + new("Inno Setup Setup Data (4.1.0)", V(4, 1, 0, 0), false, false), + new("Inno Setup Setup Data (4.1.2)", V(4, 1, 2, 0), false, false), + new("Inno Setup Setup Data (4.1.3)", V(4, 1, 3, 0), false, false), + new("Inno Setup Setup Data (4.1.4)", V(4, 1, 4, 0), false, false), + new("Inno Setup Setup Data (4.1.5)", V(4, 1, 5, 0), false, false), + new("Inno Setup Setup Data (4.1.6)", V(4, 1, 6, 0), false, false), + new("Inno Setup Setup Data (4.1.8)", V(4, 1, 8, 0), false, false), + new("Inno Setup Setup Data (4.2.0)", V(4, 2, 0, 0), false, false), + new("Inno Setup Setup Data (4.2.1)", V(4, 2, 1, 0), false, false), + new("Inno Setup Setup Data (4.2.2)", V(4, 2, 2, 0), false, false), + new("Inno Setup Setup Data (4.2.3)", V(4, 2, 3, 0), false, false), + new("Inno Setup Setup Data (4.2.4)", V(4, 2, 4, 0), false, false), + new("Inno Setup Setup Data (4.2.5)", V(4, 2, 5, 0), false, false), + new("Inno Setup Setup Data (4.2.6)", V(4, 2, 6, 0), false, false), + new("Inno Setup Setup Data (5.0.0)", V(5, 0, 0, 0), false, false), + new("Inno Setup Setup Data (5.0.1)", V(5, 0, 1, 0), false, false), + new("Inno Setup Setup Data (5.0.3)", V(5, 0, 3, 0), false, false), + new("Inno Setup Setup Data (5.0.4)", V(5, 0, 4, 0), false, false), + new("Inno Setup Setup Data (5.1.0)", V(5, 1, 0, 0), false, false), + new("Inno Setup Setup Data (5.1.2)", V(5, 1, 2, 0), false, false), + new("Inno Setup Setup Data (5.1.7)", V(5, 1, 7, 0), false, false), + new("Inno Setup Setup Data (5.1.10)", V(5, 1, 10, 0), false, false), + new("Inno Setup Setup Data (5.1.13)", V(5, 1, 13, 0), false, false), + new("Inno Setup Setup Data (5.2.0)", V(5, 2, 0, 0), false, false), + new("Inno Setup Setup Data (5.2.1)", V(5, 2, 1, 0), false, false), + new("Inno Setup Setup Data (5.2.3)", V(5, 2, 3, 0), false, false), + new("Inno Setup Setup Data (5.2.5)", V(5, 2, 5, 0), false, false), + new("Inno Setup Setup Data (5.2.5) (u)", V(5, 2, 5, 0), true, false), + new("Inno Setup Setup Data (5.3.0)", V(5, 3, 0, 0), false, false), + new("Inno Setup Setup Data (5.3.0) (u)", V(5, 3, 0, 0), true, false), + new("Inno Setup Setup Data (5.3.3)", V(5, 3, 3, 0), false, false), + new("Inno Setup Setup Data (5.3.3) (u)", V(5, 3, 3, 0), true, false), + new("Inno Setup Setup Data (5.3.5)", V(5, 3, 5, 0), false, false), + new("Inno Setup Setup Data (5.3.5) (u)", V(5, 3, 5, 0), true, false), + new("Inno Setup Setup Data (5.3.6)", V(5, 3, 6, 0), false, false), + new("Inno Setup Setup Data (5.3.6) (u)", V(5, 3, 6, 0), true, false), + new("Inno Setup Setup Data (5.3.7)", V(5, 3, 7, 0), false, false), + new("Inno Setup Setup Data (5.3.7) (u)", V(5, 3, 7, 0), true, false), + new("Inno Setup Setup Data (5.3.8)", V(5, 3, 8, 0), false, false), + new("Inno Setup Setup Data (5.3.8) (u)", V(5, 3, 8, 0), true, false), + new("Inno Setup Setup Data (5.3.9)", V(5, 3, 9, 0), false, false), + new("Inno Setup Setup Data (5.3.9) (u)", V(5, 3, 9, 0), true, false), + new("Inno Setup Setup Data (5.3.10)", V(5, 3, 10, 0), false, false), + new("Inno Setup Setup Data (5.3.10) (u)", V(5, 3, 10, 0), true, false), + new("", V(5, 3, 10, 1), false, false), + new("", V(5, 3, 10, 1), true, false), + new("Inno Setup Setup Data (5.4.2)", V(5, 4, 2, 0), false, false), + new("Inno Setup Setup Data (5.4.2) (u)", V(5, 4, 2, 0), true, false), + new("", V(5, 4, 2, 1), false, false), + new("", V(5, 4, 2, 1), true, false), + new("Inno Setup Setup Data (5.5.0)", V(5, 5, 0, 0), false, false), + new("Inno Setup Setup Data (5.5.0) (u)", V(5, 5, 0, 0), true, false), + new("", V(5, 5, 0, 1), false, false), + new("", V(5, 5, 0, 1), true, false), + new("Inno Setup Setup Data (5.5.6)", V(5, 5, 6, 0), false, false), + new("Inno Setup Setup Data (5.5.6) (u)", V(5, 5, 6, 0), true, false), + new("Inno Setup Setup Data (5.5.7)", V(5, 5, 7, 0), false, false), + new("Inno Setup Setup Data (5.5.7) (u)", V(5, 5, 7, 0), true, false), + new("Inno Setup Setup Data (5.5.7) (U)", V(5, 5, 7, 0), true, false), + new("Inno Setup Setup Data (5.5.8) (u)", V(5, 5, 7, 0), true, false), + new("", V(5, 5, 7, 1), false, false), + new("", V(5, 5, 7, 1), true, false), + new("Inno Setup Setup Data (5.6.0)", V(5, 6, 0, 0), false, false), + new("Inno Setup Setup Data (5.6.0) (u)", V(5, 6, 0, 0), true, false), + new("Inno Setup Setup Data (5.6.2)", V(5, 6, 2, 0), false, false), + new("Inno Setup Setup Data (5.6.2) (u)", V(5, 6, 2, 0), true, false), + new("Inno Setup Setup Data (6.0.0) (u)", V(6, 0, 0, 0), true, false), + new("Inno Setup Setup Data (6.1.0) (u)", V(6, 1, 0, 0), true, false), + new("Inno Setup Setup Data (6.3.0)", V(6, 3, 0, 0), true, false), + new("Inno Setup Setup Data (6.4.0)", V(6, 4, 0, 0), true, false), + new("Inno Setup Setup Data (6.4.0.1)", V(6, 4, 0, 1), true, false), + // Later tags, from Inno Setup's own Shared.Struct.pas (issrc), beyond innoextract's table: + new("Inno Setup Setup Data (6.4.2)", V(6, 4, 2, 0), true, false), + new("Inno Setup Setup Data (6.4.3)", V(6, 4, 3, 0), true, false), + new("Inno Setup Setup Data (6.5.0)", V(6, 5, 0, 0), true, false), + new("Inno Setup Setup Data (6.5.2)", V(6, 5, 2, 0), true, false), + new("Inno Setup Setup Data (6.6.0)", V(6, 6, 0, 0), true, false), + new("Inno Setup Setup Data (6.6.1)", V(6, 6, 1, 0), true, false), + new("Inno Setup Setup Data (6.7.0)", V(6, 7, 0, 0), true, false), + new("Inno Setup Setup Data (7.0.0.3)", V(7, 0, 0, 3), true, false), + ]; + + /// + /// Parses the 64-byte version tag at the start of setup-0. + /// + /// Not an Inno Setup tag, or the 16-bit 1.2.x format. + public static InnoVersion Parse(ReadOnlySpan tag64) { + if (tag64.Length < 64) + throw new InvalidDataException("Inno Setup version tag is truncated."); + if (tag64[0] == 'i' && tag64[11] == 0x1A) + throw new NotSupportedException("Inno Setup 1.2.x setup data (\"i1.2.10--\" tags) is not supported."); + + var end = tag64[..64].IndexOf((byte)0); + var text = Encoding.ASCII.GetString(tag64[..(end < 0 ? 64 : end)]); + foreach (var k in KnownVersions) + if (k.Name.Length > 0 && k.Name == text) + return new(k.Value, k.Unicode, k.Isx, true); + + if (!text.Contains("Inno Setup", StringComparison.Ordinal)) + throw new InvalidDataException("Not an Inno Setup version tag."); + + // Unknown tag: take the highest a.b.c[.d] that appears in parentheses. + uint value = 0; + for (var bracket = text.IndexOf('('); bracket >= 0; bracket = text.IndexOf('(', bracket + 1)) { + var parsed = ParseNumber(text, bracket + 1); + if (parsed > value) + value = parsed; + } + if (value == 0) + throw new InvalidDataException($"Unrecognised Inno Setup version tag \"{text}\"."); + + var unicode = value >= V(6, 3, 0) || text.Contains("(u)", StringComparison.Ordinal) || text.Contains("(U)", StringComparison.Ordinal); + var isx = text.Contains("My Inno Setup Extensions", StringComparison.Ordinal) || text.Contains("with ISX", StringComparison.Ordinal); + return new(value, unicode, isx, false); + } + + private static uint ParseNumber(string s, int at) { + var parts = new int[4]; + var count = 0; + var i = at; + while (count < 4) { + var start = i; + while (i < s.Length && char.IsAsciiDigit(s[i])) + ++i; + if (i == start || i - start > 3) + break; + parts[count++] = int.Parse(s.AsSpan(start, i - start), System.Globalization.CultureInfo.InvariantCulture); + if (i < s.Length && s[i] == 'a' && count == 3) + ++i; + if (i >= s.Length || s[i] != '.') + break; + ++i; + } + return count >= 3 ? V(parts[0], parts[1], parts[2], parts[3]) : 0; + } + + /// + /// True for the tags that more than one layout used (the compiler was changed without the tag). + /// + public bool IsAmbiguous => this.Value == V(1, 3, 21) || this.Value == V(2, 0, 1) || this.Value == V(3, 0, 3) + || this.Value == V(4, 2, 3) || this.Value == V(5, 3, 10) || this.Value == V(5, 4, 2) || this.Value == V(5, 5, 0) + || this.Value == V(5, 5, 7) || this.Value == V(5, 5, 7, 1); + + /// The next known version of the same flavour (ANSI/Unicode, ISX), or null. + public InnoVersion? Next() { + foreach (var k in KnownVersions) + if (k.Value > this.Value && k.Unicode == this.IsUnicode && k.Isx == this.IsIsx) + return new(k.Value, k.Unicode, k.Isx, true); + return null; + } +} diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.InnoSetup/THIRD-PARTY-NOTICE.InnoSetup.txt b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.InnoSetup/THIRD-PARTY-NOTICE.InnoSetup.txt new file mode 100644 index 000000000..f9a54ecd4 --- /dev/null +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.InnoSetup/THIRD-PARTY-NOTICE.InnoSetup.txt @@ -0,0 +1,33 @@ +The Inno Setup reader in this directory was written from these sources: + +1. innoextract, https://github.com/dscharrer/innoextract, master as of 2026-10-19 (1.10-dev): + src/loader/offsets.cpp, src/setup/*.cpp (version table, header and entry loaders), + src/stream/block.cpp, chunk.cpp, lzma.cpp, exefilter.hpp, src/cli/extract.cpp (file + selection and collision rules), src/setup/filename.cpp (path naming). Converted to C#. + + Copyright (C) 2011-2020 Daniel Scharrer + + This software is provided 'as-is', without any express or implied warranty. In no event + will the author(s) be held liable for any damages arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, including commercial + applications, and to alter it and redistribute it freely, subject to the following + restrictions: + + 1. The origin of this software must not be misrepresented; you must not claim that you + wrote the original software. If you use this software in a product, an acknowledgment + in the product documentation would be appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be misrepresented + as being the original software. + 3. This notice may not be removed or altered from any source distribution. + +2. Inno Setup, https://github.com/jrsoftware/issrc, tags is-6_4_2 to is-7_1_0: + Projects/Src/Shared.Struct.pas (record layouts), Setup.MainFunc.pas (read order), + Compression.Base.pas (block header), for the setup data layouts newer than innoextract's + (6.4.2, 6.4.3, 6.5.0, 6.5.2, 6.6.0, 6.6.1, 6.7.0, 7.0.0.3). + + Copyright (C) 1997-2026 Jordan Russell. All rights reserved. + Portions Copyright (C) 2000-2026 Martijn Laan. All rights reserved. + Inno Setup License: permission is granted to use, alter and redistribute, provided that + copyright notices are retained, the origin is not misrepresented, and modified versions are + plainly marked as such. Web site: https://jrsoftware.org/ diff --git a/Hawkynt.FileFormats.Archives/README.md b/Hawkynt.FileFormats.Archives/README.md index dccf473d1..ecffe1596 100644 --- a/Hawkynt.FileFormats.Archives/README.md +++ b/Hawkynt.FileFormats.Archives/README.md @@ -185,7 +185,7 @@ Every State, Test, Maintenance, Compress/Decompress and Demux/Mux/Remux cell is | [Debian .deb](https://en.wikipedia.org/wiki/Deb_(file_format)) | `Deb` | `.deb` | R/W | ✅ | defrag · wipe | | [debian.org](https://www.debian.org/doc/debian-policy/) | | [EAR](https://en.wikipedia.org/wiki/EAR_(file_format)) | `Ear` | `.ear` | R/W | ✅ | defrag · wipe | | [jakarta.ee](https://jakarta.ee/specifications/platform/) | | [Ruby gem](https://en.wikipedia.org/wiki/RubyGems) | `Gem` | `.gem` | WORM | ✅ | — | TAR with gzip-compressed metadata and data members | [docs.ruby-lang.org](https://docs.ruby-lang.org/en/3.0/Gem/Format.html) | -| [Inno Setup](https://en.wikipedia.org/wiki/Inno_Setup) | `InnoSetup` | | WORM | ✅ | — | Extraction plus signature/container output, not an installer compiler; some versions expose no per-file extraction | [sourceforge.net](https://sourceforge.net/projects/innounp/) | +| [Inno Setup](https://en.wikipedia.org/wiki/Inno_Setup) | `InnoSetup` | | R | ✅ | — | [Files] of setup data 1.3 – 7.1, stored/zlib/bzip2/LZMA/LZMA2, embedded or setup-N.bin slices, every file checksum-verified; checked against innoextract up to 6.0 and by the stored SHA-256 of every file of the official 6.4.3 and 7.1.0 installers. Encrypted files refused | [jrsoftware.org](https://jrsoftware.org/isinfo.php) | | [IPA](https://en.wikipedia.org/wiki/.ipa) | `Ipa` | `.ipa` | R/W | ✅ | defrag · wipe | | [pkware.cachefly.net](https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT) | | [JAR](https://en.wikipedia.org/wiki/JAR_(file_format)) | `Jar` | `.jar` | R/W | ✅ | defrag · wipe | | [docs.oracle.com](https://docs.oracle.com/en-us/javase/8/docs/technotes/guides/jar/jar.html) | | [MSI](https://en.wikipedia.org/wiki/Windows_Installer) | `Msi` | `.msi` `.msp` `.mst` | R/W | ✅ | wipe | CFB envelope; a functional Installer database is not synthesised | [Microsoft Learn](https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-cfb/) | diff --git a/Hawkynt.FileFormats.Archives/REFERENCE.md b/Hawkynt.FileFormats.Archives/REFERENCE.md index d982c7b79..79a61405a 100644 --- a/Hawkynt.FileFormats.Archives/REFERENCE.md +++ b/Hawkynt.FileFormats.Archives/REFERENCE.md @@ -18621,69 +18621,115 @@ Creates IFF CDAF archives with FNAM+FDAT chunk pairs. ### Namespace `FileFormat.InnoSetup` -[`InnoSetupEntry`](#innosetupentry) · [`InnoSetupFormatDescriptor`](#innosetupformatdescriptor) · [`InnoSetupReader`](#innosetupreader) · [`InnoSetupWriter`](#innosetupwriter) +[`InnoCompression`](#innocompression) · [`InnoEncryption`](#innoencryption) · [`InnoSetupEntry`](#innosetupentry) · [`InnoSetupFormatDescriptor`](#innosetupformatdescriptor) · [`InnoSetupReader`](#innosetupreader) · [`InnoVersion`](#innoversion) + +#### `InnoCompression` + +Compression of a setup-1 chunk. + +| Value | Numeric | Summary | +| --- | --- | --- | +| `Stored` | `0` | Stored. | +| `Zlib` | `1` | zlib (with the two-byte zlib header). | +| `BZip2` | `2` | bzip2. | +| `Lzma1` | `3` | LZMA with Inno's five-byte properties header. | +| `Lzma2` | `4` | LZMA2 with Inno's one-byte dictionary-size header. | +| `Unknown` | `5` | A value the header does not define. | + +#### `InnoEncryption` + +Encryption of a setup-1 chunk. + +| Value | Numeric | Summary | +| --- | --- | --- | +| `None` | `0` | Not encrypted. | +| `Arc4Md5` | `1` | ARC4 keyed with MD5(salt + password) (4.2.2 – 5.3.8). | +| `Arc4Sha1` | `2` | ARC4 keyed with SHA-1(salt + password) (5.3.9 – 6.3.x). | +| `XChaCha20` | `3` | XChaCha20 keyed by PBKDF2-SHA256 (6.4+). | #### `InnoSetupEntry` -Represents a file or directory entry listed in an Inno Setup installer. +A file an Inno Setup installer installs. Implements `IEquatable`. | Member | Signature | Summary | | --- | --- | --- | -| `InnoSetupEntry` | `InnoSetupEntry(string FileName, string DestDir, long Size, long CompressedSize, bool IsDirectory)` | Represents a file or directory entry listed in an Inno Setup installer. | -| `CompressedSize` | `long CompressedSize { get; init; }` | The compressed size in bytes, or -1 when unknown. | -| `DestDir` | `string DestDir { get; init; }` | The destination directory string from the installer header, or empty. | -| `FileName` | `string FileName { get; init; }` | The source filename or a generated name when parsing fails. | -| `IsDirectory` | `bool IsDirectory { get; init; }` | Whether this entry represents a directory rather than a file. | -| `Size` | `long Size { get; init; }` | The uncompressed file size in bytes, or -1 when unknown. | +| `InnoSetupEntry` | `InnoSetupEntry(string FileName, long Size, DateTime? LastModified, int DataIndex)` | A file an Inno Setup installer installs. | +| `DataIndex` | `int DataIndex { get; init; }` | Index of the file location (data entry) holding the bytes. | +| `FileName` | `string FileName { get; init; }` | The destination path with Inno constants spelled as directories, as innoextract writes it: `{app}\bin\x.dll` becomes `app/bin/x.dll`. | +| `IsDirectory` | `bool IsDirectory { get; }` | Gets whether the entry is a directory; Inno [Files] entries never are. | +| `LastModified` | `DateTime? LastModified { get; init; }` | The file time the compiler recorded (UTC), or null. | +| `Size` | `long Size { get; init; }` | The uncompressed size in bytes. | #### `InnoSetupFormatDescriptor` -Inno Setup installer package (PE stub + Setup.0 data blob). References: `https://jrsoftware.org/isinfo.php` — official Inno Setup site (Jordan Russell)`https://github.com/dscharrer/innoextract` — innoextract — de-facto reference for the undocumented installer data layout`https://en.wikipedia.org/wiki/Inno_Setup` — Wikipedia +Inno Setup installer: the files of its [Files] section. References: `https://jrsoftware.org/isinfo.php` — Inno Setup; `https://github.com/jrsoftware/issrc` holds its sources (Shared.Struct.pas defines the records)`https://github.com/dscharrer/innoextract` — innoextract (zlib licence), the extractor this reader was converted from and is checked against -Implements `IArchiveCreatable`, `IArchiveFormatOperations`, `IFormatDescriptor`. +Implements `IArchiveFormatOperations`, `IFormatDescriptor`. | Member | Signature | Summary | | --- | --- | --- | | `InnoSetupFormatDescriptor` | `InnoSetupFormatDescriptor()` | | -| `Capabilities` | `FormatCapabilities Capabilities { get; }` | Gets the capabilities. | -| `Category` | `FormatCategory Category { get; }` | Gets the category. | -| `CompoundExtensions` | `IReadOnlyList CompoundExtensions { get; }` | Gets the compound extensions. | -| `DefaultExtension` | `string DefaultExtension { get; }` | Gets the default extension. | -| `Description` | `string Description { get; }` | Gets the description. | -| `DisplayName` | `string DisplayName { get; }` | Gets the display name. | -| `Extensions` | `IReadOnlyList Extensions { get; }` | Gets the extensions. | -| `Family` | `AlgorithmFamily Family { get; }` | Gets the family. | -| `Id` | `string Id { get; }` | Gets the id. | -| `MagicSignatures` | `IReadOnlyList MagicSignatures { get; }` | Gets the magic signatures. | -| `Methods` | `IReadOnlyList Methods { get; }` | Gets the methods. | -| `TarCompressionFormatId` | `string TarCompressionFormatId { get; }` | Gets the tar compression format id. | -| `Create` | `void Create(Stream output, IReadOnlyList inputs, FormatCreateOptions options)` | Performs the create operation. | -| `ExtractEntryToMemory` | `byte[] ExtractEntryToMemory(Stream archive, string entryName, string password)` | Native in-memory single-entry extraction routed through the bounded `OpenEntry`. | -| `Extract` | `void Extract(Stream stream, string outputDir, string password, string[] files)` | Decodes the supplied input. | -| `List` | `List List(Stream stream, string password)` | Lists the entries in the supplied container. | -| `OpenEntry` | `Stream OpenEntry(Stream archive, string entryName, string password)` | Opens a single entry as a bounded read-only stream. The reader produces the decoded bytes per entry; the matched bytes are wrapped in a `BoundedEntryStream` sized to their logical length. | +| `Capabilities` | `FormatCapabilities Capabilities { get; }` | | +| `Category` | `FormatCategory Category { get; }` | | +| `CompoundExtensions` | `IReadOnlyList CompoundExtensions { get; }` | | +| `DefaultExtension` | `string DefaultExtension { get; }` | | +| `Description` | `string Description { get; }` | | +| `DisplayName` | `string DisplayName { get; }` | | +| `Extensions` | `IReadOnlyList Extensions { get; }` | | +| `Family` | `AlgorithmFamily Family { get; }` | | +| `Id` | `string Id { get; }` | | +| `MagicSignatures` | `IReadOnlyList MagicSignatures { get; }` | | +| `Methods` | `IReadOnlyList Methods { get; }` | | +| `TarCompressionFormatId` | `string TarCompressionFormatId { get; }` | | +| `ExtractEntryToMemory` | `byte[] ExtractEntryToMemory(Stream archive, string entryName, string password)` | Decodes one entry into memory; an unknown name yields no bytes. | +| `Extract` | `void Extract(Stream stream, string outputDir, string password, string[] files)` | | +| `List` | `List List(Stream stream, string password)` | | +| `OpenEntry` | `Stream OpenEntry(Stream archive, string entryName, string password)` | Opens one entry as a bounded read-only stream. | #### `InnoSetupReader` -Reads Inno Setup installer metadata from a Windows PE executable. +Reads the files an Inno Setup installer carries. | Member | Signature | Summary | | --- | --- | --- | -| `InnoSetupReader` | `InnoSetupReader(Stream stream)` | Opens an Inno Setup installer from a seekable stream. | -| `Entries` | `IReadOnlyList Entries { get; }` | Gets the list of entries parsed from the Setup.0 header. | -| `Version` | `string Version { get; }` | Gets the Inno Setup version string detected in the overlay, e.g. "5.5.3". | -| `Extract` | `byte[] Extract(InnoSetupEntry entry)` | Attempts to extract the data for `entry` from the Setup.1 block. | +| `InnoSetupReader` | `InnoSetupReader(Stream stream)` | Opens an Inno Setup installer (setup.exe) or a bare setup-0 file. | +| `AppName` | `string AppName { get; }` | Gets the application name from the setup header. | +| `AppVersion` | `string AppVersion { get; }` | Gets the application version from the setup header. | +| `Compression` | `InnoCompression Compression { get; }` | Gets the compressor the files were stored with. | +| `Entries` | `IReadOnlyList Entries { get; }` | Gets the files, named and filtered the way innoextract extracts them. | +| `IsEncrypted` | `bool IsEncrypted { get; }` | Gets whether some files are encrypted. | +| `VersionText` | `string VersionText { get; }` | Gets the version as text, e.g. "5.5.7 (unicode)". | +| `Version` | `InnoVersion Version { get; }` | Gets the setup-data version. | +| `ExtractMany` | `void ExtractMany(IEnumerable entries, Action sink)` | Decodes the given entries; each chunk is decompressed once for all the files it holds. | +| `Extract` | `byte[] Extract(InnoSetupEntry entry)` | Returns the bytes of one entry, verified against the stored checksum. | +| `IsInnoSetup` | `static bool IsInnoSetup(Stream stream)` | Cheap detection: a setup loader offset table whose setup-0 starts with an Inno Setup version tag. | -#### `InnoSetupWriter` +#### `InnoVersion` -Writes a minimal Inno Setup header. No PE stub is emitted; the reader scans from offset 0 for the Inno signature when it can't parse a PE. Setup.0 is emitted as an empty compressed block — the reader's LZMA + zlib decompression both fail gracefully on empty input, leaving the entry list empty. This is detection-only WORM; producing a functional installer requires bundling a signed PE stub which is out of scope. +The setup-data version an Inno Setup installer was written with, packed as `(a << 24) | (b << 16) | (c << 8) | d`. + +Implements `IEquatable`. | Member | Signature | Summary | | --- | --- | --- | -| `InnoSetupWriter` | `InnoSetupWriter()` | | -| `WriteTo` | `void WriteTo(Stream output, byte[] embeddedData = null)` | Writes the to to the supplied output. | +| `InnoVersion` | `InnoVersion(uint Value, bool IsUnicode, bool IsIsx, bool IsKnown)` | The setup-data version an Inno Setup installer was written with, packed as `(a << 24) \| (b << 16) \| (c << 8) \| d`. | +| `Build` | `int Build { get; }` | Gets the fourth version component (variant or build). | +| `IsAmbiguous` | `bool IsAmbiguous { get; }` | True for the tags that more than one layout used (the compiler was changed without the tag). | +| `IsIsx` | `bool IsIsx { get; init; }` | | +| `IsKnown` | `bool IsKnown { get; init; }` | | +| `IsUnicode` | `bool IsUnicode { get; init; }` | | +| `Major` | `int Major { get; }` | Gets the major version. | +| `Minor` | `int Minor { get; }` | Gets the minor version. | +| `Patch` | `int Patch { get; }` | Gets the patch version. | +| `Value` | `uint Value { get; init; }` | | +| `AtLeast` | `bool AtLeast(int a, int b, int c, int d = 0)` | True when this version is at least a.b.c.d. | +| `Below` | `bool Below(int a, int b, int c, int d = 0)` | True when this version is below a.b.c.d. | +| `Next` | `InnoVersion? Next()` | The next known version of the same flavour (ANSI/Unicode, ISX), or null. | +| `Parse` | `static InnoVersion Parse(ReadOnlySpan tag64)` | Parses the 64-byte version tag at the start of setup-0. | +| `ToString` | `override string ToString()` | | +| `V` | `static uint V(int a, int b, int c, int d = 0)` | Packs a version number. | ### Namespace `FileFormat.Ipa` diff --git a/docs/catalogue/GAPS.md b/docs/catalogue/GAPS.md index f04ba09fa..0fab02afa 100644 --- a/docs/catalogue/GAPS.md +++ b/docs/catalogue/GAPS.md @@ -134,6 +134,7 @@ Every catalogued row where a source records write support (7-Zip, libarchive, an | BeeGFS | `BeeGfs` | beegfs-setup-storage | Wikipedia | | BitRock InstallBuilder | `BitRock` | InstallBuilder | UniExtract | | NSIS installer | `Nsis` | makensis | 7-Zip, XADMaster, UniExtract | +| Inno Setup | `InnoSetup` | ISCC | UniExtract | | GPFS / IBM Storage Scale | `Gpfs` | mmcrfs | Wikipedia | | GlusterFS | `GlusterFs` | gluster volume create | Wikipedia | | HxC Floppy Emulator (HFE) | `Hfe` | HxC Floppy Emulator tool | PRONOM | @@ -190,7 +191,6 @@ running real-world samples. The file named at the end of each row is where the l | EGG (ALZip) | `Egg` | 1 | store and deflate only; bzip2/LZMA/AZO, encryption and split archives unsupported (EggReader.cs) | | Encoded text (uu/xx/b64/BinHex/yEnc) | `UuEncoding`, `B64Encoding`, `BinHex`, `YEnc` | 1 | no XXEncode descriptor | | HA | `Ha` | 1 | stored only; HSC and ASC throw (HaReader.cs) | -| Inno Setup | `InnoSetup` | 1 | listing only; file extraction throws for every Inno version (InnoSetupReader.cs) | | MS-DOS COMPRESS (KWAJ) | `Kwaj` | 1 | methods 2 (LZSS) and 3 (LZ+Huffman) throw (KwajStream.cs) | | PAQ (paq6/7/8 family) | `Paq8` | 1 | a single PAQ8 variant (.paq8l); the other PAQ versions are mutually incompatible | | RAR audio / VM filters | `Rar` | 1 | RAR3 filters matched to the six standard programs only; no general RarVM (Rar3Decoder.cs) | diff --git a/docs/catalogue/our-registry.csv b/docs/catalogue/our-registry.csv index 746cbf749..9cb1e474a 100644 --- a/docs/catalogue/our-registry.csv +++ b/docs/catalogue/our-registry.csv @@ -239,7 +239,7 @@ format,Icns,ICNS (Apple icon),Archive,,.icns,Y,Y,, format,Ico,Windows ICO/CUR,Archive,,.ico,Y,Y,Y,Y format,IffCdaf,IFF CDAF,Archive,,.cdaf,Y,Y,Y,Y format,Imd,ImageDisk (IMD),Archive,,.imd,Y,Y,, -format,InnoSetup,Inno Setup,Archive,,,Y,Y,Y, +format,InnoSetup,Inno Setup,Archive,,,Y,Y,, format,IntelHex,Intel HEX,Archive,,.hex;.ihex;.ihx;.h86,Y,Y,Y,Y format,Ipa,IPA,Archive,,.ipa,Y,Y,Y,Y format,Ipsw,Apple IPSW,Archive,,.ipsw;.otazip,Y,Y,Y,Y diff --git a/docs/catalogue/reference-formats.csv b/docs/catalogue/reference-formats.csv index 0fecd73e3..6b9be514c 100644 --- a/docs/catalogue/reference-formats.csv +++ b/docs/catalogue/reference-formats.csv @@ -211,7 +211,7 @@ AppleSingle / AppleDouble,as;adouble,encoding,,,R,,,fmt/967;fmt/968,,2,https://w Intel HEX,hex;ihex,firmware,R,,,,,,,1,https://en.wikipedia.org/wiki/Intel_HEX,IntelHex,Y,Y,Y,OK,, Motorola S-record,srec;s19;mot,firmware,,,,R,,,,1,https://en.wikipedia.org/wiki/SREC_(file_format),Srec,Y,Y,,OK,, NSIS installer,exe;nsis,installer,R,,R,,R,,,3,https://nsis.sourceforge.io/,Nsis,Y,,,READ-ONLY-BUT-SOURCES-WRITE,makensis,LZMA behind the x86 branch filter refused; uninstaller payload not listed (NsisReader.cs) -Inno Setup,exe,installer,,,,,R,,,1,https://jrsoftware.org/isinfo.php,InnoSetup,Y,Y,,PARTIAL,,listing only; file extraction throws for every Inno version (InnoSetupReader.cs) +Inno Setup,exe,installer,,,,,R,,,1,https://jrsoftware.org/isinfo.php,InnoSetup,Y,,,READ-ONLY-BUT-SOURCES-WRITE,ISCC,"encrypted files and 16-bit 1.2.x refused (InnoSetupReader.cs)" InstallShield (cab / exe),exe;cab;ex_;hdr,installer,,,,,R,fmt/1466,,2,,,,,,MISSING,, Wise Installer,exe,installer,,,,,R,,,1,,,,,,MISSING,, Setup Factory,exe,installer,,,,,R,,,1,,,,,,MISSING,, From b17128312861323295d2171a1a73fb53a189fc3a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 26 Oct 2026 12:08:51 +0000 Subject: [PATCH 29/48] * refresh the archive browser screenshot --- docs/screenshots/archive-browser.png | Bin 66518 -> 66134 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/screenshots/archive-browser.png b/docs/screenshots/archive-browser.png index de88d7dd43f38a733fe5557dd0e66b254aa140ee..07fb9ef52326c8c4ccf4e3e4056102cda5ca6e14 100644 GIT binary patch delta 27956 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 delta 28333 zcmc$`1zeTs`Zer~1%iU00wOXORKtMo5x&#CyHr=%W>F(~@ zbV%oZ?+541e`by|=X~Gye(&qgpKRGr-gT{Ot##dfh;w~j=d%1hLT7a7u^L38o?MqZ zSM_SBufV@#_nh&{i))2;J>|PXJQ{WhQ=i4tlxBy0;_voxXBAvOr;nwEP4QFpTEG^O zF>&3i%}w`>`to)@^oY$GpO|YI{U1pebuO5@~+yynV2< zpjh9XJKuGWkk)pgM-Cz^KB@P!C_fB~h^UL=&1e^AcgDk7>`ic~#}i<1+1zHhz-tp8 zuDVIY%x`xf86&PZ{8g{#t!!)Zr#we*aM>_wWk1y{R)?fE;r=ygFV^?WP_w*OYInWw)rNqB38c&D`EU5w(v~ zur`v&^${%->pa8c7NH|AlHFCZftwbpq)a=8GIgn-dxf5;J#sxbckTwpTaSm!wcZ;1s39LE>kA=~9WtCcP_c2mUKn5ONm zzEstOnj1cu*BljFRI?^_qI*^%IZn2|R;lHiTp{BZvcn!jWkJ1QZ6FuI zm=<$ZsG}$rlPSj$$af>T>WNL=C%D18W5nzhWg1N51`RXt?BN&rKAylcOqT)UU8H>D?&sZ#c& z{p-fZuSt2jiFVT@O3cU%>8Lfa2|H=5{1Bu@A~eaX7$ct2b8>H%ge!%XjoC||mb_V- zD{eD1=!UwzDR=0*vAxaAiC<$M7;o6OyPsvMsW*jQCwO^Pbmt_3KM8Lhhf0$%Ygfd3 zL**vIdKi(pxw+mn#igNQ`H_8`cb}C%+MTyiHOZ2_T19EeI$MMdps*#a0!@>+ONft;*^lK!ZKYJ!SK0KTz9W7vSw6C`67hOvE z`fzvii)wdYpMB4IM=pBmq{1n;Y*)nD8LIQ}CGv7V2}k-#>GPDv#X|PWdmCG}wX3=bS(0dIk)YB!3wt&Wi9H0gxL;so^JXD z?`)P+dgr#;>8xQwIHoiGAuq~X$t#4!>I@#WR z)j%GP*=;UUWlMaTBF*A?F(z4Qt&D8DTPDTW*t*yiz54cGd(k)pYGh{AYN9Qfn6eCI z(yUmPN1ZGca;}b|VnbrI(8$6E`l*U`oGdJ2MegOG!{Y8>gY`NBF?#iKGIYs z3KhT{Eh$-l3m?dxGcW){HW%HFG3%%grc)JA8uxKmmyTj(XJIj3=}&`ri%_YhhwChQ zy(ZgD)V?lu&{`i-0=+lT{a65#ZZsM!aihLI#@~0}uJN_g#XFRE!pAB{!#Q~d+7knJ z%|rP?M~!rD!^>NtqXt$S6ncg?n`mdq+m4ijN&PwvVtr?mNDy)E;(3lOx>BD=-_oqk z!_hNI76HAntC}Ty99vhxx0fH{lQ?bdd0RyDU_%r;WV~OBixQPuZ>EJX_NL^Ui|!Q{ z6)}?bvwhIIKFGyoyb#V^)np%xdzpMgbs)#BK4gUlfe-qs`3BPq8#~5|C(|`Da!N`{ zV5%r*XsJJR@W+pL>1P^s-X&o%`;wh)pq;?{4GAbOO`c1L$F z3yM3xe?DqnFr zF1DoburS^n%OT6=p1eH0`T+8MimtXcB`g-*fewSUypj#HHoK_;bLsgM1-0R?2@V0b z>t#d=&5vKTbS4ohy8y($ zlSe~9L|A@@A>Fajlb>Je=bxKO1(@2}hKvmj(LH$&T5UljUhc>k9R(puwbZ>*lzi>- zc-(RAPyyx9QvOl}w)(>2RP_^QMTM;Uh4)vB7bMn79ASOwUHmv)NGlV`;&kv%wL7W8z~%Ag#QWuCGxO|=csYy=EfR;&YiCav zz0R^?8zP3q0i>6t!PZ9QE5o*!{G8M;hLCtVJz~DUR2el^j=J9$jggMx)dzF=#O;tbM-Oz=%*-_kp|pY(A10~d=%*rcJJW#)rkrMF;bC87?;`NG z%gcR3on9NnzUi`G(7PPj06q4ikvwrwI9eOHdMp}RC$GeunpaXgEr`W8d~RKw20?w3 z!*ShL&CXg}JaGKYOh{{_sUbCiHxjv0Pf^8VzalPKlIT=cKXjS2&|*B>UP@)#q?cGE z^SxQ|9m=H`>5jgV_@2r~v5S3uee$$YX8kD=H5JDZHVxEI(|WHS?m%nU<61})MJcMe zmhde0@sA<+BDeX?0H(TLh>7Z39YhXS%J7qs90+?Si{2Ky6S!z=+|^^;8p-a9St%?( z#Is%OsHoAc+_YL7D<5Y%<~NwZQdd`}5W?`6gV{)k8Mdt8zbyVPbZ6vhio)X5^2pqq zT_R@flYHX3IC}V?ah57I8-1A`4|c*>y6ejZe^L z4Ofol28-LlR&q^=FiwkR*823TssauUXk2o6G@-OOTos_UOpWp+nfko(kh;3Mrzu-# zay)g#^e-~CrQzYzG}3AhEHfZV0XF$=#$ktBCmZ!s+Rz(+|0@B#%bRjjOl~7O(^`q* zr5xry9EU0iX_}E7GVhV3Ljr%C*`I z>FLRHP%n^8>(#51DGGW2Ng>5zyn=9Nn-e_Zs^SO&pT1gYZGU> zA2$Ti(9|6iJ~K8Z=|PP|a%5qF2 z$F&y3mWo?!;7B&a4tb5tUppIvM^8^rD_T!BSqiNh7|>nwK@L02pwa!Qs=0ZN#w*uu+(;U! zaNDboHR(;?K3KU-A+(#J$ze9+x^l4nuGE2uQFCr-8njiD%>Zd+ff*m63kR*J70u3a z)Oj3%+r;TyF7j%SkNf^dCFN-}A#LvLH@xA3tAa(!Ry_O7%mDCc>q(osYe~o-LBn00 zRdM>8m6=IWD6rf`Mjjr{HdEHUQ%q4v%>Sf7hl7K|$jI;x_cF6qNuJXZ$4Y#>_M3p= z?;Uoav#FA>G3)8}O za@q$lJ1>_bnC>RY%}W#tPWuO(U8SM{YlUW`4ilf|CS$n^H>F~~^=8KgaGG}&8C|EO zOc1H4D7|y1E`Tfnc_*mR%-rmzql={)YA4XLuS?D~kvp0E;+1(wz;13C$x}W4EuD<} zc|)C4Bqvha)Wl?QxP#X55vEgHdSK`Hg1mfpe63>!ZcOrZi5rYs1@ZE`x4}axj;1k0 z@zl5WCcXoh{3mZAU32rhI7n`5wbQLr-c3RaCeXWy<+G>AuF(#jH z%&k=a$P#rOQ!rBIKB~ulXePWo%4yzb)|xkmjT3PQeU%tal;JWHr&m(rjM3TdT3oEz zk2x0;AgbYGzuF__Hio~afO@T?bD(w4d4n*n<8a|?l12Pj;jIZyQ4PsFnMa@QpeIMs z%1m{}qLzKf7k9~L8lH<>cxqg5q$6mgSk=|h@d%4Td1h{QRx#^-ZiZ1~+qp9n)JOUk z*PpkvFhWf#CJk4rNo#9V40IXv1kQjznQDSYs-g{B?n)Kee4<3cDZPtjWv;C{+Rdh)z6P<}zb~7Hqv+K1vt6T%j9kjM%ebG1IK|*AQ6VZ#<6nD( z<9qmwJdM3(XhA0_^^RU8EISi?`A86}%mQL)ZDnX}+=Y)O5G-?wS>9d+A1h6lYsXn; zmuG5p;BQ`XvQS7$i%s5#|5F(mhW|7C;R)7H@DD1)Y{Gcu`?uwXKJ_kJ3q(%y_z9<9 zU{8`p--3^Mu70`W?CE`(DDq5jfb|v_ZFfSq{zsRQ(1UzB~40LU7pL z0+mngER`qPaJ-{U9GCGj(v|u`U0t7+pswug+mpsIoFqV=`tD=oT@jgT$is=h|J8w_; z21%}FKR|s%WWczbU zw@3i7R@`gqf4!Ps((Atg$WUok;C$)N@`d$_GP_KguA~Q86oRiW+VPc2Fy5C~^s9IS1Yc49X3FzCF%e zbUNGzK)z3CN;h5^;c=aLu%kX%?9n5q-TK-=Ri2gQ<*0}d0}~TEDDVll!}5BFp*cm( zr}wWS3(W-xT?*RNV4o7gr0EXhZKTT^ybAqm%fa0 zKt-6C43$ER>R1%c_Dd!9({(pqy;@aFH5;rbe}vrG-OSC;H}6mKOH!&EEnO?HXf~w< zS32_^e^KJl)BE7IBKdxSH#)&Iw2i*Hk4i)4g`JgVv8{K0em;J@L;G#KoLn!zTfx!M znx#re#paNKp&?cy_yT3OZ*RN{u}PK=InLQj)-AllAURGi%R)T%4X8D|dI#X$L_}i+{q(Y~E5q`1C$i{WW#dLi#irmh^EO@nm zZ=n^6$TGQm5f}a(b3N#n1|n#Li-*gK82-hClq6P={L_c0->%cpAmCquxqtctTW5cs z^FEdCS_L{Q9z=XG`DAvB&K!yMvDrKy5P8dwj{tE{|H}n%^!jt$!Sl0|AihE<*Zt&% zH#ctFSiTHjh6;i4@%3in9`31^Al<;mVn~4E@7&WsHaS1Ed}i=WtGT8P!?jhs`|^_( zUx~xf`r~LvxQ+9V*N+zDxi?I)u>s5V;WE5*fSyy-ok|Y6dm}W6I40KZF%LaU-h;ev z!NkO*>Mq#cRTBB?xw*N1&qZ*V;afB361n0{<^-p0F-Ijg$=?ee5=i8wq=mMh&&_5n z&*%-_qqRM;?$T|xU}R%kY8KPZcSUUvljp@eup2stPC9D(A(`ot^zc+pt*v_9A44K(y7GS9K}asO(v zuC!^>^XJcT$yjp4d<%JY=bdH-+HtkvX9w7B{Be=R^lsc^uX$CKMA6~TZq-5x<gcCFR$Sj*f3G%`NygX0!yUQBK20`8Y+PE*iCN(=#a^oKCNpbA^m!CaCH$Nfq3D zf66QQcgB|}rhi|2Ab9nu%+)-M?ol{<_AITaXlr^}S{jW?p>(uUt^tEq#nD)~OTJ0Z ze0OQ6Xlq1mT6-9)Q{BhL_${xd`P_^g!fJ3wcEUQEI>EOi8v1I^5h*Dt9IGJlTt5%) z{d=agsT%mE-0jz2t5$d%Zjs$W;ERcgMSQ}C;)S0*^R0Z8ujY1_&Sc_~OaR$QRZWf1 zoxqU#5=qH-!QzQYDh38hgDV5d8R@cjS=n+Qa7`lB8-E`e0tzA+Qmj};B15$2<(n-r zs9z{4r=?96M?8EZ*o}2fOAtXaZ)t)DVi3vn4G=s|f;9xs?E>)WX$ayueC`ZA!fLZnFO@sK|r+&4!e{(QKSnqFVYl|-k)-K6tb{?kHvU0as zz&o2pu5jM}EK%>T$!&K{5G-q~fG>GMMId_7tBs5Y_Y%q7z$e6p;Qe8|Xono$D?h=G z1DtB(EXJ>~_V}*TQ-zJ{93S@4q1*Rv3mj~22yf1n0KVFCvRcLq*Zlb85GWGm5ay)v z*VqetoX)7;Qo*<0@=2)*srlNO1*s}lKsNCTASqory!^?r|TsFw;; z(4|#oQe{9uATh@7&kP_DsHz<-HebRcHvIlXzMuaN8Nt+{S!9a3_auM0bH%KxI#y?e zW~tjn%KCS=EKE$)vIWmW0x0_ajB=ox{4GBQ(rYU;^AU8*uIMTC5?DhXdtKgtzTVNL z#1t%U>f*Sy+Bv<~X!Je&g1C8=;MO&QTQe(Ya&i|nLT_Jht*bYb%AP+akEQwPr*@Na z@Ny3bS;JduYHE6Vw#HTU!dW?$u>zx_?jVeM3p6{`?iI?nw6+2r2`rC&LK>PH;%1n7 zN=UTdV!)A&MJ`Sji(=8mg{=X8{rC9%Ls?aCv>nNBk&%6Vy3j6g8#HLP5${4DqlaK% zcz9wXw&kcelh&?;HfF#Y6&@n;_~20+PSQU_s8=x1ig& zu^2iKv3%P&wl}&&Tz~$#`OB9lmz2|TZnu$!k%aZLW^Y0kd~1Bad{GWqB@;M$Z*{tM zA=a_~F#)Q~K1Jrr07q)hTlzL&K zjkOwTckJ`V^yjB3Nh-c`uh7%eK(Yb>h{wHUzV4?JJzB{U*V)AxV>TL@$VtV*Hh4Yb z`##%ZM@sz0mtyf#uU!h(I2jMq7zy}5D}0@qAx#D9My>=-Z6pYgYXg?dC75pW2Gfyk zLr32l3T1lOceuNTcWcY|C6utMUY>T({+DlF9yW&kU$or1`^*WGB)RPOI=(|4tH!(V z%?PTKrO$JkX%x^&Vok1~nGsmnS1y^&E81V@By!N9>~uJvWI^qDxV5+s=N>|bkp0RI z*}Ge8)+_Rhw?!>Qb;0*4;xk)Vpd=jGc+tZNM3h(cTV9UR@tCU8YT*w?;bU%=6yiIJ0) ztt^6%Ucc$cVu+P*8TMsOZadI2($NX`RtL1$GN|r=K+UQ~CcircY`uI_B#db3Xof@m z4H-*em9PqBAFU&yyB3SX87Yxpb{Q}3wO%D6Tp`5&0yQ}8-5R1Nnr?F0`uWUD^iK1Y ziN>&S^^e&fBd6epnYgUKM`zcUiry;WaQt0Vz&-^7g zs;ovuNBvK}(RlCP?;%wXzQ*bCAVT~eO;4lmT|CcrDA zUCOy|5xxvTHQI1sqH4Ck=#NMl`VA@@7+Z_`6g;;+&G9|(39vI~;gi;foU5<{Kn~B( z_hSSc&&78aF;L7iWu_6uOKUhi#|Y-}T7enGZwMFw;GZv?wo-q)FW2KQZeNAm0#XB9 zhilj#KyB&gA>UBjl~Lt8fe)~;h!%m7Jf6B1q)y6DkUKf%|}%8h#Hg zi4n@vRR{4)be+Z?xk{zXe{0!bpP9arZQ5gJ)&@8rEkUgqDL9-ah1)py(483 zB0^2uf|P(zjwwQX6%k?Kr$uVP+b_l{TPn*!yrUrj(W}BveVaOf0;y!?iK%2x)@1_F ztZH-;1bO8Q%|lzG`Nr5QsKpe!dV6yo*8%@GhXmA!L~3_#Z(S=c@5%i^&b(ZL#}bd} zwY^_uXXl5$Cw{>IX2iNR5Rmd0mn^5C(vPvR+PlcY*N5B4wH3wN^p{R%axFBu-3Cga z?I1;zHDjDVS{>X^5K9IxfVS;IYz}FA$53w?u{*P#;Fo-}+0>4>$6E{_?{Ai;BX6S* zrkfQ@yffTYUi!Yt_L9Wq))u!(S>`yliD#9TmAjl{!De)&~ORXp@q`5tizTmOv z3vh8btCcRL_V^zrJoNjFM`$o<7X$HuR+_(|?c`H$X@V#&Cp)`7E_jzuW|Z}As=G+; zacDQc*rPUaoEbvdnYyiUG3yAB^X}El8q{pup>TEYGe6S8AY^}>;9m<^d-qm_6{;{a z4ld+?7>{wL6RTs-T;JyT4xQ~XXwhU!iu9sJneBo} zb^b;|{R8unqP-ypk>yeH{jW*+<3D6 z3sb`#qF7f69!xxXKGQi(TVl6Lg_s9!F<>o2;1_-fYOkv$8$$KND*49jyqu=Xb|c_C zn%f23Sq~o7Sa2#6Q6Q3TXbDDK475UlF>{oIqDn`mYiLHHhS%Ld`e@RZuEXHsXgr)Z zXrn-elYkKx@j+&JR0=im@^=fCZ6Qr&V- z8$fHO6}8q{8$%qJ3nu5Zkc{GP9c)~9qqMeoO{K_I)&12$vm7M?Kf(pew{Ww8pJ=VF zCZ$_aQj#O{xZsiIeYc&F6gETV80Bj0uD8dB=+>x7NG@$|wfs=z-LW-jK;U%{e0x^l zRs@@#+Grtf;?sp9F?pZN@@*HSQo5GSae#nH-xmtRTi$E4^5esuRlml@93DI<3XZY{ z(V=SWq@~y&vu0Fues^128}P71 z7_Yo74vH{&_H1Hi{!6%>on7y_V7g!hIy*b7ITsSJ`W*y4q0(s%F&inI?g z?6|ekn*hYVysa(5&d!StYkB$kR|Rp8mxFeP?Dm${B7xhgw~rC|uDDoriy5^#k~7#_ zD~8nxr5t-X+l$Zz1AAJo3!14Db(9)}zxX(of9Z*|n0F~Y%CKHZDp)S=>%lq5c6U{i zl$133gC@7_ddeCjg194jH}0!keF7$VFas=Ty=m&n%lQ{M%&jLnCIi2Ef*eRhMA(gE zp7PjbRW8?Hxwr_B>hR-y^|}IFhqlSk4tZS+->&`UoMrXi1J@L1Hna7KZ(73E;!R%{ zW@bV#P*^@~3)%7t&ZSEhc!X1DG2J&4xKNPNwFhyu2ejd4(4cfs2w5Szi--E&vh4{0r zn)^Ph7hb#MfiGzD>)bRQQb3;ykz%}X;lhQXTxQTSf^R`8JcS*X+x@lG%GO$3qP^qf z@F>vKa=c*sBT258+s=Z=xVy{xFNZ6YkHG7qhwtx<6#HDKbL>s&rmBR52O_{yBoUhV zj)dzqB5Py;Iy;%01KBtTO`n0eSm&K%{TnhDZqJIV^k;|kH!uX)7kJ!_jIG5&_ zGwhS!{`j9sD=94_r&>^z*a7`?+ z>+#{82kp!Zfo~qq5;Tv9NhzlF7JjfaZNoPaqoPI`@Iq|#OKA&ibCR)(OT!&4HP7oa z-p2Zqxx79J?IR}>F4fT<%=q-_k&RRm{v9qZRV*E#YGM!0t?=N<=YRY-Clz@FnFeUN zP-<(3OYStMgiX_8cE?KBh)GG8#%%<&WAAkvDrV(v?V20Or+fg`iXBZJdWEcXwb~Ua z;vnX^T4)O(tq2ql9rC-|4SO|9ZMCizBq>G~1bSTof|Agt5DD2Px`maEePyWBGV|ou z;1#;|2o7PwST;Ac)BHz!&x|QOcZNxAZB;hHPaY*b8!$j!a!^R zJ)g1}k_=$kvu>Jhbc=*!NpNJO%j_c5YZXM3rjUyH%#!%gDyz_P=<`PU{^m(Z_}$Rv zT{7Oi=FDUSegQ|Y#mHVRXozGy@x+|0td8pH>W0dRuG!{chgIhs^UmaU?$HOnjFwkqC7ake88H z@Ju<{+Ikfr$`tBH%|^_jt4i1u8^`Eu-}elp1_T3lfVMn z6Q38oaK4E`+D&dD2fImiPK?93;g(4DTt`hD9AE6|I!R(q&oy??BJ+)HeFdgoJCTKE zrLHRxC687X7g-mYvm;#fpl>xBOMRBNSazCQ($h^8N8cRm1UA}^Cn>3gF9gvb+%`wo zJN2$#s^x*B<532FJhY~ji)O|hFHbHIMaIjJ*x9}yKG;vzmWtf?g=aWHsTCM$j&}}c zX@_sQ9i(^rh0D`2YZj-rR|ZfMh`o#*f2%`{nMTQb?U+`mAJ#*D0#VT#fPP7Hihp-v zipesM^iwZTvU7l%yEn6)nSvS@U3#U8tRCA;ngZkkxMvg>+Wq!MM;oj&?Gfx7&a)6y z|B*lK_1>QEX8r<=+nW!q*KQpErs-5~YRGTD1K?vunJAD`94%1G%R&9>80h`4ZZ5k< zfF4}-F>GrYiGP>qnc0=3(sz}W)D4Gp*k&1ovNIEQVpwUO{Q76PLp`VRYcRjS>kZG# zeijOtfmr7r%3D>pug0O!KNYEd&l1WK50%Oly$+oL@0dlb{B=_&RkAsx#`x7an`W-;9M_KLXZU}CkKYWw22 z@BEPEh?QD?P4bg7GjF?<4PBUGft*OgrM_1^-0)ND8?t&Y8|1X#j zm+g5ilolUF&5zSVR#wP5xQSr8pr8QvwEL(K?T?6Fho4sLK1pyyBNhNTbqN|$F}!beu-R#PXyNB*ue!1DvJu^~K$w6wn~3_8~0m%L6V zz*r5?C4#8>u0rp>J1?5vOm1rHYe?F54kqzy4ZW3l^o->Cb+Jhk#lEjjXW7nfs?pe= z+!BVb>c~z|-9;b}EtFjZy#Ghbq(iFSafxxknKhLI149x|a36-ihpk_tLZ~$>Wn3cT z7HY3{N-g6}{5DzkH05cG0$mQ{XemyLWO7yy)X|cj6Dyqsbj??-5n69ij{A$jppt?~ zt;DRZr|~Dho7fajySso>^#rQ-S5Z@gYxn=!B&I zlnISO&pMBaw-@_>n&lh91ksyoUc3XTJan-4TkPdDALY<#`l#oHCq_l!c}hnSR2v3f zvKS~bQw+ne9&XnLQ2o}mfsV9gIt!-NYLT_{mL6oy3$QFK^{4GN47s^%r>iFezpi1S z1-)`62#LTo`#V#E`)^hT=nr0o%3QU~gg0;aYv};dE=e3oj6-2<6a4Nv+?v1=V+2zi z!O;o)ZE?i^K%>K{`pFZLD zO&4H~@%wV)35%5D9CGfSc%%otc?%G7$bBAo7<1M8!`KXoPsOSySj~a|6Y1Ei3oV$q zm!_7>P9ih&bNNc_7`0kdXu8K{Pf4{*!h5Cg9nOqNdS*T~WL&}u_p9*mTj45!f4N>l zg;0FV_3ZR>`it*G>Tg5t)a(ODI`C?3gN@!_;bYEN>I#NMeW=!fKf@lO-^MZAyMTF! zO}OoLAbgv<#vT6uBf+=OHYqVdwgdU$=`2`kTHnuP{gEl?51t_FMKsJGlYhS=6q`*z z_`hi^e;>*(mUhS@fw`ll>09~=i$%{};IoO?^Ao^ay1ga#M^5jC;1(${)Rm}L&lJsl ziNYDM2=Pu6`+IvpNdw*vz#^1by%b0|<#wf$ZoBxwlFRL{|=Q=<*SB)$OK6xxM)l zBO?>FlG4cG*Ic=+Et2fMCH4ztcg&=!&9~1f6ZHp6gkFQbt=7xN?8 zUxD9?z*|VZLbaR5iinAdO2fg<4g?4VH%m*AQ)L?r?A(7uMUc^qf$mhiesg~Y_U6`B znLXpAtinecife+m-X7^pjtsJ=Dv#&c4I}Q!`;+lg1wH`|7zV^&wcrP{4kAJf;R55p zF5|CRdeO`O?MUwM&`?Abyq>*8$f6Wpe67<@t483Dxt|EW1;fA6Q%hgj$_BC`;vjHS ze)c!>Yx~~}ED3;gGYC|mL#|AA0{`wbZ9+b_&cFNa3frQICE+0oEC2-mpa?@h$)H3G zX_J3sVTlk9raN|VZy%^p!3vB_yC!(#I5Q7y`aqbayLO2}sB=jW&?)2`ORyEM?g>0b zfI6W7Bq)uHl|n3Bv#Z2kl+y5og)iUQTFCw?5Ed5pQRUm8g<$AkO0Zn%ga2{nk(|00 zw78h}_z(x zO-i%qqTn_&OcQfmI~Ka2oT*7la5EwzWOa3};8~j)8(VkR zB_1wr|2^FSpje+ctyh9xEwwCshgsoV>B`XL&csp=dcjxKTWbeI6<)dTsX?5Ut(IUB zs6i>qyw-c4mG$PsPZ$6Q?WRD&XqxP&&$`0r_v`V&h3zGEU3vCY#mi)@VV!5sfE8#W znC3su==tUj-}un5@6*ut|Ebj^=w{z7=;Bv2s;MY!K0a5f&%;ifiA94A>?X+$}^eI*?HMJ zN?}S)LP8=&^$L5bu;gTPz9}|X`5$1%{lmylKgQ@o^5QVWQ5Yrys&5BbVR2z65%BcpOqvdR;z=l7qVqg0(fE^Zvcm zo2;FX8`KTz?QSq@yMtO3HFlG&h0*2&1F6OW08ED9<}xQ&NnXE(I*Ibe=Z2?DW3$0shJ#^l}UI+>YBbaY$r*zy-w z=Va+v)e1TWmIWnuclTdksii2S_Igk+Urot#D=knj^ddjrN4Jp;u?fMAR+jPaQ|d=E zia-LgU+i#S@$>`yC?GGdJcbuWV7+Eb_)Yh6OZ?&)7}yD>45%r{B*YspQKg-lTTCs_ zy$TkGPhb)PC^tGci17D( z=sp*<$L|>Q6x#mzgx|dBvsM2YV?zFS;2W0R#MUwPj+KsA(U8`4bl>h%Uh!!x_eJ0Aqn3v3GeRsZ>+w19#~x=){;#ncsAj^E2ZB|gfeakZBh`^}H| zPvz*ezxpGfG!@t%5g!=o?d==Fs9j3a(%ro|l#h5U2hYW!eB<2bwM{r18>jYj9?G2u zJG&0Hws*7de?3(Zu_tq%{5?ec?uICdG%+#)_AUzx9fqLZ%~bXFv<&>}mXHC2c;L=`StO)H?&EXw;e5BA7j&P6B}FMeRe7`oJPYhnuiqiRdGlt7T-a4O zy_(41cuh_R^8_+$Jqv8j${y4-qfPDY%y(t!gT?bpWOKh5?q)1;n){#}vu*1A0~k(` zT&CBbEk}m6{mE6mrv07>&!nV8sI;`0F^p}vr9~lk9u!=n88w#C!yT=?vw{C=2<(M2 z#0x-xIBDNY)p`E>!HY+jS7#51v_C7QZGQV!V!!xVM(1?=@I4tk50)1m`&CvB4vX!! z;qRtt%PW5pgq?3}S@w-|by*M1hz-?4jqs^p#z`cZ7&+xR&xIP*opt~x{{IKh1>AwB z8N_cy#NS&kpg(vnmQaghXJ0#S&yQ_<#p7CspX=G4V4vE5XH{HpoJsiytA#M-kNiW< z5Jxkb6KTmUsWi0|#VoLFk!0_qB4d>3Xrmr+;V2Fqns*5)cmV3O_8f zc+%PMoiba{V0GR?Py5cb+GRe~AFK9=y+Sf{aJ&mSn2$SSPL5x_;lI3Yx#gbbz+P+r zW6%g-!Rf>hOCLTBM=NH4CVTccGbgR6xCn>TyMq3{U3aoVtQH@rxne{Zjc1I4y(08P zt^gSssS@`Z6+0em+MoAlSO|Tu$AEF+zpPY3r|g?-=U?)#yU7*`IR#yk4bNE#2?;^r z7G&tB-!!6O&H{`WD|xxOHYRE}AODu7=ED4&wYl~kr|Nz)s^rhSQPR>DgJoQ&-&dxs zwmRd*MI&3cmmuicwQIZI7 zZpCuj?DUaMS~~TOmAOZsTrd4CfBIMYv@Qe-bRcNU2%@PGz(Ue=C@zOQ7#nkOSnX)@ zv>Z*3&Oj@2&dpe@Ecb{J`YJ)`a!8Z;_f_Ay$3L(bnO!be9zQC7n8#5y@1&PFjW79C zf6uoiC!0<7%O^j44?ocQA~gbJm@9g4;ty(iL-D6JnFZ67QdsSK8tR8CL17cKcK$(AZ<<90lb)!* z*$le*3A}he61>~=1o)YtzcVy-7?vm0`4#5n4V1g3sUc$?>MtsH8!*HODCd4r-nE#n z_jfvwD*Ztbl*p;i`6VLj+<#>L09yj(Xm>twc7``>a4#GyNV%gekf6agMV@!;W zpS0KGc4Hperza%5!PgZYSd=Cka#-q8#gdDAJ zdfHR$l2{-J{@5G=!Q~Iv{I2;30#f*n6Y)KUvWWMe#IW#$PVloWA!^g5kk+#Rv5iz$ z$2&#>le@|T$fCT&4(QWwS*8`}dWSNVK{amCTxtH-`gfzCtP!~JPXt|oV8X=bLYw?q zAydix`TTuta&i$mcr*}H-$|M9^lMh~z@`9>C$LopMb)pbE|)iDOwCO(nNb~NRQ5>G z%7O}F#`Yolepf#IDTJV%&On4E6@j+~6Oo`R`$;ogX(227f^qVoCp?!%I=sZJvwBKu zXR))~z1;a!E&X0t|1?O_pO_R|$SRDg@>q5vgHL7w}TIX=Z)VE4RlvVg?|*Y+ z!|=^47Z=#LfxDNC?A8Oq#>RVsZCx6RIsYqH7$YybgCdgFnwpW3k#T12+bjm@;)w); zTg!cRyJO{GH$FI~@*3k8*Q)<1XJoQiZNl&%%&9;`}P2KkB+)NFwFP7tD zd@e>)n%wqLe2{zfwm>=(35{8FPHq1BCQs3aACdIs$2F*|6hdn;e7Bz);*oOE@$i(| zBh|pR5`g*E{|x65zffF@A2^jIgLi}D)j;hx`1amyJhQ$BS*qPr8yE3ztEj3PCw&Dh zZb`#Pi`nyeBFe|8yIM;@0gxd7{#`^TEK+^a5Cf%GpR=;o3nfsXP7)cTthobcvM)p5 zPe$e!|86Uj$xUUMri}_f5feOk$#VvtWAE`R&ZTiHhQ8cikEQwP*pj$JG_qv+9kF z0=N9RuaX_RrzvF~t6&?=a6+BX6yWF|a&u!*v_7U9+eMCSZt6^Jsf6C)Sxj1d3JAk6X=r%lSwKXv4JF4~7YpW5biZ`CF15x4& zfCHyRWS{_+Sre*o-Bx>@@aA}{F{oX;D9d<>!%13tX?HC0fqN8K-maPU<%x}W;9z6- z1EsA#fJAY8Se+0It=}?q$?%8SfGDC@$~@WM^S(GZczMx9<`$1qPz+qw32fBis;VHD zsPnrClKh0cXJGdqF#eajQuGGhEIN7DAy?NUfWLrC6kL1sVI>MwodP*9Sx=A0&L~qU zt-UTfmes2Iz;E1?17o{9=&WT2$kS${+<8xy^JKBS39@-1@ zNBU7@nexY(D2z1leYp)6P;>Ab93hsMm!s7=EDznMqkDS1gOZJi$d32-1_CJq$oLh& zz8#>VWB*$CLTwLXMZBYRM+4g(>P%K{2b&4uP=L+S3fG>^gav+uD@c^SOst_D zW{2`&&%H798APLs%WepKieJxO5fZu0=N_+)mKJ;qCQg5*vJ6&WL$X?xfBFuX2!+o0C$~kI~2XWyIE?z zy*Lo~wb??xl;S4m$&qPqgk_1{!YzUapN#5#*1W*ZR^lV;5$vg^r8kKPM|0IV`MW?< zRgwncd!801U-$cqM?YCxj~Y08h1Aqa-jtWO#q*@305_Agzkh_Pva+(2Y!H?rz|%GQ ztWdbOxA%@hSc^(hOKUF&*!d+r+TPwC)O&VI^1xE}hahbGjbL}0^gX9gWEfH_!_TpnE2EXATY zawU!7w^5>F2kCBxdUBhGFGSRA1iv*vHd#42i@oKgZEXw{#J)X0THJlD5tTi~Nnyo$v?lBVdQP zP^3n1*vF5+aWvg70Ib(18x2?gVD^UoQ12Me#h8TpK{CR99u!@wao`=93~d3b1nlMl zte(8OEh@p{c0a0*RME{cGL`8w#E7_qeMIbR?0RPmVs77dU}J;0trcv}PU__w8$G*k zShsbv7fOSU2GL*#GW}(*E{-S`I1uytDR1LWQUaw`I)cNZY&DX7JY92~`5~2Zimi>E zaetB&DEg$R0hNfqb)5r zd(+&m-C_u81j-cj18GVEcQJ40oZA(n8KMePhsZwiqeFp9PmRA`*baz&cg3h@9((Ac zc%nRwv`W$Q1+bCMF^yRw0Fa3*UId&`c=y2@tUtKDfe1b=M^D{N2IWx8_cAwK-`!yP zLqYmZF`4&mH|XH}_S$fU6zPRoLJavUc;^ez3_p!xV&$;}Ux|?_zxt8mLm=-hPzf479T-4-z%d| z{#>?xqb*vXT^2t1uO^D0nIr!wJ3qnNI0DM;@3OOFFG)psB-uav-7$K|&i&?T}z(CrZ z^Z!s6`n@ca{^mUfhA1vWt>h~!q8{#X-aTKmj(sWKuy=#e4tBou=OUyJdBw~Kbi)X2e2#CrNuE&7I{AgZn9%5yf~Fz47N8vAc}s&9shzI(Elae@h{i` z{h!4hgo0p8RMzjUQr>BZ)enK~(*DL*6Tfyza@6)`03Ze5HU+Qvgq8H({^vM{8E5wSZtu_g{rdPA_1^nGRZ&O<$X|h{{;Jnp zkrty2txu`>zv}yF{k8ZVVa(nGz*ssu?uUnkbr8hDtV_WT^gGz=!lg^>tc&D1aFiG* z)Kg>mR))aF6%1zCKGCl%+uYqn;3e;~xXSG~0fVlxa>M@iB0v)@F}FU8{UyA?38Oil z$~RCD;DhB$lb+DL?v%*2A=>Gl}y;kYe zL8Pr^m*?v6U6u(z`rAq>)6EMA32_~j^ALZ8GgeI*{_WdP4deH?ID?{*o*neY^;tv?= zT54*?^7QvNBZCWt4g2y)SFRP`ef$=T$#ZPdPrGxQPcj}`TIyP^+3zoddut?6rWyVr z0P6O<%=Q&E4I_%QE~BLqVQH&Z(s+*HV#F?pc3N_OHy$)VM1c zv)zmkNgbUlQTH#wQC;{$AZKaZ*JuNB!TMYVfblTAr(gZOXYgApdoQ_j^tA2NB$&83 zU@rf0m;WDW0s2c@ko!BIiRg9X@(RJFGKjYhh!}ub>JY69VoCt~2IrK`{}ixRGJNC4 zwL~c^AK+Yr)0f>j*bHgs5${o$Bi^J2k9>L$qq_jkz!=^g~kk?k5(Jaj@^Gs9N&Na2W$0N3Oh5^=De6(^4)$0 zol&|4U;2Y0HvqGRgPZ?UB-a3QFB`N&OVOl6N8~XGj9( zwp4RzuoR}z)`5gBcu3IWHO?}~+@HoUrNbvniBTpD8t?9AJe#R^qUi%_CTi~^!aRPIqlH|o>OFr_P=of)cU!n+aK8v+}a$fXRwb#DR zOvb|Vi^L=TD^0X1_pCD$QvxZ64YmIW7rT+NI*0PTDk}l08Gt$RE=;AyNGps_O5Wg1 z5|n&N{X!S>yKsEM${4#&6Vzlm5fl(Enwd*%nhfo{I!4^?I(0X|)fAQe-qj1C-2D1z zRNYMM(0HnN+`0UEe{!}uzoo;mC40_~YRgpxCR?7)y{sxvC5U+IT`Z$O>>h#Az_9tVGmzDWz)SNI8uMGzxM=i2>c`=QKiql{L3uNVX zN7HI2E-HPnCaQ7kWSpr)t(nkQVqKiSLHI7zJm)Rfw$j!wh?&uLuywY-;`gRt#~ncF zB1cL|qSZWiv_ykW$*>;{MeA3)$#*HS+%@N!VitP3$sC6dl0d-DhekcYl+po4DxvTf z^v6Zvkf3Wt2AQUmNl0NS>*H?9X;Z6UZ8k@#pLtaFU;HsyD2uqbUv;qy?kjN!-MO;} zKXM{-1y*Qb>1grRq?%WTwn)KUHke?on@Mcr)AX-qL@K4lCUMiSrIjzDDx*eSH{4-y zZq^gKxm;OrA-e^O{E*;`I3zAx_x$TNwqH$s5<6ex65NVzV?-ahZs9{KETrW#eLXD9 z1Kt$;Vn7W_h&BL&=e$zvg}yqdi`4amk^a7oATr{ijdB*RsJL-TDV3_ZfM_%ZD=Nx& z$Hf|7y*4S9T~t#NR8n4U#kZ{|4VW{cJK>u-@nR6^W%c8&O zGQJUxQ$#MD`w%p{sKukAYls&}j57OoU`up?w5zqh1>wA0RZA1)Ssr11qf z8}kH)yi;L0O@pvKP4#c{3*QyhxT>T+VsYKc>FF9ZE)?$|h#V;J7o~@O43qKLK^$}0 zM9Utj>9pQdXG+q*`V*jK!nrMK&!dM(%F{sj=vY6WFxN^OCtsvuSI?K{IeK0-!CHdP z_NeZ}gD>Nq@FPkrMve`W)Gl6GlZ$q_X@$S)2prI$s?K@_Jlk{5KcM=7Z}IewUyx}o zYHNFBe(95L$llusBJ7YdELxM6Vr0zRRiy6g+_ALrFS{gQE?ydfmJB*&%P`bhwZj;m zPuJ0(EjZDRDqE`?48+{>guktB1%vG!X;qTxNcp|F5zW#VGkW_&wEmk5$q0^i%}2sr z5Ue)4Skqu={_BaLMD)CQ^S+HTId9ywwfpNmT|(zPa~gV{EI@9DXMDI!8g3h?|BV0R z%RH+v-G|r6-Sj?W=GWmj5=M9u?f(zvCw*J@SlmDuUD6_AV4d<{fRs$2i@A zaU=zNt;=5@$BI;$a$M5j*Uh^oa|Y545xQ>N7qcz9BVo-Ag=Tg5YU%n=BJ!g@ZJFux z4%Nj)l57G@?~kQC=T&ggf+PNWhXK3axBFqg1*>%~SEii3Nk+9Nn#>lJ?zl~Z_v;6# zHl9zbj-oB(guSteUwT0a3+Gc$q6Ul4s35!8l;K7B25BW2X%geD^ z)|xNA)=;N-CEfM;k9nA)|4_`JB8V05p7*UXR^&Y1-OTvlVBS6r#*Ltzo|%x%-7$`_ zd`oAZ@`M(MxjJ_@^K$hD;e2vogrK&f|rC#QhrXTf&4woheJ*q4z~ch9zWh0_^5CPe*vZ3 zJddo!0yt-zahpP5By}{)o2Fx62Jr-z3^%@_;8Q1A_hO_lZSm-YQCo zd%N5VSiPYT<^!#@l~lNY(9Il(5e$^waPqvuyb|}mO;Nc;*_!$H_-}WAu&ww4nHK@} z?-uu5CvtColScx_!P^u8_dMVWW^Vj}S>luL7WK{HF<#_gE%y#+m2k(8hFe4ZYnxIw zTeF(pAfjr%n#mNwaBjbHW9zAVp#^n^E2i}x=WTOOH@w{6zv11+^)G0{1S_7V=rmgW zHQUjsNH~%pE-HHYvfQNaL8F#qU7kti%g&xG#8ol|=_R+5da54SZr0wtpg1{uv;{_7 zoLiZdvmAQBqk=*~D}i~vy}eTLof%eER%hjGMi!(>lvn_JoY;w>99xBMUArgTPpCbM zLDqSQd{Y0t&SrL_*@(=J$~*S`3FtU`1vHY{d1~%{ufhVAF@* zP1MO!_geL4Hc|^Y22kX39tB>jrqt)w&D_L^t*|hcL6<#or~bX`nYJBCMOUd)z*VC9 z@^0Ck-yk>{SdBCMn`In^uFZbEP9b*%^C~#>JDnc-_&SAyTL!$6aqCTQaLV_kjRrd- z0KL?l#lqhHx{tTrx}>b^C&vMQ$V+lR0hEo#wsB1-Sv{T>pI6#qy?Ab@Tph5L%xZlI zO#?Ri^XKXQ_?R3*m5-RkY${c1uA^u(ehxqy_Je`bUge!_cGQ03zePPo`L_JG=z_(K0Oqhx z&uzY`oS2cp%^>jupf~zhQ2D`I%4eNpAnz(+?linCtFGQ^(ayd~u4ot~I4@_lI#igJ z%?E$r4)&E3a$8-I;f8QR- z*b;v>1|^29wHeMj{_xn&N!oH5cjRTiC-IUX+275RVN_i1JuP7SWJJMRNEj$_XAX(=ljj>PWn&)-RuBY;GSm@Bk+0T)4w$e@Ue^W)uDicN@( zC%F_acTc9V)_B(W&1uiS>CzN+hp3AN)+iLMvM^M@>5{zX-G7yP=Pt;v`rY!jdpy-7 z_Ro~~S~+!aZCD6%R3K8q}>LsO~i01jUiH0(&uCHiR_j zuqj+pW}+ws2J!B!aC6EnM{&?BmIiVoxWmJS7AP~)b}hwc+;csh5zr8ZVB7E#SsVYh z?4CR8L=l{uSnKTW;4=)I6`@AhiV{LKgp`-J-PaF!vo(Ldk1=&eE9FM~JwCQV;n>sQ ziv-%Agv%9sx$Mb+s6S}-fC7aQpvkzpyUU*{0jS~!wYe?Q?@dg0ot&RZVH@CwSwxcc z0VjPScM>Szp&&{=(-$(;j`tlTwmy`n%umP0r++!d^hkTBb4_t6Sy@d9V=%+S`g)~@ z#zJxQx#`3g%GP=MK6XeI!2H^BGQ1MS9vU0VA3x?+CZGktn(qxk(-NPpGGH8s(4GJg zA6tb1d|J@yrcmDVo9aHarJj+lfEQZ8y;r$XQc`k!h3vIE=7){ebI>o!LEL@?R>I_@ zMWgMs7rdcS?Km`F`ZUSJ&V7u**p zm|8GVJt&dG*%3G1(*2x;A%p59?*g?1?b#fl#8b_*ysLH!jt?&3vPn+B1>gwM*^%;D zbnW|>8U1}a@RQG{?T2DXUgf=5J>6uObN!F^K>$xGe#o-!`t$*@k!$s8rkT9Q2zqTC zsQ6%(=a6x^`k>&@*OwksNhAS6g`{66?rRnT2<1%w4JXXLR3lqBQwx!z0Ye=CU(5A7YETVh zR|4%ZLiBRY7*nj-8Xj{|e8RM!e)?HWUFD9x_9AvkW=KDOdUjFQv{~`+Cf^5_)o$qe zl;zaqGj=w1_A$KsT&@)y;NLR68`%R0olR+jsJ%)~dEi0lYHd{js{ceO8whOJnM*u0 zeZ)AKaX^+JZlubr)(HlFn4I0HOH2fqiNqmygAuNHS@)e065;0z|Dn-32bPhA633fAT5!A{m`VrG+0Z2JsA3?L<; zh@HD9Ok)HikXZkzS0zXr8*77tMXo+<P^Q*BM^W-t+YJER$^rY>~STf`SW^Y^w1oCYQRUz!}dnv!eC-= zfL00%53n)$j!kBR$Q4k(DWpubT}+yEqekcwaRPKDX~5Gx8>54giEsV=K)0++vjhxi zpdsgFR|FkzLgJo0{`a=y{N~owLatRaz(_~y>F%h}=d?J=a<%+&t=-e=)8xvLo1?>^ z_tV7kbgA9gBhc$Xk!hv;EVbU^{^C+}>G`>qGUPW3AQ^gtEFe7qSsn5 zP Date: Mon, 26 Oct 2026 12:08:57 +0000 Subject: [PATCH 30/48] * refresh the application screenshot --- screenshots/main-window.png | Bin 65657 -> 66758 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/screenshots/main-window.png b/screenshots/main-window.png index e3795c0d04a8041389e0aaa3edc8cc5c89e36820..a6de9fe48d17b5ab50eb5c6153d5031f1bfaeee0 100644 GIT binary patch literal 66758 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
EWhA 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

J-t(C?D*vNbSd$Mpldw%6G^3`$t6)P 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 O*JNyHeySLKDeAvN*8HCU From 96c958066cd43cde72ea68e0e1b49470cca60c28 Mon Sep 17 00:00:00 2001 From: Hawkynt Date: Mon, 26 Oct 2026 13:09:17 +0100 Subject: [PATCH 31/48] * regenerate references --- Hawkynt.FileFormats.Archives/README.md | 2 +- docs/catalogue/GAPS.md | 4 ++-- docs/catalogue/reference-formats.csv | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Hawkynt.FileFormats.Archives/README.md b/Hawkynt.FileFormats.Archives/README.md index ecffe1596..dde83f168 100644 --- a/Hawkynt.FileFormats.Archives/README.md +++ b/Hawkynt.FileFormats.Archives/README.md @@ -544,7 +544,7 @@ Use it when a .NET process needs to enumerate, extract, test, create, edit or in -Every public and protected member of all 2571 types, generated from the built assembly and its XML documentation, is in [REFERENCE.md](https://github.com/Hawkynt/CompressionWorkbench/blob/main/Hawkynt.FileFormats.Archives/REFERENCE.md). +Every public and protected member of all 2573 types, generated from the built assembly and its XML documentation, is in [REFERENCE.md](https://github.com/Hawkynt/CompressionWorkbench/blob/main/Hawkynt.FileFormats.Archives/REFERENCE.md). diff --git a/docs/catalogue/GAPS.md b/docs/catalogue/GAPS.md index 0fab02afa..15943701e 100644 --- a/docs/catalogue/GAPS.md +++ b/docs/catalogue/GAPS.md @@ -24,8 +24,8 @@ exists. It warns when a capability letter has drifted from the live descriptor. | Gap type | Rows | Meaning | | --- | ---: | --- | | `MISSING` | 240 | a source lists it; no descriptor or building block covers it | -| `READ-ONLY-BUT-SOURCES-WRITE` | 20 | we only read it; a source or the format's own tool writes it | -| `PARTIAL` | 41 | covered, but the reader handles only part of the format (see the table below) | +| `READ-ONLY-BUT-SOURCES-WRITE` | 21 | we only read it; a source or the format's own tool writes it | +| `PARTIAL` | 40 | covered, but the reader handles only part of the format (see the table below) | | `OK` | 224 | covered with no known gap against what the sources list | | `OURS-ONLY` | 458 | in our registry, listed by none of the seven sources | diff --git a/docs/catalogue/reference-formats.csv b/docs/catalogue/reference-formats.csv index 6b9be514c..542752c4f 100644 --- a/docs/catalogue/reference-formats.csv +++ b/docs/catalogue/reference-formats.csv @@ -211,7 +211,7 @@ AppleSingle / AppleDouble,as;adouble,encoding,,,R,,,fmt/967;fmt/968,,2,https://w Intel HEX,hex;ihex,firmware,R,,,,,,,1,https://en.wikipedia.org/wiki/Intel_HEX,IntelHex,Y,Y,Y,OK,, Motorola S-record,srec;s19;mot,firmware,,,,R,,,,1,https://en.wikipedia.org/wiki/SREC_(file_format),Srec,Y,Y,,OK,, NSIS installer,exe;nsis,installer,R,,R,,R,,,3,https://nsis.sourceforge.io/,Nsis,Y,,,READ-ONLY-BUT-SOURCES-WRITE,makensis,LZMA behind the x86 branch filter refused; uninstaller payload not listed (NsisReader.cs) -Inno Setup,exe,installer,,,,,R,,,1,https://jrsoftware.org/isinfo.php,InnoSetup,Y,,,READ-ONLY-BUT-SOURCES-WRITE,ISCC,"encrypted files and 16-bit 1.2.x refused (InnoSetupReader.cs)" +Inno Setup,exe,installer,,,,,R,,,1,https://jrsoftware.org/isinfo.php,InnoSetup,Y,,,READ-ONLY-BUT-SOURCES-WRITE,ISCC,encrypted files and 16-bit 1.2.x refused (InnoSetupReader.cs) InstallShield (cab / exe),exe;cab;ex_;hdr,installer,,,,,R,fmt/1466,,2,,,,,,MISSING,, Wise Installer,exe,installer,,,,,R,,,1,,,,,,MISSING,, Setup Factory,exe,installer,,,,,R,,,1,,,,,,MISSING,, From 61af4a1bafa8213448cbe8f17ce173cadcdea380 Mon Sep 17 00:00:00 2001 From: Hawkynt Date: Mon, 26 Oct 2026 13:09:21 +0100 Subject: [PATCH 32/48] * ZPAQ: real journaling/streaming format, zpaq 7.15 reads what we write Symptom: Zpaq claimed create and modify, but its writer emitted a private layout ("zPQ" + level + 'c'/'d'/'h' with raw FILETIME/name/size records and the data verbatim) that zpaq rejects, and its reader only understood that layout: every archive written by zpaq itself (any method) failed to extract. Root cause: there was no ZPAQL engine at all. The old ZpaqlVm/ZpaqRangeCoder were a homebrew model that does not follow the Level 2 specification, so neither the block format nor the journaling layer on top of it could be real. Fix: convert libzpaq/zpaq 7.15 (Matt Mahoney, public domain) into the FileFormat.Zpaq namespace: - ZPAQL interpreter, predictor (CONS/CM/ICM/MATCH/AVG/MIX2/MIX/ISSE/SSE), arithmetic coder, PCOMP post-processor, block/segment decompresser, ZPAQL compiler and compressor; - method strings 0..5 and explicit x methods (makeConfig/compressBlock), the LZ77 (packed and byte-aligned, hash and suffix-array match finders), BWT and E8E9 preprocessors; suffix arrays come from an own SA-IS implementation instead of the MIT libdivsufsort section; - ZpaqReader: journaling archives (c/d/h/i blocks, versions, deletions, deduplicated fragments with SHA-1 verification) and the streaming layout; encrypted archives are refused; - ZpaqWriter: one journaling transaction exactly as Jidac::add lays it out (content-defined fragments, dedup, block packing, per-block method choice). The private layout is removed without backward compatibility. BB_Zpaq now emits a real ZPAQ stream (method 4) and decodes any ZPAQ stream. Verification: zpaq 7.15 lists and extracts byte for byte what we write at methods 0-5, 14, 36 and explicit x methods; we read zpaq's archives at every method, with three versions (update + deletion), dedup and the streaming layout; and with the same input our d blocks equal zpaq 7.15's byte for byte (transaction date masked). Reference archives written by zpaq64.exe 7.15 are embedded with a SHA-256 manifest; the live checks become a hard CI gate on the Linux leg (apt zpaq). Sourcing: rung 1 (public-domain reference implementation converted, notice in THIRD-PARTY-NOTICE.libzpaq.txt); tables and generated ZPAQL copied exactly. --- .github/workflows/ci.yml | 16 + .../BuildingBlocks/ZpaqBuildingBlockTests.cs | 2 +- Compression.Tests/Compression.Tests.csproj | 4 + .../Zpaq/ReferenceVectors/README.md | 19 + .../Zpaq/ReferenceVectors/manifest.tsv | 52 + .../Zpaq/ReferenceVectors/mkfixtures.py | 113 ++ .../Zpaq/ReferenceVectors/set.m0.zpaq | Bin 0 -> 57848 bytes .../Zpaq/ReferenceVectors/set.m1.zpaq | Bin 0 -> 24611 bytes .../Zpaq/ReferenceVectors/set.m2.zpaq | Bin 0 -> 23493 bytes .../Zpaq/ReferenceVectors/set.m3.zpaq | Bin 0 -> 19763 bytes .../Zpaq/ReferenceVectors/set.m4.zpaq | Bin 0 -> 17313 bytes .../Zpaq/ReferenceVectors/set.m5.zpaq | Bin 0 -> 16473 bytes .../Zpaq/ReferenceVectors/stream.zpaq | Bin 0 -> 4333 bytes .../Zpaq/ReferenceVectors/versions.zpaq | Bin 0 -> 13179 bytes Compression.Tests/Zpaq/ZpaqEngineTests.cs | 128 +++ .../Zpaq/ZpaqExternalOracleTests.cs | 252 +++++ Compression.Tests/Zpaq/ZpaqRangeCoderTests.cs | 223 ---- .../Zpaq/ZpaqReferenceVectorTests.cs | 111 ++ Compression.Tests/Zpaq/ZpaqTests.cs | 628 ++++------- .../THIRD-PARTY-NOTICE.libzpaq.txt | 67 ++ .../FileFormat.Zpaq/ZpaqBuildingBlock.cs | 241 +---- .../FileFormats/FileFormat.Zpaq/ZpaqCoder.cs | 271 +++++ .../FileFormat.Zpaq/ZpaqCompiler.cs | 331 ++++++ .../FileFormat.Zpaq/ZpaqCompressor.cs | 103 ++ .../FileFormat.Zpaq/ZpaqConstants.cs | 62 -- .../FileFormat.Zpaq/ZpaqDecompresser.cs | 156 +++ .../FileFormats/FileFormat.Zpaq/ZpaqEntry.cs | 67 +- .../FileFormat.Zpaq/ZpaqFormatDescriptor.cs | 211 ++-- .../FileFormats/FileFormat.Zpaq/ZpaqIo.cs | 186 ++++ .../FileFormat.Zpaq/ZpaqLzBuffer.cs | 351 +++++++ .../FileFormat.Zpaq/ZpaqMethods.cs | 827 +++++++++++++++ .../FileFormat.Zpaq/ZpaqPredictor.cs | 398 +++++++ .../FileFormat.Zpaq/ZpaqRangeCoder.cs | 232 ----- .../FileFormats/FileFormat.Zpaq/ZpaqReader.cs | 981 +++++++++--------- .../FileFormat.Zpaq/ZpaqSuffixArray.cs | 146 +++ .../FileFormats/FileFormat.Zpaq/ZpaqTables.cs | 301 ++++++ .../FileFormats/FileFormat.Zpaq/ZpaqWriter.cs | 540 ++++++---- .../FileFormat.Zpaq/ZpaqlMachine.cs | 462 +++++++++ .../FileFormats/FileFormat.Zpaq/ZpaqlVm.cs | 960 ----------------- Hawkynt.FileFormats.Archives/README.md | 4 +- Hawkynt.FileFormats.Archives/REFERENCE.md | 187 +--- docs/catalogue/GAPS.md | 6 +- docs/catalogue/reference-formats.csv | 2 +- 43 files changed, 5537 insertions(+), 3103 deletions(-) create mode 100644 Compression.Tests/Zpaq/ReferenceVectors/README.md create mode 100644 Compression.Tests/Zpaq/ReferenceVectors/manifest.tsv create mode 100644 Compression.Tests/Zpaq/ReferenceVectors/mkfixtures.py create mode 100644 Compression.Tests/Zpaq/ReferenceVectors/set.m0.zpaq create mode 100644 Compression.Tests/Zpaq/ReferenceVectors/set.m1.zpaq create mode 100644 Compression.Tests/Zpaq/ReferenceVectors/set.m2.zpaq create mode 100644 Compression.Tests/Zpaq/ReferenceVectors/set.m3.zpaq create mode 100644 Compression.Tests/Zpaq/ReferenceVectors/set.m4.zpaq create mode 100644 Compression.Tests/Zpaq/ReferenceVectors/set.m5.zpaq create mode 100644 Compression.Tests/Zpaq/ReferenceVectors/stream.zpaq create mode 100644 Compression.Tests/Zpaq/ReferenceVectors/versions.zpaq create mode 100644 Compression.Tests/Zpaq/ZpaqEngineTests.cs create mode 100644 Compression.Tests/Zpaq/ZpaqExternalOracleTests.cs delete mode 100644 Compression.Tests/Zpaq/ZpaqRangeCoderTests.cs create mode 100644 Compression.Tests/Zpaq/ZpaqReferenceVectorTests.cs create mode 100644 Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/THIRD-PARTY-NOTICE.libzpaq.txt create mode 100644 Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqCoder.cs create mode 100644 Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqCompiler.cs create mode 100644 Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqCompressor.cs delete mode 100644 Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqConstants.cs create mode 100644 Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqDecompresser.cs create mode 100644 Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqIo.cs create mode 100644 Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqLzBuffer.cs create mode 100644 Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqMethods.cs create mode 100644 Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqPredictor.cs delete mode 100644 Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqRangeCoder.cs create mode 100644 Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqSuffixArray.cs create mode 100644 Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqTables.cs create mode 100644 Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqlMachine.cs delete mode 100644 Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqlVm.cs diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 60a0a65df..584f1db49 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -174,6 +174,9 @@ jobs: # reiser4progs owns Reiser4: fsck.reiser4 and debugfs.reiser4 judge every volume the # Reiser4 writer creates or edits, in the gate below. sudo apt-get install -y reiser4progs + # zpaq (7.15) owns ZPAQ: it must list and extract what the ZPAQ writer produces, and the + # reader must decode every method zpaq writes, in the gate below. + sudo apt-get install -y zpaq sudo apt-get install -y "linux-modules-extra-$(uname -r)" || true sudo modprobe gfs2 || true @@ -235,6 +238,19 @@ jobs: --filter "FullyQualifiedName~Compression.Tests.Reiser4.Reiser4ProfileExternalTests|FullyQualifiedName~Compression.Tests.Reiser4.Reiser4MutationExternalTests|FullyQualifiedName~Compression.Tests.Reiser4.Reiser4NativeTreeExternalTests" --logger "trx;LogFileName=reiser4-oracle-tests.trx" + # Hard gate, both directions: zpaq must list and extract byte for byte what the ZPAQ writer + # produces (every method), the reader must decode what zpaq writes (every method, versions, + # deduplication, streaming), and our compressed data blocks must equal zpaq 7.15's. + - name: ZPAQ oracle + if: matrix.os == 'ubuntu-latest' + env: + CWB_REQUIRE_ZPAQ: "1" + run: > + dotnet test Compression.Tests + --configuration Release --no-build + --filter "FullyQualifiedName~Compression.Tests.Zpaq.ZpaqExternalOracleTests" + --logger "trx;LogFileName=zpaq-oracle-tests.trx" + # bcachefs-tools' own checker judges every volume this package writes or # edits: the allocation information, the usage totals and the namespace are # cross-examined against each other, and bucket generations against the diff --git a/Compression.Tests/BuildingBlocks/ZpaqBuildingBlockTests.cs b/Compression.Tests/BuildingBlocks/ZpaqBuildingBlockTests.cs index 0cf2dddf4..0ba39de84 100644 --- a/Compression.Tests/BuildingBlocks/ZpaqBuildingBlockTests.cs +++ b/Compression.Tests/BuildingBlocks/ZpaqBuildingBlockTests.cs @@ -33,7 +33,7 @@ public void RepeatedSentence_RoundTripsAndCompresses() { [Test, Category("HappyPath"), Category("RoundTrip")] public void HighlyRepetitive_RoundTripsAndCompresses() { - var data = new byte[256]; + var data = new byte[4096]; // large enough that the ~120-byte ZPAQ block header does not dominate Array.Fill(data, (byte)0x61); var compressed = Bb.Compress(data); var round = Bb.Decompress(compressed); diff --git a/Compression.Tests/Compression.Tests.csproj b/Compression.Tests/Compression.Tests.csproj index 743dde10c..12ff7c484 100644 --- a/Compression.Tests/Compression.Tests.csproj +++ b/Compression.Tests/Compression.Tests.csproj @@ -91,6 +91,10 @@ FreeArcVectors.%(Filename)%(Extension) + + + ZpaqVectors.%(Filename)%(Extension) + CvfVectors.%(Filename)%(Extension) diff --git a/Compression.Tests/Zpaq/ReferenceVectors/README.md b/Compression.Tests/Zpaq/ReferenceVectors/README.md new file mode 100644 index 000000000..3bec9b25a --- /dev/null +++ b/Compression.Tests/Zpaq/ReferenceVectors/README.md @@ -0,0 +1,19 @@ +# zpaq 7.15 reference archives + +Every `.zpaq` file here was written by the reference archiver **zpaq v7.15** (Matt Mahoney, +public domain), the Windows x64 build `zpaq64.exe` shipped in + ("compiled Aug 17 2016"), on 2026-10-19. + +`mkfixtures.py` (documentation, not a build input) generated the input files deterministically +and ran `zpaq64.exe a

[-method M]` in the work directory, so the stored names are +relative (`set/text.txt`). Only the archives and `manifest.tsv` are checked in: the manifest gives, +per archive and version, every name with its size and SHA-256 (size `-1` marks a directory). + +| File | Layout | How it was made | What it exercises | +|------|--------|-----------------|-------------------| +| `set.m0.zpaq` .. `set.m5.zpaq` | journaling | `a set.mN.zpaq set -method N` | every predefined method: 0 (dedup only), 1/2 (LZ77, packed codes, hash and suffix-array match finders), 3 (BWT or LZ77+CM), 4/5 (CM with ICM/ISSE chains, match model, mixers, SSE); E8E9 on `x86.bin`; `dup.txt` deduplicated against `text.txt`; an empty file; a subdirectory | +| `versions.zpaq` | journaling | three `a versions.zpaq v` runs: add `notes.txt`+`a.bin`; change `a.bin`, add `b.txt`; delete `notes.txt` | three transactions, an update, a deletion record, fragments shared across versions | +| `stream.zpaq` | streaming | `a stream.zpaq st -method s4.3ci1` | streaming layout (one block per file, filename and date in the segment header), BWT + order-0 ICM + order-1 ISSE | + +`zpaq64.exe l versions.zpaq -all` reports `3 versions, 6 files, 4 fragments`; `zpaq64.exe l +stream.zpaq` reports two files of unknown size (the streaming layout records none). diff --git a/Compression.Tests/Zpaq/ReferenceVectors/manifest.tsv b/Compression.Tests/Zpaq/ReferenceVectors/manifest.tsv new file mode 100644 index 000000000..fdacb6ab4 --- /dev/null +++ b/Compression.Tests/Zpaq/ReferenceVectors/manifest.tsv @@ -0,0 +1,52 @@ +# archive version name size sha256 (size -1 = directory) +set.m0.zpaq 1 set/dup.txt 20000 6d7dcfff654e4f0b73c9c6748e20101a654d91340e808028d9cce43314e176b6 +set.m0.zpaq 1 set/empty.dat 0 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 +set.m0.zpaq 1 set/random.bin 4096 3a370c921e1d689daae1f95c1bc8fd70c3a2294d9a602603866c88f1678133ed +set.m0.zpaq 1 set/sub/ -1 - +set.m0.zpaq 1 set/sub/table.bin 16384 c30bfd6c26ff4d6994184a48cfe912d634d84741a506a379a756a88d03ce17c8 +set.m0.zpaq 1 set/text.txt 20000 6d7dcfff654e4f0b73c9c6748e20101a654d91340e808028d9cce43314e176b6 +set.m0.zpaq 1 set/x86.bin 16384 f80aea167fd0f16c0e8c59c394b8316b5626494ce468e4ef358e9b32cd3c05d4 +set.m1.zpaq 1 set/dup.txt 20000 6d7dcfff654e4f0b73c9c6748e20101a654d91340e808028d9cce43314e176b6 +set.m1.zpaq 1 set/empty.dat 0 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 +set.m1.zpaq 1 set/random.bin 4096 3a370c921e1d689daae1f95c1bc8fd70c3a2294d9a602603866c88f1678133ed +set.m1.zpaq 1 set/sub/ -1 - +set.m1.zpaq 1 set/sub/table.bin 16384 c30bfd6c26ff4d6994184a48cfe912d634d84741a506a379a756a88d03ce17c8 +set.m1.zpaq 1 set/text.txt 20000 6d7dcfff654e4f0b73c9c6748e20101a654d91340e808028d9cce43314e176b6 +set.m1.zpaq 1 set/x86.bin 16384 f80aea167fd0f16c0e8c59c394b8316b5626494ce468e4ef358e9b32cd3c05d4 +set.m2.zpaq 1 set/dup.txt 20000 6d7dcfff654e4f0b73c9c6748e20101a654d91340e808028d9cce43314e176b6 +set.m2.zpaq 1 set/empty.dat 0 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 +set.m2.zpaq 1 set/random.bin 4096 3a370c921e1d689daae1f95c1bc8fd70c3a2294d9a602603866c88f1678133ed +set.m2.zpaq 1 set/sub/ -1 - +set.m2.zpaq 1 set/sub/table.bin 16384 c30bfd6c26ff4d6994184a48cfe912d634d84741a506a379a756a88d03ce17c8 +set.m2.zpaq 1 set/text.txt 20000 6d7dcfff654e4f0b73c9c6748e20101a654d91340e808028d9cce43314e176b6 +set.m2.zpaq 1 set/x86.bin 16384 f80aea167fd0f16c0e8c59c394b8316b5626494ce468e4ef358e9b32cd3c05d4 +set.m3.zpaq 1 set/dup.txt 20000 6d7dcfff654e4f0b73c9c6748e20101a654d91340e808028d9cce43314e176b6 +set.m3.zpaq 1 set/empty.dat 0 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 +set.m3.zpaq 1 set/random.bin 4096 3a370c921e1d689daae1f95c1bc8fd70c3a2294d9a602603866c88f1678133ed +set.m3.zpaq 1 set/sub/ -1 - +set.m3.zpaq 1 set/sub/table.bin 16384 c30bfd6c26ff4d6994184a48cfe912d634d84741a506a379a756a88d03ce17c8 +set.m3.zpaq 1 set/text.txt 20000 6d7dcfff654e4f0b73c9c6748e20101a654d91340e808028d9cce43314e176b6 +set.m3.zpaq 1 set/x86.bin 16384 f80aea167fd0f16c0e8c59c394b8316b5626494ce468e4ef358e9b32cd3c05d4 +set.m4.zpaq 1 set/dup.txt 20000 6d7dcfff654e4f0b73c9c6748e20101a654d91340e808028d9cce43314e176b6 +set.m4.zpaq 1 set/empty.dat 0 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 +set.m4.zpaq 1 set/random.bin 4096 3a370c921e1d689daae1f95c1bc8fd70c3a2294d9a602603866c88f1678133ed +set.m4.zpaq 1 set/sub/ -1 - +set.m4.zpaq 1 set/sub/table.bin 16384 c30bfd6c26ff4d6994184a48cfe912d634d84741a506a379a756a88d03ce17c8 +set.m4.zpaq 1 set/text.txt 20000 6d7dcfff654e4f0b73c9c6748e20101a654d91340e808028d9cce43314e176b6 +set.m4.zpaq 1 set/x86.bin 16384 f80aea167fd0f16c0e8c59c394b8316b5626494ce468e4ef358e9b32cd3c05d4 +set.m5.zpaq 1 set/dup.txt 20000 6d7dcfff654e4f0b73c9c6748e20101a654d91340e808028d9cce43314e176b6 +set.m5.zpaq 1 set/empty.dat 0 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 +set.m5.zpaq 1 set/random.bin 4096 3a370c921e1d689daae1f95c1bc8fd70c3a2294d9a602603866c88f1678133ed +set.m5.zpaq 1 set/sub/ -1 - +set.m5.zpaq 1 set/sub/table.bin 16384 c30bfd6c26ff4d6994184a48cfe912d634d84741a506a379a756a88d03ce17c8 +set.m5.zpaq 1 set/text.txt 20000 6d7dcfff654e4f0b73c9c6748e20101a654d91340e808028d9cce43314e176b6 +set.m5.zpaq 1 set/x86.bin 16384 f80aea167fd0f16c0e8c59c394b8316b5626494ce468e4ef358e9b32cd3c05d4 +versions.zpaq 1 v/a.bin 3000 e17a27da77a519cad73adb40b725139379c057af5023170700519facc6e378e7 +versions.zpaq 1 v/notes.txt 6000 76c3dcfd3f6bd471dcbd9d27638a1663c5d1d0342dc1d3733d30e475922f7eff +versions.zpaq 2 v/a.bin 3000 eaf76ffcb88a0e9add0d967f5c7c7f1918ac1c087fbf90c0c73030328d11684b +versions.zpaq 2 v/b.txt 5000 09baec6ca8b2af5f64ce5cd913b5172d83008bc0d418dafe44b9f0f14264a121 +versions.zpaq 2 v/notes.txt 6000 76c3dcfd3f6bd471dcbd9d27638a1663c5d1d0342dc1d3733d30e475922f7eff +versions.zpaq 3 v/a.bin 3000 eaf76ffcb88a0e9add0d967f5c7c7f1918ac1c087fbf90c0c73030328d11684b +versions.zpaq 3 v/b.txt 5000 09baec6ca8b2af5f64ce5cd913b5172d83008bc0d418dafe44b9f0f14264a121 +stream.zpaq 1 st/one.txt 9000 fe0aff6997ba887be6c6d568be054f5600765c45a0ff3762a7c39f2d34a9f56a +stream.zpaq 1 st/two.bin 7000 46f2d7bf41d57c5c516fad8b79c3630e264e86d8a43f22dae0dac6db793e87ba diff --git a/Compression.Tests/Zpaq/ReferenceVectors/mkfixtures.py b/Compression.Tests/Zpaq/ReferenceVectors/mkfixtures.py new file mode 100644 index 000000000..c12db07f0 --- /dev/null +++ b/Compression.Tests/Zpaq/ReferenceVectors/mkfixtures.py @@ -0,0 +1,113 @@ +"""Builds the zpaq 7.15 reference archives for Compression.Tests/Zpaq/ReferenceVectors. + +Usage: python -I mkfixtures.py +The inputs are generated deterministically here; only the archives and a manifest +(name, size, SHA-256 per version) are checked in. +""" +import hashlib, os, shutil, subprocess, sys + +zpaq, work, out = sys.argv[1], sys.argv[2], sys.argv[3] + +class Lcg: + def __init__(self, seed): self.s = seed & 0xffffffff + def next(self): + self.s = (self.s * 1103515245 + 12345) & 0xffffffff + return self.s >> 16 + +WORDS = ("the of and to in is that for it as with was on be by at this which from or an are " + "archive journal fragment block version compress model context mixer predictor stream " + "zpaq level method index header data file directory size date hash checksum").split() + +def text(n, seed): + r = Lcg(seed); b = bytearray() + while len(b) < n: + w = WORDS[r.next() % len(WORDS)] + b += w.encode() + k = r.next() % 16 + b += b'.\n' if k == 0 else (b', ' if k == 1 else b' ') + return bytes(b[:n]) + +def rand(n, seed): + r = Lcg(seed); return bytes(r.next() & 255 for _ in range(n)) + +def x86(n, seed): + r = Lcg(seed); b = bytearray() + while len(b) < n: + k = r.next() % 8 + if k == 0: b += bytes([0xE8, r.next() & 255, r.next() & 15, 0, 0]) + elif k == 1: b += bytes([0x8B, 0x45 + (r.next() & 7) * 8, r.next() & 0x7C]) + elif k == 2: b += bytes([0xE9, r.next() & 255, 0xFF, 0xFF, 0xFF]) + else: b += bytes([0x89, 0x44, 0x24, (r.next() & 15) * 4]) + return bytes(b[:n]) + +def table(n): + return bytes(((i * 7) ^ (i >> 4)) & 255 if i % 4 else (i >> 2) & 255 for i in range(n)) + +def write(root, name, data): + p = os.path.join(root, name) + os.makedirs(os.path.dirname(p), exist_ok=True) + with open(p, 'wb') as f: f.write(data) + +def run(*args, cwd): + r = subprocess.run([zpaq, *args], cwd=cwd, capture_output=True, text=True) + if r.returncode != 0: + raise SystemExit(f"zpaq {' '.join(args)} failed:\n{r.stdout}\n{r.stderr}") + +def manifest_of(root): + rows = [] + for dp, dns, fns in os.walk(root): + for d in dns: + rel = os.path.relpath(os.path.join(dp, d), os.path.dirname(root)).replace('\\', '/') + '/' + rows.append((rel, -1, '-')) + for f in fns: + p = os.path.join(dp, f) + rel = os.path.relpath(p, os.path.dirname(root)).replace('\\', '/') + data = open(p, 'rb').read() + rows.append((rel, len(data), hashlib.sha256(data).hexdigest())) + return sorted(rows) + +shutil.rmtree(work, ignore_errors=True); os.makedirs(work); os.makedirs(out, exist_ok=True) +lines = ["# archive\tversion\tname\tsize\tsha256 (size -1 = directory)"] + +# One file set, every predefined method. +s = os.path.join(work, 'set') +t = text(20000, 1) +write(s, 'text.txt', t) +write(s, 'dup.txt', t) # deduplicated against text.txt +write(s, 'x86.bin', x86(16384, 2)) +write(s, 'random.bin', rand(4096, 3)) +write(s, 'empty.dat', b'') +write(s, 'sub/table.bin', table(16384)) +setrows = manifest_of(s) +for m in range(6): + name = f'set.m{m}.zpaq' + run('a', name, 'set', '-method', str(m), cwd=work) + shutil.copy(os.path.join(work, name), out) + lines += [f"{name}\t1\t{n}\t{z}\t{h}" for n, z, h in setrows] + +# Three versions: add, modify + add, delete. +v = os.path.join(work, 'v') +write(v, 'notes.txt', text(6000, 4)) +write(v, 'a.bin', rand(3000, 5)) +lines += [f"versions.zpaq\t1\t{n}\t{z}\t{h}" for n, z, h in manifest_of(v)] +run('a', 'versions.zpaq', 'v', cwd=work) +write(v, 'a.bin', rand(3000, 6)) +write(v, 'b.txt', text(5000, 7)) +lines += [f"versions.zpaq\t2\t{n}\t{z}\t{h}" for n, z, h in manifest_of(v)] +run('a', 'versions.zpaq', 'v', cwd=work) +os.remove(os.path.join(v, 'notes.txt')) +lines += [f"versions.zpaq\t3\t{n}\t{z}\t{h}" for n, z, h in manifest_of(v)] +run('a', 'versions.zpaq', 'v', cwd=work) +shutil.copy(os.path.join(work, 'versions.zpaq'), out) + +# Streaming layout (method s...): BWT + order-0/1 CM, one block per file. +st = os.path.join(work, 'st') +write(st, 'one.txt', text(9000, 8)) +write(st, 'two.bin', x86(7000, 9)) +run('a', 'stream.zpaq', 'st', '-method', 's4.3ci1', cwd=work) +shutil.copy(os.path.join(work, 'stream.zpaq'), out) +lines += [f"stream.zpaq\t1\t{n}\t{z}\t{h}" for n, z, h in manifest_of(st) if z >= 0] + +with open(os.path.join(out, 'manifest.tsv'), 'w', newline='\n') as f: + f.write('\n'.join(lines) + '\n') +print('ok') diff --git a/Compression.Tests/Zpaq/ReferenceVectors/set.m0.zpaq b/Compression.Tests/Zpaq/ReferenceVectors/set.m0.zpaq new file mode 100644 index 0000000000000000000000000000000000000000..31fa6539c3688bd91fc525d94f85e23beb7f3561 GIT binary patch literal 57848 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 literal 0 HcmV?d00001 diff --git a/Compression.Tests/Zpaq/ReferenceVectors/set.m1.zpaq b/Compression.Tests/Zpaq/ReferenceVectors/set.m1.zpaq new file mode 100644 index 0000000000000000000000000000000000000000..6df68c7e8cef4ae0a51ff887744a1c5666cc31ba GIT binary patch literal 24611 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 literal 0 HcmV?d00001 diff --git a/Compression.Tests/Zpaq/ReferenceVectors/set.m2.zpaq b/Compression.Tests/Zpaq/ReferenceVectors/set.m2.zpaq new file mode 100644 index 0000000000000000000000000000000000000000..1d7a3cf4054281d8b9e26bbb15cdcb6cc127b9d6 GIT binary patch literal 23493 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 literal 0 HcmV?d00001 diff --git a/Compression.Tests/Zpaq/ReferenceVectors/set.m3.zpaq b/Compression.Tests/Zpaq/ReferenceVectors/set.m3.zpaq new file mode 100644 index 0000000000000000000000000000000000000000..7e1c441dc7c678c1ff49e8e7bb497259c2cd9f25 GIT binary patch literal 19763 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 literal 0 HcmV?d00001 diff --git a/Compression.Tests/Zpaq/ReferenceVectors/set.m5.zpaq b/Compression.Tests/Zpaq/ReferenceVectors/set.m5.zpaq new file mode 100644 index 0000000000000000000000000000000000000000..74ba0d2aa5a61f7c1c45fd432ac3944ae991b010 GIT binary patch literal 16473 zcmaL81CSC%-l@etpA1y)BhaI04}0` zYT$pFLIZ&O|I-No_-vBinT>du@N36XFhs9tfWyX^V*lp+e_RI${02ZH0RWhw2v7(B z5a@4Ea41+%C2q*+dC#kdeUV zbua{BGX(v&{bvI0@c*&@GlP{#!TRTF2*)N;1LTu|7UMI7`|kh%Ts z{WJP6=sy_Je`Ba@GGNnC!P8I zFTrZJKClV$cvadT@{k2IoN7C)HE>(D7Zlb*x#?~5Sx5w%A_$XP17xP=@( z+TV+~(8R22TfY@J4)@I9@h*kRJu0ImkyY)|5UeRlyAPLZ%51efJk~=vRifi}hnv3# z?odipU`2!u_Q@Mloe)~>NM)7s5=4utij>u=>u;^?D+loO3bXIy^*BEm2`d8SA-*Zv z25wejcJt0qYc;NH_|)I@yG~;xM?{Hojvt2M@Lp#UMew82%x;w`4Nhh&9HHG4pj6~O z?e7W)2u(w8=nF@Yx3w;GHywvR@j%UNWm!gQs#1t3ey29Sy3Jy=Hd5>HC&y9#T{Mx< zPMW+;s1U)i4s(I&Pc%1~&$9_E2CHr<`brNjaF63FKFAofIU6EySvJs4#P-A|N zkhunTr@a2AWWl%$RUTmyL*1;u&T{YhQJg=OOm=w>KNkV0g=+7sxA$qB@hQl!c)iI{Q`H)WSIQYsl4l=663q5l@1N zmgtQ?wHe57XT;NSKE2yX!bl8R%1TPZu(B-GG5_{PfnOq`l&%3{yiBn*c5Cgv+*KG8 z>*6yofM-sBAms%ZdNbtugoPCNVeMR`B8n)HNHR*sfQjZ1iOi?e6#0JXRFdW$BB$4eTDpK~)9XHj*U!4o?BjCW5DEh&nc-?n&jD2gs{jlVJJtLb4YMb_3 zdNIGhgO(l6bR;%?hd65H>mQqbC4w8b2Ecyby+K=jS&S&bSuHnWV5l^WQ&6=F09+)i z$A26*GO9CEQ@-kdn?To%Y8Z07rUF@|iIQBaXup1KYh9mwWAuq-%=GF}n%Aoj(!z`( z<72s6P`^|}-PejxB@W2R6=6h0B`Y9=z^r_D#c9&e|GgagGe{xe{R*guOAE?&i0RKV z5ZCH^O@a)|1bkCu{{E#?@6x+gN=WHSU)pYTqhh+`8wk+b1;MJ2vM{PuU;=5`m?O|y zNsWXY`zV5vErwq(Uf|vJ9vqweHROtNC}eCgiP)C~pX#qFUYPif>=a zWEm&D4r5G7(5C>6nkEx}(@Tbpk16x0RC*Nwk$*kIVeZ|H_Gnmna5{buW)9g=xMByJ zZ?Qy+p2I8}Bfz@^#ZhU=pDRG-#%WT~qswzijtT(!Qz0p7X z$U2|6G`?Eh#POc+J8x$4VD|&END4>uWJ(SNpv_wsu6$|O#X%&7=?H79rI_ijTxdMc zk|TMKP1fS8?CZ7OVV_vU#&F*(x$1nsZ&4@CqO+EemW0i7E%zu?qoE3t3U~X)5@0}9 z!FI9+A{g7+M+d`w5Ot@am6um+PWB=S0BX|;s%N|xqP%}$W?6yMAj!CA^W1~S&)7JP^DkU@r~Dnkwliu} z_6yQMO7h?lig8Cc`Db1!{*~!T%E~&}H629->Aolk(+RqOaFS6q?V4bbk(-1*z=TS; zsk&epKUy>L@@-F;>91LTWX`ipS~Jd^?hf47lrnvyPqy6fEeckJ=N9z}q1I2l5Gmp< z6@qdY8e!qWa0^)Z4%SVed#hi}G3zp2_V1o+F)z7@4f*Ym?kW`OUBKDz%y;*9*j#z; z_T4<|u-fmkqOLr=L)non7!_?_z>$q>oJXLXq4Au)K12w(E9UMC5@9Wde*m!R?^Q5gD(s>}13I>Q1aJGe?x1)$gKIIWu?6tX`(;k@p48}GqbTpiHt z_0ejrP|a5iG{}Qp6N!js^P20-?e#H06`zJ_9IE9jY4W_^lsy@c($A7P49_)F3J7PZ znYHERU({VHqQ_n^2e_|OV5ggTes-K>FP22kbk08Gngd7sFo|La~S<(wfEN5Axe{yINrCzhps6F$R^x}!``)b zG571%Wp7}N@6gXkCTtB3&*02}4$-WR)5NQ}$zJ5LY*t)g0&d1tA!U5KMvJcwJdGD< zc_)ErC+!~RtOf+3l_Y;<4!B|;oKxd%i5=?y6z4C4bnX98#WySiQ&FcWw^Qv z<-TKV;aUvZ{?eK33#eM8;QF!~JoKv~4KbhTqO;=s=uKzRaNOYvs4Q2;gJfiO9bYXCv4@HqA17o$^UFngLoEYKl z^_6&4PA5SgkAow(leLBW;fNV_Tx^`4kb$Nu|L-A4{35D+DV5F+(WFpRI*Xhg$MM_%C1m-Z4Yp+ z-tHY|=s;J{n-jfz@~+n8p;mrWG7ibI)QwsOIZ z<$L6wpv~aKEiIgIrrZ*$`ho(D4D?5};B$f#RkmrqmVmFoLgMtawCJoWhEyY@@ZO?x zhG_8UWOA_{(cot{(*Unh-$10P=rui2X_MbVd1a_bvkbWD{T3fWa$#rTW9`GKKNxmH zQ?}5R7ppv=TGaTD9I%NyY~-|dKuv0;j=6s$b5c|vg4j#u=$**Yv#CZ{urxVK>o*uR zM6V}s{Y8rXP!g@d;>=+qQ;==13q&u$+>1I^f6mrB(|W)d@&%(F?^^wQ8=IfXNKksz z;O8R9D!xy!W0KmUQoy)BCCLxFb({SrVl+L}=dX{mwe(Jkqa zV9LCEWjGr~i*v2Y6f0y{jY7(Wk+adj>;YtnX!_LNymYRu~a*c6)Z%qfBlHYw+2UlA3$nDgR8(de^wh9!x&fM ze=mQZL9-PF)$-?NLXSwzz)nUQUzt`=kc6n~l$1YAon^%O z>V(=-1@5c#dcjPZdA2l(Mzw>f= zG&)F-#s4^0dV3zyJCSE&-fA9SC8&Aj=0(xmfl4_iU$X@;Kbi^vuuW1wA4-;uv?prx z&VeS3ah~sQD7Db;KI&4I<%2cUj5G!)$ePR7m1>`2M=iA6oxMN0V#ZCNpC}AU~=tq-}WBHlGJrqD|iEVr)OD8d?&t8Ea^CM-uo(-m{dl4*p*jckSy z)Yf^WBdYT1iYu6H0&^wl_O%?nj2`Gc8RZrDeB+yw7816NA=bkk@S7l1D`eJam5vMH z(S9e#P7|L6Ske{`&TvpG?+ET5xHDgC$xxhRW*x$P9sZ+G z;5>?N-KrwBTTi;mAB=y&bLv-3{*eX-PWW7)`m^tFcYWV8`_PBLrElz)2I6$HDH0nYrK! z9dCBt3lsM0;_j5M6R8;r_Bzq@97%DJ86Y~@E$6X}v<)$ry1}^hZC%~$mnO*r@l0TD z&mRl#&V3#p2X9b-zHk~FXMJt9QV=S^uTkQteoGxZFDf2aSVUAv=RXrgd*eGz(o#Q_ zx5<2mCgoxt<=4|rgwWQyoV=^pT?d}}b_XKRPku}qG)_dOSC}pEp><7~(;kbI=XB`j68&l-u3)+d{1EhJCclkdU-iKFg85ZI zopi0+wdshO?>tp|ui_oj?fe$!BUBt5Acbemy&~aD+|ZG;OLaHNeDs%v;?`dh{#nMn z-DfT|A|;_Gb1*!`=#@XN2T%1BKr!j92Z?Iii(T?a=c?C`CT%D}rZ!{sIOf2SWr#lH z@LIW8k?DL};A3u-!5qSeWbe85SNjetKY3BYT+L6D&EJzz)j_ykPSozb@$HZLO2hOA zInJ06uDsq1rj@ghuu1aP_ZX(8IYdKO8hhi$nkCwWqAo&zWf6ck&J|xmIguqCirdsR zl7xtrrIOBGF)KFwENfW{In3%t$1~-1~}9P5V^Y{ z-#Se=BhP@FtegEqLdQ#{oK;P4?%)+AF%VzgK=ysxtJOH zu<<-u_0jf3)?bCDhaltbOSbkCyKu2SV25j-!aKia+bITvf+n8Y5^?U)ELg?C(`~aa zHBXCKa}`5jOkc#e3B`F^hv{3~hZ+jUzzM-28}5$Z@-O{kWh$3TXXHf(c`7l(69ap0 z3;RempVu_lDC^90EGXKgs&&BFP0UqMW$Cl}xpljlM@49yhx?0m$B<^N>`r*hseQOs)~qE?uZ{Pr-g9{GL-iuO$2U*lug|j(r;bX&QOAYM zlEjF2zhLYo8>ZYZFel;VpTqE+Q_y_)-ALO36c1tB^{5s~bEkjyR_`Svtmpg1H#Bd zNAEJhD0yvQNYi|NUjpx)%%q9<0D3p(iM8~1atsZnh*>obERbF3gE zC{H?VH517>E*UbKu_hwosL`o<<>0rcQ8vF{qW3@UiClUw3>E#_AJ^`#4E$_yl$W!! z#otZ~r4a;$BQ)frcsO6?xw>Aa7AxZ^^ZjUYa+&IDvfJND^}cH88IK1sLNKCPb5OEG zXH!DD-;f6V3{NtB=7~FqtOrsq3@z=LihJxLK_vzo6p8^9Lf#YAP`jY~t2Rxvgd=QA zP(2~d7EhYy>4$;_6~(+I@qhM5PbU9fnqM8TEMq+|*Ej#9+mYBmvU+}o=&xmHGXE(m z2j`6;pN31%Cn4`WF|gTQ#h4Wbq%YKA!1CMeQ)v%K(V@n!^}Zv?wXSsS8Ym?_Cu5*a zRFx16J<;tV@c&`N^RY?lTcA^xQE|jM4oc)z^?C8Z&@HY zf-)BJ4@CO$Dw3ps%Toz#>126?81BresS5Apv3RNyi&(~Fagg+m=fso$;m&TH??7Gl z$P<`L+fOWBp;7DiL7!lg#;{uK>7rLWvz8VpSR_`)N};_(b}%j2SY*L;zr5xl>A2$` zo>{%|3M85%;j?Sx^sia(_OZT05W;;AJV^d>GqSMlz}C#&t&^RIRmq1h4V%*+Hb_u- zHQE_;x5!I0aDF8;)R20eu#)i!s zyP-sQnGH)FZ{ZQ+Wq}H7Q;$JxhH4wleQX@{$LfT`S3F(z<0d}e8>9TPE-ZHw%1Un{ z=S)&I2UR1cKfg<4V;^RYnko0WOL;0nYk2?_th7pCBf0fSs@n#P!XM*Kkb2sInO!dk zGQv89iCYs?%`zy3mnF-MM4gUi+UM$Hl)*-t;xkDAdirZei+oQviHK1(Jcy{bqr0His{+nw)t;BJJ< z!f zG7$OaNMf0D(FCIm)Y9DH#r~ziL3tT_)|`OX;Yqgzk!A7F!RM5@D%E!wMy-)(0rW3Z zu>HdkytBW!T;riMjjac46PCTr&0MG@`i5{d+JXs4Z}O^(Y36K$un3V&u&$~Z*y}|+RB)9h znKO>&+gzio5hHi&KWcyb{A6{g@buu`XKSA>z4^7n#`Ih$0}4OEDstLMh~1(O+u4qn z44Uxd1FN0Z>)O6MsTjoO1=913!Hpl?`ZosJZ;H78IygSy?$7m{?VX}lCzt`}V3d=Z z2BV?pF36youxr@%_zFHRltTua3Rbh0Ko3M)>zrl>I0~ARTGa3WqtqoQ!HSUFol5zW zlLM$iC+?*)*PcOue;#8gsuqx8+n0SRE~n*#@q75?D3p+-d`cH<^gXgyZ}D)$?h(#; zUU#UMN8tGMtbBx?j({s*3&|)b^3DQ@H_v0OIC))<{niSFobmy3uY}=;xkFyPi2>rN z2K$+x5N_eic=)E~qV<`agvHQscZOKk@cyExARMEFWQd?T?A0rw-vh!#er+{B&5FVB zqfi-4|ulMo*2W-X{2qEjgYElVV{u&ix4v(!3o1ufbQ04F=QJK4MKeRq`!R+ zxxc2cV{x|)SFfn`ux7G9V7LW!rP!-Ba<&&&t66hBu7~)aNrk{eTdUpR_^3exl;K|M zMGZQqd&op>dK#2!H|RtB)Se{xzkFxOwj*i6FHXn3YHn0&>}Y@o4}29?LF*X_A$$JeW-r@4Dm&$W;6~$n|0c^>(EKQryGCMvg}|U$HVP8ZZ_4?_%-VNSqV6Fr20c+G zM?YPi2K0YWjrlp~q452A+}B+4J8_-|VsgG4JEQCx(Z7NH+94&pIP0RU{M53P=YGYD zwa-U~4IwQ17thmc5Prvz;%sW`=-c!eIH?N@RrMaDQ-U(xR0nEVJ*^&Ah$i^@`vnQT zbZ~K(wO&t&5d00;%kWPHKJ|*W5{7Q5UzZ zUzoq(ojv6c_iNE`tnNtLdx{Z3!a03GtW+Lf_$uG4jOwl;w{^0#+qhW|BohUV6A|XBx$6;GI7H0gkIOYQ4mfk#`y7O2zAeANXI_0c zjcqwhj*jgE?AXO~>Nlkk6*w{8$2uQ1!s*KoYTZ?6Ns#Y|gCBQcqwzN%v@IE2J3%Y< zPIZoD`&sYAi##&dn<_5HUccuiPKQ!T(@F{1KW*0_Or{=6nTU;o?;BC>)JX$qN(IU> zrQr%~`DW+Mc4*KX%YI%;{yakvq`T<~){RMXu-WPLAYi;v7qVmyH8qE|N)Z*77UlG~ z;5&|XrTOi52Vpak6u=P05Sf)*avc>{Ylke#q=ZhdVR8k*o-9g7a_$%bbEiNK z5iyx?5-6=4`S|;!N752TCV-r_G(VI>`vBXC(q4nP(yQ!-!)!wmcb0FX9#*M0@ZZa` zVNm5=roZpX2^YpUQfBvuaYalU`l9yBs=Lsitua}DlOKs^*%oWyE0rPJe#@`^1Iq|H zLl||?xdbowuY$<;AC5z5Nn)2DXryTMko84Db26`H&z-YP^|T40pgw2=BiBLvi)1}2 zVw*pzc&*r~Bw(;wcH$AJa2Swh}~$8X(*u%PHx^Qx7g+L6KnJ^S5{V?4+>PMRlBic1wp z)Yn*)2%=?0z3OPKvlY~d(kf(6)6Q-*6$5gVdELSAS!455kMLerYL9!fgB=e~TH^%T zS84pAz+Mda-cgYBVRcENnwUn1kwS5`NQ?v7-B(9_g|)SqPp9wz8|1P)C17JqC*A+7 zO?rP_`OSOhf&bj7+*yf9jOQ1uSEgV6#ZIDZR;5a#kxrH}KE5qk^~=FnW-Y91tx*); z4?_bxrWi$u&3?UB4oFwJx|CY`@GyR~6 z%qHV?ysND29Oi~p7q7-Wb#+icX;xY~27RK)Ak(r$OJOjhg{c$Ex5a7lz&kXS;^M=W zRF!gkAA^_V4P%_E3er0}s;j0T4Ix3@Rc*r3kx!09dvDUJqOhfla=$P{O_vG=aq^|DDt)~wq`K@?LBLDZsT5Rlix{S064UH^_Q>a6qYA1XalU0+Yes8F z3nV#B{%U{)-wCD5m>n;0wVN(mXv-3(w1Z{bt8_~kD03&k%(=u$N9x!2)N4 zloNDsWD=eu2~j2KSU?FH?`75%ujb)0cY?3?ACIExLJLHTXS0bjxM`H&KC`LHX+PaZ#f&ai!lopT&(1ErRt& zEs&n(HW%x<`U4m4I0J)65C%r~a-e}QXB$h5gf~9oku9e1I1AOu?1`OEb&MlP^vSEu znMvh{slq`o{_gdiz9U)m?*6`n&YJmilQtPtkm_S4fxlSc9+DYNdHw>$v0W1k#zkB` zl`q5w*uODyM;#!nb8UD-v=8XpCTh=ZPWmewRRka*^B%YZi~67!;fy8X&4ayw&uzP+ z(TPdwaxI2jh#b_I0hivnZIY=>*O*4?U!3~mLsVZXz*A@IW%j;Fr~S2P4CHymo9~(?ojUForP{SS2U0jY3M19&y-a=W$}n2gS#eN1T*9 z3r1AV79Ob((h@orry=QB#|wUJy9J; z)+>wJz)^0(P#p>w#dAH<9&c|)s)+93DL=!=TmJn3rmPn*2JJMle}v4{DjrRU+qRb6nr8aV;8CQZDc%$T z&wGw4fIX#|H&)L&Ue71FWj&9ll`k?hFq5Ufm`O*`yF@j-thM{Rq#e>7R8wnu%8lI7 znJ3GLnx@POLt?vVbRx%|qn>$(r~)5Lxy?J=2C`FwHJw;PbP-%KI!_Xh%xqHNAI9ZB zz-}CUSx6C6A_RwMg)qmS4P`^7qi}84k?A$OxO&mW@J=@hS1C9*;m)wA_?$7oq zpfzlpnPxUaVq!v;U|cNs;I7;_KQ*M1Our+}CBIdNwR)K5^bonG8_t5W`3le3DT;C` zbdK4{D$C?{SeH?Ld<#f&#^&O^^G2F?=HE1M%jZYADbAtA%lEYVjoDz{DXpBJslaJ4 zNs`T+9{J(1o?rtiKSYTHwf>&YFEI2S-dP1nqp#rC)BSRK5uw&<<c@9`?SbH25+)@9MpjqMjZ-s&2FM zaneR!nHT8(jel7RHhlk3sqspYs**MiIPfoYFpUk&CZE5u{`bWWO5abrQ8vk*%(ExGD`c|)>otNPqnfy6s_hR!h7Y441UaFT?bt&Q@0C8OzwlL zhqasTa<8KE^wI;6<_KI;@Dtk6`9a%uuvhA=qb>6Rq(}EmpUN1s@C72^%bu=+s!^8| z$;?Y_>KW1Y5D3jC6FtE5?rzgSD{wsaJEx)cttrU>7^*Nq^ERd-)NWbC9!;9R9)7}? zD9(e{5uLLPeqpXbubYr-_NHDwE4M*hjP>kCx~c61$Nm{z7Q(IH&D;D~#d5hWMIH*5 z-%YjOYRCS!&$N%FkUcTCq<}1D8+eUW$UY}SR{!BL-xvo5`x1t`k$W@W-R;NWZS5v1 zInpW(S%n!Sy0E~O-WfuE=$FoEI~l3juUVDOKQ8kv2-y)oZT#o)b=8rGqU6Ux)*^OF zYQOm3xD6ZU0d6)(`0bl61j9mqEl|Uol?3u-)uxJ-@At3Z3-c~|fed-fImQ#URc3LF z?be!YbPTe3R&lqX4b79q$*~_Vu(5Ixm>pmSZ_5cQ^qjW0k^UXmmPpDy=NF_=+)Trq zUjP*H%L_0ziFmC#IR#eVG;pgXphbJLMLQ*N41?mjddPGL20DKvnCE64!iaX2SJm+O z7yP`q8gTMisr}*?)A4P3RJM`R7)oV>#X|o{Z!9Uc&2y!Oz`ufj@`q+IXnXdI0B6k`CSbU~$+*1)6c>1r`TzQ{&akt){ z^k&IGXVss=lgm0DS!b>e9~Iqu;c+o&9_mDm)ccJilz?#138hN&*?te4&Qvh2GSk~e5~_F?cbeOKJ}&GYz*Ee zk#BXd=s5-1KI{>00Ca&2szuzL!i4UN09-;0mVI$=TFpOz)+vpL1N285%@x_o*%W+i_wqjsONuz4hZ#Sp|4F{K$y(iK^=lM8>xCS5n%umCZV%T59I z8a$9DkOrTI%b25MNaXEVGd8{D=g{S{O__jssATDtn>+b&c_&|f$)-%cUABGP)nK&R z&6tHh*sE=qfwy#`&6-Kl0ezUn?^ncT+6%7-GplhP@SK~jqGRV3>A7NWYz_B45HWN5 z^H)2RX_3Ts?GGOB`a~G%u4DeM?I69athbD4bx~_28=K(~-WSdf zEoIXmk@wFL`$G`Xe08=F5}J6m{t(R9Cc?L8y4xS5KPy5icAKCK=}ZxDKF=%xW81^t zpO;huPgin0@zYG4cswZ^pPhhFoig?hv5@e;&sJj0N~GQ0F`0#ban)mBdMmCGSh_96 zi#!sw$kCTK zBMluA!WU;>kxRwbe9!at-}{iqsjn}jtdR|i-(SGa@#rp1+OqIv9X1!5EL`^$2X1JG zJDTTch+&~+O#|4 zdHY{&12Z+)-rLGk&c;3&hQ~{U`jw+as_2>J>d*ZJJNnkwA-WGg^AexNw5@;V7j8*Y zR52axBNOR~YafL3a1vAKowF1{8TI;Q^^ScfFcQ&T957_3uR)0KLqOH=%- zH*L3nbF)kOOFnKKQm0JsWOz2ld}K=r>m)P-A;A&N=)pYP{3<721GDMf_I>70Y@2+^ zHUrycNWh6D72Xdpy{dT z5eN45wFB_^zwf7SP4YbV8owSg)z|tt6Xjw$iKdWs2oQ;qzV8KNGm6)P%t6WCfb}*< z7jQz&1pEQ;3!goE2huhB0$?HG{B0?D=QMaJ5&ZFFBZ>TirB{Dvc-3>R;vK;Jk4{zj z!;4n6{eNMDH+viAcbc^@!dha!t!MPp)F*Cz|0KtOtI5N{!@8Y-WeFVTYfK`;|1}p* z7O9oz97{j8mWtkju_pM5e97YHr#M(WLEK2*zpLvDvCWudRzy<(4AXs@v1BfO0@q{1 z!SvYQoLl8WUF(gxkgTIm(H!4swdNud#}@PW#vOF+Zas=-~3`8`3YkpMX} zie&W{k5i<7P`OTt3HgTO>2HQYms4@mj(i6SnAu0{09O6IRa(j%Sm^BBO8!bUXkvX9 zUSxAE)>8XRH5};Dsu^hX&o9UEnVXbHp8S%SZ!3HcSCi!u?}AJH$1uG$7ahuMoPI$G z4C|(sN|A}O#n#s?*|%RQ@tP{mb=? zvXg`kpar)EvrL;Zr~9bM4{j1ZTSZT3ymFvDW*mQq69psYRL6Nw{UDSYU|fwlx)_{H z>Zozya%lkPg{J;)QNf0~0u>DzPSimqG#;MOev+T%g;>voIhKL#V@_1VJ)kd%ea@P7 zcYG*6A%a5Tk>j|&{zBUcol&9-gJsh zJuQ_%%$Skg)B$*f8Xwz)g;phtLT=2e+I_^br575O^j$l4vd02A3We zL(wOzIcJVm?2|xi;HS@i6ox*Wmg6wq1M5!+u0yRhqr!&9-Ytpy^7@`Zyu7ED7I7(k z7if7dA@N77Udn{_HBvj>G=ktX_MV_|*o4k#;=CrF9L*q|f1tR-m6n6NZkEGW2yq*d z->_?Zg76)_0jWM!a}_*Hj0}FG>-K5 z`l$SE^rqkf?Xa)H;DM6Ixxuo=J+j|Z)`Rx5BuDdb&zfk1Nj`DgQbr76B2=z*&H)93 zc-cEfVku6aNRI-{!z1=4Wu&m>CY?jBh%LnaD55n!dz&gD(bQR}8C5l+Cs5{Ld^6YmM#=b~HLJQu{E88_PUo;ko8CK3lqNJU2dC*riOyVNiH?p|&u z`Bup@_CHbXJ44!VGt*q)eo68U;=g%e>pCT!NsZ<67l&pFSz4wf*MG~NsxWS1WD1a$ zig%b3iec$JgnTEw&X$avA3q`pceqPX*qZKgj(y_=3yQ>SOVW!i7@VE1pjlZU)hEEd zwKs`cg9!?+V_e-3GrQqYi(_0h3mcaFq@lbcPoFGrvzR)HHc$3zl351hi7gQFT6#;W zJ;`pY84Ly~aK}*2HPzo}H($0W`}>u2OK>2Sn|_(BY9Fs+-pm)Tfby=1!~j({cOAn4 zwrN`~F_TXk&&c?=DGr(6&>lW_1^1_P+zSydRzK<9Vk~_F^ShEe`^G;hb+6UGWw68= z8!6AoNu;D8eZOrFN{Q-a7C-p4?c@SIO-IUBbF-Qrs`9Po5xFX5kt3w0Badu3fVS52 zlS(dA>trT)z}71vYy>W@b&wbQ#Z_&#T$o{8FUAiOyEfbuaawX4jE7*nEpctQ)g@N# z%@sEHrSZ?oH1Cbrgs3#Z_33YxrjTld)N#SZLcXA7D}UrepAp7={0v;f zCy?gH6TJrY)0&?F^uYK&*yb1mTO}{_l>>dD(XQTHHja~imzONUwhl-l-V$-6BINR9Rst!- zZ6PfpH3BiZ8YlU1rPXn|qlLL#3-qFLc2KXI`*rCOz9HcQW`?+)7lO|TSD6~G?J!(K zk2X}873f1(kNzaZwY{Ub6m4ZE1S7<&>yd;?hGwfbY5%z*{*xEYjss)L+a8kivc)dT zGda7v;HG5J!mPtZ9peMskT|m%LWGsWU`Yvos;YxAzaZ^KJSvqiQaFN`XzE3IfjWg^ zpd~^|jPy>B8afpkR##P3dg~cD)Y^hwZ3mEQvK{O)AFsMJ1Pg!PKg3lEzEK;*PrCBi zj6}JUW&;h|#y29trqV;z#$@y`vP^f6!;;{*&0dMdEkWS02)0V^fi?Uio_CSnreUoX zL>^4Oto8P}648pMluP?GCwZ`2k zNe2v7M+nllVO*pgJ-!}9cQD4Mt^eWZ;|Z^de4fah=4H5fGj}*URK?VQbg8r;E+4I2 z{1c|o`vr_E;B81x5m%KRM5<&(T=zTN$muulL8?*%i`^~9?ns~uB+8ozP0~?6eT<>$WZtQjsaGjE>}?X z$rR{zpxM=DfPducHSU5d0~=X*7WJO%BqOZfH7k(N|0w~Q-RPd`^NI=|I`R|e^>mck zu2+Rf;Xj&x^lrQu<4+KIhiSBPHrLqZ>gjXKB>4ZA>Ja`z@BY`2|0ZPrzpS|H^?T8Lo6QA&g$qW?02!Vxz@hUON$7v=xBXD&GX?|NX2B%;@ljQEIPB1YWM|00SkL;WicN(&MMgcIan zD?tBQasgcOWCk&85&(cy+5&GN)xX=+8U%nUR34{+sr_bgvc}_Reozt8chD~>O?2Osuv}wN2 z>-#4>zdWD6;Pc~K5(f1y5Jt|%qIv3P{qzm6u$TaZ6m)dhICuoa005<9#G|Q~H9*W7 z08yit^^gK!!M%mNecT0Yo!kJDAP|T}1SBFM3=)Eo z_q3~*$*$+-#RMgeRg+iK{xJ+7ONa0?^)FnrE!~4oUkpZBhM^lC?XAhaKFUXsQVPM( zIhsAVn+2rv-&E?X=)&;Xa{Z#s4SnB{yVtXGov*V9HcAkBD!B6`u0FT5{?aM_vng*{ zx_2j}c^{bA4#TN$d_0ZimCpKIUTZkzraUitSxf17Yme`}5kz}z@<%5S#GMstfFLut zvwN|0W7*t%?M7I_l}n*3!Db}q@XlM{h=L6AR4&9^^SE_5VVj7P+GTkJx>Zn4tcu!0i3*H&umDUz`vc!5NQpfK& z*t5%7z!U7}ty~s0FZotBDd)vYDf>Rw%1uesOKgCK*Fmkls21B~zV#ULT4WVtqcOrh zy>JM;ytc^6e!;~~ta2ks{GGe0Y-v`0KGtp11m$I~W^U9mFzv#E6mV_TGnAwx>TJKI zQ%+SGirg^&mKcRS69O^|L+N3e0e^kW3ebJj)~5dqti<-0+^@I~SUG9_iJRrDGizUs z4CI)DmFCxmoPpFtkN7O3^*t~|B*6dd?}~kT)%wBQDW8q-s&Znvwug?3X7G*3yeant z7~fEGDbEO%u-xj7-78IAXUYHL!q9?yOGl21<*0fvG`nz1ii)ZFr$OFJ_8p#w_t*5s zsV=>5)q5V8gJ`k4AO8x)rYG11%0A>m^WAF+^!*D~e5+!>Doq|svm)`kG@hqOI*7_) z1#W*zzlFU0WQ7j;MzUOHRJuT(NH^-!N<@r5OD;8n^F=7zjCpzASHE`5?!-F>Yn!lx z3epzUACva4$?%pBs`4yDSuyC~G(hbae_vY@$_p!s!NjjOTT|Q*f zt-U>jz{fsx<){F3allJCok97gf`sG48LlxfauVMDCsH*LRNZm`0&W(w8EKmt0oOPC zR4p{JP|uI@gN$6(C_VMZv z$9xbstB5kE>Q%Si9C0&6SV-trZ;0k_lpezjCZp?`UM|F(Ag{y|Wy zzn(#&+lRpScZC(K*SYyGw=>Z;Tpi%^?9d(2I8298d^XY5??^wxoX0sus^{A8>*~1J z<0Fbb_q^@}C|#~L#F~I)9_#2SqIKoeI*1Z+eMCtAp+YQw1?Gs=n$9bVhEZ4;zAvzz zl(N75Vm#s*Pa+`AUBMy<&u(IA*E1sPOEn8Wc?I{I7O`Qa^uW^2@A~H=`m9TQbHMoq z%1}24w^@C^yWc4!q}O4b`G`dRl-XU9Q+pB{&KlCKg%H0SD1B^Y5$%@l3&MW`eFG%@M%?>0A6o(O`71GO z90gMUJ{C?Kq5X3?M-~Q|Qk7@Gg0-T>Nh{Dxn`uVGi9};ezdTItGfdzjXdF8!r<^jpHgzXd1-EuGV{3Z(_*_+UIjijeQ-q(> zmy~~QAq+wI6Yfk57~E@Z%piL!9}40CyI`|_s_IXfA|oXTU**jf&2qjgrO{U?z;&M* zasT}3RBrJA%Ny{Y?kDozD4Kc`%LAi4zdyx3Wv997w0V^LZ)D@{W-sWC@CHc#Ph}I2 z#v@c~qcE?>geyvLi*iZ4wc0%wci{5qqpykV%^E*gq5gS5`u&BzQz3zD&w43EQJLZ zp^0aCIKm#b6sd)K)+wq@m_lr1&b7ijDGSTLR-_VJMvV;!9w61Xy-mOL-Tl~72$oVR z(OKHs#X{(!s6**}P!IwSYQ@b@Hm?tbc&y-e=Kiftc;{q6oL!SF7s%*R&OW8*&4BT` zrWq$Ctg+Sw-jd)bS-{l@shZ)kzuy>)WpUHM| z+A8OiI{jtXdx0ZLt_S*dg6E}d)g}rn%-i26r=JHzPlu>nW5t{)nDe=SMM7rB8or1L zru8~8V#T}yl2)HfmP|n^YeppDsst#At&Yp zgE;D#d^HH!8Y=t2R2fO}o_-(^CTQkp*fM7KLK!?>L`Q6)q%A02Y*M-d+8oZTu()7>r_e4 zg1}qPB!}=@dBdCo!i|njI~GqO{nyg5Pqhv7z;@6dJ4h=AZgpnDDUh0Y+tm zJ5{Q=Su~VwbrkaH8NvT}Z?UBS+f*WR12z;NB}kL_RapTP zH+9=I6Sg#RUPWrZaV1^F;-AW?x;PqV?5DcLrUV88p`{%rH~0{77z!D1+$7?DatJn8 z>(Su(6hZ2P(L?Zcu3Buc#@E;*`?7~4dCc*y)L4Uq1@EHqaLu~kkEZX2be#Hh&Hg!Z zf(wq}2}7vzL`H&MKMM(){5yc&LBzLO=&Dqu&Uiq5h86eylZ4*y-`k}H@3Mv~ESoiK z(ZU;qDQvvWc*u8;_)aWrwJ?LvpXwA_%+2_@Kh!DYW!7-wBo3+IXeKE9+6=P|9Bp_W zVbv11mdRuqIu8-!LYNLJkJpy@BFn5nL>RJrWU=QSts@36cG}Qr#e3l1*CppsAYJY_ zER5oiYa``#SC-yS#eQO-frv{$B)cCd3(a`%Tl6Q&Gvsr%dNPnW8M-u@WiB(6UV{=a zB^0jR$ma^>(JrPPBFShO+$ZO7t~1Vv~_vChqJdkg=gJqGU$Fb+Gn-!=)hl_b$@K-$+5bn7@Ck>ad7OSAriKYS(g~MLWeH| z;yc>Bw(PFLX8ox}-b3ufXR#VFAS+Wm3YYDUV`%<=5==@}4u7C$%xes%d)eCXtBv2* I@bvNj09HUbFaQ7m literal 0 HcmV?d00001 diff --git a/Compression.Tests/Zpaq/ReferenceVectors/versions.zpaq b/Compression.Tests/Zpaq/ReferenceVectors/versions.zpaq new file mode 100644 index 0000000000000000000000000000000000000000..067707d495dd2f1c2727bf60278e2792c88d0083 GIT binary patch literal 13179 zcmeIYWmH?=y7o=*0L2|zAh;F?5Ud3P!J)VnD8Zq4a4LB5;>DffE-hBHXmF>vHMo>Q z3oSh9f1iE!-s9QtbH;u@pEXvpR_2;(-dE;*&y_KLS0K-IJ@bS@reo^4YN!3Rv@rpA z82_~a92Mk+1%<_g1cf97CBR^?h?U^qHz5phX7pviUtNJ1Mbv-42?OJIp%NSQp#KfN zh1GMTMbzt<$vq|T9pwLtLyQ3=#h}E%Ah&;WXXGJ{@qdT2{(Ce*Aq)vYA+i6CNG$~r z0G!-CyoXIh$p`^JFdUs1PeNksYQZS zgBSGY6iZ9~Eshbo3qXe8&josVB`gR4eIwxEBl#1|hvLwhKj&1?d4LuPdKf@Z5PCH9 z2YPxL`aefJ%yCR*^zeT*|GA%D2@^e72YLw1hZ1;L2b>~M2(CN?j|58zFl2;T9%4j- zEf=lDgei|!gijB%AOlLse3OG<(RBtLVRhP*~)zu0@_)wt}LA4MvcYQ{O=pDaKil5>Hz>T$pF z&&4J#a|GUdM#)6hDk+GD%y?bl%aGktHfG3hF(kGe@s^qM;04%1pNw*Gbcwql)m=4t zN)O&tI}2z_)_8QjCEkwFH?;^1FU=EoTL8qe_m{(czZm}ZrVKW0@`fQ{vaj-=w!7MDKPqjsm{ID_%%34Kw)lX`UN`bV9GmIG(LruP(E@ z_`t1>;8^$}d6S~e)?xQ-89EbMi5k9_dbz*eB9EKb({|XV9iC%5LOcr;W4bP+=PY`{)>z`)+bl#ULM4O8Hf3lk`W+urwQ) zvCZK~@rTZO_#RIcvM+~RKs6&~0_te%tZ(iFE_(e~YI~T+=lm#C_}Jqm(PXf%Z7{>J zjc<1oe6VL{x9cl6`(07yA<52tPJbb;QTyj$^GZVB1-m&bVFqe#T^ZH8FstVpzOAWM zwU6~T1Em#RL;apTOY6+Z)4WmMLCt0ykM-cYN0pvhNq?PKdiM+8Lj4`yC>{R@uPf3Ek`%h>@rX0&@r$RqqO2{a-}`JZBKSB7#C2}^HW!7`M=`L>@mVTkWQ(wF z82qE|;gC`VBqJyNOtBAM!hCZatmP+k^h~%b$pXs=VO?G74;>C|PJBn+*c8-mgme$g z@{Q)yMi{7XFTcF`v}q5_Eqt6)JDAtY7MyXtH41tV#6ZpSphO`8y3k{t2d#@+;G{4m32K_WTf5eK^pPdmHoaEIZ_3+R3jO@i}b76R(; zMVYDD!?-rm zK{lPZvA5eDe$_<7%t{|Vb*ZK%bM!tKDNQ zTjm-a#{QDj8PH3KQtjdk9%A}}*av6_E<0YF_D=%$)+gqzFuLO~joW^co*4)AccHnc5LrjAK7H=*Dpdx(P^EI9Lh{#qEzK6r(}iuQIwG$txAbEs5ZDl&>rgM8$+ z(Ce|Xy08waJbKF&n<+M|OgwJg_Z3|)0SEuST=OxpiCExl(yqCR$P3;@$O^@0$5nx3Vv(bcu`>ih!R~ zLmu*VZ6y%yfQTdB7fdST6qt>nn1&*_wfwKn)}Ce!n!nM>4a{WhOw*6h__Xv|#=<3Q z)UtrsyOw(Uxk2q|ETcNrPR1>3)>yBQk8G6Brxpd6Q#%G#b2SMRhRGfK6!m z>M5U#?fS&^57S3e*hE>MXLIAt-jqI}J<12OE@-X1xt{-gEJ3L^|EBsiOy>0p?q!Sw zd?l_?Giu5NV%9CftUJAnFvlAL$*cr;FAQIckU|vTOoz7a_6!u*i~T*UExk$yc)T0a zPo6HDU|NFeA+45Lp9+hmoy5ADdyy>Y*$2w*wTvmAz z>8++f=PdRzps?%X{YST%7rhdW9lucp)rw%6`seenn158J9@A&mBd#bHQ~YoYqTBQ~ zfTIh{Skx1fs{-@Jf`S%n2k#no9>f?J2~N^V#sglIoCnr>V0Kd}m9R33RA?=X-x2Tk zxV-yuwB}Oz{sZO=Wu8Lp%h(^U5~H0h)?$B? zUn_^rXhB~yP+fqZOIW|G+7-Jb3{Y;AzC?z*{9MY8myDU_56d(i;;_YRI4)YUD75fZ zxT&b+q{tlnWp^o}ps6x2yYK2ERo3pEA{5QNd0;}jwQ0WiT(6K*Iy1TPSrM=H)tP%~ zF0e2_#$&|LihpvDx`>YPkx)wfGdxQoirP*15P|vyXB!e{6GU!Ex#I0jS{LpzM9F-S zKusnPv&w?BkFNQWWi>6 z(k9bKNAn@f(|x7K?r*bpT|@D|18eC?hm+K`0bPtPsk<4kJcQnI!!&`G%X_|g6iI6D zh&8Sq*oOVNc7$Sur6fs_OQxaY1!0dzH~f-&5>MC+UY zK&`)k$05m`D%4rL8EbgR(5F7hXxUzomW1Zi`OYgwC`w_?4!_oWIqVFpSQQGP_h zmsB7UF-|E5A>>Ps z=YrFK&2zHtB7@%1Rwl3tH`_4c7jIQWTy4cGF11fAT7H;0?${jVjFS!&-4f)pOWXD> zZ6H4D%GT)HcI|ZWuY#)QiXa<; z35ulJP=DQj8cexPSZGFC0o)}Cz@k)(Qi(@%_s^*pJM8W!8)@6RBN`z`P+sot%#JsV+t4 zL~wiq^=gisd&&KRRk9AO^;q(?3DB1BMI~Scl=7Z$5>Mlxs^m9w^SI#aIc2W#pZ-0& z1>EBt_?2famF1{pSLK(_xb{B(7_h=VUu_|*8PL455H9Krm5pznV>%NbJf4{9pOEc4 zm+f0v?VmHHT;CoZoa#rdZp%*X%AzKEP_pQ~Z}`tXwQMAdZbz`LoA#G<6T9jE)9PH7*!Al$Ux0L0FRG@r#&CDr>n#ZXfG(S zp{-V;TMT+-TPk1652j=*>1YXRPY1em^Qn=UXsVV*hK<&F&iS+Hs35RZ5UjktBjdVUnYCU&PThK)jVyQf-E-PtYH1Z++MB>ZZm@DE9&==5QC zhFMA`NF;>wn~1Z=#NiYr!C$bH4bw$F%5<=Xd&2oZc0Mo|`C&g{zt8>h@(tBQ#reZ> zs3~P=f9svzpY-p_t|CJTgXTgK)G`I?V?K>`Hf=CHJ3Mql(C2@p8A@DKzF_mT)<WeW>MVVUDG@2H+%&x)Zlr&+Gh6gj0b;2|_EK~bS zFjfb|Foj?Pq$LNL&Xyl=z%7Sbbu7gPN8b0`+lqj|O&P^!`28$k~t3NSJ?6-X}eaalh7gLQia`lN`2^-a?r)not*!{Dn zTDa2I--c6*z3I2KkBUf17m52?aJq{NO110ZsI_iQ7L<$^Nukx}RV9lZ?XpylndpE) zfSDA>r0@z38z|4Y?R$mXQ$$e^jQvE=kSarC73oj8t}&<-Nsth#W$UX^x>|?9MZtCe zNYiDq877k(v%V*alaynl!jTPz2iD5?Ax2sq&(9^t4|o)#C*^r z*?7!qW^2n1_v}f;*L{KM!1JXKwQ6LlrwGB)81s z!D;<~u(h`F?Z0DuX-}|q?~0p!wrP)k zpf=ctCp21kU`Wz~(ACijJ*TFU(S$a^Y13|!AI7XGS(g0ZW=uOZ2!BUrRd*q9yx>lq zFn4HKOkw^wwM)P4j~<1( zgcbX;4g#j8%Fu0NQcYt}&X~?N`AdEquc7}3>TcQM$S^$WI z;k020CP`U;GuzK19t376A>uwo+F+LmvrtViyV@>N7RvL2P4YcvT)axlnKjDx`1Fd> zmDycw6*V;as&!;RXXVcR-w=$j_@1oDcw_pf=@c>8#p)kbdQi!3$qkI9M|3aYw}n}blXP+-gay;$2M2v~_- z;@b#U@C0JMj5m?}YQi3%T`Vp%rLa)3Z>FwEpB>#}mPRqh<=`nm@IGR!R-HJ7RY7?n zYg%l`ERAqnG%MZSkoUk-v%K&K+4F_p5Dwe0BHw+F|4y$qu=3lozRrdNnVmm0(z*ha zFG>$9wo+}Xbh9j*T+7OSaA-kB#A)fL$-n}45xAH-yLIWq;_J~_QTgg2KD6AYYX;k3 zbKsNBXbAStBDimd(?g;-siCFTgVM{=RJE|+*eqpPuhtSPX^hq@jc_a3e4Z>#TGvkB zg1F2ACWfG-C)G!bzCf3tT>?3CbfGF_tq`(;3b(gk28G#*EIkCiXSb)9AzP!=t%GzT z*b=MopW^FoKq<1W+>Yy8FoYc*yDJc=SRu%QwV|lhn9mWO`@$=ZTKI@WF+zlukQkN( z>m6thsM|YQ7O&di73n|of$Q9M?we4F#E6GG>GtTTTPtWLJ%{pKoP`jfNwa@J|AwlF zx;rq+=)qtngED>gdJ1U>FI>PeKu>&BszNqH*Mcn)wxg{9<^24FXAf?ht7)WHzO2JJ zv7o&x@2;H}kQB0(jHkORHxyMJZyFCnO_;W}d-|1mRW~@>%nAGd`QiLXh=JiogCR%x zH(rfq)UtVWwP(vZa-9ZZ#~(lUy{0xc#s4>q`v1Yg?f(f*iwgfYn#K_Q3x+#})RSB; z$uvR4Bes5l3GN?98Akn4@h;;{!Pbndju^Jhyyf8GsHY>>SG2Ofw%w*sV&#nt))Bl#we^@>jclzpvM|3-hONB1@2b~>Ub6ItA6?hxWC zUdIFR53i(+9763v$Ms8!gD_OjsLWkdGPp!B6XFnhPYrJ9WZV_O3wX8GRBWP!@B1+9FBOrjTa3^`}+;=nsCOW20YM7FWH-f8xvVPbUy_`tCW<#PP?s;26mlWqzi0>A^K-tZOU9mb z16b7@j~EZ`a|@EJ&f%Y)y4EfOQ<6pqysw<3GLIK-7hL;Dp6lUFU|+ryeDoJaoig~lEp*FQ}RLhtxBY9@&HqhkGvv?m^|SlVWzHQ zULI8kQZUg8dz(MTb=i+cWA-?tI! zu*gqe!)z6dgXW3<_KF!gV+=dO8&?*!4Vz#1;iV7ba(X9yub9}D?>^ME4l$C+1Q}Y5 z9a(s3QJ+K+jCdtOx*1wgf_qts<^0n`?RNl2mtOn#t9-GlxYPTl4%FJiwinAunWno9 z0BfPDHW(4}K*{76;n!1MORifsxo>5%7$ymdzf7ue(~3N!`4(_01~Tzf5K3bVl`z#` zpd@azqAz`&sF$AFDNcB*usN1W*IP)pvBeM;lfJj^^0A9;+@Puwc(WnKsY_>g;N$A* z`>vV~E+OhKgM!^m_%8usyNIw_+m^D3^yBV66vd#h5-OS99x%A5(B+fWt4B0xD_x!$ zgf)w^31*oZ85(*x=8s!`j{Y%bLeHDf{or@Qz*6?^Th*c$j5BU4L4g=S=8Z600^3_+ zwiT+Q>J_`^g^mw(h<{DZln6_oZIFL>71!}NUS#-F2gNuX! zA=^#aMtS+ZGry$T*Fx)o>s{2skP384uWq$IoO{kU6~IM6ZtWbPWlwhe>;u7ZR2-%J z6NH1(u;9t(uHaiWTu>Z-g#Gsi4Mwy9-cTV(^Zc2G<|hqnpSH@yalV|{5o!9F8b?7K zoN^dT=G6f5?D=y$iH&88(OazhY;&bBotsbDSG45jEhNEY(jlKVi*6CG{lf`tB&v6M zgoFr?#AFVM)2!i7r9}JuN7Hf36y&ehA}#yg^Z7upEe@NqT=;=sYovnte~tc#ZQDtB zBD;0kFv;>umzEHC!Tm9PYx6Fl{}<6Yz%`Q8*PB5V6E9Jbugfz(!m5jvB7E3~bJY@Nrg@XP+iovTkj z*J>`vS^B-?6TzbvedrhdhdaQqX@hrN! z!?3Ek|H*v*nCtf~aVuo~pwMaYvkd8Gp*`f~t0(RWgRNCg31A+%h~ip74Yh*RoPc9I zhF>wM9(!JjEWgQXi#!!~#VuxIi2|(Le#9K-wF-6PRLGwMTotNW=x1$oKW;pjuLdfE z)!F^E1#}q8h{L9|0hwbYRj{sed}DQ&$Wq|``m=AFkWu@<<*A(ak?+&e2*va8!m*&0 z{B}L|?!lzfpW+lW+sm@+F2r}#=|8`YX;YpgMc~TIHJmqEe)VvZksPiCA$LL(teef1 z8YnJTZm%bnE#C;4L_SQqw_KXN29+(OFsM(SVtV;PMZV2lVjz%|L80b#O}+|}Tvivu zau5`YREJ8jleW}gw49sjViRG#B&BI*2 zo@Ox6KiL}KM=j;*JRz*1JyCv0n6syy4tkwaWJ)$_KQ>A8yGxH!Zc2j^PTPJpQrYC4 zgAAvxb_uq>GT}Rq?LGEpF*aMf*xw4$^1j9O@5Sg8@)dQ@?|9#}F0b=rdwbXIy8lSO zV>yO6o^pUJeS=AaPj5Z`OZV*5WSpmUH(tZ5^}}NNy;viA@dO>Y0mds(`D)K|m$&ff z-7WR@6oM65_o7`g4bfr7A{M&eckDU*A2slX?41ufnrWS1l+oy_gxh6I@fE*|+@gN< zxQ#5v)$%s&$ZwR5+5G^!bEVt%POHF6r&-e}pLI+0x1hGi{GtWN=MnneQs{6W!rXH} zA7cO%bU*h_FXeonIadFd;gcP>eEc8+YR+vI4lm-68c@G$zXxFBl3y4`;IlH;i zzfsxVIQM?FPu>m5nTl`Cm;6bhI#Nb!+wSoB=_z^oz8LPXyAaEKLXkv)yDm8{LT}^5 z<%IXt_Qcrg)61Nnm)@Qe+sbKlwh94E1-`O74R}Jz$JmV#ZwE*1fAkad*&bk3@H%Rq zo3q^*fDmu+wZe^&&C>PplK~F!Yh+}5-B3+YU$EHRt8$LC^@6rpO~&UXUlD+xcV9IV>F7RxeL8;cp&?98D@CW zSSBYf59>bCwwg|F>y}lLnq)ncnQAW>l8rj0Tg}_v>D7QVuT! z?2dzcXO$4g3T~{=wrP=i0jGU0ux;t-#n^Z%aC!6304qlkci%L z=s<2M45fM66AE;)tWHYb1?INd51k@gEqOlAzoFq*5N_$|TBzQ7T7sEGBowkcRhb zCI+AJSohhYqht9hp=s;MGoNrm5C$86nD(#xsF{?ACQfsLheHt<(aEJugc^W6tFD6oTxR-+H zRa3f8a6|^Rx9lL>FG}l3*#PhRA=@t9b2w$=&r($`(toXcOBMTMx zpd*y3?|nG!b5XCJY7zUBjfC-G354-#JPAZyCz)6i^qX3@3zC_6%hjtwI<+=Fpyc59 zAoBVOxYiSpQWLCQKZSMu%mc5(!E~}abCIYb4F5@GUI#Jf{m*nwfT=eVKgS+_4Jlp! zn)gZBp1mkoO6!euzypjSv7heoUYk?*R$%lJebm78!R(-%<4oIzhjga}DG_hd=VPgI zocK0^*~1TQ6iB+Ws1&DVFwZsai6K2tN=IHDe;8h?Q9<&X8I`*W(3s#@_@r!Q>QP5x zU_FDSST9jaM&x6H+v|65dEPG)?(f}d6}WG*zq?VrQ|L?pyeJGlyatqK_)JKhE8FPV zc$96gDUM;Oc*S-3lrKdV=g}N_wJ+W?;-q|*1Ye}6HH+PPL6Ph3ThProw^Q)+{3T~J z^fkTS!Yj8x9gcI@Q{!Ns)aLPL>|;T3iG@QwsA1We)&1?|o(0)I++G$rwJHL*I#Lvn|jnA$a^{Nu&+Z1+!09S+O>!?Hn} zG3D%kfZ9Da-W@2lA`PykAqV8$zO*$abqxw|bl8~|y6gnBy zj&^ABQ(~(|XPf@Zg_*2tBo$zG@MN}fb$0WxK_DK%2Qy6#kmIm!b%DdmDr78iC^3JG z0A2#&({wXBv>U*nOnYBh1MOUVcjIvI%;t8qL<4_ICs(WIAd-nfd9^>r3M-m!j!Yg4 zH;6z|b1Jt-HQ2(-)4p%7d+FnNoz8Vw*t&W=I+TQEcaPmSDt~O`IJoj93kpi*1w1(IyMC zkG+GHy@VX;K|%96k6H`b;USX?guX#fjsxh(Z5OpY+_Tgg2IA9URZHS!C=5s%0b6(X zED!QP2$Oh6f+a_dbKUf*EiNM4({~oMfti08Kd;pgIT1^QTlyB44nE3XGNX2aO;S`+ z0R092C__heKtS~tN%>=l*_<^OC@p>KS33g9Q&wNNM4Ui07cDcGn(shqNnCq5Sc6 zk9&5F>IFFr`pL1p$`F)4COiIEaP5C{wc3aDC8#+JIdqy5@W{+HJ|=xM4lqt*NC#GH z*}kBJix#WG8)p<^Ey(<>(bEfxs271yCm5?NnO=dve9k1m#`oeOVWZ@S+UQ0a<(yF@ zJSa^^8(?S^J3(m?H5Ex6Jn$YP**?ku;d4G!`#xAVn`6IeaqHUB6v9&aQL$ZHOdgOShwt;!V6=HBHeUwmHmBkgAkgpgjabKSAq00npYPuG zMc3HWvMg$Krj%ovTJMN^9GyUaqC^NJMWr%aS=Uh(MajppI>LDGu0gOxxY)jXN@EX1 zpie=AQ#^)$KchhEkFnJ9KnE1aTveI})Zimgs8s*)#jS%rqEs-Hz8TG;yNM`#%6ptZ z$VQAJx{h)(0-UHUHH5ZcKoW&^@ML~UB>6{W>2Pd4^QvNT`oPP-%oj{D7Mv8CWB2#! zB7R8+E%Wkb?w|G@lEWrCfMI0|nL6}PzrQSi6U_h(7|tcxt_}|Nqhw|_Py6&RvTMfk zY8tW;3Ldm|1nLl~7j9Qo=vl6(Vy(CAu7!Y8Y2{JV$pkGn1ceLPJ;;Wn(sT28utUKl zc{|;MBRC9QY8iTa`Seox@)RNbicZ>WNDZNCdJRJjE-}0*_QnX>s_g)s;80_NL88L# z1#Sv!LR5HD`%g2LUQvsP?4M2c6%Dz zL{u7<8e8Zor`~+rPgvfN!0{2d&-*gER|7R*@47nN7Po%sW@sc zFA9YOokqKbDNE1Jg{e#IloAk}?aC$yN_=eqvTOf&upyPR<(C>{!(8-m6N)D33{fqW zJxx%ts7eE}BJQE=keX6FiEstTcs)DDc{3-#tiVa~dP%_5ZOqxHe&nKs z?4Y{CKBL#g@2UGom)uVSYai@`oEkBDpYz2M^K(#z>baltO_S+9A~yX<+>`a?y=Cq2 zXIj4#j)*iS8+@>LbtB;*{i0VX868ZBCC7x=8y*wXX2G8k4NYS(h7el{5F{>#wd8>) z+6*0);N*4f)nR0`?JW{~EYbrJJXKR~-gTtciD$DStl*w}{WYWF8!x1(cNKRFM6xq_ z{&Fz`bn_j^y!3U7ICIrT4f0`B=3~oQM)n}$!sq2Pozoy95+Bi6bppe=F0=4^eKEI$ zEJ4L;HkTb4i4Acc=d*#)n+390?@b;?%hsHi3N<6P(7^p%ep0j$mIlt*%=%tk+z_6U zt;;QB7eHsL?QWuE9fhqpF_qO4?@*4S1{NZ!Goth}RL0yVDJ9||V6g3wARf={WVX9I z$7Ftwv)Lz4l{R8)l{wwbPdolkx{>HhLHPoecCD%9pI#j72u6Kqvu=oF`cEtX< zc7*?_c9j0NcK*ZK@%(!c)CRZ*6!K;w@_P%h{z}^KGoJ2m?P`-UJjsC!nd~3*`hn35 GcmD@coQ#$L literal 0 HcmV?d00001 diff --git a/Compression.Tests/Zpaq/ZpaqEngineTests.cs b/Compression.Tests/Zpaq/ZpaqEngineTests.cs new file mode 100644 index 000000000..42586961f --- /dev/null +++ b/Compression.Tests/Zpaq/ZpaqEngineTests.cs @@ -0,0 +1,128 @@ +using System.Text; +using Compression.Tests.Csc; +using FileFormat.Zpaq; + +namespace Compression.Tests.Zpaq; + +/// +/// The libzpaq conversion below the archive layer: suffix arrays, the ZPAQL compiler and +/// interpreter, method expansion, and single-block streams. +/// +[TestFixture] +public class ZpaqEngineTests { + + // ── suffix array ───────────────────────────────────────────────────────── + + private static int[] NaiveSuffixArray(byte[] s) => + Enumerable.Range(0, s.Length).OrderBy(i => i, Comparer.Create((a, b) => s.AsSpan(a).SequenceCompareTo(s.AsSpan(b)))).ToArray(); + + [Test, Category("HappyPath")] + public void SuffixArray_MatchesNaiveSort([Values(0, 1, 2, 3, 17, 100, 1000)] int length, [Values(2, 4, 256)] int alphabet) { + var rng = new Random(length * 31 + alphabet); + var s = new byte[length]; + for (var i = 0; i < s.Length; ++i) + s[i] = (byte)rng.Next(alphabet); + Assert.That(ZpaqSuffixArray.Build(s), Is.EqualTo(NaiveSuffixArray(s))); + } + + [Test, Category("BoundaryCase")] + public void SuffixArray_PeriodicAndConstantInputs() { + foreach (var s in new[] { Enumerable.Repeat((byte)7, 500).ToArray(), Encoding.ASCII.GetBytes(string.Concat(Enumerable.Repeat("abcab", 97))), Encoding.ASCII.GetBytes("mississippi") }) + Assert.That(ZpaqSuffixArray.Build(s), Is.EqualTo(NaiveSuffixArray(s))); + } + + // ── squash / stretch (specification section 7, checked by libzpaq's own self test) ── + + [Test, Category("HappyPath")] + public void SquashAndStretch_MatchLibzpaqChecksums() { + uint stsum = 0, sqsum = 0; + for (var i = 32767; i >= 0; --i) + stsum = stsum * 3 + (uint)ZpaqPredictor.Stretch(i); + for (var i = 4095; i >= 0; --i) + sqsum = sqsum * 3 + (uint)ZpaqPredictor.Squash(i - 2048); + Assert.Multiple(() => { + Assert.That(stsum, Is.EqualTo(3887533746u)); + Assert.That(sqsum, Is.EqualTo(2278286169u)); + }); + } + + // ── compiler ───────────────────────────────────────────────────────────── + + [Test, Category("HappyPath")] + public void Compiler_ProducesLibzpaqMinCfgBytecode() { + // min.cfg from the libzpaq documentation; the expected bytes are libzpaq's built-in "Model 1". + const string minCfg = "comp 1 2 0 0 2 0 icm 16 1 isse 19 0 hcomp *b=a a=0 d=0 hash b-- hash *d=a d++ b-- hash b-- hash *d=a halt post 0 end"; + var hz = new ZpaqlMachine(); + var pz = new ZpaqlMachine(); + _ = new ZpaqCompiler(minCfg, null, hz, pz); + var ms = new ZpaqBuffer(); + hz.Write(ms, false); + byte[] model1 = [26, 0, 1, 2, 0, 0, 2, 3, 16, 8, 19, 0, 0, 96, 4, 28, 59, 10, 59, 112, 25, 10, 59, 10, 59, 112, 56, 0]; + Assert.That(ms.ToArray(), Is.EqualTo(model1)); + } + + [Test, Category("Exception")] + public void Compiler_RejectsBadConfigs([Values("comp 0 0 0 0 1 0 bogus hcomp halt end", "comp 0 0 0 0 0 hcomp endif halt end", "comp 0 0 0 0 0 hcomp halt")] string config) => + Assert.That(() => new ZpaqCompiler(config, null, new(), new()), Throws.InstanceOf()); + + [Test, Category("HappyPath")] + public void MakeConfig_ExpandsArguments() { + var args = new int[9]; + var config = ZpaqMethods.MakeConfig("x6.3ci1", args); + Assert.Multiple(() => { + Assert.That(args[..2], Is.EqualTo(new[] { 6, 3 })); + Assert.That(config, Does.StartWith("comp 9 16 $1+20 $1+20 2\n0 icm")); + Assert.That(config, Does.Contain("pcomp bwtrle c ;")); + Assert.That(ZpaqMethods.MakeConfig("0", args), Is.EqualTo("comp 0 0 0 0 0 hcomp end\n")); + }); + } + + // ── single-block streams ───────────────────────────────────────────────── + + private static byte[] RoundTrip(byte[] data, string method) { + var output = new ZpaqBuffer(); + ZpaqMethods.CompressBlock(new ZpaqBuffer(data), output, method, "name", null, storeSha1: true); + return ZpaqStream.Decompress(output.Span); + } + + [Test, Category("RoundTrip")] + public void Block_EveryTransformAndModel_RoundTrips([Values("0", "x0.0c0.0.255", "x0.1.4.0.3.20", "x0.2.4.0.3.20c0.0.511", "x0.3ci1", "x0.4", "x0.5.4.0.3.20", "x0.6.4.0.3.20", "x0.7ci1", + "x0.1.4.0.5.21", "x0.0c256.0.255.1511.255i1aw1m16s8.32.255", "x0.0c0.1010.255t", "x0.0ci1,1,1,1,2aw2mm16tst")] string method) { + byte[] data = [.. CscSamples.Text(9000, 31), .. CscSamples.X86(7000, 32), .. CscSamples.RandomBytes(2000, 33)]; + Assert.That(RoundTrip(data, method), Is.EqualTo(data)); + } + + [Test, Category("RoundTrip")] + public void Block_LevelsWithHints_RoundTrip([Values("1", "2", "3", "4", "5")] string level, [Values(",0,0", ",200,1", ",120,2", ",250,3")] string hints) { + var data = CscSamples.Mixed(); + Assert.That(RoundTrip(data, level + "0" + hints), Is.EqualTo(data)); + } + + [Test, Category("BoundaryCase")] + public void Block_EmptyAndOneByte_RoundTrip([Values("0", "x0.1.4.0.3.20", "x0.2.4.0.3.20", "x0.3ci1", "x0.0ci1")] string method) { + Assert.Multiple(() => { + Assert.That(RoundTrip([], method), Is.Empty); + Assert.That(RoundTrip([42], method), Is.EqualTo(new byte[] { 42 })); + }); + } + + [Test, Category("Exception")] + public void Block_FlippedChecksum_IsDetected() { + var output = new ZpaqBuffer(); + ZpaqMethods.CompressBlock(new ZpaqBuffer(CscSamples.Text(5000, 34)), output, "x0.0ci1", null, null, storeSha1: true); + var bytes = output.ToArray(); + bytes[^3] ^= 1; // inside the SHA-1 trailer, before the end-of-block byte + Assert.That(() => ZpaqStream.Decompress(bytes), Throws.InstanceOf()); + } + + [Test, Category("HappyPath")] + public void E8E9_IsUndoneByThePostprocessor() { + var data = CscSamples.X86(30_000, 35); + var copy = (byte[])data.Clone(); + ZpaqMethods.E8E9(copy); + Assert.Multiple(() => { + Assert.That(copy, Is.Not.EqualTo(data), "the transform changes call targets"); + Assert.That(RoundTrip(data, "x0.4"), Is.EqualTo(data)); + }); + } +} diff --git a/Compression.Tests/Zpaq/ZpaqExternalOracleTests.cs b/Compression.Tests/Zpaq/ZpaqExternalOracleTests.cs new file mode 100644 index 000000000..8de4b060b --- /dev/null +++ b/Compression.Tests/Zpaq/ZpaqExternalOracleTests.cs @@ -0,0 +1,252 @@ +using System.Diagnostics; +using System.Text; +using Compression.Tests.Csc; +using FileFormat.Zpaq; + +namespace Compression.Tests.Zpaq; + +/// +/// Live checks against the reference archiver zpaq 7.15, both directions: zpaq must list and +/// extract byte for byte what writes, we must read what zpaq writes (every +/// method, several versions, deduplication, streaming), and with the same input our compressed data +/// blocks must equal zpaq's. +/// +/// +/// The tool is $ZPAQ (a path), else zpaq on the host PATH, else zpaq inside WSL. +/// Debian and Ubuntu package zpaq 7.15 (apt-get install zpaq); the Windows build is +/// zpaq64.exe from . Without the tool every +/// test is ignored, unless CWB_REQUIRE_ZPAQ=1 (set by the CI oracle step) turns that into a failure. +/// +[TestFixture] +[Category("ExternalInterop")] +public sealed class ZpaqExternalOracleTests { + private static readonly Lazy?> _tool = new(LocateTool); + private static readonly DateTime When = new(2026, 10, 19, 12, 0, 0, DateTimeKind.Utc); + private string _tmp = null!; + + [SetUp] + public void Setup() { + this._tmp = Path.Combine(Path.GetTempPath(), $"cwb_zpaq_{Guid.NewGuid():N}"); + Directory.CreateDirectory(this._tmp); + } + + [TearDown] + public void Teardown() { + try { Directory.Delete(this._tmp, recursive: true); } catch { /* best effort */ } + } + + private static (string Name, byte[] Data)[] Sample() { + var text = CscSamples.Text(40_000, 41); + return [ + ("set/text.txt", text), + ("set/dup.txt", text), + ("set/x86.bin", CscSamples.X86(30_000, 42)), + ("set/random.bin", CscSamples.RandomBytes(12_000, 43)), + ("set/table.bin", CscSamples.Table(20_000)), + ("set/empty.dat", []), + ("set/sub/mixed.bin", CscSamples.Mixed()), + ("set/sub/big.bin", [.. CscSamples.RandomBytes(700_000, 44), .. CscSamples.Text(300_000, 45)]), + ]; + } + + private void Materialise(string root, (string Name, byte[] Data)[] files) { + foreach (var (name, data) in files) { + var path = Path.Combine(root, name.Replace('/', Path.DirectorySeparatorChar)); + Directory.CreateDirectory(Path.GetDirectoryName(path)!); + File.WriteAllBytes(path, data); + } + } + + private static byte[] WriteOurs(string method, (string Name, byte[] Data)[] files) { + using var ms = new MemoryStream(); + using (var w = new ZpaqWriter(ms, leaveOpen: true, method) { TransactionDate = When }) { + w.AddDirectory("set/"); + w.AddDirectory("set/sub/"); + foreach (var (name, data) in files) + w.AddFile(name, data); + } + return ms.ToArray(); + } + + public static IEnumerable Methods() => ["0", "1", "2", "3", "4", "5", "14", "36", "x4.0ci1.1.1.1.2aw2mm16tst", "x4.3ci1"]; + + // ── zpaq reads us ──────────────────────────────────────────────────────── + + [Test, TestCaseSource(nameof(Methods))] + public void OurArchive_IsListedAndExtractedByZpaq(string method) { + var tool = RequireTool(); + var files = Sample(); + File.WriteAllBytes(Path.Combine(this._tmp, "ours.zpaq"), WriteOurs(method, files)); + + var list = tool(this._tmp, ["l", "ours.zpaq"]); + var extract = tool(this._tmp, ["x", "ours.zpaq", "-to", "out"]); + + Assert.Multiple(() => { + Assert.That(list.ExitCode, Is.Zero, list.Output); + Assert.That(list.Output, Does.Contain("1 versions, 10 files"), list.Output); + Assert.That(extract.ExitCode, Is.Zero, extract.Output); + foreach (var (name, data) in files) + Assert.That(File.ReadAllBytes(Path.Combine(this._tmp, "out", name.Replace('/', Path.DirectorySeparatorChar))), Is.EqualTo(data), name); + Assert.That(Directory.Exists(Path.Combine(this._tmp, "out", "set", "sub")), "directory entry restored"); + }); + } + + // ── we read zpaq ───────────────────────────────────────────────────────── + + [Test, TestCaseSource(nameof(Methods))] + public void ZpaqArchive_IsReadByUs(string method) { + var tool = RequireTool(); + var files = Sample(); + this.Materialise(this._tmp, files); + var add = tool(this._tmp, ["a", "theirs.zpaq", "set", "-method", method]); + Assert.That(add.ExitCode, Is.Zero, add.Output); + + using var r = new ZpaqReader(File.OpenRead(Path.Combine(this._tmp, "theirs.zpaq"))); + var entries = r.Entries.ToDictionary(e => e.FileName); + Assert.Multiple(() => { + Assert.That(r.Errors, Is.Zero); + Assert.That(entries.Keys, Is.SupersetOf(new[] { "set/", "set/sub/" })); + foreach (var (name, data) in files) + Assert.That(r.ExtractBytes(entries[name]), Is.EqualTo(data), name); + }); + } + + [Test] + public void ZpaqVersions_UpdatesAndDeletions_AreReadByUs() { + var tool = RequireTool(); + var root = this._tmp; + this.Materialise(root, [("v/a.txt", CscSamples.Text(9000, 46)), ("v/b.bin", CscSamples.RandomBytes(5000, 47))]); + Assert.That(tool(root, ["a", "v.zpaq", "v"]).ExitCode, Is.Zero); + Thread.Sleep(1100); // zpaq versions need distinct second-resolution dates + this.Materialise(root, [("v/b.bin", CscSamples.RandomBytes(5000, 48)), ("v/c.txt", CscSamples.Text(4000, 49))]); + Assert.That(tool(root, ["a", "v.zpaq", "v", "-method", "3"]).ExitCode, Is.Zero); + Thread.Sleep(1100); + File.Delete(Path.Combine(root, "v", "a.txt")); + Assert.That(tool(root, ["a", "v.zpaq", "v", "-method", "5"]).ExitCode, Is.Zero); + + using var r = new ZpaqReader(File.OpenRead(Path.Combine(root, "v.zpaq"))); + var v1 = r.GetEntries(1).ToDictionary(e => e.FileName); + var v3 = r.Entries.ToDictionary(e => e.FileName); + Assert.Multiple(() => { + Assert.That(r.VersionCount, Is.EqualTo(3)); + Assert.That(r.ExtractBytes(v1["v/b.bin"]), Is.EqualTo(CscSamples.RandomBytes(5000, 47))); + Assert.That(r.ExtractBytes(v1["v/a.txt"]), Is.EqualTo(CscSamples.Text(9000, 46))); + Assert.That(r.ExtractBytes(v3["v/b.bin"]), Is.EqualTo(CscSamples.RandomBytes(5000, 48))); + Assert.That(r.ExtractBytes(v3["v/c.txt"]), Is.EqualTo(CscSamples.Text(4000, 49))); + Assert.That(v3.ContainsKey("v/a.txt"), Is.False, "deleted in version 3"); + }); + } + + [Test] + public void ZpaqStreamingArchive_IsReadByUs([Values("s4.3ci1", "s1", "s0.0c0.0.255.255i2")] string method) { + var tool = RequireTool(); + var files = Sample().Where(f => f.Data.Length > 0).ToArray(); + this.Materialise(this._tmp, files); + Assert.That(tool(this._tmp, ["a", "s.zpaq", "set", "-method", method]).ExitCode, Is.Zero); + + using var r = new ZpaqReader(File.OpenRead(Path.Combine(this._tmp, "s.zpaq"))); + var entries = r.Entries.ToDictionary(e => e.FileName); + Assert.Multiple(() => { + foreach (var (name, data) in files) + Assert.That(r.ExtractBytes(entries[name]), Is.EqualTo(data), name); + }); + } + + [Test] + public void OurBuildingBlockStream_IsExtractedByZpaq() { + var tool = RequireTool(); + var data = CscSamples.Mixed(); + File.WriteAllBytes(Path.Combine(this._tmp, "bb.zpaq"), new ZpaqBuildingBlock().Compress(data)); + var extract = tool(this._tmp, ["x", "bb.zpaq", "-to", "out"]); + Assert.That(extract.ExitCode, Is.Zero, extract.Output); + var produced = Directory.GetFiles(Path.Combine(this._tmp, "out"), "*", SearchOption.AllDirectories); + Assert.That(produced.Select(File.ReadAllBytes), Has.Some.EqualTo(data)); + } + + // ── byte equality ──────────────────────────────────────────────────────── + + [Test] + public void OurDataBlocks_EqualZpaqs([Values("0", "1", "2", "3", "4", "5")] string method) { + var tool = RequireTool(); + var banner = tool(this._tmp, []).Output; + if (!banner.Contains("v7.15")) + Assert.Ignore("Data-block equality is pinned against zpaq v7.15; found: " + banner.Split('\n')[0]); + var files = Sample(); + this.Materialise(this._tmp, files); + Assert.That(tool(this._tmp, ["a", "theirs.zpaq", "set", "-method", method]).ExitCode, Is.Zero); + var theirs = File.ReadAllBytes(Path.Combine(this._tmp, "theirs.zpaq")); + var ours = WriteOurs(method, files); + + Assert.That(DataRegion(ours), Is.EqualTo(DataRegion(theirs)), "d blocks with the transaction date masked"); + } + + /// The bytes from the first d block to the first h block, with every journaling date zeroed. + private static byte[] DataRegion(byte[] archive) { + var s = Encoding.Latin1.GetString(archive); + var d = JournalName(s, 'd'); + var h = JournalName(s, 'h'); + if (d < 0) + return []; + var tag = Encoding.Latin1.GetString(ZpaqCompressorTag); + var start = s.LastIndexOf(tag, d, StringComparison.Ordinal); + var end = s.LastIndexOf(tag, h, StringComparison.Ordinal); + var region = archive[start..end]; + var text = Encoding.Latin1.GetString(region); + for (var i = text.IndexOf("jDC", StringComparison.Ordinal); i >= 0; i = text.IndexOf("jDC", i + 3, StringComparison.Ordinal)) + if (i + 17 <= region.Length && text.AsSpan(i + 3, 14).IndexOfAnyExceptInRange('0', '9') < 0) + region.AsSpan(i + 3, 14).Fill((byte)'0'); + return region; + } + + private static int JournalName(string s, char type) { + for (var i = s.IndexOf("jDC", StringComparison.Ordinal); i >= 0; i = s.IndexOf("jDC", i + 3, StringComparison.Ordinal)) + if (i + 18 <= s.Length && s[i + 17] == type && s.AsSpan(i + 3, 14).IndexOfAnyExceptInRange('0', '9') < 0) + return i; + return -1; + } + + private static readonly byte[] ZpaqCompressorTag = [0x37, 0x6b, 0x53, 0x74, 0xa0, 0x31, 0x83, 0xd3, 0x8c, 0xb2, 0x28, 0xb0, 0xd3]; + + // ── tool location ──────────────────────────────────────────────────────── + + private static Func RequireTool() { + var tool = _tool.Value; + if (tool is null) { + if (Environment.GetEnvironmentVariable("CWB_REQUIRE_ZPAQ") == "1") + Assert.Fail("CWB_REQUIRE_ZPAQ=1 but zpaq was not found ($ZPAQ, PATH, WSL)."); + Assert.Ignore("zpaq not found: set ZPAQ or install zpaq 7.15 (see the class remarks)."); + } + return tool!; + } + + private static Func? LocateTool() { + var configured = Environment.GetEnvironmentVariable("ZPAQ"); + if (!string.IsNullOrWhiteSpace(configured) && File.Exists(configured)) + return (dir, args) => Run(configured, dir, args); + if (FsInteropToolbox.HostPathHasTool("zpaq")) + return (dir, args) => Run("zpaq", dir, args); + if (OperatingSystem.IsWindows() && FsInteropToolbox.WslAvailable && FsInteropToolbox.WslHasTool("zpaq")) + return (dir, args) => { + var line = string.Join(' ', args.Select(a => "'" + a.Replace("'", "'\\''") + "'")); + var (stdOut, stdErr, exitCode) = FsInteropToolbox.RunWsl($"cd '{FsInteropToolbox.WinToWsl(dir)}' && zpaq {line}"); + return (exitCode, stdOut + stdErr); + }; + return null; + } + + private static (int ExitCode, string Output) Run(string executable, string workingDirectory, string[] arguments) { + var start = new ProcessStartInfo(executable) { + WorkingDirectory = workingDirectory, + RedirectStandardOutput = true, + RedirectStandardError = true, + UseShellExecute = false, + }; + foreach (var argument in arguments) + start.ArgumentList.Add(argument); + using var process = Process.Start(start)!; + var stdOut = process.StandardOutput.ReadToEndAsync(); + var stdErr = process.StandardError.ReadToEndAsync(); + process.WaitForExit(); + return (process.ExitCode, stdOut.Result + stdErr.Result); + } +} diff --git a/Compression.Tests/Zpaq/ZpaqRangeCoderTests.cs b/Compression.Tests/Zpaq/ZpaqRangeCoderTests.cs deleted file mode 100644 index 8d03a7a5b..000000000 --- a/Compression.Tests/Zpaq/ZpaqRangeCoderTests.cs +++ /dev/null @@ -1,223 +0,0 @@ -using FileFormat.Zpaq; - -namespace Compression.Tests.Zpaq; - -/// -/// Pins the safety invariant of the ZPAQ binary range coder: on entry to every bit -/// the range lies in [2^24, 2^32) and the probability in [1, 65535], and both -/// subranges are then at least 256 wide, so the interval can never collapse to -/// zero width and leave the coder unable to distinguish the two bits. -/// -[TestFixture] -public class ZpaqRangeCoderTests { - - private const uint RangeMin = ZpaqRangeCoder.RangeMinimum; - private const uint MinimumSubrangeWidth = 256; - - /// Ranges that bracket every interesting case of the split arithmetic. - private static IEnumerable InterestingRanges() { - yield return RangeMin; // smallest range the invariant allows - yield return RangeMin + 1; - yield return RangeMin * 2; - yield return 0x7FFFFFFFu; - yield return 0x80000000u; - yield return 0xFFFF0000u; - yield return 0xFFFFFFFFu; // largest range, the initial one - var rng = new Random(0x5EED); - for (var i = 0; i < 512; ++i) - yield return RangeMin + (uint)rng.NextInt64(0, 0xFFFFFFFFL - RangeMin + 1); - } - - /// Probabilities that bracket every interesting case of the split arithmetic. - private static IEnumerable InterestingProbabilities() { - yield return ZpaqRangeCoder.MinimumProbability; - yield return 2; - yield return 255; - yield return 256; - yield return 32768; - yield return 65534; - yield return ZpaqRangeCoder.MaximumProbability; - var rng = new Random(0xC0FFEE); - for (var i = 0; i < 64; ++i) - yield return rng.Next(1, 65536); - } - - // ── The invariant itself ───────────────────────────────────────────────── - - [Test, Category("BoundaryCase")] - public void Split_LeavesBothSubrangesAtLeast256Wide() { - foreach (var range in InterestingRanges()) - foreach (var probability in InterestingProbabilities()) { - var bound = ZpaqRangeCoder.Split(range, probability); - Assert.That( - bound, - Is.GreaterThanOrEqualTo(MinimumSubrangeWidth), - $"the 1 subrange collapsed at range={range}, p={probability}"); - Assert.That( - range - bound, - Is.GreaterThanOrEqualTo(MinimumSubrangeWidth), - $"the 0 subrange collapsed at range={range}, p={probability}"); - Assert.That(bound, Is.LessThan(range)); - } - } - - [Test, Category("EdgeCase")] - public void Split_ClampsProbabilitiesOutsideTheSafeBand() { - // A model that produced 0 or 65536 would otherwise put the split on an end of - // the interval. The clamp is what makes the invariant hold unconditionally. - foreach (var range in new uint[] { RangeMin, 0xFFFFFFFFu }) { - Assert.That(ZpaqRangeCoder.Split(range, 0), Is.EqualTo(ZpaqRangeCoder.Split(range, 1))); - Assert.That(ZpaqRangeCoder.Split(range, -1000), Is.EqualTo(ZpaqRangeCoder.Split(range, 1))); - Assert.That(ZpaqRangeCoder.Split(range, 65536), Is.EqualTo(ZpaqRangeCoder.Split(range, 65535))); - Assert.That(ZpaqRangeCoder.Split(range, int.MaxValue), Is.EqualTo(ZpaqRangeCoder.Split(range, 65535))); - } - } - - [Test, Category("BoundaryCase")] - public void Encoder_KeepsTheRangeNormalisedAfterEveryBit() { - // Coding the least likely bit every time is the fastest way to shrink the - // range, so it is the case that would expose a renormalisation that does not - // actually restore the invariant. - using var output = new MemoryStream(); - var coder = new ZpaqRangeEncoder(output); - for (var i = 0; i < 20000; ++i) { - var probability = i % 2 == 0 ? 1 : 65535; - var bit = i % 2 == 0 ? 1 : 0; // always the improbable one - coder.EncodeBit(bit, probability); - Assert.That(coder.Range, Is.GreaterThanOrEqualTo(RangeMin), $"range collapsed after bit {i}"); - } - coder.Flush(); - } - - [Test, Category("BoundaryCase")] - public void Decoder_KeepsTheRangeNormalisedAndReproducesEveryBit() { - var bits = new int[20000]; - var probabilities = new int[bits.Length]; - var rng = new Random(0xBEEF); - for (var i = 0; i < bits.Length; ++i) { - // Weight heavily towards the extremes, where an interval collapse would show. - probabilities[i] = (i % 3) switch { - 0 => 1, - 1 => 65535, - _ => rng.Next(1, 65536), - }; - bits[i] = rng.Next(2); - } - - using var output = new MemoryStream(); - var encoder = new ZpaqRangeEncoder(output); - for (var i = 0; i < bits.Length; ++i) - encoder.EncodeBit(bits[i], probabilities[i]); - encoder.Flush(); - - var decoder = new ZpaqRangeDecoder(output.ToArray(), 0); - for (var i = 0; i < bits.Length; ++i) { - var bit = decoder.DecodeBit(probabilities[i]); - Assert.That(bit, Is.EqualTo(bits[i]), $"bit {i} decoded wrongly"); - Assert.That(decoder.Range, Is.GreaterThanOrEqualTo(RangeMin), $"range collapsed after bit {i}"); - } - } - - // ── Coding behaviour ───────────────────────────────────────────────────── - - [Test, Category("HappyPath")] - public void ConfidentPredictionsCostAlmostNothing() { - // The lower subrange belongs to a 1 bit, so a confident 1 must be cheap. If the - // convention were reversed the stream would grow instead of shrinking. - using var output = new MemoryStream(); - var coder = new ZpaqRangeEncoder(output); - for (var i = 0; i < 100000; ++i) - coder.EncodeBit(1, 65535); - coder.Flush(); - Assert.That(output.Length, Is.LessThan(100000 / 8)); - } - - [Test, Category("HappyPath")] - public void RandomBitsAtOneHalfCostAboutOneBitEach() { - const int Count = 80000; - var rng = new Random(7); - var bits = new int[Count]; - for (var i = 0; i < Count; ++i) - bits[i] = rng.Next(2); - - using var output = new MemoryStream(); - var encoder = new ZpaqRangeEncoder(output); - foreach (var bit in bits) - encoder.EncodeBit(bit, 32768); - encoder.Flush(); - - Assert.That(output.Length, Is.InRange(Count / 8, Count / 8 + 32)); - - var decoder = new ZpaqRangeDecoder(output.ToArray(), 0); - foreach (var bit in bits) - Assert.That(decoder.DecodeBit(32768), Is.EqualTo(bit)); - } - - [Test, Category("BoundaryCase")] - public void Flush_ResolvesEveryDeferredByteAcrossAllTailStates() { - // The flush is the subtlest part of a carry-counting coder: when the last bytes - // of low are 0xFF they are only counted, not written, and they must still all - // come out. Short messages with extreme probabilities are what put the coder - // into those tail states, so sweep many of them rather than reasoning about one. - var rng = new Random(0xF1005); - for (var trial = 0; trial < 5000; ++trial) { - var count = rng.Next(1, 65); - var bits = new int[count]; - var probabilities = new int[count]; - for (var i = 0; i < count; ++i) { - probabilities[i] = rng.Next(4) switch { - 0 => 1, - 1 => 65535, - 2 => 32768, - _ => rng.Next(1, 65536), - }; - bits[i] = rng.Next(2); - } - - using var output = new MemoryStream(); - var encoder = new ZpaqRangeEncoder(output); - for (var i = 0; i < count; ++i) - encoder.EncodeBit(bits[i], probabilities[i]); - encoder.Flush(); - - var decoder = new ZpaqRangeDecoder(output.ToArray(), 0); - for (var i = 0; i < count; ++i) - Assert.That( - decoder.DecodeBit(probabilities[i]), - Is.EqualTo(bits[i]), - $"trial {trial}, bit {i} of {count} did not survive the flush"); - } - } - - [Test, Category("EdgeCase")] - public void EmptyStream_FlushesFiveBytesAndTheFirstIsTheEmptyCache() { - using var output = new MemoryStream(); - var coder = new ZpaqRangeEncoder(output); - coder.Flush(); - var bytes = output.ToArray(); - Assert.That(bytes, Has.Length.EqualTo(ZpaqRangeCoder.FlushBytes)); - Assert.That(bytes[0], Is.Zero); - } - - // ── Exceptional input ──────────────────────────────────────────────────── - - [Test, Category("Exception")] - public void Encoder_NullStream_Throws() => - Assert.That(() => new ZpaqRangeEncoder(null!), Throws.ArgumentNullException); - - [Test, Category("Exception")] - public void Decoder_NullBuffer_Throws() => - Assert.That(() => new ZpaqRangeDecoder(null!, 0), Throws.ArgumentNullException); - - [Test, Category("EdgeCase")] - public void Decoder_TruncatedStream_PadsWithZeroesInsteadOfFailing() { - // A decoder that ran off the end must stay deterministic rather than throw, - // because the last few bits of a message are pinned by the flush. - var decoder = new ZpaqRangeDecoder([], 0); - Assert.That(() => { - for (var i = 0; i < 1000; ++i) - decoder.DecodeBit(32768); - }, Throws.Nothing); - Assert.That(decoder.Range, Is.GreaterThanOrEqualTo(RangeMin)); - } -} diff --git a/Compression.Tests/Zpaq/ZpaqReferenceVectorTests.cs b/Compression.Tests/Zpaq/ZpaqReferenceVectorTests.cs new file mode 100644 index 000000000..8a05c0bee --- /dev/null +++ b/Compression.Tests/Zpaq/ZpaqReferenceVectorTests.cs @@ -0,0 +1,111 @@ +using System.Reflection; +using System.Security.Cryptography; +using FileFormat.Zpaq; + +namespace Compression.Tests.Zpaq; + +/// +/// Archives written by the reference zpaq 7.15 (see ReferenceVectors/README.md): every version of +/// every archive must list and extract to exactly what manifest.tsv records. +/// +[TestFixture] +public sealed class ZpaqReferenceVectorTests { + private sealed record Row(string Archive, int Version, string Name, long Size, string Sha256); + + private static readonly Lazy Manifest = new(() => { + using var reader = new StreamReader(Open("manifest.tsv")); + return reader.ReadToEnd().Split('\n', StringSplitOptions.RemoveEmptyEntries) + .Select(l => l.TrimEnd('\r')) + .Where(l => l.Length > 0 && !l.StartsWith('#')) + .Select(l => l.Split('\t')) + .Select(f => new Row(f[0], int.Parse(f[1]), f[2], long.Parse(f[3]), f[4])) + .ToArray(); + }); + + private static Stream Open(string name) => + Assembly.GetExecutingAssembly().GetManifestResourceStream($"ZpaqVectors.{name}") + ?? throw new FileNotFoundException($"Embedded zpaq vector '{name}' is missing from the test assembly."); + + private static byte[] Load(string name) { + using var s = Open(name); + using var ms = new MemoryStream(); + s.CopyTo(ms); + return ms.ToArray(); + } + + private static IEnumerable ArchiveVersions() => + Manifest.Value.Select(r => (r.Archive, r.Version)).Distinct() + .Select(v => new TestCaseData(v.Archive, v.Version).SetName($"{v.Archive} v{v.Version}")); + + [Test, Category("ThemVsUs"), TestCaseSource(nameof(ArchiveVersions))] + public void ZpaqArchive_ExtractsToManifest(string archive, int version) { + using var r = new ZpaqReader(new MemoryStream(Load(archive))); + var entries = r.GetEntries(version).ToDictionary(e => e.FileName); + var expected = Manifest.Value.Where(m => m.Archive == archive && m.Version == version).ToArray(); + + Assert.Multiple(() => { + Assert.That(r.Errors, Is.Zero); + foreach (var row in expected) { + Assert.That(entries.ContainsKey(row.Name), $"{row.Name} is listed"); + if (!entries.TryGetValue(row.Name, out var e)) + continue; + if (row.Size < 0) { + Assert.That(e.IsDirectory, $"{row.Name} is a directory"); + continue; + } + var data = r.ExtractBytes(e); + Assert.That(data.LongLength, Is.EqualTo(row.Size), $"{row.Name} size"); + Assert.That(Convert.ToHexStringLower(SHA256.HashData(data)), Is.EqualTo(row.Sha256), $"{row.Name} content"); + if (e.Size >= 0) + Assert.That(e.Size, Is.EqualTo(row.Size), $"{row.Name} listed size"); + } + var files = entries.Values.Where(e => !e.IsDirectory).Select(e => e.FileName); + Assert.That(files, Is.EquivalentTo(expected.Where(m => m.Size >= 0).Select(m => m.Name)), "no extra or missing files"); + }); + } + + [Test, Category("ThemVsUs")] + public void Versions_RecordUpdateAndDeletion() { + using var r = new ZpaqReader(new MemoryStream(Load("versions.zpaq"))); + Assert.Multiple(() => { + Assert.That(r.VersionCount, Is.EqualTo(3)); + Assert.That(r.Entries.Select(e => e.FileName), Does.Not.Contain("v/notes.txt"), "deleted in version 3"); + Assert.That(r.GetEntries(2).Select(e => e.FileName), Does.Contain("v/notes.txt")); + Assert.That(r.Entries.Single(e => e.FileName == "v/a.bin").Version, Is.EqualTo(2)); + Assert.That(r.GetVersionDate(1), Is.LessThan(r.GetVersionDate(3)!.Value)); + }); + } + + [Test, Category("ThemVsUs")] + public void Dedup_SharesFragmentsBetweenIdenticalFiles([Values(0, 1, 2, 3, 4, 5)] int method) { + using var r = new ZpaqReader(new MemoryStream(Load($"set.m{method}.zpaq"))); + var text = r.Entries.Single(e => e.FileName == "set/text.txt"); + var dup = r.Entries.Single(e => e.FileName == "set/dup.txt"); + Assert.That(dup.Fragments, Is.EqualTo(text.Fragments)); + } + + [Test, Category("ThemVsUs")] + public void StreamingArchive_HasNoRecordedSizes() { + using var r = new ZpaqReader(new MemoryStream(Load("stream.zpaq"))); + Assert.Multiple(() => { + Assert.That(r.Entries.Select(e => e.FileName), Is.EquivalentTo(new[] { "st/one.txt", "st/two.bin" })); + Assert.That(r.Entries.Select(e => e.Size), Is.All.EqualTo(-1)); + }); + } + + [Test, Category("ThemVsUs")] + public void Descriptor_ListsAndExtractsZpaqArchive() { + var d = new ZpaqFormatDescriptor(); + var dir = Path.Combine(Path.GetTempPath(), $"cwb_zpaq_ref_{Guid.NewGuid():N}"); + try { + d.Extract(new MemoryStream(Load("set.m3.zpaq")), dir, null, null); + var expected = Manifest.Value.Where(m => m.Archive == "set.m3.zpaq" && m.Size >= 0); + Assert.Multiple(() => { + foreach (var row in expected) + Assert.That(Convert.ToHexStringLower(SHA256.HashData(File.ReadAllBytes(Path.Combine(dir, row.Name)))), Is.EqualTo(row.Sha256), row.Name); + }); + } finally { + try { Directory.Delete(dir, true); } catch { /* best effort */ } + } + } +} diff --git a/Compression.Tests/Zpaq/ZpaqTests.cs b/Compression.Tests/Zpaq/ZpaqTests.cs index 212d274e4..b6f075c32 100644 --- a/Compression.Tests/Zpaq/ZpaqTests.cs +++ b/Compression.Tests/Zpaq/ZpaqTests.cs @@ -1,484 +1,264 @@ -using System.Text; +using Compression.Registry; +using Compression.Tests.Csc; using FileFormat.Zpaq; namespace Compression.Tests.Zpaq; +/// +/// Archive-level behaviour of and . Whether zpaq +/// itself agrees is pinned by (its archives) and +/// (live, both directions). +/// [TestFixture] public class ZpaqTests { - // ── Archive building helpers ───────────────────────────────────────────── - - /// - /// Writes a minimal ZPAQ block header ("zPQ" + level + type) to . - /// - private static void WriteBlockHeader(MemoryStream ms, byte type, byte level = ZpaqConstants.Level1) { - ms.Write(ZpaqConstants.BlockPrefix); - ms.WriteByte(level); - ms.WriteByte(type); - } + private static readonly DateTime When = new(2026, 10, 19, 12, 0, 0, DateTimeKind.Utc); - /// - /// Serialises a ZPAQ level-1 journaling 'c' block payload: - /// 8 bytes transaction FILETIME - /// for each file: attr(1) + name(utf8 NUL) + size(8 LE) - /// 0xFF end-of-block - /// - private static void WriteHeaderPayload( - MemoryStream ms, - long fileTime, - IEnumerable<(string Name, long Size, byte Attr)> files) { - ms.Write(BitConverter.GetBytes(fileTime)); - foreach (var (name, size, attr) in files) { - ms.WriteByte(attr); - ms.Write(Encoding.UTF8.GetBytes(name)); - ms.WriteByte(0); // null terminator - ms.Write(BitConverter.GetBytes(size)); + private static byte[] Write(string method, params (string Name, byte[]? Data)[] entries) { + using var ms = new MemoryStream(); + using (var w = new ZpaqWriter(ms, leaveOpen: true, method) { TransactionDate = When }) { + foreach (var (name, data) in entries) + if (data == null) + w.AddDirectory(name); + else + w.AddFile(name, data); } - ms.WriteByte(0xFF); // end-of-block + return ms.ToArray(); } - /// Converts a UTC to a Windows FILETIME long. - private static long ToFileTime(DateTime utc) => - utc.ToFileTimeUtc(); - - // ── Invalid input ──────────────────────────────────────────────────────── - - [Category("Exception")] - [Test] - public void Constructor_NullStream_ThrowsArgumentNullException() { - Assert.That( - () => new ZpaqReader(null!), - Throws.ArgumentNullException); + private static Dictionary ReadAll(byte[] archive) { + using var r = new ZpaqReader(new MemoryStream(archive)); + return r.Entries.ToDictionary(e => e.FileName, r.ExtractBytes); } - [Category("Exception")] - [Test] - public void Constructor_WriteOnlyStream_ThrowsArgumentException() { - using var ms = new MemoryStream([], writable: true); - var wo = new WriteOnlyStreamWrapper(ms); - Assert.That( - () => new ZpaqReader(wo), - Throws.ArgumentException); + // ── round trips ────────────────────────────────────────────────────────── + + [Test, Category("HappyPath"), Category("RoundTrip")] + public void EveryPredefinedMethod_RoundTripsMixedFiles([Values("0", "1", "2", "3", "4", "5")] string method) { + var text = CscSamples.Text(30_000, 11); + var archive = Write(method, + ("docs/", null), + ("docs/text.txt", text), + ("bin/x86.bin", CscSamples.X86(20_000, 12)), + ("bin/random.bin", CscSamples.RandomBytes(6_000, 13)), + ("table.bin", CscSamples.Table(12_000)), + ("empty.dat", [])); + + var files = ReadAll(archive); + + Assert.Multiple(() => { + Assert.That(files.Keys, Is.EquivalentTo(new[] { "docs/", "docs/text.txt", "bin/x86.bin", "bin/random.bin", "table.bin", "empty.dat" })); + Assert.That(files["docs/text.txt"], Is.EqualTo(text)); + Assert.That(files["bin/x86.bin"], Is.EqualTo(CscSamples.X86(20_000, 12))); + Assert.That(files["bin/random.bin"], Is.EqualTo(CscSamples.RandomBytes(6_000, 13))); + Assert.That(files["table.bin"], Is.EqualTo(CscSamples.Table(12_000))); + Assert.That(files["empty.dat"], Is.Empty); + }); } - [Category("Exception")] - [Test] - public void Constructor_NoZpaqBlocks_ThrowsInvalidDataException() { - var data = "This is not a ZPAQ archive."u8.ToArray(); - using var ms = new MemoryStream(data); - Assert.That( - () => new ZpaqReader(ms), - Throws.InstanceOf()); + [Test, Category("HappyPath"), Category("RoundTrip")] + public void ExplicitMethodStrings_RoundTrip([Values("x4.0ci1.1.1.1.2aw2mm16tst", "x4.3ci1", "x4.7ci1", "x4.2.12.0.7.25.1c0.0.511i2", "x4.6.4.0.3.24c0.0.511", "x4.1.4.0.3.24")] string method) { + var data = CscSamples.Mixed(); + var files = ReadAll(Write(method, ("mixed.bin", data))); + Assert.That(files["mixed.bin"], Is.EqualTo(data)); } - // ── Empty / minimal archives ───────────────────────────────────────────── - - [Category("HappyPath")] - [Test] - public void EmptyHeaderBlock_ProducesNoEntries() { - // A 'c' block with timestamp but no file entries. - using var ms = new MemoryStream(); - WriteBlockHeader(ms, ZpaqConstants.BlockTypeHeader); - WriteHeaderPayload(ms, ToFileTime(new DateTime(2024, 1, 1, 0, 0, 0, DateTimeKind.Utc)), []); - - ms.Position = 0; - using var reader = new ZpaqReader(ms, leaveOpen: true); - Assert.That(reader.Entries, Is.Empty); + [Test, Category("HappyPath")] + public void HigherMethods_CompressTextBetter() { + var text = CscSamples.Text(60_000, 14); + var sizes = new[] { "0", "1", "3", "5" }.Select(m => Write(m, ("t.txt", text)).Length).ToArray(); + Assert.That(sizes, Is.Ordered.Descending); } - [Category("HappyPath")] - [Test] - public void SingleFile_ParsedCorrectly() { - var ts = new DateTime(2023, 6, 15, 12, 0, 0, DateTimeKind.Utc); - var ft = ToFileTime(ts); - - using var ms = new MemoryStream(); - WriteBlockHeader(ms, ZpaqConstants.BlockTypeHeader); - WriteHeaderPayload(ms, ft, [("readme.txt", 42L, 0x20)]); - - ms.Position = 0; - using var reader = new ZpaqReader(ms, leaveOpen: true); - - Assert.That(reader.Entries, Has.Count.EqualTo(1)); - - var entry = reader.Entries[0]; - Assert.That(entry.FileName, Is.EqualTo("readme.txt")); - Assert.That(entry.Size, Is.EqualTo(42L)); - Assert.That(entry.IsDirectory, Is.False); - Assert.That(entry.Version, Is.GreaterThan(0)); - - // Timestamp should be within a 2-second window of the source value. - Assert.That(entry.LastModified, Is.Not.Null); - Assert.That( - Math.Abs((entry.LastModified!.Value.ToUniversalTime() - ts).TotalSeconds), - Is.LessThanOrEqualTo(2)); + // ── deduplication ──────────────────────────────────────────────────────── + + [Test, Category("HappyPath")] + public void IdenticalFiles_AreStoredOnce() { + var data = CscSamples.RandomBytes(50_000, 15); + var one = Write("1", ("a.bin", data)); + var two = Write("1", ("a.bin", data), ("copy/a.bin", data)); + + using var r = new ZpaqReader(new MemoryStream(two)); + var a = r.Entries.Single(e => e.FileName == "a.bin"); + var b = r.Entries.Single(e => e.FileName == "copy/a.bin"); + Assert.Multiple(() => { + Assert.That(two.Length - one.Length, Is.LessThan(400), "the copy costs only its index record"); + Assert.That(b.Fragments, Is.EqualTo(a.Fragments)); + Assert.That(r.ExtractBytes(b), Is.EqualTo(data)); + }); } - [Category("HappyPath")] - [Test] - public void DirectoryEntry_FlaggedCorrectly() { - using var ms = new MemoryStream(); - WriteBlockHeader(ms, ZpaqConstants.BlockTypeHeader); - WriteHeaderPayload(ms, ToFileTime(DateTime.UtcNow), [("subdir/", 0L, 0x10)]); - - ms.Position = 0; - using var reader = new ZpaqReader(ms, leaveOpen: true); - - Assert.That(reader.Entries, Has.Count.EqualTo(1)); - Assert.That(reader.Entries[0].IsDirectory, Is.True); - Assert.That(reader.Entries[0].Size, Is.EqualTo(0L)); + [Test, Category("HappyPath")] + public void SharedContentInsideDifferentFiles_IsDeduplicatedByFragment() { + var common = CscSamples.RandomBytes(300_000, 16); + var x = (byte[])[.. CscSamples.RandomBytes(20_000, 17), .. common]; + var y = (byte[])[.. CscSamples.RandomBytes(30_000, 18), .. common]; + var together = Write("1", ("x", x), ("y", y)).Length; + var apart = Write("1", ("x", x)).Length + Write("1", ("y", y)).Length; + var files = ReadAll(Write("1", ("x", x), ("y", y))); + Assert.Multiple(() => { + Assert.That(together, Is.LessThan(apart - 200_000), "content-defined fragments realign after the differing prefix"); + Assert.That(files["x"], Is.EqualTo(x)); + Assert.That(files["y"], Is.EqualTo(y)); + }); } - [Category("HappyPath")] - [Test] - public void MultipleFilesInOneTransaction_AllParsed() { - using var ms = new MemoryStream(); - WriteBlockHeader(ms, ZpaqConstants.BlockTypeHeader); - WriteHeaderPayload(ms, ToFileTime(DateTime.UtcNow), [ - ("a.txt", 10L, 0x20), - ("b.txt", 20L, 0x20), - ("c.txt", 30L, 0x20), - ]); + // ── boundaries ─────────────────────────────────────────────────────────── - ms.Position = 0; - using var reader = new ZpaqReader(ms, leaveOpen: true); - - Assert.That(reader.Entries, Has.Count.EqualTo(3)); - var names = reader.Entries.Select(e => e.FileName).ToList(); - Assert.That(names, Does.Contain("a.txt")); - Assert.That(names, Does.Contain("b.txt")); - Assert.That(names, Does.Contain("c.txt")); + [Test, Category("BoundaryCase")] + public void FileSizesAroundFragmentLimits_RoundTrip([Values(1, 4095, 4096, 4097, 520_191, 520_192, 520_193, 1_100_000)] int size) { + var data = CscSamples.RandomBytes(size, size); + var files = ReadAll(Write("1", ("f.bin", data))); + Assert.That(files["f.bin"], Is.EqualTo(data)); } - // ── Journaling (multi-transaction) ─────────────────────────────────────── - - [Category("HappyPath")] - [Test] - public void LaterTransaction_SupersedesEarlierForSameFile() { - // Transaction 1: file.txt has size 100. - // Transaction 2: file.txt has size 200 (update). - // Expected: Entries contains size 200. - using var ms = new MemoryStream(); - - WriteBlockHeader(ms, ZpaqConstants.BlockTypeHeader); - WriteHeaderPayload(ms, ToFileTime(new DateTime(2020, 1, 1, 0, 0, 0, DateTimeKind.Utc)), - [("file.txt", 100L, 0x20)]); - - WriteBlockHeader(ms, ZpaqConstants.BlockTypeHeader); - WriteHeaderPayload(ms, ToFileTime(new DateTime(2021, 1, 1, 0, 0, 0, DateTimeKind.Utc)), - [("file.txt", 200L, 0x20)]); - - ms.Position = 0; - using var reader = new ZpaqReader(ms, leaveOpen: true); - - Assert.That(reader.Entries, Has.Count.EqualTo(1)); - Assert.That(reader.Entries[0].Size, Is.EqualTo(200L)); + [Test, Category("BoundaryCase")] + public void DataLargerThanOneBlock_SpansSeveralBlocks() { + // Method 10 = 1 MiB blocks, so 2.5 MiB of incompressible data needs three d blocks. + var data = CscSamples.RandomBytes(2_600_000, 19); + var archive = Write("10", ("big.bin", data)); + var files = ReadAll(archive); + Assert.Multiple(() => { + Assert.That(files["big.bin"], Is.EqualTo(data)); + Assert.That(CountOccurrences(archive, "d0000000"u8.ToArray()), Is.GreaterThanOrEqualTo(3)); + }); } - [Category("HappyPath")] - [Test] - public void TwoTransactions_DifferentFiles_BothPresent() { - using var ms = new MemoryStream(); - - WriteBlockHeader(ms, ZpaqConstants.BlockTypeHeader); - WriteHeaderPayload(ms, ToFileTime(DateTime.UtcNow), [("first.bin", 5L, 0x20)]); - - WriteBlockHeader(ms, ZpaqConstants.BlockTypeHeader); - WriteHeaderPayload(ms, ToFileTime(DateTime.UtcNow), [("second.bin", 7L, 0x20)]); - - ms.Position = 0; - using var reader = new ZpaqReader(ms, leaveOpen: true); - - Assert.That(reader.Entries, Has.Count.EqualTo(2)); + [Test, Category("BoundaryCase")] + public void OnlyDirectories_ProduceAnIndexWithoutDataBlocks() { + var files = ReadAll(Write("1", ("a/", null), ("a/b/", null))); + Assert.That(files.Keys, Is.EquivalentTo(new[] { "a/", "a/b/" })); } - // ── Data block / CompressedSize ────────────────────────────────────────── - - [Category("HappyPath")] - [Test] - public void DataBlock_CompressedSizePopulated() { - const int dataPayloadBytes = 256; - - using var ms = new MemoryStream(); - - // Header block with one file. - WriteBlockHeader(ms, ZpaqConstants.BlockTypeHeader); - WriteHeaderPayload(ms, ToFileTime(DateTime.UtcNow), [("data.bin", 1000L, 0x20)]); - - // Data block with a known-size payload. - WriteBlockHeader(ms, ZpaqConstants.BlockTypeData); - ms.Write(new byte[dataPayloadBytes]); // arbitrary payload - - ms.Position = 0; - using var reader = new ZpaqReader(ms, leaveOpen: true); - - Assert.That(reader.Entries, Has.Count.EqualTo(1)); - // CompressedSize should reflect the data block bytes we wrote. - Assert.That(reader.Entries[0].CompressedSize, Is.GreaterThan(0)); + [Test, Category("BoundaryCase")] + public void NoEntries_WritesNothing_AndEmptyInputReadsAsEmptyArchive() { + var archive = Write("1"); + using var r = new ZpaqReader(new MemoryStream(archive)); + Assert.Multiple(() => { + Assert.That(archive, Is.Empty, "zpaq truncates an update that adds nothing"); + Assert.That(r.Entries, Is.Empty); + Assert.That(r.VersionCount, Is.Zero); + }); } - // ── Extract ────────────────────────────────────────────────────────────── - - [Category("Exception")] - [Test] - public void Extract_WithoutStoredDataBlock_ThrowsNotSupportedException() { - // A header that declares a size but carries no STORED data ('d') block has - // no recoverable bytes (a ZPAQL-compressed block would need a VM), so - // Extract reports the unsupported case rather than returning empty. + [Test, Category("HappyPath")] + public void Utf8Names_AndDates_Survive() { + var stamp = new DateTime(2001, 2, 3, 4, 5, 6, DateTimeKind.Utc); using var ms = new MemoryStream(); - WriteBlockHeader(ms, ZpaqConstants.BlockTypeHeader); - WriteHeaderPayload(ms, ToFileTime(DateTime.UtcNow), [("f.txt", 1L, 0x20)]); - - ms.Position = 0; - using var reader = new ZpaqReader(ms, leaveOpen: true); - - Assert.That(reader.Entries, Has.Count.EqualTo(1)); - Assert.That( - () => reader.Extract(reader.Entries[0]), - Throws.InstanceOf()); + using (var w = new ZpaqWriter(ms, leaveOpen: true) { TransactionDate = When }) + w.AddFile("ünï/cödé ✓.txt", "x"u8.ToArray(), stamp); + using var r = new ZpaqReader(new MemoryStream(ms.ToArray())); + var e = r.Entries.Single(); + Assert.Multiple(() => { + Assert.That(e.FileName, Is.EqualTo("ünï/cödé ✓.txt")); + Assert.That(e.LastModified, Is.EqualTo(stamp)); + Assert.That(r.GetVersionDate(1), Is.EqualTo(When)); + Assert.That(e.Version, Is.EqualTo(1)); + }); } - [Category("HappyPath")] - [Test] - public void Writer_Then_Reader_RoundTripsStoredContent() { - // ZpaqWriter stores data uncompressed in 'd' blocks; ZpaqReader must recover - // the exact bytes for each file it lists (the conversion-matrix contract). - var files = new (string Name, byte[] Data)[] { - ("hello.txt", "hello conversion matrix"u8.ToArray()), - ("data.bin", Enumerable.Range(0, 256).Select(i => (byte)i).ToArray()), - ("big.dat", Enumerable.Range(0, 4096).Select(i => (byte)((i * 31 + 7) & 0xFF)).ToArray()), - }; - - using var ms = new MemoryStream(); - using (var w = new ZpaqWriter(ms, leaveOpen: true)) - foreach (var (name, data) in files) - w.AddFile(name, data); + // ── stream behaviour and errors ────────────────────────────────────────── - ms.Position = 0; - using var reader = new ZpaqReader(ms, leaveOpen: true); - - foreach (var (name, data) in files) { - var entry = reader.Entries.Single(e => e.FileName == name); - using var es = reader.Extract(entry); - using var got = new MemoryStream(); - es.CopyTo(got); - Assert.That(got.ToArray(), Is.EqualTo(data), $"content of '{name}' must round-trip"); - } + [Test, Category("HappyPath")] + public void NonSeekableInput_IsBuffered() { + var archive = Write("1", ("a.txt", "hello"u8.ToArray())); + using var r = new ZpaqReader(new ForwardOnlyStream(archive)); + Assert.That(r.ExtractBytes(r.Entries.Single()), Is.EqualTo("hello"u8.ToArray())); } - // ── Non-seekable stream ────────────────────────────────────────────────── + [Test, Category("Exception")] + public void Constructor_NullStream_Throws() => Assert.That(() => new ZpaqReader(null!), Throws.ArgumentNullException); - [Category("HappyPath")] - [Test] - public void NonSeekableStream_ParsedWithoutError() { - using var ms = new MemoryStream(); - WriteBlockHeader(ms, ZpaqConstants.BlockTypeHeader); - WriteHeaderPayload(ms, ToFileTime(DateTime.UtcNow), [("ns.txt", 99L, 0x20)]); - - ms.Position = 0; - using var nsStream = new NonSeekableStreamWrapper(ms); - using var reader = new ZpaqReader(nsStream, leaveOpen: true); + [Test, Category("Exception")] + public void NotAnArchive_ThrowsInvalidData() => + Assert.That(() => new ZpaqReader(new MemoryStream("This is not a ZPAQ archive."u8.ToArray())), Throws.InstanceOf()); - Assert.That(reader.Entries, Has.Count.EqualTo(1)); - Assert.That(reader.Entries[0].FileName, Is.EqualTo("ns.txt")); - Assert.That(reader.Entries[0].Size, Is.EqualTo(99L)); + [Test, Category("Exception")] + public void EncryptedArchive_IsRefused() { + // An encrypted archive starts with its 32-byte random salt (never '7' or 'z' first). + var salt = Enumerable.Range(1, 64).Select(i => (byte)(i * 37)).ToArray(); + Assert.That(() => new ZpaqReader(new MemoryStream(salt)), Throws.InstanceOf().With.Message.Contains("encrypted")); } - // ── leaveOpen ──────────────────────────────────────────────────────────── - - [Category("HappyPath")] - [Test] - public void LeaveOpen_True_StreamRemainsUsable() { - using var ms = new MemoryStream(); - WriteBlockHeader(ms, ZpaqConstants.BlockTypeHeader); - WriteHeaderPayload(ms, ToFileTime(DateTime.UtcNow), [("keep.txt", 1L, 0x20)]); - ms.Position = 0; - - using (var reader = new ZpaqReader(ms, leaveOpen: true)) { - Assert.That(reader.Entries, Has.Count.EqualTo(1)); - } - - // Stream must still be accessible after reader disposal. - Assert.That(ms.CanRead, Is.True); + [Test, Category("Exception")] + public void CorruptedData_FailsTheFragmentChecksum() { + var data = CscSamples.Text(40_000, 20); + var archive = Write("0", ("t.txt", data)); + // Method 0 stores fragments verbatim, so flipping a byte of the text corrupts content, not structure. + var at = IndexOf(archive, data.AsSpan(1000, 32).ToArray()); + archive[at + 5] ^= 0x20; + using var r = new ZpaqReader(new MemoryStream(archive)); + Assert.That(() => r.ExtractBytes(r.Entries.Single()), Throws.InstanceOf().With.Message.Contains("checksum")); } - [Category("HappyPath")] - [Test] - public void LeaveOpen_False_StreamDisposedWithReader() { - var ms = new MemoryStream(); - WriteBlockHeader(ms, ZpaqConstants.BlockTypeHeader); - WriteHeaderPayload(ms, ToFileTime(DateTime.UtcNow), [("close.txt", 1L, 0x20)]); - ms.Position = 0; - - var reader = new ZpaqReader(ms, leaveOpen: false); - reader.Dispose(); - - Assert.That(ms.CanRead, Is.False); - } - - // ── Prefixed garbage / robustness ──────────────────────────────────────── - - [Category("HappyPath")] - [Test] - public void GarbageBeforeBlock_IgnoredSuccessfully() { - using var ms = new MemoryStream(); - - // Write 200 bytes of noise first. - ms.Write(new byte[200]); - - // Then a valid block. - WriteBlockHeader(ms, ZpaqConstants.BlockTypeHeader); - WriteHeaderPayload(ms, ToFileTime(DateTime.UtcNow), [("after_noise.txt", 7L, 0x20)]); - - ms.Position = 0; - using var reader = new ZpaqReader(ms, leaveOpen: true); - - Assert.That(reader.Entries, Has.Count.EqualTo(1)); - Assert.That(reader.Entries[0].FileName, Is.EqualTo("after_noise.txt")); - } - - [Category("EdgeCase")] - [Test] - public void ZpaqPrefixInPayload_NotMisidentifiedAsNewBlock() { - // The payload of a 'c' block itself contains the bytes "zPQ" — the reader - // must not misidentify that sequence as the start of a new block while - // parsing the payload (the scanner only looks for "zPQ" between blocks). + [Test, Category("Exception")] + public void Writer_RejectsBadArguments() { using var ms = new MemoryStream(); - - WriteBlockHeader(ms, ZpaqConstants.BlockTypeHeader); - - // Build a payload that embeds "zPQ" inside a filename. - var ft = ToFileTime(DateTime.UtcNow); - ms.Write(BitConverter.GetBytes(ft)); - ms.WriteByte(0x20); // attr - ms.Write("file_zPQ_name.txt"u8); - ms.WriteByte(0); // null terminator - ms.Write(BitConverter.GetBytes(55L)); // size - ms.WriteByte(0xFF); // end-of-block - - ms.Position = 0; - using var reader = new ZpaqReader(ms, leaveOpen: true); - - // The entry must be present and its filename must be intact. - Assert.That(reader.Entries, Has.Count.EqualTo(1)); - Assert.That(reader.Entries[0].FileName, Does.Contain("zPQ")); + Assert.Multiple(() => { + Assert.That(() => new ZpaqWriter(ms, true, "q"), Throws.ArgumentException); + Assert.That(() => new ZpaqWriter(ms, true, ""), Throws.ArgumentException); + using var w = new ZpaqWriter(ms, true); + Assert.That(() => w.AddFile("dir/", []), Throws.ArgumentException); + Assert.That(() => w.AddFile(null!, []), Throws.ArgumentNullException); + }); } - // ── Writer round-trip tests ────────────────────────────────────────────── + // ── descriptor ─────────────────────────────────────────────────────────── - [Category("HappyPath")] - [Category("RoundTrip")] - [Test] - public void Writer_RoundTrip_SingleFile() { + [Test, Category("HappyPath")] + public void Descriptor_CreateHonoursLevel_AndListsEntries() { + var d = new ZpaqFormatDescriptor(); + var text = CscSamples.Text(20_000, 21); using var ms = new MemoryStream(); - using (var w = new ZpaqWriter(ms, leaveOpen: true)) - w.AddFile("hello.txt", "Hello, ZPAQ!"u8.ToArray()); - + d.Create(ms, [ArchiveInputInfo.InMemory("a/t.txt", text)], new FormatCreateOptions { Level = 4 }); ms.Position = 0; - using var reader = new ZpaqReader(ms, leaveOpen: true); - Assert.That(reader.Entries, Has.Count.EqualTo(1)); - Assert.That(reader.Entries[0].FileName, Is.EqualTo("hello.txt")); - Assert.That(reader.Entries[0].Size, Is.EqualTo(12)); + var list = d.List(ms, null); + Assert.Multiple(() => { + Assert.That(list.Select(e => e.Name), Is.EqualTo(new[] { "a/t.txt" })); + Assert.That(list[0].OriginalSize, Is.EqualTo(text.Length)); + }); } - [Category("HappyPath")] - [Category("RoundTrip")] - [Test] - public void Writer_RoundTrip_MultipleFiles() { - using var ms = new MemoryStream(); - using (var w = new ZpaqWriter(ms, leaveOpen: true)) { - w.AddFile("a.txt", new byte[100]); - w.AddFile("b.txt", new byte[200]); - } - - ms.Position = 0; - using var reader = new ZpaqReader(ms, leaveOpen: true); - Assert.That(reader.Entries, Has.Count.EqualTo(2)); - var names = reader.Entries.Select(e => e.FileName).ToList(); - Assert.That(names, Does.Contain("a.txt")); - Assert.That(names, Does.Contain("b.txt")); + [Test, Category("Exception")] + public void Descriptor_List_FallsBackInsteadOfThrowing() { + var d = new ZpaqFormatDescriptor(); + var list = d.List(new MemoryStream("7kSt garbage that is not a block"u8.ToArray()), null); + Assert.That(list.Select(e => e.Name), Is.EqualTo(new[] { "FULL.zpaq", "metadata.ini" })); } - [Category("HappyPath")] - [Category("RoundTrip")] - [Test] - public void Writer_RoundTrip_Directory() { - using var ms = new MemoryStream(); - using (var w = new ZpaqWriter(ms, leaveOpen: true)) { - w.AddDirectory("mydir/"); - w.AddFile("mydir/file.txt", [1, 2, 3]); - } - - ms.Position = 0; - using var reader = new ZpaqReader(ms, leaveOpen: true); - var dirs = reader.Entries.Where(e => e.IsDirectory).ToList(); - var files = reader.Entries.Where(e => !e.IsDirectory).ToList(); - Assert.That(dirs, Has.Count.EqualTo(1)); - Assert.That(files, Has.Count.EqualTo(1)); + [Test, Category("HappyPath")] + public void Descriptor_MethodMapping() { + Assert.Multiple(() => { + Assert.That(ZpaqFormatDescriptor.MethodFor(new FormatCreateOptions()), Is.EqualTo("1")); + Assert.That(ZpaqFormatDescriptor.MethodFor(new FormatCreateOptions { Level = 9 }), Is.EqualTo("5")); + Assert.That(ZpaqFormatDescriptor.MethodFor(new FormatCreateOptions("x4.3ci1")), Is.EqualTo("x4.3ci1")); + Assert.That(ZpaqFormatDescriptor.MethodFor(new FormatCreateOptions("zpaq")), Is.EqualTo("1")); + }); } - [Category("HappyPath")] - [Test] - public void Writer_Magic_IsZPQ() { - using var ms = new MemoryStream(); - using (var w = new ZpaqWriter(ms, leaveOpen: true)) - w.AddFile("x", [1]); + private static int IndexOf(byte[] haystack, byte[] needle) => haystack.AsSpan().IndexOf(needle); - ms.Position = 0; - Span magic = stackalloc byte[3]; - ms.ReadExactly(magic); - Assert.That(magic[0], Is.EqualTo((byte)'z')); - Assert.That(magic[1], Is.EqualTo((byte)'P')); - Assert.That(magic[2], Is.EqualTo((byte)'Q')); - } - - // ── Level 2 blocks accepted ─────────────────────────────────────────────── - - [Category("HappyPath")] - [Test] - public void Level2Block_ParsedWithoutError() { - using var ms = new MemoryStream(); - WriteBlockHeader(ms, ZpaqConstants.BlockTypeHeader, ZpaqConstants.Level2); - WriteHeaderPayload(ms, ToFileTime(DateTime.UtcNow), [("v2.txt", 3L, 0x20)]); - - ms.Position = 0; - using var reader = new ZpaqReader(ms, leaveOpen: true); - - Assert.That(reader.Entries, Has.Count.EqualTo(1)); - Assert.That(reader.Entries[0].FileName, Is.EqualTo("v2.txt")); + private static int CountOccurrences(byte[] haystack, byte[] needle) { + var count = 0; + for (var span = haystack.AsSpan(); ;) { + var i = span.IndexOf(needle); + if (i < 0) + return count; + ++count; + span = span[(i + needle.Length)..]; + } } -} -// ── Test stream wrappers ──────────────────────────────────────────────────── - -/// Wraps a stream and exposes it as non-seekable. -internal sealed class NonSeekableStreamWrapper(Stream inner) : Stream { - public override bool CanRead => inner.CanRead; - public override bool CanSeek => false; - public override bool CanWrite => inner.CanWrite; - public override long Length => throw new NotSupportedException(); - public override long Position { - get => throw new NotSupportedException(); - set => throw new NotSupportedException(); + private sealed class ForwardOnlyStream(byte[] data) : Stream { + private readonly MemoryStream _inner = new(data); + public override bool CanRead => true; + public override bool CanSeek => false; + public override bool CanWrite => false; + public override long Length => throw new NotSupportedException(); + public override long Position { get => throw new NotSupportedException(); set => throw new NotSupportedException(); } + public override void Flush() { } + public override int Read(byte[] buffer, int offset, int count) => this._inner.Read(buffer, offset, count); + public override long Seek(long offset, SeekOrigin origin) => throw new NotSupportedException(); + public override void SetLength(long value) => throw new NotSupportedException(); + public override void Write(byte[] buffer, int offset, int count) => throw new NotSupportedException(); } - public override void Flush() => inner.Flush(); - public override int Read(byte[] buffer, int offset, int count) => inner.Read(buffer, offset, count); - public override long Seek(long offset, SeekOrigin origin) => throw new NotSupportedException(); - public override void SetLength(long value) => throw new NotSupportedException(); - public override void Write(byte[] buffer, int offset, int count) => inner.Write(buffer, offset, count); - protected override void Dispose(bool disposing) { if (disposing) inner.Dispose(); base.Dispose(disposing); } -} - -/// Wraps a stream and exposes it as write-only (CanRead = false). -internal sealed class WriteOnlyStreamWrapper(Stream inner) : Stream { - public override bool CanRead => false; - public override bool CanSeek => false; - public override bool CanWrite => true; - public override long Length => throw new NotSupportedException(); - public override long Position { get => throw new NotSupportedException(); set => throw new NotSupportedException(); } - public override void Flush() => inner.Flush(); - public override int Read(byte[] buffer, int offset, int count) => throw new NotSupportedException(); - public override long Seek(long offset, SeekOrigin origin) => throw new NotSupportedException(); - public override void SetLength(long value) => throw new NotSupportedException(); - public override void Write(byte[] buffer, int offset, int count) => inner.Write(buffer, offset, count); - protected override void Dispose(bool disposing) { if (disposing) inner.Dispose(); base.Dispose(disposing); } } diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/THIRD-PARTY-NOTICE.libzpaq.txt b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/THIRD-PARTY-NOTICE.libzpaq.txt new file mode 100644 index 000000000..4e93c232e --- /dev/null +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/THIRD-PARTY-NOTICE.libzpaq.txt @@ -0,0 +1,67 @@ +libzpaq / zpaq 7.15 — converted to C# + +Source: http://mattmahoney.net/dc/zpaq715.zip (zpaq v7.15, Aug 17 2016) +Author: Matt Mahoney +Licence: public domain (The Unlicense, reproduced below) for zpaq.cpp, + libzpaq.h and libzpaq.cpp. The libdivsufsort-lite section of + libzpaq.cpp (MIT) was NOT taken: suffix arrays are built by + ZpaqSuffixArray.cs, an SA-IS implementation written from the + Nong/Zhang/Chan paper. A suffix array is unique, so the BWT and + LZ77 output is unchanged. +Spec: The ZPAQ Open Standard Format for Highly Compressed Data, Level 2, + http://mattmahoney.net/dc/zpaq206.pdf + +The files in this directory are a conversion into this codebase, not a +verbatim copy: + + libzpaq.cpp ZPAQL (interpreter) -> ZpaqlMachine.cs + libzpaq.cpp Predictor (interpreter) -> ZpaqPredictor.cs + libzpaq.cpp Decoder, Encoder, + PostProcessor -> ZpaqCoder.cs + libzpaq.cpp Decompresser -> ZpaqDecompresser.cs + libzpaq.cpp Compiler -> ZpaqCompiler.cs + libzpaq.cpp Compressor -> ZpaqCompressor.cs + libzpaq.cpp makeConfig, compressBlock, + e8e9 -> ZpaqMethods.cs + libzpaq.cpp LZBuffer -> ZpaqLzBuffer.cs + libzpaq.cpp StringBuffer, SHA1 use -> ZpaqIo.cs + zpaq.cpp Jidac::read_archive, + extract -> ZpaqReader.cs + zpaq.cpp Jidac::add -> ZpaqWriter.cs + +Constant tables (bit-history state table, CM/MATCH divisor tables, squash +and stretch tables, the add() analysis divisor table, the locator tag, the +ZPAQL opcode list and the generated ZPAQL programs for methods 0..5) are +copied exactly, as the format requires. + +Not converted: the x86/x64 JIT, AES-256 encryption and scrypt key stretching +(encrypted archives are refused), multi-part and index (-index) archives, +and appending a new version to an existing archive (the writer emits a +single-version archive; modify rebuilds it). + +--------------------------------------------------------------------- + +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqBuildingBlock.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqBuildingBlock.cs index e92e1d9a0..b297e0fcb 100644 --- a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqBuildingBlock.cs +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqBuildingBlock.cs @@ -1,238 +1,63 @@ -using System.Buffers.Binary; using Compression.Registry; namespace FileFormat.Zpaq; /// -/// Exposes the ZPAQ context-mixing codec — the compression stage that the ZPAQ -/// journaling archiver wraps — as a benchmarkable building block. -/// Prepends a 4-byte LE uncompressed size header for round-trip support. +/// ZPAQ compression as a building block: the input coded as a plain ZPAQ stream (locator tag, +/// blocks of one segment, SHA-1 trailers) with zpaq's method 4 — an order-0 ICM, an ISSE chain +/// up to order 6, a match model and a mixer, all described in the block's own ZPAQL header. /// /// -/// -/// ZPAQ (Matt Mahoney, "The ZPAQ Open Standard Format for Highly Compressed Data") -/// codes one bit at a time: an array of prediction components supplies a probability -/// for the next bit, a binary arithmetic coder codes the bit against that probability, -/// and a ZPAQL bytecode program (HCOMP) recomputes the context hashes in H[] after -/// every whole byte. runs the program and the components, -/// and do the coding, -/// and this block supplies one concrete configuration and drives the loop. -/// -/// -/// The configuration is four direct context models over hashed orders 1 to 4, built -/// by the HCOMP program in . Per the format, the component context -/// is refined with the bits of the partly coded byte before each bit is coded; that -/// refinement belongs to the predictor rather than to HCOMP, so it is applied here. -/// -/// -/// The wire format is a 4-byte little-endian uncompressed length followed by the -/// coded bytes. An empty message is the header alone. The decoder learns how many -/// bytes to produce from the header, so the coded stream carries no end marker. -/// -/// -/// This is one configuration among the many the format allows, and it combines the -/// component predictions the way does, by averaging -/// rather than through a mixer chain. It is therefore a ZPAQ-model codec, not a -/// bit-exact producer of any particular reference archive's streams. -/// -/// -/// This block is the codec only. It is deliberately not the archive container: -/// and model the journaling archive -/// (transactions, filenames, timestamps, SHA-1 index) and store their payloads -/// verbatim, so they carry no compression stage of their own to expose. Deduplication -/// and versioning, which the real container layers on top of those, are likewise not -/// implemented. -/// +/// The output is what libzpaq's compress(in, out, "4") produces and any ZPAQ Level 2 +/// decoder (zpaq x, unzpaq) reads; accepts any ZPAQ stream, +/// whatever its method. Blocks hold at most 16 MiB - 4 KiB each, as in libzpaq. /// public sealed class ZpaqBuildingBlock : IBuildingBlock { - - /// Number of context models, one per hashed order 1..4. - private const int ComponentCount = 4; - - /// Log2 of the counter table size of each context model. - private const int ContextModelBits = 16; - - /// Counter adaptation rate of each context model. - private const int ContextModelRate = 4; - - /// Log2 of the H[] context array size. Must cover . - private const int HashArrayBits = 3; - - /// Log2 of the M[] history buffer size used by the HCOMP program. - private const int HistoryBufferBits = 16; - - /// Size of the uncompressed-length header, in bytes. - private const int SizeHeaderBytes = 4; - - /// Odd multiplier that spreads the partly coded byte across the low context bits. - private const uint PartialByteMultiplier = 0x9E3779B1; - - /// - /// HCOMP program: hashes orders 1 to 4 of the byte history into H[0..3]. - /// - /// - /// On entry the ZPAQL A register holds the byte just coded, and R[0] is the write - /// cursor into the M[] history buffer. Each order reaches one byte further back and - /// folds it into the previous order's hash with the HASH instruction - /// (A = (A + M[B] + 512) * 773), so order n hashes the last n bytes. - /// - /// R1=A A=R0 B=A A=R1 *B=A A=R0 A++ R0=A ; M[pos++] = byte - /// A=R0 A-=1 B=A A=0 HASH H0=A ; order 1 - /// A=R0 A-=2 B=A A=H0 HASH H1=A ; order 2 - /// A=R0 A-=3 B=A A=H1 HASH H2=A ; order 3 - /// A=R0 A-=4 B=A A=H2 HASH H3=A ; order 4 - /// HALT - /// - /// - private static ReadOnlySpan Hcomp => [ - // Append the byte to the history buffer and advance the cursor. - 48, 1, // R[1] = A - 49, 0, // A = R[0] - 6, // B = A - 49, 1, // A = R[1] - 9, // M[B] = A - 49, 0, // A = R[0] - 2, // A++ - 48, 0, // R[0] = A - - // Order 1: hash of M[pos-1] alone. - 49, 0, 3, 6, // A = R[0]; A -= 1; B = A - 5, // A = 0 - 225, // HASH - 82, 0, // H[0] = A - - // Order 2: the order-1 hash folded with M[pos-2]. - 49, 0, 3, 3, 6, // A = R[0]; A -= 2; B = A - 83, 0, // A = H[0] - 225, // HASH - 82, 1, // H[1] = A - - // Order 3: the order-2 hash folded with M[pos-3]. - 49, 0, 3, 3, 3, 6, - 83, 1, // A = H[1] - 225, // HASH - 82, 2, // H[2] = A - - // Order 4: the order-3 hash folded with M[pos-4]. - 49, 0, 3, 3, 3, 3, 6, - 83, 2, // A = H[2] - 225, // HASH - 82, 3, // H[3] = A - - 0, // HALT - ]; + private const string Method = "4"; + private const int BlockSize = (1 << 24) - 4096; /// public string Id => "BB_Zpaq"; /// public string DisplayName => "ZPAQ"; /// - public string Description => "ZPAQ context-mixing model over hashed orders 1-4, contexts built by the ZPAQL virtual machine, coded bit by bit by a carry-propagating binary range coder"; + public string Description => "ZPAQ Level 2 stream, method 4: ICM + ISSE chain + match model + mixer, contexts computed by the block's ZPAQL program"; /// public AlgorithmFamily Family => AlgorithmFamily.ContextMixing; /// public byte[] Compress(ReadOnlySpan data) { - var output = new MemoryStream(); - Span header = stackalloc byte[SizeHeaderBytes]; - BinaryPrimitives.WriteInt32LittleEndian(header, data.Length); - output.Write(header); - - if (data.Length == 0) - return output.ToArray(); - - var vm = CreateVm(); - var contexts = new uint[ComponentCount]; - var coder = new ZpaqRangeEncoder(output); - - foreach (var value in data) { - var partial = 1; - for (var shift = 7; shift >= 0; --shift) { - var bit = (value >> shift) & 1; - ApplyContexts(vm, contexts, partial); - coder.EncodeBit(bit, vm.Predict()); - vm.Update(bit); - partial = (partial << 1) | bit; - } - - vm.RunHcomp(value); - CaptureContexts(vm, contexts); + var output = new ZpaqBuffer(); + for (var offset = 0; offset < data.Length; offset += BlockSize) { + var chunk = new ZpaqBuffer(data.Slice(offset, Math.Min(BlockSize, data.Length - offset))); + ZpaqMethods.CompressBlock(chunk, output, Method, storeSha1: true); } - - coder.Flush(); return output.ToArray(); } /// - public byte[] Decompress(ReadOnlySpan data) { - var originalSize = BinaryPrimitives.ReadInt32LittleEndian(data); - if (originalSize == 0) - return []; - - var payload = data[SizeHeaderBytes..].ToArray(); - var coder = new ZpaqRangeDecoder(payload, 0); - - var vm = CreateVm(); - var contexts = new uint[ComponentCount]; - var result = new byte[originalSize]; + public byte[] Decompress(ReadOnlySpan data) => ZpaqStream.Decompress(data); +} - for (var index = 0; index < result.Length; ++index) { - var partial = 1; - for (var shift = 7; shift >= 0; --shift) { - ApplyContexts(vm, contexts, partial); - var bit = coder.DecodeBit(vm.Predict()); - vm.Update(bit); - partial = (partial << 1) | bit; +/// Decodes a whole ZPAQ stream (all blocks and segments, filenames and comments ignored). +internal static class ZpaqStream { + /// Concatenates the decoded data of every segment, verifying stored SHA-1 trailers. + public static byte[] Decompress(ReadOnlySpan data) { + var input = new ZpaqBuffer(data); + var output = new ZpaqBuffer(); + var d = new ZpaqDecompresser(input); + d.SetOutput(output); + while (d.FindBlock()) { + while (d.FindFilename() != null) { + d.ReadComment(); + var sha1 = new ZpaqSha1(); + d.SetSha1(sha1); + d.Decompress(); + var stored = d.ReadSegmentEnd(); + if (stored != null && !stored.AsSpan().SequenceEqual(sha1.Result())) + ZpaqError.Throw("segment checksum failed"); } - - var value = (byte)partial; - result[index] = value; - vm.RunHcomp(value); - CaptureContexts(vm, contexts); } - - return result; - } - - /// - /// Builds the VM for one message: four context models fed by . - /// - private static ZpaqlVm CreateVm() { - var components = new Component[ComponentCount]; - for (var i = 0; i < components.Length; ++i) - components[i] = new Component { - Type = ComponentType.Cm, - Param1 = ContextModelBits, - Param2 = ContextModelRate, - }; - - return new ZpaqlVm(Hcomp.ToArray(), [], HashArrayBits, HistoryBufferBits, components); - } - - /// - /// Records the per-byte context hashes the HCOMP program has just written, so - /// they can be re-derived for each bit of the next byte. - /// - private static void CaptureContexts(ZpaqlVm vm, uint[] contexts) { - for (var i = 0; i < contexts.Length; ++i) - contexts[i] = vm.H[i]; - } - - /// - /// Refines each component's context with the bits of the partly coded byte. - /// - /// - /// The multiplier is odd, so within one model no two prefixes of the same byte - /// can land on the same counter. The component then indexes its table by the low - /// bits of the offset hash; those bits are the same - /// whether or not the sum is first reduced modulo 2^32, because the table size - /// divides 2^32. - /// - /// The VM whose H[] array supplies the component contexts. - /// The per-byte hashes captured by . - /// The bits coded so far in the current byte, preceded by a leading 1. - private static void ApplyContexts(ZpaqlVm vm, uint[] contexts, int partial) { - for (var i = 0; i < contexts.Length; ++i) - vm.H[i] = contexts[i] + (uint)partial * PartialByteMultiplier; + return output.ToArray(); } } diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqCoder.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqCoder.cs new file mode 100644 index 000000000..2244a634d --- /dev/null +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqCoder.cs @@ -0,0 +1,271 @@ +namespace FileFormat.Zpaq; + +/// Arithmetic decoder of a ZPAQ segment (or the stored-block reader for unmodeled blocks). +/// Converted from libzpaq 7.15 (Matt Mahoney, public domain), class Decoder. +internal sealed class ZpaqDecoder : IZpaqReader { + private const int BufferSize = 1 << 16; + private readonly byte[] _buf = new byte[BufferSize]; + private readonly ZpaqPredictor _pr; + private uint _low = 1, _high = 0xFFFFFFFF, _curr; + private int _rpos, _wpos; + + /// Compressed input. + public IZpaqReader? In; + + /// Creates a decoder for the block held by . + public ZpaqDecoder(ZpaqlMachine z) => this._pr = new(z); + + /// Bytes read ahead from but not consumed yet. + public int Buffered => this._wpos - this._rpos; + + /// Discards the read-ahead (after the caller repositioned ). + public void DiscardBuffer() => this._rpos = this._wpos = 0; + + /// + public int Get() { + if (this._rpos == this._wpos) { + this._rpos = 0; + this._wpos = this.In?.Read(this._buf) ?? 0; + } + return this._rpos < this._wpos ? this._buf[this._rpos++] : -1; + } + + /// Initialises the model at the start of a block. + public void Init() { + this._pr.Init(); + if (this._pr.IsModeled) { + this._low = 1; + this._high = 0xFFFFFFFF; + this._curr = 0; + } else + this._low = this._high = this._curr = 0; + } + + /// Returns the next decoded byte, or -1 at the end of the segment. + public int Decompress() { + if (this._pr.IsModeled) { + if (this._curr == 0) + for (var i = 0; i < 4; ++i) + this._curr = this._curr << 8 | (uint)this.Get(); + if (this.Decode(0) != 0) { + if (this._curr != 0) + ZpaqError.Throw("decoding end of stream"); + return -1; + } + var c = 1; + while (c < 256) { + var p = this._pr.Predict() * 2 + 1; + c += c + this.Decode(p); + this._pr.Update(c & 1); + } + return c - 256; + } + + if (this._curr == 0) { + for (var i = 0; i < 4; ++i) + this._curr = this._curr << 8 | (uint)this.Get(); + if (this._curr == 0) + return -1; + } + --this._curr; + return this.Get(); + } + + /// Skips to the end of the compressed segment and returns the byte after it. + public int Skip() { + var c = -1; + if (this._pr.IsModeled) { + while (this._curr == 0) + this._curr = (uint)this.Get(); + while (this._curr != 0 && (c = this.Get()) >= 0) + this._curr = this._curr << 8 | (uint)c; + while ((c = this.Get()) == 0) { } + return c; + } + if (this._curr == 0) + for (var i = 0; i < 4 && (c = this.Get()) >= 0; ++i) + this._curr = this._curr << 8 | (uint)c; + while (this._curr > 0) { + while (this._curr > 0) { + --this._curr; + if (this.Get() < 0) + ZpaqError.Throw("skipped to EOF"); + } + for (var i = 0; i < 4 && (c = this.Get()) >= 0; ++i) + this._curr = this._curr << 8 | (uint)c; + } + if (c >= 0) + c = this.Get(); + return c; + } + + private int Decode(int p) { + if (this._curr < this._low || this._curr > this._high) + ZpaqError.Throw("archive corrupted"); + var mid = this._low + (uint)(((ulong)(this._high - this._low) * (uint)p) >> 16); + int y; + if (this._curr <= mid) { + y = 1; + this._high = mid; + } else { + y = 0; + this._low = mid + 1; + } + while ((this._high ^ this._low) < 0x1000000) { + this._high = this._high << 8 | 255; + this._low <<= 8; + if (this._low == 0) + this._low = 1; + var c = this.Get(); + if (c < 0) + ZpaqError.Throw("unexpected end of file"); + this._curr = this._curr << 8 | (uint)c; + } + return y; + } +} + +/// Arithmetic encoder of a ZPAQ segment (or the stored-block writer for unmodeled blocks). +/// Converted from libzpaq 7.15 (Matt Mahoney, public domain), class Encoder. +internal sealed class ZpaqEncoder { + private readonly ZpaqPredictor _pr; + private uint _low = 1, _high = 0xFFFFFFFF; + private byte[] _buf = []; + + /// Compressed output. + public IZpaqWriter Out = ZpaqNullWriter.Instance; + + /// Creates an encoder for the block held by . + public ZpaqEncoder(ZpaqlMachine z) => this._pr = new(z); + + /// Initialises the model at the start of a block. + public void Init() { + this._low = 1; + this._high = 0xFFFFFFFF; + this._pr.Init(); + if (!this._pr.IsModeled) { + this._low = 0; + this._buf = new byte[1 << 16]; + } + } + + /// Encodes byte (0..255) or the end of segment (-1). + public void Compress(int c) { + if (this._pr.IsModeled) { + if (c == -1) + this.Encode(1, 0); + else { + this.Encode(0, 0); + for (var i = 7; i >= 0; --i) { + var p = this._pr.Predict() * 2 + 1; + var y = c >> i & 1; + this.Encode(y, p); + this._pr.Update(y); + } + } + return; + } + if (this._low != 0 && (c < 0 || this._low == this._buf.Length)) { + this.Out.Put((int)(this._low >> 24) & 255); + this.Out.Put((int)(this._low >> 16) & 255); + this.Out.Put((int)(this._low >> 8) & 255); + this.Out.Put((int)this._low & 255); + this.Out.Write(this._buf.AsSpan(0, (int)this._low)); + this._low = 0; + } + if (c >= 0) + this._buf[this._low++] = (byte)c; + } + + private void Encode(int y, int p) { + var mid = this._low + (uint)(((ulong)(this._high - this._low) * (uint)p) >> 16); + if (y != 0) + this._high = mid; + else + this._low = mid + 1; + while ((this._high ^ this._low) < 0x1000000) { + this.Out.Put((int)(this._high >> 24)); + this._high = this._high << 8 | 255; + this._low <<= 8; + if (this._low == 0) + this._low = 1; + } + } +} + +/// Runs the PCOMP post-processor (if any) over the decoded bytes of a block. +/// Converted from libzpaq 7.15 (Matt Mahoney, public domain), class PostProcessor. +internal sealed class ZpaqPostProcessor { + private int _state; + private int _hsize; + private int _ph, _pm; + + /// The PCOMP machine. + public readonly ZpaqlMachine Z = new(); + + /// Current parse state: 0 = initial, 1 = pass-through, 2..4 = loading PCOMP, 5 = running PCOMP. + public int State => this._state; + + /// Resets for a new block with PCOMP array sizes and . + public void Init(int h, int m) { + this._state = this._hsize = 0; + this._ph = h; + this._pm = m; + this.Z.Clear(); + } + + /// Feeds one decoded byte (or -1 at end of segment) and returns the new state. + public int Write(int c) { + switch (this._state) { + case 0: + if (c < 0) + ZpaqError.Throw("unexpected EOS"); + this._state = c + 1; + if (this._state > 2) + ZpaqError.Throw("unknown post processing type"); + if (this._state == 1) + this.Z.Clear(); + break; + case 1: + this.Z.OutC(c); + break; + case 2: + if (c < 0) + ZpaqError.Throw("unexpected EOS"); + this._hsize = c; + this._state = 3; + break; + case 3: + if (c < 0) + ZpaqError.Throw("unexpected EOS"); + this._hsize += c * 256; + if (this._hsize < 1) + ZpaqError.Throw("empty PCOMP"); + this.Z.Header = new byte[this._hsize + 300]; + this.Z.Cend = 8; + this.Z.Hbegin = this.Z.Hend = this.Z.Cend + 128; + this.Z.Header[4] = (byte)this._ph; + this.Z.Header[5] = (byte)this._pm; + this._state = 4; + break; + case 4: + if (c < 0) + ZpaqError.Throw("unexpected EOS"); + this.Z.Header[this.Z.Hend++] = (byte)c; + if (this.Z.Hend - this.Z.Hbegin == this._hsize) { + this._hsize = this.Z.Cend - 2 + this.Z.Hend - this.Z.Hbegin; + this.Z.Header[0] = (byte)this._hsize; + this.Z.Header[1] = (byte)(this._hsize >> 8); + this.Z.InitPcomp(); + this._state = 5; + } + break; + case 5: + this.Z.Run((uint)c); + if (c < 0) + this.Z.Flush(); + break; + } + return this._state; + } +} diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqCompiler.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqCompiler.cs new file mode 100644 index 000000000..ec174ebf2 --- /dev/null +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqCompiler.cs @@ -0,0 +1,331 @@ +namespace FileFormat.Zpaq; + +/// +/// Compiles a ZPAQL configuration (comp ... hcomp ... [pcomp ... ;] ... end) into the +/// COMP/HCOMP header of one machine and the PCOMP code of another. +/// +/// Converted from libzpaq 7.15 (Matt Mahoney, public domain), class Compiler. +internal sealed class ZpaqCompiler { + private const int Jt = 39, Jf = 47, Jmp = 63, Lj = 255; + private const int Post = 256, Pcomp = 257, End = 258, If = 259, IfNot = 260, Else = 261, EndIf = 262, Do = 263, + While = 264, Until = 265, Forever = 266, IfL = 267, IfNotL = 268, ElseL = 269; + + private static readonly string?[] ComponentNames = ["", "const", "cm", "icm", "match", "avg", "mix2", "mix", "isse", "sse", null]; + + private static readonly string?[] OpcodeList = [ + "error", "a++", "a--", "a!", "a=0", "", "", "a=r", + "b<>a", "b++", "b--", "b!", "b=0", "", "", "b=r", + "c<>a", "c++", "c--", "c!", "c=0", "", "", "c=r", + "d<>a", "d++", "d--", "d!", "d=0", "", "", "d=r", + "*b<>a", "*b++", "*b--", "*b!", "*b=0", "", "", "jt", + "*c<>a", "*c++", "*c--", "*c!", "*c=0", "", "", "jf", + "*d<>a", "*d++", "*d--", "*d!", "*d=0", "", "", "r=a", + "halt", "out", "", "hash", "hashd", "", "", "jmp", + "a=a", "a=b", "a=c", "a=d", "a=*b", "a=*c", "a=*d", "a=", + "b=a", "b=b", "b=c", "b=d", "b=*b", "b=*c", "b=*d", "b=", + "c=a", "c=b", "c=c", "c=d", "c=*b", "c=*c", "c=*d", "c=", + "d=a", "d=b", "d=c", "d=d", "d=*b", "d=*c", "d=*d", "d=", + "*b=a", "*b=b", "*b=c", "*b=d", "*b=*b", "*b=*c", "*b=*d", "*b=", + "*c=a", "*c=b", "*c=c", "*c=d", "*c=*b", "*c=*c", "*c=*d", "*c=", + "*d=a", "*d=b", "*d=c", "*d=d", "*d=*b", "*d=*c", "*d=*d", "*d=", + "", "", "", "", "", "", "", "", + "a+=a", "a+=b", "a+=c", "a+=d", "a+=*b", "a+=*c", "a+=*d", "a+=", + "a-=a", "a-=b", "a-=c", "a-=d", "a-=*b", "a-=*c", "a-=*d", "a-=", + "a*=a", "a*=b", "a*=c", "a*=d", "a*=*b", "a*=*c", "a*=*d", "a*=", + "a/=a", "a/=b", "a/=c", "a/=d", "a/=*b", "a/=*c", "a/=*d", "a/=", + "a%=a", "a%=b", "a%=c", "a%=d", "a%=*b", "a%=*c", "a%=*d", "a%=", + "a&=a", "a&=b", "a&=c", "a&=d", "a&=*b", "a&=*c", "a&=*d", "a&=", + "a&~a", "a&~b", "a&~c", "a&~d", "a&~*b", "a&~*c", "a&~*d", "a&~", + "a|=a", "a|=b", "a|=c", "a|=d", "a|=*b", "a|=*c", "a|=*d", "a|=", + "a^=a", "a^=b", "a^=c", "a^=d", "a^=*b", "a^=*c", "a^=*d", "a^=", + "a<<=a", "a<<=b", "a<<=c", "a<<=d", "a<<=*b", "a<<=*c", "a<<=*d", "a<<=", + "a>>=a", "a>>=b", "a>>=c", "a>>=d", "a>>=*b", "a>>=*c", "a>>=*d", "a>>=", + "a==a", "a==b", "a==c", "a==d", "a==*b", "a==*c", "a==*d", "a==", + "aa", "a>b", "a>c", "a>d", "a>*b", "a>*c", "a>*d", "a>", + "", "", "", "", "", "", "", "", + "", "", "", "", "", "", "", "lj", + "post", "pcomp", "end", "if", "ifnot", "else", "endif", "do", + "while", "until", "forever", "ifl", "ifnotl", "elsel", ";", null, + ]; + + private readonly string _in; + private int _pos; + private readonly int[] _args; + private int _line = 1; + private int _state; + private readonly Stack _ifStack = new(); + private readonly Stack _doStack = new(); + + /// The text between pcomp and ;: the preprocessor command the configuration names. + public string PcompCommand { get; private set; } = ""; + + /// + /// Compiles , substituting $1..$9 from , + /// into (COMP + HCOMP) and (PCOMP). + /// + public ZpaqCompiler(string config, int[]? args, ZpaqlMachine hz, ZpaqlMachine pz) { + this._in = config; + this._args = args ?? new int[9]; + hz.Clear(); + pz.Clear(); + hz.Header = new byte[68000]; + + this.ReadToken("comp"); + hz.Header[2] = (byte)this.ReadNumber(0, 255); + hz.Header[3] = (byte)this.ReadNumber(0, 255); + hz.Header[4] = (byte)this.ReadNumber(0, 255); + hz.Header[5] = (byte)this.ReadNumber(0, 255); + var n = this.ReadNumber(0, 255); + hz.Header[6] = (byte)n; + hz.Cend = 7; + for (var i = 0; i < n; ++i) { + this.ReadNumber(i, i); + var type = this.ReadToken(ComponentNames); + hz.Header[hz.Cend++] = (byte)type; + var clen = type < ZpaqlMachine.ComponentSize.Length ? ZpaqlMachine.ComponentSize[type] : 0; + if (clen is < 1 or > 10) + this.SyntaxError("invalid component"); + for (var j = 1; j < clen; ++j) + hz.Header[hz.Cend++] = (byte)this.ReadNumber(0, 255); + } + ++hz.Cend; + hz.Hbegin = hz.Hend = hz.Cend + 128; + + this.ReadToken("hcomp"); + var op = this.CompileComp(hz); + + var hsize = hz.Cend - 2 + hz.Hend - hz.Hbegin; + hz.Header[0] = (byte)hsize; + hz.Header[1] = (byte)(hsize >> 8); + + if (op == Post) { + this.ReadNumber(0, 0); + this.ReadToken("end"); + } else if (op == Pcomp) { + pz.Header = new byte[68000]; + pz.Header[4] = hz.Header[4]; + pz.Header[5] = hz.Header[5]; + pz.Cend = 8; + pz.Hbegin = pz.Hend = pz.Cend + 128; + + this.Next(); + var start = this._pos; + while (this._pos < this._in.Length && this._in[this._pos] != ';') + ++this._pos; + this.PcompCommand = this._in[start..this._pos]; + if (this._pos < this._in.Length) + ++this._pos; + + op = this.CompileComp(pz); + var len = pz.Cend - 2 + pz.Hend - pz.Hbegin; + pz.Header[0] = (byte)len; + pz.Header[1] = (byte)(len >> 8); + if (op != End) + this.SyntaxError("expected END"); + } else if (op != End) + this.SyntaxError("expected END or POST 0 END or PCOMP cmd ; ... END"); + } + + private char Cur => this._pos < this._in.Length ? this._in[this._pos] : '\0'; + + private char At(int offset) => this._pos + offset < this._in.Length ? this._in[this._pos + offset] : '\0'; + + private void Next() { + for (; this._pos < this._in.Length; ++this._pos) { + var ch = this._in[this._pos]; + if (ch == '\n') + ++this._line; + if (ch == '(') + this._state += 1 + (this._state < 0 ? 1 : 0); + else if (this._state > 0 && ch == ')') + --this._state; + else if (this._state < 0 && ch <= ' ') + this._state = 0; + else if (this._state == 0 && ch > ' ') { + this._state = -1; + break; + } + } + if (this._pos >= this._in.Length) + ZpaqError.Throw("unexpected end of config"); + } + + private static char Lower(char c) => c is >= 'A' and <= 'Z' ? (char)(c + 'a' - 'A') : c; + + private bool MatchToken(string word) { + var a = this._pos; + var w = 0; + for (; a < this._in.Length && this._in[a] > ' ' && this._in[a] != '(' && w < word.Length; ++a, ++w) + if (Lower(this._in[a]) != Lower(word[w])) + return false; + var next = a < this._in.Length ? this._in[a] : '\0'; + return w == word.Length && (next <= ' ' || next == '('); + } + + [System.Diagnostics.CodeAnalysis.DoesNotReturn] + private void SyntaxError(string message, string? expected = null) { + var token = new string(this._in.AsSpan(this._pos).ToArray().TakeWhile(c => c > ' ').Take(40).ToArray()); + ZpaqError.Throw($"config line {this._line} at {token}: {message}" + (expected != null ? ", expected: " + expected : "")); + } + + private int ReadToken(string?[] list) { + this.Next(); + for (var i = 0; list[i] != null; ++i) + if (this.MatchToken(list[i]!)) + return i; + this.SyntaxError("unexpected"); + return -1; + } + + private void ReadToken(string s) { + this.Next(); + if (!this.MatchToken(s)) + this.SyntaxError("expected", s); + } + + private int ReadNumber(int low, int high) { + this.Next(); + var r = 0; + if (this.Cur == '$' && this.At(1) is >= '1' and <= '9') { + if (this.At(2) == '+') + r = Atoi(this._in, this._pos + 3); + r += this._args[this.At(1) - '1']; + } else if (this.Cur == '-' || char.IsAsciiDigit(this.Cur)) + r = Atoi(this._in, this._pos); + else + this.SyntaxError("expected a number"); + if (r < low) + this.SyntaxError("number too low"); + if (r > high) + this.SyntaxError("number too high"); + return r; + } + + /// C atoi: optional sign, then decimal digits up to the first non-digit. + private static int Atoi(string s, int i) { + var negative = false; + if (i < s.Length && (s[i] == '-' || s[i] == '+')) { + negative = s[i] == '-'; + ++i; + } + var r = 0; + for (; i < s.Length && char.IsAsciiDigit(s[i]); ++i) + r = r * 10 + s[i] - '0'; + return negative ? -r : r; + } + + private int CompileComp(ZpaqlMachine z) { + int op; + var compBegin = z.Hend; + var header = z.Header; + while (true) { + op = this.ReadToken(OpcodeList); + if (op is Post or Pcomp or End) + break; + var operand = -1; + var operand2 = -1; + if (op == If) { + op = Jf; + operand = 0; + this._ifStack.Push(z.Hend + 1); + } else if (op == IfNot) { + op = Jt; + operand = 0; + this._ifStack.Push(z.Hend + 1); + } else if (op is IfL or IfNotL) { + if (op == IfL) + header[z.Hend++] = Jt; + if (op == IfNotL) + header[z.Hend++] = Jf; + header[z.Hend++] = 3; + op = Lj; + operand = operand2 = 0; + this._ifStack.Push(z.Hend + 1); + } else if (op is Else or ElseL) { + if (op == Else) { + op = Jmp; + operand = 0; + } + if (op == ElseL) { + op = Lj; + operand = operand2 = 0; + } + var a = this.PopIf(); + if (header[a - 1] != Lj) { + var j = z.Hend - a + 1 + (op == Lj ? 1 : 0); + if (j > 127) + this.SyntaxError("IF too big, try IFL, IFNOTL"); + header[a] = (byte)j; + } else { + var j = z.Hend - compBegin + 2 + (op == Lj ? 1 : 0); + header[a] = (byte)j; + header[a + 1] = (byte)(j >> 8); + } + this._ifStack.Push(z.Hend + 1); + } else if (op == EndIf) { + var a = this.PopIf(); + var j = z.Hend - a - 1; + if (header[a - 1] != Lj) { + if (j > 127) + this.SyntaxError("IF too big, try IFL, IFNOTL, ELSEL"); + header[a] = (byte)j; + } else { + j = z.Hend - compBegin; + header[a] = (byte)j; + header[a + 1] = (byte)(j >> 8); + } + } else if (op == Do) + this._doStack.Push(z.Hend); + else if (op is While or Until or Forever) { + if (this._doStack.Count == 0) + ZpaqError.Throw("unmatched IF or DO"); + var a = this._doStack.Pop(); + var j = a - z.Hend - 2; + if (j >= -127) { + op = op switch { While => Jt, Until => Jf, _ => Jmp }; + operand = j & 255; + } else { + j = a - compBegin; + if (op == While) { + header[z.Hend++] = Jf; + header[z.Hend++] = 3; + } + if (op == Until) { + header[z.Hend++] = Jt; + header[z.Hend++] = 3; + } + op = Lj; + operand = j & 255; + operand2 = j >> 8; + } + } else if ((op & 7) == 7) { + if (op == Lj) { + operand = this.ReadNumber(0, 65535); + operand2 = operand >> 8; + operand &= 255; + } else if (op is Jt or Jf or Jmp) { + operand = this.ReadNumber(-128, 127); + operand &= 255; + } else + operand = this.ReadNumber(0, 255); + } + if (op is >= 0 and <= 255) + header[z.Hend++] = (byte)op; + if (operand >= 0) + header[z.Hend++] = (byte)operand; + if (operand2 >= 0) + header[z.Hend++] = (byte)operand2; + if (z.Hend >= header.Length - 130 || z.Hend - z.Hbegin + z.Cend - 2 > 65535) + this.SyntaxError("program too big"); + } + header[z.Hend++] = 0; + return op; + } + + private int PopIf() { + if (this._ifStack.Count == 0) + ZpaqError.Throw("unmatched IF or DO"); + return this._ifStack.Pop(); + } +} diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqCompressor.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqCompressor.cs new file mode 100644 index 000000000..bbcf886d6 --- /dev/null +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqCompressor.cs @@ -0,0 +1,103 @@ +using System.Text; + +namespace FileFormat.Zpaq; + +/// +/// Writes ZPAQ blocks: locator tag, block header (COMP + HCOMP), segments with filename, +/// comment, the PCOMP program, the coded data and the SHA-1 trailer. +/// +/// Converted from libzpaq 7.15 (Matt Mahoney, public domain), class Compressor. +internal sealed class ZpaqCompressor { + private enum Phase { Init, Block1, Segment1, Block2, Segment2 } + + private readonly ZpaqlMachine _z = new(); + private readonly ZpaqlMachine _pz = new(); + private readonly ZpaqEncoder _enc; + private Phase _state = Phase.Init; + + /// The 13-byte locator tag that lets a reader find blocks after arbitrary leading data. + internal static ReadOnlySpan Tag => [0x37, 0x6b, 0x53, 0x74, 0xa0, 0x31, 0x83, 0xd3, 0x8c, 0xb2, 0x28, 0xb0, 0xd3]; + + /// Creates a compressor writing to . + public ZpaqCompressor(IZpaqWriter output) => this._enc = new(this._z) { Out = output }; + + /// Writes the locator tag. + public void WriteTag() => this._enc.Out.Write(Tag); + + /// Starts a block from ZPAQL source ; returns the PCOMP command name. + public string StartBlock(string config, int[]? args) { + var compiler = new ZpaqCompiler(config, args, this._z, this._pz); + var output = this._enc.Out; + output.Put('z'); + output.Put('P'); + output.Put('Q'); + output.Put(1 + (this._z.Header[6] == 0 ? 1 : 0)); + output.Put(1); + this._z.Write(output, false); + this._state = Phase.Block1; + return compiler.PcompCommand; + } + + /// Starts a segment carrying and . + public void StartSegment(string? filename, ReadOnlySpan comment) { + var output = this._enc.Out; + output.Put(1); + if (!string.IsNullOrEmpty(filename)) + output.Write(Encoding.UTF8.GetBytes(filename)); + output.Put(0); + output.Write(comment); + output.Put(0); + output.Put(0); + this._state = this._state == Phase.Block1 ? Phase.Segment1 : Phase.Segment2; + } + + /// Codes all bytes from . + public void Compress(IZpaqReader input) { + if (this._state == Phase.Segment1) + this.PostProcess(); + Span buf = stackalloc byte[1 << 14]; + int nr; + while ((nr = input.Read(buf)) > 0) + for (var i = 0; i < nr; ++i) + this._enc.Compress(buf[i]); + } + + /// Ends the segment, storing when given. + public void EndSegment(byte[]? sha1) { + if (this._state == Phase.Segment1) + this.PostProcess(); + this._enc.Compress(-1); + var output = this._enc.Out; + output.Put(0); + output.Put(0); + output.Put(0); + output.Put(0); + if (sha1 != null) { + output.Put(253); + output.Write(sha1); + } else + output.Put(254); + this._state = Phase.Block2; + } + + /// Ends the block. + public void EndBlock() { + this._enc.Out.Put(255); + this._state = Phase.Init; + } + + /// Initialises coding and emits the PCOMP program (or the pass-through marker) at the start of the first segment. + private void PostProcess() { + this._enc.Init(); + var len = this._pz.Hend - this._pz.Hbegin; + if (len > 0) { + this._enc.Compress(1); + this._enc.Compress(len & 255); + this._enc.Compress((len >> 8) & 255); + for (var i = 0; i < len; ++i) + this._enc.Compress(this._pz.Header[this._pz.Hbegin + i]); + } else + this._enc.Compress(0); + this._state = Phase.Segment2; + } +} diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqConstants.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqConstants.cs deleted file mode 100644 index 37433ae30..000000000 --- a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqConstants.cs +++ /dev/null @@ -1,62 +0,0 @@ -namespace FileFormat.Zpaq; - -/// -/// Constants for the ZPAQ archive format (level 1 journaling). -/// -public static class ZpaqConstants { - /// - /// The 3-byte block locator prefix present at the start of every ZPAQ block ("zPQ"). - /// - public static ReadOnlySpan BlockPrefix => "zPQ"u8; - - /// - /// Compression level byte for ZPAQ level 1 archives. - /// - public const byte Level1 = 1; - - /// - /// Compression level byte for ZPAQ level 2 archives. - /// - public const byte Level2 = 2; - - /// - /// Block type byte: compressed data block (contains ZPAQL program + compressed payload). - /// - public const byte BlockTypeCompressed = 1; - - /// - /// Block type byte: comment/filename header block in a journaling transaction. - /// In a level-1 journaling archive this block carries the transaction date, - /// filenames and per-file attributes for one transaction. - /// - public const byte BlockTypeHeader = (byte)'c'; - - /// - /// Block type byte: data block in a journaling transaction. - /// Each data block holds the (ZPAQL-compressed) payload for one or more files. - /// - public const byte BlockTypeData = (byte)'d'; - - /// - /// Block type byte: hash/index block that closes a journaling transaction. - /// Contains SHA-1 hashes of the uncompressed file data. - /// - public const byte BlockTypeIndex = (byte)'h'; - - /// - /// Minimum number of bytes in a valid block header - /// (3-byte prefix + 1 level byte + 1 type byte = 5 bytes). - /// - public const int MinBlockHeaderSize = 5; - - /// - /// Size of the Windows FILETIME timestamp stored in journaling header blocks (8 bytes). - /// - public const int FileTimeSize = 8; - - /// - /// Windows FILETIME ticks (100-nanosecond intervals) from the Windows epoch - /// (1601-01-01) to the Unix epoch (1970-01-01), used when converting timestamps. - /// - public const long WindowsToUnixEpochTicks = 116444736000000000L; -} diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqDecompresser.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqDecompresser.cs new file mode 100644 index 000000000..2ff7015b2 --- /dev/null +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqDecompresser.cs @@ -0,0 +1,156 @@ +using System.Text; + +namespace FileFormat.Zpaq; + +/// +/// Walks a ZPAQ stream block by block and segment by segment: locate a block, read its +/// segments' filename and comment, decode the data, read the trailing SHA-1. +/// +/// Converted from libzpaq 7.15 (Matt Mahoney, public domain), class Decompresser. +internal sealed class ZpaqDecompresser { + private enum Expect { Block, Filename, Comment, Data, SegmentEnd } + private enum DecodeState { FirstSegment, Segment, Skip } + + private readonly ZpaqlMachine _z = new(); + private readonly ZpaqDecoder _dec; + private readonly ZpaqPostProcessor _pp = new(); + private Expect _state = Expect.Block; + private DecodeState _decodeState = DecodeState.FirstSegment; + + /// Creates a decompresser reading from . + public ZpaqDecompresser(IZpaqReader input) { + this._dec = new(this._z) { In = input }; + } + + /// Bytes read ahead of the logical position. + public int Buffered => this._dec.Buffered; + + /// Level byte (1 or 2) of the current block. + public int Level { get; private set; } + + /// Approximate memory the current block needs to decode. + public double Memory => this._z.Memory(); + + /// Discards read-ahead after the caller repositioned the underlying input. + public void DiscardBuffer() => this._dec.DiscardBuffer(); + + /// Scans for the next block header and reads it; at end of input. + public bool FindBlock() { + uint h1 = 0x3D49B113, h2 = 0x29EB7F93, h3 = 0x2614BE13, h4 = 0x3828EB13; + int c; + while ((c = this._dec.Get()) != -1) { + h1 = h1 * 12 + (uint)c; + h2 = h2 * 20 + (uint)c; + h3 = h3 * 28 + (uint)c; + h4 = h4 * 44 + (uint)c; + if (h1 == 0xB16B88F1 && h2 == 0xFF5376F1 && h3 == 0x72AC5BF1 && h4 == 0x2F909AF1) + break; + } + if (c == -1) + return false; + + if ((c = this._dec.Get()) != 1 && c != 2) + ZpaqError.Throw("unsupported ZPAQ level"); + if (this._dec.Get() != 1) + ZpaqError.Throw("unsupported ZPAQL type"); + this._z.Read(this._dec); + if (c == 1 && this._z.Header.Length > 6 && this._z.Header[6] == 0) + ZpaqError.Throw("ZPAQ level 1 requires at least 1 component"); + this.Level = c; + this._state = Expect.Filename; + this._decodeState = DecodeState.FirstSegment; + return true; + } + + /// Reads the next segment header; returns its filename, or at end of block. + public string? FindFilename() { + var c = this._dec.Get(); + if (c == 1) { + var name = new List(); + while (true) { + c = this._dec.Get(); + if (c == -1) + ZpaqError.Throw("unexpected EOF"); + if (c == 0) { + this._state = Expect.Comment; + return Encoding.UTF8.GetString(name.ToArray()); + } + name.Add((byte)c); + } + } + if (c == 255) { + this._state = Expect.Block; + return null; + } + ZpaqError.Throw("missing segment or end of block"); + return null; + } + + /// Reads the comment of the current segment as raw bytes. + public byte[] ReadComment() { + this._state = Expect.Data; + var comment = new List(); + while (true) { + var c = this._dec.Get(); + if (c == -1) + ZpaqError.Throw("unexpected EOF"); + if (c == 0) + break; + comment.Add((byte)c); + } + if (this._dec.Get() != 0) + ZpaqError.Throw("missing reserved byte"); + return [.. comment]; + } + + /// Sets where decoded (post-processed) bytes go; discards them. + public void SetOutput(IZpaqWriter? output) => this._pp.Z.Output = output; + + /// Sets the hash that sees every output byte, or . + public void SetSha1(ZpaqSha1? sha1) => this._pp.Z.Sha1 = sha1; + + /// Decodes the whole current segment. + public void Decompress() { + if (this._decodeState == DecodeState.Skip) + ZpaqError.Throw("decompression after skipped segment"); + if (this._decodeState == DecodeState.FirstSegment) { + this._dec.Init(); + this._pp.Init(this._z.Header[4], this._z.Header[5]); + this._decodeState = DecodeState.Segment; + } + while ((this._pp.State & 3) != 1) + this._pp.Write(this._dec.Decompress()); + while (true) { + var c = this._dec.Decompress(); + this._pp.Write(c); + if (c == -1) { + this._state = Expect.SegmentEnd; + return; + } + } + } + + /// Finishes the segment, skipping undecoded data; returns the stored SHA-1 or . + public byte[]? ReadSegmentEnd() { + var c = 0; + if (this._state == Expect.Data) { + c = this._dec.Skip(); + this._decodeState = DecodeState.Skip; + } else if (this._state == Expect.SegmentEnd) + c = this._dec.Get(); + this._state = Expect.Filename; + + if (c == 254) + return null; + if (c != 253) + ZpaqError.Throw("missing end of segment marker"); + var hash = new byte[20]; + for (var i = 0; i < 20; ++i) { + c = this._dec.Get(); + if (c < 0) + ZpaqError.Throw("unexpected EOF"); + hash[i] = (byte)c; + } + return hash; + } +} diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqEntry.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqEntry.cs index a52164491..18d45895d 100644 --- a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqEntry.cs +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqEntry.cs @@ -1,59 +1,52 @@ namespace FileFormat.Zpaq; /// -/// Represents a single file entry recorded in a ZPAQ journaling archive. +/// A file or directory as recorded in a ZPAQ archive. /// public sealed class ZpaqEntry { - /// - /// Gets the filename as stored in the archive. - /// Path separators are always forward slashes; directory entries end with '/'. - /// + /// Path as stored, with forward slashes; directories end with '/'. public string FileName { get; } - /// - /// Gets the uncompressed size of the file in bytes as reported by the archive. - /// This value is zero for directory entries and for files whose size could not - /// be determined from the journal (e.g. when the header block is compressed). - /// + /// Uncompressed size in bytes, or -1 when the archive does not record it (streaming format). public long Size { get; } /// - /// Gets the compressed size of the data block(s) that carry this file's data. - /// This is the total byte count of the raw (still-compressed) data blocks - /// associated with this entry. + /// Compressed size attributed to this entry: the share of the data blocks it references, + /// proportional to its new (non-deduplicated) fragments. Zero for directories. /// public long CompressedSize { get; } - /// - /// Gets the last-modified timestamp decoded from the journal header, or - /// when the timestamp could not be recovered. - /// + /// Last-modified time (UTC) from the archive's decimal date, or . public DateTime? LastModified { get; } - /// - /// Gets a value indicating whether this entry represents a directory. - /// + /// Whether this entry is a directory. public bool IsDirectory { get; } + /// 1-based version (transaction) that last wrote this entry. + public int Version { get; } + /// - /// Gets the zero-based transaction index in which this entry was recorded. - /// Each append to a ZPAQ archive constitutes a new transaction; the most - /// recent transaction with a given filename defines the file's current state. + /// Raw attribute bytes as stored (first byte 'w' = Windows attributes follow, 'u' = Unix mode + /// follows), packed little-endian; 0 when none were stored. /// - public int Version { get; } + public long Attributes { get; } + + /// Fragment IDs that make up the file (journaling format). + internal IReadOnlyList Fragments { get; } + + /// Streaming-format segments (block offset, segment index) that make up the file. + internal IReadOnlyList<(long BlockOffset, int Segment)> Segments { get; } - internal ZpaqEntry( - string fileName, - long size, - long compressedSize, - DateTime? lastModified, - bool isDirectory, - int version) { - FileName = fileName; - Size = size; - CompressedSize = compressedSize; - LastModified = lastModified; - IsDirectory = isDirectory; - Version = version; + internal ZpaqEntry(string fileName, long size, long compressedSize, DateTime? lastModified, int version, long attributes, + IReadOnlyList fragments, IReadOnlyList<(long, int)> segments) { + this.FileName = fileName; + this.Size = size; + this.CompressedSize = compressedSize; + this.LastModified = lastModified; + this.IsDirectory = fileName.EndsWith('/'); + this.Version = version; + this.Attributes = attributes; + this.Fragments = fragments; + this.Segments = segments; } } diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqFormatDescriptor.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqFormatDescriptor.cs index 0dea9ff09..ef1e90d74 100644 --- a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqFormatDescriptor.cs +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqFormatDescriptor.cs @@ -1,145 +1,176 @@ #pragma warning disable CS1591 +using System.Globalization; +using System.Text; using Compression.Registry; using static Compression.Registry.FormatHelpers; namespace FileFormat.Zpaq; /// -/// ZPAQ journaling archive with content-defined deduplication and configurable context-mixing compression. +/// ZPAQ archive (journaling and streaming layouts) with deduplication and ZPAQL-described +/// context-mixing compression. /// /// References: /// -/// http://mattmahoney.net/dc/zpaq.html — official ZPAQ page and Level 2 format specification (Matt Mahoney) -/// https://github.com/zpaq/zpaq — reference implementation -/// https://en.wikipedia.org/wiki/ZPAQ — Wikipedia overview +/// https://mattmahoney.net/dc/zpaq206.pdf — ZPAQ Level 2 specification (Matt Mahoney) +/// https://mattmahoney.net/dc/zpaq.html — zpaq / libzpaq reference implementation (public domain) /// /// public sealed class ZpaqFormatDescriptor : IFormatDescriptor, IArchiveFormatOperations, IArchiveCreatable, IArchiveModifiable, IArchiveDefragmentable { /// - /// A ZPAQ stream is a sequence of blocks; a file carrying none is not a ZPAQ archive, so there is no empty instance to purge to. + /// zpaq truncates an update that adds nothing, so there is no empty archive to purge to. public bool CanPurgeToEmpty => false; - - /// Rebuild-based defrag: extracts then re-creates the ZPAQ archive in listing order. + /// Rebuild-based defrag: extracts then re-creates the archive as a single version. public void Defragment(Stream archive) => this.Defragment(archive, new DefragOptions { Mode = DefragMode.ConsolidateAtStart }); - /// Rebuild-based defrag: extracts then re-creates the ZPAQ archive per the requested mode. + /// Rebuild-based defrag: extracts then re-creates the archive as a single version. public void Defragment(Stream archive, DefragOptions options) { DefragRebuilder.Rebuild(archive, options, readEntries: stream => { - var r = new ZpaqReader(stream); - var list = new List<(string, byte[])>(); - foreach (var e in r.Entries) { - if (e.IsDirectory) continue; - using var es = r.Extract(e); - using var ms = new MemoryStream(); - es.CopyTo(ms); - list.Add((e.FileName, ms.ToArray())); - } - return list; + using var r = new ZpaqReader(stream, leaveOpen: true); + return r.Entries.Where(e => !e.IsDirectory).Select(e => (e.FileName, r.ExtractBytes(e))).ToList(); }, buildImage: files => { using var ms = new MemoryStream(); - using (var w = new ZpaqWriter(ms, leaveOpen: true)) { - foreach (var (n, d) in files) w.AddFile(n, d); - } + using (var w = new ZpaqWriter(ms, leaveOpen: true)) + foreach (var (n, d) in files) + w.AddFile(n, d); return ms.ToArray(); }); } - /// - /// Gets the id. - /// public string Id => "Zpaq"; - /// - /// Gets the display name. - /// public string DisplayName => "ZPAQ"; - /// - /// Gets the category. - /// public FormatCategory Category => FormatCategory.Archive; - // R/W: a mutable archive. Add/Replace/Remove go through the verified extract -> - // edit -> re-create rebuild (default IArchiveModifiable); relayouting the container - // on edit is honest R/W. See FormatCapabilities.cs (WORM vs R/W). - /// - /// Gets the capabilities. - /// + + // R/W: zpaq 7.15 lists and extracts what ZpaqWriter produces (ZpaqExternalOracleTests), and the + // reader decodes zpaq's own archives at every method. Modify goes through the default + // extract -> edit -> re-create rebuild, which writes a fresh single-version archive. public FormatCapabilities Capabilities => FormatCapabilities.CanList | FormatCapabilities.CanExtract | FormatCapabilities.CanCreate | FormatCapabilities.CanModify | FormatCapabilities.CanTest | FormatCapabilities.SupportsMultipleEntries | FormatCapabilities.SupportsDirectories; - /// - /// Gets the default extension. - /// + public string DefaultExtension => ".zpaq"; - /// - /// Gets the extensions. - /// public IReadOnlyList Extensions => [".zpaq"]; - /// - /// Gets the compound extensions. - /// public IReadOnlyList CompoundExtensions => []; - /// - /// Gets the magic signatures. - /// - public IReadOnlyList MagicSignatures => [new([(byte)'z', (byte)'P', (byte)'Q'], Confidence: 0.90)]; - /// - /// Gets the methods. - /// - public IReadOnlyList Methods => [new("zpaq", "ZPAQ")]; - /// - /// Gets the tar compression format id. - /// + + // Journaling archives and libzpaq streams start with the 13-byte locator tag "7kSt\xA0\x31\x83\xD3\x8C\xB2\x28\xB0\xD3"; + // tagless streams start directly with the "zPQ" block header. + public IReadOnlyList MagicSignatures => [ + new([0x37, 0x6B, 0x53, 0x74, 0xA0, 0x31, 0x83, 0xD3, 0x8C, 0xB2, 0x28, 0xB0, 0xD3], Confidence: 0.95), + new([(byte)'z', (byte)'P', (byte)'Q'], Confidence: 0.80), + ]; + + public IReadOnlyList Methods => [ + new("1", "ZPAQ method 1 (LZ77, default)"), + new("0", "ZPAQ method 0 (dedup only)"), + new("2", "ZPAQ method 2 (LZ77, slower)"), + new("3", "ZPAQ method 3 (BWT / LZ77+CM)"), + new("4", "ZPAQ method 4 (CM)"), + new("5", "ZPAQ method 5 (CM, slowest)"), + ]; + public string? TarCompressionFormatId => null; - /// - /// Gets the family. - /// public AlgorithmFamily Family => AlgorithmFamily.Archive; - /// - /// Gets the description. - /// - public string Description => "ZPAQ journaling archive with deduplication"; - - /// - /// Lists the entries in the supplied container. - /// + public string Description => "ZPAQ journaling archive with deduplication and ZPAQL context-mixing compression"; + public List List(Stream stream, string? password) { - var r = new ZpaqReader(stream); - return r.Entries.Select((e, i) => new ArchiveEntryInfo(i, e.FileName, e.Size, e.CompressedSize, - "zpaq", e.IsDirectory, false, e.LastModified)).ToList(); + var seekable = Seekable(stream); + try { + var (reader, _) = TryOpen(seekable); + if (reader == null) { + var length = seekable.Length; + return [ + new(0, "FULL.zpaq", length, length, "Stored", false, false, null, Kind: "Track"), + new(1, "metadata.ini", 0, 0, "Stored", false, false, null, Kind: "Tag"), + ]; + } + using (reader) + return reader.Entries.Select((e, i) => new ArchiveEntryInfo(i, e.FileName, Math.Max(e.Size, 0), e.CompressedSize, + "zpaq", e.IsDirectory, false, e.LastModified)).ToList(); + } finally { + if (!ReferenceEquals(seekable, stream)) + seekable.Dispose(); + } } - /// - /// Decodes the supplied input. - /// public void Extract(Stream stream, string outputDir, string? password, string[]? files) { - var r = new ZpaqReader(stream); - foreach (var e in r.Entries) { - if (e.IsDirectory) continue; - if (files != null && !MatchesFilter(e.FileName, files)) continue; - using var es = r.Extract(e); - using var ms = new MemoryStream(); - es.CopyTo(ms); - WriteFile(outputDir, e.FileName, ms.ToArray()); + var seekable = Seekable(stream); + try { + var (reader, problem) = TryOpen(seekable); + if (reader == null) { + if (Wants(files, "FULL.zpaq")) { + seekable.Position = 0; + using var ms = new MemoryStream(); + seekable.CopyTo(ms); + WriteFile(outputDir, "FULL.zpaq", ms.ToArray()); + } + if (Wants(files, "metadata.ini")) + WriteFile(outputDir, "metadata.ini", Encoding.UTF8.GetBytes( + "[Zpaq]\n" + string.Create(CultureInfo.InvariantCulture, $"problem={problem?.Replace('\n', ' ')}\n") + + "member_enumeration=unavailable\nparse_status=partial\n")); + return; + } + using (reader) { + // Visit files in fragment order so consecutive files reuse the decoded block. + var ordered = reader.Entries + .Where(e => !e.IsDirectory && (files == null || MatchesFilter(e.FileName, files))) + .OrderBy(e => e.Fragments.Count > 0 ? e.Fragments[0] : 0u); + foreach (var e in ordered) + WriteFile(outputDir, e.FileName, reader.ExtractBytes(e)); + } + } finally { + if (!ReferenceEquals(seekable, stream)) + seekable.Dispose(); } } - /// - /// Performs the create operation. - /// public void Create(Stream output, IReadOnlyList inputs, FormatCreateOptions options) { - using var w = new ZpaqWriter(output, leaveOpen: true); + ArgumentNullException.ThrowIfNull(output); + ArgumentNullException.ThrowIfNull(inputs); + ArgumentNullException.ThrowIfNull(options); + using var w = new ZpaqWriter(output, leaveOpen: true, MethodFor(options)); foreach (var input in inputs) { - if (input.IsDirectory) { + if (input.IsDirectory) w.AddDirectory(input.ArchiveName); - } else { - var data = input.ReadContent(); - w.AddFile(input.ArchiveName, data); - } + else + w.AddFile(input.ArchiveName, input.ReadContent()); + } + } + + /// Maps the create options to a zpaq method: an explicit method string, else the level 0..5, else 1. + internal static string MethodFor(FormatCreateOptions options) { + var m = options.MethodName; + if (!string.IsNullOrEmpty(m) && (m[0] is >= '0' and <= '5' || m[0] == 'x')) + return m; + if (options.Level is { } level) + return Math.Clamp(level, 0, 5).ToString(CultureInfo.InvariantCulture); + return "1"; + } + + private static (ZpaqReader? Reader, string? Problem) TryOpen(Stream stream) { + try { + stream.Position = 0; + return (new ZpaqReader(stream, leaveOpen: true), null); + } catch (Exception e) when (e is InvalidDataException or NotSupportedException or EndOfStreamException or IOException + or OverflowException or ArgumentException or IndexOutOfRangeException) { + return (null, e.Message); } } + + private static Stream Seekable(Stream stream) { + if (stream.CanSeek) + return stream; + var ms = new MemoryStream(); + stream.CopyTo(ms); + ms.Position = 0; + return ms; + } + + private static bool Wants(string[]? files, string name) + => files == null || files.Length == 0 || MatchesFilter(name, files); } diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqIo.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqIo.cs new file mode 100644 index 000000000..2165d4f77 --- /dev/null +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqIo.cs @@ -0,0 +1,186 @@ +using Compression.Core.Checksums; + +namespace FileFormat.Zpaq; + +/// Byte source consumed by the ZPAQ engine. +internal interface IZpaqReader { + /// Returns the next byte (0..255) or -1 at end of input. + int Get(); + + /// Reads up to .Length bytes and returns the count; 0 means end of input. + int Read(Span buffer) { + var n = 0; + for (; n < buffer.Length; ++n) { + var c = this.Get(); + if (c < 0) + break; + buffer[n] = (byte)c; + } + return n; + } +} + +/// Byte sink fed by the ZPAQ engine. +internal interface IZpaqWriter { + /// Writes the low eight bits of . + void Put(int c); + + /// Writes a run of bytes. + void Write(ReadOnlySpan data) { + foreach (var b in data) + this.Put(b); + } +} + +/// Growable in-memory byte buffer that can be appended to and read back, like libzpaq's StringBuffer. +internal sealed class ZpaqBuffer : IZpaqReader, IZpaqWriter { + private byte[] _data; + private int _readPosition; + + /// Creates an empty buffer with the given initial capacity. + public ZpaqBuffer(int capacity = 0) => this._data = capacity > 0 ? new byte[capacity] : []; + + /// Creates a buffer that holds a copy of . + public ZpaqBuffer(ReadOnlySpan content) { + this._data = content.ToArray(); + this.Size = content.Length; + } + + /// Number of bytes written. + public int Size { get; private set; } + + /// Maximum number of bytes that may be written before the buffer refuses more. + public long Limit { get; set; } = long.MaxValue; + + /// Bytes written but not read yet. + public int Remaining => this.Size - this._readPosition; + + /// The written content; the backing array may be longer than . + public byte[] Data => this._data; + + /// The written content as a span. + public Span Span => this._data.AsSpan(0, this.Size); + + /// + public int Get() => this._readPosition < this.Size ? this._data[this._readPosition++] : -1; + + /// + public int Read(Span buffer) { + var n = Math.Min(buffer.Length, this.Size - this._readPosition); + if (n <= 0) + return 0; + this._data.AsSpan(this._readPosition, n).CopyTo(buffer); + this._readPosition += n; + return n; + } + + /// + public void Put(int c) { + this.EnsureRoom(1); + this._data[this.Size++] = (byte)c; + } + + /// + public void Write(ReadOnlySpan data) { + if (data.IsEmpty) + return; + this.EnsureRoom(data.Length); + data.CopyTo(this._data.AsSpan(this.Size)); + this.Size += data.Length; + } + + /// Truncates (or extends without clearing) the written size and clamps the read position. + public void Resize(int size) { + if (size > this._data.Length) + Array.Resize(ref this._data, size); + this.Size = size; + if (this._readPosition > size) + this._readPosition = size; + } + + /// Discards all content and rewinds the read position. + public void Reset() { + this.Size = 0; + this._readPosition = 0; + } + + /// Returns a copy of the written bytes. + public byte[] ToArray() => this._data.AsSpan(0, this.Size).ToArray(); + + private void EnsureRoom(int n) { + if (this.Size + (long)n > this.Limit) + ZpaqError.Throw("buffer overflow"); + if (this.Size + n <= this._data.Length) + return; + var capacity = Math.Max(128, this._data.Length); + while (capacity < this.Size + n) + capacity = capacity > Array.MaxLength / 2 ? Array.MaxLength : capacity * 2; + Array.Resize(ref this._data, capacity); + } +} + +/// Reads from a . +internal sealed class ZpaqStreamReader(Stream stream) : IZpaqReader { + /// + public int Get() => stream.ReadByte(); + + /// + public int Read(Span buffer) => stream.Read(buffer); +} + +/// Writes to a . +internal sealed class ZpaqStreamWriter(Stream stream) : IZpaqWriter { + /// + public void Put(int c) => stream.WriteByte((byte)c); + + /// + public void Write(ReadOnlySpan data) => stream.Write(data); +} + +/// Discards everything written to it. +internal sealed class ZpaqNullWriter : IZpaqWriter { + /// The shared instance. + public static readonly ZpaqNullWriter Instance = new(); + + /// + public void Put(int c) { } + + /// + public void Write(ReadOnlySpan data) { } +} + +/// Incremental SHA-1 that also counts the bytes hashed, matching libzpaq's SHA1 usage. +internal sealed class ZpaqSha1 : IZpaqWriter { + private readonly Sha1 _sha1 = new(); + + /// Number of bytes hashed since the last . + public long Size { get; private set; } + + /// + public void Put(int c) { + Span one = [(byte)c]; + this.Write(one); + } + + /// + public void Write(ReadOnlySpan data) { + this._sha1.Update(data); + this.Size += data.Length; + } + + /// Returns the 20-byte digest and resets for the next input. + public byte[] Result() { + this._sha1.Finish(); + var hash = this._sha1.Hash; + this._sha1.Reset(); + this.Size = 0; + return hash; + } +} + +/// Raises the engine's error for malformed input or an invalid model. +internal static class ZpaqError { + /// Throws an carrying . + [System.Diagnostics.CodeAnalysis.DoesNotReturn] + public static void Throw(string message) => throw new InvalidDataException("ZPAQ: " + message); +} diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqLzBuffer.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqLzBuffer.cs new file mode 100644 index 000000000..82434a765 --- /dev/null +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqLzBuffer.cs @@ -0,0 +1,351 @@ +namespace FileFormat.Zpaq; + +/// +/// The LZ77 / BWT preprocessor of ZPAQ methods 1..3 (the x method's second argument), +/// presented as a byte source the compressor reads. +/// +/// +/// Converted from libzpaq 7.15 (Matt Mahoney, public domain), class LZBuffer. +/// +/// Level 1 emits bit-packed LZ77 codes, level 2 byte-aligned LZ77 codes, level 3 the +/// Burrows-Wheeler transform with the end-of-string position in the last four bytes. The +/// matching PCOMP programs that undo each of these are generated by +/// . The suffix array (for BWT and for the suffix-array +/// match finder) comes from ; a suffix array is unique, so the +/// output equals the reference's regardless of how it is built. +/// +/// +internal sealed class ZpaqLzBuffer : IZpaqReader { + private const int BufSize = 1 << 14; + + private readonly uint[] _ht; + private readonly byte[] _in; + private readonly int _checkbits; + private readonly int _level; + private readonly uint _htsize; + private readonly uint _n; + private uint _i; + private readonly uint _minMatch; + private readonly uint _minMatch2; + private readonly uint _maxMatch = BufSize * 3; + private readonly uint _maxLiteral = BufSize / 4; + private readonly uint _lookahead; + private uint _h1, _h2; + private readonly uint _bucket; + private readonly int _shift1, _shift2; + private readonly int _minMatchBoth; + private readonly int _rb; + private uint _bits; + private int _nbits; + private int _rpos, _wpos; + private uint _idx; + private readonly int[]? _sa; + private readonly int _isaOffset = -1; + private readonly byte[] _buf = new byte[BufSize]; + + /// Prepares to encode with method arguments . + public ZpaqLzBuffer(ZpaqBuffer input, int[] args) { + // A private copy with zero padding: the hash match finder peeks a few bytes past the + // end (the reference reads its buffer's slack there), and E8E9 must not touch the caller's data. + this._n = (uint)input.Size; + this._in = new byte[input.Size + 8]; + input.Span.CopyTo(this._in); + this._level = args[1] & 3; + this._minMatch = (uint)args[2]; + this._minMatch2 = (uint)args[3]; + this._lookahead = (uint)args[6]; + this._bucket = (1u << args[4]) - 1; + this._shift1 = this._minMatch > 0 ? (args[5] - 1) / (int)this._minMatch + 1 : 1; + this._shift2 = this._minMatch2 > 0 ? (args[5] - 1) / (int)this._minMatch2 + 1 : 0; + this._minMatchBoth = (int)Math.Max(this._minMatch, this._minMatch2 + this._lookahead) + 4; + this._rb = args[0] > 4 ? args[0] - 4 : 0; + var useSa = args[5] - args[0] >= 21; + this._checkbits = useSa ? 17 + args[0] : 12 - args[0]; + + if ((this._minMatch < 4 && this._level == 1) || (this._minMatch < 1 && this._level == 2)) + ZpaqError.Throw("match length $3 too small"); + + if (args[1] > 4) + ZpaqMethods.E8E9(this._in.AsSpan(0, (int)this._n)); + + if (this._level == 3) { + this._ht = []; + this._sa = ZpaqSuffixArray.Build(this._in.AsSpan(0, (int)this._n)); + } else if (useSa) { + this._sa = ZpaqSuffixArray.Build(this._in.AsSpan(0, (int)this._n)); + this._ht = new uint[1u << 17 << args[0]]; + this._isaOffset = 0; + } else + this._ht = new uint[1u << args[5]]; + this._htsize = (uint)this._ht.Length; + } + + /// + public int Get() { + var c = -1; + if (this._rpos == this._wpos) + this.Fill(); + if (this._rpos < this._wpos) + c = this._buf[this._rpos++]; + if (this._rpos == this._wpos) + this._rpos = this._wpos = 0; + return c; + } + + /// + public int Read(Span p) { + if (this._rpos == this._wpos) + this.Fill(); + var nr = Math.Min(p.Length, this._wpos - this._rpos); + this._buf.AsSpan(this._rpos, nr).CopyTo(p); + this._rpos += nr; + if (this._rpos == this._wpos) + this._rpos = this._wpos = 0; + return nr; + } + + private static int Lg(uint x) => x == 0 ? 0 : 32 - System.Numerics.BitOperations.LeadingZeroCount(x); + + private void PutBits(uint x, int k) { + x &= (uint)((1L << k) - 1); + this._bits |= x << this._nbits; + this._nbits += k; + while (this._nbits > 7) { + this._buf[this._wpos++] = (byte)this._bits; + this._bits >>= 8; + this._nbits -= 8; + } + } + + private void FlushBits() { + if (this._nbits > 0) + this._buf[this._wpos++] = (byte)this._bits; + this._bits = 0; + this._nbits = 0; + } + + private void Put(int c) => this._buf[this._wpos++] = (byte)c; + + private void Fill() { + var input = this._in; + var n = this._n; + + if (this._level == 3) { + var sa = this._sa!; + for (; this._wpos < BufSize && this._i < n + 5; ++this._i) { + if (this._i == 0) + this.Put(n > 0 ? input[n - 1] : 255); + else if (this._i > n) { + this.Put((int)(this._idx & 255)); + this._idx >>= 8; + } else if (sa[this._i - 1] == 0) { + this._idx = this._i; + this.Put(255); + } else + this.Put(input[sa[this._i - 1] - 1]); + } + return; + } + + var lit = 0u; + var mask = (uint)((1L << this._checkbits) - 1); + var ht = this._ht; + while (this._i < n && this._wpos * 2 < BufSize) { + var i = this._i; + var blen = this._minMatch - 1; + var bp = 0u; + var blit = 0u; + var bscore = 0; + + if (this._isaOffset >= 0) { + var sa = this._sa!; + if ((uint)sa[ht[i & mask]] != i) + for (var j = 0u; j < n; ++j) + if (((uint)sa[j] & ~mask) == (i & ~mask)) + ht[(uint)sa[j] & mask] = j; + for (var h = 0u; h <= this._lookahead; ++h) { + var q = ht[(h + i) & mask]; + if ((uint)sa[q] != h + i) + continue; + for (var j = -1; j <= 1; j += 2) { + for (var k = 1u; k <= this._bucket; ++k) { + var qq = (uint)(q + j * (long)k); + uint p; + if (qq < n && (p = (uint)sa[qq] - h) < i) { + uint l, l1; + for (l = h; i + l < n && l < this._maxMatch && input[p + l] == input[i + l]; ++l) { } + for (l1 = h; l1 > 0 && input[p + l1 - 1] == input[i + l1 - 1]; --l1) { } + var score = (int)(l - l1) * 8 - Lg(i - p) - 4 * (lit == 0 && l1 > 0 ? 1 : 0) - 11; + for (var a = 0u; a < h; ++a) + score = score * 5 / 8; + if (score > bscore) { + blen = l; + bp = p; + blit = l1; + bscore = score; + } + if (l < blen || l < this._minMatch || l > 255) + break; + } + } + } + if (bscore <= 0 || blen < this._minMatch) + break; + } + } else if (this._level == 1 || this._minMatch <= 64) { + if (this._minMatch2 > 0) { + for (var k = 0u; k <= this._bucket; ++k) { + var p = ht[this._h2 ^ k]; + if (p != 0 && (p & mask) == (input[i + 3] & mask)) { + p >>= this._checkbits; + if (p < i && i + blen <= n && (blen == 0 || input[p + blen - 1] == input[i + blen - 1])) { + uint l; + for (l = this._lookahead; i + l < n && l < this._maxMatch && input[p + l] == input[i + l]; ++l) { } + if (l >= this._minMatch2 + this._lookahead) { + int l1; + for (l1 = (int)this._lookahead; l1 > 0 && input[p + l1 - 1] == input[i + l1 - 1]; --l1) { } + var score = (int)(l - (uint)l1) * 8 - Lg(i - p) - 8 * (lit == 0 && l1 > 0 ? 1 : 0) - 11; + if (score > bscore) { + blen = l; + bp = p; + blit = (uint)l1; + bscore = score; + } + } + } + } + if (blen >= 128) + break; + } + } + + if (this._minMatch2 == 0 || blen < this._minMatch2) { + for (var k = 0u; k <= this._bucket; ++k) { + var p = ht[this._h1 ^ k]; + if (p != 0 && i + 3 < n && (p & mask) == (input[i + 3] & mask)) { + p >>= this._checkbits; + if (p < i && i + blen <= n && (blen == 0 || input[p + blen - 1] == input[i + blen - 1])) { + uint l; + for (l = 0; i + l < n && l < this._maxMatch && input[p + l] == input[i + l]; ++l) { } + var score = (int)l * 8 - Lg(i - p) - 2 * (lit > 0 ? 1 : 0) - 11; + if (score > bscore) { + blen = l; + bp = p; + blit = 0; + bscore = score; + } + } + } + if (blen >= 128) + break; + } + } + } + + var off = i - bp; + var extra = this._level == 2 ? (off >= 1 << 16 ? 1u : 0u) + (off >= 1 << 24 ? 1u : 0u) : 0u; + if (off > 0 && bscore > 0 && blen - blit >= this._minMatch + extra) { + lit += blit; + this.WriteLiteral(i + blit, ref lit); + this.WriteMatch(blen - blit, off); + } else { + blen = 1; + ++lit; + } + + if (this._isaOffset >= 0) + this._i += blen; + else { + while (blen-- > 0) { + i = this._i; + if (i + this._minMatchBoth < n) { + var ih = ((i * 1234547u) >> 19) & this._bucket; + var p = (i << this._checkbits) | (input[i + 3] & mask); + if (this._minMatch2 != 0) { + ht[this._h2 ^ ih] = p; + this._h2 = (((this._h2 * 9) << this._shift2) + (input[i + this._minMatch2 + this._lookahead] + 1u) * 23456789u) & (this._htsize - 1); + } + ht[this._h1 ^ ih] = p; + this._h1 = (((this._h1 * 5) << this._shift1) + (input[i + this._minMatch] + 1u) * 123456791u) & (this._htsize - 1); + } + ++this._i; + } + } + + if (lit >= this._maxLiteral) + this.WriteLiteral(this._i, ref lit); + } + + if (this._i == n) { + this.WriteLiteral(n, ref lit); + this.FlushBits(); + } + } + + private void WriteLiteral(uint i, ref uint lit) { + var input = this._in; + if (this._level == 1) { + if (lit < 1) + return; + var ll = Lg(lit); + this.PutBits(0, 2); + --ll; + while (--ll >= 0) { + this.PutBits(1, 1); + this.PutBits((lit >> ll) & 1, 1); + } + this.PutBits(0, 1); + while (lit != 0) + this.PutBits(input[i - lit--], 8); + return; + } + while (lit > 0) { + var lit1 = Math.Min(lit, 64u); + this.Put((int)lit1 - 1); + for (var j = i - lit; j < i - lit + lit1; ++j) + this.Put(input[j]); + lit -= lit1; + } + } + + private void WriteMatch(uint len, uint off) { + if (this._level == 1) { + var ll = Lg(len) - 1; + off += (1u << this._rb) - 1; + var lo = Lg(off) - 1 - this._rb; + this.PutBits((uint)(lo + 8) >> 3, 2); + this.PutBits((uint)lo & 7, 3); + while (--ll >= 2) { + this.PutBits(1, 1); + this.PutBits((len >> ll) & 1, 1); + } + this.PutBits(0, 1); + this.PutBits(len & 3, 2); + this.PutBits(off, this._rb); + this.PutBits(off >> this._rb, lo); + return; + } + --off; + var minMatch = this._minMatch; + while (len > 0) { + var len1 = len > minMatch * 2 + 63 ? minMatch + 63 : len > minMatch + 63 ? len - minMatch : len; + if (off < 1 << 16) { + this.Put((int)(64 + len1 - minMatch)); + this.Put((int)(off >> 8)); + this.Put((int)off); + } else if (off < 1 << 24) { + this.Put((int)(128 + len1 - minMatch)); + this.Put((int)(off >> 16)); + this.Put((int)(off >> 8)); + this.Put((int)off); + } else { + this.Put((int)(192 + len1 - minMatch)); + this.Put((int)(off >> 24)); + this.Put((int)(off >> 16)); + this.Put((int)(off >> 8)); + this.Put((int)off); + } + len -= len1; + } + } +} diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqMethods.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqMethods.cs new file mode 100644 index 000000000..b5593090c --- /dev/null +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqMethods.cs @@ -0,0 +1,827 @@ +using System.Globalization; +using System.Text; + +namespace FileFormat.Zpaq; + +/// +/// ZPAQ compression methods: the method-string language (0..5, x...), the +/// ZPAQL configurations it expands to, and single-block compression with the LZ77 / BWT / +/// E8E9 preprocessors. +/// +/// +/// Converted from libzpaq 7.15 (Matt Mahoney, public domain): makeConfig, +/// compressBlock and e8e9. The generated ZPAQL text is carried over verbatim, +/// because it is what ends up in every block header and the reference decoder runs it. +/// +internal static class ZpaqMethods { + + /// Decimal representation of a non-negative number, at least digits. + internal static string Itos(long x, int n = 1) { + var s = x.ToString(CultureInfo.InvariantCulture); + return s.Length >= n ? s : new string('0', n - s.Length) + s; + } + + /// floor(log2(x)) + 1: the number of significant bits of . + internal static int Lg(int x) => x == 0 ? 0 : 32 - System.Numerics.BitOperations.LeadingZeroCount((uint)x); + + /// Number of set bits of . + internal static int NBits(int x) => System.Numerics.BitOperations.PopCount((uint)x); + + /// + /// E8E9 transform: scanning backward, adds the block offset to the 32-bit operand of every + /// E8/E9 xx xx xx 00/FF (x86 CALL/JMP) so that repeated targets compress better. + /// + internal static void E8E9(Span buf) { + for (var i = buf.Length - 5; i >= 0; --i) { + if ((buf[i] & 254) != 0xe8 || ((buf[i + 4] + 1) & 254) != 0) + continue; + var a = (uint)(buf[i + 1] | buf[i + 2] << 8 | buf[i + 3] << 16) + (uint)i; + buf[i + 1] = (byte)a; + buf[i + 2] = (byte)(a >> 8); + buf[i + 3] = (byte)(a >> 16); + } + } + + /// + /// Expands an explicit method string (0..., x..., s..., i...) into a ZPAQL + /// configuration, filling ($1..$9) from its numeric arguments. + /// + internal static string MakeConfig(string method, int[] args) { + var type = method[0]; + Array.Clear(args, 0, 9); + var mi = 1; + for (var i = 0; i < 9 && mi < method.Length && (char.IsAsciiDigit(method[mi]) || method[mi] == ',' || method[mi] == '.');) { + if (char.IsAsciiDigit(method[mi])) + args[i] = args[i] * 10 + method[mi] - '0'; + else if (++i < 9) + args[i] = 0; + ++mi; + } + // "0..." = No compression + if (type == '0') + return "comp 0 0 0 0 0 hcomp end\n"; + + // Generate the postprocessor + string hdr = "", pcomp = ""; + var level = args[1] & 3; + var doe8 = args[1] >= 4 && args[1] <= 7; + + // LZ77+Huffman, with or without E8E9 + if (level == 1) { + var rb = args[0] > 4 ? args[0] - 4 : 0; + hdr = "comp 9 16 0 $1+20 "; + pcomp = + "pcomp lazy2 3 ;\n" + + " (r1 = state\n" + + " r2 = len - match or literal length\n" + + " r3 = m - number of offset bits expected\n" + + " r4 = ptr to buf\n" + + " r5 = r - low bits of offset\n" + + " c = bits - input buffer\n" + + " d = n - number of bits in c)\n" + + "\n" + + " a> 255 if\n"; + if (doe8) + pcomp += + " b=0 d=r 4 do (for b=0..d-1, d = end of buf)\n" + + " a=b a==d ifnot\n" + + " a+= 4 a>= 8 b++\n" + + " *b=a a>>= 8 b++\n" + + " *b=a b++\n" + + " endif\n" + + " b=c\n" + + " endif\n" + + " endif\n" + + " a=*b out b++\n" + + " forever\n" + + " endif\n" + + "\n"; + pcomp += + " (reset state)\n" + + " a=0 b=0 c=0 d=0 r=a 1 r=a 2 r=a 3 r=a 4\n" + + " halt\n" + + " endif\n" + + "\n" + + " a<<=d a+=c c=a (bits+=a< 0 if (if (bits&3))\n" + + " a-- a<<= 3 r=a 3 (m=((bits&3)-1)*8)\n" + + " a=c a>>= 2 c=a (bits>>=2)\n" + + " b=r 3 a&= 7 a+=b r=a 3 (m+=bits&7)\n" + + " a=c a>>= 3 c=a (bits>>=3)\n" + + " a=d a-= 5 d=a (n-=5)\n" + + " a= 1 r=a 1 (state=1)\n" + + " else (literal, discard 00)\n" + + " a=c a>>= 2 c=a (bits>>=2)\n" + + " d-- d-- (n-=2)\n" + + " a= 3 r=a 1 (state=3)\n" + + " endif\n" + + " endif\n" + + "\n" + + " (while state==1 && n>=3 (expect match length n*4+ll -> r2))\n" + + " do a=r 1 a== 1 if a=d a> 2 if\n" + + " a=c a&= 1 a== 1 if (if bits&1)\n" + + " a=c a>>= 1 c=a (bits>>=1)\n" + + " b=r 2 a=c a&= 1 a+=b a+=b r=a 2 (len+=len+(bits&1))\n" + + " a=c a>>= 1 c=a (bits>>=1)\n" + + " d-- d-- (n-=2)\n" + + " else\n" + + " a=c a>>= 1 c=a (bits>>=1)\n" + + " a=r 2 a<<= 2 b=a (len<<=2)\n" + + " a=c a&= 3 a+=b r=a 2 (len+=bits&3)\n" + + " a=c a>>= 2 c=a (bits>>=2)\n" + + " d-- d-- d-- (n-=3)\n"; + if (rb != 0) + pcomp += " a= 5 r=a 1 (state=5)\n"; + else + pcomp += " a= 2 r=a 1 (state=2)\n"; + pcomp += + " endif\n" + + " forever endif endif\n" + + "\n"; + if (rb != 0) pcomp += // save r in r5 + " (if state==5 && n>=8) (expect low bits of offset to put in r5)\n" + + " a=r 1 a== 5 if a=d a> " + Itos(rb - 1) + " if\n" + + " a=c a&= " + Itos((1 << rb) - 1) + " r=a 5 (save r in r5)\n" + + " a=c a>>= " + Itos(rb) + " c=a\n" + + " a=d a-= " + Itos(rb) + " d=a\n" + + " a= 2 r=a 1 (go to state 2)\n" + + " endif endif\n" + + "\n"; + pcomp += + " (if state==2 && n>=m) (expect m offset bits)\n" + + " a=r 1 a== 2 if a=r 3 a>d ifnot\n" + + " a=c r=a 6 a=d r=a 7 (save c=bits, d=n in r6,r7)\n" + + " b=r 3 a= 1 a<<=b d=a (d=1< 0 if d--\n" + + " a=*c *b=a c++ b++ (buf[ptr++]-buf[p++])\n"; + if (!doe8) pcomp += " out\n"; + pcomp += + " forever endif\n" + + " a=b r=a 4\n" + + "\n" + + " a=r 6 b=r 3 a>>=b c=a (bits>>=m)\n" + + " a=r 7 a-=b d=a (n-=m)\n" + + " a=0 r=a 1 (state=0)\n" + + " endif endif\n" + + "\n" + + " (while state==3 && n>=2 (expect literal length))\n" + + " do a=r 1 a== 3 if a=d a> 1 if\n" + + " a=c a&= 1 a== 1 if (if bits&1)\n" + + " a=c a>>= 1 c=a (bits>>=1)\n" + + " b=r 2 a&= 1 a+=b a+=b r=a 2 (len+=len+(bits&1))\n" + + " a=c a>>= 1 c=a (bits>>=1)\n" + + " d-- d-- (n-=2)\n" + + " else\n" + + " a=c a>>= 1 c=a (bits>>=1)\n" + + " d-- (--n)\n" + + " a= 4 r=a 1 (state=4)\n" + + " endif\n" + + " forever endif endif\n" + + "\n" + + " (if state==4 && n>=8 (expect len literals))\n" + + " a=r 1 a== 4 if a=d a> 7 if\n" + + " b=r 4 a=c *b=a\n"; + if (!doe8) pcomp += " out\n"; + pcomp += + " b++ a=b r=a 4 (buf[ptr++]=bits)\n" + + " a=c a>>= 8 c=a (bits>>=8)\n" + + " a=d a-= 8 d=a (n-=8)\n" + + " a=r 2 a-- r=a 2 a== 0 if (if --len<1)\n" + + " a=0 r=a 1 (state=0)\n" + + " endif\n" + + " endif endif\n" + + " halt\n" + + "end\n"; + } + + // Byte aligned LZ77, with or without E8E9 + else if (level == 2) { + hdr = "comp 9 16 0 $1+20 "; + pcomp = + "pcomp lzpre c ;\n" + + " (Decode LZ77: d=state, M=output buffer, b=size)\n" + + " a> 255 if (at EOF decode e8e9 and output)\n"; + if (doe8) + pcomp += + " d=b b=0 do (for b=0..d-1, d = end of buf)\n" + + " a=b a==d ifnot\n" + + " a+= 4 a>= 8 b++\n" + + " *b=a a>>= 8 b++\n" + + " *b=a b++\n" + + " endif\n" + + " b=c\n" + + " endif\n" + + " endif\n" + + " a=*b out b++\n" + + " forever\n" + + " endif\n"; + pcomp += + " b=0 c=0 d=0 a=0 r=a 1 r=a 2 (reset state)\n" + + " halt\n" + + " endif\n" + + "\n" + + " (in state d==0, expect a new code)\n" + + " (put length in r1 and inital part of offset in r2)\n" + + " c=a a=d a== 0 if\n" + + " a=c a>>= 6 a++ d=a\n" + + " a== 1 if (literal?)\n" + + " a+=c r=a 1 a=0 r=a 2\n" + + " else (3 to 5 byte match)\n" + + " d++ a=c a&= 63 a+= $3 r=a 1 a=0 r=a 2\n" + + " endif\n" + + " else\n" + + " a== 1 if (writing literal)\n" + + " a=c *b=a b++\n"; + if (!doe8) pcomp += " out\n"; + pcomp += + " a=r 1 a-- a== 0 if d=0 endif r=a 1 (if (--len==0) state=0)\n" + + " else\n" + + " a> 2 if (reading offset)\n" + + " a=r 2 a<<= 8 a|=c r=a 2 d-- (off=off<<8|c, --state)\n" + + " else (state==2, write match)\n" + + " a=r 2 a<<= 8 a|=c c=a a=b a-=c a-- c=a (c=i-off-1)\n" + + " d=r 1 (d=len)\n" + + " do (copy and output d=len bytes)\n" + + " a=*c *b=a c++ b++\n"; + if (!doe8) pcomp += " out\n"; + pcomp += + " d-- a=d a> 0 while\n" + + " (d=state=0. off, len don\'t matter)\n" + + " endif\n" + + " endif\n" + + " endif\n" + + " halt\n" + + "end\n"; + } + + // BWT with or without E8E9 + else if (level == 3) { // IBWT + hdr = "comp 9 16 $1+20 $1+20 "; // 2^$1 = block size in MB + pcomp = + "pcomp bwtrle c ;\n" + + "\n" + + " (read BWT, index into M, size in b)\n" + + " a> 255 ifnot\n" + + " *b=a b++\n" + + "\n" + + " (inverse BWT)\n" + + " elsel\n" + + "\n" + + " (index in last 4 bytes, put in c and R1)\n" + + " b-- a=*b\n" + + " b-- a<<= 8 a+=*b\n" + + " b-- a<<= 8 a+=*b\n" + + " b-- a<<= 8 a+=*b c=a r=a 1\n" + + "\n" + + " (save size in R2)\n" + + " a=b r=a 2\n" + + "\n" + + " (count bytes in H[~1..~255, ~0])\n" + + " do\n" + + " a=b a> 0 if\n" + + " b-- a=*b a++ a&= 255 d=a d! *d++\n" + + " forever\n" + + " endif\n" + + "\n" + + " (cumulative counts: H[~i=0..255] = count of bytes before i)\n" + + " d=0 d! *d= 1 a=0\n" + + " do\n" + + " a+=*d *d=a d--\n" + + " d<>a a! a> 255 a! d<>a until\n" + + "\n" + + " (build first part of linked list in H[0..idx-1])\n" + + " b=0 do\n" + + " a=c a>b if\n" + + " d=*b d! *d++ d=*d d-- *d=b\n" + + " b++ forever\n" + + " endif\n" + + "\n" + + " (rest of list in H[idx+1..n-1])\n" + + " b=c b++ c=r 2 do\n" + + " a=c a>b if\n" + + " d=*b d! *d++ d=*d d-- *d=b\n" + + " b++ forever\n" + + " endif\n" + + "\n"; + if (args[0] <= 4) { // faster IBWT list traversal limited to 16 MB blocks + pcomp += + " (copy M to low 8 bits of H to reduce cache misses in next loop)\n" + + " b=0 do\n" + + " a=c a>b if\n" + + " d=b a=*d a<<= 8 a+=*b *d=a\n" + + " b++ forever\n" + + " endif\n" + + "\n" + + " (traverse list and output or copy to M)\n" + + " d=r 1 b=0 do\n" + + " a=d a== 0 ifnot\n" + + " a=*d a>>= 8 d=a\n"; + if (doe8) pcomp += " *b=*d b++\n"; + else pcomp += " a=*d out\n"; + pcomp += + " forever\n" + + " endif\n" + + "\n"; + if (doe8) // IBWT+E8E9 + pcomp += + " (e8e9 transform to out)\n" + + " d=b b=0 do (for b=0..d-1, d = end of buf)\n" + + " a=b a==d ifnot\n" + + " a+= 4 a>= 8 b++\n" + + " *b=a a>>= 8 b++\n" + + " *b=a b++\n" + + " endif\n" + + " b=c\n" + + " endif\n" + + " endif\n" + + " a=*b out b++\n" + + " forever\n" + + " endif\n"; + pcomp += + " endif\n" + + " halt\n" + + "end\n"; + } else { // slower IBWT list traversal for all sized blocks + if (doe8) { // E8E9 after IBWT + pcomp += + " (R2 = output size without EOS)\n" + + " a=r 2 a-- r=a 2\n" + + "\n" + + " (traverse list (d = IBWT pointer) and output inverse e8e9)\n" + + " (C = offset = 0..R2-1)\n" + + " (R4 = last 4 bytes shifted in from MSB end)\n" + + " (R5 = temp pending output byte)\n" + + " c=0 d=r 1 do\n" + + " a=d a== 0 ifnot\n" + + " d=*d\n" + + "\n" + + " (store byte in R4 and shift out to R5)\n" + + " b=d a=*b a<<= 24 b=a\n" + + " a=r 4 r=a 5 a>>= 8 a|=b r=a 4\n" + + "\n" + + " (if E8|E9 xx xx xx 00|FF in R4:R5 then subtract c from x)\n" + + " a=c a> 3 if\n" + + " a=r 5 a&= 254 a== 232 if\n" + + " a=r 4 a>>= 24 b=a a++ a&= 254 a< 2 if\n" + + " a=r 4 a-=c a+= 4 a<<= 8 a>>= 8 \n" + + " b<>a a<<= 24 a+=b r=a 4\n" + + " endif\n" + + " endif\n" + + " endif\n" + + "\n" + + " (output buffered byte)\n" + + " a=c a> 3 if a=r 5 out endif c++\n" + + "\n" + + " forever\n" + + " endif\n" + + "\n" + + " (output up to 4 pending bytes in R4)\n" + + " b=r 4\n" + + " a=c a> 3 a=b if out endif a>>= 8 b=a\n" + + " a=c a> 2 a=b if out endif a>>= 8 b=a\n" + + " a=c a> 1 a=b if out endif a>>= 8 b=a\n" + + " a=c a> 0 a=b if out endif\n" + + "\n" + + " endif\n" + + " halt\n" + + "end\n"; + } else { + pcomp += + " (traverse list and output)\n" + + " d=r 1 do\n" + + " a=d a== 0 ifnot\n" + + " d=*d\n" + + " b=d a=*b out\n" + + " forever\n" + + " endif\n" + + " endif\n" + + " halt\n" + + "end\n"; + } + } + } + + // E8E9 or no preprocessing + else if (level == 0) { + hdr = "comp 9 16 0 0 "; + if (doe8) { // E8E9? + pcomp = + "pcomp e8e9 d ;\n" + + " a> 255 if\n" + + " a=c a> 4 if\n" + + " c= 4\n" + + " else\n" + + " a! a+= 5 a<<= 3 d=a a=b a>>=d b=a\n" + + " endif\n" + + " do a=c a> 0 if\n" + + " a=b out a>>= 8 b=a c--\n" + + " forever endif\n" + + " else\n" + + " *b=b a<<= 24 d=a a=b a>>= 8 a+=d b=a c++\n" + + " a=c a> 4 if\n" + + " a=*b out\n" + + " a&= 254 a== 232 if\n" + + " a=b a>>= 24 a++ a&= 254 a== 0 if\n" + + " a=b a>>= 24 a<<= 24 d=a\n" + + " a=b a-=c a+= 5\n" + + " a<<= 8 a>>= 8 a|=d b=a\n" + + " endif\n" + + " endif\n" + + " endif\n" + + " endif\n" + + " halt\n" + + "end\n"; + } else + pcomp = "end\n"; + } else + ZpaqError.Throw("Unsupported method"); + + // Build context model (comp, hcomp) assuming: + // H[0..254] = contexts + // H[255..511] = location of last byte i-255 + // M = last 64K bytes, filling backward + // C = pointer to most recent byte + // R1 = level 2 lz77 1+bytes expected until next code, 0=init + // R2 = level 2 lz77 first byte of code + var ncomp = 0; // number of components + var membits = args[0] + 20; + var sb = 5; // bits in last context + var comp = ""; + string hcomp = "hcomp\n" + + "c-- *c=a a+= 255 d=a *d=c\n"; + if (level == 2) { // put level 2 lz77 parse state in R1, R2 + hcomp += + " (decode lz77 into M. Codes:\n" + + " 00xxxxxx = literal length xxxxxx+1\n" + + " xx......, xx > 0 = match with xx offset bytes to follow)\n" + + "\n" + + " a=r 1 a== 0 if (init)\n" + + " a= " + Itos(111 + (doe8 ? 57 : 0)) + " (skip post code)\n" + + " else a== 1 if (new code?)\n" + + " a=*c r=a 2 (save code in R2)\n" + + " a> 63 if a>>= 6 a++ a++ (match)\n" + + " else a++ a++ endif (literal)\n" + + " else (read rest of code)\n" + + " a--\n" + + " endif endif\n" + + " r=a 1 (R1 = 1+expected bytes to next code)\n"; + } + + // Generate the context model + + while (mi < method.Length && ncomp < 254) { + + // parse command C[N1[,N2]...] into v = {C, N1, N2...} + var v = new List { method[mi++] }; + if (mi < method.Length && char.IsAsciiDigit(method[mi])) { + v.Add(method[mi++] - '0'); + while (mi < method.Length && (char.IsAsciiDigit(method[mi]) || method[mi] == ',' || method[mi] == '.')) { + if (char.IsAsciiDigit(method[mi])) + v[^1] = v[^1] * 10 + method[mi++] - '0'; + else { + v.Add(0); + ++mi; + } + } + } + + // c: context model + // N1%1000: 0=ICM 1..256=CM limit N1-1 + // N1/1000: number of times to halve memory + // N2: 1..255=offset mod N2. 1000..1255=distance to N2-1000 + // N3...: 0..255=byte mask + 256=lz77 state. 1000+=run of N3-1000 zeros. + if (v[0] == 'c') { + while (v.Count < 3) v.Add(0); + comp += Itos(ncomp) + " "; + sb = 11; // count context bits + if (v[2] < 256) sb += Lg(v[2]); + else sb += 6; + for (var i = 3; i < v.Count; ++i) + if (v[i] < 512) sb += NBits(v[i]) * 3 / 4; + if (sb > membits) sb = membits; + if (v[1] % 1000 == 0) comp += "icm " + Itos(sb - 6 - v[1] / 1000) + "\n"; + else comp += "cm " + Itos(sb - 2 - v[1] / 1000) + " " + Itos(v[1] % 1000 - 1) + "\n"; + + // special contexts + hcomp += "d= " + Itos(ncomp) + " *d=0\n"; + if (v[2] > 1 && v[2] <= 255) { // periodic context + if (Lg(v[2]) != Lg(v[2] - 1)) + hcomp += "a=c a&= " + Itos(v[2] - 1) + " hashd\n"; + else + hcomp += "a=c a%= " + Itos(v[2]) + " hashd\n"; + } else if (v[2] >= 1000 && v[2] <= 1255) // distance context + hcomp += "a= 255 a+= " + Itos(v[2] - 1000) + + " d=a a=*d a-=c a> 255 if a= 255 endif d= " + + Itos(ncomp) + " hashd\n"; + + // Masked context + for (var i = 3; i < v.Count; ++i) { + if (i == 3) hcomp += "b=c "; + if (v[i] == 255) + hcomp += "a=*b hashd\n"; // ordinary byte + else if (v[i] > 0 && v[i] < 255) + hcomp += "a=*b a&= " + Itos(v[i]) + " hashd\n"; // masked byte + else if (v[i] >= 256 && v[i] < 512) { // lz77 state or masked literal byte + hcomp += + "a=r 1 a> 1 if\n" + // expect literal or offset + " a=r 2 a< 64 if\n" + // expect literal + " a=*b "; + if (v[i] < 511) hcomp += "a&= " + Itos(v[i] - 256); + hcomp += " hashd\n" + + " else\n" + // expect match offset byte + " a>>= 6 hashd a=r 1 hashd\n" + + " endif\n" + + "else\n" + // expect new code + " a= 255 hashd a=r 2 hashd\n" + + "endif\n"; + } else if (v[i] >= 1256) // skip v[i]-1000 bytes + hcomp += "a= " + Itos(((v[i] - 1000) >> 8) & 255) + " a<<= 8 a+= " + + Itos((v[i] - 1000) & 255) + + " a+=b b=a\n"; + else if (v[i] > 1000) + hcomp += "a= " + Itos(v[i] - 1000) + " a+=b b=a\n"; + if (v[i] < 512 && i < v.Count - 1) + hcomp += "b++ "; + } + ++ncomp; + } + + // m,8,24: MIX, size, rate + // t,8,24: MIX2, size, rate + // s,8,32,255: SSE, size, start, limit + if ("mts".Contains((char)v[0]) && ncomp > (v[0] == 't' ? 1 : 0)) { + if (v.Count <= 1) v.Add(8); + if (v.Count <= 2) v.Add(24 + (v[0] == 's' ? 8 : 0)); + if (v[0] == 's' && v.Count <= 3) v.Add(255); + comp += Itos(ncomp); + sb = 5 + v[1] * 3 / 4; + if (v[0] == 'm') + comp += " mix " + Itos(v[1]) + " 0 " + Itos(ncomp) + " " + Itos(v[2]) + " 255\n"; + else if (v[0] == 't') + comp += " mix2 " + Itos(v[1]) + " " + Itos(ncomp - 1) + " " + Itos(ncomp - 2) + + " " + Itos(v[2]) + " 255\n"; + else // s + comp += " sse " + Itos(v[1]) + " " + Itos(ncomp - 1) + " " + Itos(v[2]) + " " + + Itos(v[3]) + "\n"; + if (v[1] > 8) { + hcomp += "d= " + Itos(ncomp) + " *d=0 b=c a=0\n"; + for (; v[1] >= 16; v[1] -= 8) { + hcomp += "a<<= 8 a+=*b"; + if (v[1] > 16) hcomp += " b++"; + hcomp += "\n"; + } + if (v[1] > 8) + hcomp += "a<<= 8 a+=*b a>>= " + Itos(16 - v[1]) + "\n"; + hcomp += "a<<= 8 *d=a\n"; + } + ++ncomp; + } + + // i: ISSE chain with order increasing by N1,N2... + if (v[0] == 'i' && ncomp > 0) { + hcomp += "d= " + Itos(ncomp - 1) + " b=c a=*d d++\n"; + for (var i = 1; i < v.Count && ncomp < 254; ++i) { + for (int j = 0; j < v[i] % 10; ++j) { + hcomp += "hash "; + if (i < v.Count - 1 || j < v[i] % 10 - 1) hcomp += "b++ "; + sb += 6; + } + hcomp += "*d=a"; + if (i < v.Count - 1) hcomp += " d++"; + hcomp += "\n"; + if (sb > membits) sb = membits; + comp += Itos(ncomp) + " isse " + Itos(sb - 6 - v[i] / 10) + " " + Itos(ncomp - 1) + "\n"; + ++ncomp; + } + } + + // a24,0,0: MATCH. N1=hash multiplier. N2,N3=halve buf, table. + if (v[0] == 'a') { + if (v.Count <= 1) v.Add(24); + while (v.Count < 4) v.Add(0); + comp += Itos(ncomp) + " match " + Itos(membits - v[3] - 2) + " " + + Itos(membits - v[2]) + "\n"; + hcomp += "d= " + Itos(ncomp) + " a=*d a*= " + Itos(v[1]) + + " a+=*c a++ *d=a\n"; + sb = 5 + (membits - v[2]) * 3 / 4; + ++ncomp; + } + + // w1,65,26,223,20,0: ICM-ISSE chain of length N1 with word contexts, + // where a word is a sequence of c such that c&N4 is in N2..N2+N3-1. + // Word is hashed by: hash := hash*N5+c+1 + // Decrease memory by 2^-N6. + if (v[0] == 'w') { + if (v.Count <= 1) v.Add(1); + if (v.Count <= 2) v.Add(65); + if (v.Count <= 3) v.Add(26); + if (v.Count <= 4) v.Add(223); + if (v.Count <= 5) v.Add(20); + if (v.Count <= 6) v.Add(0); + comp += Itos(ncomp) + " icm " + Itos(membits - 6 - v[6]) + "\n"; + for (int i = 1; i < v[1]; ++i) + comp += Itos(ncomp + i) + " isse " + Itos(membits - 6 - v[6]) + " " + + Itos(ncomp + i - 1) + "\n"; + hcomp += "a=*c a&= " + Itos(v[4]) + " a-= " + Itos(v[2]) + " a&= 255 a< " + + Itos(v[3]) + " if\n"; + for (int i = 0; i < v[1]; ++i) { + if (i == 0) hcomp += " d= " + Itos(ncomp); + else hcomp += " d++"; + hcomp += " a=*d a*= " + Itos(v[5]) + " a+=*c a++ *d=a\n"; + } + hcomp += "else\n"; + for (int i = v[1] - 1; i > 0; --i) + hcomp += " d= " + Itos(ncomp + i - 1) + " a=*d d++ *d=a\n"; + hcomp += " d= " + Itos(ncomp) + " *d=0\n" + + "endif\n"; + ncomp += v[1] - 1; + sb = membits - v[6]; + ++ncomp; + } + } + return hdr + Itos(ncomp) + "\n" + comp + hcomp + "halt\n" + pcomp; + } + + /// + /// Compresses into a single block of one segment, choosing the + /// algorithm from exactly as libzpaq's compressBlock. + /// + /// The block's data; E8E9 may transform it in place. + /// Receives the block, preceded by the locator tag. + /// + /// "LB,R,t" (level 0..5, block size, redundancy 0..255, type: 1 = text, 2 = x86) or an + /// explicit x/0 method. + /// + /// Segment filename, or . + /// Appended to the decimal size in the segment comment, or . + /// Whether the segment trailer carries the SHA-1 of the data. + internal static void CompressBlock(ZpaqBuffer input, IZpaqWriter output, string methodString, string? filename = null, byte[]? comment = null, bool storeSha1 = true) { + var method = methodString; + var n = input.Size; + var arg0 = Math.Max(Lg(n + 4095) - 20, 0); + + var type = 0u; + if (char.IsAsciiDigit(method[0])) { + var commas = 0; + Span arg = stackalloc int[4]; + arg.Clear(); + for (var i = 1; i < method.Length && commas < 4; ++i) { + if (method[i] == ',' || method[i] == '.') + ++commas; + else if (char.IsAsciiDigit(method[i])) + arg[commas] = arg[commas] * 10 + method[i] - '0'; + } + type = commas == 0 ? 512u : (uint)(arg[1] * 4 + arg[2]); + } + + byte[]? sha1 = storeSha1 ? Compression.Core.Checksums.Sha1.Compute(input.Span) : null; + + if (char.IsAsciiDigit(method[0])) { + var level = method[0] - '0'; + var doe8 = (int)(type & 2) * 2; + method = "x" + Itos(arg0); + var htsz = "," + Itos(19 + arg0 + (arg0 <= 6 ? 1 : 0)); + var sasz = "," + Itos(21 + arg0); + + if (level == 0) + method = "0" + Itos(arg0) + ",0"; + else if (level == 1) { + if (type < 40) + method += ",0"; + else { + method += "," + Itos(1 + doe8) + ","; + if (type < 80) method += "4,0,1,15"; + else if (type < 128) method += "4,0,2,16"; + else if (type < 256) method += "4,0,2" + htsz; + else if (type < 960) method += "5,0,3" + htsz; + else method += "6,0,3" + htsz; + } + } else if (level == 2) { + if (type < 32) + method += ",0"; + else { + method += "," + Itos(1 + doe8) + ","; + if (type < 64) method += "4,0,3" + htsz; + else method += "4,0,7" + sasz + ",1"; + } + } else if (level == 3) { + if (type < 20) + method += ",0"; + else if (type < 48) + method += "," + Itos(1 + doe8) + ",4,0,3" + htsz; + else if (type >= 640 || (type & 1) != 0) + method += "," + Itos(3 + doe8) + "ci1"; + else + method += "," + Itos(2 + doe8) + ",12,0,7" + sasz + ",1c0,0,511i2"; + } else if (level == 4) { + if (type < 12) + method += ",0"; + else if (type < 24) + method += "," + Itos(1 + doe8) + ",4,0,3" + htsz; + else if (type < 48) + method += "," + Itos(2 + doe8) + ",5,0,7" + sasz + "1c0,0,511"; + else if (type < 900) { + method += "," + Itos(doe8) + "ci1,1,1,1,2a"; + if ((type & 1) != 0) + method += "w"; + method += "m"; + } else + method += "," + Itos(3 + doe8) + "ci1"; + } else { + method += "," + Itos(doe8); + method += (type & 1) != 0 ? "w2c0,1010,255i1" : "w1i1"; + method += "c256ci1,1,1,1,1,1,2a"; + + const int nr = 1 << 12; + var pt = new int[256]; + var r = new int[nr]; + var p = input.Span; + if (level > 0) { + for (var i = 0; i < n; ++i) { + var k = i - pt[p[i]]; + if (k is > 0 and < nr) + ++r[k]; + pt[p[i]] = i; + } + } + + var n1 = n - r[1] - r[2] - r[3]; + for (var i = 0; i < 2; ++i) { + var period = 0; + var score = 0.0; + var t = 0; + for (var j = 5; j < nr && t < n1; ++j) { + var s = r[j] / (256.0 + n1 - t); + if (s > score) { + score = s; + period = j; + } + t += r[j]; + } + if (period > 4 && score > 0.1) { + method += "c0,0," + Itos(999 + period) + ",255i1"; + if (period <= 255) + method += "c0," + Itos(period) + "i1"; + n1 -= r[period]; + r[period] = 0; + } else + break; + } + method += "c0,2,0,255i1c0,3,0,0,255i1c0,4,0,0,0,255i1mm16ts19t0"; + } + } + + var args = new int[9]; + var config = MakeConfig(method, args); + var co = new ZpaqCompressor(output); + co.WriteTag(); + co.StartBlock(config, args); + var cs = Encoding.ASCII.GetBytes(Itos(n)); + if (comment != null) + cs = [.. cs, (byte)' ', .. comment]; + co.StartSegment(filename, cs); + if (args[1] is >= 1 and <= 7 && args[1] != 4) + co.Compress(new ZpaqLzBuffer(input, args)); + else { + if (args[1] is >= 4 and <= 7) + E8E9(input.Span); + co.Compress(input); + } + co.EndSegment(sha1); + co.EndBlock(); + } +} diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqPredictor.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqPredictor.cs new file mode 100644 index 000000000..01ab4be45 --- /dev/null +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqPredictor.cs @@ -0,0 +1,398 @@ +namespace FileFormat.Zpaq; + +/// +/// Bit predictor of a ZPAQ block: runs the components declared in COMP over the contexts +/// that HCOMP computes, and learns from every coded bit. +/// +/// +/// Converted from libzpaq 7.15 (Matt Mahoney, public domain), class Predictor, +/// interpreted path (predict0/update0). Integer behaviour, including the +/// wrap-around of the 32-bit products, follows the reference exactly because the coded +/// stream depends on every bit of every prediction. +/// +internal sealed class ZpaqPredictor { + private readonly ZpaqlMachine _z; + private readonly Component[] _comp = new Component[256]; + private readonly int[] _p = new int[256]; + private readonly uint[] _h = new uint[256]; + private int _c8 = 1; + private int _hmap4 = 1; + + private static readonly ushort[] SquashTable = BuildSquash(); + private static readonly short[] StretchTable = BuildStretch(); + + /// Per-component model state, the reference's Component. + private sealed class Component { + public uint Limit; + public uint Cxt; + public uint A, B, C; + public uint[] Cm = []; + public byte[] Ht = []; + public ushort[] A16 = []; + } + + /// Creates a predictor driven by the HCOMP machine . + public ZpaqPredictor(ZpaqlMachine z) { + this._z = z; + for (var i = 0; i < this._comp.Length; ++i) + this._comp[i] = new(); + } + + /// when the block declares at least one component. + public bool IsModeled => this._z.Header[6] != 0; + + /// Builds the model described by the block header. + public void Init() { + this._z.InitHcomp(); + Array.Clear(this._h); + Array.Clear(this._p); + this._c8 = 1; + this._hmap4 = 1; + for (var i = 0; i < 256; ++i) + this._comp[i] = new(); + + var header = this._z.Header; + int n = header[6]; + var cp = 7; + for (var i = 0; i < n; ++i) { + var cr = this._comp[i]; + switch (header[cp]) { + case ZpaqlMachine.Cons: + this._p[i] = (header[cp + 1] - 128) * 4; + break; + case ZpaqlMachine.Cm: + if (header[cp + 1] > 32) + ZpaqError.Throw("max size for CM is 32"); + cr.Cm = ZpaqlMachine.AllocatePow2(header[cp + 1]); + cr.Limit = (uint)(header[cp + 2] * 4); + Array.Fill(cr.Cm, 0x80000000u); + break; + case ZpaqlMachine.Icm: + if (header[cp + 1] > 26) + ZpaqError.Throw("max size for ICM is 26"); + cr.Limit = 1023; + cr.Cm = new uint[256]; + cr.Ht = ZpaqlMachine.AllocatePow2(header[cp + 1], 6); + for (var j = 0; j < cr.Cm.Length; ++j) + cr.Cm[j] = (uint)CmInit(j); + break; + case ZpaqlMachine.Match: + if (header[cp + 1] > 32 || header[cp + 2] > 32) + ZpaqError.Throw("max size for MATCH is 32 32"); + cr.Cm = ZpaqlMachine.AllocatePow2(header[cp + 1]); + cr.Ht = ZpaqlMachine.AllocatePow2(header[cp + 2]); + cr.Ht[0] = 1; + break; + case ZpaqlMachine.Avg: + if (header[cp + 1] >= i) + ZpaqError.Throw("AVG j >= i"); + if (header[cp + 2] >= i) + ZpaqError.Throw("AVG k >= i"); + break; + case ZpaqlMachine.Mix2: + if (header[cp + 1] > 32) + ZpaqError.Throw("max size for MIX2 is 32"); + if (header[cp + 3] >= i) + ZpaqError.Throw("MIX2 k >= i"); + if (header[cp + 2] >= i) + ZpaqError.Throw("MIX2 j >= i"); + cr.C = 1u << header[cp + 1]; + cr.A16 = ZpaqlMachine.AllocatePow2(header[cp + 1]); + Array.Fill(cr.A16, (ushort)32768); + break; + case ZpaqlMachine.Mix: { + if (header[cp + 1] > 32) + ZpaqError.Throw("max size for MIX is 32"); + if (header[cp + 2] >= i) + ZpaqError.Throw("MIX j >= i"); + if (header[cp + 3] < 1 || header[cp + 3] > i - header[cp + 2]) + ZpaqError.Throw("MIX m not in 1..i-j"); + int m = header[cp + 3]; + cr.C = 1u << header[cp + 1]; + var size = (1L << header[cp + 1]) * m; + if (size > Array.MaxLength) + throw new NotSupportedException("ZPAQ: MIX weight table exceeds what this runtime can allocate."); + cr.Cm = new uint[size]; + Array.Fill(cr.Cm, (uint)(65536 / m)); + break; + } + case ZpaqlMachine.Isse: + if (header[cp + 1] > 32) + ZpaqError.Throw("max size for ISSE is 32"); + if (header[cp + 2] >= i) + ZpaqError.Throw("ISSE j >= i"); + cr.Ht = ZpaqlMachine.AllocatePow2(header[cp + 1], 6); + cr.Cm = new uint[512]; + for (var j = 0; j < 256; ++j) { + cr.Cm[j * 2] = 1 << 15; + cr.Cm[j * 2 + 1] = (uint)Clamp512K(Stretch(CmInit(j) >> 8) * 1024); + } + break; + case ZpaqlMachine.Sse: + if (header[cp + 1] > 32) + ZpaqError.Throw("max size for SSE is 32"); + if (header[cp + 2] >= i) + ZpaqError.Throw("SSE j >= i"); + if (header[cp + 3] > header[cp + 4] * 4) + ZpaqError.Throw("SSE start > limit*4"); + cr.Cm = ZpaqlMachine.AllocatePow2(header[cp + 1], 5); + cr.Limit = (uint)(header[cp + 4] * 4); + for (var j = 0; j < cr.Cm.Length; ++j) + cr.Cm[j] = (uint)(Squash((j & 31) * 64 - 992) << 17 | header[cp + 3]); + break; + default: + ZpaqError.Throw("unknown component type"); + break; + } + cp += ZpaqlMachine.ComponentSize[header[cp]]; + } + } + + /// Probability (0..32767) that the next bit is a 1. + public int Predict() { + var header = this._z.Header; + var p = this._p; + int n = header[6]; + var cp = 7; + for (var i = 0; i < n; ++i) { + var cr = this._comp[i]; + switch (header[cp]) { + case ZpaqlMachine.Cons: + break; + case ZpaqlMachine.Cm: + cr.Cxt = this._h[i] ^ (uint)this._hmap4; + p[i] = Stretch((int)(cr.Cm[cr.Cxt & (uint)(cr.Cm.Length - 1)] >> 17)); + break; + case ZpaqlMachine.Icm: + if (this._c8 == 1 || (this._c8 & 0xf0) == 16) + cr.C = Find(cr.Ht, header[cp + 1] + 2, this._h[i] + 16 * (uint)this._c8); + cr.Cxt = cr.Ht[cr.C + (this._hmap4 & 15)]; + p[i] = Stretch((int)(cr.Cm[cr.Cxt & (uint)(cr.Cm.Length - 1)] >> 8)); + break; + case ZpaqlMachine.Match: + if (cr.A == 0) + p[i] = 0; + else { + cr.C = (uint)(cr.Ht[(cr.Limit - cr.B) & (uint)(cr.Ht.Length - 1)] >> (int)(7 - cr.Cxt)) & 1; + p[i] = Stretch(ZpaqTables.MatchDivisor[cr.A] * (cr.C == 1 ? -1 : 1) & 32767); + } + break; + case ZpaqlMachine.Avg: + p[i] = (p[header[cp + 1]] * header[cp + 3] + p[header[cp + 2]] * (256 - header[cp + 3])) >> 8; + break; + case ZpaqlMachine.Mix2: { + cr.Cxt = (this._h[i] + (uint)(this._c8 & header[cp + 5])) & (cr.C - 1); + int w = cr.A16[cr.Cxt]; + p[i] = (w * p[header[cp + 2]] + (65536 - w) * p[header[cp + 3]]) >> 16; + break; + } + case ZpaqlMachine.Mix: { + int m = header[cp + 3]; + cr.Cxt = this._h[i] + (uint)(this._c8 & header[cp + 5]); + cr.Cxt = (cr.Cxt & (cr.C - 1)) * (uint)m; + var wt = cr.Cm.AsSpan((int)cr.Cxt, m); + var sum = 0; + int j0 = header[cp + 2]; + for (var j = 0; j < m; ++j) + sum += ((int)wt[j] >> 8) * p[j0 + j]; + p[i] = Clamp2K(sum >> 8); + break; + } + case ZpaqlMachine.Isse: { + if (this._c8 == 1 || (this._c8 & 0xf0) == 16) + cr.C = Find(cr.Ht, header[cp + 1] + 2, this._h[i] + 16 * (uint)this._c8); + cr.Cxt = cr.Ht[cr.C + (this._hmap4 & 15)]; + var w0 = (int)cr.Cm[cr.Cxt * 2]; + var w1 = (int)cr.Cm[cr.Cxt * 2 + 1]; + p[i] = Clamp2K((w0 * p[header[cp + 2]] + w1 * 64) >> 16); + break; + } + case ZpaqlMachine.Sse: { + cr.Cxt = (this._h[i] + (uint)this._c8) * 32; + var pq = p[header[cp + 2]] + 992; + if (pq < 0) + pq = 0; + if (pq > 1983) + pq = 1983; + var wt = pq & 63; + pq >>= 6; + cr.Cxt += (uint)pq; + var mask = (uint)(cr.Cm.Length - 1); + p[i] = Stretch((int)(((cr.Cm[cr.Cxt & mask] >> 10) * (uint)(64 - wt) + (cr.Cm[(cr.Cxt + 1) & mask] >> 10) * (uint)wt) >> 13)); + cr.Cxt += (uint)(wt >> 5); + break; + } + default: + ZpaqError.Throw("component predict not implemented"); + break; + } + cp += ZpaqlMachine.ComponentSize[header[cp]]; + } + return Squash(p[n - 1]); + } + + /// Trains every component on the coded bit and advances the contexts. + public void Update(int y) { + var header = this._z.Header; + var p = this._p; + int n = header[6]; + var cp = 7; + for (var i = 0; i < n; ++i) { + var cr = this._comp[i]; + switch (header[cp]) { + case ZpaqlMachine.Cons: + break; + case ZpaqlMachine.Cm: + Train(cr, y); + break; + case ZpaqlMachine.Icm: { + var idx = cr.C + (this._hmap4 & 15); + cr.Ht[idx] = (byte)Next(cr.Ht[idx], y); + ref var pn = ref cr.Cm[cr.Cxt & (uint)(cr.Cm.Length - 1)]; + pn += (uint)((int)((uint)(y * 32767) - (pn >> 8)) >> 2); + break; + } + case ZpaqlMachine.Match: { + var htMask = (uint)(cr.Ht.Length - 1); + if ((int)cr.C != y) + cr.A = 0; + ref var cur = ref cr.Ht[cr.Limit & htMask]; + cur = (byte)(cur + cur + y); + if (++cr.Cxt == 8) { + cr.Cxt = 0; + ++cr.Limit; + cr.Limit &= (uint)((1L << header[cp + 2]) - 1); + var cmMask = (uint)(cr.Cm.Length - 1); + if (cr.A == 0) { + cr.B = cr.Limit - cr.Cm[this._h[i] & cmMask]; + if ((cr.B & htMask) != 0) + while (cr.A < 255 && cr.Ht[(cr.Limit - cr.A - 1) & htMask] == cr.Ht[(cr.Limit - cr.A - cr.B - 1) & htMask]) + ++cr.A; + } else if (cr.A < 255) + ++cr.A; + cr.Cm[this._h[i] & cmMask] = cr.Limit; + } + break; + } + case ZpaqlMachine.Avg: + break; + case ZpaqlMachine.Mix2: { + var err = (y * 32767 - Squash(p[i])) * header[cp + 4] >> 5; + int w = cr.A16[cr.Cxt]; + w += (err * (p[header[cp + 2]] - p[header[cp + 3]]) + (1 << 12)) >> 13; + if (w < 0) + w = 0; + if (w > 65535) + w = 65535; + cr.A16[cr.Cxt] = (ushort)w; + break; + } + case ZpaqlMachine.Mix: { + int m = header[cp + 3]; + var err = (y * 32767 - Squash(p[i])) * header[cp + 4] >> 4; + var wt = cr.Cm.AsSpan((int)cr.Cxt, m); + int j0 = header[cp + 2]; + for (var j = 0; j < m; ++j) + wt[j] = (uint)Clamp512K((int)wt[j] + ((err * p[j0 + j] + (1 << 12)) >> 13)); + break; + } + case ZpaqlMachine.Isse: { + var err = y * 32767 - Squash(p[i]); + ref var w0 = ref cr.Cm[cr.Cxt * 2]; + ref var w1 = ref cr.Cm[cr.Cxt * 2 + 1]; + w0 = (uint)Clamp512K((int)w0 + ((err * p[header[cp + 2]] + (1 << 12)) >> 13)); + w1 = (uint)Clamp512K((int)w1 + ((err + 16) >> 5)); + cr.Ht[cr.C + (this._hmap4 & 15)] = (byte)Next((int)cr.Cxt, y); + break; + } + case ZpaqlMachine.Sse: + Train(cr, y); + break; + } + cp += ZpaqlMachine.ComponentSize[header[cp]]; + } + + this._c8 += this._c8 + y; + if (this._c8 >= 256) { + this._z.Run((uint)(this._c8 - 256)); + this._hmap4 = 1; + this._c8 = 1; + for (var i = 0; i < n; ++i) + this._h[i] = this._z.H(i); + } else if (this._c8 is >= 16 and < 32) + this._hmap4 = (this._hmap4 & 0xf) << 5 | y << 4 | 1; + else + this._hmap4 = (this._hmap4 & 0x1f0) | (((this._hmap4 & 0xf) * 2 + y) & 0xf); + } + + /// Squash: x (-2048..2047) to probability 32768/(1+exp(-x/64)). + internal static int Squash(int x) => SquashTable[x + 2048]; + + /// Stretch: probability (0..32767) to ln(x/(32768-x))*64, the inverse of squash. + internal static int Stretch(int x) => StretchTable[x]; + + private static int Clamp2K(int x) => x < -2048 ? -2048 : x > 2047 ? 2047 : x; + + private static int Clamp512K(int x) => x < -(1 << 19) ? -(1 << 19) : x >= 1 << 19 ? (1 << 19) - 1 : x; + + private static int Next(int state, int y) => ZpaqTables.StateTable[state * 4 + y]; + + private static int CmInit(int state) { + var st = ZpaqTables.StateTable; + return ((st[state * 4 + 3] * 2 + 1) << 22) / (st[state * 4 + 2] + st[state * 4 + 3] + 1); + } + + private static void Train(Component cr, int y) { + ref var pn = ref cr.Cm[cr.Cxt & (uint)(cr.Cm.Length - 1)]; + var count = pn & 0x3ff; + var error = y * 32767 - (int)(pn >> 17); + pn += (uint)((error * ZpaqTables.CmDivisor[count] & -1024) + (count < cr.Limit ? 1 : 0)); + } + + /// + /// Finds the 16-byte row of for context , replacing the + /// least used of three candidate rows when none matches. + /// + private static uint Find(byte[] ht, int sizebits, uint cxt) { + var chk = (byte)(cxt >> sizebits); + var h0 = (cxt * 16) & (uint)(ht.Length - 16); + if (ht[h0] == chk) + return h0; + var h1 = h0 ^ 16; + if (ht[h1] == chk) + return h1; + var h2 = h0 ^ 32; + if (ht[h2] == chk) + return h2; + uint pick; + if (ht[h0 + 1] <= ht[h1 + 1] && ht[h0 + 1] <= ht[h2 + 1]) + pick = h0; + else if (ht[h1 + 1] < ht[h2 + 1]) + pick = h1; + else + pick = h2; + ht.AsSpan((int)pick, 16).Clear(); + ht[pick] = chk; + return pick; + } + + private static ushort[] BuildSquash() { + var t = new ushort[4096]; + ZpaqTables.SquashMiddle.CopyTo(t, 1376); + for (var i = 2720; i < 4096; ++i) + t[i] = 32767; + return t; + } + + private static short[] BuildStretch() { + var t = new short[32768]; + var k = 16384; + var runs = ZpaqTables.StretchRunLengths; + for (var i = 0; i < 712; ++i) + for (int j = runs[i]; j > 0; --j) + t[k++] = (short)i; + for (var i = 0; i < 16384; ++i) + t[i] = (short)-t[32767 - i]; + return t; + } +} diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqRangeCoder.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqRangeCoder.cs deleted file mode 100644 index 091f584f3..000000000 --- a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqRangeCoder.cs +++ /dev/null @@ -1,232 +0,0 @@ -namespace FileFormat.Zpaq; - -/// -/// Shared constants and the safety argument of the ZPAQ binary range coder. -/// -/// -/// -/// The coder is a carry-propagating binary range coder. It carries a 32-bit -/// range and an arbitrarily long low, of which only the pending -/// tail is held in memory: one cached byte plus a count of deferred 0xFF -/// bytes that a later carry may still turn into 0x00. Splitting the range -/// by bound = (range / 2^16) * p assigns the lower subrange to a 1 bit and -/// the upper subrange to a 0 bit, so the more confident the model is that a 1 -/// follows, the cheaper coding that 1 becomes. -/// -/// Invariant. On entry to every bit, -/// 2^24 <= range <= 2^32 - 1 and 1 <= p <= 65535. Both -/// subranges are then non-empty, with width at least 256: -/// -/// -/// -/// the 1 subrange has width bound = (range / 2^16) * p >= (2^24 / 2^16) * 1 = 256; -/// -/// -/// the 0 subrange has width -/// range - bound >= range - (range / 2^16) * 65535 -/// = range - (range / 2^16) * 2^16 + (range / 2^16) -/// >= (range / 2^16) >= 256, -/// because range - (range / 2^16) * 2^16 is the non-negative remainder -/// of the integer division. -/// -/// -/// -/// Renormalisation multiplies range by 256 while it is below 2^24. Since it -/// is never zero it reaches 2^24 in at most two steps, and since each step starts -/// from a value below 2^24 the result stays below 2^32, so the invariant is -/// restored rather than merely approached. The interval can therefore never -/// collapse to zero width, and the decoder — which performs the identical integer -/// arithmetic — always finds its code word strictly inside exactly one subrange. -/// -/// -/// The bound also keeps low small enough to compute exactly: -/// low + range < 2^33 holds initially and is preserved by both coding -/// (which never increases the sum) and renormalisation (where -/// (low mod 2^24) + range < 2^25 before the common factor of 256), so -/// low never needs more than 33 bits and the carry out of bit 32 is always -/// a single bit. -/// -/// -/// Reference: Matt Mahoney, The ZPAQ Open Standard Format for Highly Compressed -/// Data (level 1/2 specification), section on arithmetic coding; and -/// Data Compression Explained, chapter 4, on binary arithmetic coding with -/// carry counting. -/// -/// -public static class ZpaqRangeCoder { - - /// Lower bound of the normalised range; the coder renormalises below this. - public const uint RangeMinimum = 0x01000000u; - - /// Value at or above which the top byte of low may still be bumped by a carry. - public const uint CarryEdge = 0xFF000000u; - - /// Number of fractional bits in a probability, so probabilities span 0..2^16. - public const int ProbabilityBits = 16; - - /// Smallest probability of a 1 bit the coder accepts. - public const int MinimumProbability = 1; - - /// Largest probability of a 1 bit the coder accepts. - public const int MaximumProbability = 65535; - - /// Number of low bytes the encoder pushes out when the message ends. - public const int FlushBytes = 5; - - /// - /// Computes the split point between the 1 subrange and the 0 subrange. - /// - /// The current range, at least . - /// Probability of a 1 bit, clamped into 1..65535. - /// The width of the 1 subrange, at least 256 and at least 256 below . - public static uint Split(uint range, int probabilityOfOne) { - var p = (uint)Math.Clamp(probabilityOfOne, MinimumProbability, MaximumProbability); - return (range >> ProbabilityBits) * p; - } -} - -/// -/// Carry-propagating binary range encoder. See for the -/// invariant that keeps both subranges non-empty. -/// -public sealed class ZpaqRangeEncoder { - - private readonly Stream _output; - private ulong _low; - private uint _range = uint.MaxValue; - private byte _cache; - private int _pending = 1; - - /// - /// Creates an encoder writing its bytes to the given stream. - /// - /// Destination for the coded bytes. - /// Thrown if is null. - public ZpaqRangeEncoder(Stream output) { - ArgumentNullException.ThrowIfNull(output); - this._output = output; - } - - /// Gets the current range, for tests that assert the coder invariant. - public uint Range => this._range; - - /// - /// Codes one bit against the given probability. - /// - /// The bit to code; zero or non-zero. - /// Probability that the bit is 1, clamped into 1..65535. - public void EncodeBit(int bit, int probabilityOfOne) { - var bound = ZpaqRangeCoder.Split(this._range, probabilityOfOne); - if (bit != 0) - this._range = bound; - else { - this._low += bound; - this._range -= bound; - } - - while (this._range < ZpaqRangeCoder.RangeMinimum) { - this.ShiftLow(); - this._range <<= 8; - } - } - - /// - /// Pushes out the remaining bytes of low, ending the coded stream. - /// - public void Flush() { - for (var i = 0; i < ZpaqRangeCoder.FlushBytes; ++i) - this.ShiftLow(); - } - - /// - /// Emits the top byte of low, deferring it while a later carry could still - /// increment it, and shifts low up by one byte. - /// - private void ShiftLow() { - var carry = (uint)(this._low >> 32); - var value = (uint)this._low; - - // While the top byte is 0xFF a carry would ripple through it, so it is only - // counted, not emitted. Once a byte arrives that either cannot carry or has - // just carried, the whole deferred run is resolved at once. - if (value < ZpaqRangeCoder.CarryEdge || carry != 0) { - var held = this._cache; - do { - this._output.WriteByte((byte)(held + carry)); - held = 0xFF; - --this._pending; - } while (this._pending != 0); - this._cache = (byte)(value >> 24); - } - - ++this._pending; - this._low = (ulong)(value & 0x00FFFFFFu) << 8; - } -} - -/// -/// Carry-propagating binary range decoder, the exact mirror of -/// . -/// -public sealed class ZpaqRangeDecoder { - - private readonly byte[] _input; - private int _position; - private uint _range = uint.MaxValue; - private uint _code; - - /// - /// Creates a decoder reading from the given buffer, priming its code word from - /// the first bytes. - /// - /// Buffer holding the coded bytes. - /// Index of the first coded byte. - /// Thrown if is null. - public ZpaqRangeDecoder(byte[] input, int offset) { - ArgumentNullException.ThrowIfNull(input); - this._input = input; - this._position = offset; - - // The encoder's first flushed byte is always the initial empty cache, so the - // code word is the five leading bytes read big-endian into 32 bits. - for (var i = 0; i < ZpaqRangeCoder.FlushBytes; ++i) - this._code = (this._code << 8) | this.NextByte(); - } - - /// Gets the current range, for tests that assert the coder invariant. - public uint Range => this._range; - - /// - /// Decodes one bit against the given probability. - /// - /// Probability that the bit is 1, clamped into 1..65535. - /// The decoded bit, 0 or 1. - public int DecodeBit(int probabilityOfOne) { - var bound = ZpaqRangeCoder.Split(this._range, probabilityOfOne); - - int bit; - if (this._code < bound) { - bit = 1; - this._range = bound; - } else { - bit = 0; - this._code -= bound; - this._range -= bound; - } - - while (this._range < ZpaqRangeCoder.RangeMinimum) { - this._range <<= 8; - this._code = (this._code << 8) | this.NextByte(); - } - - return bit; - } - - /// - /// Reads the next coded byte, or zero past the end of the buffer. Past the end - /// the encoder's flush has already pinned every remaining bit, so the padding - /// value only has to be the same on both sides. - /// - private uint NextByte() => - this._position < this._input.Length ? this._input[this._position++] : 0u; -} diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqReader.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqReader.cs index ff3a50a78..bec85b951 100644 --- a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqReader.cs +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqReader.cs @@ -1,576 +1,523 @@ +using System.Buffers.Binary; using System.Text; namespace FileFormat.Zpaq; /// -/// Reads the journaling index of a ZPAQ archive, exposing the files recorded -/// across all transactions. +/// Reads ZPAQ archives in both layouts the format defines: the journaling layout of +/// zpaq 6.x/7.x (versioned transactions of c/d/h/i blocks with +/// deduplicated, SHA-1 checked fragments) and the plain streaming layout (one file per +/// block or segment run). /// /// -/// ZPAQ archives contain a ZPAQL virtual-machine program that is required to -/// decompress the payload. This reader parses only the journaling structure -/// (block headers, transaction metadata) to enumerate entries and their -/// attributes. Decompression is not supported; always -/// throws . +/// The archive walk follows Jidac::read_archive of zpaq 7.15 (Matt Mahoney, public +/// domain); block decoding is the libzpaq conversion in this namespace. Journaling block +/// names are jDC<YYYYMMDDHHMMSS><type><number:10> and their segment comments +/// end in "jDC\x01". Encrypted archives (AES-256 with a 32-byte salt) are refused. /// public sealed class ZpaqReader : IDisposable { - private readonly Stream _stream; - private readonly bool _leaveOpen; + private static ReadOnlySpan JournalMarker => "jDC\x01"u8; + + private readonly Stream _stream; + private readonly bool _leaveOpen; + private readonly List _ht = [new([], -2)]; + private readonly List _blocks = []; + private readonly List _versions = []; + private readonly List _log = []; private readonly List _entries = []; - // Captured uncompressed data-block bytes keyed by filename (last write wins), - // populated for STORED data blocks so this reader can extract archives that - // were written without ZPAQL compression (the layout ZpaqWriter emits). - private readonly Dictionary _dataByName = new(StringComparer.Ordinal); - private bool _disposed; - - /// - /// Gets the entries discovered by scanning the archive journal. - /// The list reflects the last recorded state of each file across all - /// transactions (i.e. later transactions that mention the same filename - /// supersede earlier ones in the final view). - /// - public IReadOnlyList Entries => _entries; - - // ── Construction ───────────────────────────────────────────────────────── - - /// - /// Opens a ZPAQ archive stream and scans its journal. - /// - /// - /// A readable stream positioned at the beginning of a ZPAQ archive. - /// The stream does not need to be seekable; the reader performs a single - /// forward scan. - /// - /// - /// to leave open when - /// this reader is disposed; (default) to dispose it. - /// - /// - /// Thrown when is . - /// - /// - /// Thrown when is not readable. - /// - /// - /// Thrown when the stream contains no recognizable ZPAQ blocks. - /// + private int _cachedBlock = -1; + private byte[] _cachedData = []; + private bool _disposed; + + private sealed record Fragment(byte[] Sha1, int Usize); + + private sealed class Block(uint start, long offset) { + public uint Start = start; + public long Offset = offset; + public long Usize = -1; + public long Bsize; + public uint Frags; + } + + private sealed record VersionInfo(long Date, long CompressedSize); + + private sealed record IndexRecord(int Version, string Name, long Date, long Attributes, List Fragments, List<(long, int)> Segments); + + /// Opens a ZPAQ archive and reads its index. + /// A readable stream positioned at the start of the archive. + /// Whether to leave open on dispose. + /// The data is not a ZPAQ archive. + /// The archive is encrypted. public ZpaqReader(Stream stream, bool leaveOpen = false) { ArgumentNullException.ThrowIfNull(stream); if (!stream.CanRead) throw new ArgumentException("Stream must be readable.", nameof(stream)); - - _stream = stream; - _leaveOpen = leaveOpen; - - ScanJournal(); - } - - // ── Journal scanning ───────────────────────────────────────────────────── - - /// - /// Scans the stream for ZPAQ blocks and builds the entry list from any - /// header ('c') blocks whose content is accessible (uncompressed or stored). - /// - private void ScanJournal() { - // We maintain a byte-level sliding window to detect the 3-byte "zPQ" - // prefix even when the stream is not seekable. - // For each block we find: - // • record the block's raw byte span (for CompressedSize accounting) - // • if it is a header ('c') block, attempt to parse file metadata - // • group blocks by transaction number - - var raw = new BufferedStream(_stream, 65536); - var rawBytes = new RawByteReader(raw); - - // Map from filename → latest entry (journaling: last write wins). - var latestByName = new Dictionary(StringComparer.Ordinal); - // Cumulative data-block bytes associated with the current transaction. - long txDataBytes = 0; - var txVersion = 0; - // Names collected from the current transaction's header block. - var txNames = new List<(string Name, long Size, DateTime? Modified)>(); - // Raw STORED bytes from the current transaction's data ('d') block(s). - var txData = new List(); - // Running block-start position (approximate; only accurate when seekable). - long blockStart = 0; - var foundAnyBlock = false; - - while (true) { - // Scan forward until we find "zPQ". - if (!rawBytes.ScanToPrefix(ZpaqConstants.BlockPrefix)) - break; - - foundAnyBlock = true; - blockStart = rawBytes.Position - 3; // prefix length - - // Read level byte and block-type byte. - var lvl = rawBytes.ReadByte(); - if (lvl < 0) break; - var type = rawBytes.ReadByte(); - if (type < 0) break; - - switch ((byte)type) { - case ZpaqConstants.BlockTypeHeader: - // 'c' block — start of a new transaction. - // Flush the previous transaction into the entry list. - FlushTransaction(latestByName, txNames, txDataBytes, txVersion, txData, _dataByName); - - txVersion++; - txDataBytes = 0; - txNames.Clear(); - txData.Clear(); - - // A header block in a level-1 archive that was created with - // "zpaq add" uses stored (uncompressed) content so that the - // journal can be scanned without decompressing. The block - // payload immediately follows the 5-byte block header and is - // terminated by a 0xFF byte (end-of-block marker in ZPAQ1). - ParseHeaderBlockPayload(rawBytes, txNames); - break; - - case ZpaqConstants.BlockTypeData: - // 'd' block — data payload. Capture the STORED bytes so Extract can - // return them; MeasureBlockPayload's accounting comes from the count. - var captured = CaptureBlockPayload(rawBytes); - txData.AddRange(captured); - txDataBytes += captured.Length; - break; - - case ZpaqConstants.BlockTypeIndex: - // 'h' block — transaction close / hash block. Flush. - FlushTransaction(latestByName, txNames, txDataBytes, txVersion, txData, _dataByName); - txVersion++; - txDataBytes = 0; - txNames.Clear(); - txData.Clear(); - SkipBlockPayload(rawBytes); - break; - - case ZpaqConstants.BlockTypeCompressed: - default: - // Unknown or compressed data block — skip. - SkipBlockPayload(rawBytes); - break; - } + this._leaveOpen = leaveOpen; + if (stream.CanSeek) + this._stream = stream; + else { + var copy = new MemoryStream(); + stream.CopyTo(copy); + copy.Position = 0; + this._stream = copy; + if (!leaveOpen) + stream.Dispose(); + this._leaveOpen = false; } - - // Flush any trailing transaction that had no 'h' block. - FlushTransaction(latestByName, txNames, txDataBytes, txVersion, txData, _dataByName); - - if (!foundAnyBlock) - ThrowInvalidData("No ZPAQ blocks found in stream."); - - // Build the final entry list: latest state of each file. - _entries.AddRange(latestByName.Values - .OrderBy(e => e.FileName, StringComparer.Ordinal)); + this.ReadArchive(); + this._entries.AddRange(this.Snapshot(int.MaxValue)); } - // ── Header block parsing ───────────────────────────────────────────────── - - /// - /// Attempts to parse the content of a ZPAQ level-1 journaling 'c' block. - /// - /// A stored (not-ZPAQL-compressed) 'c' block has the layout: - /// 8 bytes : Windows FILETIME of the transaction date/time - /// For each file in the transaction: - /// 1 byte : attribute flags (0x20 = directory on Windows, - /// 0x10 = directory on Unix) - /// variable : null-terminated UTF-8 filename - /// 8 bytes : uncompressed file size (little-endian int64) - /// 0xFF : end-of-block marker - /// - /// If the first byte of the payload is NOT a valid attribute byte - /// (i.e. it is 0xFF, meaning an immediately empty block, or it - /// indicates a ZPAQL program header) we fall through gracefully. - /// - private static void ParseHeaderBlockPayload( - RawByteReader reader, - List<(string Name, long Size, DateTime? Modified)> names) { - - // The block payload may be preceded by a 2-byte ZPAQL program length - // (big-endian) in ZPAQ level-1 compressed blocks. In journaling archives - // created by the reference `zpaq` tool the 'c' block content is stored - // verbatim (not ZPAQL-compressed) and starts immediately with the - // 8-byte Windows FILETIME. - - // Read the 8-byte transaction timestamp (Windows FILETIME, little-endian). - Span tsBytes = stackalloc byte[8]; - if (!reader.TryReadBytes(tsBytes)) - return; // truncated — give up - - var ft = BitConverter.ToInt64(tsBytes); - var txDate = DecodeWindowsFileTime(ft); - - // Read file entries until we hit 0xFF (end-of-block). - Span szBytes = stackalloc byte[8]; // moved outside loop to satisfy CA2014 - while (true) { - var attr = reader.ReadByte(); - if (attr < 0 || attr == 0xFF) - break; // EOF or end-of-block marker - - // Read null-terminated UTF-8 filename. - var name = reader.ReadNullTerminatedString(); - if (name.Length == 0) { - // Skip the 8-byte size field and continue. - reader.Skip(8); - continue; - } + /// Files and directories present in the latest version, ordered by name. + public IReadOnlyList Entries => this._entries; - // Read 8-byte uncompressed size. - if (!reader.TryReadBytes(szBytes)) - break; - var size = BitConverter.ToInt64(szBytes); + /// Number of versions (transactions) in the archive. + public int VersionCount => this._versions.Count; - names.Add((name, size, txDate)); - } - } + /// Number of blocks that failed to decode and were skipped while reading the index. + public int Errors { get; private set; } - // ── Block payload helpers ───────────────────────────────────────────────── - - /// - /// Measures the byte length of the current block payload by scanning - /// forward to the next "zPQ" prefix (or end of stream) without consuming - /// the prefix itself. Returns the number of payload bytes consumed. - /// - private static long MeasureBlockPayload(RawByteReader reader) { - var start = reader.Position; - reader.SkipToNextBlock(); - return reader.Position - start; + /// UTC date of version (1-based), or for a streaming archive. + public DateTime? GetVersionDate(int version) { + ArgumentOutOfRangeException.ThrowIfLessThan(version, 1); + ArgumentOutOfRangeException.ThrowIfGreaterThan(version, this._versions.Count); + return ZpaqDate.ToDateTime(this._versions[version - 1].Date); } - /// - /// Captures the current block's payload bytes (everything up to, but not - /// including, the next "zPQ" prefix or end of stream). Used for STORED data - /// blocks so their raw bytes can be returned by . - /// - private static byte[] CaptureBlockPayload(RawByteReader reader) => - reader.CaptureToNextBlock(); - - /// - /// Skips the current block payload, positioning the reader just before - /// the next "zPQ" prefix (or at end of stream). - /// - private static void SkipBlockPayload(RawByteReader reader) => - reader.SkipToNextBlock(); - - // ── Transaction flushing ───────────────────────────────────────────────── - - private static void FlushTransaction( - Dictionary dest, - List<(string Name, long Size, DateTime? Modified)> names, - long dataBytes, - int version, - List data, - Dictionary dataByName) { - if (names.Count == 0) - return; - - // Distribute the data-block bytes equally across files in the transaction - // as a rough approximation (ZPAQ doesn't store per-file compressed sizes). - var perFile = names.Count > 0 ? dataBytes / names.Count : 0; - - // Slice the captured STORED transaction bytes per file in header order using - // each file's recorded size. Only valid for the uncompressed layout this - // toolkit's writer emits; ZPAQL-compressed blocks leave dataByName unset and - // Extract surfaces them as empty. - var dataOffset = 0; - foreach (var (name, size, modified) in names) { - var isDir = name.EndsWith('/') || name.EndsWith('\\'); - var entry = new ZpaqEntry( - fileName: NormalizeName(name), - size: size, - compressedSize: isDir ? 0 : perFile, - lastModified: modified, - isDirectory: isDir, - version: version); - - dest[entry.FileName] = entry; // later transaction supersedes earlier - - if (!isDir && size >= 0 && dataOffset + size <= data.Count) { - var slice = new byte[size]; - data.CopyTo(dataOffset, slice, 0, (int)size); - dataByName[entry.FileName] = slice; // later transaction supersedes earlier - dataOffset += (int)size; - } - } + /// The archive contents as of version (1-based). + public IReadOnlyList GetEntries(int version) { + ArgumentOutOfRangeException.ThrowIfLessThan(version, 1); + ArgumentOutOfRangeException.ThrowIfGreaterThan(version, this._versions.Count); + return this.Snapshot(version); } - // ── Utilities ───────────────────────────────────────────────────────────── - - private static string NormalizeName(string name) => - name.Replace('\\', '/'); + /// Returns the entry's content as a read-only stream. + public Stream Extract(ZpaqEntry entry) => new MemoryStream(this.ExtractBytes(entry), writable: false); - private static DateTime? DecodeWindowsFileTime(long ft) { - if (ft <= 0) - return null; - - try { - var ticks = ft - ZpaqConstants.WindowsToUnixEpochTicks; - if (ticks < 0) - return null; - return new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc) - .AddTicks(ticks); - } catch { - return null; - } - } - - private static void ThrowInvalidData(string message) => - throw new InvalidDataException(message); - - // ── Extract (not supported) ─────────────────────────────────────────────── - - /// - /// Returns the entry's uncompressed bytes as a stream when the data block was - /// STORED (the layout this toolkit's emits). - /// - /// - /// General ZPAQL-compressed archives require executing a ZPAQL virtual machine - /// which is out of scope; for those the captured-data map is empty and this - /// method throws . - /// - public Stream Extract(ZpaqEntry entry) { + /// Decodes the entry's content, verifying every fragment's (or segment's) SHA-1. + /// The data is corrupt or a checksum does not match. + public byte[] ExtractBytes(ZpaqEntry entry) { ArgumentNullException.ThrowIfNull(entry); + ObjectDisposedException.ThrowIf(this._disposed, this); if (entry.IsDirectory) - return new MemoryStream([], writable: false); - if (_dataByName.TryGetValue(entry.FileName, out var bytes)) - return new MemoryStream(bytes, writable: false); - throw new NotSupportedException( - "ZPAQ decompression of ZPAQL-compressed blocks requires a ZPAQL virtual machine which is not implemented."); + return []; + return entry.Segments.Count > 0 ? this.ExtractStreaming(entry) : this.ExtractJournaling(entry); } - // ── IDisposable ─────────────────────────────────────────────────────────── - - /// + /// public void Dispose() { - if (!_disposed) { - _disposed = true; - if (!_leaveOpen) - _stream.Dispose(); - } + if (this._disposed) + return; + this._disposed = true; + if (!this._leaveOpen) + this._stream.Dispose(); } -} - -// ── Internal streaming helper ───────────────────────────────────────────────── -/// -/// A forward-only, low-allocation byte reader that supports the scanning -/// operations needed by . -/// -internal sealed class RawByteReader { - private readonly Stream _stream; - private readonly byte[] _buf; - private int _pos; // read position within _buf - private int _len; // valid bytes in _buf - private long _streamOffset; // bytes consumed from stream so far - - // The "zPQ" prefix as a cached value. - private static ReadOnlySpan Prefix => ZpaqConstants.BlockPrefix; - private const int PrefixLen = 3; - - // Lookahead window — we keep the last (PrefixLen - 1) bytes of each chunk - // in the buffer overlap so we never miss a prefix that straddles a chunk - // boundary. - private const int BufSize = 65536; - private const int Overlap = PrefixLen - 1; // = 2 - - internal RawByteReader(Stream stream) { - _stream = stream; - _buf = new byte[BufSize + Overlap]; - _pos = Overlap; // first Overlap bytes reserved for tail-of-previous-chunk - _len = Overlap; // nothing real yet + // ── index ────────────────────────────────────────────────────────────────── + + private void ReadArchive() { + var s = this._stream; + s.Position = 0; + Span head = stackalloc byte[4]; + var nr = s.ReadAtLeast(head, 4, throwOnEndOfStream: false); + if (nr > 0 && !head[..nr].SequenceEqual("7kSt"u8[..nr]) && (nr < 4 || !head[..3].SequenceEqual("zPQ"u8) || head[3] < 1)) { + if (nr == 4 && head[..3].SequenceEqual("zPQ"u8)) + throw new InvalidDataException("ZPAQ: unsupported block level."); + throw new InvalidDataException("Not a ZPAQ archive (or an encrypted one, which needs the password-derived key)."); + } + s.Position = 0; + + var lastFile = ""; + long blockOffset = 0; + long dataOffset = 0; + var foundData = false; + var first = true; + var done = false; + var dt = new Dictionary(StringComparer.Ordinal); + + while (!done) { + var d = new ZpaqDecompresser(new ZpaqStreamReader(s)); + var jumped = false; + try { + while (!jumped && d.FindBlock()) { + foundData = true; + var segs = 0; + var skip = false; + string? filename; + while ((filename = d.FindFilename()) != null) { + if (filename.Length > 0) + lastFile = filename.Replace('\\', '/'); + var comment = d.ReadComment(); + + if (comment.AsSpan().EndsWith(JournalMarker)) { + if (Encoding.UTF8.GetByteCount(filename) != 28 || !filename.StartsWith("jDC", StringComparison.Ordinal)) + ZpaqError.Throw("bad journaling block name"); + if (skip) + ZpaqError.Throw("mixed journaling and streaming block"); + + long usize = 0; + for (var i = 0; i < comment.Length && char.IsAsciiDigit((char)comment[i]); ++i) { + usize = usize * 10 + comment[i] - '0'; + if (usize > 0xffffffff) + ZpaqError.Throw("journaling block too big"); + } + long fdate = 0, num = 0; + int k; + for (k = 3; k < 17 && char.IsAsciiDigit(filename[k]); ++k) + fdate = fdate * 10 + filename[k] - '0'; + if (k != 17 || fdate < 19000000000000L || fdate >= 30000000000000L) + ZpaqError.Throw("bad date"); + for (k = 18; k < 28 && char.IsAsciiDigit(filename[k]); ++k) + num = num * 10 + filename[k] - '0'; + if (k != 28 || num > 0xffffffff) + ZpaqError.Throw("bad fragment"); + + var type = filename[17]; + var os = new ZpaqBuffer((int)Math.Min(usize, 1 << 20)) { Limit = usize }; + if (type is 'c' or 'h' or 'i') { + var sha1 = new ZpaqSha1(); + d.SetOutput(os); + d.SetSha1(sha1); + d.Decompress(); + var stored = d.ReadSegmentEnd(); + d.SetOutput(null); + d.SetSha1(null); + if (os.Size != usize) + ZpaqError.Throw("bad block size"); + if (usize != sha1.Size) + ZpaqError.Throw("bad checksum size"); + if (stored != null && !stored.AsSpan().SequenceEqual(sha1.Result())) + ZpaqError.Throw("bad checksum"); + } else + d.ReadSegmentEnd(); + + switch (type) { + case 'c': { + if (os.Size < 8) + ZpaqError.Throw("c block too small"); + dataOffset = s.Position + 1 - d.Buffered; + var jmp = BinaryPrimitives.ReadInt64LittleEndian(os.Span); + if (jmp < 0) { + done = true; // incomplete transaction: roll back to here + jumped = true; + break; + } + this._versions.Add(new(fdate, jmp)); + if (jmp > 0) { + s.Position = dataOffset + jmp; + jumped = true; + } + break; + } + case 'h': { + if (this._versions.Count == 0) + ZpaqError.Throw("fragment table before transaction header"); + if (os.Size % 24 != 4) + ZpaqError.Throw("bad h block size"); + var n = (uint)((os.Size - 4) / 24); + if (num < 1 || num + n > 0xffffffff) + ZpaqError.Throw("bad h fragment"); + var span = os.Span; + var bsize = BinaryPrimitives.ReadUInt32LittleEndian(span); + var p = 4; + for (var i = 0u; i < n; ++i) { + if (i == 0) + this._blocks.Add(new((uint)num, dataOffset) { Usize = 8, Bsize = bsize, Frags = n }); + while (this._ht.Count <= num + i) + this._ht.Add(new([], -2)); + var hash = span.Slice(p, 20).ToArray(); + p += 20; + var f = BinaryPrimitives.ReadUInt32LittleEndian(span[p..]); + p += 4; + if (f > 0x7fffffff) + ZpaqError.Throw("fragment too big"); + this._ht[(int)(num + i)] = new(hash, (int)f); + this._blocks[^1].Usize += f + 4u; + } + dataOffset += bsize; + break; + } + case 'i': { + if (this._versions.Count == 0) + ZpaqError.Throw("index before transaction header"); + this.ParseIndex(os.Span, dt); + break; + } + case 'd': + break; + default: + ZpaqError.Throw("unexpected journaling block"); + break; + } + if (jumped) + break; + } else { + // Streaming format: each segment is (a part of) a file. + if (this._versions.Count == 0) + this._versions.Add(new(0, -1)); + d.ReadSegmentEnd(); + skip = true; + var fn = lastFile; + if (filename.Length > 0 || first || !dt.TryGetValue(fn, out var rec)) { + rec = new(this._versions.Count, fn, ParseStreamingDate(comment), ParseStreamingAttributes(comment), [], []); + dt[fn] = rec; + this._log.Add(rec); + } + rec.Segments.Add((blockOffset, segs)); + if (segs == 0 || this._blocks.Count == 0) + this._blocks.Add(new((uint)this._ht.Count, blockOffset)); + this._ht.Add(new([], -1)); + } + ++segs; + first = false; + } + if (!jumped) + blockOffset = s.Position - d.Buffered; + } + if (!jumped) + done = true; + } catch (InvalidDataException) when (foundData) { + // Like zpaq: report, then resume scanning for the next block after the bad one. + ++this.Errors; + s.Position -= d.Buffered; + } + } + if (s.Length > 0 && !foundData) + throw new InvalidDataException("ZPAQ: archive contains no data."); } - /// Gets the number of bytes consumed from the stream so far. - internal long Position => _streamOffset - (_len - _pos); - - // ── Primitive I/O ──────────────────────────────────────────────────────── - - /// Returns the next byte or -1 on end-of-stream. - internal int ReadByte() { - if (!EnsureAvailable(1)) - return -1; - return _buf[_pos++]; + private void ParseIndex(ReadOnlySpan s, Dictionary dt) { + var p = 0; + var version = this._versions.Count; + while (p + 9 <= s.Length) { + var date = BinaryPrimitives.ReadInt64LittleEndian(s[p..]); + p += 8; + var len = s[p..].IndexOf((byte)0); + if (len < 0) + ZpaqError.Throw("filename too long"); + if (len > 65535) + ZpaqError.Throw("filename too long"); + var name = Encoding.UTF8.GetString(s.Slice(p, len)); + p += len + 1; + long attr = 0; + var ptr = new List(); + if (date != 0) { + if (p + 4 > s.Length) + ZpaqError.Throw("missing attr"); + var na = BinaryPrimitives.ReadUInt32LittleEndian(s[p..]); + p += 4; + if (p + na > s.Length || na > 65535) + ZpaqError.Throw("attr too long"); + for (var i = 0; i < na; ++i, ++p) + if (i < 8) + attr += (long)s[p] << (i * 8); + if (p + 4 > s.Length) + ZpaqError.Throw("missing ptr"); + var ni = BinaryPrimitives.ReadUInt32LittleEndian(s[p..]); + p += 4; + if (ni > (s.Length - p) / 4u) + ZpaqError.Throw("ptr list too long"); + for (var i = 0u; i < ni; ++i, p += 4) + ptr.Add(BinaryPrimitives.ReadUInt32LittleEndian(s[p..])); + } + var rec = new IndexRecord(version, name, date, attr, ptr, []); + dt[name] = rec; + this._log.Add(rec); + } } - /// - /// Reads exactly .Length bytes into . - /// Returns if fewer bytes are available. - /// - internal bool TryReadBytes(Span dest) { - var need = dest.Length; - if (!EnsureAvailable(need)) - return false; - - _buf.AsSpan(_pos, need).CopyTo(dest); - _pos += need; - return true; + private static long ParseStreamingDate(byte[] comment) { + // Streaming comments are " " with a 14-digit decimal date. + long date = 0; + var i = 0; + for (; i < comment.Length && char.IsAsciiDigit((char)comment[i]); ++i) + date = date * 10 + comment[i] - '0'; + return i == 14 ? date : 0; } - /// Skips exactly bytes. - internal void Skip(int count) { - while (count > 0) { - if (!EnsureAvailable(1)) - return; - var can = Math.Min(count, _len - _pos); - _pos += can; - count -= can; - } + private static long ParseStreamingAttributes(byte[] comment) { + var sp = Array.IndexOf(comment, (byte)' '); + if (sp < 0 || sp + 1 >= comment.Length) + return 0; + long attr = comment[sp + 1]; + long value = 0; + for (var i = sp + 2; i < comment.Length && char.IsAsciiDigit((char)comment[i]); ++i) + value = value * 10 + comment[i] - '0'; + return attr | value << 8; } - // ── Null-terminated string ──────────────────────────────────────────────── - - internal string ReadNullTerminatedString() { - var sb = new StringBuilder(32); - while (true) { - var b = ReadByte(); - if (b <= 0) // EOF or null terminator + private List Snapshot(int version) { + var state = new SortedDictionary(StringComparer.Ordinal); + foreach (var rec in this._log) { + if (rec.Version > version) break; - sb.Append((char)b); + state[rec.Name] = rec; } - return sb.ToString(); + var result = new List(); + foreach (var rec in state.Values) { + var streaming = rec.Segments.Count > 0; + if (!streaming && rec.Date == 0) + continue; // deleted in this version + long size = 0; + long csize = 0; + if (streaming) + size = -1; + else + foreach (var j in rec.Fragments) { + if (j == 0 || j >= this._ht.Count) + continue; + var frag = this._ht[(int)j]; + if (frag.Usize < 0) { + size = -1; + break; + } + size += frag.Usize; + var b = this.FindBlock(j); + if (b >= 0 && this._blocks[b].Usize > 0) + csize += this._blocks[b].Bsize * frag.Usize / this._blocks[b].Usize; + } + result.Add(new(rec.Name, size, csize, ZpaqDate.ToDateTime(rec.Date), rec.Version, rec.Attributes, rec.Fragments, rec.Segments)); + } + return result; } - // ── Block-boundary scanning ─────────────────────────────────────────────── - - /// - /// Scans forward from the current position until the 3-byte "zPQ" prefix - /// is found. On return the stream position is just after the prefix. - /// Returns if the prefix was found; - /// if end-of-stream was reached first. - /// - internal bool ScanToPrefix(ReadOnlySpan prefix) { - // Sliding 3-byte window (w[0]..w[2]). We advance one byte at a time until - // the window matches the 3-byte prefix. Using explicit state avoids the - // edge case where 0x00 is valid data and cannot be used as a sentinel. - // - // State: how many leading bytes of the prefix we have matched so far. - var matched = 0; - - while (true) { - var b = ReadByte(); - if (b < 0) - return false; // end-of-stream - - if (b == prefix[matched]) { - matched++; - if (matched == prefix.Length) - return true; // full prefix found; stream positioned after it - } else { - // Mismatch — restart, but check whether this byte starts the prefix. - matched = (b == prefix[0]) ? 1 : 0; - } + // ── extraction ───────────────────────────────────────────────────────────── + + private int FindBlock(uint fragment) { + int lo = 0, hi = this._blocks.Count - 1; + while (lo <= hi) { + var mid = (lo + hi) >>> 1; + var b = this._blocks[mid]; + if (fragment < b.Start) + hi = mid - 1; + else if (fragment >= b.Start + b.Frags) + lo = mid + 1; + else + return mid; } + return -1; } - /// - /// Reads the current block's payload bytes, stopping just before the next - /// "zPQ" block prefix (or at end-of-stream). The prefix is NOT consumed. - /// Equivalent to but returns the bytes consumed. - /// - internal byte[] CaptureToNextBlock() { - using var ms = new MemoryStream(); - var prefix = Prefix; - - while (true) { - if (!EnsureAvailable(PrefixLen)) { - // Fewer than PrefixLen bytes remain — they cannot start a new block, so - // they belong to this payload. Drain them and stop. - while (_pos < _len) ms.WriteByte(_buf[_pos++]); - return ms.ToArray(); - } - - var available = _len - _pos; - var window = _buf.AsSpan(_pos, available); - - for (var i = 0; i < window.Length; i++) { - if (window[i] != prefix[0]) - continue; - - if (i + PrefixLen - 1 >= window.Length) { - // Not enough in buffer to confirm — flush up to i, then refill. - for (var j = 0; j < i; j++) ms.WriteByte(window[j]); - _pos += i; - goto refill; - } - - if (window[i + 1] == prefix[1] && window[i + 2] == prefix[2]) { - for (var j = 0; j < i; j++) ms.WriteByte(window[j]); - _pos += i; // stop before the next prefix - return ms.ToArray(); - } - } - - for (var j = 0; j < window.Length; j++) ms.WriteByte(window[j]); - _pos = _len; - refill: - Refill(); - if (_len == _pos) - return ms.ToArray(); + private byte[] ExtractJournaling(ZpaqEntry entry) { + if (entry.Size < 0) + ZpaqError.Throw("file references fragments of unknown size"); + var output = new byte[entry.Size]; + var pos = 0; + foreach (var j in entry.Fragments) { + if (j == 0 || j >= this._ht.Count) + ZpaqError.Throw("bad fragment pointer"); + var frag = this._ht[(int)j]; + if (frag.Usize == 0) + continue; + var bi = this.FindBlock(j); + if (bi < 0) + ZpaqError.Throw($"fragment {j} is in no data block"); + var data = this.DecodeBlock(bi); + var b = this._blocks[bi]; + long offset = 0; + for (var f = b.Start; f < j; ++f) + offset += this._ht[(int)f].Usize; + data.AsSpan((int)offset, frag.Usize).CopyTo(output.AsSpan(pos)); + pos += frag.Usize; } + return output; } - /// - /// Advances past the current block's payload, stopping just before the - /// next "zPQ" block prefix, or at end-of-stream. - /// The prefix itself is NOT consumed. - /// - internal void SkipToNextBlock() { - var prefix = Prefix; - // We need to stop before consuming the prefix, so we look-ahead: - // scan for 'z' then check the following two bytes. - - while (true) { - if (!EnsureAvailable(PrefixLen)) - return; // EOF — nothing more to skip - - var available = _len - _pos; - var window = _buf.AsSpan(_pos, available); - - for (var i = 0; i < window.Length; i++) { - if (window[i] != prefix[0]) - continue; - - // Potential match — need two more bytes. - if (i + PrefixLen - 1 >= window.Length) { - // Not enough in buffer — advance to i and refill. - _pos += i; - goto refill; - } + private byte[] DecodeBlock(int bi) { + if (bi == this._cachedBlock) + return this._cachedData; + var b = this._blocks[bi]; + long outputSize = 0; + for (var f = b.Start; f < b.Start + b.Frags; ++f) + outputSize += this._ht[(int)f].Usize; + + this._stream.Position = b.Offset; + var d = new ZpaqDecompresser(new ZpaqStreamReader(this._stream)); + var output = new ZpaqBuffer((int)Math.Min(b.Usize, 1 << 24)) { Limit = b.Usize }; + d.SetOutput(output); + if (!d.FindBlock()) + ZpaqError.Throw("archive block not found"); + while (d.FindFilename() != null) { + d.ReadComment(); + d.Decompress(); + if (output.Size >= outputSize) + break; + d.ReadSegmentEnd(); + } + if (output.Size < outputSize) + ZpaqError.Throw("unexpected end of compressed data"); + + var data = output.Data; + long q = 0; + for (var f = b.Start; f < b.Start + b.Frags; ++f) { + var frag = this._ht[(int)f]; + var hash = Compression.Core.Checksums.Sha1.Compute(data.AsSpan((int)q, frag.Usize)); + if (!hash.AsSpan().SequenceEqual(frag.Sha1)) + ZpaqError.Throw($"fragment {f} checksum failed"); + q += frag.Usize; + } + this._cachedBlock = bi; + this._cachedData = data; + return data; + } - if (window[i + 1] == prefix[1] && window[i + 2] == prefix[2]) { - // Found next prefix — stop here without consuming it. - _pos += i; - return; - } + private byte[] ExtractStreaming(ZpaqEntry entry) { + var output = new ZpaqBuffer(); + ZpaqDecompresser? d = null; + long openBlock = -1; + var nextSegment = 0; + foreach (var (blockOffset, segment) in entry.Segments) { + if (d == null || openBlock != blockOffset || segment < nextSegment) { + this._stream.Position = blockOffset; + d = new(new ZpaqStreamReader(this._stream)); + if (!d.FindBlock()) + ZpaqError.Throw("archive block not found"); + openBlock = blockOffset; + nextSegment = 0; + } + while (nextSegment <= segment) { + if (d.FindFilename() == null) + ZpaqError.Throw("missing segment"); + d.ReadComment(); + var target = nextSegment == segment; + var sha1 = target ? new ZpaqSha1() : null; + d.SetOutput(target ? output : null); + d.SetSha1(sha1); + d.Decompress(); + var stored = d.ReadSegmentEnd(); + d.SetOutput(null); + d.SetSha1(null); + if (sha1 != null && stored != null && !stored.AsSpan().SequenceEqual(sha1.Result())) + ZpaqError.Throw("segment checksum failed"); + ++nextSegment; } - - _pos = _len; // consume the whole window - refill: - Refill(); - if (_len == _pos) - return; } + return output.ToArray(); } +} - // ── Buffer management ───────────────────────────────────────────────────── - - private bool EnsureAvailable(int need) { - if (_len - _pos >= need) - return true; - Refill(); - return _len - _pos >= need; +/// Conversion between ZPAQ's decimal dates (YYYYMMDDHHMMSS, UTC) and . +internal static class ZpaqDate { + /// Encodes a UTC time as a decimal date. + public static long FromDateTime(DateTime time) { + var t = time.Kind == DateTimeKind.Local ? time.ToUniversalTime() : time; + return t.Year * 10000000000L + t.Month * 100000000L + t.Day * 1000000L + t.Hour * 10000L + t.Minute * 100L + t.Second; } - private void Refill() { - // Copy the tail of the current buffer into the overlap area. - var tail = Math.Min(_len - _pos, Overlap); - if (tail > 0) - _buf.AsSpan(_len - tail, tail).CopyTo(_buf.AsSpan(Overlap - tail, tail)); - - _pos = Overlap - tail; // new read position in the buffer - var read = _stream.Read(_buf, Overlap, BufSize); - _len = Overlap + read; - _streamOffset += read; + /// Decodes a decimal date, or when it is not a valid date. + public static DateTime? ToDateTime(long date) { + if (date <= 0) + return null; + var year = (int)(date / 10000000000L % 10000); + var month = (int)(date / 100000000 % 100); + var day = (int)(date / 1000000 % 100); + var hour = (int)(date / 10000 % 100); + var minute = (int)(date / 100 % 100); + var second = (int)(date % 100); + try { + return new DateTime(year, month, day, hour, minute, second, DateTimeKind.Utc); + } catch (ArgumentOutOfRangeException) { + return null; + } } } diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqSuffixArray.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqSuffixArray.cs new file mode 100644 index 000000000..2a260ec58 --- /dev/null +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqSuffixArray.cs @@ -0,0 +1,146 @@ +namespace FileFormat.Zpaq; + +/// +/// Linear-time suffix array construction by induced sorting (SA-IS). +/// +/// +/// Implemented from G. Nong, S. Zhang and W. H. Chan, "Two Efficient Algorithms for Linear +/// Time Suffix Array Construction", IEEE Transactions on Computers 60(10), 2011. Suffixes are +/// ordered as plain byte strings (a proper prefix sorts first), which is the order a virtual +/// sentinel smaller than every byte produces and the order libzpaq's BWT and suffix-array +/// match finder expect. +/// +internal static class ZpaqSuffixArray { + /// Returns the suffix array of . + public static int[] Build(ReadOnlySpan text) { + var n = text.Length; + var sa = new int[n]; + if (n == 0) + return sa; + if (n == 1) + return sa; + var s = new int[n]; + for (var i = 0; i < n; ++i) + s[i] = text[i]; + Sais(s, sa, n, 256); + return sa; + } + + /// Sorts the suffixes of [0..n) over alphabet [0..k) into . + private static void Sais(int[] s, int[] sa, int n, int k) { + if (n == 1) { + sa[0] = 0; + return; + } + + // Suffix types: true = S-type, false = L-type. The virtual sentinel at n is S-type. + var t = new bool[n]; + t[n - 1] = false; + for (var i = n - 2; i >= 0; --i) + t[i] = s[i] < s[i + 1] || (s[i] == s[i + 1] && t[i + 1]); + + bool IsLms(int i) => i > 0 && t[i] && !t[i - 1]; + + var bucket = new int[k]; + void Buckets(bool end) { + Array.Clear(bucket); + for (var i = 0; i < n; ++i) + ++bucket[s[i]]; + var sum = 0; + for (var c = 0; c < k; ++c) { + sum += bucket[c]; + bucket[c] = end ? sum : sum - bucket[c]; + } + } + + void Induce() { + Buckets(false); + // The sentinel's predecessor n-1 is L-type and comes first in its bucket. + sa[bucket[s[n - 1]]++] = n - 1; + for (var i = 0; i < n; ++i) { + var j = sa[i] - 1; + if (sa[i] > 0 && !t[j]) + sa[bucket[s[j]]++] = j; + } + Buckets(true); + for (var i = n - 1; i >= 0; --i) { + var j = sa[i] - 1; + if (sa[i] > 0 && t[j]) + sa[--bucket[s[j]]] = j; + } + } + + // Stage 1: place LMS suffixes at bucket ends and induce to sort the LMS substrings. + Array.Fill(sa, -1); + Buckets(true); + for (var i = n - 1; i >= 1; --i) + if (IsLms(i)) + sa[--bucket[s[i]]] = i; + Induce(); + + // Compact the sorted LMS positions to the front of sa. + var m = 0; + for (var i = 0; i < n; ++i) + if (IsLms(sa[i])) + sa[m++] = sa[i]; + for (var i = m; i < n; ++i) + sa[i] = -1; + + // Name the LMS substrings; equal substrings share a name. + var name = 0; + var prev = -1; + for (var i = 0; i < m; ++i) { + var pos = sa[i]; + var diff = prev < 0; + if (!diff) { + for (var d = 0; ; ++d) { + var a = pos + d; + var b = prev + d; + if (a == n || b == n || s[a] != s[b] || t[a] != t[b]) { + diff = true; + break; + } + if (d > 0 && (IsLms(a) || IsLms(b))) { + diff = !(IsLms(a) && IsLms(b)); + break; + } + } + } + if (diff) { + ++name; + prev = pos; + } + sa[m + (pos >> 1)] = name - 1; + } + var j2 = n - 1; + for (var i = n - 1; i >= m; --i) + if (sa[i] >= 0) + sa[j2--] = sa[i]; + + // Stage 2: sort the reduced problem, recursively when names repeat. + var s1 = new int[m]; + Array.Copy(sa, n - m, s1, 0, m); + var sa1 = new int[m]; + if (name < m) + Sais(s1, sa1, m, name); + else + for (var i = 0; i < m; ++i) + sa1[s1[i]] = i; + + // Stage 3: map back to LMS positions in sorted order and induce the full array. + var lms = new int[m]; + var c2 = 0; + for (var i = 1; i < n; ++i) + if (IsLms(i)) + lms[c2++] = i; + for (var i = 0; i < m; ++i) + sa1[i] = lms[sa1[i]]; + Array.Fill(sa, -1); + Buckets(true); + for (var i = m - 1; i >= 0; --i) { + var p = sa1[i]; + sa[--bucket[s[p]]] = p; + } + Induce(); + } +} diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqTables.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqTables.cs new file mode 100644 index 000000000..a8122a495 --- /dev/null +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqTables.cs @@ -0,0 +1,301 @@ +namespace FileFormat.Zpaq; + +/// Model-independent lookup tables of the ZPAQ context-mixing predictor. +/// +/// Copied value-for-value from libzpaq 7.15 (Matt Mahoney, public domain); the ZPAQ +/// specification fixes these tables, so they are reproduced exactly rather than recomputed. +/// +internal static class ZpaqTables { + /// Bit-history state machine: [state*4] = next state after a 0, after a 1, then the 0 and 1 counts. + internal static ReadOnlySpan StateTable => [ + 1, 2, 0, 0, 3, 5, 1, 0, 4, 6, 0, 1, 7, 9, 2, 0, + 8, 11, 1, 1, 8, 11, 1, 1, 10, 12, 0, 2, 13, 15, 3, 0, + 14, 17, 2, 1, 14, 17, 2, 1, 16, 19, 1, 2, 16, 19, 1, 2, + 18, 20, 0, 3, 21, 23, 4, 0, 22, 25, 3, 1, 22, 25, 3, 1, + 24, 27, 2, 2, 24, 27, 2, 2, 26, 29, 1, 3, 26, 29, 1, 3, + 28, 30, 0, 4, 31, 33, 5, 0, 32, 35, 4, 1, 32, 35, 4, 1, + 34, 37, 3, 2, 34, 37, 3, 2, 36, 39, 2, 3, 36, 39, 2, 3, + 38, 41, 1, 4, 38, 41, 1, 4, 40, 42, 0, 5, 43, 33, 6, 0, + 44, 47, 5, 1, 44, 47, 5, 1, 46, 49, 4, 2, 46, 49, 4, 2, + 48, 51, 3, 3, 48, 51, 3, 3, 50, 53, 2, 4, 50, 53, 2, 4, + 52, 55, 1, 5, 52, 55, 1, 5, 40, 56, 0, 6, 57, 45, 7, 0, + 58, 47, 6, 1, 58, 47, 6, 1, 60, 63, 5, 2, 60, 63, 5, 2, + 62, 65, 4, 3, 62, 65, 4, 3, 64, 67, 3, 4, 64, 67, 3, 4, + 66, 69, 2, 5, 66, 69, 2, 5, 52, 71, 1, 6, 52, 71, 1, 6, + 54, 72, 0, 7, 73, 59, 8, 0, 74, 61, 7, 1, 74, 61, 7, 1, + 76, 63, 6, 2, 76, 63, 6, 2, 78, 81, 5, 3, 78, 81, 5, 3, + 80, 83, 4, 4, 80, 83, 4, 4, 82, 85, 3, 5, 82, 85, 3, 5, + 66, 87, 2, 6, 66, 87, 2, 6, 68, 89, 1, 7, 68, 89, 1, 7, + 70, 90, 0, 8, 91, 59, 9, 0, 92, 77, 8, 1, 92, 77, 8, 1, + 94, 79, 7, 2, 94, 79, 7, 2, 96, 81, 6, 3, 96, 81, 6, 3, + 98, 101, 5, 4, 98, 101, 5, 4, 100, 103, 4, 5, 100, 103, 4, 5, + 82, 105, 3, 6, 82, 105, 3, 6, 84, 107, 2, 7, 84, 107, 2, 7, + 86, 109, 1, 8, 86, 109, 1, 8, 70, 110, 0, 9, 111, 59, 10, 0, + 112, 77, 9, 1, 112, 77, 9, 1, 114, 97, 8, 2, 114, 97, 8, 2, + 116, 99, 7, 3, 116, 99, 7, 3, 62, 101, 6, 4, 62, 101, 6, 4, + 80, 83, 5, 5, 80, 83, 5, 5, 100, 67, 4, 6, 100, 67, 4, 6, + 102, 119, 3, 7, 102, 119, 3, 7, 104, 121, 2, 8, 104, 121, 2, 8, + 86, 123, 1, 9, 86, 123, 1, 9, 70, 124, 0, 10, 125, 59, 11, 0, + 126, 77, 10, 1, 126, 77, 10, 1, 128, 97, 9, 2, 128, 97, 9, 2, + 60, 63, 8, 3, 60, 63, 8, 3, 66, 69, 3, 8, 66, 69, 3, 8, + 104, 131, 2, 9, 104, 131, 2, 9, 86, 133, 1, 10, 86, 133, 1, 10, + 70, 134, 0, 11, 135, 59, 12, 0, 136, 77, 11, 1, 136, 77, 11, 1, + 138, 97, 10, 2, 138, 97, 10, 2, 104, 141, 2, 10, 104, 141, 2, 10, + 86, 143, 1, 11, 86, 143, 1, 11, 70, 144, 0, 12, 145, 59, 13, 0, + 146, 77, 12, 1, 146, 77, 12, 1, 148, 97, 11, 2, 148, 97, 11, 2, + 104, 151, 2, 11, 104, 151, 2, 11, 86, 153, 1, 12, 86, 153, 1, 12, + 70, 154, 0, 13, 155, 59, 14, 0, 156, 77, 13, 1, 156, 77, 13, 1, + 158, 97, 12, 2, 158, 97, 12, 2, 104, 161, 2, 12, 104, 161, 2, 12, + 86, 163, 1, 13, 86, 163, 1, 13, 70, 164, 0, 14, 165, 59, 15, 0, + 166, 77, 14, 1, 166, 77, 14, 1, 168, 97, 13, 2, 168, 97, 13, 2, + 104, 171, 2, 13, 104, 171, 2, 13, 86, 173, 1, 14, 86, 173, 1, 14, + 70, 174, 0, 15, 175, 59, 16, 0, 176, 77, 15, 1, 176, 77, 15, 1, + 178, 97, 14, 2, 178, 97, 14, 2, 104, 181, 2, 14, 104, 181, 2, 14, + 86, 183, 1, 15, 86, 183, 1, 15, 70, 184, 0, 16, 185, 59, 17, 0, + 186, 77, 16, 1, 186, 77, 16, 1, 74, 97, 15, 2, 74, 97, 15, 2, + 104, 89, 2, 15, 104, 89, 2, 15, 86, 187, 1, 16, 86, 187, 1, 16, + 70, 188, 0, 17, 189, 59, 18, 0, 190, 77, 17, 1, 86, 191, 1, 17, + 70, 192, 0, 18, 193, 59, 19, 0, 194, 77, 18, 1, 86, 195, 1, 18, + 70, 196, 0, 19, 193, 59, 20, 0, 197, 77, 19, 1, 86, 198, 1, 19, + 70, 196, 0, 20, 199, 77, 20, 1, 86, 200, 1, 20, 201, 77, 21, 1, + 86, 202, 1, 21, 203, 77, 22, 1, 86, 204, 1, 22, 205, 77, 23, 1, + 86, 206, 1, 23, 207, 77, 24, 1, 86, 208, 1, 24, 209, 77, 25, 1, + 86, 210, 1, 25, 211, 77, 26, 1, 86, 212, 1, 26, 213, 77, 27, 1, + 86, 214, 1, 27, 215, 77, 28, 1, 86, 216, 1, 28, 217, 77, 29, 1, + 86, 218, 1, 29, 219, 77, 30, 1, 86, 220, 1, 30, 221, 77, 31, 1, + 86, 222, 1, 31, 223, 77, 32, 1, 86, 224, 1, 32, 225, 77, 33, 1, + 86, 226, 1, 33, 227, 77, 34, 1, 86, 228, 1, 34, 229, 77, 35, 1, + 86, 230, 1, 35, 231, 77, 36, 1, 86, 232, 1, 36, 233, 77, 37, 1, + 86, 234, 1, 37, 235, 77, 38, 1, 86, 236, 1, 38, 237, 77, 39, 1, + 86, 238, 1, 39, 239, 77, 40, 1, 86, 240, 1, 40, 241, 77, 41, 1, + 86, 242, 1, 41, 243, 77, 42, 1, 86, 244, 1, 42, 245, 77, 43, 1, + 86, 246, 1, 43, 247, 77, 44, 1, 86, 248, 1, 44, 249, 77, 45, 1, + 86, 250, 1, 45, 251, 77, 46, 1, 86, 252, 1, 46, 253, 77, 47, 1, + 86, 254, 1, 47, 253, 77, 48, 1, 86, 254, 1, 48, 0, 0, 0, 0, + ]; + + /// MATCH prediction divisor: 2048 / i. + internal static readonly int[] MatchDivisor = [ + 0, 2048, 1024, 682, 512, 409, 341, 292, 256, 227, 204, 186, 170, 157, 146, 136, + 128, 120, 113, 107, 102, 97, 93, 89, 85, 81, 78, 75, 73, 70, 68, 66, + 64, 62, 60, 58, 56, 55, 53, 52, 51, 49, 48, 47, 46, 45, 44, 43, + 42, 41, 40, 40, 39, 38, 37, 37, 36, 35, 35, 34, 34, 33, 33, 32, + 32, 31, 31, 30, 30, 29, 29, 28, 28, 28, 27, 27, 26, 26, 26, 25, + 25, 25, 24, 24, 24, 24, 23, 23, 23, 23, 22, 22, 22, 22, 21, 21, + 21, 21, 20, 20, 20, 20, 20, 19, 19, 19, 19, 19, 18, 18, 18, 18, + 18, 18, 17, 17, 17, 17, 17, 17, 17, 16, 16, 16, 16, 16, 16, 16, + 16, 15, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + ]; + + /// CM/SSE adaptation divisor: (1 << 17) / (i * 2 + 3) * 2. + internal static readonly int[] CmDivisor = [ + 87380, 52428, 37448, 29126, 23830, 20164, 17476, 15420, 13796, 12482, 11396, 10484, 9708, 9038, 8456, 7942, + 7488, 7084, 6720, 6392, 6096, 5824, 5576, 5348, 5140, 4946, 4766, 4598, 4442, 4296, 4160, 4032, + 3912, 3798, 3692, 3590, 3494, 3404, 3318, 3236, 3158, 3084, 3012, 2944, 2880, 2818, 2758, 2702, + 2646, 2594, 2544, 2496, 2448, 2404, 2360, 2318, 2278, 2240, 2202, 2166, 2130, 2096, 2064, 2032, + 2000, 1970, 1940, 1912, 1884, 1858, 1832, 1806, 1782, 1758, 1736, 1712, 1690, 1668, 1648, 1628, + 1608, 1588, 1568, 1550, 1532, 1514, 1496, 1480, 1464, 1448, 1432, 1416, 1400, 1386, 1372, 1358, + 1344, 1330, 1316, 1304, 1290, 1278, 1266, 1254, 1242, 1230, 1218, 1208, 1196, 1186, 1174, 1164, + 1154, 1144, 1134, 1124, 1114, 1106, 1096, 1086, 1078, 1068, 1060, 1052, 1044, 1036, 1028, 1020, + 1012, 1004, 996, 988, 980, 974, 966, 960, 952, 946, 938, 932, 926, 918, 912, 906, + 900, 894, 888, 882, 876, 870, 864, 858, 852, 848, 842, 836, 832, 826, 820, 816, + 810, 806, 800, 796, 790, 786, 782, 776, 772, 768, 764, 758, 754, 750, 746, 742, + 738, 734, 730, 726, 722, 718, 714, 710, 706, 702, 698, 694, 690, 688, 684, 680, + 676, 672, 670, 666, 662, 660, 656, 652, 650, 646, 644, 640, 636, 634, 630, 628, + 624, 622, 618, 616, 612, 610, 608, 604, 602, 598, 596, 594, 590, 588, 586, 582, + 580, 578, 576, 572, 570, 568, 566, 562, 560, 558, 556, 554, 550, 548, 546, 544, + 542, 540, 538, 536, 532, 530, 528, 526, 524, 522, 520, 518, 516, 514, 512, 510, + 508, 506, 504, 502, 500, 498, 496, 494, 492, 490, 488, 488, 486, 484, 482, 480, + 478, 476, 474, 474, 472, 470, 468, 466, 464, 462, 462, 460, 458, 456, 454, 454, + 452, 450, 448, 448, 446, 444, 442, 442, 440, 438, 436, 436, 434, 432, 430, 430, + 428, 426, 426, 424, 422, 422, 420, 418, 418, 416, 414, 414, 412, 410, 410, 408, + 406, 406, 404, 402, 402, 400, 400, 398, 396, 396, 394, 394, 392, 390, 390, 388, + 388, 386, 386, 384, 382, 382, 380, 380, 378, 378, 376, 376, 374, 372, 372, 370, + 370, 368, 368, 366, 366, 364, 364, 362, 362, 360, 360, 358, 358, 356, 356, 354, + 354, 352, 352, 350, 350, 348, 348, 348, 346, 346, 344, 344, 342, 342, 340, 340, + 340, 338, 338, 336, 336, 334, 334, 332, 332, 332, 330, 330, 328, 328, 328, 326, + 326, 324, 324, 324, 322, 322, 320, 320, 320, 318, 318, 316, 316, 316, 314, 314, + 312, 312, 312, 310, 310, 310, 308, 308, 308, 306, 306, 304, 304, 304, 302, 302, + 302, 300, 300, 300, 298, 298, 298, 296, 296, 296, 294, 294, 294, 292, 292, 292, + 290, 290, 290, 288, 288, 288, 286, 286, 286, 284, 284, 284, 284, 282, 282, 282, + 280, 280, 280, 278, 278, 278, 276, 276, 276, 276, 274, 274, 274, 272, 272, 272, + 272, 270, 270, 270, 268, 268, 268, 268, 266, 266, 266, 266, 264, 264, 264, 262, + 262, 262, 262, 260, 260, 260, 260, 258, 258, 258, 258, 256, 256, 256, 256, 254, + 254, 254, 254, 252, 252, 252, 252, 250, 250, 250, 250, 248, 248, 248, 248, 248, + 246, 246, 246, 246, 244, 244, 244, 244, 242, 242, 242, 242, 242, 240, 240, 240, + 240, 238, 238, 238, 238, 238, 236, 236, 236, 236, 234, 234, 234, 234, 234, 232, + 232, 232, 232, 232, 230, 230, 230, 230, 230, 228, 228, 228, 228, 228, 226, 226, + 226, 226, 226, 224, 224, 224, 224, 224, 222, 222, 222, 222, 222, 220, 220, 220, + 220, 220, 220, 218, 218, 218, 218, 218, 216, 216, 216, 216, 216, 216, 214, 214, + 214, 214, 214, 212, 212, 212, 212, 212, 212, 210, 210, 210, 210, 210, 210, 208, + 208, 208, 208, 208, 208, 206, 206, 206, 206, 206, 206, 204, 204, 204, 204, 204, + 204, 204, 202, 202, 202, 202, 202, 202, 200, 200, 200, 200, 200, 200, 198, 198, + 198, 198, 198, 198, 198, 196, 196, 196, 196, 196, 196, 196, 194, 194, 194, 194, + 194, 194, 194, 192, 192, 192, 192, 192, 192, 192, 190, 190, 190, 190, 190, 190, + 190, 188, 188, 188, 188, 188, 188, 188, 186, 186, 186, 186, 186, 186, 186, 186, + 184, 184, 184, 184, 184, 184, 184, 182, 182, 182, 182, 182, 182, 182, 182, 180, + 180, 180, 180, 180, 180, 180, 180, 178, 178, 178, 178, 178, 178, 178, 178, 176, + 176, 176, 176, 176, 176, 176, 176, 176, 174, 174, 174, 174, 174, 174, 174, 174, + 172, 172, 172, 172, 172, 172, 172, 172, 172, 170, 170, 170, 170, 170, 170, 170, + 170, 170, 168, 168, 168, 168, 168, 168, 168, 168, 168, 166, 166, 166, 166, 166, + 166, 166, 166, 166, 166, 164, 164, 164, 164, 164, 164, 164, 164, 164, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, 160, 160, 160, 160, 160, 160, 160, 160, + 160, 160, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 154, 154, 154, 154, 154, 154, 154, 154, 154, + 154, 154, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 150, 150, 150, + 150, 150, 150, 150, 150, 150, 150, 150, 150, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, + 146, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 142, 142, 142, + 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 140, 140, 140, 140, 140, 140, + 140, 140, 140, 140, 140, 140, 140, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, + 136, 136, 136, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, + 134, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 128, + 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 126, + ]; + + /// Middle 1344 of the 4096 squash entries, 32768 / (1 + exp((i - 2048) / -64)). + internal static readonly ushort[] SquashMiddle = [ + 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, + 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, + 10, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, + 14, 14, 14, 14, 15, 15, 15, 15, 15, 16, 16, 16, 17, 17, 17, 17, + 18, 18, 18, 18, 19, 19, 19, 20, 20, 20, 21, 21, 21, 22, 22, 22, + 23, 23, 23, 24, 24, 25, 25, 25, 26, 26, 27, 27, 28, 28, 28, 29, + 29, 30, 30, 31, 31, 32, 32, 33, 33, 34, 34, 35, 36, 36, 37, 37, + 38, 38, 39, 40, 40, 41, 42, 42, 43, 44, 44, 45, 46, 46, 47, 48, + 49, 49, 50, 51, 52, 53, 54, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 76, 77, 78, 79, + 81, 82, 83, 84, 86, 87, 88, 90, 91, 93, 94, 96, 97, 99, 100, 102, + 103, 105, 107, 108, 110, 112, 114, 115, 117, 119, 121, 123, 125, 127, 129, 131, + 133, 135, 137, 139, 141, 144, 146, 148, 151, 153, 155, 158, 160, 163, 165, 168, + 171, 173, 176, 179, 182, 184, 187, 190, 193, 196, 199, 202, 206, 209, 212, 215, + 219, 222, 226, 229, 233, 237, 240, 244, 248, 252, 256, 260, 264, 268, 272, 276, + 281, 285, 289, 294, 299, 303, 308, 313, 318, 323, 328, 333, 338, 343, 349, 354, + 360, 365, 371, 377, 382, 388, 394, 401, 407, 413, 420, 426, 433, 440, 446, 453, + 460, 467, 475, 482, 490, 497, 505, 513, 521, 529, 537, 545, 554, 562, 571, 580, + 589, 598, 607, 617, 626, 636, 646, 656, 666, 676, 686, 697, 708, 719, 730, 741, + 752, 764, 776, 788, 800, 812, 825, 837, 850, 863, 876, 890, 903, 917, 931, 946, + 960, 975, 990, 1005, 1020, 1036, 1051, 1067, 1084, 1100, 1117, 1134, 1151, 1169, 1186, 1204, + 1223, 1241, 1260, 1279, 1298, 1318, 1338, 1358, 1379, 1399, 1421, 1442, 1464, 1486, 1508, 1531, + 1554, 1577, 1600, 1624, 1649, 1673, 1698, 1724, 1749, 1775, 1802, 1829, 1856, 1883, 1911, 1940, + 1968, 1998, 2027, 2057, 2087, 2118, 2149, 2181, 2213, 2245, 2278, 2312, 2345, 2380, 2414, 2450, + 2485, 2521, 2558, 2595, 2633, 2671, 2709, 2748, 2788, 2828, 2869, 2910, 2952, 2994, 3037, 3080, + 3124, 3168, 3213, 3259, 3305, 3352, 3399, 3447, 3496, 3545, 3594, 3645, 3696, 3747, 3799, 3852, + 3906, 3960, 4014, 4070, 4126, 4182, 4240, 4298, 4356, 4416, 4476, 4537, 4598, 4660, 4723, 4786, + 4851, 4916, 4981, 5048, 5115, 5183, 5251, 5320, 5390, 5461, 5533, 5605, 5678, 5752, 5826, 5901, + 5977, 6054, 6131, 6210, 6289, 6369, 6449, 6530, 6613, 6695, 6779, 6863, 6949, 7035, 7121, 7209, + 7297, 7386, 7476, 7566, 7658, 7750, 7842, 7936, 8030, 8126, 8221, 8318, 8415, 8513, 8612, 8712, + 8812, 8913, 9015, 9117, 9221, 9324, 9429, 9534, 9640, 9747, 9854, 9962, 10071, 10180, 10290, 10401, + 10512, 10624, 10737, 10850, 10963, 11078, 11192, 11308, 11424, 11540, 11658, 11775, 11893, 12012, 12131, 12251, + 12371, 12491, 12612, 12734, 12856, 12978, 13101, 13224, 13347, 13471, 13595, 13719, 13844, 13969, 14095, 14220, + 14346, 14472, 14599, 14725, 14852, 14979, 15106, 15233, 15361, 15488, 15616, 15744, 15872, 16000, 16128, 16256, + 16384, 16511, 16639, 16767, 16895, 17023, 17151, 17279, 17406, 17534, 17661, 17788, 17915, 18042, 18168, 18295, + 18421, 18547, 18672, 18798, 18923, 19048, 19172, 19296, 19420, 19543, 19666, 19789, 19911, 20033, 20155, 20276, + 20396, 20516, 20636, 20755, 20874, 20992, 21109, 21227, 21343, 21459, 21575, 21689, 21804, 21917, 22030, 22143, + 22255, 22366, 22477, 22587, 22696, 22805, 22913, 23020, 23127, 23233, 23338, 23443, 23546, 23650, 23752, 23854, + 23955, 24055, 24155, 24254, 24352, 24449, 24546, 24641, 24737, 24831, 24925, 25017, 25109, 25201, 25291, 25381, + 25470, 25558, 25646, 25732, 25818, 25904, 25988, 26072, 26154, 26237, 26318, 26398, 26478, 26557, 26636, 26713, + 26790, 26866, 26941, 27015, 27089, 27162, 27234, 27306, 27377, 27447, 27516, 27584, 27652, 27719, 27786, 27851, + 27916, 27981, 28044, 28107, 28169, 28230, 28291, 28351, 28411, 28469, 28527, 28585, 28641, 28697, 28753, 28807, + 28861, 28915, 28968, 29020, 29071, 29122, 29173, 29222, 29271, 29320, 29368, 29415, 29462, 29508, 29554, 29599, + 29643, 29687, 29730, 29773, 29815, 29857, 29898, 29939, 29979, 30019, 30058, 30096, 30134, 30172, 30209, 30246, + 30282, 30317, 30353, 30387, 30422, 30455, 30489, 30522, 30554, 30586, 30618, 30649, 30680, 30710, 30740, 30769, + 30799, 30827, 30856, 30884, 30911, 30938, 30965, 30992, 31018, 31043, 31069, 31094, 31118, 31143, 31167, 31190, + 31213, 31236, 31259, 31281, 31303, 31325, 31346, 31368, 31388, 31409, 31429, 31449, 31469, 31488, 31507, 31526, + 31544, 31563, 31581, 31598, 31616, 31633, 31650, 31667, 31683, 31700, 31716, 31731, 31747, 31762, 31777, 31792, + 31807, 31821, 31836, 31850, 31864, 31877, 31891, 31904, 31917, 31930, 31942, 31955, 31967, 31979, 31991, 32003, + 32015, 32026, 32037, 32048, 32059, 32070, 32081, 32091, 32101, 32111, 32121, 32131, 32141, 32150, 32160, 32169, + 32178, 32187, 32196, 32205, 32213, 32222, 32230, 32238, 32246, 32254, 32262, 32270, 32277, 32285, 32292, 32300, + 32307, 32314, 32321, 32327, 32334, 32341, 32347, 32354, 32360, 32366, 32373, 32379, 32385, 32390, 32396, 32402, + 32407, 32413, 32418, 32424, 32429, 32434, 32439, 32444, 32449, 32454, 32459, 32464, 32468, 32473, 32478, 32482, + 32486, 32491, 32495, 32499, 32503, 32507, 32511, 32515, 32519, 32523, 32527, 32530, 32534, 32538, 32541, 32545, + 32548, 32552, 32555, 32558, 32561, 32565, 32568, 32571, 32574, 32577, 32580, 32583, 32585, 32588, 32591, 32594, + 32596, 32599, 32602, 32604, 32607, 32609, 32612, 32614, 32616, 32619, 32621, 32623, 32626, 32628, 32630, 32632, + 32634, 32636, 32638, 32640, 32642, 32644, 32646, 32648, 32650, 32652, 32653, 32655, 32657, 32659, 32660, 32662, + 32664, 32665, 32667, 32668, 32670, 32671, 32673, 32674, 32676, 32677, 32679, 32680, 32681, 32683, 32684, 32685, + 32686, 32688, 32689, 32690, 32691, 32693, 32694, 32695, 32696, 32697, 32698, 32699, 32700, 32701, 32702, 32703, + 32704, 32705, 32706, 32707, 32708, 32709, 32710, 32711, 32712, 32713, 32713, 32714, 32715, 32716, 32717, 32718, + 32718, 32719, 32720, 32721, 32721, 32722, 32723, 32723, 32724, 32725, 32725, 32726, 32727, 32727, 32728, 32729, + 32729, 32730, 32730, 32731, 32731, 32732, 32733, 32733, 32734, 32734, 32735, 32735, 32736, 32736, 32737, 32737, + 32738, 32738, 32739, 32739, 32739, 32740, 32740, 32741, 32741, 32742, 32742, 32742, 32743, 32743, 32744, 32744, + 32744, 32745, 32745, 32745, 32746, 32746, 32746, 32747, 32747, 32747, 32748, 32748, 32748, 32749, 32749, 32749, + 32749, 32750, 32750, 32750, 32750, 32751, 32751, 32751, 32752, 32752, 32752, 32752, 32752, 32753, 32753, 32753, + 32753, 32754, 32754, 32754, 32754, 32754, 32755, 32755, 32755, 32755, 32755, 32756, 32756, 32756, 32756, 32756, + 32757, 32757, 32757, 32757, 32757, 32757, 32757, 32758, 32758, 32758, 32758, 32758, 32758, 32759, 32759, 32759, + 32759, 32759, 32759, 32759, 32759, 32760, 32760, 32760, 32760, 32760, 32760, 32760, 32760, 32761, 32761, 32761, + 32761, 32761, 32761, 32761, 32761, 32761, 32761, 32762, 32762, 32762, 32762, 32762, 32762, 32762, 32762, 32762, + 32762, 32762, 32762, 32763, 32763, 32763, 32763, 32763, 32763, 32763, 32763, 32763, 32763, 32763, 32763, 32763, + 32763, 32764, 32764, 32764, 32764, 32764, 32764, 32764, 32764, 32764, 32764, 32764, 32764, 32764, 32764, 32764, + 32764, 32764, 32764, 32764, 32765, 32765, 32765, 32765, 32765, 32765, 32765, 32765, 32765, 32765, 32765, 32765, + 32765, 32765, 32765, 32765, 32765, 32765, 32765, 32765, 32765, 32765, 32765, 32765, 32765, 32765, 32766, 32766, + 32766, 32766, 32766, 32766, 32766, 32766, 32766, 32766, 32766, 32766, 32766, 32766, 32766, 32766, 32766, 32766, + 32766, 32766, 32766, 32766, 32766, 32766, 32766, 32766, 32766, 32766, 32766, 32766, 32766, 32766, 32766, 32766, + 32766, 32766, 32766, 32766, 32766, 32766, 32766, 32766, 32766, 32766, 32767, 32767, 32767, 32767, 32767, 32767, + ]; + + /// Run lengths that expand into the upper half of the stretch table. + internal static ReadOnlySpan StretchRunLengths => [ + 64, 128, 128, 128, 128, 128, 127, 128, 127, 128, 127, 127, 127, 127, 126, 126, + 126, 126, 126, 125, 125, 124, 125, 124, 123, 123, 123, 123, 122, 122, 121, 121, + 120, 120, 119, 119, 118, 118, 118, 116, 117, 115, 116, 114, 114, 113, 113, 112, + 112, 111, 110, 110, 109, 108, 108, 107, 106, 106, 105, 104, 104, 102, 103, 101, + 101, 100, 99, 98, 98, 97, 96, 96, 94, 94, 94, 92, 92, 91, 90, 89, + 89, 88, 87, 86, 86, 84, 84, 84, 82, 82, 81, 80, 79, 79, 78, 77, + 76, 76, 75, 74, 73, 73, 72, 71, 70, 70, 69, 68, 67, 67, 66, 65, + 65, 64, 63, 62, 62, 61, 61, 59, 59, 59, 57, 58, 56, 56, 55, 54, + 54, 53, 52, 52, 51, 51, 50, 49, 49, 48, 48, 47, 47, 45, 46, 44, + 45, 43, 43, 43, 42, 41, 41, 40, 40, 40, 39, 38, 38, 37, 37, 36, + 36, 36, 35, 34, 34, 34, 33, 32, 33, 32, 31, 31, 30, 31, 29, 30, + 28, 29, 28, 28, 27, 27, 27, 26, 26, 25, 26, 24, 25, 24, 24, 23, + 23, 23, 23, 22, 22, 21, 22, 21, 20, 21, 20, 19, 20, 19, 19, 19, + 18, 18, 18, 18, 17, 17, 17, 17, 16, 16, 16, 16, 15, 15, 15, 15, + 15, 14, 14, 14, 14, 13, 14, 13, 13, 13, 12, 13, 12, 12, 12, 11, + 12, 11, 11, 11, 11, 11, 10, 11, 10, 10, 10, 10, 9, 10, 9, 9, + 9, 9, 9, 8, 9, 8, 9, 8, 8, 8, 7, 8, 8, 7, 7, 8, + 7, 7, 7, 6, 7, 7, 6, 6, 7, 6, 6, 6, 6, 6, 6, 5, + 6, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 4, 5, + 4, 4, 5, 4, 4, 4, 4, 4, 4, 3, 4, 4, 3, 4, 4, 3, + 3, 4, 3, 3, 3, 4, 3, 3, 3, 3, 3, 3, 2, 3, 3, 3, + 2, 3, 2, 3, 3, 2, 2, 3, 2, 2, 3, 2, 2, 2, 2, 3, + 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 1, 2, 2, 2, 1, + 2, 1, 2, 2, 1, 2, 1, 2, 1, 1, 2, 1, 1, 2, 1, 1, + 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, + 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, + 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, + 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, + 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, + 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, + ]; +} diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqWriter.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqWriter.cs index 301887751..f0bda5834 100644 --- a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqWriter.cs +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqWriter.cs @@ -1,246 +1,384 @@ using System.Text; -using Compression.Core.Checksums; namespace FileFormat.Zpaq; /// -/// Writes a ZPAQ level-1 journaling archive. +/// Writes a ZPAQ journaling archive holding one version (transaction): the c header, +/// the deduplicated and compressed d data blocks, their h fragment tables and the +/// i index, exactly as zpaq add lays them out. /// /// /// -/// Each call to or creates a -/// transaction consisting of a header block ('c'), a data block ('d'), and an -/// index block ('h'). Data is stored uncompressed (no ZPAQL program is needed). +/// Follows Jidac::add of zpaq 7.15 (Matt Mahoney, public domain): files are split into +/// content-defined fragments with the order-1 rolling hash, identical fragments are stored +/// once, fragments are packed into blocks (16 MiB at method 1, 64 MiB at 2..5) that end with +/// the fragment-size list, and each block's method is chosen from the analysed redundancy +/// and text/x86 hints. The whole archive is produced when the writer is disposed. /// /// -/// The writer produces archives that can be read by the reference zpaq -/// tool (level 1 journaling format) and by . +/// accepts zpaq's -method values: 0..5 with an +/// optional block-size digit ("14", "36"), or an explicit x method string. /// /// public sealed class ZpaqWriter : IDisposable { + private const int OrderOneTables = 4; + private const int Fragment = 6; + + // 32768/((i+1)*204), zpaq 7.15 Jidac::add(); entries past the 160 listed are zero. + private static readonly byte[] AnalysisDivisor = BuildAnalysisDivisor(); + private readonly Stream _stream; private readonly bool _leaveOpen; + private readonly Dictionary _entries = new(StringComparer.Ordinal); private bool _disposed; - // Accumulate SHA-1 hashes for the final index block. - private readonly List _hashes = []; - // Track whether we have written anything (for the final index block). - private bool _hasEntries; - - /// - /// Initializes a new ZPAQ writer that writes to the specified stream. - /// - /// A writable stream to receive the archive data. - /// - /// to leave open when - /// this writer is disposed; (default) to dispose it. - /// - /// - /// Thrown when is . - /// - /// - /// Thrown when is not writable. - /// - public ZpaqWriter(Stream stream, bool leaveOpen = false) { + private sealed class PendingEntry(string name, long date, long attr, byte[]? data) { + public readonly string Name = name; + public readonly long Date = date; + public readonly long Attr = attr; + public readonly byte[]? Data = data; + public readonly List Ptr = []; + public ulong SortKey; + } + + /// Creates a writer that emits the archive to on dispose. + /// Writable destination. + /// Whether to leave open on dispose. + /// zpaq compression method; "1" is zpaq's default. + public ZpaqWriter(Stream stream, bool leaveOpen = false, string method = "1") { ArgumentNullException.ThrowIfNull(stream); + ArgumentException.ThrowIfNullOrEmpty(method); if (!stream.CanWrite) throw new ArgumentException("Stream must be writable.", nameof(stream)); - - _stream = stream; - _leaveOpen = leaveOpen; + if (!"0123456789x".Contains(method[0])) + throw new ArgumentException("Method must begin with 0..5 or x.", nameof(method)); + this._stream = stream; + this._leaveOpen = leaveOpen; + this.Method = method; } - /// - /// Adds a file entry to the archive with the given name and data. - /// - /// - /// The filename to store in the archive. Forward slashes are used as path separators. - /// - /// The uncompressed file data. - /// - /// The last-modified timestamp for the file. - /// Defaults to if not specified. - /// - /// Thrown if the writer has been disposed. - /// - /// Thrown when or is . - /// + /// The zpaq compression method used for the data blocks. + public string Method { get; } + + /// Date of the transaction; defaults to the time of disposal. + public DateTime? TransactionDate { get; set; } + + /// Adds (or replaces) a file. public void AddFile(string fileName, byte[] data, DateTime? lastModified = null) { - ObjectDisposedException.ThrowIf(_disposed, this); + ObjectDisposedException.ThrowIf(this._disposed, this); ArgumentNullException.ThrowIfNull(fileName); ArgumentNullException.ThrowIfNull(data); - - var timestamp = lastModified ?? DateTime.UtcNow; - var normalizedName = NormalizeName(fileName); - - // Compute SHA-1 hash of the data. - var hash = Sha1.Compute(data); - - // Write header block ('c'). - WriteHeaderBlock(normalizedName, (long)data.Length, timestamp, isDirectory: false); - - // Write data block ('d'). - WriteDataBlock(data); - - // Record hash for the index block. - _hashes.Add(hash); - _hasEntries = true; + var name = fileName.Replace('\\', '/').TrimStart('/'); + ArgumentException.ThrowIfNullOrEmpty(name, nameof(fileName)); + if (name.EndsWith('/')) + throw new ArgumentException("A file name cannot end with '/'.", nameof(fileName)); + this._entries[name] = new(name, this.DateOf(lastModified), 'w' | 0x20L << 8, data); } - /// - /// Adds a directory entry to the archive. - /// - /// - /// The directory name. A trailing '/' is added if not already present. - /// - /// - /// The last-modified timestamp. Defaults to if not specified. - /// - /// Thrown if the writer has been disposed. - /// - /// Thrown when is . - /// + /// Adds a directory entry. public void AddDirectory(string dirName, DateTime? lastModified = null) { - ObjectDisposedException.ThrowIf(_disposed, this); + ObjectDisposedException.ThrowIf(this._disposed, this); ArgumentNullException.ThrowIfNull(dirName); - - var timestamp = lastModified ?? DateTime.UtcNow; - var normalizedName = NormalizeName(dirName); - if (!normalizedName.EndsWith('/')) - normalizedName += '/'; - - // Write header block ('c') with size 0. - WriteHeaderBlock(normalizedName, 0, timestamp, isDirectory: true); - - // Write an empty data block ('d'). - WriteDataBlock([]); - - // Directory entries get a zero hash. - _hashes.Add(new byte[Sha1.HashSize]); - _hasEntries = true; + var name = dirName.Replace('\\', '/').TrimStart('/'); + ArgumentException.ThrowIfNullOrEmpty(name, nameof(dirName)); + if (!name.EndsWith('/')) + name += '/'; + this._entries[name] = new(name, this.DateOf(lastModified), 'w' | 0x10L << 8, null); } - /// + /// public void Dispose() { - if (_disposed) + if (this._disposed) return; + this._disposed = true; + try { + if (this._entries.Count > 0) + this.WriteTransaction(); + this._stream.Flush(); + } finally { + if (!this._leaveOpen) + this._stream.Dispose(); + } + } - _disposed = true; - - // Write the final index ('h') block with all accumulated SHA-1 hashes. - if (_hasEntries) - WriteIndexBlock(); + private long DateOf(DateTime? time) => ZpaqDate.FromDateTime(time ?? this.TransactionDate ?? DateTime.UtcNow); + + private void WriteTransaction() { + var date = ZpaqDate.FromDateTime(this.TransactionDate ?? DateTime.UtcNow); + if (date is < 19000000000000L or >= 30000000000000L) + throw new InvalidOperationException("ZPAQ dates must lie in the years 1900..2999."); + + var method = this.Method; + if (method.Length == 1) + method += method[0] is >= '2' and <= '9' ? "6" : "4"; + var logBlockSize = 20 + AtoiPrefix(method, 1); + if (logBlockSize is < 20 or > 31) + throw new InvalidOperationException("ZPAQ block size must be 0..11."); + var blocksize = (uint)((1L << logBlockSize) - 4096); + var maxFragment = (8128u << Fragment) > blocksize - 12 ? blocksize - 12 : 8128u << Fragment; + var minFragment = (64u << Fragment) > maxFragment ? maxFragment : 64u << Fragment; + + // Files to compress, sorted like zpaq: by extension (first 5 bytes), then descending size. + var vf = new List(); + foreach (var e in this._entries.Values) { + if (e.Data == null) + continue; + ulong key = 0; + var sp = 0; + foreach (var b in Encoding.UTF8.GetBytes(e.Name)) { + ulong c = b; + if (c is >= 'A' and <= 'Z') + c += 'a' - 'A'; + if (c == '/') { + sp = 0; + key = 0; + } else if (c == '.') { + sp = 8; + key = 0; + } else if (sp > 3) + key += c << (--sp * 8); + } + var s = (long)e.Data.Length >> 14; + if (s >= 1 << 24) + s = (1 << 24) - 1; + key += (ulong)((1 << 24) - s - 1); + e.SortKey = key; + vf.Add(e); + } + vf.Sort((a, b) => a.SortKey != b.SortKey ? a.SortKey.CompareTo(b.SortKey) : CompareUtf8(a.Name, b.Name)); + + // Fragment table: index 0 is unused, IDs start at 1. + var ht = new List<(byte[] Sha1, int Usize)> { ([], -2) }; + var htIndex = new Dictionary(StringComparer.Ordinal); + const uint htsize = 1; + + var dataBlocks = new MemoryStream(); + var csize = new List(); + var blocklist = new List(); + var sb = new ZpaqBuffer(); + uint frags = 0, redundancy = 0, text = 0, exe = 0; + var o1prev = new byte[OrderOneTables * 256]; + var fragbuf = new byte[maxFragment]; + var dataWriter = new ZpaqStreamWriter(dataBlocks); + + for (var fi = 0; fi <= vf.Count; ++fi) { + var data = fi < vf.Count ? vf[fi].Data! : null; + var pos = 0; + for (var fj = 0; ; ++fj) { + long sz = 0; + uint hits = 0; + var c = -1; + uint htptr = 0; + byte[] sha1Result = []; + var o1 = new byte[256]; + if (data != null) { + var c1 = 0; + var h = 0u; + while (true) { + c = pos < data.Length ? data[pos++] : -1; + if (c != -1) { + if (c == o1[c1]) { + h = (h + (uint)c + 1) * 314159265u; + ++hits; + } else + h = (h + (uint)c + 1) * 271828182u; + o1[c1] = (byte)c; + c1 = c; + fragbuf[sz++] = (byte)c; + } + if (c == -1 || sz >= maxFragment || (h < 1u << (22 - Fragment) && sz >= minFragment)) + break; + } + sha1Result = Compression.Core.Checksums.Sha1.Compute(fragbuf.AsSpan(0, (int)sz)); + htptr = htIndex.GetValueOrDefault(Convert.ToHexString(sha1Result)); + } + + if (htptr == 0) { + var text1 = 0; + var exe1 = 0; + var h1 = sz; + var o1ct = new byte[256]; + for (var i = 0; i < 256; ++i) { + if (o1ct[o1[i]] < 255) + h1 -= (sz * AnalysisDivisor[o1ct[o1[i]]++]) >> 15; + if (o1[i] == ' ' && (char.IsAsciiLetterOrDigit((char)i) || i == '.' || i == ',')) + ++text1; + if (o1[i] != 0 && (i < 9 || i == 11 || i == 12 || (i >= 14 && i <= 31) || i >= 240)) + --text1; + if (i is >= 192 and < 240 && o1[i] != 0 && (o1[i] < 128 || o1[i] >= 192)) + --text1; + if (o1[i] == 139) + ++exe1; + } + text1 = text1 >= 3 ? 1 : 0; + exe1 = exe1 >= 5 ? 1 : 0; + if (sz > 0) + h1 = h1 * h1 / sz; + var h2 = (uint)h1; + if (h2 > hits) + hits = h2; + h2 = (uint)(o1ct[0] * sz / 256); + if (h2 > hits) + hits = h2; + h2 = 0; + for (var i = 0; i < 256 * OrderOneTables; ++i) + if (o1prev[i] == o1[i & 255]) + ++h2; + h2 = (uint)(h2 * sz / (256 * OrderOneTables)); + if (h2 > hits) + hits = h2; + if (hits > sz) + hits = (uint)sz; + + var newblock = false; + if (frags > 0 && fj == 0 && fi < vf.Count) { + long esize = vf[fi].Data!.Length; + var newsize = sb.Size + esize + (esize >> 14) + 4096 + frags * 4L; + if (newsize > blocksize / 4 && redundancy < sb.Size / 128) + newblock = true; + if (newblock) { + var ct = 0u; + for (var i = 0; i < 256 * OrderOneTables; ++i) + if (o1prev[i] != 0 && o1prev[i] == o1[i & 255]) + ++ct; + if (ct > OrderOneTables * 2) + newblock = false; + } + if (newsize >= blocksize) + newblock = true; + } + if (sb.Size + sz + 80 + frags * 4L >= blocksize) + newblock = true; + if (fi == vf.Count) + newblock = true; + if (frags < 1) + newblock = false; + + if (newblock) { + for (var i = ht.Count - (int)frags; i < ht.Count; ++i) + PutLe(sb, (ulong)ht[i].Usize, 4); + PutLe(sb, 0, 4); + PutLe(sb, frags, 4); + var m = method; + if (char.IsAsciiDigit(method[0])) + m += "," + ZpaqMethods.Itos(redundancy / (sb.Size / 256 + 1)) + "," + ZpaqMethods.Itos((exe > frags ? 2 : 0) + (text > frags ? 1 : 0)); + var fn = "jDC" + ZpaqMethods.Itos(date, 14) + "d" + ZpaqMethods.Itos(ht.Count - frags, 10); + var before = dataBlocks.Length; + ZpaqMethods.CompressBlock(sb, dataWriter, m, fn, [.. JournalComment]); + csize.Add((int)(dataBlocks.Length - before)); + sb = new(); + blocklist.Add(ht.Count - (int)frags); + frags = redundancy = text = exe = 0; + Array.Clear(o1prev); + } + + sb.Write(fragbuf.AsSpan(0, (int)sz)); + ++frags; + redundancy += hits; + exe += (uint)exe1 * 4; + text += (uint)text1 * 2; + if (sz >= minFragment) { + Array.Copy(o1prev, 256, o1prev, 0, 256 * (OrderOneTables - 1)); + Array.Copy(o1, 0, o1prev, 256 * (OrderOneTables - 1), 256); + } + } + + if (data != null) { + if (htptr == 0) { + htptr = (uint)ht.Count; + ht.Add((sha1Result, (int)sz)); + htIndex.TryAdd(Convert.ToHexString(sha1Result), htptr); + } + vf[fi].Ptr.Add(htptr); + } + if (c == -1) + break; + } + } - _stream.Flush(); + var output = new ZpaqStreamWriter(this._stream); + + // Transaction header: the size of the data blocks that follow it. + var header = new ZpaqBuffer(); + PutLe(header, (ulong)dataBlocks.Length, 8); + ZpaqMethods.CompressBlock(header, output, "0", "jDC" + ZpaqMethods.Itos(date, 14) + "c" + ZpaqMethods.Itos(htsize, 10), [.. JournalComment]); + + dataBlocks.Position = 0; + dataBlocks.CopyTo(this._stream); + + // Fragment tables, one per data block. + blocklist.Add(ht.Count); + for (var i = 0; i < csize.Count; ++i) { + if (blocklist[i] >= blocklist[i + 1]) + continue; + var table = new ZpaqBuffer(); + PutLe(table, (ulong)csize[i], 4); + for (var j = blocklist[i]; j < blocklist[i + 1]; ++j) { + table.Write(ht[j].Sha1); + PutLe(table, (ulong)ht[j].Usize, 4); + } + ZpaqMethods.CompressBlock(table, output, "0", "jDC" + ZpaqMethods.Itos(date, 14) + "h" + ZpaqMethods.Itos(blocklist[i], 10), [.. JournalComment]); + } - if (!_leaveOpen) - _stream.Dispose(); + // Index, in byte order of the names like zpaq's std::map. + var index = new ZpaqBuffer(); + var dtcount = 0; + var ordered = this._entries.Values.OrderBy(e => e.Name, Comparer.Create(CompareUtf8)).ToList(); + for (var k = 0; ; ++k) { + if (k < ordered.Count) { + var e = ordered[k]; + PutLe(index, (ulong)e.Date, 8); + index.Write(Encoding.UTF8.GetBytes(e.Name)); + index.Put(0); + PutLe(index, 5, 4); + PutLe(index, (ulong)e.Attr, 5); + PutLe(index, (ulong)e.Ptr.Count, 4); + foreach (var p in e.Ptr) + PutLe(index, p, 4); + } + if (index.Size > 16000 || (index.Size > 0 && k >= ordered.Count)) { + ZpaqMethods.CompressBlock(index, output, "1", "jDC" + ZpaqMethods.Itos(date) + "i" + ZpaqMethods.Itos(++dtcount, 10), [.. JournalComment]); + index = new(); + } + if (k >= ordered.Count) + break; + } } - // ── Block writers ────────────────────────────────────────────────────────── - - /// - /// Writes a header ('c') block for a single file or directory entry. - /// - /// - /// Layout: - /// - /// "zPQ" (3 bytes) + level (1) + 'c' (1) - /// FILETIME (8 bytes, little-endian Windows FILETIME) - /// attribute (1 byte: 0x20 = file, 0x10 = directory) - /// filename (UTF-8, null-terminated) - /// size (8 bytes, little-endian int64) - /// 0xFF (end-of-block marker) - /// - /// - private void WriteHeaderBlock(string name, long size, DateTime timestamp, bool isDirectory) { - // Block prefix. - _stream.Write(ZpaqConstants.BlockPrefix); - _stream.WriteByte(ZpaqConstants.Level1); - _stream.WriteByte(ZpaqConstants.BlockTypeHeader); - - // Windows FILETIME (100-nanosecond intervals since 1601-01-01 UTC). - var fileTime = EncodeWindowsFileTime(timestamp); - Span ftBytes = stackalloc byte[8]; - BitConverter.TryWriteBytes(ftBytes, fileTime); - _stream.Write(ftBytes); - - // Attribute byte: 0x20 = normal file, 0x10 = directory (Windows convention). - _stream.WriteByte(isDirectory ? (byte)0x10 : (byte)0x20); - - // Null-terminated UTF-8 filename. - var nameBytes = Encoding.UTF8.GetBytes(name); - _stream.Write(nameBytes); - _stream.WriteByte(0); // null terminator - - // Uncompressed size (8 bytes, little-endian). - Span sizeBytes = stackalloc byte[8]; - BitConverter.TryWriteBytes(sizeBytes, size); - _stream.Write(sizeBytes); - - // End-of-block marker. - _stream.WriteByte(0xFF); - } + private static ReadOnlySpan JournalComment => "jDC\x01"u8; - /// - /// Writes a data ('d') block containing the raw (uncompressed) file data. - /// - /// - /// Layout: - /// - /// "zPQ" (3 bytes) + level (1) + 'd' (1) - /// raw data bytes - /// - /// - private void WriteDataBlock(byte[] data) { - // Block prefix. - _stream.Write(ZpaqConstants.BlockPrefix); - _stream.WriteByte(ZpaqConstants.Level1); - _stream.WriteByte(ZpaqConstants.BlockTypeData); - - // Raw data payload. - if (data.Length > 0) - _stream.Write(data); + private static void PutLe(ZpaqBuffer sb, ulong x, int n) { + for (; n > 0; --n) { + sb.Put((int)(x & 255)); + x >>= 8; + } } - /// - /// Writes the index ('h') block containing SHA-1 hashes for all files - /// added to the archive. - /// - /// - /// Layout: - /// - /// "zPQ" (3 bytes) + level (1) + 'h' (1) - /// For each file: SHA-1 hash (20 bytes) - /// - /// - private void WriteIndexBlock() { - // Block prefix. - _stream.Write(ZpaqConstants.BlockPrefix); - _stream.WriteByte(ZpaqConstants.Level1); - _stream.WriteByte(ZpaqConstants.BlockTypeIndex); - - // SHA-1 hashes, one per entry. - foreach (var hash in _hashes) - _stream.Write(hash); + private static int AtoiPrefix(string s, int i) { + var r = 0; + for (; i < s.Length && char.IsAsciiDigit(s[i]); ++i) + r = r * 10 + s[i] - '0'; + return r; } - // ── Utilities ────────────────────────────────────────────────────────────── - - private static string NormalizeName(string name) => - name.Replace('\\', '/'); - - /// - /// Encodes a as a Windows FILETIME (little-endian int64). - /// - private static long EncodeWindowsFileTime(DateTime dateTime) { - try { - return dateTime.Kind == DateTimeKind.Utc - ? dateTime.ToFileTimeUtc() - : dateTime.ToUniversalTime().ToFileTimeUtc(); - } catch { - // If the date is out of range for FILETIME, return 0. - return 0; - } + private static int CompareUtf8(string? a, string? b) => + Encoding.UTF8.GetBytes(a ?? "").AsSpan().SequenceCompareTo(Encoding.UTF8.GetBytes(b ?? "")); + + private static byte[] BuildAnalysisDivisor() { + byte[] listed = [ + 160, 80, 53, 40, 32, 26, 22, 20, 17, 16, 14, 13, 12, 11, 10, 10, + 9, 8, 8, 8, 7, 7, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, + 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + ]; + var t = new byte[256]; + listed.CopyTo(t, 0); + return t; } } diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqlMachine.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqlMachine.cs new file mode 100644 index 000000000..a0cc3b412 --- /dev/null +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqlMachine.cs @@ -0,0 +1,462 @@ +namespace FileFormat.Zpaq; + +/// +/// The ZPAQL virtual machine: a block header (COMP + HCOMP, or a PCOMP post-processor) and +/// the interpreter that runs it once per byte. +/// +/// +/// Converted from libzpaq 7.15 (Matt Mahoney, public domain), class ZPAQL, interpreter +/// only (no JIT). The header layout is the one in the ZPAQ Level 2 specification section 6: +/// hsize[2] hh hm ph pm n COMP[...] 0 (128-byte guard) HCOMP[...] 0. +/// +internal sealed class ZpaqlMachine { + /// Number of bytes that each component type occupies in COMP, indexed by type. + internal static ReadOnlySpan ComponentSize => [0, 2, 3, 2, 3, 4, 6, 6, 3, 5]; + + /// Component type codes. + internal const int None = 0, Cons = 1, Cm = 2, Icm = 3, Match = 4, Avg = 5, Mix2 = 6, Mix = 7, Isse = 8, Sse = 9; + + private const int OutputBufferSize = 1 << 14; + + private byte[] _m = []; + private uint[] _h = []; + private uint[] _r = []; + private int _mMask; + private int _hMask; + private readonly byte[] _outbuf = new byte[OutputBufferSize]; + private int _bufptr; + private uint _a, _b, _c, _d; + private bool _f; + private int _pc; + + /// Block header: hsize[2] hh hm ph pm n COMP (guard) HCOMP (guard). + internal byte[] Header = []; + + /// End of COMP in : COMP occupies Header[7..Cend-1]. + internal int Cend; + + /// Start of HCOMP/PCOMP code in . + internal int Hbegin; + + /// End of HCOMP/PCOMP code in . + internal int Hend; + + /// Destination of the OUT instruction, or to discard. + internal IZpaqWriter? Output; + + /// Hash of everything written by OUT, or . + internal ZpaqSha1? Sha1; + + /// Creates an empty machine. + public ZpaqlMachine() => this.Clear(); + + /// Gets element of H (index wraps to the array size). + internal uint H(int i) => this._h[i & this._hMask]; + + /// Releases the program and resets the machine state. + internal void Clear() { + this.Cend = this.Hbegin = this.Hend = 0; + this._a = this._b = this._c = this._d = 0; + this._f = false; + this._pc = 0; + this.Header = []; + this._h = []; + this._m = []; + this._r = []; + } + + /// Writes the header; with only the PCOMP size and code. + /// when there was a program to write. + internal bool Write(IZpaqWriter output, bool postProcessorOnly) { + if (this.Header.Length <= 6) + return false; + if (!postProcessorOnly) { + for (var i = 0; i < this.Cend; ++i) + output.Put(this.Header[i]); + } else { + output.Put((this.Hend - this.Hbegin) & 255); + output.Put((this.Hend - this.Hbegin) >> 8); + } + for (var i = this.Hbegin; i < this.Hend; ++i) + output.Put(this.Header[i]); + return true; + } + + /// Reads a COMP + HCOMP header from . + /// The number of header bytes held. + internal int Read(IZpaqReader input) { + var hsize = input.Get(); + hsize += input.Get() * 256; + if (hsize < 0) + ZpaqError.Throw("unexpected end of file"); + this.Header = new byte[hsize + 300]; + this.Cend = this.Hbegin = this.Hend = 0; + this.Header[this.Cend++] = (byte)hsize; + this.Header[this.Cend++] = (byte)(hsize >> 8); + while (this.Cend < 7) + this.Header[this.Cend++] = (byte)input.Get(); + + var n = this.Header[this.Cend - 1]; + for (var i = 0; i < n; ++i) { + var type = input.Get(); + if (type is < 0 or > 255) + ZpaqError.Throw("unexpected end of file"); + this.Header[this.Cend++] = (byte)type; + var size = type < ComponentSize.Length ? ComponentSize[type] : 0; + if (size < 1) + ZpaqError.Throw("invalid component type"); + if (this.Cend + size > hsize) + ZpaqError.Throw("COMP overflows header"); + for (var j = 1; j < size; ++j) + this.Header[this.Cend++] = (byte)input.Get(); + } + if ((this.Header[this.Cend++] = (byte)input.Get()) != 0) + ZpaqError.Throw("missing COMP END"); + + this.Hbegin = this.Hend = this.Cend + 128; + if (this.Hend > hsize + 129) + ZpaqError.Throw("missing HCOMP"); + while (this.Hend < hsize + 129) { + var op = input.Get(); + if (op == -1) + ZpaqError.Throw("unexpected end of file"); + this.Header[this.Hend++] = (byte)op; + } + if ((this.Header[this.Hend++] = (byte)input.Get()) != 0) + ZpaqError.Throw("missing HCOMP END"); + return this.Cend + this.Hend - this.Hbegin; + } + + /// Prepares the machine to run as HCOMP (sizes hh, hm). + internal void InitHcomp() => this.Init(this.Header[2], this.Header[3]); + + /// Prepares the machine to run as PCOMP (sizes ph, pm). + internal void InitPcomp() => this.Init(this.Header[4], this.Header[5]); + + /// Approximate memory needed to run this block, in bytes. + internal double Memory() { + static double Pow2(int x) => Math.Pow(2, x); + var mem = Pow2(this.Header[2] + 2) + Pow2(this.Header[3]) + Pow2(this.Header[4] + 2) + Pow2(this.Header[5]) + this.Header.Length; + var cp = 7; + for (var i = 0; i < this.Header[6]; ++i) { + var size = Pow2(this.Header[cp + 1]); + switch (this.Header[cp]) { + case Cm: mem += 4 * size; break; + case Icm: mem += 64 * size + 1024; break; + case Match: mem += 4 * size + Pow2(this.Header[cp + 2]); break; + case Mix2: mem += 2 * size; break; + case Mix: mem += 4 * size * this.Header[cp + 3]; break; + case Isse: mem += 64 * size + 2048; break; + case Sse: mem += 128 * size; break; + } + cp += ComponentSize[this.Header[cp]]; + } + return mem; + } + + /// Writes the pending OUT bytes to and . + internal void Flush() { + var pending = this._outbuf.AsSpan(0, this._bufptr); + this.Output?.Write(pending); + this.Sha1?.Write(pending); + this._bufptr = 0; + } + + /// Runs the program once with in A. + internal void Run(uint input) { + this._pc = this.Hbegin; + this._a = input; + while (this.Execute()) { } + } + + /// Allocates a zero-filled array of 2^ elements of . + internal static T[] AllocatePow2(int bits, int extraShift = 0) { + var total = bits + extraShift; + if (total > 32) + ZpaqError.Throw("array too big"); + var length = 1L << total; + if (length > Array.MaxLength) + throw new NotSupportedException($"ZPAQ: a model array of 2^{total} elements exceeds what this runtime can allocate."); + return new T[length]; + } + + private void Init(int hbits, int mbits) { + if (hbits > 32) + ZpaqError.Throw("H too big"); + if (mbits > 32) + ZpaqError.Throw("M too big"); + this._h = AllocatePow2(hbits); + this._m = AllocatePow2(mbits); + this._hMask = this._h.Length - 1; + this._mMask = this._m.Length - 1; + this._r = new uint[256]; + this._a = this._b = this._c = this._d = 0; + this._pc = 0; + this._f = false; + } + + /// Buffers output byte ; -1 flushes the buffer. + internal void OutC(int ch) { + if (ch < 0) { + this.Flush(); + return; + } + this._outbuf[this._bufptr] = (byte)ch; + if (++this._bufptr == this._outbuf.Length) + this.Flush(); + } + + [System.Diagnostics.CodeAnalysis.DoesNotReturn] + private static void Error() => ZpaqError.Throw("ZPAQL execution error"); + + private void Div(uint x) => this._a = x != 0 ? this._a / x : 0; + + private void Mod(uint x) => this._a = x != 0 ? this._a % x : 0; + + private static void Swap(ref uint a, ref uint x) { + a ^= x; + x ^= a; + a ^= x; + } + + private static void Swap(ref uint a, ref byte x) { + a ^= x; + x = (byte)(x ^ a); + a ^= x; + } + + /// Interprets one instruction; returns after HALT. + private bool Execute() { + var header = this.Header; + var m = this._m; + var h = this._h; + var mm = this._mMask; + var hm = this._hMask; + ref var mb = ref m[(int)(this._b & (uint)mm)]; + ref var mc = ref m[(int)(this._c & (uint)mm)]; + ref var hd = ref h[(int)(this._d & (uint)hm)]; + switch (header[this._pc++]) { + case 0: Error(); break; + case 1: ++this._a; break; + case 2: --this._a; break; + case 3: this._a = ~this._a; break; + case 4: this._a = 0; break; + case 7: this._a = this._r[header[this._pc++]]; break; + case 8: Swap(ref this._a, ref this._b); break; + case 9: ++this._b; break; + case 10: --this._b; break; + case 11: this._b = ~this._b; break; + case 12: this._b = 0; break; + case 15: this._b = this._r[header[this._pc++]]; break; + case 16: Swap(ref this._a, ref this._c); break; + case 17: ++this._c; break; + case 18: --this._c; break; + case 19: this._c = ~this._c; break; + case 20: this._c = 0; break; + case 23: this._c = this._r[header[this._pc++]]; break; + case 24: Swap(ref this._a, ref this._d); break; + case 25: ++this._d; break; + case 26: --this._d; break; + case 27: this._d = ~this._d; break; + case 28: this._d = 0; break; + case 31: this._d = this._r[header[this._pc++]]; break; + case 32: Swap(ref this._a, ref mb); break; + case 33: ++mb; break; + case 34: --mb; break; + case 35: mb = (byte)~mb; break; + case 36: mb = 0; break; + case 39: if (this._f) this._pc += ((header[this._pc] + 128) & 255) - 127; else ++this._pc; break; + case 40: Swap(ref this._a, ref mc); break; + case 41: ++mc; break; + case 42: --mc; break; + case 43: mc = (byte)~mc; break; + case 44: mc = 0; break; + case 47: if (!this._f) this._pc += ((header[this._pc] + 128) & 255) - 127; else ++this._pc; break; + case 48: Swap(ref this._a, ref hd); break; + case 49: ++hd; break; + case 50: --hd; break; + case 51: hd = ~hd; break; + case 52: hd = 0; break; + case 55: this._r[header[this._pc++]] = this._a; break; + case 56: return false; + case 57: this.OutC((int)(this._a & 255)); break; + case 59: this._a = (this._a + mb + 512) * 773; break; + case 60: hd = (hd + this._a + 512) * 773; break; + case 63: this._pc += ((header[this._pc] + 128) & 255) - 127; break; + case 64: break; + case 65: this._a = this._b; break; + case 66: this._a = this._c; break; + case 67: this._a = this._d; break; + case 68: this._a = mb; break; + case 69: this._a = mc; break; + case 70: this._a = hd; break; + case 71: this._a = header[this._pc++]; break; + case 72: this._b = this._a; break; + case 73: break; + case 74: this._b = this._c; break; + case 75: this._b = this._d; break; + case 76: this._b = mb; break; + case 77: this._b = mc; break; + case 78: this._b = hd; break; + case 79: this._b = header[this._pc++]; break; + case 80: this._c = this._a; break; + case 81: this._c = this._b; break; + case 82: break; + case 83: this._c = this._d; break; + case 84: this._c = mb; break; + case 85: this._c = mc; break; + case 86: this._c = hd; break; + case 87: this._c = header[this._pc++]; break; + case 88: this._d = this._a; break; + case 89: this._d = this._b; break; + case 90: this._d = this._c; break; + case 91: break; + case 92: this._d = mb; break; + case 93: this._d = mc; break; + case 94: this._d = hd; break; + case 95: this._d = header[this._pc++]; break; + case 96: mb = (byte)this._a; break; + case 97: mb = (byte)this._b; break; + case 98: mb = (byte)this._c; break; + case 99: mb = (byte)this._d; break; + case 100: break; + case 101: mb = mc; break; + case 102: mb = (byte)hd; break; + case 103: mb = header[this._pc++]; break; + case 104: mc = (byte)this._a; break; + case 105: mc = (byte)this._b; break; + case 106: mc = (byte)this._c; break; + case 107: mc = (byte)this._d; break; + case 108: mc = mb; break; + case 109: break; + case 110: mc = (byte)hd; break; + case 111: mc = header[this._pc++]; break; + case 112: hd = this._a; break; + case 113: hd = this._b; break; + case 114: hd = this._c; break; + case 115: hd = this._d; break; + case 116: hd = mb; break; + case 117: hd = mc; break; + case 118: break; + case 119: hd = header[this._pc++]; break; + case 128: this._a += this._a; break; + case 129: this._a += this._b; break; + case 130: this._a += this._c; break; + case 131: this._a += this._d; break; + case 132: this._a += mb; break; + case 133: this._a += mc; break; + case 134: this._a += hd; break; + case 135: this._a += header[this._pc++]; break; + case 136: this._a = 0; break; + case 137: this._a -= this._b; break; + case 138: this._a -= this._c; break; + case 139: this._a -= this._d; break; + case 140: this._a -= mb; break; + case 141: this._a -= mc; break; + case 142: this._a -= hd; break; + case 143: this._a -= header[this._pc++]; break; + case 144: this._a *= this._a; break; + case 145: this._a *= this._b; break; + case 146: this._a *= this._c; break; + case 147: this._a *= this._d; break; + case 148: this._a *= mb; break; + case 149: this._a *= mc; break; + case 150: this._a *= hd; break; + case 151: this._a *= header[this._pc++]; break; + case 152: this.Div(this._a); break; + case 153: this.Div(this._b); break; + case 154: this.Div(this._c); break; + case 155: this.Div(this._d); break; + case 156: this.Div(mb); break; + case 157: this.Div(mc); break; + case 158: this.Div(hd); break; + case 159: this.Div(header[this._pc++]); break; + case 160: this.Mod(this._a); break; + case 161: this.Mod(this._b); break; + case 162: this.Mod(this._c); break; + case 163: this.Mod(this._d); break; + case 164: this.Mod(mb); break; + case 165: this.Mod(mc); break; + case 166: this.Mod(hd); break; + case 167: this.Mod(header[this._pc++]); break; + case 168: break; + case 169: this._a &= this._b; break; + case 170: this._a &= this._c; break; + case 171: this._a &= this._d; break; + case 172: this._a &= mb; break; + case 173: this._a &= mc; break; + case 174: this._a &= hd; break; + case 175: this._a &= header[this._pc++]; break; + case 176: this._a = 0; break; + case 177: this._a &= ~this._b; break; + case 178: this._a &= ~this._c; break; + case 179: this._a &= ~this._d; break; + case 180: this._a &= ~(uint)mb; break; + case 181: this._a &= ~(uint)mc; break; + case 182: this._a &= ~hd; break; + case 183: this._a &= ~(uint)header[this._pc++]; break; + case 184: break; + case 185: this._a |= this._b; break; + case 186: this._a |= this._c; break; + case 187: this._a |= this._d; break; + case 188: this._a |= mb; break; + case 189: this._a |= mc; break; + case 190: this._a |= hd; break; + case 191: this._a |= header[this._pc++]; break; + case 192: this._a = 0; break; + case 193: this._a ^= this._b; break; + case 194: this._a ^= this._c; break; + case 195: this._a ^= this._d; break; + case 196: this._a ^= mb; break; + case 197: this._a ^= mc; break; + case 198: this._a ^= hd; break; + case 199: this._a ^= header[this._pc++]; break; + case 200: this._a <<= (int)(this._a & 31); break; + case 201: this._a <<= (int)(this._b & 31); break; + case 202: this._a <<= (int)(this._c & 31); break; + case 203: this._a <<= (int)(this._d & 31); break; + case 204: this._a <<= mb & 31; break; + case 205: this._a <<= mc & 31; break; + case 206: this._a <<= (int)(hd & 31); break; + case 207: this._a <<= header[this._pc++] & 31; break; + case 208: this._a >>= (int)(this._a & 31); break; + case 209: this._a >>= (int)(this._b & 31); break; + case 210: this._a >>= (int)(this._c & 31); break; + case 211: this._a >>= (int)(this._d & 31); break; + case 212: this._a >>= mb & 31; break; + case 213: this._a >>= mc & 31; break; + case 214: this._a >>= (int)(hd & 31); break; + case 215: this._a >>= header[this._pc++] & 31; break; + case 216: this._f = true; break; + case 217: this._f = this._a == this._b; break; + case 218: this._f = this._a == this._c; break; + case 219: this._f = this._a == this._d; break; + case 220: this._f = this._a == mb; break; + case 221: this._f = this._a == mc; break; + case 222: this._f = this._a == hd; break; + case 223: this._f = this._a == header[this._pc++]; break; + case 224: this._f = false; break; + case 225: this._f = this._a < this._b; break; + case 226: this._f = this._a < this._c; break; + case 227: this._f = this._a < this._d; break; + case 228: this._f = this._a < mb; break; + case 229: this._f = this._a < mc; break; + case 230: this._f = this._a < hd; break; + case 231: this._f = this._a < header[this._pc++]; break; + case 232: this._f = false; break; + case 233: this._f = this._a > this._b; break; + case 234: this._f = this._a > this._c; break; + case 235: this._f = this._a > this._d; break; + case 236: this._f = this._a > mb; break; + case 237: this._f = this._a > mc; break; + case 238: this._f = this._a > hd; break; + case 239: this._f = this._a > header[this._pc++]; break; + case 255: + if ((this._pc = this.Hbegin + header[this._pc] + 256 * header[this._pc + 1]) >= this.Hend) + Error(); + break; + default: Error(); break; + } + return true; + } +} diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqlVm.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqlVm.cs deleted file mode 100644 index 6f731ba25..000000000 --- a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Zpaq/ZpaqlVm.cs +++ /dev/null @@ -1,960 +0,0 @@ -using System.Runtime.CompilerServices; - -namespace FileFormat.Zpaq; - -/// -/// Component type identifiers for the ZPAQL context-mixing prediction model. -/// -public enum ComponentType : byte { - /// Constant prediction (always predicts 50/50). - Const = 0, - - /// Context model — 2^n counters indexed by hashed context. - Cm = 1, - - /// Indirect context model — byte history maps to a counter. - Icm = 2, - - /// Match model — predicts by finding a previous matching context. - Match = 3, - - /// Average of two component predictions. - Avg = 4, - - /// Two-input adaptive mixer. - Mix2 = 5, - - /// N-input adaptive mixer. - Mix = 6, - - /// Indirect secondary symbol estimation. - Isse = 7, - - /// Direct secondary symbol estimation. - Sse = 8, -} - -/// -/// Represents a single prediction component in the ZPAQL context-mixing model. -/// -public sealed class Component { - /// The component type. - public ComponentType Type { get; set; } - - /// First parameter (meaning depends on type, e.g. log2 of table size). - public int Param1 { get; set; } - - /// Second parameter (meaning depends on type). - public int Param2 { get; set; } - - /// Third parameter (meaning depends on type). - public int Param3 { get; set; } - - /// Component memory (CM counters, ICM byte histories, etc.). - public int[] Memory { get; set; } = []; - - /// Current hashed context value. - public int Context { get; set; } - - /// Current prediction (0..65535, probability of next bit being 1). - public int Prediction { get; set; } = 32768; // 50% - - /// Auxiliary state (match length, mixer weights, etc.). - public int Aux { get; set; } -} - -/// -/// ZPAQL virtual machine for ZPAQ compression and decompression. -/// -/// -/// -/// The ZPAQL VM is a bytecode interpreter with four 32-bit registers (A, B, C, D), -/// a 1-bit flag register (F), a 256-element register file (R[0]..R[255]), -/// a 32-bit H[] array, and an 8-bit M[] array. It executes two programs: -/// -/// -/// -/// HCOMP — runs after each decoded byte to update hash contexts in H[]. -/// -/// -/// PCOMP — optional post-processor that transforms decoded output. -/// -/// -/// -/// The VM also manages an array of context-mixing components (CM, ICM, MATCH, etc.) -/// and combines their predictions into a single probability for the next bit. Coding -/// that bit against the probability is the job of and -/// , which are deliberately separate: the VM decides -/// what the odds are, the coder turns them into bytes. -/// -/// -public sealed class ZpaqlVm { - // ── Registers ─────────────────────────────────────────────────────────────── - - private uint _a; - private uint _b; - private uint _c; - private uint _d; - private bool _f; - private readonly uint[] _r = new uint[256]; - private int _pc; - - // ── Memory arrays ────────────────────────────────────────────────────────── - - private uint[] _h; // H array (32-bit), indexed by B & (length-1) - private byte[] _m; // M array (8-bit), indexed by B/C/D & (length-1) - private int _hMask; // H.Length - 1 for wrapping - private int _mMask; // M.Length - 1 for wrapping - - // ── Programs ─────────────────────────────────────────────────────────────── - - private readonly byte[] _hcomp; // HCOMP bytecode - private readonly byte[] _pcomp; // PCOMP bytecode (optional, may be empty) - - // ── Context-mixing components ────────────────────────────────────────────── - - private readonly Component[] _components; - - // ── Squash / stretch tables for probability mapping ──────────────────────── - - private static readonly int[] SquashTable = BuildSquashTable(); - private static readonly int[] StretchTable = BuildStretchTable(); - - // ── Construction ─────────────────────────────────────────────────────────── - - /// - /// Creates a ZPAQL VM with the specified program and component configuration. - /// - /// HCOMP bytecode (context hashing program). - /// PCOMP bytecode (post-processing program, may be empty). - /// Log2 of H[] array size (0..31). H has 2^hh entries. - /// Log2 of M[] array size (0..31). M has 2^hm entries. - /// Context-mixing component definitions. May be empty for store-only archives. - /// Thrown if is null. - public ZpaqlVm(byte[] hcomp, byte[] pcomp, int hh, int hm, Component[]? components = null) { - ArgumentNullException.ThrowIfNull(hcomp); - _hcomp = hcomp; - _pcomp = pcomp ?? []; - _components = components ?? []; - - hh = Math.Clamp(hh, 0, 24); - hm = Math.Clamp(hm, 0, 24); - var hSize = 1 << hh; - var mSize = 1 << hm; - _h = new uint[hSize]; - _m = new byte[mSize]; - _hMask = hSize - 1; - _mMask = mSize - 1; - - InitComponents(); - } - - /// - /// Parses a ZPAQL program header from a binary span and constructs the VM. - /// - /// - /// Binary ZPAQL program header. Layout: - /// [0]: hh (log2 H size), [1]: hm (log2 M size), - /// [2]: number of components (n), - /// followed by n component descriptors (type + params), - /// then HCOMP bytecode (2-byte LE length + code), - /// then optional PCOMP bytecode (2-byte LE length + code, 0 if absent). - /// - /// Thrown if the program header is malformed. - public ZpaqlVm(ReadOnlySpan program) { - if (program.Length < 3) - ThrowMalformed("Program header too short."); - - var hh = Math.Clamp((int)program[0], 0, 24); - var hm = Math.Clamp((int)program[1], 0, 24); - int nComp = program[2]; - var pos = 3; - - // Parse component descriptors. - var comps = new List(); - for (var i = 0; i < nComp; i++) { - if (pos >= program.Length) - ThrowMalformed("Unexpected end of component descriptors."); - - var comp = new Component { Type = (ComponentType)program[pos++] }; - - // Each component type has a fixed number of parameter bytes. - var paramCount = GetComponentParamCount(comp.Type); - if (pos + paramCount > program.Length) - ThrowMalformed("Unexpected end of component parameters."); - - if (paramCount >= 1) comp.Param1 = program[pos++]; - if (paramCount >= 2) comp.Param2 = program[pos++]; - if (paramCount >= 3) comp.Param3 = program[pos++]; - - comps.Add(comp); - } - - _components = comps.ToArray(); - - // Parse HCOMP bytecode. - if (pos + 2 > program.Length) - ThrowMalformed("Missing HCOMP length."); - var hcompLen = program[pos] | (program[pos + 1] << 8); - pos += 2; - if (pos + hcompLen > program.Length) - ThrowMalformed("HCOMP bytecode truncated."); - _hcomp = program.Slice(pos, hcompLen).ToArray(); - pos += hcompLen; - - // Parse optional PCOMP bytecode. - if (pos + 2 <= program.Length) { - var pcompLen = program[pos] | (program[pos + 1] << 8); - pos += 2; - if (pcompLen > 0 && pos + pcompLen <= program.Length) { - _pcomp = program.Slice(pos, pcompLen).ToArray(); - } else { - _pcomp = []; - } - } else { - _pcomp = []; - } - - var hSize = 1 << hh; - var mSize = 1 << hm; - _h = new uint[hSize]; - _m = new byte[mSize]; - _hMask = hSize - 1; - _mMask = mSize - 1; - - InitComponents(); - } - - // ── Public API ───────────────────────────────────────────────────────────── - - /// - /// Gets the H[] context array. H values are set by the HCOMP program and - /// used as context indices for the prediction components. - /// - public uint[] H => _h; - - /// - /// Gets the M[] byte array used by the HCOMP/PCOMP programs. - /// - public byte[] M => _m; - - /// - /// Gets the context-mixing components. - /// - public Component[] Components => _components; - - /// - /// Gets or sets register A (32-bit accumulator). - /// - public uint A { get => _a; set => _a = value; } - - /// - /// Gets or sets register B (32-bit, also indexes M[]). - /// - public uint B { get => _b; set => _b = value; } - - /// - /// Gets or sets register C (32-bit, also indexes M[]). - /// - public uint C { get => _c; set => _c = value; } - - /// - /// Gets or sets register D (32-bit, also indexes M[]). - /// - public uint D { get => _d; set => _d = value; } - - /// - /// Gets or sets the flag register (1-bit). - /// - public bool F { get => _f; set => _f = value; } - - /// - /// Executes the HCOMP program with the given input byte. - /// This should be called after each decoded byte to update the - /// context hashes in H[]. - /// - /// The decoded byte value (0..255), or -1 for EOF. - public void RunHcomp(int input) { - Execute(_hcomp, input); - } - - /// - /// Executes the PCOMP (post-processing) program with the given input byte. - /// - /// The decoded byte value (0..255), or -1 for EOF. - public void RunPcomp(int input) { - if (_pcomp.Length > 0) - Execute(_pcomp, input); - } - - /// - /// Computes a combined prediction from all components. - /// - /// - /// The components are averaged with equal weight, in ascending component order, - /// and the sum is divided with truncation towards zero. Both the order and the - /// rounding are part of the coded stream, so neither may be left to a container's - /// enumeration order. The result is clamped into the range the range coder accepts, - /// so that both of its subranges stay non-empty; see . - /// - /// Probability that the next bit is 1, in the range 1..65535. - public int Predict() { - if (_components.Length == 0) - return 32768; // 50% if no components - - // Simple averaging of all component predictions. - // A full implementation would use the mixer components (MIX, MIX2) - // from the COMP section for weighted mixing. - long sum = 0; - - for (var i = 0; i < _components.Length; i++) { - var comp = _components[i]; - UpdateComponentPrediction(comp, i); - sum += comp.Prediction; - } - - return (int)Math.Clamp( - sum / _components.Length, - ZpaqRangeCoder.MinimumProbability, - ZpaqRangeCoder.MaximumProbability); - } - - /// - /// Updates all components after a decoded bit. - /// - /// The decoded bit (0 or 1). - public void Update(int bit) { - for (var i = 0; i < _components.Length; i++) - UpdateComponent(_components[i], bit); - } - - /// - /// Resets the VM state (registers, arrays, components) without changing the - /// program or component configuration. - /// - public void Reset() { - _a = _b = _c = _d = 0; - _f = false; - Array.Clear(_r); - Array.Clear(_h); - Array.Clear(_m); - - InitComponents(); - } - - // ── Bytecode execution ───────────────────────────────────────────────────── - - private void Execute(byte[] code, int inputByte) { - if (code.Length == 0) - return; - - // Place input in A register as per ZPAQL spec. - _a = (uint)(inputByte & 0xFF); - _pc = 0; - var limit = 1 << 24; // execution limit to prevent infinite loops - - while (_pc < code.Length && --limit > 0) { - var op = code[_pc++]; - - switch (op) { - // 0: ERROR / HALT - case 0: - return; - - // 2..3: A++, A-- - case 2: _a++; break; - case 3: _a--; break; - - // 4: A = !A (logical NOT) - case 4: _a = _a == 0 ? 1U : 0U; break; - - // 5: A = 0 - case 5: _a = 0; break; - - // 6..8: B=A, C=A, D=A - case 6: _b = _a; break; - case 7: _c = _a; break; - case 8: _d = _a; break; - - // 9..11: *B=A, *C=A, *D=A (write to M[]) - case 9: _m[(int)(_b & (uint)_mMask)] = (byte)_a; break; - case 10: _m[(int)(_c & (uint)_mMask)] = (byte)_a; break; - case 11: _m[(int)(_d & (uint)_mMask)] = (byte)_a; break; - - // 12..14: A=B, A=C, A=D - case 12: _a = _b; break; - case 13: _a = _c; break; - case 14: _a = _d; break; - - // 15..17: A=*B, A=*C, A=*D (read from M[]) - case 15: _a = _m[(int)(_b & (uint)_mMask)]; break; - case 16: _a = _m[(int)(_c & (uint)_mMask)]; break; - case 17: _a = _m[(int)(_d & (uint)_mMask)]; break; - - // 18: A = B + A, F = (result == 0) - case 18: _a = _b + _a; _f = _a == 0; break; - - // 19: A = B - A, F = borrow (B < A before subtraction) - case 19: _f = _b < _a; _a = _b - _a; break; - - // 20: A = B * A, F = (result == 0) - case 20: _a = _b * _a; _f = _a == 0; break; - - // 21: A = B / A, F = (remainder == 0). Div by 0 => A = 0. - case 21: - if (_a == 0) { _a = 0; _f = true; } - else { var rem = _b % _a; _a = _b / _a; _f = rem == 0; } - break; - - // 22: A = B % A. Div by 0 => A = 0. - case 22: - _a = _a == 0 ? 0 : _b % _a; - break; - - // 23..25: A = B & A, B | A, B ^ A - case 23: _a = _b & _a; break; - case 24: _a = _b | _a; break; - case 25: _a = _b ^ _a; break; - - // 26: A = B << (A mod 32) - case 26: _a = _b << (int)(_a & 31); break; - - // 27: A = B >> (A mod 32) (logical) - case 27: _a = _b >> (int)(_a & 31); break; - - // 28: A <<= 8 - case 28: _a <<= 8; break; - - // 29: A >>= 8 (logical) - case 29: _a >>= 8; break; - - // 30: F = (A == B) - case 30: _f = _a == _b; break; - - // 31: F = (A < B) unsigned - case 31: _f = _a < _b; break; - - // 32: F = (A > B) unsigned - case 32: _f = _a > _b; break; - - // 33..38: reserved / unused - case 33: case 34: case 35: case 36: case 37: case 38: - break; - - // 39: HALT - case 39: return; - - // 40: F? (no-op — just tests F, used as prefix) - case 40: break; - - // 41: JT — jump if F is true (1-byte signed offset follows) - case 41: { - var offset = ReadSignedByte(code, ref _pc); - if (_f) _pc += offset; - break; - } - - // 42: JF — jump if F is false (1-byte signed offset follows) - case 42: { - var offset = ReadSignedByte(code, ref _pc); - if (!_f) _pc += offset; - break; - } - - // 43: JMP — unconditional jump (1-byte signed offset) - case 43: { - var offset = ReadSignedByte(code, ref _pc); - _pc += offset; - break; - } - - // 44..46: reserved jump variants - case 44: case 45: case 46: - if (_pc < code.Length) _pc++; // skip 1-byte operand - break; - - // 47: LJ — long jump (2-byte unsigned absolute target) - case 47: { - var target = ReadUInt16(code, ref _pc); - _pc = target; - break; - } - - // 48: R[imm] = A (immediate register index follows) - case 48: { - var idx = (int)ReadByte(code, ref _pc); - _r[idx] = _a; - break; - } - - // 49: A = R[imm] - case 49: { - var idx = (int)ReadByte(code, ref _pc); - _a = _r[idx]; - break; - } - - // 50..55: reserved register ops (with 1-byte operand) - case 50: case 51: case 52: case 53: case 54: case 55: - if (_pc < code.Length) _pc++; // skip operand - break; - - // 56: A += imm - case 56: _a += ReadByte(code, ref _pc); break; - - // 57: A -= imm - case 57: _a -= ReadByte(code, ref _pc); break; - - // 58: A *= imm - case 58: _a *= ReadByte(code, ref _pc); break; - - // 59: A /= imm (0 => A=0) - case 59: { - var imm = ReadByte(code, ref _pc); - _a = imm == 0 ? 0 : _a / imm; - break; - } - - // 60: A %= imm (0 => A=0) - case 60: { - var imm = ReadByte(code, ref _pc); - _a = imm == 0 ? 0 : _a % imm; - break; - } - - // 61: A &= imm - case 61: _a &= ReadByte(code, ref _pc); break; - - // 62: A |= imm - case 62: _a |= ReadByte(code, ref _pc); break; - - // 63: A ^= imm - case 63: _a ^= ReadByte(code, ref _pc); break; - - // 64..127: 2-byte instructions - // Most are A op= imm16 or extended register/memory ops. - case >= 64 and <= 127: { - Execute2Byte(op, code); - break; - } - - // 128..223: 3-byte instructions (conditional jumps with 2-byte offset, etc.) - case >= 128 and <= 223: { - Execute3Byte(op, code); - break; - } - - // 224: OUT — emit A as output byte (used in PCOMP) - case 224: - OutputByte?.Invoke((byte)_a); - break; - - // 225: HASH — A = (A + *B + 512) * 773 - case 225: { - uint mb = _m[(int)(_b & (uint)_mMask)]; - _a = (_a + mb + 512) * 773; - break; - } - - // 226: HASHD — H[D] = (H[D] + A + 512) * 773 - case 226: { - var idx = (int)(_d & (uint)_hMask); - _h[idx] = (_h[idx] + _a + 512) * 773; - break; - } - - // 227..254: reserved / unused - case >= 227 and <= 254: - break; - - // 255: HALT - case 255: return; - } - } - } - - /// - /// Event invoked when the PCOMP program executes an OUT instruction. - /// - public Action? OutputByte { get; set; } - - // ── 2-byte instruction handler ───────────────────────────────────────────── - - private void Execute2Byte(byte op, byte[] code) { - // Opcodes 64..127: the second byte is an immediate operand. - // We handle a useful subset; unrecognized opcodes skip 1 byte. - - var imm = ReadByte(code, ref _pc); - - switch (op) { - // 64: A += imm*256 (upper byte add) - case 64: _a += imm << 8; break; - - // 65: A -= imm*256 - case 65: _a -= imm << 8; break; - - // 66: A *= imm*256 - case 66: _a *= imm << 8; break; - - // 67: A /= imm*256 (0 => A=0) - case 67: { var v = imm << 8; _a = v == 0 ? 0 : _a / v; break; } - - // 68: A %= imm*256 (0 => A=0) - case 68: { var v = imm << 8; _a = v == 0 ? 0 : _a % v; break; } - - // 69: A &= imm*256 - case 69: _a &= imm << 8; break; - - // 70: A |= imm*256 - case 70: _a |= imm << 8; break; - - // 71: A ^= imm*256 - case 71: _a ^= imm << 8; break; - - // 72: A = imm (set A to 1-byte immediate) - case 72: _a = imm; break; - - // 73: B = imm - case 73: _b = imm; break; - - // 74: C = imm - case 74: _c = imm; break; - - // 75: D = imm - case 75: _d = imm; break; - - // 76: A += imm*65536 - case 76: _a += imm << 16; break; - - // 77: A -= imm*65536 - case 77: _a -= imm << 16; break; - - // 78: A += imm*16777216 - case 78: _a += imm << 24; break; - - // 79: A -= imm*16777216 - case 79: _a -= imm << 24; break; - - // 80: H[B] = A (indirect H store, imm ignored) - case 80: _h[(int)(_b & (uint)_hMask)] = _a; break; - - // 81: A = H[B] (indirect H load, imm ignored) - case 81: _a = _h[(int)(_b & (uint)_hMask)]; break; - - // 82: H[imm] = A - case 82: _h[(int)(imm & (uint)_hMask)] = _a; break; - - // 83: A = H[imm] - case 83: _a = _h[(int)(imm & (uint)_hMask)]; break; - - // Everything else: operand already consumed, no-op. - default: break; - } - } - - // ── 3-byte instruction handler ───────────────────────────────────────────── - - private void Execute3Byte(byte op, byte[] code) { - // Opcodes 128..223: 2-byte operand follows (little-endian). - var imm16 = (int)ReadUInt16(code, ref _pc); - - switch (op) { - // 128: A = imm16 - case 128: _a = (uint)imm16; break; - - // 129: B = imm16 - case 129: _b = (uint)imm16; break; - - // 130: C = imm16 - case 130: _c = (uint)imm16; break; - - // 131: D = imm16 - case 131: _d = (uint)imm16; break; - - // 132: JT with 2-byte offset - case 132: if (_f) _pc = imm16; break; - - // 133: JF with 2-byte offset - case 133: if (!_f) _pc = imm16; break; - - // 134: JMP with 2-byte absolute target - case 134: _pc = imm16; break; - - // 135: A += imm16 - case 135: _a += (uint)imm16; break; - - // 136: A -= imm16 - case 136: _a -= (uint)imm16; break; - - // 137: A *= imm16 - case 137: _a *= (uint)imm16; break; - - // 138: A /= imm16 - case 138: _a = imm16 == 0 ? 0 : _a / (uint)imm16; break; - - // 139: A %= imm16 - case 139: _a = imm16 == 0 ? 0 : _a % (uint)imm16; break; - - // 140: A &= imm16 - case 140: _a &= (uint)imm16; break; - - // 141: A |= imm16 - case 141: _a |= (uint)imm16; break; - - // 142: A ^= imm16 - case 142: _a ^= (uint)imm16; break; - - // Everything else: operand already consumed, no-op. - default: break; - } - } - - // ── Operand reading helpers ──────────────────────────────────────────────── - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private static uint ReadByte(byte[] code, ref int pc) => - pc < code.Length ? code[pc++] : 0U; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private static int ReadSignedByte(byte[] code, ref int pc) => - pc < code.Length ? (sbyte)code[pc++] : 0; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private static int ReadUInt16(byte[] code, ref int pc) { - if (pc + 1 >= code.Length) { - pc = code.Length; - return 0; - } - var val = code[pc] | (code[pc + 1] << 8); - pc += 2; - return val; - } - - // ── Component initialization ─────────────────────────────────────────────── - - private void InitComponents() { - for (var i = 0; i < _components.Length; i++) { - var comp = _components[i]; - comp.Prediction = 32768; // 50% - comp.Context = 0; - comp.Aux = 0; - - switch (comp.Type) { - case ComponentType.Cm: { - // 2^Param1 counters, each starts at 32768 (50%). - var size = 1 << Math.Clamp(comp.Param1, 0, 24); - comp.Memory = new int[size]; - for (var j = 0; j < size; j++) - comp.Memory[j] = 32768; - break; - } - - case ComponentType.Icm: { - // Indirect context model: 256 byte-history entries + 2^(Param1+10) counters. - var histSize = 256; - var ctrSize = 1 << Math.Clamp(comp.Param1 + 10, 0, 24); - comp.Memory = new int[histSize + ctrSize]; - // Initialize counters to 50%. - for (var j = histSize; j < comp.Memory.Length; j++) - comp.Memory[j] = 32768; - break; - } - - case ComponentType.Match: { - // Match model: buffer of 2^Param1 bytes + 2^Param2 hash entries. - var bufSize = 1 << Math.Clamp(comp.Param1, 0, 24); - var hashSize = 1 << Math.Clamp(comp.Param2, 0, 24); - comp.Memory = new int[bufSize + hashSize]; - break; - } - - case ComponentType.Sse: { - // SSE: 2^Param1 * 64 entries. - var size = (1 << Math.Clamp(comp.Param1, 0, 20)) * 64; - comp.Memory = new int[size]; - // Initialize to identity mapping. - for (var j = 0; j < size; j++) - comp.Memory[j] = Squash((j % 64 - 32) * 64); - break; - } - - default: - comp.Memory ??= []; - break; - } - } - } - - // ── Component prediction & update ────────────────────────────────────────── - - private void UpdateComponentPrediction(Component comp, int index) { - // Set context from H[index]. - comp.Context = (int)(_h[index & _hMask] & 0x7FFFFFFF); - - switch (comp.Type) { - case ComponentType.Const: - comp.Prediction = 32768; - break; - - case ComponentType.Cm: - if (comp.Memory.Length > 0) { - var ctx = comp.Context % comp.Memory.Length; - comp.Prediction = Math.Clamp(comp.Memory[ctx], 0, 65535); - } - break; - - case ComponentType.Icm: - if (comp.Memory.Length > 256) { - var histIdx = comp.Context & 255; - var ctrIdx = 256 + (comp.Memory[histIdx] & (comp.Memory.Length - 257)); - if (ctrIdx < comp.Memory.Length) - comp.Prediction = Math.Clamp(comp.Memory[ctrIdx], 0, 65535); - } - break; - - case ComponentType.Match: - // Match model: if currently matching, predict from match bit. - if (comp.Aux > 0) - comp.Prediction = comp.Aux > 128 ? 65535 - 256 : 256; - else - comp.Prediction = 32768; - break; - - case ComponentType.Avg: - if (_components.Length > Math.Max(comp.Param1, comp.Param2)) { - var p1 = _components[comp.Param1].Prediction; - var p2 = _components[comp.Param2].Prediction; - comp.Prediction = (p1 + p2 + 1) >> 1; - } - break; - - case ComponentType.Sse: - if (comp.Memory.Length > 0) { - var ctx = (comp.Context * 64) % comp.Memory.Length; - comp.Prediction = Math.Clamp(comp.Memory[ctx], 0, 65535); - } - break; - - default: - comp.Prediction = 32768; - break; - } - } - - private static void UpdateComponent(Component comp, int bit) { - switch (comp.Type) { - case ComponentType.Cm: - if (comp.Memory.Length > 0) { - var ctx = comp.Context % comp.Memory.Length; - var p = comp.Memory[ctx]; - // Adapt towards the observed bit by a fixed fraction of the remaining - // error. The shift is arithmetic, so the step is the error divided by - // 2^rate rounded towards negative infinity — that asymmetry is what - // lets a counter reach 0 exactly while it only approaches 65535, and - // it is part of the coded stream, so it must be reproduced as a floor - // division rather than a truncating one. - var target = bit != 0 ? 65535 : 0; - var rate = Math.Max(comp.Param2, 2); // learning rate - comp.Memory[ctx] = p + ((target - p) >> rate); - } - break; - - case ComponentType.Icm: - if (comp.Memory.Length > 256) { - var histIdx = comp.Context & 255; - var ctrIdx = 256 + (comp.Memory[histIdx] & (comp.Memory.Length - 257)); - if (ctrIdx < comp.Memory.Length) { - var p = comp.Memory[ctrIdx]; - var target = bit != 0 ? 65535 : 0; - comp.Memory[ctrIdx] = p + ((target - p) >> 5); - } - // Update byte history: shift in bit. - comp.Memory[histIdx] = (comp.Memory[histIdx] << 1) | bit; - } - break; - - case ComponentType.Match: - // Update match length tracking. - if (comp.Aux > 0) { - // If prediction was wrong, break match. - var predicted1 = comp.Aux > 128; - if ((bit != 0) != predicted1) - comp.Aux = 0; - } - break; - - // CONST, AVG, SSE, MIX, MIX2, ISSE: simplified — no update needed for basic operation. - default: - break; - } - } - - // ── Probability tables ───────────────────────────────────────────────────── - - /// - /// Squash function: maps a logistic value (-2048..2047) to a probability (0..65535). - /// squash(x) = 65536 / (1 + exp(-x / 64)). - /// - /// Logistic value. - /// Probability in range 1..65534. - public static int Squash(int x) { - x = Math.Clamp(x, -2047, 2047); - return SquashTable[x + 2047]; - } - - /// - /// Stretch function: inverse of squash, maps probability (1..65534) to logistic. - /// - /// Probability (1..65534). - /// Logistic value approximately in range -2047..2047. - public static int Stretch(int p) { - p = Math.Clamp(p, 1, 65534); - return StretchTable[p >> 6]; // 1024-entry table - } - - private static int[] BuildSquashTable() { - // squash(x) = 65536 / (1 + exp(-x/64)) - var table = new int[4095]; // index 0..4094 maps x = -2047..2047 - for (var i = 0; i < table.Length; i++) { - var x = i - 2047; - var p = 65536.0 / (1.0 + Math.Exp(-x / 64.0)); - table[i] = Math.Clamp((int)(p + 0.5), 1, 65534); - } - return table; - } - - private static int[] BuildStretchTable() { - // Inverse of squash, sampled at 1024 points. - var table = new int[1024]; - for (var i = 0; i < 1024; i++) { - var p = (i + 0.5) * 64.0; // map to 0..65535 range - if (p <= 0) p = 1; - if (p >= 65535) p = 65534; - var x = -64.0 * Math.Log(65536.0 / p - 1.0); - table[i] = Math.Clamp((int)Math.Round(x), -2047, 2047); - } - return table; - } - - // ── Component parameter counts ───────────────────────────────────────────── - - private static int GetComponentParamCount(ComponentType type) => - type switch { - ComponentType.Const => 0, - ComponentType.Cm => 2, // size, rate - ComponentType.Icm => 1, // size - ComponentType.Match => 2, // bufSize, hashSize - ComponentType.Avg => 2, // comp1, comp2 - ComponentType.Mix2 => 3, // context, comp1, comp2 - ComponentType.Mix => 3, // context, nInputs, rate - ComponentType.Isse => 2, // context, size - ComponentType.Sse => 2, // context, size - _ => 0, - }; - - // ── Throw helpers ────────────────────────────────────────────────────────── - - [MethodImpl(MethodImplOptions.NoInlining)] - private static void ThrowMalformed(string message) => - throw new InvalidDataException(message); -} diff --git a/Hawkynt.FileFormats.Archives/README.md b/Hawkynt.FileFormats.Archives/README.md index dde83f168..8aaf572d9 100644 --- a/Hawkynt.FileFormats.Archives/README.md +++ b/Hawkynt.FileFormats.Archives/README.md @@ -151,7 +151,7 @@ Every State, Test, Maintenance, Compress/Decompress and Demux/Mux/Remux cell is | ZAP (Amiga) | `Zap` | `.zap` | WORM | ✅ | wipe | Whole-disk archiver: entries are track_NNN.raw | [Aminet](https://aminet.net/) | | [ZIP](https://en.wikipedia.org/wiki/ZIP_(file_format)) | `Zip` | `.zip` `.zipx` | R/W | ✅ | compress · repack · shrink · wipe | Store, Deflate, Deflate64, Shrink, Reduce, Implode, BZip2, LZMA, XZ, PPMd, Zstd, AES | [pkware.cachefly.net](https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT) | | [ZOO](https://en.wikipedia.org/wiki/Zoo_(file_format)) | `Zoo` | `.zoo` | R/W | ✅ | defrag · wipe | | [Archive Team](http://fileformats.archiveteam.org/wiki/ZOO) | -| [ZPAQ](https://en.wikipedia.org/wiki/ZPAQ) | `Zpaq` | `.zpaq` | R/W | ✅ | defrag | Reader covers the stored/simple models; ZPAQL virtual-machine execution is not implemented | [mattmahoney.net](http://mattmahoney.net/dc/zpaq.html) | +| [ZPAQ](https://en.wikipedia.org/wiki/ZPAQ) | `Zpaq` | `.zpaq` | R/W | ✅ | defrag | Journaling (versions, deduplicated fragments) and streaming layouts, methods 0-5 and explicit `x` methods, full ZPAQL; zpaq 7.15 extracts what we write. Encrypted, multi-part and `-index` archives are refused; modify rewrites one version | [ZPAQ Level 2 spec](https://mattmahoney.net/dc/zpaq206.pdf) | ### 🧬 Structured data and registry @@ -559,7 +559,7 @@ Every public and protected member of all 2573 types, generated from the built as - WORM is not R/W: creating a valid archive is different from safely editing one, and only descriptors with a proven edit path advertise `CanModify`. - R/W by rebuild rewrites the container; formats whose listing renames entries (track images, chunked backup images, hash-keyed game archives) can only address entries by the names they list. -- LZFSE: `bvx1` blocks are read but never written. ZPAQ: no ZPAQL virtual machine. StuffIt X and UMX writers emit the envelope shell only. SFAR: LZX payload extraction is limited. Inno Setup: some versions expose no per-file extraction. +- LZFSE: `bvx1` blocks are read but never written. ZPAQ: encrypted (`-key`) archives are refused. StuffIt X and UMX writers emit the envelope shell only. SFAR: LZX payload extraction is limited. Inno Setup: some versions expose no per-file extraction. - OLE2 (DOC / XLS / PPT / MSG / Thumbs.db / MSI) creation produces a valid CFB envelope, not the application's document or database streams. - RAR and 7z creation target the implemented RAR4/RAR5 and 7z paths, not every historical writer version, and no vendor encoder heuristic is reproduced. - Media containers are demuxed at the container level; carried codecs are decoded only where the audio package provides them. diff --git a/Hawkynt.FileFormats.Archives/REFERENCE.md b/Hawkynt.FileFormats.Archives/REFERENCE.md index 79a61405a..8bf887e08 100644 --- a/Hawkynt.FileFormats.Archives/REFERENCE.md +++ b/Hawkynt.FileFormats.Archives/REFERENCE.md @@ -33178,43 +33178,11 @@ Implements `IDisposable`. ### Namespace `FileFormat.Zpaq` -[`Component`](#component) · [`ComponentType`](#componenttype) · [`ZpaqBuildingBlock`](#zpaqbuildingblock) · [`ZpaqConstants`](#zpaqconstants) · [`ZpaqEntry`](#zpaqentry) · [`ZpaqFormatDescriptor`](#zpaqformatdescriptor) · [`ZpaqRangeCoder`](#zpaqrangecoder) · [`ZpaqRangeDecoder`](#zpaqrangedecoder) · [`ZpaqRangeEncoder`](#zpaqrangeencoder) · [`ZpaqReader`](#zpaqreader) · [`ZpaqWriter`](#zpaqwriter) · [`ZpaqlVm`](#zpaqlvm) - -#### `Component` - -Represents a single prediction component in the ZPAQL context-mixing model. - -| Member | Signature | Summary | -| --- | --- | --- | -| `Component` | `Component()` | | -| `Aux` | `int Aux { get; set; }` | Auxiliary state (match length, mixer weights, etc.). | -| `Context` | `int Context { get; set; }` | Current hashed context value. | -| `Memory` | `int[] Memory { get; set; }` | Component memory (CM counters, ICM byte histories, etc.). | -| `Param1` | `int Param1 { get; set; }` | First parameter (meaning depends on type, e.g. log2 of table size). | -| `Param2` | `int Param2 { get; set; }` | Second parameter (meaning depends on type). | -| `Param3` | `int Param3 { get; set; }` | Third parameter (meaning depends on type). | -| `Prediction` | `int Prediction { get; set; }` | Current prediction (0..65535, probability of next bit being 1). | -| `Type` | `ComponentType Type { get; set; }` | The component type. | - -#### `ComponentType` - -Component type identifiers for the ZPAQL context-mixing prediction model. - -| Value | Numeric | Summary | -| --- | --- | --- | -| `Const` | `0` | Constant prediction (always predicts 50/50). | -| `Cm` | `1` | Context model — 2^n counters indexed by hashed context. | -| `Icm` | `2` | Indirect context model — byte history maps to a counter. | -| `Match` | `3` | Match model — predicts by finding a previous matching context. | -| `Avg` | `4` | Average of two component predictions. | -| `Mix2` | `5` | Two-input adaptive mixer. | -| `Mix` | `6` | N-input adaptive mixer. | -| `Isse` | `7` | Indirect secondary symbol estimation. | -| `Sse` | `8` | Direct secondary symbol estimation. | +[`ZpaqBuildingBlock`](#zpaqbuildingblock) · [`ZpaqEntry`](#zpaqentry) · [`ZpaqFormatDescriptor`](#zpaqformatdescriptor) · [`ZpaqReader`](#zpaqreader) · [`ZpaqWriter`](#zpaqwriter) #### `ZpaqBuildingBlock` -Exposes the ZPAQ context-mixing codec — the compression stage that the ZPAQ journaling archiver wraps — as a benchmarkable building block. Prepends a 4-byte LE uncompressed size header for round-trip support. +ZPAQ compression as a building block: the input coded as a plain ZPAQ stream (locator tag, blocks of one segment, SHA-1 trailers) with zpaq's method 4 — an order-0 ICM, an ISSE chain up to order 6, a match model and a mixer, all described in the block's own ZPAQL header. Implements `IBuildingBlock`. @@ -33228,39 +33196,23 @@ Implements `IBuildingBlock`. | `Compress` | `byte[] Compress(ReadOnlySpan data)` | | | `Decompress` | `byte[] Decompress(ReadOnlySpan data)` | | -#### `ZpaqConstants` - -Constants for the ZPAQ archive format (level 1 journaling). - -| Member | Signature | Summary | -| --- | --- | --- | -| `BlockTypeCompressed` | `const byte BlockTypeCompressed` | Block type byte: compressed data block (contains ZPAQL program + compressed payload). | -| `BlockTypeData` | `const byte BlockTypeData` | Block type byte: data block in a journaling transaction. Each data block holds the (ZPAQL-compressed) payload for one or more files. | -| `BlockTypeHeader` | `const byte BlockTypeHeader` | Block type byte: comment/filename header block in a journaling transaction. In a level-1 journaling archive this block carries the transaction date, filenames and per-file attributes for one transaction. | -| `BlockTypeIndex` | `const byte BlockTypeIndex` | Block type byte: hash/index block that closes a journaling transaction. Contains SHA-1 hashes of the uncompressed file data. | -| `FileTimeSize` | `const int FileTimeSize` | Size of the Windows FILETIME timestamp stored in journaling header blocks (8 bytes). | -| `Level1` | `const byte Level1` | Compression level byte for ZPAQ level 1 archives. | -| `Level2` | `const byte Level2` | Compression level byte for ZPAQ level 2 archives. | -| `MinBlockHeaderSize` | `const int MinBlockHeaderSize` | Minimum number of bytes in a valid block header (3-byte prefix + 1 level byte + 1 type byte = 5 bytes). | -| `WindowsToUnixEpochTicks` | `const long WindowsToUnixEpochTicks` | Windows FILETIME ticks (100-nanosecond intervals) from the Windows epoch (1601-01-01) to the Unix epoch (1970-01-01), used when converting timestamps. | -| `BlockPrefix` | `static ReadOnlySpan BlockPrefix { get; }` | The 3-byte block locator prefix present at the start of every ZPAQ block ("zPQ"). | - #### `ZpaqEntry` -Represents a single file entry recorded in a ZPAQ journaling archive. +A file or directory as recorded in a ZPAQ archive. | Member | Signature | Summary | | --- | --- | --- | -| `CompressedSize` | `long CompressedSize { get; }` | Gets the compressed size of the data block(s) that carry this file's data. This is the total byte count of the raw (still-compressed) data blocks associated with this entry. | -| `FileName` | `string FileName { get; }` | Gets the filename as stored in the archive. Path separators are always forward slashes; directory entries end with '/'. | -| `IsDirectory` | `bool IsDirectory { get; }` | Gets a value indicating whether this entry represents a directory. | -| `LastModified` | `DateTime? LastModified { get; }` | Gets the last-modified timestamp decoded from the journal header, or `null` when the timestamp could not be recovered. | -| `Size` | `long Size { get; }` | Gets the uncompressed size of the file in bytes as reported by the archive. This value is zero for directory entries and for files whose size could not be determined from the journal (e.g. when the header block is compressed). | -| `Version` | `int Version { get; }` | Gets the zero-based transaction index in which this entry was recorded. Each append to a ZPAQ archive constitutes a new transaction; the most recent transaction with a given filename defines the file's current state. | +| `Attributes` | `long Attributes { get; }` | Raw attribute bytes as stored (first byte 'w' = Windows attributes follow, 'u' = Unix mode follows), packed little-endian; 0 when none were stored. | +| `CompressedSize` | `long CompressedSize { get; }` | Compressed size attributed to this entry: the share of the data blocks it references, proportional to its new (non-deduplicated) fragments. Zero for directories. | +| `FileName` | `string FileName { get; }` | Path as stored, with forward slashes; directories end with '/'. | +| `IsDirectory` | `bool IsDirectory { get; }` | Whether this entry is a directory. | +| `LastModified` | `DateTime? LastModified { get; }` | Last-modified time (UTC) from the archive's decimal date, or `null`. | +| `Size` | `long Size { get; }` | Uncompressed size in bytes, or -1 when the archive does not record it (streaming format). | +| `Version` | `int Version { get; }` | 1-based version (transaction) that last wrote this entry. | #### `ZpaqFormatDescriptor` -ZPAQ journaling archive with content-defined deduplication and configurable context-mixing compression. References: `http://mattmahoney.net/dc/zpaq.html` — official ZPAQ page and Level 2 format specification (Matt Mahoney)`https://github.com/zpaq/zpaq` — reference implementation`https://en.wikipedia.org/wiki/ZPAQ` — Wikipedia overview +ZPAQ archive (journaling and streaming layouts) with deduplication and ZPAQL-described context-mixing compression. References: `https://mattmahoney.net/dc/zpaq206.pdf` — ZPAQ Level 2 specification (Matt Mahoney)`https://mattmahoney.net/dc/zpaq.html` — zpaq / libzpaq reference implementation (public domain) Implements `IArchiveCreatable`, `IArchiveDefragmentable`, `IArchiveFormatOperations`, `IArchiveModifiable`, `IArchivePurgeable`, `IFormatDescriptor`. @@ -33268,110 +33220,57 @@ Implements `IArchiveCreatable`, `IArchiveDefragmentable`, `IArchiveFormatOperati | --- | --- | --- | | `ZpaqFormatDescriptor` | `ZpaqFormatDescriptor()` | | | `CanPurgeToEmpty` | `bool CanPurgeToEmpty { get; }` | | -| `Capabilities` | `FormatCapabilities Capabilities { get; }` | Gets the capabilities. | -| `Category` | `FormatCategory Category { get; }` | Gets the category. | -| `CompoundExtensions` | `IReadOnlyList CompoundExtensions { get; }` | Gets the compound extensions. | -| `DefaultExtension` | `string DefaultExtension { get; }` | Gets the default extension. | -| `Description` | `string Description { get; }` | Gets the description. | -| `DisplayName` | `string DisplayName { get; }` | Gets the display name. | -| `Extensions` | `IReadOnlyList Extensions { get; }` | Gets the extensions. | -| `Family` | `AlgorithmFamily Family { get; }` | Gets the family. | -| `Id` | `string Id { get; }` | Gets the id. | -| `MagicSignatures` | `IReadOnlyList MagicSignatures { get; }` | Gets the magic signatures. | -| `Methods` | `IReadOnlyList Methods { get; }` | Gets the methods. | -| `TarCompressionFormatId` | `string TarCompressionFormatId { get; }` | Gets the tar compression format id. | -| `Create` | `void Create(Stream output, IReadOnlyList inputs, FormatCreateOptions options)` | Performs the create operation. | -| `Defragment` | `void Defragment(Stream archive)` | Rebuild-based defrag: extracts then re-creates the ZPAQ archive in listing order. | -| `Defragment` | `void Defragment(Stream archive, DefragOptions options)` | Rebuild-based defrag: extracts then re-creates the ZPAQ archive per the requested mode. | -| `Extract` | `void Extract(Stream stream, string outputDir, string password, string[] files)` | Decodes the supplied input. | -| `List` | `List List(Stream stream, string password)` | Lists the entries in the supplied container. | - -#### `ZpaqRangeCoder` - -Shared constants and the safety argument of the ZPAQ binary range coder. - -| Member | Signature | Summary | -| --- | --- | --- | -| `CarryEdge` | `const uint CarryEdge` | Value at or above which the top byte of `low` may still be bumped by a carry. | -| `FlushBytes` | `const int FlushBytes` | Number of `low` bytes the encoder pushes out when the message ends. | -| `MaximumProbability` | `const int MaximumProbability` | Largest probability of a 1 bit the coder accepts. | -| `MinimumProbability` | `const int MinimumProbability` | Smallest probability of a 1 bit the coder accepts. | -| `ProbabilityBits` | `const int ProbabilityBits` | Number of fractional bits in a probability, so probabilities span 0..2^16. | -| `RangeMinimum` | `const uint RangeMinimum` | Lower bound of the normalised range; the coder renormalises below this. | -| `Split` | `static uint Split(uint range, int probabilityOfOne)` | Computes the split point between the 1 subrange and the 0 subrange. | - -#### `ZpaqRangeDecoder` - -Carry-propagating binary range decoder, the exact mirror of `ZpaqRangeEncoder`. - -| Member | Signature | Summary | -| --- | --- | --- | -| `ZpaqRangeDecoder` | `ZpaqRangeDecoder(byte[] input, int offset)` | Creates a decoder reading from the given buffer, priming its code word from the first `FlushBytes` bytes. | -| `Range` | `uint Range { get; }` | Gets the current range, for tests that assert the coder invariant. | -| `DecodeBit` | `int DecodeBit(int probabilityOfOne)` | Decodes one bit against the given probability. | - -#### `ZpaqRangeEncoder` - -Carry-propagating binary range encoder. See `ZpaqRangeCoder` for the invariant that keeps both subranges non-empty. - -| Member | Signature | Summary | -| --- | --- | --- | -| `ZpaqRangeEncoder` | `ZpaqRangeEncoder(Stream output)` | Creates an encoder writing its bytes to the given stream. | -| `Range` | `uint Range { get; }` | Gets the current range, for tests that assert the coder invariant. | -| `EncodeBit` | `void EncodeBit(int bit, int probabilityOfOne)` | Codes one bit against the given probability. | -| `Flush` | `void Flush()` | Pushes out the remaining bytes of `low`, ending the coded stream. | +| `Capabilities` | `FormatCapabilities Capabilities { get; }` | | +| `Category` | `FormatCategory Category { get; }` | | +| `CompoundExtensions` | `IReadOnlyList CompoundExtensions { get; }` | | +| `DefaultExtension` | `string DefaultExtension { get; }` | | +| `Description` | `string Description { get; }` | | +| `DisplayName` | `string DisplayName { get; }` | | +| `Extensions` | `IReadOnlyList Extensions { get; }` | | +| `Family` | `AlgorithmFamily Family { get; }` | | +| `Id` | `string Id { get; }` | | +| `MagicSignatures` | `IReadOnlyList MagicSignatures { get; }` | | +| `Methods` | `IReadOnlyList Methods { get; }` | | +| `TarCompressionFormatId` | `string TarCompressionFormatId { get; }` | | +| `Create` | `void Create(Stream output, IReadOnlyList inputs, FormatCreateOptions options)` | | +| `Defragment` | `void Defragment(Stream archive)` | Rebuild-based defrag: extracts then re-creates the archive as a single version. | +| `Defragment` | `void Defragment(Stream archive, DefragOptions options)` | Rebuild-based defrag: extracts then re-creates the archive as a single version. | +| `Extract` | `void Extract(Stream stream, string outputDir, string password, string[] files)` | | +| `List` | `List List(Stream stream, string password)` | | #### `ZpaqReader` -Reads the journaling index of a ZPAQ archive, exposing the files recorded across all transactions. +Reads ZPAQ archives in both layouts the format defines: the journaling layout of `zpaq` 6.x/7.x (versioned transactions of `c`/`d`/`h`/`i` blocks with deduplicated, SHA-1 checked fragments) and the plain streaming layout (one file per block or segment run). Implements `IDisposable`. | Member | Signature | Summary | | --- | --- | --- | -| `ZpaqReader` | `ZpaqReader(Stream stream, bool leaveOpen = false)` | Opens a ZPAQ archive stream and scans its journal. | -| `Entries` | `IReadOnlyList Entries { get; }` | Gets the entries discovered by scanning the archive journal. The list reflects the last recorded state of each file across all transactions (i.e. later transactions that mention the same filename supersede earlier ones in the final view). | +| `ZpaqReader` | `ZpaqReader(Stream stream, bool leaveOpen = false)` | Opens a ZPAQ archive and reads its index. | +| `Entries` | `IReadOnlyList Entries { get; }` | Files and directories present in the latest version, ordered by name. | +| `Errors` | `int Errors { get; }` | Number of blocks that failed to decode and were skipped while reading the index. | +| `VersionCount` | `int VersionCount { get; }` | Number of versions (transactions) in the archive. | | `Dispose` | `void Dispose()` | | -| `Extract` | `Stream Extract(ZpaqEntry entry)` | Returns the entry's uncompressed bytes as a stream when the data block was STORED (the layout this toolkit's `ZpaqWriter` emits). | +| `ExtractBytes` | `byte[] ExtractBytes(ZpaqEntry entry)` | Decodes the entry's content, verifying every fragment's (or segment's) SHA-1. | +| `Extract` | `Stream Extract(ZpaqEntry entry)` | Returns the entry's content as a read-only stream. | +| `GetEntries` | `IReadOnlyList GetEntries(int version)` | The archive contents as of version `version` (1-based). | +| `GetVersionDate` | `DateTime? GetVersionDate(int version)` | UTC date of version `version` (1-based), or `null` for a streaming archive. | #### `ZpaqWriter` -Writes a ZPAQ level-1 journaling archive. +Writes a ZPAQ journaling archive holding one version (transaction): the `c` header, the deduplicated and compressed `d` data blocks, their `h` fragment tables and the `i` index, exactly as `zpaq add` lays them out. Implements `IDisposable`. | Member | Signature | Summary | | --- | --- | --- | -| `ZpaqWriter` | `ZpaqWriter(Stream stream, bool leaveOpen = false)` | Initializes a new ZPAQ writer that writes to the specified stream. | -| `AddDirectory` | `void AddDirectory(string dirName, DateTime? lastModified = null)` | Adds a directory entry to the archive. | -| `AddFile` | `void AddFile(string fileName, byte[] data, DateTime? lastModified = null)` | Adds a file entry to the archive with the given name and data. | +| `ZpaqWriter` | `ZpaqWriter(Stream stream, bool leaveOpen = false, string method = "1")` | Creates a writer that emits the archive to `stream` on dispose. | +| `Method` | `string Method { get; }` | The zpaq compression method used for the data blocks. | +| `TransactionDate` | `DateTime? TransactionDate { get; set; }` | Date of the transaction; defaults to the time of disposal. | +| `AddDirectory` | `void AddDirectory(string dirName, DateTime? lastModified = null)` | Adds a directory entry. | +| `AddFile` | `void AddFile(string fileName, byte[] data, DateTime? lastModified = null)` | Adds (or replaces) a file. | | `Dispose` | `void Dispose()` | | -#### `ZpaqlVm` - -ZPAQL virtual machine for ZPAQ compression and decompression. - -| Member | Signature | Summary | -| --- | --- | --- | -| `ZpaqlVm` | `ZpaqlVm(ReadOnlySpan program)` | Parses a ZPAQL program header from a binary span and constructs the VM. | -| `ZpaqlVm` | `ZpaqlVm(byte[] hcomp, byte[] pcomp, int hh, int hm, Component[] components = null)` | Creates a ZPAQL VM with the specified program and component configuration. | -| `A` | `uint A { get; set; }` | Gets or sets register A (32-bit accumulator). | -| `B` | `uint B { get; set; }` | Gets or sets register B (32-bit, also indexes M[]). | -| `C` | `uint C { get; set; }` | Gets or sets register C (32-bit, also indexes M[]). | -| `Components` | `Component[] Components { get; }` | Gets the context-mixing components. | -| `D` | `uint D { get; set; }` | Gets or sets register D (32-bit, also indexes M[]). | -| `F` | `bool F { get; set; }` | Gets or sets the flag register (1-bit). | -| `H` | `uint[] H { get; }` | Gets the H[] context array. H values are set by the HCOMP program and used as context indices for the prediction components. | -| `M` | `byte[] M { get; }` | Gets the M[] byte array used by the HCOMP/PCOMP programs. | -| `OutputByte` | `Action OutputByte { get; set; }` | Event invoked when the PCOMP program executes an OUT instruction. | -| `Predict` | `int Predict()` | Computes a combined prediction from all components. | -| `Reset` | `void Reset()` | Resets the VM state (registers, arrays, components) without changing the program or component configuration. | -| `RunHcomp` | `void RunHcomp(int input)` | Executes the HCOMP program with the given input byte. This should be called after each decoded byte to update the context hashes in H[]. | -| `RunPcomp` | `void RunPcomp(int input)` | Executes the PCOMP (post-processing) program with the given input byte. | -| `Squash` | `static int Squash(int x)` | Squash function: maps a logistic value (-2048..2047) to a probability (0..65535). squash(x) = 65536 / (1 + exp(-x / 64)). | -| `Stretch` | `static int Stretch(int p)` | Stretch function: inverse of squash, maps probability (1..65534) to logistic. | -| `Update` | `void Update(int bit)` | Updates all components after a decoded bit. | - ### Namespace `FileFormat.ZxSnapshot` [`ZxSnapshotFormatDescriptor`](#zxsnapshotformatdescriptor) diff --git a/docs/catalogue/GAPS.md b/docs/catalogue/GAPS.md index 15943701e..ae2126d68 100644 --- a/docs/catalogue/GAPS.md +++ b/docs/catalogue/GAPS.md @@ -178,7 +178,7 @@ running real-world samples. The file named at the end of each row is where the l | UDF | `Udf` | 3 | type-1 partition maps only: no VAT/sparable/metadata partitions (UDF 1.50+ media) (UdfReader.cs) | | VMDK | `Vmdk` | 3 | stream-optimized / compressed grains read raw; split extents and delta chains unsupported (VmdkReader.cs) | | Windows PE | `Mz`, `PeResources` | 3 | archive view of resources/overlay, not a full PE section extractor | -| ZPAQ | `Zpaq` | 3 | reads only the stored blocks our own writer emits; ZPAQL-compressed blocks (every real zpaq level) throw (ZpaqReader.cs) | +| ZPAQ | `Zpaq` | 3 | encrypted (`-key`), multi-part and `-index` archives are refused; modify rewrites a single version instead of appending one (ZpaqReader.cs, ZpaqWriter.cs) | | Btrfs | `Btrfs` | 2 | zlib/lzo/zstd compressed extents are skipped (BtrfsReader.cs) | | Compact Pro | `CompactPro` | 2 | stored and RLE only; LZ+RLE and LZ+Huffman unsupported (CompactProReader.cs) | | DiskDoubler | `DiskDoubler` | 2 | single files only (no DDAR/DDA2 archives); methods 0, 1, 6, 9 decoded and checked against unar on real files; 2-5, 7, 8, 10 and delta refused (DiskDoublerReader.cs) | @@ -216,6 +216,10 @@ running real-world samples. The file named at the end of each row is where the l read an archive written by the real tool. Its round-trip only proves that our writer and reader agree with each other. (`FreeArc` now reads FreeArc 0.67's archives and FreeArc accepts ours; see `docs/FREEARC-ON-DISK.md`.) +- **Capability claims against real files.** `FreeArc` declares `CanCreate | CanModify`, but does + not read an archive written by the real tool. Its round-trip only proves that our writer and + reader agree with each other. (`Zpaq` had the same problem; it now reads zpaq 7.15's archives at + every method and zpaq extracts what it writes, see `ZpaqExternalOracleTests`.) ## ➕ Ours only diff --git a/docs/catalogue/reference-formats.csv b/docs/catalogue/reference-formats.csv index 542752c4f..1343ce676 100644 --- a/docs/catalogue/reference-formats.csv +++ b/docs/catalogue/reference-formats.csv @@ -56,7 +56,7 @@ HA,ha,archive,,,,,,,Y,1,https://en.wikipedia.org/wiki/HA_(file_format),Ha,Y,Y,Y, SQX,sqx,archive,,,,,,,Y,1,https://en.wikipedia.org/wiki/SQX,Sqx,Y,Y,Y,OK,, UHARC,uha,archive,,,,,R,,Y,2,https://en.wikipedia.org/wiki/UHarc,Uharc,Y,Y,Y,PARTIAL,,stored and LZP only (UharcReader.cs) FreeArc,arc;cdx,archive,,,,,R,fmt/1096,Y,3,https://en.wikipedia.org/wiki/FreeArc,FreeArc,Y,Y,Y,PARTIAL,,only storing and lzma blocks decode; tornado/ppmd/lzp/grzip/rep/delta/exe and encryption are refused (FreeArcMethods.cs) -ZPAQ,zpaq,archive,,,,,R,fmt/1097,RW,3,https://mattmahoney.net/dc/zpaq206.pdf,Zpaq,Y,Y,Y,PARTIAL,,reads only the stored blocks our own writer emits; ZPAQL-compressed blocks (every real zpaq level) throw (ZpaqReader.cs) +ZPAQ,zpaq,archive,,,,,R,fmt/1097,RW,3,https://mattmahoney.net/dc/zpaq206.pdf,Zpaq,Y,Y,Y,PARTIAL,,"journaling and streaming archives at every method are read and zpaq 7.15 extracts what we write; encrypted (-key), multi-part and -index archives are refused, and modify rewrites a single version instead of appending one (ZpaqReader.cs, ZpaqWriter.cs)" PAQ (paq6/7/8 family),paq6;paq7;paq8;paq8l,archive,,,,,,,Y,1,https://mattmahoney.net/dc/paq.html,Paq8,Y,Y,,PARTIAL,,a single PAQ8 variant (.paq8l); the other PAQ versions are mutually incompatible KGB Archiver,kgb;kge,archive,,,,,R,,RW,2,,,,,,MISSING,, PEA (PeaZip),pea,archive,,,,,R,fmt/1095,Y,3,,,,,,MISSING,,https://peazip.github.io/pea-file-format.html From d69e70719ef00a7831647186bba01e83a35e78fe Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 26 Oct 2026 12:09:45 +0000 Subject: [PATCH 33/48] * refresh the archive browser screenshot --- docs/screenshots/archive-browser.png | Bin 66518 -> 66882 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/screenshots/archive-browser.png b/docs/screenshots/archive-browser.png index de88d7dd43f38a733fe5557dd0e66b254aa140ee..08c67e5cd90781b9d092817eec18d52fb8b48082 100644 GIT binary patch delta 28761 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 Ief0Fd0Ke-e6#xJL delta 28290 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 Date: Mon, 26 Oct 2026 13:10:21 +0100 Subject: [PATCH 34/48] * regenerate references --- Hawkynt.FileFormats.Archives/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Hawkynt.FileFormats.Archives/README.md b/Hawkynt.FileFormats.Archives/README.md index 8aaf572d9..40375119c 100644 --- a/Hawkynt.FileFormats.Archives/README.md +++ b/Hawkynt.FileFormats.Archives/README.md @@ -544,7 +544,7 @@ Use it when a .NET process needs to enumerate, extract, test, create, edit or in -Every public and protected member of all 2573 types, generated from the built assembly and its XML documentation, is in [REFERENCE.md](https://github.com/Hawkynt/CompressionWorkbench/blob/main/Hawkynt.FileFormats.Archives/REFERENCE.md). +Every public and protected member of all 2566 types, generated from the built assembly and its XML documentation, is in [REFERENCE.md](https://github.com/Hawkynt/CompressionWorkbench/blob/main/Hawkynt.FileFormats.Archives/REFERENCE.md). From 841dc258591e784ac64517bb2c7984574fe6dc33 Mon Sep 17 00:00:00 2001 From: Hawkynt Date: Mon, 26 Oct 2026 13:10:25 +0100 Subject: [PATCH 35/48] + Reiser4 plugin profiles, tails, compressed clusters, links, journal replay, tall-tree defrag + Reiser4 plugin profiles, tails, compressed clusters, links, special files and journal replay Symptom: volumes made with any non-default mkfs.reiser4 -o profile (hash, fibration, formatting, node41, compression) were read but refused for edits; tail, ctail, symlink, device, FIFO, socket, hard-link and sparse objects made the whole tree unreadable; a journal holding a committed but unflushed transaction refused the volume. Every file a Reiser4 kernel writes on a default volume is a cryptcompress (ctail) file, so no kernel-written volume could be read. Root cause: the rebuild wrote the captured default mkfs blocks over the source and keyed every name with r5/ext_1; the reader accepted only stat40/cde40/extent40 and nothing else. Change: the volume is read whole (journal replayed into an overlay first) into an editable plan that carries blocks 16/17/21/22, every stat-data byte, stat and entry keys, and every file body (extents incl. holes, plain40 tails, ctail disk clusters) as found. New names are keyed with the directory's inherited hash (r5, tea, fnv1, deg) and fibration (lexic, dot_o, ext_1, ext_3); new long names under the Rupasov hash are refused because the kernel and reiser4progs compute it differently. node41 nodes are verified and sealed with their CRC-32C. Cryptcompress clusters are decoded and encoded with our own LZO1X, raw deflate and Zstandard plus the trailing Adler-32. Symlinks, device nodes, FIFOs, sockets and hard links are read and written. New regular files are extents by default; FileBody selects tails, smart, compressed or the volume's profile. Edits are staged, read back and verified before the source is replaced. Oracles: fsck.reiser4/debugfs.reiser4 (reiser4progs 1.2.2) consistent on every -o profile under every body type; a Reiser4 kernel (Linux 5.4.18 + SFRN 4.0.2 under QEMU) reads back every writer and edited volume byte for byte, and wrote the reference volumes the reader matches. Sourcing: rung 2. reiser4progs and the kernel module are GPL; their sources were read only to write docs/REISER4-NATIVE-PROFILE.md. Constants (TEA key and delta, FNV basis and prime, degenerate hash, node41 magic, journal magics) copied exactly. * Reiser4 in-place defragmentation works on trees of any height Symptom: defrag moved blocks in place only on a two-node tree; any taller tree (and every kernel volume) fell back to a full rebuild. Root cause: the mover searched only blocks 23 and 24 for extent items, took object ids from the legacy payload chain, and never updated the allocator bitmap. Change: every extent unit (twig block and field) is tracked from the tree walk; a moved unit is repointed in its twig, node41 checksums re-sealed, and the allocator bits moved (cleared where the unit left, set where it landed). A pending journal or extents past EOF are refused and the caller rebuilds. Oracles: fsck.reiser4 consistent after scattering and after defragmenting a tall tree in place; the Reiser4 kernel reads every file back; no tree node moved. Sourcing: rung 2. + Reiser4 kernel reference volumes, kernel oracle and profile gate tests Thirteen volumes a Reiser4 kernel wrote under mkfs.reiser4 profiles (lzo1/gzip1/zstd1 clusters at 4-64K, none mode, tails, smart, node41, tea/fnv1/deg/rupasov hashes, every fibration, a pending journal) with the kernel's read-back manifests: the reader must match them entry for entry and carry every object across edits. Reiser4FeatureExternalTests, added to the CI "Reiser4 oracle" gate, edit every -o profile under every body type and have fsck.reiser4/debugfs.reiser4 judge the result. Reiser4KernelOracleTests let the kernel mount and read back writer and edited volumes; they skip unless the kernel is prepared (CWB_REISER4_KERNEL_DOWNLOAD=1). The former "another profile is refused" tests now assert the profile is carried. * FileSystems API reference: Reiser4 FileBody, EntryKind, link and special-file members --- .github/workflows/ci.yml | 2 +- Compression.Tests/Compression.Tests.csproj | 7 + .../Reiser4/KernelOracle/.gitattributes | 2 + .../Reiser4/KernelOracle/kernel-run.sh | 68 ++ .../Reiser4/KernelOracle/manifest.sh | 14 + .../Reiser4/ReferenceVectors/.gitattributes | 5 + .../Reiser4/ReferenceVectors/README.md | 41 ++ .../Reiser4/ReferenceVectors/default.img.gz | Bin 0 -> 57429 bytes .../Reiser4/ReferenceVectors/default.manifest | 325 +++++++++ .../Reiser4/ReferenceVectors/deg-ext-3.img.gz | Bin 0 -> 61285 bytes .../ReferenceVectors/deg-ext-3.manifest | 327 +++++++++ .../ReferenceVectors/fnv1-dot-o.img.gz | Bin 0 -> 61393 bytes .../ReferenceVectors/fnv1-dot-o.manifest | 327 +++++++++ .../Reiser4/ReferenceVectors/generate.sh | 81 +++ .../ReferenceVectors/gzip1-force-8k.img.gz | Bin 0 -> 54570 bytes .../ReferenceVectors/gzip1-force-8k.manifest | 326 +++++++++ .../ReferenceVectors/journal-replay.img.gz | Bin 0 -> 63293 bytes .../ReferenceVectors/journal-replay.manifest | 22 + .../ReferenceVectors/lzo1-none-4k.img.gz | Bin 0 -> 57060 bytes .../ReferenceVectors/lzo1-none-4k.manifest | 327 +++++++++ .../Reiser4/ReferenceVectors/node41.img.gz | Bin 0 -> 57506 bytes .../Reiser4/ReferenceVectors/node41.manifest | 325 +++++++++ .../Reiser4/ReferenceVectors/populate.sh | 41 ++ .../ReferenceVectors/reg40-node41.img.gz | Bin 0 -> 60034 bytes .../ReferenceVectors/reg40-node41.manifest | 327 +++++++++ .../ReferenceVectors/reg40-smart.img.gz | Bin 0 -> 61329 bytes .../ReferenceVectors/reg40-smart.manifest | 327 +++++++++ .../ReferenceVectors/reg40-tails.img.gz | Bin 0 -> 62643 bytes .../ReferenceVectors/reg40-tails.manifest | 327 +++++++++ .../Reiser4/ReferenceVectors/rupasov.img.gz | Bin 0 -> 61371 bytes .../Reiser4/ReferenceVectors/rupasov.manifest | 327 +++++++++ .../Reiser4/ReferenceVectors/tea-lexic.img.gz | Bin 0 -> 61480 bytes .../ReferenceVectors/tea-lexic.manifest | 327 +++++++++ .../ReferenceVectors/zstd1-latt-16k.img.gz | Bin 0 -> 52628 bytes .../ReferenceVectors/zstd1-latt-16k.manifest | 327 +++++++++ .../Reiser4/Reiser4FeatureExternalTests.cs | 174 +++++ .../Reiser4/Reiser4KernelOracle.cs | 58 ++ .../Reiser4/Reiser4KernelOracleTests.cs | 197 ++++++ .../Reiser4/Reiser4KernelVolumeTests.cs | 185 +++++ .../Reiser4/Reiser4NativeTreeTests.cs | 33 +- .../Reiser4/Reiser4ProfileExternalTests.cs | 16 - .../Reiser4/Reiser4TestLayouts.cs | 47 ++ .../FileSystem.Reiser4/Reiser4BlockMover.cs | 403 +++-------- .../FileSystem.Reiser4/Reiser4Clusters.cs | 79 +++ .../Reiser4FormatDescriptor.cs | 606 +++++++---------- .../FileSystem.Reiser4/Reiser4Journal.cs | 94 +++ .../FileSystem.Reiser4/Reiser4Keys.cs | 214 ++++++ .../FileSystem.Reiser4/Reiser4Plan.cs | 481 +++++++++++++ .../FileSystem.Reiser4/Reiser4Reader.cs | 482 +++++-------- .../FileSystem.Reiser4/Reiser4Tree.cs | 631 +++++++----------- .../FileSystem.Reiser4/Reiser4Volume.cs | 625 +++++++++++++++++ .../FileSystem.Reiser4/Reiser4Writer.cs | 454 +++---------- Hawkynt.FileFormats.FileSystems/README.md | 4 +- Hawkynt.FileFormats.FileSystems/REFERENCE.md | 126 ++-- docs/REISER4-NATIVE-PROFILE.md | 295 ++++---- 55 files changed, 7479 insertions(+), 1927 deletions(-) create mode 100644 Compression.Tests/Reiser4/KernelOracle/.gitattributes create mode 100644 Compression.Tests/Reiser4/KernelOracle/kernel-run.sh create mode 100644 Compression.Tests/Reiser4/KernelOracle/manifest.sh create mode 100644 Compression.Tests/Reiser4/ReferenceVectors/.gitattributes create mode 100644 Compression.Tests/Reiser4/ReferenceVectors/README.md create mode 100644 Compression.Tests/Reiser4/ReferenceVectors/default.img.gz create mode 100644 Compression.Tests/Reiser4/ReferenceVectors/default.manifest create mode 100644 Compression.Tests/Reiser4/ReferenceVectors/deg-ext-3.img.gz create mode 100644 Compression.Tests/Reiser4/ReferenceVectors/deg-ext-3.manifest create mode 100644 Compression.Tests/Reiser4/ReferenceVectors/fnv1-dot-o.img.gz create mode 100644 Compression.Tests/Reiser4/ReferenceVectors/fnv1-dot-o.manifest create mode 100644 Compression.Tests/Reiser4/ReferenceVectors/generate.sh create mode 100644 Compression.Tests/Reiser4/ReferenceVectors/gzip1-force-8k.img.gz create mode 100644 Compression.Tests/Reiser4/ReferenceVectors/gzip1-force-8k.manifest create mode 100644 Compression.Tests/Reiser4/ReferenceVectors/journal-replay.img.gz create mode 100644 Compression.Tests/Reiser4/ReferenceVectors/journal-replay.manifest create mode 100644 Compression.Tests/Reiser4/ReferenceVectors/lzo1-none-4k.img.gz create mode 100644 Compression.Tests/Reiser4/ReferenceVectors/lzo1-none-4k.manifest create mode 100644 Compression.Tests/Reiser4/ReferenceVectors/node41.img.gz create mode 100644 Compression.Tests/Reiser4/ReferenceVectors/node41.manifest create mode 100644 Compression.Tests/Reiser4/ReferenceVectors/populate.sh create mode 100644 Compression.Tests/Reiser4/ReferenceVectors/reg40-node41.img.gz create mode 100644 Compression.Tests/Reiser4/ReferenceVectors/reg40-node41.manifest create mode 100644 Compression.Tests/Reiser4/ReferenceVectors/reg40-smart.img.gz create mode 100644 Compression.Tests/Reiser4/ReferenceVectors/reg40-smart.manifest create mode 100644 Compression.Tests/Reiser4/ReferenceVectors/reg40-tails.img.gz create mode 100644 Compression.Tests/Reiser4/ReferenceVectors/reg40-tails.manifest create mode 100644 Compression.Tests/Reiser4/ReferenceVectors/rupasov.img.gz create mode 100644 Compression.Tests/Reiser4/ReferenceVectors/rupasov.manifest create mode 100644 Compression.Tests/Reiser4/ReferenceVectors/tea-lexic.img.gz create mode 100644 Compression.Tests/Reiser4/ReferenceVectors/tea-lexic.manifest create mode 100644 Compression.Tests/Reiser4/ReferenceVectors/zstd1-latt-16k.img.gz create mode 100644 Compression.Tests/Reiser4/ReferenceVectors/zstd1-latt-16k.manifest create mode 100644 Compression.Tests/Reiser4/Reiser4FeatureExternalTests.cs create mode 100644 Compression.Tests/Reiser4/Reiser4KernelOracle.cs create mode 100644 Compression.Tests/Reiser4/Reiser4KernelOracleTests.cs create mode 100644 Compression.Tests/Reiser4/Reiser4KernelVolumeTests.cs create mode 100644 Compression.Tests/Reiser4/Reiser4TestLayouts.cs create mode 100644 Hawkynt.FileFormats.FileSystems/FileSystems/FileSystem.Reiser4/Reiser4Clusters.cs create mode 100644 Hawkynt.FileFormats.FileSystems/FileSystems/FileSystem.Reiser4/Reiser4Journal.cs create mode 100644 Hawkynt.FileFormats.FileSystems/FileSystems/FileSystem.Reiser4/Reiser4Keys.cs create mode 100644 Hawkynt.FileFormats.FileSystems/FileSystems/FileSystem.Reiser4/Reiser4Plan.cs create mode 100644 Hawkynt.FileFormats.FileSystems/FileSystems/FileSystem.Reiser4/Reiser4Volume.cs diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 584f1db49..fcc6fbd47 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -235,7 +235,7 @@ jobs: run: > dotnet test Compression.Tests --configuration Release --no-build - --filter "FullyQualifiedName~Compression.Tests.Reiser4.Reiser4ProfileExternalTests|FullyQualifiedName~Compression.Tests.Reiser4.Reiser4MutationExternalTests|FullyQualifiedName~Compression.Tests.Reiser4.Reiser4NativeTreeExternalTests" + --filter "FullyQualifiedName~Compression.Tests.Reiser4.Reiser4ProfileExternalTests|FullyQualifiedName~Compression.Tests.Reiser4.Reiser4MutationExternalTests|FullyQualifiedName~Compression.Tests.Reiser4.Reiser4NativeTreeExternalTests|FullyQualifiedName~Compression.Tests.Reiser4.Reiser4FeatureExternalTests" --logger "trx;LogFileName=reiser4-oracle-tests.trx" # Hard gate, both directions: zpaq must list and extract byte for byte what the ZPAQ writer diff --git a/Compression.Tests/Compression.Tests.csproj b/Compression.Tests/Compression.Tests.csproj index 12ff7c484..68aef7dac 100644 --- a/Compression.Tests/Compression.Tests.csproj +++ b/Compression.Tests/Compression.Tests.csproj @@ -67,6 +67,13 @@ Exclude="StructuredPseudoArchives\ReferenceVectors\*.py;StructuredPseudoArchives\ReferenceVectors\*.pl;StructuredPseudoArchives\ReferenceVectors\*.ps1;StructuredPseudoArchives\ReferenceVectors\README.md"> ReferenceVectors.%(Filename)%(Extension) + + + Reiser4Vectors.%(Filename)%(Extension) + + + BcacheFsVectors.%(Filename)%(Extension) diff --git a/Compression.Tests/Reiser4/KernelOracle/.gitattributes b/Compression.Tests/Reiser4/KernelOracle/.gitattributes new file mode 100644 index 000000000..3b14496fb --- /dev/null +++ b/Compression.Tests/Reiser4/KernelOracle/.gitattributes @@ -0,0 +1,2 @@ +# Run by bash under Linux or WSL. +*.sh text eol=lf diff --git a/Compression.Tests/Reiser4/KernelOracle/kernel-run.sh b/Compression.Tests/Reiser4/KernelOracle/kernel-run.sh new file mode 100644 index 000000000..cd4d5eb1f --- /dev/null +++ b/Compression.Tests/Reiser4/KernelOracle/kernel-run.sh @@ -0,0 +1,68 @@ +#!/bin/bash +# Boots a Reiser4-enabled Linux kernel under QEMU with an image as /dev/vda and runs a shell +# script inside it; the script's output is printed between ===GUEST-BEGIN=== and ===GUEST-END===. +# +# kernel-run.sh [payload-dir] +# +# The kernel is Metztli's Debian build of Linux 5.4.18 with the Reiser4 (SFRN 4.0.2) patch +# (linux-image-5.4.0-3+reizer4.0.2-cloud-amd64). It is fetched once into $CWB_REISER4_KERNEL +# (default ~/.cache/cwb/reiser4-kernel) together with Ubuntu's busybox-static for the initramfs. +# Nothing here is a build input: the tests that use it skip when it cannot run. +set -e +K=${CWB_REISER4_KERNEL:-$HOME/.cache/cwb/reiser4-kernel} +KV=5.4.0-3+reizer4.0.2-cloud-amd64 +DEB_URL='https://sourceforge.net/projects/metztli-reiser4/files/RyzenEpyc_Reiser4-SFRN-4.0.2_Linux-5.4.18-1_for-Debian_Buster/linux-image-5.4.0-3%2Breizer4.0.2-cloud-amd64_5.4.18-1%2Breizer4.0.2_amd64.deb/download' + +if [ "$1" = "--check" ]; then + [ -f "$K/x/boot/vmlinuz-$KV" ] && [ -x "$K/bb/usr/bin/busybox" ] && command -v qemu-system-x86_64 >/dev/null + exit $? +fi +if [ "$1" = "--prepare" ]; then + mkdir -p "$K" + if [ ! -f "$K/x/boot/vmlinuz-$KV" ]; then + curl -sfL -A "Wget/1.21" -o "$K/kernel.deb" "$DEB_URL" + mkdir -p "$K/x" && dpkg-deb -x "$K/kernel.deb" "$K/x" + fi + if [ ! -x "$K/bb/usr/bin/busybox" ]; then + (cd "$K" && apt-get download busybox-static >/dev/null 2>&1 && mkdir -p bb && dpkg-deb -x busybox-static*.deb bb) + fi + [ -f "$K/x/boot/vmlinuz-$KV" ] && [ -x "$K/bb/usr/bin/busybox" ] && command -v qemu-system-x86_64 >/dev/null + exit $? +fi + +M=$K/x/lib/modules/$KV/kernel +R=$(mktemp -d) +trap 'rm -rf "$R" "$R.cpio.gz" "$R.log"' EXIT +mkdir -p "$R/bin" "$R/mods" "$R/dev" "$R/proc" "$R/sys" "$R/mnt" "$R/payload" +cp "$K/bb/usr/bin/busybox" "$R/bin/" +for a in $("$K/bb/usr/bin/busybox" --list); do [ "$a" = busybox ] || ln -s busybox "$R/bin/$a"; done +for m in drivers/virtio/virtio.ko drivers/virtio/virtio_ring.ko drivers/virtio/virtio_pci.ko drivers/block/virtio_blk.ko \ + lib/xxhash.ko lib/zstd/zstd_compress.ko lib/zstd/zstd_decompress.ko crypto/crc32c_generic.ko fs/reiser4/reiser4.ko; do + cp "$M/$m" "$R/mods/" +done +cp "$2" "$R/run.sh" +[ -n "$3" ] && cp -a "$3"/. "$R/payload/" +cat > "$R/init" <<'EOF' +#!/bin/busybox sh +export PATH=/bin +mount -t proc proc /proc; mount -t sysfs sys /sys; mount -t devtmpfs dev /dev +echo "===GUEST-BEGIN===" +for m in virtio virtio_ring virtio_pci virtio_blk xxhash zstd_compress zstd_decompress crc32c_generic reiser4; do + insmod /mods/$m.ko || echo "insmod $m failed" +done +sleep 0.3 +sh /run.sh 2>&1 +echo "===GUEST-END rc=$?===" +dmesg | grep -i -E "reiser4|bug|oops" | grep -v "loading out-of-tree" | sed 's/^/dmesg: /' +sync +poweroff -f +EOF +chmod +x "$R/init" +(cd "$R" && find . | cpio -o -H newc 2>/dev/null | gzip -1) > "$R.cpio.gz" +ACC=-enable-kvm; [ -w /dev/kvm ] || ACC="-accel tcg" +timeout ${CWB_REISER4_KERNEL_TIMEOUT:-900} qemu-system-x86_64 $ACC -m 1024 -nographic -no-reboot \ + -kernel "$K/x/boot/vmlinuz-$KV" -initrd "$R.cpio.gz" \ + -append "console=ttyS0 quiet panic=-1" \ + -drive file="$1",format=raw,if=virtio,cache=unsafe 2>&1 | tr -d '\r' > "$R.log" || true +sed -n '/===GUEST-BEGIN===/,$p' "$R.log" | grep -v '^\s*$' +grep -q '===GUEST-END' "$R.log" diff --git a/Compression.Tests/Reiser4/KernelOracle/manifest.sh b/Compression.Tests/Reiser4/KernelOracle/manifest.sh new file mode 100644 index 000000000..497b08a89 --- /dev/null +++ b/Compression.Tests/Reiser4/KernelOracle/manifest.sh @@ -0,0 +1,14 @@ +# Guest script: mounts /dev/vda and prints one line per object the kernel resolves, reading every +# regular file whole: path|type|mode|uid|gid|size|nlink|mtime|major:minor|md5-or-link-target +mount -t reiser4 /dev/vda /mnt || { echo MOUNTFAIL; exit 1; } +cd /mnt +echo "===MANIFEST===" +find . | sort | while read p; do + t=$(stat -c '%F|%a|%u|%g|%s|%h|%Y|%t:%T' "$p") + if [ -L "$p" ]; then echo "$p|$t|$(readlink "$p")" + elif [ -f "$p" ]; then echo "$p|$t|$(md5sum < "$p" | cut -d' ' -f1)" + else echo "$p|$t|"; fi +done +echo "===END-MANIFEST===" +cd / +umount /mnt || echo UMOUNTFAIL diff --git a/Compression.Tests/Reiser4/ReferenceVectors/.gitattributes b/Compression.Tests/Reiser4/ReferenceVectors/.gitattributes new file mode 100644 index 000000000..95db9d93d --- /dev/null +++ b/Compression.Tests/Reiser4/ReferenceVectors/.gitattributes @@ -0,0 +1,5 @@ +# Volumes a Reiser4 kernel wrote, gzip-compressed: the bytes are the fixture. +*.gz -text +# Manifests and scripts are read by Linux tools and compared byte for byte. +*.manifest text eol=lf +*.sh text eol=lf diff --git a/Compression.Tests/Reiser4/ReferenceVectors/README.md b/Compression.Tests/Reiser4/ReferenceVectors/README.md new file mode 100644 index 000000000..c275cf8a1 --- /dev/null +++ b/Compression.Tests/Reiser4/ReferenceVectors/README.md @@ -0,0 +1,41 @@ +# Reiser4 reference volumes + +Volumes a Reiser4 kernel wrote, checked in so the reader and editor tests run without Linux tools. +`generate.sh` documents how they were made; it is not a build input. + +Each volume was formatted by `mkfs.reiser4 -fffy` (reiser4progs 1.2.2, 16 MiB, UUID +`11111111-2222-3333-4444-555555555555`) with the plugin options below, then filled by `populate.sh` +inside the kernel — Metztli's Debian build of Linux 5.4.18 with the Reiser4 SFRN 4.0.2 patch +(`linux-image-5.4.0-3+reizer4.0.2-cloud-amd64`), booted under QEMU by +`../KernelOracle/kernel-run.sh`. The tree holds files of 0 to 200 705 bytes (random, and a 69 559-byte text that spans two 64 KiB clusters), nested +and empty directories, names of 35, 46 and 255 bytes, names ending in `.c`, `.o` and `.abc`, +a short and a 423-byte symlink, a file with three names, a FIFO, character device 1:3, block device +7:0, a file with a hole, a 300-entry directory, an owner of 1234:5678 with mode 0751, and a +modification time in 2001. + +| File | mkfs.reiser4 options | What it exercises | +|------|------------------|-------------------| +| `default` | — | cryptcompress files (lzo1, conv mode, 64 KiB clusters), the kernel turning incompressible ones into extents | +| `gzip1-force-8k` | `compress=gzip1,compressMode=force,cluster=8K` | raw-deflate clusters with their Adler-32 | +| `zstd1-latt-16k` | `compress=zstd1,compressMode=latt,cluster=16K` | Zstandard clusters | +| `lzo1-none-4k` | `compressMode=none,cluster=4K` | uncompressed clusters | +| `reg40-smart` | `create=reg40` | tails up to four blocks, extents above | +| `reg40-tails` | `create=reg40,formatting=tails` | tails only | +| `reg40-node41` | `create=reg40,formatting=extents,node=node41` | checksummed nodes, extents only | +| `node41` | `node=node41` | checksummed nodes with cryptcompress files | +| `tea-lexic` | `create=reg40,hash=tea_hash,fibration=lexic_fibre` | TEA-hashed long names, no fibres | +| `fnv1-dot-o` | `create=reg40,hash=fnv1_hash,fibration=dot_o_fibre` | FNV-1 long names, `.o` fibre | +| `deg-ext-3` | `create=reg40,hash=deg_hash,fibration=ext_3_fibre` | degenerate hash, three-letter extension fibres | +| `rupasov` | `create=reg40,hash=rupasov_hash` | read only: `fsck.reiser4` disagrees with the kernel's Rupasov keys | +| `journal-replay` | `create=reg40` | a commit the kernel had not yet written back: block 19 names transaction 181, block 20 transaction 130 | + +`.manifest` is what the kernel read back after unmounting and mounting again: one line per +object, `path|type|mode|uid|gid|size|nlink|mtime|major:minor|md5-or-link-target`, every regular file +read whole. For `journal-replay` the kernel replayed the journal at mount, so the manifest is the +post-replay state. `default` and `node41` list two fewer `many/` files than the others and +`gzip1-force-8k` one fewer: the kernel itself did not keep them, and the reader agrees with what it +did keep. + +Every volume except `rupasov` passed `fsck.reiser4 --check` (`journal-replay` after the replay that +check performs). Captured 2026-10-19 on Ubuntu 24.04 under WSL2 (the WSL kernel has no Reiser4 +driver; the QEMU guest is the only writer). Compressed with `gzip -9 -n`. diff --git a/Compression.Tests/Reiser4/ReferenceVectors/default.img.gz b/Compression.Tests/Reiser4/ReferenceVectors/default.img.gz new file mode 100644 index 0000000000000000000000000000000000000000..4b89e035818886e5d671d594cee4e69978ad9d55 GIT binary patch literal 57429 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∨oIt1VnG^- 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 y0R;gC0R;gC0R;gCf&bqLjA@6^2a&= literal 0 HcmV?d00001 diff --git a/Compression.Tests/Reiser4/ReferenceVectors/fnv1-dot-o.manifest b/Compression.Tests/Reiser4/ReferenceVectors/fnv1-dot-o.manifest new file mode 100644 index 000000000..70f10dcfe --- /dev/null +++ b/Compression.Tests/Reiser4/ReferenceVectors/fnv1-dot-o.manifest @@ -0,0 +1,327 @@ +.|directory|755|1000|1000|19|6|1792402821|0:0| +./blockdev|block special file|644|0|0|0|1|1792402821|7:0| +./chardev|character special file|644|0|0|0|1|1792402821|1:3| +./dir|directory|755|0|0|9|3|1792402821|0:0| +./dir/LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL|regular file|644|0|0|1|1|1792402821|0:0|26fc1f29bd4599f5f29200b6ca083531 +./dir/a-name-longer-than-twenty-three-characters.txt|regular file|644|0|0|1|1|1792402821|0:0|26fc1f29bd4599f5f29200b6ca083531 +./dir/another-long-name-for-the-hash.abc|regular file|644|0|0|100|1|1792402821|0:0|8d46298c51d128bb5dbeff0c63629e62 +./dir/foo.o|regular file|644|0|0|4097|1|1792402821|0:0|222c3621eaa94ed7f006cf65f8ff9dfc +./dir/hard_100_b|regular file|751|1234|5678|100|3|1792402821|0:0|8d46298c51d128bb5dbeff0c63629e62 +./dir/sub|directory|755|0|0|3|3|1792402821|0:0| +./dir/sub/deeper|directory|755|0|0|3|2|1792402821|0:0| +./dir/sub/deeper/text.c|regular file|644|0|0|4097|1|1792402821|0:0|222c3621eaa94ed7f006cf65f8ff9dfc +./dir/x.abc|regular file|644|0|0|100|1|1792402821|0:0|8d46298c51d128bb5dbeff0c63629e62 +./emptydir|directory|755|0|0|2|2|1792402821|0:0| +./f_0|regular empty file|644|0|0|0|1|1792402821|0:0|d41d8cd98f00b204e9800998ecf8427e +./f_1|regular file|644|0|0|1|1|981173106|0:0|26fc1f29bd4599f5f29200b6ca083531 +./f_100|regular file|751|1234|5678|100|3|1792402821|0:0|8d46298c51d128bb5dbeff0c63629e62 +./f_4095|regular file|644|0|0|4095|1|1792402821|0:0|b0fbbf3c1d774e4cde9bbb6c2333240a +./f_4096|regular file|644|0|0|4096|1|1792402821|0:0|5943c3a697c0247e3660cbef410f7b9b +./f_4097|regular file|644|0|0|4097|1|1792402821|0:0|222c3621eaa94ed7f006cf65f8ff9dfc +./f_text|regular file|644|0|0|69559|1|1792402821|0:0|68427bef950fdea83e3a40b7752b5085 +./fifo|fifo|644|0|0|0|1|1792402821|0:0| +./hard_100|regular file|751|1234|5678|100|3|1792402821|0:0|8d46298c51d128bb5dbeff0c63629e62 +./many|directory|755|0|0|302|2|1792402821|0:0| +./many/m0|regular file|644|0|0|7|1|1792402821|0:0|30fce81b7f0df29fa90445437e29cbc6 +./many/m1|regular file|644|0|0|7|1|1792402821|0:0|e243bb39c844b3543a7726576c869caf +./many/m10|regular file|644|0|0|8|1|1792402821|0:0|a9e3737bb4cf960ff521c4ad4c8275e7 +./many/m100|regular file|644|0|0|9|1|1792402821|0:0|5e9c8bfc28eb97f4c9ec7dbcfa349590 +./many/m101|regular file|644|0|0|9|1|1792402821|0:0|71e4a6c5d8d9a5530d2fb44286bc0a5c +./many/m102|regular file|644|0|0|9|1|1792402821|0:0|451d81b0d1eba9a066a7970d5bd101bf +./many/m103|regular file|644|0|0|9|1|1792402821|0:0|9b6843356c23c0b1f2ef92c24e2c6618 +./many/m104|regular file|644|0|0|9|1|1792402821|0:0|5d83284f904341bd007a1d2c9170425e +./many/m105|regular file|644|0|0|9|1|1792402821|0:0|d7b4a549841ef1b3683005470ea5c6a6 +./many/m106|regular file|644|0|0|9|1|1792402821|0:0|053dae9a00020b83119809092b5d32cc +./many/m107|regular file|644|0|0|9|1|1792402821|0:0|4cad0e71996eee272cbfd0d69eba2f9c +./many/m108|regular file|644|0|0|9|1|1792402821|0:0|1916f4af4dd7f94f6f29937326c783bf +./many/m109|regular file|644|0|0|9|1|1792402821|0:0|b06ed943b4aed4a9cc92dc43828c59c9 +./many/m11|regular file|644|0|0|8|1|1792402821|0:0|715081268e5e053a7e89daf6c155244a +./many/m110|regular file|644|0|0|9|1|1792402821|0:0|6fbb8a796ad4ab374ad8522ad72ab38c +./many/m111|regular file|644|0|0|9|1|1792402821|0:0|f1e91a40908b17a9d7292ae446d74331 +./many/m112|regular file|644|0|0|9|1|1792402821|0:0|b039c00491cae1372e1bd2bcb95546c9 +./many/m113|regular file|644|0|0|9|1|1792402821|0:0|035fbc5dbfad05e88e7a97037f1d420a +./many/m114|regular file|644|0|0|9|1|1792402821|0:0|9548ca423f57477900489d56f9943c90 +./many/m115|regular file|644|0|0|9|1|1792402821|0:0|714c9cc478f4ac62c71f684282b3ca9e +./many/m116|regular file|644|0|0|9|1|1792402821|0:0|0c6969c4a5a366e879dd48fdbd5d8d8b +./many/m117|regular file|644|0|0|9|1|1792402821|0:0|c6af06da6b1d613c71d9c9b99294b785 +./many/m118|regular file|644|0|0|9|1|1792402821|0:0|cfbfb40f78231026fa8ffa95f210a3f9 +./many/m119|regular file|644|0|0|9|1|1792402821|0:0|bde7fad10ad91d97f69d7261162674ea +./many/m12|regular file|644|0|0|8|1|1792402821|0:0|1d47b3894c01ea376c576c6cde23c0c3 +./many/m120|regular file|644|0|0|9|1|1792402821|0:0|e3e9d5d360d6b50fc892515632834559 +./many/m121|regular file|644|0|0|9|1|1792402821|0:0|7a9282c2bdfb357dde622d9dcf5d39f8 +./many/m122|regular file|644|0|0|9|1|1792402821|0:0|6bc6a7988fa8f5b28e357044d377eda3 +./many/m123|regular file|644|0|0|9|1|1792402821|0:0|bbc27f45c7863cc62401f4e05ac34cb4 +./many/m124|regular file|644|0|0|9|1|1792402821|0:0|fe6e4959710835d696e00f28212b9884 +./many/m125|regular file|644|0|0|9|1|1792402821|0:0|dd47bd03b176555bc88236c2281f2f52 +./many/m126|regular file|644|0|0|9|1|1792402821|0:0|4fe80d7bb49d5d7009381a8081cac2b6 +./many/m127|regular file|644|0|0|9|1|1792402821|0:0|97ddfd66e065afa494720ae19db3d8f3 +./many/m128|regular file|644|0|0|9|1|1792402821|0:0|60db69f168ed4f56f323c2a4cfe97c95 +./many/m129|regular file|644|0|0|9|1|1792402821|0:0|02055e8d488a51e14354b3353692da3f +./many/m13|regular file|644|0|0|8|1|1792402821|0:0|8ef8a460853cecc9747ea9c75a54e6c5 +./many/m130|regular file|644|0|0|9|1|1792402821|0:0|21f762bfe54a273420bf0cc9e27beefb +./many/m131|regular file|644|0|0|9|1|1792402821|0:0|3a555eb9830986c73a016025bf7de464 +./many/m132|regular file|644|0|0|9|1|1792402821|0:0|b536d95e908d91ff249c46a2ce26ce7a +./many/m133|regular file|644|0|0|9|1|1792402821|0:0|37e65aa7f216c0917982b33bbbdce9c9 +./many/m134|regular file|644|0|0|9|1|1792402821|0:0|0dfb06b520ba85e9850857de67cc537f +./many/m135|regular file|644|0|0|9|1|1792402821|0:0|4627968ca8beb47883ea2c0af327e865 +./many/m136|regular file|644|0|0|9|1|1792402821|0:0|7cac2f99ad683c23ef35998433bf5e85 +./many/m137|regular file|644|0|0|9|1|1792402821|0:0|f554e9025f214483fdbcec75220b6e47 +./many/m138|regular file|644|0|0|9|1|1792402821|0:0|4de17de2d651b1c4d67d78edf24ffeaf +./many/m139|regular file|644|0|0|9|1|1792402821|0:0|538d3563e5587014100a844aa72c2e3d +./many/m14|regular file|644|0|0|8|1|1792402821|0:0|f662b840ccbea565898682c8f8dcd97a +./many/m140|regular file|644|0|0|9|1|1792402821|0:0|f01f8b6994e8d3290788bf1ad0a3a060 +./many/m141|regular file|644|0|0|9|1|1792402821|0:0|a93d155018fb504d41a4036942c49bd5 +./many/m142|regular file|644|0|0|9|1|1792402821|0:0|f6c5c015993cf74c785b5c0980e71490 +./many/m143|regular file|644|0|0|9|1|1792402821|0:0|61a3937b7d06718a25a1e99b7ea60285 +./many/m144|regular file|644|0|0|9|1|1792402821|0:0|57adad91c24dca84d939caa4c101766b +./many/m145|regular file|644|0|0|9|1|1792402821|0:0|94f45887532f52fe9332cdac28d99ab3 +./many/m146|regular file|644|0|0|9|1|1792402821|0:0|1e883271c9b323bf0c793c397fd4c2cd +./many/m147|regular file|644|0|0|9|1|1792402821|0:0|37829b2976e152e803a8bcc5cd9c2717 +./many/m148|regular file|644|0|0|9|1|1792402821|0:0|52057b6b97d5fb47f6171b873edb2bff +./many/m149|regular file|644|0|0|9|1|1792402821|0:0|f0a3a9c68023185a4fdccb58970da254 +./many/m15|regular file|644|0|0|8|1|1792402821|0:0|c1575e41dabea5854e1500d523916f6a +./many/m150|regular file|644|0|0|9|1|1792402821|0:0|792c7a51d685072801853560c8b4efd3 +./many/m151|regular file|644|0|0|9|1|1792402821|0:0|dffbd6ebe410ebb2b514d90a0a7f0aa9 +./many/m152|regular file|644|0|0|9|1|1792402821|0:0|44f30f859797ccbc947dd6e7fb163219 +./many/m153|regular file|644|0|0|9|1|1792402821|0:0|4d50d9696eb6682bf3e07a96cd72ec56 +./many/m154|regular file|644|0|0|9|1|1792402821|0:0|a37806f66e52900c01529ea894057a55 +./many/m155|regular file|644|0|0|9|1|1792402821|0:0|1df46e85e2150857ddef01b12144bc49 +./many/m156|regular file|644|0|0|9|1|1792402821|0:0|9e5bf1715fcce57ea772ce19e96c88b2 +./many/m157|regular file|644|0|0|9|1|1792402821|0:0|ff5245e0586c5876ab3e074aac17bb53 +./many/m158|regular file|644|0|0|9|1|1792402821|0:0|77edb145923857b1e13aa652b452717a +./many/m159|regular file|644|0|0|9|1|1792402821|0:0|ba0e18dc6e493746db14c62cc64dee69 +./many/m16|regular file|644|0|0|8|1|1792402821|0:0|66427cc15376ceaf910e0f1af5c354f4 +./many/m160|regular file|644|0|0|9|1|1792402821|0:0|2d9a4d55c26381f875380909208d2ff3 +./many/m161|regular file|644|0|0|9|1|1792402821|0:0|554b07e145fa922aeb777a0d41b2de80 +./many/m162|regular file|644|0|0|9|1|1792402821|0:0|b4c4f356c33650f638fc911ff7359183 +./many/m163|regular file|644|0|0|9|1|1792402821|0:0|b23ed2f7d446f5af3c60c0cca756bdc7 +./many/m164|regular file|644|0|0|9|1|1792402821|0:0|187fcb21375177e4acc3a93fe58b8c66 +./many/m165|regular file|644|0|0|9|1|1792402821|0:0|f44da39df7b71d2420aa69deecccf81e +./many/m166|regular file|644|0|0|9|1|1792402821|0:0|2bf2c5e5207431ce1bf3485f97b40a48 +./many/m167|regular file|644|0|0|9|1|1792402821|0:0|87d6752ad6ad8214faffecf9f96a2486 +./many/m168|regular file|644|0|0|9|1|1792402821|0:0|07f462fa142da8ed6f55c0d6c8027b98 +./many/m169|regular file|644|0|0|9|1|1792402821|0:0|43dc5c97caa43158902899da2e43ff72 +./many/m17|regular file|644|0|0|8|1|1792402821|0:0|5678c8e35af7d85b70ea1ff518755309 +./many/m170|regular file|644|0|0|9|1|1792402821|0:0|68dd3dc1225ca5214e2a077963c12244 +./many/m171|regular file|644|0|0|9|1|1792402821|0:0|2b4f877355365d0084ff39c8783030e6 +./many/m172|regular file|644|0|0|9|1|1792402821|0:0|ddc55a8b9afd0fce8eb38c6de6a4a4ba +./many/m173|regular file|644|0|0|9|1|1792402821|0:0|d2602d917846c1d464a2a35f5fda902b +./many/m174|regular file|644|0|0|9|1|1792402821|0:0|4640974c5a8df9c1ef346326bbc0e639 +./many/m175|regular file|644|0|0|9|1|1792402821|0:0|cadbbc5c564df97821a77cfd063026de +./many/m176|regular file|644|0|0|9|1|1792402821|0:0|c20369a3ee03468f578c8c74f34ed844 +./many/m177|regular file|644|0|0|9|1|1792402821|0:0|314361fc1627ba09af6a5c247aa410c4 +./many/m178|regular file|644|0|0|9|1|1792402821|0:0|18b5b3931ac136c6f9844031e2c5e27c +./many/m179|regular file|644|0|0|9|1|1792402821|0:0|a1354e01ad6137b4fc5cc62f180a8462 +./many/m18|regular file|644|0|0|8|1|1792402821|0:0|f892dd572dd20de347b3b27b1d378c19 +./many/m180|regular file|644|0|0|9|1|1792402821|0:0|7b4f9f59161aaead8ebc6094075d23a1 +./many/m181|regular file|644|0|0|9|1|1792402821|0:0|84803963e2a3b585019db6868f71f14d +./many/m182|regular file|644|0|0|9|1|1792402821|0:0|e5f69b1224bda5071d64f15caef990eb +./many/m183|regular file|644|0|0|9|1|1792402821|0:0|b6f0fba8f6e4375b11c060cb188cddb1 +./many/m184|regular file|644|0|0|9|1|1792402821|0:0|c9522bb1a5a30089edc4e66bd5ff522e +./many/m185|regular file|644|0|0|9|1|1792402821|0:0|77190f2f1e76a9220dba62cd3fa5610a +./many/m186|regular file|644|0|0|9|1|1792402821|0:0|e840f47e99561ebcbcb029d0672bad48 +./many/m187|regular file|644|0|0|9|1|1792402821|0:0|6737ea174a824ac2718fed9e3f663fd3 +./many/m188|regular file|644|0|0|9|1|1792402821|0:0|58bfd1cb33f6b546eedb0640c509a73d +./many/m189|regular file|644|0|0|9|1|1792402821|0:0|0cdad90be02c441fb41a6d770dae7d57 +./many/m19|regular file|644|0|0|8|1|1792402821|0:0|a985d5f8c0764f8cdd7bdce73046ad44 +./many/m190|regular file|644|0|0|9|1|1792402821|0:0|4e8c07eb752c075c9453cc9b816e1a0f +./many/m191|regular file|644|0|0|9|1|1792402821|0:0|7d0924ad195a30a6b2a8ca8addb9c975 +./many/m192|regular file|644|0|0|9|1|1792402821|0:0|4c4b109ce39fe7c53ec65b8210352324 +./many/m193|regular file|644|0|0|9|1|1792402821|0:0|daf7c277f982121ee872422d21f3cea0 +./many/m194|regular file|644|0|0|9|1|1792402821|0:0|04c1462a23779315ff0bdbb99094f74f +./many/m195|regular file|644|0|0|9|1|1792402821|0:0|d7d1de0936202ba73079a42775c4d615 +./many/m196|regular file|644|0|0|9|1|1792402821|0:0|a6830202fedbaedb83ae586da9d9d14b +./many/m197|regular file|644|0|0|9|1|1792402821|0:0|7da218966124abd17b6fa5ed56a7b944 +./many/m198|regular file|644|0|0|9|1|1792402821|0:0|8d40c91037dd5a499a63631cbe7d9a94 +./many/m199|regular file|644|0|0|9|1|1792402821|0:0|30dd72ed5a948d80a40b1d7687906145 +./many/m2|regular file|644|0|0|7|1|1792402821|0:0|4349cfeff8e2eb74dffc369bb5fd084e +./many/m20|regular file|644|0|0|8|1|1792402821|0:0|067f81212cf0fb2e982bd628a8606f97 +./many/m200|regular file|644|0|0|9|1|1792402821|0:0|a4ba2c004cbbc4b1f2922961ea250626 +./many/m201|regular file|644|0|0|9|1|1792402821|0:0|ee1b4d06ef9acb1984715fca56e519e7 +./many/m202|regular file|644|0|0|9|1|1792402821|0:0|3320db42848ba081d007e1dfbe6c7e59 +./many/m203|regular file|644|0|0|9|1|1792402821|0:0|fb29fd3a0da80d1672c321bfe193e8f9 +./many/m204|regular file|644|0|0|9|1|1792402821|0:0|b7d18558fb1e4b3fb1c636d80cf2084c +./many/m205|regular file|644|0|0|9|1|1792402821|0:0|a02e66f25e04b706131f015a58cb76ad +./many/m206|regular file|644|0|0|9|1|1792402821|0:0|6abbe7ba05a9074de018aa174fe227b5 +./many/m207|regular file|644|0|0|9|1|1792402821|0:0|a2ba136b96eeb8367e7c5273c466c8f5 +./many/m208|regular file|644|0|0|9|1|1792402821|0:0|70973e242b7ea4ccbcad12d85942c0e0 +./many/m209|regular file|644|0|0|9|1|1792402821|0:0|603673c5215bc406c2600a572038a813 +./many/m21|regular file|644|0|0|8|1|1792402821|0:0|9cfd7afc71338f84647dbacf3f6f6b26 +./many/m210|regular file|644|0|0|9|1|1792402821|0:0|4bf71dba377bf43aa3776e9a551ecb0f +./many/m211|regular file|644|0|0|9|1|1792402821|0:0|015bc399a474cff7bf5859211eae8c89 +./many/m212|regular file|644|0|0|9|1|1792402821|0:0|3823c1410507af2c3c33b5669ba270fa +./many/m213|regular file|644|0|0|9|1|1792402821|0:0|c4756d1df6b13a46e55efade51170239 +./many/m214|regular file|644|0|0|9|1|1792402821|0:0|69feabb2da7bc5fad832dfaac32ff1f3 +./many/m215|regular file|644|0|0|9|1|1792402821|0:0|2f49876a5b1cd81a6c681a3279743166 +./many/m216|regular file|644|0|0|9|1|1792402821|0:0|0fba8ffe0203c03dd7929d605e9fe4ca +./many/m217|regular file|644|0|0|9|1|1792402821|0:0|2f3f14da61b9dd3df33ac539878db78d +./many/m218|regular file|644|0|0|9|1|1792402821|0:0|fa0c8c205c79dfcb2be989549e4f0580 +./many/m219|regular file|644|0|0|9|1|1792402821|0:0|6b57c36dd6811e8239eab31793417c1b +./many/m22|regular file|644|0|0|8|1|1792402821|0:0|485c438ed8aa42313e57ecf1bef51e4d +./many/m220|regular file|644|0|0|9|1|1792402821|0:0|a565450a0967908ababde36cbabaee00 +./many/m221|regular file|644|0|0|9|1|1792402821|0:0|f5be9963266c24b569d03c105628fb62 +./many/m222|regular file|644|0|0|9|1|1792402821|0:0|f310eb13ce84822aeabe2a3e34f5608d +./many/m223|regular file|644|0|0|9|1|1792402821|0:0|48b026453b394d6bec80401dfb69ac4e +./many/m224|regular file|644|0|0|9|1|1792402821|0:0|f2b4e319946afadd81756805fe638bd6 +./many/m225|regular file|644|0|0|9|1|1792402821|0:0|ed019ea04f0fe2c790ee5b4748308090 +./many/m226|regular file|644|0|0|9|1|1792402821|0:0|72b70a40d6dd52fdb94eddd8fd3325ea +./many/m227|regular file|644|0|0|9|1|1792402821|0:0|178a1aa1bc0019534fa15b435b3f3756 +./many/m228|regular file|644|0|0|9|1|1792402821|0:0|cb1a4e4faf4b5fe1f30ea3b6e1884891 +./many/m229|regular file|644|0|0|9|1|1792402821|0:0|6d20673028ed6e907eb0ebcf81f5c105 +./many/m23|regular file|644|0|0|8|1|1792402821|0:0|052933180d7e7bd29f137c4a07fb7066 +./many/m230|regular file|644|0|0|9|1|1792402821|0:0|99d049a2c2e464b31eb7e119e929a66e +./many/m231|regular file|644|0|0|9|1|1792402821|0:0|e6e371d88bb32c9f7a846b4eb2a9290a +./many/m232|regular file|644|0|0|9|1|1792402821|0:0|482ef1b309083db205f98ab5159e516e +./many/m233|regular file|644|0|0|9|1|1792402821|0:0|b614fe6268139a1fe6841febe3b7df77 +./many/m234|regular file|644|0|0|9|1|1792402821|0:0|591f0ee94dcd2759e8926a904d94903d +./many/m235|regular file|644|0|0|9|1|1792402821|0:0|bfa7a6d92596ca0e104bbf792266d8f2 +./many/m236|regular file|644|0|0|9|1|1792402821|0:0|fd522eb2e58a2788c1ffe58ce1afaec6 +./many/m237|regular file|644|0|0|9|1|1792402821|0:0|1fad87b3d6e7a84cdc1200f0596a1d67 +./many/m238|regular file|644|0|0|9|1|1792402821|0:0|a17a63fc2f5c0fee0995c83e40e09da4 +./many/m239|regular file|644|0|0|9|1|1792402821|0:0|872173419f874262f8c3daf4673e8eff +./many/m24|regular file|644|0|0|8|1|1792402821|0:0|9cbbd2b55c610f55da23c92ca21fc1ee +./many/m240|regular file|644|0|0|9|1|1792402821|0:0|3c984e0dd57cac073eb661b0d0f29109 +./many/m241|regular file|644|0|0|9|1|1792402821|0:0|a258c82ce4afef4cca68689c77453826 +./many/m242|regular file|644|0|0|9|1|1792402821|0:0|6b54883641df548fc28508b25c86aa5c +./many/m243|regular file|644|0|0|9|1|1792402821|0:0|dcf5e125abcc0c2d79c7fac3420a8c18 +./many/m244|regular file|644|0|0|9|1|1792402821|0:0|eae8fbc9bb9e78d145028f7d9c3bc8d0 +./many/m245|regular file|644|0|0|9|1|1792402821|0:0|9407f6a798e5c8f004d5dbaf383f1c74 +./many/m246|regular file|644|0|0|9|1|1792402821|0:0|d68fe80b8e1a1aa20086bd0ca2a11908 +./many/m247|regular file|644|0|0|9|1|1792402821|0:0|85e08221b360aad1f71717187de8de31 +./many/m248|regular file|644|0|0|9|1|1792402821|0:0|f8f29e99cf1a6fa9f1fc39b464a0eefa +./many/m249|regular file|644|0|0|9|1|1792402821|0:0|d672e07abc4789ead0a03dbf1506fc10 +./many/m25|regular file|644|0|0|8|1|1792402821|0:0|9f3e693a89b092df52fb11b864feaea2 +./many/m250|regular file|644|0|0|9|1|1792402821|0:0|def9e8dcdee098475dcede72a442e269 +./many/m251|regular file|644|0|0|9|1|1792402821|0:0|f8d0e196be420cc42a176f6f209995f5 +./many/m252|regular file|644|0|0|9|1|1792402821|0:0|d99412924a6c1bb54f0ab10a0732ea68 +./many/m253|regular file|644|0|0|9|1|1792402821|0:0|387db4223e750a5d14ef3e50e628267d +./many/m254|regular file|644|0|0|9|1|1792402821|0:0|5bdde7f2bbce279dcf767e1e34b9e136 +./many/m255|regular file|644|0|0|9|1|1792402821|0:0|e2d5d3a93c37a81e6ad42d458f4dbc57 +./many/m256|regular file|644|0|0|9|1|1792402821|0:0|116877df711114c0ca04aa6573c3cbe0 +./many/m257|regular file|644|0|0|9|1|1792402821|0:0|d80fab7a57a2940191cfdcfc4fd25c20 +./many/m258|regular file|644|0|0|9|1|1792402821|0:0|cfc3ccf0c1e67ee17b66b20e851d32cf +./many/m259|regular file|644|0|0|9|1|1792402821|0:0|559c87fa5dc5b4169c0e0d5488d777d4 +./many/m26|regular file|644|0|0|8|1|1792402821|0:0|f8d152b9d740b43d2dfb5685af43a48e +./many/m260|regular file|644|0|0|9|1|1792402821|0:0|d5e639b992b2752650e011c1401efa5d +./many/m261|regular file|644|0|0|9|1|1792402821|0:0|7507aea9bc33c9c976c2f0b59d341121 +./many/m262|regular file|644|0|0|9|1|1792402821|0:0|fa81f64b113688dc58cde88499f9305f +./many/m263|regular file|644|0|0|9|1|1792402821|0:0|a214a1ee8dcf140804b126adcbc7d08e +./many/m264|regular file|644|0|0|9|1|1792402821|0:0|0bdc8921d4ed1613cdef11fb7955bc6f +./many/m265|regular file|644|0|0|9|1|1792402821|0:0|dd6d021a5de3c50790f1fb02d27d5ddd +./many/m266|regular file|644|0|0|9|1|1792402821|0:0|ad62fa2cc012b0172c3c3675236db4bb +./many/m267|regular file|644|0|0|9|1|1792402821|0:0|3fb246e625173634453678b522a7f3fe +./many/m268|regular file|644|0|0|9|1|1792402821|0:0|ae53335263effc40bd0fc9396e6873cf +./many/m269|regular file|644|0|0|9|1|1792402821|0:0|ede3d51d87d5214df5ead1b85b3e4cc8 +./many/m27|regular file|644|0|0|8|1|1792402821|0:0|024c2c146a2f83a848ade5d706407328 +./many/m270|regular file|644|0|0|9|1|1792402821|0:0|007ada1f368f7b02f32a54c2da82489f +./many/m271|regular file|644|0|0|9|1|1792402821|0:0|8051fd0b722ef442d3f46831341d8533 +./many/m272|regular file|644|0|0|9|1|1792402821|0:0|71c34027c99734d5bad2baba86e84e84 +./many/m273|regular file|644|0|0|9|1|1792402821|0:0|b7d34cf0aa38f7ebaecbccb36a09780d +./many/m274|regular file|644|0|0|9|1|1792402821|0:0|da23114c72d046aba345454980dc13e8 +./many/m275|regular file|644|0|0|9|1|1792402821|0:0|54d707b3701e050cf8b9df18d236f796 +./many/m276|regular file|644|0|0|9|1|1792402821|0:0|334d0893d14cfba5eb3bcd4f18e9d1cc +./many/m277|regular file|644|0|0|9|1|1792402821|0:0|c0ea39ae9c979278f5bbabe852793291 +./many/m278|regular file|644|0|0|9|1|1792402821|0:0|67792386a500691e513ab78a51ed0d8b +./many/m279|regular file|644|0|0|9|1|1792402821|0:0|efcec77542ad2ac94b10b120bf19100d +./many/m28|regular file|644|0|0|8|1|1792402821|0:0|5712274b725e57688a48a769312c7ed6 +./many/m280|regular file|644|0|0|9|1|1792402821|0:0|69ff3fe9c2a4522083daaaf13e4379b3 +./many/m281|regular file|644|0|0|9|1|1792402821|0:0|8732532455011bf125603f98ff251200 +./many/m282|regular file|644|0|0|9|1|1792402821|0:0|93ba143bcd3e6c3c5eec6cacce70cbdd +./many/m283|regular file|644|0|0|9|1|1792402821|0:0|29ef81bc2e3b9ed567473fd300403cfa +./many/m284|regular file|644|0|0|9|1|1792402821|0:0|868bd853528a957c194b24209755227c +./many/m285|regular file|644|0|0|9|1|1792402821|0:0|aaf0b10ef42507eeed10d7cdd1ec8dd7 +./many/m286|regular file|644|0|0|9|1|1792402821|0:0|36bc3bf12e880cb2d1f0b3bab87d90aa +./many/m287|regular file|644|0|0|9|1|1792402821|0:0|ec4dd1e32e75c8ead1c2545c166030a8 +./many/m288|regular file|644|0|0|9|1|1792402821|0:0|91072a04c92706be3799ff1e7cfa418e +./many/m289|regular file|644|0|0|9|1|1792402821|0:0|3c55568e2159f1470746b971075f1463 +./many/m29|regular file|644|0|0|8|1|1792402821|0:0|6fb4036efe8048a5a9170260f092f84d +./many/m290|regular file|644|0|0|9|1|1792402821|0:0|971c75301a3c514d229bb06a26ff788b +./many/m291|regular file|644|0|0|9|1|1792402821|0:0|2750d16b615bd018b6d4365ab0d3b3cf +./many/m292|regular file|644|0|0|9|1|1792402821|0:0|bcd598399a115e7eebffa26171c75293 +./many/m293|regular file|644|0|0|9|1|1792402821|0:0|7a765645f034a4c47a19033de0a4a944 +./many/m294|regular file|644|0|0|9|1|1792402821|0:0|e1451f4d8d7a417dfde7b6efa4447653 +./many/m295|regular file|644|0|0|9|1|1792402821|0:0|0fef9d1cf71a2e4b8fc9cde3dd94d70b +./many/m296|regular file|644|0|0|9|1|1792402821|0:0|e89be74780a41e6dee591be36f30b41a +./many/m297|regular file|644|0|0|9|1|1792402821|0:0|cbf104c5f2a731482f3669cd84b2dadc +./many/m298|regular file|644|0|0|9|1|1792402821|0:0|ded58b5321af4738023e4f673a68a972 +./many/m299|regular file|644|0|0|9|1|1792402821|0:0|ddc7b78696b89d6d5c535f70362b5087 +./many/m3|regular file|644|0|0|7|1|1792402821|0:0|9c38e8324dbf031557c89d53a39f0b26 +./many/m30|regular file|644|0|0|8|1|1792402821|0:0|9defc48d530bd462729886fb0faf880c +./many/m31|regular file|644|0|0|8|1|1792402821|0:0|c5ea05f8d8be61909c1b5b02f560c910 +./many/m32|regular file|644|0|0|8|1|1792402821|0:0|3a4d6240ced04e58f3426f37d8bb01bb +./many/m33|regular file|644|0|0|8|1|1792402821|0:0|a9a487ecd437d987ba861b2c07efffb9 +./many/m34|regular file|644|0|0|8|1|1792402821|0:0|fc6d15842277346dcf7316b7821529ac +./many/m35|regular file|644|0|0|8|1|1792402821|0:0|68262abef9fdd7c411159010c719d925 +./many/m36|regular file|644|0|0|8|1|1792402821|0:0|98dd3959a691f9d784c0ab6bd8d58205 +./many/m37|regular file|644|0|0|8|1|1792402821|0:0|092e4b003c31ef3a4d1912b514c6e79a +./many/m38|regular file|644|0|0|8|1|1792402821|0:0|03107211cf5de1e732f2c7e940150af3 +./many/m39|regular file|644|0|0|8|1|1792402821|0:0|85869f52d139c315c12ffec6a14610c9 +./many/m4|regular file|644|0|0|7|1|1792402821|0:0|fb8b37442ead70d36d54d241a0c7e069 +./many/m40|regular file|644|0|0|8|1|1792402821|0:0|30aba7e5873781a5ae62664efed721b2 +./many/m41|regular file|644|0|0|8|1|1792402821|0:0|e9c7bcd9bc1db300793277157e4f41b4 +./many/m42|regular file|644|0|0|8|1|1792402821|0:0|9cb1389225c46059e110adaab69b81e8 +./many/m43|regular file|644|0|0|8|1|1792402821|0:0|0826b8f8fcb95d4d45a12eb61ca786d1 +./many/m44|regular file|644|0|0|8|1|1792402821|0:0|d1d0e549a5db32880a69049386ff6866 +./many/m45|regular file|644|0|0|8|1|1792402821|0:0|b9973dfba5ffca1c25bbad1ad20a238d +./many/m46|regular file|644|0|0|8|1|1792402821|0:0|05f6704dab2c9d4395d04d1232a133d9 +./many/m47|regular file|644|0|0|8|1|1792402821|0:0|ef7cbaf29d0dad3b13062156cc56cce4 +./many/m48|regular file|644|0|0|8|1|1792402821|0:0|c283c0e3ef689fa6f1d44c22b4924fff +./many/m49|regular file|644|0|0|8|1|1792402821|0:0|165cc8d27fdbe30571e39297862f46e4 +./many/m5|regular file|644|0|0|7|1|1792402821|0:0|0998a09014c94a7bdb6bb894495ed335 +./many/m50|regular file|644|0|0|8|1|1792402821|0:0|621e732a99e87995445afc50624e0c9e +./many/m51|regular file|644|0|0|8|1|1792402821|0:0|f453ece2d7ab4e89a7bc3684cffa3e95 +./many/m52|regular file|644|0|0|8|1|1792402821|0:0|21cc25c9331a621f651e4bb1b3a12c2f +./many/m53|regular file|644|0|0|8|1|1792402821|0:0|9ff7665cb56590ce5398ece8148eeb7f +./many/m54|regular file|644|0|0|8|1|1792402821|0:0|9aba7daf532ea4fa81011e470d048a2d +./many/m55|regular file|644|0|0|8|1|1792402821|0:0|8a6d937ad0c7da63a1c72b61d4f64e2e +./many/m56|regular file|644|0|0|8|1|1792402821|0:0|58309f1f72eda1b78afd7b95915e7bbd +./many/m57|regular file|644|0|0|8|1|1792402821|0:0|854d2f35e6eb992aea35c43ae5ff8383 +./many/m58|regular file|644|0|0|8|1|1792402821|0:0|861f23e8bc20e69f063187875204b9a9 +./many/m59|regular file|644|0|0|8|1|1792402821|0:0|5bff7815efc01ce1462568f77c64cdf1 +./many/m6|regular file|644|0|0|7|1|1792402821|0:0|ce5aa0d1c99005cde6aab017fb6307e8 +./many/m60|regular file|644|0|0|8|1|1792402821|0:0|e9e46c67288881002fc69b1a0f21010e +./many/m61|regular file|644|0|0|8|1|1792402821|0:0|527df91adecb85ce4c2db1b24bbed4fc +./many/m62|regular file|644|0|0|8|1|1792402821|0:0|c37a6db6720600c4fae00a87a36319dd +./many/m63|regular file|644|0|0|8|1|1792402821|0:0|bbff5cc47a8f18d86ff8896c9d8403aa +./many/m64|regular file|644|0|0|8|1|1792402821|0:0|ca0b9c3dc602c59e7f75c2acd68b1cc5 +./many/m65|regular file|644|0|0|8|1|1792402821|0:0|82f7a01e88f5bd8262f86df5332989bc +./many/m66|regular file|644|0|0|8|1|1792402821|0:0|fd5c2f8ac0299646af81bf20ff386e96 +./many/m67|regular file|644|0|0|8|1|1792402821|0:0|d5b075302eba88ff5981a3ef1c41924a +./many/m68|regular file|644|0|0|8|1|1792402821|0:0|dbf1249f5b05689a9eecf5011282689d +./many/m69|regular file|644|0|0|8|1|1792402821|0:0|7fbfefe361ea0a0e7877f82dd48e84c8 +./many/m7|regular file|644|0|0|7|1|1792402821|0:0|f5df0384c964a01d9a01e31e7db512d7 +./many/m70|regular file|644|0|0|8|1|1792402821|0:0|2bad4a950b70855d1f2936ee934dbeb9 +./many/m71|regular file|644|0|0|8|1|1792402821|0:0|662b3f4049eef4f8afb7882958e7ff92 +./many/m72|regular file|644|0|0|8|1|1792402821|0:0|69e587e4d14c16015c08f8b23409a653 +./many/m73|regular file|644|0|0|8|1|1792402821|0:0|46aea6f0d4e272c61ee5bfade2637695 +./many/m74|regular file|644|0|0|8|1|1792402821|0:0|978b7bb8853811c47de913e43dde1051 +./many/m75|regular file|644|0|0|8|1|1792402821|0:0|0cc085bb42463401890025ebeb7aa35e +./many/m76|regular file|644|0|0|8|1|1792402821|0:0|46b3e8777805e536f33c134aa5ceeb10 +./many/m77|regular file|644|0|0|8|1|1792402821|0:0|c7b78575ac96f1ed111d916941a080a9 +./many/m78|regular file|644|0|0|8|1|1792402821|0:0|198d54d980da418cc29e14f7b25852c6 +./many/m79|regular file|644|0|0|8|1|1792402821|0:0|3d77254be1d635b657d077a883ee63e4 +./many/m8|regular file|644|0|0|7|1|1792402821|0:0|48217eb11e28c1085fe4016fc067de76 +./many/m80|regular file|644|0|0|8|1|1792402821|0:0|4eb244481c13d9f49c33cf971ec52ada +./many/m81|regular file|644|0|0|8|1|1792402821|0:0|42e04c82e620d1fd68e0f11561e42c84 +./many/m82|regular file|644|0|0|8|1|1792402821|0:0|633503a87cff957d06623e2d2588b032 +./many/m83|regular file|644|0|0|8|1|1792402821|0:0|e4cbadd929638b2607e480bfe2af4ebc +./many/m84|regular file|644|0|0|8|1|1792402821|0:0|82bb34d3363108ce9ab1cfd91849eb21 +./many/m85|regular file|644|0|0|8|1|1792402821|0:0|68c9ada28f0b1bcad8d890cfdd17ac70 +./many/m86|regular file|644|0|0|8|1|1792402821|0:0|09a0c699e8aa36823d7832459c0f36ed +./many/m87|regular file|644|0|0|8|1|1792402821|0:0|e1d0c50f92a5d4b993d7e831d01d6db5 +./many/m88|regular file|644|0|0|8|1|1792402821|0:0|d0fc62fc10609116527634f0046b60a0 +./many/m89|regular file|644|0|0|8|1|1792402821|0:0|bc70377b5cb3ac0469e13aff5413f389 +./many/m9|regular file|644|0|0|7|1|1792402821|0:0|61cdf324c2c53b1512c6d867c8deedf3 +./many/m90|regular file|644|0|0|8|1|1792402821|0:0|980649bfecb5eda730757cb11824ffb8 +./many/m91|regular file|644|0|0|8|1|1792402821|0:0|7062493ade7d9fbff23835457dcc2b85 +./many/m92|regular file|644|0|0|8|1|1792402821|0:0|4765be4d8b04b2d36df75d6b651f5de0 +./many/m93|regular file|644|0|0|8|1|1792402821|0:0|43e12b9b4189c8721f0c79264a327ff5 +./many/m94|regular file|644|0|0|8|1|1792402821|0:0|9419149493acdba1887798a89261d131 +./many/m95|regular file|644|0|0|8|1|1792402821|0:0|452ac7567de63f4b42feb2c072c8f93f +./many/m96|regular file|644|0|0|8|1|1792402821|0:0|04803cac3256b8069e481ba28694ae19 +./many/m97|regular file|644|0|0|8|1|1792402821|0:0|4cbd8087d8038fd0627450310e9558c9 +./many/m98|regular file|644|0|0|8|1|1792402821|0:0|ba172daf8ce182f35ad39a3421a08581 +./many/m99|regular file|644|0|0|8|1|1792402821|0:0|4759b8c629df85d7c5e91be096e11982 +./sparse|regular file|644|0|0|200705|1|1792402821|0:0|f8ac51c4658d3cb55cbfca28b1aed2fc +./sym_long|symbolic link|777|0|0|423|1|1792402821|0:0|target/target/target/target/target/target/target/target/target/target/target/target/target/target/target/target/target/target/target/target/target/target/target/target/target/target/target/target/target/target/target/target/target/target/target/target/target/target/target/target/target/target/target/target/target/target/target/target/target/target/target/target/target/target/target/target/target/target/target/target/end +./sym_short|symbolic link|777|0|0|6|1|1792402821|0:0|f_text diff --git a/Compression.Tests/Reiser4/ReferenceVectors/generate.sh b/Compression.Tests/Reiser4/ReferenceVectors/generate.sh new file mode 100644 index 000000000..de6371067 --- /dev/null +++ b/Compression.Tests/Reiser4/ReferenceVectors/generate.sh @@ -0,0 +1,81 @@ +#!/bin/bash +# Regenerates the Reiser4 reference volumes: mkfs.reiser4 (reiser4progs 1.2.2) formats each one +# with a plugin profile, a Reiser4 kernel fills it through its own write path (populate.sh, run by +# ../KernelOracle/kernel-run.sh), and the kernel's read-back is kept as .manifest. +# journal-replay.img is captured between a kernel commit and its write-back. Documentation, not a +# build input; run from this directory under Linux or WSL with qemu-system-x86_64. +set -e +HERE=$(cd "$(dirname "$0")" && pwd) +RUN="$HERE/../KernelOracle/kernel-run.sh" +bash "$RUN" --prepare +W=$(mktemp -d) +trap 'rm -rf "$W"' EXIT +mkdir -p "$W/payload" +for n in 0 1 100 4095 4096 4097; do head -c $n /dev/urandom > "$W/payload/f_$n"; done +for i in $(seq 1 1200); do echo "line $i: the quick brown fox jumps over the lazy dog $((i*7919 % 1000))"; done > "$W/payload/f_text" + +volume() { + local name=$1; shift + truncate -s 0 "$W/$name.img"; truncate -s 16M "$W/$name.img" + mkfs.reiser4 -fffy -U 11111111-2222-3333-4444-555555555555 -L ref "$@" "$W/$name.img" >/dev/null + bash "$RUN" "$W/$name.img" "$HERE/populate.sh" "$W/payload" > "$W/$name.log" + sed -n '/===MANIFEST===/,/===END-MANIFEST===/p' "$W/$name.log" | grep -v '===' > "$HERE/$name.manifest" + gzip -9 -n -c "$W/$name.img" > "$HERE/$name.img.gz" + echo "$name: $(wc -l < "$HERE/$name.manifest") objects; $(fsck.reiser4 --check -y "$W/$name.img" 2>&1 | grep -E 'consistent|corrupt' | head -1)" +} + +if [ -z "$JOURNAL_ONLY" ]; then +volume default +volume gzip1-force-8k -o compress=gzip1,compressMode=force,cluster=8K +volume zstd1-latt-16k -o compress=zstd1,compressMode=latt,cluster=16K +volume lzo1-none-4k -o compressMode=none,cluster=4K +volume reg40-smart -o create=reg40 +volume reg40-tails -o create=reg40,formatting=tails +volume reg40-node41 -o create=reg40,formatting=extents,node=node41 +volume node41 -o node=node41 +volume tea-lexic -o create=reg40,hash=tea_hash,fibration=lexic_fibre +volume fnv1-dot-o -o create=reg40,hash=fnv1_hash,fibration=dot_o_fibre +volume deg-ext-3 -o create=reg40,hash=deg_hash,fibration=ext_3_fibre +volume rupasov -o create=reg40,hash=rupasov_hash +fi + +# A transaction the kernel committed but had not yet written back: writes are throttled so the +# write-back takes seconds, and the image is copied the moment the journal header moves past the +# footer. +cat > "$W/journal.sh" <<'EOF' +mount -t reiser4 /dev/vda /mnt || exit 1 +i=0; while [ $i -lt 10 ]; do head -c 40000 /payload/f_text > /mnt/big$i; echo "small $i" > /mnt/s$i; i=$((i+1)); done +mkdir /mnt/dir +sync +i=0; while [ $i -lt 10 ]; do dd if=/payload/f_text of=/mnt/big$i bs=4096 skip=$((i+1)) seek=2 count=5 conv=notrunc 2>/dev/null; echo "changed $i" > /mnt/s$i; mv /mnt/s$i /mnt/dir/; i=$((i+1)); done +sync +umount /mnt +EOF +sed 's/cache=unsafe/cache=unsafe,throttling.bps-write=100000/' "$RUN" > "$W/slow.sh" +# A capture counts only when it is a later commit (the footer has moved once), fsck.reiser4 replays +# it to a consistent volume, and the kernel mounts it. +for attempt in $(seq 1 12); do + truncate -s 0 "$W/j.img"; truncate -s 16M "$W/j.img" + mkfs.reiser4 -fffy -U 11111111-2222-3333-4444-555555555555 -L journal -o create=reg40 "$W/j.img" >/dev/null + rm -f "$W/journal-replay.img" + ( bash "$W/slow.sh" "$W/j.img" "$W/journal.sh" "$W/payload" > /dev/null ) & + P=$! + while kill -0 $P 2>/dev/null; do + c=$(od -An -t u8 -j $((19*4096)) -N 8 "$W/j.img" | tr -d ' ') + f=$(od -An -t u8 -j $((20*4096)) -N 8 "$W/j.img" | tr -d ' ') + if [ "$c" != "$f" ] && [ "$f" != "0" ]; then cp "$W/j.img" "$W/journal-replay.img"; break; fi + sleep 0.02 + done + wait $P + [ -f "$W/journal-replay.img" ] || continue + cp "$W/journal-replay.img" "$W/f.img" + fsck.reiser4 --check -y "$W/f.img" > "$W/f.log" 2>&1 || true + grep -q "Replaying transaction" "$W/f.log" && grep -q "FS is consistent" "$W/f.log" || continue + cp "$W/journal-replay.img" "$W/k.img" + bash "$RUN" "$W/k.img" "$HERE/../KernelOracle/manifest.sh" > "$W/k.log" + sed -n '/===MANIFEST===/,/===END-MANIFEST===/p' "$W/k.log" | grep -v '===' > "$W/journal-replay.manifest" + grep -q '^./big9|' "$W/journal-replay.manifest" && break +done +cp "$W/journal-replay.manifest" "$HERE/journal-replay.manifest" +gzip -9 -n -c "$W/journal-replay.img" > "$HERE/journal-replay.img.gz" +echo "journal-replay: $(debugfs.reiser4 -j "$W/journal-replay.img" /dev/null | grep last | tr '\n' ' ')" diff --git a/Compression.Tests/Reiser4/ReferenceVectors/gzip1-force-8k.img.gz b/Compression.Tests/Reiser4/ReferenceVectors/gzip1-force-8k.img.gz new file mode 100644 index 0000000000000000000000000000000000000000..92212c3bf6973a76b292188d2c57eeda305977d6 GIT binary patch literal 54570 zcmc$^Q+p*$v@P68$F|Y2ZFg+0a77(=Y&#u0D|W}Wv0}4h+qQMybN2pz!#6MLVph#r zRZoqZQDcxs!F~I`0r~xW!;@3Pwjbu&Bzg=jqO%Z<-IPDrbOb9oT9QnBNFkl%6fW75 zQJq{oJW?$5l&uhnie6k!Qmi09$@5ix_$_7g!PnY%OJwV=b7{Js`OK}#`LQidWD5M$ z%oF(kw)p>V`1u2G*~;6>1I?er*nm4MRSO8z-*^^4)fG^{`kzzv7~wNBqttc>|Je~HV%JCPZpqa2hW(!UzP(ka>i-sf z;buX#QIW!hW=Q<8AAihEJ#_lAdA~+=a!N?d%&Hg}6`xwz*ArJVaEeTD7UCNmrIS~J zcCw=^A?M>s07PVs?W>cO(DU&m0wS|!_mgN!w&PkOo{0W$_fHN_Ro3Y*S}K+UvE|n7 zZofCUEtKw$`HVM}3-%V2XHp_88$ z8W9-N-2}(Z?0lABsLR#eL>a;CToGcZdw{4rfb6Wx()o)z61RE3@Cew52=qkM1z|W> zr6T6ASsTe~y4g|F<2I`Kt$CfaEv`aW1z#~e((Zg4>Ys9W$#d0o?aGxsNnTf#38rn1K*;@WlIx1rwfif=Ya~1S5lTY5VnK1m) z-4e^vik*8M)OPf`+4u4Fzc2Us8ST@eyCSgqe)sbedKHbN2WWe5`s{rLfhMqa(A?ap9|v89q7*c3IHN#1H5#Ygt_nW) zRy_iT8;)$24NK`~89^V9_iYkNp6N+1X3H~OS}lq4>?skZ?DZ+kF}Ova6DH~mzMaLK zt1lC&nO7ki#IPYEk#bNSw;S0+FXgmsOYwuz?@7H^PQyL^26YagVx8^{^&DVj0 z@zb+)snzr4nV0~|@aM?gUP_F6hgNoM2Rq&ik))=f!H>d+KLmX|29JJczL5Ec{eH00 zO}5M7e`S+wIu1`>CraXqgm%xTJ{GX!dX_@=e9=k6IdmjeTESj9UG&{@02QnspTZi< z{5f}VbZMuLZqZzEFNB4oY8&Ep750grB=G^BL_T%Rrx7o0EC_+*)hj47hpUIY_ie^N zHfLUZLfj9d1Kcj*&a^l8>NX`IPf58GW^v{4InziGj3>D*_Q_j6%Mnc*b0=hrn>3Z! zVyQQ$kz}@r8O0>&T@JSD+nQdl>$6j;-1y}YHHB2;ZEm3^Ztkg%|8g}zd|A`Vjm@`50y8;4XBqytNZX}f;GHIp*AqFT=F0lA znW&GkqD-q+3@0&N_c(2ilzdyll$M*utH~p=m=Z(>ii(a#r{c*I0SB{Rdy%KQ zi;v^NwPdk(gJ>bkFni0bRIM=Gn&k1_%~P!n01-UX$TqW~&KYy4^PNseciLGk^wL?i zAWeqHIFc>JJ}@@%}ffhZUR};m;aJ zgc<}l+K7oq>9|vZ)tb$Og01wFm7mu!S!l_-S$wux?ZU;Jaer=i5ji>(5kOjJ$hyaU zZYMGL2eoW$o|H_^NzHKcV_q}E$$#BO^5#=SeLgl8tV>{C8>bUA`4B5b5-JR9=CkP? zI}2=)zlKt@=MEEjp3C*Wwok8rKYIRCQt8Gv860&;3Uhzl%!f?mmtqi(Dc;^Q6vwQ$|VudZdrxWz%mBvaeMfwNd8UOy< zn+u`Y(ZDUSsU$seGpHqcYQIWbRQbEzF6ppZ(wOZu1niy$KFO=~w5GqMYn2_VC(bC&#-h4r50O83F(R4z@uiIW^6sh` z+$Ln_C|bd4TicM3jCI`m5L!N0;4&vSF8XEMe)G(wC7I;1dAyL8&I2QN$ikL!4Trfh zOOCcI(l+|~F}C`xqExv{&r&M2^}%ZEek%o?4b;li5Z!y|>yR&`wbt(2j%o~>Z521$ z^75E9!vAa5PiAmu!}vq@Bo6WzAJxyy)Xw+bGg~*W<44ny9ZwHlUhUpLu?IK{zLscV|M|(x}Sxrgt(fh$|##0g4k|Di+3HsA8vlmuPdR zBtxR?YVP+4?>X_;PG|Q<7;Kbh5uN86A?ae0yeVJSgdE01jS>G5!Cl>YHGi++$`MSz zbI2OypOnRI6V7S-4fsx5=a)~7g==BoMVpm@(Z38=&|*%Wizjs&$1Y7__3mvKGo!c# zv}em*!q=MGLe>%woE?s!k-h38fzV7!sNm)LU|Ad|V&SR`(9<~{1*I;1{yXZTvxSw; zDWJ0GatYhk0iZc$4`)gT(kQPo@u0D&DzBcMQ)2P|+3h8FrbrsNCl!iDS`!=7x1RtM z*b*2_emgtI@9wP5Dh68MJ3s2{ecADyQnI{=yPN<*#Uko6?Pe6IZ1o!lSQuZ;x9b}& zN^rW{w7a*+nFD(^W|-wj9S>2cl&|?KXowGmLTl6*cB!V8x;B2?y4F_&4}+f!!f7=u zt*D=Z4T9Rj7(_zU$daeAXXKY+^l0r|sD-L_i;i=42;t0yq>h1}%?e9No`tS&0$cR< zMXV*D-$FXb)lJaEWK8LwSf2dihS^-=7Ea3~@Mh60EWVZ5qi(8c8Z-=w%$@&olATUK zZ6~#WDs8fjlMy z&wUBlN78FLiCkPD;`5<$?ULemXRHb&=xO{=j&Xf#k;n7SwEk}mnQD=LTt$)S)C>gM zgpwJQN;c>qXqK9nku2f5 z=XyExRKxJy-Q|Ee?!0FEj?QW1v-5P7V}oRI%v4}$wUv}0_o^cu_&@yqB4t`?lh3I5 zgH){muY%&5KJ~l)AGI2g6~C!o`M$_mD_3}cvG#1RUs9S>Xo4D{yz;%2mhuFU!rn&g6bY7>WbIL=R#+*A0y=KlN*EVUBb+wE-&MW~?_qy1i^_SIN z?Btv$bp2XGTuS!*jL_`3#ez-IFdvl|wl1DlP2JReh41y;Fn_E-L7Er9c*E?zd>Yw3 z3Xs&+)m0yt0E|<*Z~7rRKHonHmie5ux}+EmLREEK@mtvunc-+1*Q*10F#lWXF?Nyf z?+1lvAwQ|#lMr;w7E^~?Gh9@cCb05=dX#m4q<@uPk&h0H!7V3Vr4g46~ zB2#bN;iQm`|0NDL*D9jS+M?m@xX%TSr=fT~un+de>X7*m-3x^$;1SDkYnMaFefeoj zS5vJabf}Hi=RiKPLe?%KbWr@Vwlw@$Zisa@&9ws39@RN?KSSlp?eXQ><*;Zcz~G*A zTC4mlO=~BM`g^j~Ye)TgOb76(pSPuH>7_3=6^@DGmNzx@dufeB+gc+O-2YIjvh(-6 z)iv;r_=BU9Vr7TZQgcD{ip)_tc${qdv1k zUs*x9m)z#+BhFtVbF#aIIoqariyofZmp5f7Wl(ZJ1t-+k%14|VdI9$^i2u=#M}a0rw&9+rGGf60){ueBcqHZkRS zT~zbDtT2uV-8us6Y2?>8{mNYG?z2AzUKKQ+;(t>aUM2SL0Cc%xPZ@BFC@*57^1$A5 zdH$2K08g_+zQ!e(f%Zj5_gQM32bUc1lOMEC_UvU@$@eSb@ibmdz~9b!j5me z@c4*zR(qEDVEy0t>3HV_>h9%P)(4lQZYWO8gGalbt+xE(N`28qdt<6(iRR3?fvG;T zS$zfdbVa~Uq4j07F2iJW@-BoMw`2a7-2%mpe$a4>SAr=C_%aVET%hN;a%`-Nks{y0 zd@S|UINPT;?}s~0m!Mct>|lBc0O2h?(|MpXCIm3i7{>n<1-|+gm4C8G1Y+Gc{e}fG z3c_c{fKjESL5C-oN%;XsOFlz}hy*G?0;$GliK?jfe1ilb?Gq&x?q3X%`VkMsbv#{O zZuq9`?VVgYZ=Rl(WmM1EFIWz>G?3Y#Fi5;%9hpo;i9FOCY}Acq!<+l*2SpRKcR84H zPduETac^dz03xYIDF~hiENF+)sxibB%?4|*5@7bDM-03VeIRM>PR9!~T7>@fYx)5g zO6p;3^<{2nmj}C^v8%2lBnQ-Y^tlBzWa-L}b<0~H;c!3u#s@8ahM#*7DHWI0DLDz) zvRoY%w_nG$XL-whPslzR&at6QZ-!QrnCYS6dg~iRxF1m;BUb0L#)xy>#L;&7aHNPT zZMG5oJiaZHF})45?_55}n17LvYC7bJ2#bT78_-`US3?%60H!jxA6jnsSN%xZkPuE~Zz{25#YKAbfp4IYIb=4N~zBIgPfkX0n!)!#rlY;pUgLK_wL|5J|{vjHU$vXVRhFCGY8fCl&k&G}y zSCdQRP6_9!4Ca+!$=;;5P`#H0h;h^)MRbJabfGhxu&zlo4h3E|5?>3B3%^cr{F=W{ z&xnS4RQ9(BOZL17ybI9)i%ljRLAhXn;T^QDB@IhUWq$J4r=6|J%_)EQEkB z^+qg>^F8{9j|t)R6-3Tx=Gc8(|4HCYV3--R`fr}KHp~|IJ-trhb#%g1VUxSdBMKd8 z8usS%Eg4uCc52y`e&;)d<%b^^rE+i01to2+ zwC#ilMBi5Mc6B?MLpD`@Ll?%=RtQ9G=!kY?wrFqE`nq5WBu1x%*lJ(7VuE1(BK^vJ z`MT!Vn)opUN{ZE*L8d0r3~~Q$D5%)y_CTF^O>i36?f-yu_4!mnyLP*0#o?5Rv9Itz zaQ4#rFNV)F|?z6NR9P0`01;bb+~qiH#>>2Ql6_$bVMMu zjf9{dNx6}cN^q31Mo~OkbTuqlbm*UU67J|0OMfRjB>GUJBlytv5Nm)<_!z2Y zUb(0JN|mfZ{cK=jWF$L5K%kpdvX4*LAW*|Av<~yInSWjBoo9D_?B%$dQt$h7j?VSG zLWqS7RmnRZF`lbC$G1V#tKVT}AnUT9_4IW;qXd<4aP}LbQ}1c%qi@)o43zGf^-dm| zGsl3@68_h51KsY0t0FEPg28?GQ|eiL?ekfKZ2#YOGvDMKN$axgRN!*RYE0#`SV=y? zrk2uCXwlbo8JlWA)IY^1f0^#`i4_jRJj1|}@`Xf9-1qqD{H$$CfqOJ*B#fnW^9KaZ zce$n_VUotG1QX`guYBO5c8_C(yWQyKGWlW!v6y;h%Mq1=a-DFCFVVDD#3aS)(fi2Q z^I+I=)s#eXB?U2??_JYv(*uj5Pbe4lRVgP-%}83*`+x=Rkb5^>qQ*No*&Hl-Brn&O zolm*yeyMIGqd{|#2dG95CW{Ug;-RXQd^4sg>Vu}71fk`^5N_h*0Xi);2cF2>W;)yW z7@oUAR{I*qaVqR`ZZ^`Plpc-o&P@x7C~*Ki`8~)5`PGP(tYr)c>K+qu7}m^_Ixl({ z)QgIAaf-grV!Uc2^Z0>tCiJJGT|bn{&opWjaGr9abt}_2TWo#L_e^IzO{4Zdu&Kv1 z)w*;fj_~S#l$knv6ppRACOhUe|9yk+9UoR0K*d2QysPKMFHlN#rbsZ7+7wqa9OaCw z=A(NQ*~)6O7B{46yY6!BNjY`aIxR^11d&~6N z)k3Y_C4+7*L01O7Q`oMPnV9^KpWzI2F?woq3O)+S}t}@4s{;|17oqW8yK}ATqv`Awz|!dNvstdvLTsv~vc5leEpN&rQ;t`o(;OXUP@F2S8goz=?=h^4zaA9qr^s1<9oQ*jX4y=3CO>^4yT zk_=<#Q>j;CB?ubD3xU8gXzLKtI4IaO)GV~9ls_{;szE_|D%!=*^U5vFPkuUjuT?=n zAK|E>a2s}70DLRky+0mJukXRXh^|T`(!JgM{=n(zhAiz|LG^@98NvbhdC37fL5+65 zQJ>Wwm6$uTL5<@A@ZdA?3KUv*WxP+(VfDy=9ZV%YT#1|$t92mcT4m?9-cZgQM;*6K zO1s?(f;4mAVB*4X^lYcMH+N^KpA*K=h7z^pwGdj6sFu$idemflPGzn6BJ(>>gbEY7 zjHYw4d|Zp3Z=<;2X}&7U&r7J74o8o64s8f4$H@;GYN|wb(3NKMO!vkV@a*f{ZR!kn z;$9EGL<1-vq-$2+#P*}&Rpy-v@@S32fA!G`oTK07 z&D=t*OT%%j2^Q%V>FPUxG3iVyxhn{jWYD#dPn?l@F-zh-^EkFXbk`Lt<*A$7g%*m$ zbspHux!2%jnCv>$F$vlnFd19LVrI3E2Yo~j=5IpWl@BwVyKEx0DH%s#k(vGZ-8*~hPa6&}C&F(Chrp?VKiRP~7cQ(kU67_ykn94OkDE@{L`E^-!dFg@T z21Ac#kxEr*$)^fqkEESITDQboWo8FG#qU`=3~m#TqlhO|GRTZJj>|!W%xEX)zGVwo zEhj~$GSGESePO~Z&Gi{5Vhw9*I4{x#@jFG9F+mYXe>rz_HM=SW&%h=8mdRaq->IL; zU8P&0Y17nLSyk*|jOnH!b#?kCb!^3&W|zbfhI4VNPS5b<+y|>1`|@~Z>*4Ms0n=u> zNUR?*8PjAA z$862wY2jJ&zaPJ@?1G_uvPq*^&jAN2$|(71&Te~o;afLZ*x_kscMAlYsrtV9?U2Q$vpj!O-UvL%xYDr3R(uubP{XAqB7G4h zY4xoz@9?6ZyI2@Z5qJCU_9=5k0Go3QsDxq5Z>bDUKz3cqT=p|h27591z_F$EoU^`U z3CuDM8Av?583C+&F}7rxmQmUEOR|OSD*=)*!d9|gwU_U|tl&LY%-{2_vAtnaP!;V}i4L|P(?;G9F8>o`az1gi z$xbmiUl#6ST+c=@of8$aMKuyky(NQ9F$Rr#TfLQRS$@zgCSK*il(8h&s1y?@Z%0jW z`01A(ClkG6xrF}aG7?O;X1hq{YOCvJHG+$F=9l-mU~Q6`V!(_jRNAY8(01eH6M#2c z3TTo8Z{ulpw)~sVMvyIzlj;hLy<6u$Y}L*L>E7^tQ1?PPY@Ora-q0#XM$1q~yeNh# zc<-)=&ZwbyKla}>>CaZHvQ%8tSTUwkpB!!6m+|Y}RZJqpF$~jKryUE>IK_Zl@S+7z zo7nv&7(m%EPMC=P&ynJQW%Z$l!*7n2K9>su9p}iK<2%^T*mb=4TtefKkyb8tbQ?`kNZ8ByPfqw*F*}Cl={a&CGkkvHaqp+yHqs7hPtx+`x0!ZneY};Fm*j0pk&D5_t zsmP+ncu-1q2zJ~n6yiQ^$`KeS^P>$c!5uEcdI9a->fC~jjX%xgOIQ?M9Cn?j!?-i} zfRLZAoqR_??$*+zs+@bnnsZMPjKyy5%V|{G(}S4!VvcvO_qWn&*sBbiS0+MnhUW(5 z%RpoZVk!~X+(`~9pXpcD_rPY;-j|s*lg9|#6Vf&M=^V~P?BBiZ6j+kPZbj2P^zI%9 zbbf|jJ^fD(Q*eK#H|Mi)MhwQ3^q0LTdu#VAA1D#07*+!bpVu2xU}`Ra-b8tZgj`F+!iFii84k)|??I;N>^?q zPUD={p{LIRhJ7*p??vO$$m)(;TCO=oGk4tflG9-WO4I>#&lU$2nFqFiiTW?}T%XRu z_s*V5#OxtQpX`Zi+rDh_hJNSw44n1gnwt{#vdmn^96lwG9J^1({1}BWtJ@1$*TQ4y zi~@?Yf%;zZ^AlkKCVPUU#a!pk`@xWQ4YNOLYu=~7+dem({pwMU(8ZqnergeIY?~UO zpKlFteq&{YOTcYzI}PbJdgRYI_43WID7n$+SF0=4wig#z{+9%`gol)?&$=*jDtWW= z3)VeFz(#2d8md*Z`7C&&_Yi*9`etrgnWiTSwS|Egd-k0^i$^NqgswMwZg2K$AA8~j zAveG-X?c+@?h!OZ(XjPrjTt*Q)#XX{=r(y^(ggkzb>Rfdz-$5n7a_0pw~*YJzO46+|G;!F~5u}}1=t)XEBQj4CjX;c*0@p=|O)57nT zsw2*AE*b6-AH$f%){Gyf{nuK_)}&4ekl(#SUdd81`I6-N+wg6Y1dQwos`@2*xP$m}HirrFm6i`3v=wngO@1AC zn^JRoz-MGN?N0LMLKHCHu*0(=eAbJnh85~Z34Ct2w4CW2E0>qX{EF^<8458!#so`7 zW~_Aq zQ$852Xg4RVo=n(KMJ@&jgq5w7FLiU6_hIIK7hHvESH zKDXWPiJ@a~@#FK0UIIlG*YK}+<1r~i*N^HDTrqEj0!pR)$(l9^CcdMN`yMuM7O!;~ zH2lMOtN)uWqyXri=Id*G3*#B}`m6b>_~DRQLmD1r8rw8W8dO6CZXX!S?b*>8ZLE}N zH*ZuUNO4oO60Bt1R&1(Lyr3Hs$DVYWvQ{eRSyCz{9t6)$vZmoK+L^~!M-4h$&9|b8 z6(npzqBpx{NKi|Be2$>P>E2FMIX&Z^xIFdy1QuiLme@r_Z}^29TeOESQQwklEgwUd ze2*nP6&f6fQNWmk_bB^HjEb#!w)o|wZW#(5A;m29pJ7BmapmDXFS?XxPAO{kH(FpoESRKfXQ8 zRv_mw#}X(4-F)oOm-mitHn42Tl7`8bywS1_c@Dy2TAR=VOaMo$D#2u|AG3?-> z7oor#cs(?dd?@dkbiByFiJL~Ij4)X5Q^H$F;#HQCrjCHqri?`z-szT66}I%ONM+0Z zObSbS*Cj$86Z|r&q?3g!j68&j{q^H^fa&Xp+&NTT&80=RYD|N?`E;|+s1p#&c@7q; zP_@iIl%88#!v%IzIHpO$4BxSxZ#J!zy^prqSh0qtVj2VWDjvj3I5ljVF;|ZsWyS=F znUV_P3z9@ORel`f4Kv?On$WfC zEQHqk&{t?J@c^h}f-R^CI~0)QVzx38O7hf~)e^bih7rQMChhif0*|jTjC9>wd`J}j zy`OUNR&Iz<%)b( z2heD1*JreQJ}L*|BUh8ekqr~I7IGn_V}%3Z-Smusn5zuFOtOemD;b`twO*j) zaN?8RAB#T179=DA;AF{p8a>#N9b`E=&Pj5WEfA8&-PMvRA|_Vter{i7yt%A< zEEGC9z8ZfG40IZiT>Y7MLI1?ow&`Rnx1*-jTr>!L)?bcniRuZk>-N!vexjLjEu%JU zr``Y@>~O3?_dlKP03aoYjGUSO)BXk?qWTI;$40Ai$Ch0|%`IL}iRhb+NZG8NcVhLU9j7}= zH_k4+G?GT;F7X7?2mZ60M5(k_zvgNr(^Hv1O)!TMUokI}W^NXC8RyPVc+1MRZL6tg zxX7IWie-^w2$nTxiq>w-fw;w#hNq5g_nWc))LNvpj$iMBOf`omaR+Ige zuT^SLMycXJDVF2D6}>yx&h*H1IT*nRFNDF8UU@o7OJ*NzBmLLT_{ax`S4La6A90@r_dT_4Ws#I-H%7tSL(GGEiEEc!|w8NIZo%v zwBbu1Hk7)kG;4RWv=_Oij{(LDBSYl5q}>Gb6;svMfupM40d*k{&2zt@Twa+f$L~{# ztDX3FZ3U?rciY0B12hsP!#np%3ENWDb_I>C#k9|NpQ$+LHEO?q{IlFqB`S&05P!?k z*n#c$a>ODsSmdRlJ2`dDvWUW%EhHJ;k8V!OXkv_ICeQ>GaS64EaoN+fLsmJd zD7i*hBF^S|YvrIharSCbzl;tXzp20gDc6jO($`srbDBN<{HPyRCWREmxC?axua^hu zsx)8n%ps~=w>}B{^OYZ=7m~;l2MI_nvJ9TA_;WqC#G=X7Ko<=HWnxIiVqD_5%f+c? z!sb#&n5&foXeP2U;*b> z@k#c>#!2+5!B%61v?0E3DJ(;u^{wSM%(z+7eJ`f<3tCFzac~Vib*MTwpR0^2vO2 zVr>oe28=~?&(eu^gV=>)2nO_P#Uh3jV2P|>e4RVYqRhIAc~`=h{F)G1Ii_e~MDNdH z$@Nb>ZhtH0Zpg!&Y#g0_Lk*|Cvcu~RAov8{+lqozNn3G2w~9$IaKHuLkvU+iZ991J9R(y5`7^*gKV<(@7{R z(SNNxJpJS(CfIiMle;lIYOJYz7G5IhRsJF2T;~g@kq}%ZZ^So0&?Ib%_ZW0PxqkLi33 z+lpIVPy7p~XKgVFV5cC~yFDVL!Wih4i^)DFBjLXvGIT4%(AmL!tHM$ehaAm<54 z5B`#A8%Z64xLYPGEYyuGgnDy7v!fB*+?zANiOVbcut_K?WP__`e!Hsc!L!WSBd#`0 zBdEA;ZF}(qSj*uHSXti3z^*iT^s|6UJcLQR1>9Tj&hT9m&KL=$qcV?c==@yo5dR5| zyItzxwsc~VqF2ZDS2~?8t=?RR%q&@X$Qc_~x`YqztWz{IjsM|BRR`zL_u8jy_BZiK zA3t%eKE`)75a2*?mutT4b&&G_$XA#M!U7PrFaXMCK6v>fNOOFgzn3#{F&i1F<+2zW zjBL3gBMBpo%Y6iT4Ev_8QpIYpI7lSwo*P71#dr^gYz?ge*2;(}tGcdR%qQam;x$vK zTc(|5_L~DA|GB7;tEm^}^)OhZwc_wF1*a@hcZpOHtks>Oo+XHE5(}I|{ba;f68tJ( zzmr+cJ8jSRRHT;Wvz@!&A3W%SZLiSld<~C$oepcipM=}?#|V$r5a3o{t0CxXdqS~3UPMfP?FCNwFi zLjLaur8&9HOOvR}8+yt5xz?BXy%C)mu?k8;g+hfUqH2tHMz#ID1?I1e{oK1`Vm9fotv_Ce!#Lg0i}n}2SnP<;GC$cFib`2BfkZevq651T+EpaI zAP{@DmF@%OpN$XnkH*)T%woN$617pEV661n>1WF6awsJ)sL_^XgWtSw=WjzB|LpHp zH*zHj@eu7x2WF;o2q$Nc%QcE8{v=lWzf0Y|yaZjhq(93+n@cB`Nz)_^pnxlZMA&Sx z8dlf94-f5zb2Yf4`&;^jACw%2!d<_Ih!d@ediQp3(2ooxMQQ#_F6^Ja*FbT{z0@SY zjW|=qI51+H5OzU7EQ-=8PB_Ano+Z|?wfbW=#YEh2 z&h2{F8p-om7DHJsU3A@w*7hEtZHI&Ct=`NokG+_|#+H8HWKZL4KZ>866{+atfeq5| zPik;BuC!rJx43va1!^76zp;83Ajic#1SW)(m!;utGQTD2wzRaT9MVwdc+1J#Gj&~M z0Ig(4e0M#)?^0yqHh>p;yV0&CZ>pJTrKGuv<@_a9$zxGtM?vNU+*WTkL)HFm4~s>= z+nY-_uL`n=ybHFXOeTUDV~`vRcivMD)9quk7iL>1r$)`O_~$tk6y2wlj$Felf49c{ z*t@9-kUPg87u!&AGmYsSqL5nf!RNf0A5Q3Q_@2!ASDoQC8GhOLRT5n?k|&l2$|(wj z(usC(@WbQ3G}Hl691pGp$+XLW@1RF#&yK5Uk*0r|UV zR94SZ$n;V_2QB&3xN(1AqQ}mBOoY4Ps2=y+CrAv$sFl*|xeU+*=_QwZLIz4=ZNIM> z60M^{&Wb#L8Gi0=qkM@#U78$zsjv5F{P`5r&eHJymj*gx~SHzT} zrIV_Sf}mA|{*DQQj@=9Jc@o*!W=gW(iH*S65SfR_z*;jI7(dYWshJT85ozW_1$A;R z2bVC~q+p>r|JJo}%k%~wqHDS0veoQU|m2|mBdsA8vj*csN`_d>Ry}oW%$Z}QlGB(6^bivB1uQ378Y96=G zpw1P%M}eC*NmABIZMNLQYY5GqJI>^jX7XJCyf`oTdJ$c_N@cWqj32y0(SWU@k#sPc zvS4{1mF-B586NjCGw)i&o!)RjY-Yo9AHbfmPXtekTm<(j?mJvz0P`D&?IklijN| z-9dOKe*(#+SM+3EF0#^U{@ndwLP=2|U+l>eP;(_V<{kI82)~&+lg&X9o)SdxJ+rkB zD|lL3CEZXnY#a!nqo);oDk!8nS4~Z}7DZEw)a||bE8j;;I>0XSSI>CCY)6b<2Z`2< zUI|)WS7qkU7^+pp-+z}hNCkEfN!-?K6y?O~L1QUS4tC`Rrf1mK@tDg17UZ$!ve+l2-6lxc=@I zlB@r^68{C@{^NGZ>x%!ZsNy)Q+E;3Op!Si39e>(Bl7uB{2YtPp7Yz0lZuQ89Myjt5 zi(_qQ_(LtkphMsHEKI6-%4vj!_1b1*H11i+-A$u#(?rTpsl9@MG7Yt0p@~NkNus{4 zek0>*M=w<9#hFBC<052QL21qAuoGa61wgjTYE5{a8NLEY!GE`sxrZmYmq^8K5lb;D zexJ{m2cZxNlYc@5K5tjTh7>Df1Jq6rn!cXBJiIu`YJ?VaP}O%~(w)y9%3ZeoYW|QY zJeV#GWc-t#75?W?BFFW-2X)Oi<)*4{z;!}IVz=jF!g zMa99dLc|ZJlvVd04U2%Hz0nLm)Ce91q@BW_-+Z$wHQ$B*D&}*lzioPECl@u*ZLB8S zpKZ~2HJ#rT3F$NN_*Yk>uDEM}k3Q&KCEG9UvWJIGfz?oD3%4EPpF0Lu?b(+^I?8KHm$IFfE0(CJhAGArgYaq268iBjuMgqUEaU*u8<((%8VcxvSbzj z)<(gTLm>S-`#x3A!EQ{45xw@y5ktEV3|B`}2Jq>0x~|7lqpWKhUDzWFb1d^Ty{^@R zUobN(*REH?ql9YIO>i6#t2HV{F=a^VBe3}m9Fs*zBHdN`+fLLeAsmG+iL|^T`X>0h zWC;&bPA?&_qp5LhBnF`exbO#Pww->Pf<((kjaSbludyrphIxZe^n2cv4d2;RsRK*R zcP$(vx3|RQyb&bTd`ii*7eAnglM9uRp2T;7(rUur@XoT{sIr2{pTk zM5XIE4z&P^z|y^mjrK0mOvMoVg)xp!-A4c1e1YFb6RCmWg&S7d3390%VA?CHTr+#a zX;3e$aZnKPh4dQt$_9oYi#7mIw4tC0Dt_(_DZhsZU_*iN*U)s))ZTl`un&cSh=UEb z{!ozpKbMX!W>`ZZ|&_rag9y^g=5y>7OJv;Erj%+A#*yU@FBekc+U^Y)b2R5Y4g zJBM?2H!iP{UedvxdYW`tcqXXXp7Q!Wd|MPV<#+=+x$AT-XdAW_9U3nd5#ZdW;5p*B zo66t`ded}?mPL#^Gs_&u;Nm_QMpaFuD5$%3pr|tat9{FP>X5Ey=cXQcb}L27fRrNJ z2U%bqBhefx9$2G98U%8>CAbCygYwYelzy2?X7u@@g>0i)i%X6wd=Ld9`WjOo?OAL_ zDTuuNS>6NCV`wb3Ayp4`mv@D9*#D+H0+WV|&nwdNZ2g4%d z%BRC!&8RMif#+h}<1u$6E}v$?C?90uitk_tTOh-VmmFj?9yhQ!3ks`l(GbFE9T)3G z(<*|bb$7TzYIVnhbBk8&vBkGUTu%{Q+I~(F)eM-mzM%-|U4j?3oW=U zl=i+@!k}3sAqY&Vj{>tb`GHJR%fz;sdj1gTfD8=_EW zCW6?J4ATttFRcxMIu#gY9Ah%iBp_C|J|rWv-zJ?}vi^e9Ttp2i+X$mZB07Qq}#g;fqVs4Xlr`+QCAq6Q8KISyuw3@uiub zZ`w#G|DlGq^iui9K;GMnw8^njDZ#(AeQ8$qQLGh+@zi&`ur1{R?yU)`RAXf~3m$^Bu?sIZ*cR*AFGxG_aCUrxL|C z13qMjgP-$G-~Q?Vd%%Auk=GF?J7z3dzo~#M0z0TM)$J^pngV3RrFA_JRD!W~M;2v% zw40y&nbCk(S>66m%JyJT{mv6*&Favwjtn*5LD7?Ei&W4}nz~|*6$zRlH9`sH@cS`g z76M_Ul!*@KY##VCZ4Z`0kMS3QFsk5C1PA1e4K>EW!P9cIP>8BwKzkE*v|Y??Pk#oWNx&GypPdo(UszW0uzh&=Xd6Qmy~l1OHvwt^QZu)%v}~+S5D7KdobC$EhT6_! z8YY>R%BicZ+1@eGi|IN80c!rwQ?N$cU9ZHRTyvh5LGng|@{?jX)mO|Yf~eny7ZFCyiF#PT42~N>j?z$eQ~JhZUR~ZO z?JMg2UI@s1##9wgvs&KIC#nustUgt}1|qf86e$YQl@NOrj;md$IU6Kvx{QrNUJ`u# z+xtJ1y#-WN-`6&Zg3=v=2uKN164EItB_Q1*0@4D~9ZE>2ba!`iXe6Y&k?!tu&c6Hb zf8YDPef#g%!WJ=xs_1THKDPdY{?Y32Bp_rk^-{%&` z8~>^l{q2&!(o9P|v-F3?m}O_Tcv)Wr!SNk0XMU!xQmJr4c+MMupwBn8h3$6?lf%aZ zP}Cbp+n{cJh{WAkcYGD6WuJ~`OT5u*7cJA(G<1rL?-#nB9@3b~E_Ak~8$n;u-!YAK z$%RQ?JvRJq89A8pC^($*lZE<|xeu717*GzO8Lizvg`W^JyqGJZL=`$PDMG66LXYIE z^Y2K)ZICD-L~88oTNN)-y_el|Z*}+6jCi|FidF8xjuC&x=NhI@evqu*cJPz9 zeBOBy&N7&xJg{Zij{MVD=o1YRCA*LO&+%T{YJrz8>ye=oub&^IH2V>Yi8H+0BkSR2 zqh&^6;*E^K_=fEMTqfn?$8kcj>A41q!e;@GG;TjW0e_!nSz@j=YULi8AcBHVftj)P zk0H`;+A3Mz*JUW}H}%R9U6DNnj&0?5c2=0Cb%d={9Z@x>AiXJ?HK7IHBF8E1<3}fN zndF8w3Crze{TA-qZ{pE=dDYv`{?NsIQTlCJaTxX}&BSnSkGQzTr>LZSmeV(Xs7P@Z z56jQFNX<{4A%!4(whq_lRQTz4!?`Q9$CSki#XP_7^RaH*{wa|$2fQR6HnEePwSo6r;CqZ=?A+NJ?0`T*+(ZvVYqQTCJX)6a-u^SF11Tq z=7pt`d2*MQ{%A3gVz5h=k+^GWH)9t=TLevU>%A)< zstF#g51#5L2%0EE-#gvkepz(~0>fQnvS# zzOv4K{q@2wxAub*SuInY2Ssx5^V&N;JA*Re_ZQkCoFdf*Avuy^&enE}y<(rY3X>KU z?sZ4)i7Fz$7w#$57nk!B`)yfgbU!bV7$A8|^311~_izuh;z(igEMQIovaI0ktg|0@ zF{q(^6epZ9hVoY0NBZOFEavl47BOSAuWyyE*c-mV_Wd!wRU!iDWzaUdI<&xU zV}E#RZFMy^vGOKm3041$YAEYG!rjK!8Pa7GYM8sY6fe{KE_mf7MIXj3Wp>AXS1W0@ zsM@clD*G|20#_^CZ_qj9Pc!~_sM^`JMOgJns7?__o@cha;QGDTIJ|?i_7!XWIQ0?u z*7x171#h4ts5AZyZBGjb?uD2bKE zKE#h-O&bklWig?IMXG+FkoL-WLR|SYQ@rjYU7hK0)c5lDePW7aQpIW(Ii~!A2J`HJ zG$bt{C&boMtqJtxrZ;Q^KEmY?L{bA0y#~8?PMr1a#ejC71iLc_tGYe5FsM5 z_m9vt%<+2D<5N53zVsyatR?@A9GlBfT(&`C`psb`R%gUQ{jHTur2X>o2mSUk;z5Rs z&%b3714L00*Pa1aVNo)xpq$+Mg8 zSjBxz{KhsXIv=@Hf~lRRxOSJQp&gUY)o87g>REkpZ5zKQn6l|`)ge% zJB?>wi_Sx8yf2nm$tAzCUTWLS`UVvpR-4g%hvzWFG()c)gd(hwVFa5d^eio zM~f^JEBBR=uqM6GRg56iu{;BAvFpM&?sFE`uq~Y~xq}PTFa0EU?z&5}-61(`xUl|> zD&%Ca+mtn(5V^a`=IVSkwe7nf-QO>5_#CxtNw0j+Xo_t7wF}Q}FppYAOTp%A%O1g% z=re-D$7@xguV$k27>LvwdF@%t^lO;;yWK)WaR~4!@A1iJ2jhRCMVLu*?-mJhnV4Rh z^7piEbanPpTteST*0fLMVah#M3Y-`>e$-@@>XK%t6!;&8(a8^VjbS)ZuHo_YvlZ~ z?iV6!`9i$WSziU(<%4Rif}zo>JggWrbtAsd%8w zHh-fLDexyNIvam3=pRfq;5f^4&sY#HgGwwT9=CDn2OZaL^h`IGmLw-NGgRjEo{x(6 zB2{Kt)GU2XtHxT&O*?BOKBs6f_bgUPX#dmjAN((hpNE4CNrl{s_1gXEH08e+0*f;p zxgiESMP9D2Yitx(1}661s7n5wX{LH~X{viz)!J(wtn;cSpD~8Ag%M8i8=4aROY@j3 z;Wpm5Xh_^wMbqvy>0db7+okQgP7)8e98n-AbDZ8WjT^pZmm2vkNJ?_67c!*wulaaF z+AFmC-aEK6fnbk;OmG2GYHR{N&vm~eE$b94CMP|u%83|L>K>`4G@04GYWwRpY0lw zQ>F=1>amD;(W=TA4;lu(lJ*cxTVJq3g`&HB_kEOR`Kni_{@NwBGS<6)SYu9p(_thv zK>eL6iw&2qv7n7H3xkae7p9;)Ir?Hg&Pms?#qnpsByEAY1v2ADHlrP$W70mainf>z z_^*bQrm|!_Pz3W>%KH*2cDGMq7Ulzo7G_+9b~LH$J`(H#J?HVF{xME9Xz- zU*525I;?R|N-amZ9X3BWNM-RQ^x3|3ly-1G`EI%x-^L2Dadk&R;O)y{ zD*_ZTD1`ncaNBbNd_F$!6K|STfcT>Vl!}Uz_E)vw!l~^p`BBXgYzFv>bxHLj$JO64 z5iZe~s`q2%35$QT?(=;}<%Rd@KtI5hD=S2rbl)sNwYiYiHlVAZCCA;o#smwkc$*~R z#eXeJi9XQFxJsw=*484R<>({Ho2j8Wmie!(rw68h6r0_%v2(wXA5!=Edx`jpF#P3c zdW><^)J1EYlDX`{29r)rzkjt=Hrg*}6Cc50RE0aAMDG97R^NoYP}rvYKN{SdCw0FD zw{U97pwQ_K({efLNy&=J4w0u!8{jLRzB(J#D5|_OK`Tg56E+_a&1?)4$vvwtW`H4I z))(8t`gRj3Tu&lm1O>BT5vmf+gkOMpxC9*Nu!8=l0qNDJeBP-BYQVl#3q2pkGCLR7 z()#J${A_bjqI-o9P9gdIBkJe~y{rL(-} zfL}2`Q75ea-x{!=H%9}U{i&mMT$sCAyU%DjtphaLMJ%rf8&;EGE0j#mIY`$tUE8AR zzfAA-yp!EKXyIG{6>2AHqhBIGHN-^;wwy3Z1vQF?1~U{?`2m~ZV}#BGQ%o(HGcc=a z=9AZ%;&plwu=4{tgZzt-Df`WYz!9g2KCtsHXZXI*71$Bud(V9DP@Ye6abkStfg=3) zw@`J43|`DO-c8Hnu8mAoVe#KWof$HuF*3v#L7&ck`%|hYP~wi#{_H1gg|YNRbi@SK zFIkZag}E$9vAeYSP(D&fGa01~>X*P^OK4|z)p{3!_bP&D2fue??2$0dZy~1)8KRgz z+>0QiGdh3DRpi6VSU*Y;g*4}kK&lusq6@T7XI6fc?-bH#SCQ$lVggYw(2UMfkcB&c z3u%f)puLK~+`;eJKz}0q`L__+%>pDWY#07W*yFbl)jM3#S0gMt`0X3~l1Li<{Srzi z3t#GsQ!80Fc0{tnyN;_n+xhIR%%X3d1(gZ0p9;DF?1#0s5igyu=j;1$uUoGU$GVKm zJ>3sZ7A;pO`CG0)8v7WeRl3YTdZ?j(rcLwpd(!zwHG!YLqK;CAWKxK^lm2urxAN~s6RW5+Ya$NS5IfJ(2P$c zZQUi=UC!!+v%qb!K*@oX_D0KlsPHkGjDka`5A0PQKX3a{fH@9Eg`jbTzxAqL2Tol( zE0)vA`AY96RMA%Er-CsmZ8H>D_>Q_|s1B(zhMng>Nr1F5c||61li- zg{c1pa=?uIf;ihJofVR*A1OEc1ItHTbksVHqSH^D171*E_7(jL_wdQegloktM!o+& zNyVHbnB^aSXDs|(COk76uBEtSE%o^AB$Z{QU~~}3(>u$QWq>^DGX7IPVWk>KDb4Yp zmm<&iBDi-bWF=%^m42=F-4UQC%w1-7OvSq-?fB0I^#$df=b@(zWi}YvxPmVT&a@A2 z4g)jNT7Ht*IvsW2xlZw?cr7ghi>j=kWpiJ@kH26e2td zD+fnLRlGM`4}!1+_99rKC^`_daTV>GZ-`7-aTKRuDN!p`v=}=DqE*ID0eBRbGB$t1 zTRNnVGgr7Aoanye?p?Q}QK+o^x?^SjD#KW>!aM51+~l(lyo{u5)4oY@xO=_ zap@Ii^i;lEO?G>LQ47F1VR`-|TH|1eVB6p9KNfL`iv0sgM1Rg?y@bbYY}ruSlG(Kv z=I5VAr3P5pmPXjxUZf?{dV7;RdzvO@Ihw9|eWH!09tKZo3LNn(V7k~=`yPuFR3s_k zc(7Levgk23aVtWwzku-8fdfXTw?wQ0atdf-ahaJShX@xU?6?+$3&GpTDPa#1N#g9x z-=iwxFN@HyxgP}aw`#qVBA8hiqssB_H!MMJAwT~~%AEQac)XpwKnQ1}%B~3EvxLOb zY?ql4(jNMAIV1{tj4aCROcF$aald{tEp?f_Q^R?_cZCS48dLs<2pJHUC_M(NU?Rj; zZ$?ys^)_|};V?d?e1fPZH#75_-BpRsV@8d)YP15X#K`CWs4_DjkE&$7WFp4S4GJfC zq{8@?h(kb*R5CXsbJ-~K8ZXE#=%;vA_NSLjWZ1dE;qx)~xES2v#pOkH+MvB_*`_+C zIC#$j67?iblD5Zg=eEZ}&|!cYpoRl0jq&cvcNrG|xi%`e^W~^KRR04yhmib>mFaj& zE1<4sLc~)3kM$(gko+Xc=VmG(upKG(uNRbx1}&rPxDTLyj5OdT3ddbTRo1va^+u!e zsai|`B#?-@5I(OyV^+>a01}dqVs8=lfkw~@LSGQaLZ~W8CKU)9i4g|75tSqr+dTwR zh$HQtf%7~@R&D|l2fg%ZLZm=LVoU{{0;t6F7r|m~kYcaeK&OlyL?RAq-JoeiZ5SDE z5jH+jZY3fHneh^l7)`7Yk(eDR_o3p)jByASN$fS^+@VNv=7@7gRt~v80}T1WpYa0P zXtW!|%Rt*D;LnimKaQFUT*toRsITHMUZsWBZm!H7J->msUfbrkAEm7xQCc}GeRWoH zaaQ``tn}Sk$;!<3x*I6F;$5&Yfi}mT9&7YMbjg7KVay%vqBt=V&Xy{yt}HJN{MYzX zJ*V$~8&=nJe$8>{M;fmhbQ4!0cK>T^WAY!NPM4@om&~f3bJoVBVrk$Lz(y^3gKJ5E z;qp}pAf2JJ7*zo=S35M#=$Z1yr)$xH;IWFzn<1A&XuGDdna6%q(!mqOs^!i2={ zX}Zbl3%oq;U)C!ga7Y|bRny_%d>zU-QO1MS? zm%W_};``JJjmx6n#@x|V%dW8mFpSHt@et^Y`!II@PSmS+oUp?f+PJL#fKMJ!`vLnO zFzNx{ffJ~f)z5%)$L=3ifpc%VEgXPzH!i>Wk971Pl{P&{=}TbY_O0|+VBvbU@c)!$ z{ZN)j<%5Un;Y0A~gXE5h+KR~d23(UZH>C%}1=nQD%^4gI_qBH2Mhx|FA4wVgxh(5> zmtK1h(_e<111l>ia6tfo3IBUA#2*Zbtp~&B!GP^P7;O*6(&2*v1&u%?#$L}`$nOHy zZX-kZ8;lH_gF!$FDHhfSH6#_AgZ%&q9|7f&pZ@`?O4h!qFwuKeUBQ&z3#x&`k)R4V zxjgW!94dOPYCwtg7q*lcab~S#xXJp8B{ym5Tb!4))^kNFNXk831d53<(YI)ZBwlWD z1LxPj5-hf?NUUp?U7V@`nuLa5JFXquomnu|%b}n=IGSxg!IRy>4@W$x(+6W}i&a3! za-x`&<9F8FmXL)I;MhxsEcKoB)$sKBjRq>mt`-12GOkA5XEJ@4}HE)5W|=u zEkkImJjQs`uy)oc72J?Tqr(2&4!yxcJuZRY3DTr`?is^n#<@GtFZ*E$=(^&Ox{PQ7 zntG|vHKnb76V1HW_62SYZ~d*p`v2b=yruU`U7H@*yo1~HlyRE?=;3b)7)4-?TnI%f zr_I5)P^I{yzRu*Lt4j2)zB($lf)cd|7PU+WZpWP5<*y$YnNhSq?-iuw_E-2nPPq&h zz;?a|I7(g;mctF@)udYP zys=gE|4jkK!Fx3I@brTD(>*|nO9RGO42TkZxy8YsdZG;jDi{Zyg9?TRL2aJFG8WLcrk5@0Sjy!&%TK~uy9=Aux6`D+5@^hFa7iBtcRnC>C*85m5cks6r_c<gH;b8f(I<6Tt8pXKa{6yK zEAQ2~pWp!GK}A2?*Sv*Q=FndNknjQ&-*sSyfS7;}4z6G8)-5n4c^R?~FcdkvLf=?a z?$Jj8e+rl<_JJh@-nCokj`@Zv+j+o0_$7{s}NqD0``N7{2tcY9=xtU3y#3+ zIwk2Cp$jOf9fDhf<~DVGL`mZUMk;MZv)g z!%J@)m}n=HvkeSVATO5Mcnu_14n(*E5cFaJyJLX&v%1U?40u{{wz&+H_Z8tl&%H|s zKrhS6fuUBw&|m!(C|i_p+8+ZlT2lewo)7tr{}|j?uZq~f3ymKKc~}%jaKHH$Kp%G6 z2k^?^tIJR#Ruo>GF_U2X)i z&vwBqv`nmsE1SD^3P~!M1S2n|&W8c1Gr>M^uiL(2qC$ig2}b~7l9%CN1;{G3>!;u! zH1m(4Z&rbY{h@zA#ftZZIl-4^NlbUTrH@v^0<*Nc@y7dOGnBIRbh;5PAX{Z6Y`Orl zru&uA@X%>4n#Qa5P4x3_MDrkNzOV8*B1gBVR3=V1+NQCN^8598HH|ezt28kCv21FD$-azl&TxO#WwzMIZIih>m6!efw7Q}g zbo{%3y$+xrbn;~sLbRZT|_$bL`*3#aMtXVMjAqT@FLLx0dQ zlv=?GA~(9@N~wsWQ(C}K@n}M=Ixn^N_5_2|5g4)`zJNj0{rxPuqD3n!V!d~n_}sJ~ zrD!ZPx_iiE<2g0PJcuG!B{@-&~> z--(MD{V~CEjinCc+KBkMI2FlDZto<~_U(^4j_WwJjNnFK;NnH(Gb;NtiEAXWdNeU- zJTYEUv1=-^dImA)H)6cJV%H*K_0nR_AH;Yy#IE(l>P^I)t;Kj9#jZWX>I1}_L&bPw z#jcaVcPGSZuat8|)V6UOQCujIr{CAiCzqnGc?*hw|3@Y$y6H{GEPlH(6rv1&rj0)U zOx|{Ecyoi4VHZfvRMEr&jwNWD-ogm4c97ylP>KkO3*q%eiV;xVCWry15EM3o8bkzE zf?k&h3K z`KKA1A40vtw;>QHv>&-naW*JnVsl zKj}*Vc_YoIK8 zXU4egq)-(RtWJ??d0J$CN&i~Q3nW9|B)x>^#}R^;IGGwg^BX)8!2=xgf@9t!@BnRI z(0=w8511IBcm)(o1p(YN-GC1MKkrnuQ;0#p&B{x0s4Wrb7mNoagR>>A3c8cO9PDH)XL7J5Uqzgg1-Vuy=3QE(62rN)KL`WS7$pw)J_e2!#j|A@{ z7j6e!icxQZQ0*#1JVeq3!$xp;IjVohDsFWM0B|UOh?We2(U8IW!}jZ2oM$>1~5rv zHi5rUAucli!Sp%PO{d`bv!cx(Oum@{p9?U^ij00TWn|u&7u-EBTKdTZ$!xMK*n3f= z9muqt>E>E6Pgyh-$ONNKN7~@@5yFVBk;5ONOG=f@v=CduK<=TFpiHJ2oz%l|v5WtQ|z=w!^gNXG5 z!z^7Zz=-=w1R!Ej5hiLC0ubDaF_=^aVP+$e`fGzQ2Bw1TT7$WucnDBN03tQ?8v@V} z@E!yYEW{-7V1c3`AW-!UATMhtBeKdMW?BJehJi#Z02LrS4;PF9;{2OP_-=p8J$v0Y zAMHLQ`enw}gdWo@cz;G}rO5GqVd&TOeOSwWqH5f%+p3iN^@W2J_q?!(aPDqKq^?l{ z&Y_T@V1fGXVa^RO7h4IC&CX zQ9p5CFaJ7a#p$MKZ@HTG(!dqFN+(pn)4C6}_G+%@T42Kb{8xTQ?Zui`__O)fRmFR; zlx()wu(IP?!c@zxm6Pw5dTr3yPs_7w8{ijNmmQjuYwKO75()0{b9ZGl=+(Ta4yVd& zOjrJpG+MF^kzJVB#F65=Uj8a~X8b$C<6R}*D(ZZP*#-X*MTYYeHF=1wKT}T8KQ+%% z#wJ|H&Qhh%T${qPm8$1i?xfpHs}T1Qd0-29spz08tCB<8+oLgz1Re%y>y%nPIsr4O zQQjXv0>i;?xUHqaaxONowxgJ{%N;K+8uvtC33s9f$3&)g8JmMY7sA~`vD!pfJq=cD zN}HV_lOm%^r3L)%Q2)`CefL2UQ8wY}e2pN+I*VuxS9ewa0751CUXOV}NBQ?+_RA?r z#!Z5GhKBLVf)?Ub9m{O)wmUr&y7@hfO)XC3qUGC>ZybamBF@FjcR!FV5+n_mTRh;Z zV+S?;fC=GEn#T@>QCm^{7Gt;;XR-dT5U`F1~0rihcXG}Tz#XR4?boi9qjY28npKg2}((3z>@UqT*CSW4l$sFv@6 zi@Mn`4Ld5%Q*iIW=8SueU$`|;v4trdCnR|cm+hqLCzKr}a=jIca%<^my)P!8p~TBy z-108l=)56wx1o0~hA3+}eV0*P2^whW$HXv8J*upY=({JI!EI@1n72NNZfQD=dJ^-T zIKj|;_1TLldb5R2dM+YXvpn_96?`c4^HF+f(r!sQ+-fc!%FPgA8?x}PUhYuK)^i)S z7rx|XvY5;vdLk)4;=gny>c$U?34~lRH(7|x3h`FXY*XSkCD@=rYIrA29DMeAdIATE z11ZU=G)fkUH{vGu;YoSapAWm5ndKF`Gy`5Jls0KWj>CO1^#nvq?OEULCwS}iK`$rq zX&1i4J8CuN+>hnrTyx4??l##TMTT}ZI~2#ww>!5rO>Fh^G_U2i@wi$hMA!>zd#&#} z8O_1%+)e3Bum#x-Hx1qO-6XS=;IRwkNhakX^Uusk-TQQ-JTtWiU-JeU7(j09x|gRM zWYRR7owaGOFmU*_rd)Lg&!m?8k4xk&xJ_;IyssI;q@VRDBy*HZFEN{0`iN?EdI1p; z5iFcZ-`^>QhJ{5*ee7_`nRBwu=)LDC2!AWOkK1}dOp$XdP>_Y`+I@FP3^9t*?{%31 zwpPq?lm<3tV`Te;;0ky}6ow5^d=3-J6jSZ+Vr_-}Oi+LV8U#kP%E zj?uHlUFNa@;JZ>>@L!+5_lWas+VvS;n$NqK7kl})e7WSH`{lb6$xZsD)UV#RX zbe2uD=ExGh8f$qHn%0Kn|0#;Raf<|pK8#%m+aU%j;?Rvg_qjw z%?1lnzPe#aqnIAL^|e*mxx-p%lsA8tlHbmmWj>s(jAhU!%y) z3g*$UQ2f`?vzXRK0Smi%f*r25`LEhWRI%SP$i5!-N(9~EJv>(%7PEldf^#^0+rK_A zQk_tOZpSureY%snWF0Lte1nPX(TWi+!*^^MOAtG1<9&(BUz&W#7OX+n!%aSG`MxJ` z1jByj8rpC=x_S`y#+IcG?|E}$rolf~Qrqx6lc2oUo}Ma}}gugS0Wf zwCF`kAR76S@S8_HwFn|)w=i~Sa@G*kS4duSRhaf9L4(_I=YTzbY;e!3@wS|xp5pdy zw6&BY@O;XqY-A*NDKyN1rKooMec7sA@uFwi>%*@XQ3-3f@iLU|mc8c^9oExnb9@as z%PA;3T4>Tm~ZJ@!>nQFhcf7Gz zKf_bPpHraSzx89=7`2?7?rrkAHjf}HG)P8ozH{a<7LM5|(sqtjYoN|yZq{Bqyf0Ex zJ{)vX-y(naWLU#fiiERj^Ik?MieHmeOEAcJ3gyyl8vRKryAZ)7(@R z*4DD4tu&MUZl&>wyCT+`kb*x2>H;=JF8y5$gZr}?KJDSp3@;6qC3CU%?ekaTju(Bl zw-ay-DejGmp^5oT-9ZV2I@jN!SCk$vyRnA9d5YwdYg(6ekXJjOJFQZh)Ld%zisy>)lx5h z(K?|>sc>K5YAx^hu+B`1Zo`U|VBO)~afQ9nF1PyR?;rkLU*e|Q(hp^DYKUC2-n6ad zT#tmmAQQ%`IZu`OnfgEn!tHSLbEZ@gT|J2j$nvmzHiN!R+i;h|Ps7#1=WA@q+shN&paZQs;Uhn^P_nusl{IU2n9tl$>?!NP*#>-mgR?_FH&Mz zzu)PBKftJXs^Eh@CZ$4TqTN+g67*TJ{X|j>pT4l**C{r;V}5>d`x5wfDuDa)$_jr9 zTe0om!@`BB=~k|DPfI~N=OCh1t_HbOhfhpdM8UdxGF!k<51nKuhrh~7D`aP?IF zQXpQoxbIFjQ2e$ZNpai+8|vGoFU0kTjg9S_B|SYloaU{Ku>CWTU*wT@z@yEO)Hrn! zNPKr$m+4A4Grz~z;~sym={D)bt;$-5e)q+}{4f4GW&K}Tkyjgukh$Hjzqf&oYWewz zi8mu#9zyfw$3d0Lo@Pp_7Z@atGl|4iV$j)!y3=jHH-@)%CYa?#^b}ZBW|>h&8ak7@ zl@U_ov#C+sZ|r|<4GV2LEmg0#eKE_9)i;!5<`S5k@e;8bOtc#F1-~l}sLX|vJaOpgcjfG%L+G&BpOgLAOkAtyza^H{;z)9rwu9l)mdK@*3OQ3 znzjpOu;eEw;y176?Rt)71WYbun>KV$UYQ5znl5is^i>DMNN;(NP|9u}m6Ck*QueUb zR=ci9UI=WQ!=8$fD=sn^k*mLXZ2}psih{6?iQMY_owvSv6mIc^oSe3+fI(G0Fh7mM zd-ix@wPi~GJnxFXwbAsmbWahcgyBbqMV{#&j?0$Kt!mv=C7w;|Eyfa1Ozxw_P!@IE z>m8DBNA@8eQ5`0T>2bYn@+aN=Y|=W7svv3QCK|*Gc;kj z=LbIenyh)Db_2i9&PAGYlKb2sq@r+M_za;c3B9RyD@15)ctyW@?I=!jU!yT%$>mh9 zW8|4q@{!Una-oy6tyyPO0eYdy`Pvh$&F0RrN_5*2Prnx*pM4XaIjZ+ihOk?2<9I15 zNF^Rm=E$ZW&ZG`ah-P}sU7f=|Yo3oaUou#6VTXN9X<(Xs>Es;?`8V&HD>69!0)V^R zG;rq&N(I_R3~U=7-w(;WaaI)5j{kR-Jt(t~Z!54PY-G0il@@bhO86<{@UZn*JA21{<99x) zac)jOc&$67wbDP_p~3;%tb74vF8wW==|l52aOS_9_Ftj2Aut%?7p(EPdD86ohSq*y z>J>368UNvY*=crJ`Z+pb-&BehRIap_*)C*pDC@-`<-6*mTuJqtC--dp2lKkG`%mgE zeudQBY#_&l`QId`^_b#tNAOUPuj*&kUpJ4cpp)sxJj;RB&5RVEERFp%Gk8a<7L6(+ zI+shF`;5riFwzMcyM86{`kkTK@X0ZEPnHl*kE?e{Z-88KLT&HT-zu!)dm-Fww5F8~ zH|U1BXRKb`5JoV|nLalyhqvA4*T0-&hwUu|kI2T>?mWwjOkc!ryrfqepXYuna(7X4 z(eqKzEaBj3S-v!<-|?%h-Jm5cot^5ZmpikOx~vkhOz1|j_|H7L z%55zLpQOsa{+<4(kOPA!m>bjC;e2k-o`YIm>Z`Z&eM`}jpK)#caF^Oy_OdnUsRGw# z+sVYG3ay#rn-Nz7=RfyJ-cLL|z3Wp1sy-TGK;EzI@ z&TqafKKE=*;}2r$*3VL>)`g=v(+z4@SobQ=|NV8en5UO(>lJMhemnL%pOouk*RhVt zIz!4SHtYncwuwv@7@94qZiYTeaNg1mO{Mo*(WlI;sOS>a5VVW0UH# zlOaaLb3@{l!4s8#ty<+OUz6Kfs|H7A&Q{%8-Pc|u8#1GmJibFkae>Jz-s#9$R6z}Y zaM?vwC)bw?Qi()GQ(h|9O1iOpz1{Fxf7zO0gt1a4R`IFB?+GRei`IV+;IDtv-6jvx zdclu3_qXRJqTeV>u~OGajuK?YbH9BmHb|gDR8x}C6BuvB!dLy&Y-RrABnF)XA~J^+CaWBcbnt7fWH?KMbn5C9n6u(bi6=q|Oe{NVXe{Qu zMi98iju0t+Ye=%{KFK3i8N3osFp`?ADt!nYOa%Fbdqn7=B0}X!FbBoI4`KvYX^;?C z;e%-NAo?Oi{a;c+IVQ~nzwlC1QK_-OZUNQkk*So~Q}L7TfA6=6#ee(uL=DRYuv7k` zO`SlS<{^<0pd~1=W(of;LXU<9TI7Te78`@sg4T;&1?7smO1^Q|oKM!qb~)9`9rL|3 zlG_#HH!+27Z~A|uaAfqeA4N!wC$KT)#@b5ykwH&&yi6|8lY!cg3GA||Sr0!+1`P)WorHIV z;-xC$XC|4`_w@uR_tr!k+e z{K4)@AwVDOjuZo2^5R}NFo?5&xsMq-F~DM`l>?N)ZdfJY7OW{W7tIFjJo3?0E6~Q~ zKH{fTqK!3b;J*N^L>+u9y16=!fE}UoZ)DL6A4J5z$7=<&f&MS5(OA;~-c3Mn_=P^(pMCBnD<0E5y#T#SCo z$|#u`XyWhiC3%Sddl=wHgZ4xUZ$O8KB;_6ce_3-@68}BK2zg0F^o|h>emqzFUrC~# z5dGim|I9-l+e*pjPZM;I=KGKoLyn3lR)i6JI}d#O3w-%8_)9q|+ZXI_k8*MUcj?`( zzu!12JxQ_sh69RU@9-BEat8AQKBGB4Sz|NC_^_C_PLf(YAI4{QBTUxm!YGg*^zR*2 zcG0~bWGLfl@!mScR=T0f8gCP(A&liu+Am~{^Dzehy?-tkQOOdXQ>hwcVn-L2>cR4h z*8D)Py^0SEC5i8edh6uXamE$hJ8Zxr3My88TWJNA{(ptRTryTivQS?6%0{pl6e9$*Su6fcIUY%})d_qdqWH4@mfc=m><- z#-~TUoia4KC6iTcB^VrepR^ZI0S(P5^g?|wT(!KU$JImwH_hl2FIE3z_&pdzhzg5r zyTEeu+`u~k#J32%`^+K^`iddY@y)|HQ7Zt**tn_kz1r1^r|Ga7;niNnHkf9TQ75{F6 z>=pia1y<6qQgCE|$>?_{`2bd}r;6LXl3Eeq-B=Qg_XF$(gDcR$n{tYf8VT$OiI~n1 z_ehp<6yi>&{ShJr-bcx=)iw|}iE<_lA~FZ#m>l#CB!2K^DSPk*7FDF!0B4L7C#Umx z0PY==ntQRLGfsO4{)?R#5Rs%WHJXu>?s5^mJN(FT|MQvi@bKvYDCQlu3c|LcMF5#e zwL?kPML&ckHP+)E{eI)Mtcp{|C#is(j zI%}W)r9ykjjs+%KDhG3u26CtHf$(@7C0?D8#`jdTfZgB3`X-Mv$xWqZ3dEE*I7)Xg zo}o3)E>2u>;C((p8=K_DlXjT<3Mff6n;YJ}YgO}&1?p{2#gyTNHjUz)WId(~9-WCc zf6YqJ&2Ijhp#*S!_-hsrz(x7jOfrB=K6xYv-Hbrzl~`yxf7VOh{OHQ__aOw)@LM`5 zbXf?Mtcv(J#3zT5diR>)wcPtV(%oA`VWLtfNWPp)a!&PgMYTheYtK!k%2%lMI!oTC`)`4dPzAO`1?GRpKm<6ps=Wsvr{P_xvs1dV zC0L0H$$vF2^lXtbNvbKUX-opfz$c~+^kbenS30|s8As`jqUK0|VYRxYfIF9Nh{=nH zc)@LQHzzLLtzzO^lYrpA8uyVysb=3Ibw9DoXj%}DSVjdqMb}$2F=@UDubQ;b|0rKC zk*pDz8;;tqi{68LL%>X57*|%4{>GO6YvspSozjf~PQ#=)$6v%s7V155n`1)5re#pQ zYuXJ!@mNFVOfygV4r-XJYFy4@ZZ7YhcCG{88K2D0X_~i4AyKihIp=1U4IlVxnZ5uO zp34&}lDiXp&oW8py+^=&sF5yr$!Z(;^3PKE{w~LgaJwzr9-2g0+9JDB#7kZ(XRFWx zSIVTEp2Tl!cW#maC~PN^6z>YwCWK6VzStyw4Gy4R8{)AcJbb%5#K9IqM5x)oIIa+D zKbG3rov!yipJS{$y%+uDtY?JuobK85Tj7&Pu`p^yV;bnvNiBa|pa!aj_P<-yn?|-E zAFkyB{4UHB^t@DbUoypiwN9dS(-8q{D&3Bxey5DfsSs+qh&z=Mb@VINsNVbJtU{m5 zddbAW1GAFe4UK7gduAoS4UII~ntk)|(ksJON^?Dk@fBB^YXMbH4PiEwlo}>nbY)w* z$bZliNF@wPO$gn;EVUEzt11lHc-6?@|zaPZesdDR<4AQ+r+1f19*8DNt~7 zUB=VR`e%Ww+fNwkkDCUk#53H4xbnI+{&Zo(SSy$*cysJpTf=8_JoY5dfrV3D$$Z8u zyh5 z1k5#4 zm2qRFGmw@p8@Wg;Yg1`ey6qYOJ}=kT*7q*b<}ANE1((gZs0bdwCIf5)RPTP|8NMdF zMz+m8FVp{-$nPejc;FSR;7m5#eActd#zCy}&$2Af{Z%gZ;6e5F#dR(2Go0d`81j=h zODu6U371cpjsq;hxoJD~i(ZgdPbifGRlDyBwkF;UAP$#gLac^f7-( zxtfN_^*3&am^3*xz6)F#4wkjNn6AONrXmn<-mhGDZlnA!v0QE{_>Lh_C8A`=d5{#_uSoey$)Bmdux-f)dnutFokMdoRxjg0L|rlTwT^@0CBx2 zwhrF6_U&+ooajoG%cmncn)=7w?gzLovGhElhO^(Sb)eOvxCYJVJAvG79c~N+!ZxAi z&Q&%OqgvU+uBaO6ZCTtm2dlWe%gq9FsZK?lhZ*jxn)%Dq9F|>FLX#ER!VWulG3}+c z{`N~tB(4{@+7Mb!3zyDY= z?>?PXmGdkp+AanwHQNn+9?4z%05ii10(hM`Pz3nrQ_3SxN9-?x`MI=35@l% zxKcMNjivf5e%bcA?w?T9H|v~6l@C=cEFr(}@+YT{DC|XY>#pEvsj>3|FII!gW;K?5 zBeP~Trv2EJDoayPi+KKO$S&3uyZuUbZuO=IZ2h>lLps%M_V2udfENXKzJ*jlcfR>l zU+;W#sovlDW>YcV`DRjKKlbv<*hY2odby2idoQZt^j%`!TNWF|Ob-F8ML;{SofM5pMI*wJ66yqo`G*=nFwUt5(s2 z7E!Af(Sv4Dt7g%ICQ+*^JXOTklyL?^$c_Su5{ZOYd0=@5aT;FgUEt zXJj^c(_ZPk;nhlyr(v6}TY{Tayqj^9&i==U{*UD>SC)hd+~G416yB&8GrH;}X@A&?*UymMpUzM1#-57?c# znLGD;&i8)L_xnAc^F3!^CX

}cb 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�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�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 z z3{~tqYf^1plKP0vrGdVhw26D)T|~c~D7~T1>|0k^wKA+4GMW2WWkv@6&Lor&`NRpq*}{ zP6~R>(;BsvU@Zs@s$ppbKHu2|u&FOeq8%rmn$LMSui!?pLrJDa+&y-Cai-ZUXBmh- zJ+glLoSY|a=tz;3d;LFD7EimSUcLv1!arqc2{}uwCZO!S%C*tA1e_W;S2A)Va5z}e7i!R{jlPc7r!$s-s`d&C+(*rpvk%#=I18Yd+`!_V+Qbd}EW2V>eKu;*jst#t9ptcQ<8sL8uP2DXKp0N;*=Fak_ z9=L5~Vv*{=dZ@?hCzbzm#&SayD=^qc))a82&yMK00yk*K+55c|>bW+2rU1STfyYos z=1YU|{76G_wl(9%6MZ7JlnCImn7Cm2nJ-U$&7)z% z{M6Eua)nB#YY3%+8#&fagJrmA53ZrAgXX(v*DC~U4@U*>k8=&=t9Rkd5BPeF9nG8| zxHhWe03pR*CMjLIuz$BB3u={gEvn$x9uVU_V-c zVGA15n)Q*_({|9t2PTEp<~k+`3m%~63jvd#i6Y*y;+^xJ6@mv3W`m^UmSRr(%2!nt zLZ}CK0*K}OCdvDn>f>6uUIbE4)72f%hK1cmx(8)yXcCJJMmIg@+!i82Efz9v2_KyC0yr${4O`h&CxLys+BtR@iW z!wCrl$bhpykJtCK=!F=nB_kO9&Wd(p0wdq6Tpp2xpPw}}{GwG|!e1g;ll^_2U{*kK zHZeRCaUWC7gA&h$@UZ^fMOoX9GomLNe;XKR`%7igBTO}+R!bSRypq{w(rK{G6bte4 zH>!C!`uksDCl2nL=mPwL<1p?n*}oRw#URcmh_i(I z#|$U7q_-Tw9V-SOp1y+zjilz;w!AM{o7^1~EH)~vg?w!k-1fXl{R6WG!?9m(B6ovK zSROC|_70QL!UL#aagsfJAx8#J4*kD)sg8OV>T=*AIHqEoboAsFZVt?$G5(=6Ia~8o zSpVEfT2H*W;zTJdR)y*ysuBU|z`1)nbkm z*(B?4m~{f4*Rgd;m?jcY;4we30|wquo2U5syxM9$VSvIhB4gR>>=jDDuVqB*>MP{= z*_S+*gNQrCo{-lxgE%ouYWRFLhN9fhf4Z^fnx3A09w+3-?qKZFzt?C=(krpbRnb3A z!g`S(NY4423HAZ)y0;u`T4FDtuq#mvYrxt%pU_4idRColO4dA@sS43t zimym?6e6Wq?L!rOLRYPAmQj_R0?_iZ*qc`<=Jl2%e?E*p)nsrPn`}v2(b2%y;jhd< z^U@VUsvSWT${Z$F^A@lre`AL3di@g{fY^kyBR&bI(n2|(idYGlPM+9=YGWO`0%E)nUCu=<}@TV$Y6Up z-R)f_)ez_}GO6S2^Lof789+f5fQ~v5EZmWjESoyL&~C3A%PZ|6Pl_9b;;WdbHo&=4Q%bW6F+i+ASfUF~HQqj^Nfz5rEfvlgIE2z`qw1;fGlehS+(7Twve z{lX905TKRwZbnTKb=%j`4Lt%wd}<9QB>v6&4%19LwB|c;MEhIwKwJri@PB%!HXO7` zBXpF*bq4H$asv-19w@`y*mat|w&I%gBN%})_51-yLAGz<2?%F-{W7->$UJ+8QPfUpO?@h^<)0FA{; zqlv3C{JTF84=ku@470nFYK?oQ`}_yU)He zoD06qs*yZuA(F>~H@upTLE$JlvXF5qDJLbdppHwCr}Lx$`&k-=%M-4#2PgeKt~#9H z@fQdfpsH7LwC-CMZo`u z@1tdImz`hlBSuMA0ivfw=g_RdZZ4-MoLQ|5JslP8c`4PXM8f~Y2N@%m0!BvzPtE*x zYTacUv_f&l-bdrog{D!c9r*x|hG=>o%N&i`pYWzBa)kPZz4rL-5EL{(D`)=!(pOo% z*+EV2O_u!SfR>XyR`Mx@y^RP(p{g^AUB|MZL_hJX- zWN$5YKfm>oR@R1JA1%@{*h(83@9D@Q;w5n%fZ2=;Y*4$HQ(Xz&Oi2d}lxYY7=h$^T zb=UT2wvoX&*2HF0OrH!N>NF3Wi+GbUv7XDur7xZN&RA(lA|#IPR>656aT>*lMAWUi z!d@Pdf_I%8Yt+B@$aFTCxj1FtH8;X6_j&2pgx3c|ds0 z_bg7>{ZDs-oLod(`EuVU7{7RF$O!3zEBeS*K&?aq75n2qvEkQH7eggLlv%MW4&v;( zDwU^jql$_iIzi&UKsETY>IiwnYWB#7MPXGX>zq!Cm1J;$s{MiCaz_zR=hb z3plBI!7Sl&c_C-g({mLwVKIejx0a|E)K8Up^puv|-7A@plfywl;<3Qq_&I`#u9zw9 z=D^Pkwu-gs+Z3aoVp9A`Bo%$04g%26CQ`F#%5u295%jb2F4muOzCQle*u1n36<~p~ zuebwlbe@5+AIO{s@_~WK)`E?fVtG8wz|YDXfl!U^5g<340z>6GqAD=i6b&jzw%kp= z+0x99_^dzPh9$oQKn$tu;|m)%K{R@YWHGK5RcUdzRfXNbH@9uDLnisro%1 zESOS?>MtSsELxY{HEXL{A%*CS;*sc4%2Vyf9%eGWxZ8r=scGUj@yn6$jfUtPuJcI6dJEhzAdI0zrp*{(d zrLP=rY4IpaP#_vLbU50zj^tXEc?4R|_={=uOndy9hWyzfQ*1SZSEtWd#Ff~|om|8U za_4uwJ={QRT&<-3de-X?tHLm-6LH7XkHEy@Mp5XEoWc#KXU!B*=(mqY4>*ziOir)g zUO3r9p^cczJZym*n&?E}rffKwOPQjZ?B18+qeja$X1ma7X4GvNxc>*JD&Z6BJIl5Z zZ~-srROou2I0YW$7eqE?SA7FvKl@4h%A97EK(fp5G(T8xJ~Z_a zq4fIHZduhvAYeu9Hjj28J)eBYe3op9x8@akAi)S# zizDO%?Ld5-g?j}J;1g1k+_8y;4Z#P$<^ceXucxe#L4E)6m|YMoJu8q zI*o8_)G;)B5aSq-DrYr|B#PzlzO@Svd_Xne*1g|RN!d_OBr%xv-OW2!q?$`kFAyqv zqRcg@t{Qyh!G-AKQq_<1Qa``}_c)q}7w1%t$BVc~v7AAv2T@+-H}J^WD6&r(3Imt^ zYJV#JPU`~tqcRTXN|>|QMO;lLfHdV;y|hj?tbK&n>d6M3ahHMgw;@mjpWvV`=PK(X z+2$-B=QJ44x!sQ?GU}Ij;q^2XYW!$Z6l6P!Vb(>!(2#lk@>o+WOi@h|6}STsZwUOW zLJ2Vod9$3KVw>e*eL#T*CS>z&8^`2NpaObM(s?fcyk_R-T7vtj2MjGZzoQyQ_x#Ao zB<=|$cl)qNH{E}}$8diMYUYpte&@df5<_xhtr9u^N2m5UxZo46#$U-^NXV1|JMEbP z^Pfweg8+E|);yN$gmu??{z~iiu|v2EmXRNhwjz+@Rxg7^@EIBLaH@Q}cgx%zdl{A< zLcS>Ft@*enP2xz(;eAdc#x9p+LzLhC1q8IW`68kh+&(N!RC4g9a$oQXFQZhusRTi% zY|r}nsB*Es^dIHYnT^L2b8<(*DU}%p5|c1Up$4;3>7{0weUH{i3V4eFU_8|S9O$x5 zQMI8k9P_ZRp>CT{+AwvfNvt+bIo1#S=g>sHR353p`XKqSNqUNnizUzLVU?7%UQ}6e z0~zMU7<1Mq%s`!7I@7PT9IP1_Nn_Yds}MVLBGqnLlFtC-r?!3fdbMuXf_iWYgR`C<=W}mYPUgh|)aTu4vDI zN`VkS=u!|)J)eGYK(dmE|M~)g^>zioArwbo8#pFRU7`0d{YW|J!DqYxA-_Zne9OHf z>}I$$Vpcx`+|I5hrcGY{SmJBML-5zCEybFv3)%wH@Ikqnp|me0Kmf~SQt<@hejYN0 zc~#3J@|B&=nt+rntQapaD{HQm+uQ5C!Az}+Z~h?b$x|~XlIP6Spi)9aveR+gb*YnzSO}{ zqcm6WlLR&MJe6l;NWn_ZC{^s-aJVyS0p;Z4h`72NgW(Aa4Qy)zC{s0)L@lQqM)WQX z<<-7;uV%D6Y~=HopkN{>V_8{ti?$xdaSo-Z<;2GHys>6EI>Pnh&n~C1YK#44JXJs` z0sVr6rL3%5q0-OppbY#j>BEu3=UU7)()&2e=JO4Wa zUyXUMtp#$-{9xkjI=k?3z2xX$0gRXnn8V3F2)8VQ-$}J1uuPV(mpY76&;>~r!+DQHYux> zi@|^H0_C8`vI!c0`;bl=GcJ{WiZ?5tz-`nbxSLCo7r-Y-YOGZv;t1^lu($b(;F%QPLc&!Ex6dPMB(iw?MDblNMa-4t3tLu zA9F5nGjp@P(RK}(RO&wr)i-u^0kZqDL?J?mNA!k1**6|gPdAC_Yfs+~EG%x5rU4j_fik8?*4a-SM+#92#UHrL-C{U(H@%N2~lU zT^BWbC+vEx|I)JX^8ZQbdacYNB9}0SoIG3$lZTB)r*ecY0(#M`K&9RV^&Jrk{HRUX zd8ad620EO-Z;PJboL44&nySV9{Y1frn21FDMT{E|%2$&9B>HD1)Xg+uiy68Ucc2f2 zIWw_;Mr~L*5bNMA;>RcsFpIRr@8G{bRwKZ|0&~;NfDNPjZqGPC(tUS)R^y7}cpVJf zDPq;G!nVm(XqCKEs9K4|bt?FA3t&1TuWM#F`hJCk_Ti&5(l3AR8{5Em{4Tl52kt18 zDpbiT|1sPCJam_00Wxcvr4l^c2BCbjGtS1k@c(Q2mWV)tCoY)272__$%NJwc!&~Uv z#I&=MCs_B{X*Cp}YafSb25ib+eq~_x-IZZv{}yNKZHIP7$9Y=_`K&m`u{5&uKtI<5 z-MEW5wL$Rb&tW5hMHc%Gn?3M5$DN(B6vMwZw!Tl5;tYWhmRK!7G&m7%`&hBAE@uuF zc1YCeCgFgwrBo$J6ZR8dJ}{z8FmZxk-Y2X5? z#&?HpLca1xw7cqR588iA#6`P5j>{{^E|{R>TK?!Y1%rLZ@EvaFKXr9uT$8*@kkxRw z36d2$)MnRT$T#mlSx)L)z^u5f;{_G~dTWhE_@%grPOa|LAZEz2J(QIdEdq~J1g)C( zx^&n6nAdBbWpz1XpEXdZos0dPR^A(}^2m0v_NLvAdUNHvX6Fv^)+|$5rXNh+4bhJT zpj$Ib&IKb1nW`?`a~-pyW}9x^9;qs24QtB^Ug^pCi{ts7CNW#4dw)XX-2ZfM4)%Q4 ztcdciuVl?M5Aa{eISW>5nfgfJ+ZN;5e{0fT2)?v{1N}R=V_F;k#w>QF)e5KhMAn}yENNI&LbjLI!HEXV7tjQC9-?Q`pdU*T5{G#<< zr#5Ofl2xdhk6MJ%HLL0ULV0_@u@lvCxY=}ozKXDOsa!Hl>I#zfYL=EapbAp}d-BM_ zr7N}DI;_5zU)nZ-|>Q3VZAOA+z=*rqK|h_3AZ@feuYOYd5?+&i|Za^l?R zzW*3g1{#1Kw&zf6=YFBCOD%%?l|| zW6m=7@FoC|B=oZf5({Pt*K0>eBP&<^|FMn5yPSqzXnJBbf$Ij0X`j$%0^P3j6wJWa#STCQzE~i zGG{##TSZS%M-!v)rpl_$$qo@{5jEyQ?Ooj@v9a*B(ieks5E>=csufZc#+*7V*}kk#dK=IomEMo!6u784XfRPJ5SUA*F(U z^sqFB(!JA9q9U;9*LY*I2>xFxH7XmGZcS}sdo6AC21teghv=Lc5#qs;uTOx6v$>*= zWc)Pyk*Wp|>))3I2P2~UG#yGByJVq`n!Kc!-!Fo(9IWByAbqDxt+y)quV`3dvUT z-KwGm34cs0E@xIVU4?w6ouVyo(mo$^(JX#Vj{sPu5zYzQCLNjyS}01+KbSxWV{mMb zs-0ct3({~J>pr+?>e;Lbz9>7zozWV^VbfT${)D}>^(64oLJ)QwPSPV_s28gyY<_G% z7FiVl9_4pdBVD$ei5Oy~!eA$IvtT70V_#hXf`d;^D@~!Dd@3+3;5~CI6belmvE~G4 zS$z;+>#=I`u*;#%Wzd7*v%5M3EbYKn$UW*q?ma-7wA!p_)1#c!=@QPruW-v9_c#2z z@(&;&awQX}zUl(HS+>SQCxDwZa*(x&;4qkEZFQo6$`0IxbMkvV^-&UAN8Fti$ZC8` zi%Q-IH^=--lu`?Pg6;k2&`L# zuOn<9D!UUC8%YLz0cL$&QVfXn{1hWau*t7t&F`ZEM5bPLq#q53bd0rj6OJR$b;ZY_ z{Ct({tywFz+)Qo(qkEGaKUiG%ZjUs4dZ54;4qtep&bSCiAI>2w^#46|fz*etFiB|i zLTMI|s+1SYpTDS1ah~l?w*Q)jkR|%WGxGB|1lxyFCQMsl7#%0#wy2|k1peC~%JYdE zWL7xb{B)mTwxNxCaF}(XCw*kV*KF}7M+iJ3N<>R^mK?+yil%D=VYW+Eyq@(o5+dIi za^cs6{wMo1{Sy;1HlWbO4E)*fIpe1K zNSpY)aa4Y*QIih$xxB*0nVk|NP~IRMTu39No@o_7dp*i7k$O=X_=k5w+_{rSE&xq3 z$eJf9RMmg^oREOPz<_SZ=5$c6N`gZ5m}JPvcdT$h1*8jRr1A5nZ_ET$W+30VMXa;z zs4I;_j^fPWLQL7IvkIvB`xRg7SU*@>2m_*;^=!w$Hg?~Eib&azR}501hGgPO|H8Rr z$ZmJm$p}?l+W-DsRZL~1K1fd1#H{CRiwIck-5}vAcW3(h3vb(=>6R=`xMqvlgDLXe z9Bx{_bux-$HAiF9G%^i^7cwoubN6%jlmLnA$b*4K_%e8~lU%zaL_CiPi*Duk85oI< zzQ`zX&VzfFV(9^}r7v+zW{&PY{QU?MDNW5#lQbx{6EJTD*U;ZSQGKCdYq*HDXV!RX zO9w&%jG0H)Xw78MSmCfD4hm~G3(eC4^QKUg#f!d1|HC0YDXscs46(!88e>e zC`ut@RM}qv4gvfeT$hS*j=>n%8RQb$(Evc+-EJ!jCX?b`&Ln<9-;;@nYc|K-c zH*;#H-Ag}BoQK=CUhiZbnMG^VAtoLP%>b$R$Ww@V&8|JgNY`vkyEBDkPA*>!AQN)t zhOOY$Vzy>owd%-#t3}TEeKjs){2gFj>8>Ss#>;@68MtOE_0|=CbJd-ngA1VXs(*Hd zinib28Ot{1`SrYc^uXb0QlrD!VnmoaZQ6oJ{;%mC6=>HkH5o}6l)VR^bh@r z^&1_1yj9pu@K3e7Pv_M{;=}i|?P|iiE8axvR?PO4OXYcZorRW|FYQE5e3YB{DP4X7 zg3Y1?e+i>iaT7}4E%r=GE|3N2KHCzpTa0p#Z}4*MgUI6=CiDEErpt=c3Z3^J2GQxe zBZOqXI|w$IKm~UXclFKoKcK`86DAd%W%b}donVsBAcF0Yznv9sZ?Y0F!i&9N|2n8b zaw@&(<6+S0aNY)^##HQL$QILfk)Sl9oUi?9FzLapg zqI?9|1h^95jyd89Zv*DzRLGfgP`kS!i(U0zh(W-3CITy@<+@of_yBt6tkBrvlVpJA zFSjp;djc6aby4s0uTJ{!-l_E_7uL;3wTsN;14FhL(L}bHA-#1b7LWDcQGQ_ilb3XN za`~gU0o7@p{r@pkVfM6`scP9}u3&0GzUnLfOBnJlhvT?37p-gx(J0GajfYl6RdH_|HUCA2obEU>uqhgV_id5~tB z>J49r=$=E{-`&ul0?IU=@mY^cZz^%1(V!DiFnVXRya|hPCR5T%_@S&Iw*~n4-V>0O zHb|k+70OQ|rB{z~<=GPSMW-~Hn_k8{yylyVO)$ZV4a3dgD;Pm<0z{eypGl`Fv-#!EM&_nKC1WyNGzBZ3M)<=sT?OjN=bD# zKg7LxV}sO2Mh81&PM4*j1Vj{V+TzdpT}mN!!4*9uOgNRZ5TDxJ6&lK(S{vbM)ums1 za~9}dtd89~F18fc=0jqi46tl+#HFx#9;{D+psW8@t=%FbncxPTe(t@NgF0fCwpEp< z@%Z0c6=droEiJr3-XnqmaaUkmzMEtD(70)dT?UkpVxxi4f1J|jfJoBEK$~@Bz~Pk7AB8XZ zFR~H_VQJZ*%@e1T{^<{6Xy0%b=TVAdsxQ)1uJ`R=0L+Yo8|Tl-WNPLbD3)#-~;sS{$}Gb6i`dFno3nB>l+ z_gtCoFGgnEbKNw3gab&w*UI4%%)3y#aT2@h3Z#fqIw42##MCGW2VbSz+A>_!5P1Om$ zs0qhzcpuF|zvImU-3Hlv*0^g?%=lD*wcfX6AFxs~!1VxHrdk}Q!&gsWb+Iyk3lTD1dU zN~aXis6N|dA{kpu!v=;v;xsXk2DU8da975XaauW`67auOtZEM&JiHS)SRCcW=76!n zT1}G1-M(vb`OqLvZz`X)C;8qIlJu90OSBB3wEm~+w<96E>jNDB4-j*ZIi)Es9>Q%? zMDozE-=5F&O-0FykjSns%K}9R0FG~63Ry4c_I#?VFA5*qvR~{;Nj@48nKF_ivqT0C zajElw(F!?DR|&PN8r)PJY76)B?SC|ppmI2GhO=?W)6#x0hB&$~OR$rSOEQvM`-0d^ zSf4ngMi$i=U|omy4YWqd=2S|C{wA(#?r6fxc&|=luOt)hOYbG~3{CZDD-I+}pzgEH zf1fU}Rp)O}e5x3Owx07x_aZPG5V06HJqIPUpaQrnLYG2*fHIk-glf03;Se_~L>}>G z;n$BiOAILnt{_pj9=dT(vi=Co|6re!-4@qikude!nP)#821hlz@nY?Yry=Tma7Nh<0iUwQ;ZHKxr-EH@UTo!>Oe{qrMpC3=DFs1u@tB4tPA1+2Ees0w(m zDj>gkK;S17!X~PLl{?CfbDesn=D9%wQSVkz+##GEy=N6T&8?!Ge%$~rqZoP5mi(>i zpuNwYMzc7UYwU!Qu8C9*w8U8_bqNd3zN(JuwrQg>R*TUE9sS@=`>++Q>AORFyW(rl zZlM)5+Uv^5{0kL{PJ6LVEALGMQR5NK4HwjWdilN6I-tcEa23%ah;n74`^&hJZmeJ4 zw%ipPI|#U&L(m4sXKBlGu_VQP>qfU_(6ak+Z_K_%hVdK-IlK>M{sFCS{A_J6~ajHPrcYuJlKxIcf zd`03TK_}eu>4pFvB*3+1V+|ymedyh%p^!;dxtZRQOkypkS8>=`KGze_c4gy zy6h`?H~mx9YM-l1=+6HR6GV108Nj8|3US&j`P>Ijv}_d6#ud-L#M9isTTtm*FcqA` zg4g6M?&Zp7hJjVc-0IoeAa=2!PJyeSb*k5!t1L}(JeUDm6slPVUl7<2u+C~U{8*2q z00}_$zpMIs-;4W3X8~sU<@(OeZ3x+`PfUM;do!X3H{1t;kkyJC*2o>}wJZPxZghYOj-IRj-=r^$g;$CD% zkulhi0ceQk=g^G2KfPlOi;~f5C-0K68Vr*(TQt*bMQk3V4a^PTfWJl!8HoRP){NV& zz#$QXzixnjS$(oxH1=oL)Fl;&xk&GbQ=XK=E}2EDS(ZdT&WjH}oBwv;8zPU*^ZFzj za1X&NEt~W&lGkR(U||zoZ~f~0q;c@ za=>SzElI*g@f_@ETAt3-#&3)X@ASyQG^Ku$jlR>Sq^cgs(%IrKCsL8b$DDlhF-P!r zQX;murBql(L!;Z!4Co5ij7rm0XQpaGWGt`#b{vn+{~gO3#HUC+H1gNUXX};$y{Bey zqG-`37XQ{VAng{(3;YvLJI?!OG2+jL6grTu6o9!nJmh5I+^a0abigV@Cwc1gAZfeIXYN5~6g8GYgrg z*nZUG{<|d|4Jp#nPJz9agy-@HM03)HJKQ@?<>LD<#!A-7DGD@^l>I@d{mPBM?#`H9 zzjIvOf{|&v<9oUoMs#X>Zm%7d@IZrBIr5d+hyQB%z?)ov4i|_&s4@~oGRJO0WM2y@ z8fKxTvlv{M4ChNZJdo=Lc7SJnDyd%)9PWips|ba5wiW`x^PBM1G<{^ght z1(XxsltQEPJ3T4O7O+Mu`45=w1qJCDSjBnaKBDwfC*I<4op*F3ksd{#vrUuW6z#C~ z0Z|?N;|Wu#LN)mddoBS{Um3^M2)J2F#I4OdtD>14TdXIzRSeiVePfT6YGtJ*edE(7 zJjdxkS4O7e!nJv-5gX|0JB;Pu)QrnL5si#a~na1JlOsx-QH zX!&0HhylKBGT%z5Or+Ohb5_8;GrmZ4FR10k>=|WZ-5J=1tWcgoqoZ$|;DjAwW^gu{ z&!y~6&+l~bQO4tUs-BI=V-deujG>JVuHvJ%yN~-$kqgxyrSja#d>;b8S?;RnXsH%M zT!T}PM7PD?FBe^~SL8){K?5iQk8+Y2pl<0Ray5_dBg#N4l|MxN&Glc}5DfiO(A&5r zKxvJu7ZP+^%+S04HHV+G)SL;h4ye1mhF*>;PV}O@IFr|)t{y$e$pzoK*to^304pQg z97Jr2Ln7SzkF;@Q%j!iuGL+vGKTNC zOKjylj&w11*jftR+ta6e>_}x-c2kJtqg{US<}vjn<#iDX9#VKIctdwbC!$k2a#;k;A>95^J|jXV>!+KP=Mt9*i*cP-cTWTZiZ111PU zzsoUY&@bUZx!Ext$`^p|xv=rGl>ey=Q%5erkGdw&;mv-wC@WL$LBKe6v zm%5(ptArV;;>`^JQ8TY*y@mWN9d@hm67SOlcF8YhT;3d}Gsft^<=B9v(GlbqR{rI} z`R^hPIcMcq6=K;ux=*1qT?yeixXkFTP9DSCpi5$3CoR(z@OnSpB&vAq;%!vWEKFDK21ht?})o=g|B?3jrvVyhGa6;eP;ri%L zq2VzQH*?hxZouq9pCMEMLREe|TdyhpM^0Uv*1qs&5~!W!Dv~*`TubhvcbN&9nAX?W zgg%g1pY2u~`*y@{Cr6SL3p}81{t-Rh8&@Qvf2x1;q~oqeUa9nBWt}IL*`27U3ApG8{L{RsbGy(@f0GX zpcb!Pd?Co6u#yU#Ley2&TugvmcC&Qh7|l`Tq9mHRVzblZEJFDZM+m9|bFeTvC~}e` z5V61|94MH86#+(hA4Z`+%UC4^H?U=@0kmPEEM3m^{^_UOF0HzH7hQI|5eg$k^-o@siw~v_|YO;rpOTR4l1SB>X5YJxQLzLS*JFi*eb-TXbA3l!$q;A zIvBc%xyk;`B6MeMge#so%Q8M*vGfa6 zoi`*YO||0?B!8$|iQqMqB!%N$g^UCU=iv*wS4hqL+#sAxc!~t}M){&VF2vT_qxNa2 zZ2zL3cL_e6GAA+B>?d=I)I5mU!)P5d%Nwu;Lt$`Z1R{AaXv!T6>9So1*9sIebFMb~ zCt|Q{VYuurp)$&cqUm6NqIHuH)t3gEfSk+q4JwSsL}Ik%kH(Wa2X%emwXoV;n@4{# z6!`-ReZj5S=(`5*q5|r{>ueoFL)MU45l#bqY)c2Gua20M!7WIZAd}b-M6D-sj3>A` zR9F#99NBuDEBsa`+sq3b(D|UfZgSycFz-0Yh^!Qa#gPxS_)fn?zRmF`9w~?dosaE; zp3>;&>Fn2#4PdXumGH*h1@^$DL4<1$ntM!|{4iS>Xdjo?S#+RKduxVV4=sP6<9ZB^ z(|?|A-O6C)2+tih9rg~kLPKGdRY>KKoh*FZ;|TtCt#fSzcc zz`?!~57-aBdLB~2S>7$ieuzyNMazNgdqp;(k=%G-!N;)!K4Y{8;n=;RpW{8jRzGC~`cwHn zHzb7~UKL-Z3RXTi=4s^5Q!|*g^e?~aJ*MhZbwtCw)r3`rm7bO;v?{m#o4Tm7aR~I% zROC@@E^Q~+u{BtzPkDXFm*Lu&jDwJElCuqA`3nqmNOT`Vt$luj8c66a+=oTjGZh;r z2|uvX<=(J%k$!HpuK{E`h=y~uT}J1jG)MaXW{bu(zj|eWse?dzW}d7Wfl`OZy(FJc zQ~lxZXdrGedrf6AEt{?8K%ou?P9XF#`B0Yr;$#g!BF?fQk465$=bd3b6Q{~TTS%pf zSgw!sNPywRNbt@2y@9(=m4F6?>%?n@KjQa*P$2&QjHP&lmC zB)H3-;6A@1H9<3KiAXX0w05trK&ndS&q~Fzq32o7 zMWI!3IOXQuGx@yJT225aM{F(6YzJBg0Y*dN+dp5sh?RU2hL6K zgMN{80Mqiu_;DEkQ@)^Ej;=Nxj8O;W)aoIept>GFgCd}08nO=u$M8!kea-%y=vvfX z-8d9piXf~OsEF`eCGCQkm7uSYULr=~lysxC&>6w*3vjKq*n z(I@-Tmk)+DCeLRV?1)?;z`6oSmrMx8qvxsLId;Ct%*+2gn1 z(5fnk+9KxHOm)BbiSut0p*<|evd{GH*d8cu(yH)NM19niA0<6kE3`>Uxb#r2CiLy4 zn8i^1Nu#**j4K$q*KHREWQdNnEqLs^OZVKJ6gV>T&^+3x0KMw}fa1j^;BMoCaf3Y2`)FFWV5#ME8y@ zKJOSiWWp{&K1vUytQ`0Q#_$ln2{dY9F78=&sWV&Pe(^v)Q#7vWc!~6ke?D7ocQS)5-8Ve z-|_x_qYPSeblT&+{1{?hk!}r`!Wa(=^b-s*xa3AC-Fp!ewu+@)8jhr3vt|DJ_LY5Bkfe0XYBXNbWVS&yIB!z?jyZ z{Xi0+_OS8-ApP$>&0^21ILf;mDVN;7dcSp&qaw-?M<;hD=Gg5#y+iI6%n{5a@I?AK zpec*KB+yC_&d1k6+b!ClfoMiC9Zo+B2MWJG-}RYk=FsO%uu_Heyb74Fq%=)&THD;O zXsxM*AtTl;6-FCvmJ`zxvtJ5@Hngv&>Q8f*Fg>olq&rX?;UlOM3(+H%b94I1uqBLG z4Mf~3r1K5}wzGbq_9BTQA%{On=X6`aMjUy6szmTpOwfA(RNaI6)_UG(L0*EcwspIq z>N}UTZXs0gKW`>jxLWlbl@nll>nz2~_iRk-?0V*XeDrq*3UyiC+(fHsOOIF?w>~Qh zY%s}feryWkY-Ci*CGlr#^wHY3j~%U;QXQ5__fpyrK70};@F;Y zX0W;x!;!F$t%piY_bjKbz2q5~KL63+SWBZGP!JF9DKgh;#&CU=wRNLGCh3UOtG`2uxe)cKjokvQ z!k+t|eesezc>~#T%K7dmH3oxrIdEU38QU>%R>z2HOttRg=`B-qCL%AM`PGASJr~r# zo7Gqc0XV1Zw)}IIrB^``W{-BJUOJay6!@G@w)iYu3D@xhUkxMRC+QW2TdV>x(p{{) za{^D~$VumR(hfovTdoTnCi`N&=7#GIC~8oL7#1=YVIKj7Iex_WWW0MXEhdDU=Fw&u zM0Uv>E*p(~xHv*dCWrOsmr;Dp5b_phl`!jTRqX77H!c~UsuFhQ)ulzIldy-*^xZ1Dr)%%N(DD}Mn#jY4`O^<&ge=ow0pS? z)yVz6dotX_Hl^Pe1MhbWo6_JQlmk({FT|2T*r6s&MNud+KHfp#Jl02m%fa^Zm@GtS3{04D zy~BiMEVZv9_>u^+XrWh5r|Ug2HJBg0&!vn&YGBO_@kxY6CGSouk>38Ont9_>A;bJe#}MB-?~7R z5UD_JW=P;c^YDFnQ1?`jM3AnBQ@tp-zC)%p8QoWYWolhtG7R9c*w|h-By}?7^6k|9 zXVZMryIEp}h5YW*gND_uFrUhx+ZPWi>{&sWCT^RLfi1Cx zXyyLz*I(|%-4Ek8*61{MB=sh?VLNy;6VHwVD=0o|r$-BG>MSR=?<&V;xi!g-Qk)*q z8K##18CGaO#?lQcx;jVr5)9diC9(#)?(=_4L zb+BHp2Dv@PX2OyTNYKrs)`DTmedm$e0B=Ua24%;W(u@-cT-n>Xo2+IFGyN9x);TC- zF7fxD|JB70&+dJ-c;NE?ruIcnC`r;-t7_@^N-wmju=FffL_EfGanRpmg*R#c214D$ zDQDln^%3Dpid(b<@*9WG!2D`i*BJZmnu?#g&WomFxy@TH>yR7Q9gVKlH>-Lrm-C;a z9u?b4RHPO6Rxv^$1ne#y!sI@0MA#YLT$1^#)Vo5 z2M?vJ&y0YB)wwwDcVH~V&UDM51s7Fd0#GftpZifnIA>G>UCZ$obgS>0TTaCmNeKNW zGGn}U_HDd8b{fj~Nkg-D8Y)whYY0)g^zoZVAe^HTx76z&wk|B-0gR>3vFsm3u>#+` zdS8{5&WSZc=^WAkBhWKHA~l6bGK`kd&{8l(K#bsKIc)VNyUQ;T2~uqtK_C{%{A7_J z$nab1!5FNGTf~&Gug_{`jkhaUFXpGmzmd8h7vd~JxGg2{iTb;t(8%yTBf41pcH zg!T>d?%?6is-V((D)KFFf6Gpp9S}u&;Fwys;>cBkv>+^>j1?v5ODl8#$O0lg_STA; zL~ZFmoKIM1(_z~W-%DU(V2^t?0H$!utImsMW8XMlL-|igmjC(m5V7G^kCU1d4C|Y2 zhz_MOSlX+=f|lY9-KJu<+U`d+ZY_D-_jcvuw1;hI{Ah*u>mDNAt2C5?luZ;95}p{p z&?Kk)IaF9jb&T%Yqh9Z|oDyBkMYPS*=zZ*k0u^*(Q$g2J^^=j6z+8mxY_ePj#l11I z>pf2_WT6a+!&javbew)tQ&+W$H%Na8Piy+hHj<3+k@;aey>@~Nb6)OJC2o!)>5!H6 z0jF%Hg(FlgX4z?IOFTaDQzI-pxb_CyioECS zf9!w@S7wJ%bn01D4k|V@>O4omgiO$W%D1G0RK#}P8_(%(9dv+nJsQ(&aN&9NqA`z6 zmez-fHe)f^-komL8e^6^<7-&XHg-?M0Xz2+m)meMKzUJzR+^3W&L)SlJCN|e30Q-9k= zE0wXaI$gv%`OJU0RT;~$h zEV87uPafBv5F$$zLk@86O%$iR5M{kdfszOV^-E9+>;wIUJ$So>x z6E5@%sa)Y>-w5aN1CAcFc$juuL@rdHvk;gcK_kd8odFMIpvqe5s?*`z=U{_o-?Fer zXJvJYn%usjAKLrYg_RZt?id^>TOqd!VBp9&Q_xAj z83n3#&h&}P&X;yR#;l*zmU=$}m?ocpjd2pX<-}>Ov3Eo9sBOTv&pxn9)L6kkHUaZS zO*C-A%o?GfYL(Fa6qNEr{Dh3C1(QuT-rHV{v8S_jPD<)~Z@&zLTi&)98}VgorAN|0 zSI}e3Hmp|GIn`sB$vABEJDpHi$M!>r&ncf%Vj9mr%&Ha9cV8(WKb*1e(Xy7>sarZA ziq!VIIy?n8EDP>hG%bgsnxg-GvLd1G9%Y8npaST=P65Fq1UJHh4!_2PWZ z37$fuZM(UfF&`xt-S+q$O?>E!6_!=#3`0YwZ3R}G{3_n}Hv=y5(PY^bK{J~h?aHNC3Cw_%&{-5OgyN^PlluyYu!{3 zE*MrtmWwFCVzno5C|JmbahQ#;E%mO{met*b|0GzLY~I>Db;@KnQQF< zWZGbtL#?}04OB5)m`uQ0?Ht6rc*+KUMPHu0Dy#em3q`8;(4-={TCJvtrjJi`fa8+w zQ3?g)QA?Ok=1J*`qz&{_3N@j7MF#cp>Zq%we9*V8qoWlckwNFq?U<<-7fR#D)3W9N z^uC9=r2XI1`}bZ#Y_w&!RIn|IAOSIzY4;liVV@-iwOU)nuXQzz@&^4t!FvJ_#X946 zA@+qvdTqT+^`lvd_eqbAI0_XO<5PrJ0u*me`*T`8=J9Z@|2WNEy?4C=f~>K+F`BW* zc@qPgRsFrDKV7#(%)bXq(&K9Zji$Oz;IPQE2&CyCLV8+n;{q2d{}QfaRk#pU{9*xD z>J)UP8zmqUxx=_gE|-Zzaqx(NLRB!6_lSba{8@c{7@Z{|cQX5bDevcc&LFvZC>CS? z*S8J7>hGEf&H!OSuO>-Pp(smSb|KL=SMum81;CG)tNbgJqfoH#Rns^4i4z)TwV!3w zkM!zrJK3Fak8u!i6nEEa*|628#Z{Yqybb$X^ppL9S3peUQVm;b8fi@M?IJsZUYEXO z_cv4{%Fo^=?y2=9e?>rWXB2Ia8P4-Zt>5CZc@wWqspq4#4nWsW6lIAQ;QO*n;TBJt z8&c7J(NlWGytKSAB0!!beG@FK&}VVQt~v`E@=@F(z)1#jAZN(@1H*2%U|!JfK)Fcx z6%13D4x@qn{Jyz#n7MMR$JjzAM3VZNpqx|K73jh_j!QW29#Ujh>2CTy>GvLN9JMNc3@*J~cldSW}YPq~#e1(I%3-|-vHuLDbFF;Zf z5tv*@qfguyn)QpSe7d~Dky)pT^`(mhuFM*mkHKUjzpDv${Z_n%?Zk=DRC*ANO(5z` zB5p+Q6IH4P*K?XMnms>;S0b>v+iBaX^sKyKgf_+*in119FGlw^t}m#+-QER)YKy#G zayv7((tM4pNsY*bCle{1;PwUW^>X0piN0&!>Gk%p!+q@s;A)3Y-4|Ih1>jQ5oo|;l z<8nst{9J?NOMMVUqc5w#NBUekK3-T`Msm9Wf!{4&uE#p#0C6P0&f5K;QZ_gSgsgI` zQ9*FN0LYnkulx2>tXb+Am)bMQMf*uR$(oy$;tMDFy*|k&WmxQG$Y$f)Npc5dCKxq^ z7hV8Ym+hK9!)1XB{rgcs_|9vzo1>Q>lb3@|Ii30ilu>hW_5qa1yaxLv9IR+H2V&T0 zV%=khxpe;tI1I?%8Vl1?MNg<`GlcrV&eBc*+5Yczn^}l&N2Mmd>>A?aN>BJq*oeJp zt_7`HoqBJhzoV?$_BP7oC&&{W+cuLPOAr%~=IRrhwC^>e%v;eQN}|M$3U`Ei4w63a ze}kCh%B&oQnKh9!oU8|vwL$oKmNMx}E^^kzQdO$A{-JjetrZ5qpTcqfhjyEk%uNJ=Ee@p&jE|OCmosGarAO`%J?1)1)EtNVQEV) zeg&9%`qJ2T=ahn)Mjvul1i3hg{6d!takArDqU% z7Mws_f+yYJc)ORp8-5P;;=o&!5>9wfdMN@6yR5v_Oo8H$wGJ=n`N$uoS+=T zUECFj%@9n=NmOuZZ}U(N10gDkCQOVXa_n#D9z?dvzWo{=>u25ZA0;{%NbGZg5-?2ZEm z=?wdVJd;d9r;(1YsMYh_^qhIBL|qy$uGG{}E>HLz`jDlRchK89VB9|nAqfpiVLtt= z+F5EwWLv|tIGzTnA0~~3vn^5k2jn)svzU>d@g<#Y1n1y;7U=JMek|T-1)1%vEyTu& zBKJoVidhJC+xQ);5|LtC=D)C0!N-IRVYkY^+_^%6lwSA?)}%2|kPYy`jrG!9B8A37 zgyCG{w&Sz%(p2)Q4>eW!{JtLjXke_+Y?*H#P9$OMEnM-A%(?MKO?ixkm7#SZfP<$| z&j(A|`HZ@RYu9mN7hhEIc&Pz%Q22HrrrZcy)+}OtA$`&tJ(-R*(rW_5-;}= zRH@QZmPs`w;ukK2}KBQEeJsYKqM_)=k< z+GnC0xQ1e>0LFO4vFLp{?N5kD8o^Kps~#H?UNh_P<2#bkk$qT9@z=0{Sl-H>i%9@k9A^mkyl)O47*P=#o)|e&a7ZFlBLzK13o5_jwf!>A#Bi&oo5lO3PJXDq}VOHb-3t; zt|Dy^SB#cgSM`>vQuQUTa;oogK6Y~74wB<;8dse}da}{-P^{u*6H;=6-|-Kk;t){> zu)miy*APiux71gFHNam8t^rZm6fUVnM;x_|N)N_tm)>Qg1VyLr4V(%@y$*PbWma+i zM2!SLR!SxbUS1mZ{zkgN=w?ErZTEm&Cgs*migdc*GkM@n-d~S#d-83k1llO2t8)Z^ z$p&2+R1qG#SZ~N|-#@fn?DvVhyDYG)WSj1xStLOT8&pPe)hb)BhR+JGA&fD8>`oJd zOqvODNCHb7Z&SwTo#63Lk}rF_^t4R=bK$wL*TP$UQH{20w1Uc`X(D-JHDej$1aH4v3bzbqK|qYu4t@BpB#P$U3bw40avP|Lm9PbZ_EQm|M=2@4*GO&`QqF~_#0%l zZSRrHBsdTE-Pe1)5>~21MAx<=`dSe+tLeP%uvc)%mq~naz~YW^kze5S`%PMH3q*Jk zn75KpcqF~v{Yt76E%n8a(!j1z3|hAY4d|@z^6e8Pl;%^57Ezk0E8_BGe0Uo5#=Z0o z%t&DxBXdzOj2X34BI)U0HUf(J7mV47W0uQ^F^^pvXN+91^GW*>JJ=fKnZe3^Wp6?5 zX*f8dYC$`K&2gGk{=@W24@cn{=RaTlU$w*fT4T%#4>TcRhAa zpt76-m_R0St3o694ZuP4-V=liF~ALT)DIR&Gy84vy({S^T}h#v;BGrcDUfPqA(eM* zjooi@1lRw~> zAK%?SSdjVS6?M63yPHFWIX11#TZ%Iv%@)*8ge;j2L=T7#wK1ATBkn;oh6Lm9>r6t- zbTr4r>Yy)CDEzGe^z%esnUlfsVfjPigWA*TGrk%+E@AQ;C0l~QV8lu_OhqX zI62F{mlA}aMOMfKC1;dR8G4`jt2d;Y+XyMy_t7OM{JXPPirQ1cO4xK5v#~BVxp0mi z$5l`H(bbfQ7BIXu$%)IYWij|~6ObmhJ%nA}SVg}(jJAp$k1H=cG*|t@P$@6mNcws` zEB+EBw_AEH{W&iZvJ#;RH@Gck54xk=5KTBJx@w-WF@Al2>Q~$xwH&N)@V@XP!uCX} z5O5h}@?dG$>Rr3WB8&o7AOQ6U5+$L;KWVM#wQmKW1woc7r>qos@^M)-aw`azwMy)_ zDz);05%*hgnX@LO3QSN6Sd+}MT++`U%*ta|OdTEky{o`wjLak6i;bq6E*`&D5z-!J zkZJz^g8&Nv#SaIXp{=C3+cF0h7Bb}#PZXOdQH23d)`mO4wOb4KrBo&l+F3Vb*%0xKk0mhI z8xl{BST=wIq3w_^D-}5+>Qs`RodtOv920`Vmv%ZVuE2ZE_*k$_V!Owc%i&kZg$h^# z%z5O8eD+tk=HN2?>841t87aR|Zz^oMJop(06D{U`!2jv>XY##2<8XoB4KKV+?F z=>XVgjsIZ3N{vK;X{F{(ii!M7oJUP9mF#i*uN}2zSO3op`T&0Ly_ev!5S&|G>-pej zdQt#TY!G7pOl2aY#xX}Zi*29=9fE&6I!x@YB0K_jJ@Fr7*72GyX+9)?Cc5bnH{{ZT zEN?cejx;^(8%d#pS#%dsfj;Y2^E6e-AxS+%wLOChoM&5Je#L0UmHE`ifTB<+am=zn ze;dRv_Vd0OF;S?)zlvFWq`9vwKra{U4!XGI?odxfzz0RoN}I@ii~Mqodpg4E52K}H zzjgpF(*H*V@iE~SbUixS-0vCsFO6?Vuab^x$is9GU^ilUyA`|sM8jpOact4G@l@jk z`9$OU7>>Js*Uq2|Xu^dGLhGpX1ebXjD{s7Hf1CTSW!S;nOllV!n*!O5!sSVnZPI}q z=)I)_R^pR@*1rZ)l9Wruw5X@CI@bi>px>!lo=mD~`1cAE7_~}ao_1Y3(49I=NeE+o z+z3HXjkf*~aA}l5o2E-uY$G8&`kv*1kK5*#rja3ObzIF*oWt%TY;7Qn2q{@38^(JG6Mt6pf~{Rc8p4j z7fmns)4(wAjaz8H5D50PaVyc@amUz~U6bBLCvNL;z0Yts59lOkApg?XjL044xoMjK;u2bY9QjlF!{qtQpbcPWP72U_ZL zv*YL20Dr7=RI;cfciCwV^%Ndn6Lv#JwsRky-36pR81@QU$+pE*mcgEH2L;8D;-_^h z4IxA@>Mwn*>62o*WMjKAY}8Q@Z!wszUi*C%zhY-jARwrKJ1cj}^Z{ID_gb`mS>ZTA zB45+5^>t9t?09Wxo|-)s(`Yd2IS9Xe4iRP-x}1Q(#%A#K?qr%f;oCOG? zj!I5c-u(W@3Qt460&TM~WWNl#Sk&~jm^MXi zqA7)9&@FK0a7NF~Gqw+9Fp$wt66MGAFw5pKROIPAj@M#xe<|N+sNV+sxTx6T1ku6~ ze70^jC@>8|NCxx!;?~-?-wluOkgQCln7U!b+-b$;eiCPI>gF90zi_}J%1_yrSEzA0 zApHrN0zbZxL9Rs7U;lk05TGr@XOo_DHrC>nPNtKQb;@IPZI@gyxDT+AJiy~zeI}>o z9W`9GDR31}P_!(7gT-9R#yf8JM80+$i)OwN6bVk1C%NFo%2ri%2m*Arr5R-DHuVU%=Inx0&( zAMf|<;1{=>SfE1yQ$g%npOQIp4;?)CQ@WUzzst{d%^t1$LW%u+RG~C_lOQ#W^gs;y*PcZzT>&U#bj{ z4(T>DH5%G4sfXm*Sr1m%+=rS7h2?aZ>7RT47MAh~hJm|371m%7t%R74>;rnG$SXSK z=$)GQYMmGcOu4Ppe8g=!Y~$ke|0a;3$&bKAYO_Pj!NF#}PQTIr2M}kUjer6%xAPD; zQT-EDr|4;g4^;)6&Dd!59KsOVb4us}P`{Ocx~*cl3{h3Ig0v(3C(}&@4~4D0@5N4V z#LURxF7^TvQGwil(hT~4l=ursuyLlIWQV&&?OC=0L!&^el!*A ze;(}-7bK=;oGdH61~yLauH`{x_)9ZF+%t>R1C?)xqPWPDX~CV{!dHN={y%eDWPsI) zXO8mLVer5@&X<9BT3r~XkNr64E|U+_dkX3$2ZRbJOHRU;ES|3|#S%sy#dUrY7;MA* zegLEQo`u!oxSrf2uNN{s3)y88B7hi)ssvt|R*HhgSCzNmBGdy~+G}b{yw;fKf;|9| zLWQCk<=J+J5(-4S>2s|xWPN&B4xI5f@SNE8!l@7iW-Hgrh4ab^DCyz&AnRDn|M3nP zX$UX?1zRZ@n<{?hDNrX&8YJegEu}iT^Sa>3vM@xqHnm&Z)VGW3aRRN+y+UNo{QOj+ zc07ofgn`b`luk#rD_TV>|D=cFbe<0hrk^(2IiAIpo@dZ34-+3v#eI;2+1nXE0U|Sc z1qRR^=b)kiGEw#DHTivSo>w2jW6H){lXG`6Z2Cp|shp08;?gbre=yZXsUJM8IYO)EbJvLCMc!lJPxLwaH%$GK1PLW}J1JrBTdqS@0WEXb z{zxqk>yBE@wXV-kMHZb%x`t%V3Srx!uHAg=HSu#vtL^b*5G&SF{?40eg7PoJ!Ze?V z4IDp%t0Rn>vK2&;Jjxw$Xv)H0*zFY4^20$ueNsBDU|Ghbj2jHaz@lVY@ze0&>-?qe zn~Ae$oBdry4WMzZn53Qe@G=)_>pJt(0Bu=V#1!1_XHy!HP;{mKUhuCGev?0CIS{Yw zPJn8KCf9S_g&Wt}wH}rWc(}(sL8jW5B1yGX3QvqWf-`_53fRR`YV2Cuc545<82{dG ziahVp9IkW6g%cJeaKG1!m^h5&D^a|mrEHMuHi%a@6#lE~5I$S;!nQ5=WMt!vAJeg`QpMy&SF^fmN}^L%@`T3t2UyBo#%+k> z+S~d>q(37FM*u?!7k`iT1YvsEaO|c>J@F;kC3zwpNLT52|1zIh_|gE^m?r+c#9u3J=OWAO0$gMrK5XFkz<&1RiVYI>qzK2P zLhi7NU8R?@$=~D7WXZ($21)~lNdrS!lOUv%p&R?6wz~| zpdofgK?1|?6N>8+{b%rwKg=9TeZw%qNO@p*r>nPPKFb4ti{#{3$PS1&IgDa zW?+7voqM(ExIOakWybSk2s41oMfD9O~i}NzWXfciPGYqQo4T0eLd`R>&YN ztr|YJ^_Aa43fJRY^pg~gd%M=E7$}d5k&!P3s6^_8ijCXBAd7Bb!;oHk0XShXs zpp!?MB@=4PV2hz7^scF-&R(Q7Kwo)_VXt?>Y{h2Y4N-W~x?wQ7r841X+TWS*EX9Kd zzXH9bAw*;}#Xrt@%H+2sO@UMfFXSTQT&cwoHPl<-d$=#9UG{94{fm=d@2oJ6W)V$){_`?lIWIP+tiF96_P>9?;D+)+>kn5sB9vP= zPcIN`*P=GNibuUPvTZVxE>&2f1jE0z^kgm)v3+>oAmKnE4$80DJ*=J_d$rnrgVA}a zyqz7=VXY;3r%U*q+r$AI0*?+~Xib3Qbrw%b*68`n`NHY< z>So@yT(aF#Ol-c1zuV#JC``piDVpalqk)q!7UW)kJN+|WGM)<=TJTj4s}zg|o{Hf( z?505qNd%2-iaHpRO0ksgT)?))zr;V1Mib6K&8?Px`j(#TVo<>d!|1^tXp(uziu=A6 ztjpWaBB)?jH)2gq2O9tN$0b21kVuQR8btq*JSob>QjIX2&2}FndOJkr3vZNZS5t)@81>ob*f}DI>X&Y=Hl)(6 z3o~tBcGqQ(m1NHp!XVV3e0g(x<1pFx=+dj#BBgX9oghi-u6~ZDlgX}CZ!`*8 zb1+s?F7Iw%d&>bKyGHlJX+=5I5r~`0ay=MB z01h=}-zdRD`ui^-EU{f6eSdZmb2fS=hf+hnt=;^jIb~adr*;jaIc<3!j###o7+JX8 zxcL)^xrD^(emC74O&oeM#MyL6jdVT<64p}!+hu1k)#u_9$25*rckBK^qz|lgx9;XU zd{hOBS#UchBG*%xFeQ&X?b_(|tso+in=XcYH(9+Wyt~kknj(n8g~y(=e!0_FtyZMW zOb#7)^}TMR3s-{-a??9vwB0|Y@jR)<_5WJJM;@gJG&Ao9p#03G)AliBY74>WAf+1n zHuTKyY&J>ag)}SlP7la(JBo8}wZxB%G+P$VUnw59qbqa{Dm?*ixo`NLJcoJ!)sO%G_hu#?) z%g7uDSn!lPTzHt5pY*MAYQeWOWyTp(KUMv#)k#FRL*dx5(stRnLKY-Ez2gJ(FtvQ) zDLm3i!1O-&ehx&6eD6Yn+M@Wg8v(%gDbmDROO4#E@a+ZoamfIA#hDgh&3Yv>ZM=)v z<|BCm!-ZW3c|YE9kzP6LAfXs}3*zX##X7mVYyTHX$!J3}g@V&#?{Gy>Mb6o2R^4ut zK6!gMx0Wb1V=Uod@n^S&Dt~umoym%xv@m6_rHQ|DASTLmCEMK$aj-wRG$?Ex60WgL z_vSNV%o^Xugaf{IMi6>@{fk;{3UTXq_OyB~Oy0l}*XRy;C<7)JkO13JH@V%qs9MnG zDg1gbR64J)i(BW%8*2pIJ_|;auUO1f^vtE_eXSp`?5D@enrAzJA+?x>f|!Iale?&G4lYNv#0==!a*i-H^z$D*L) ze!LCYD$)3WCn+Y;tpu7XWP-Ls#)p1F+_6GvRX&wNZTNxVxMf+y+Rq@AEZG=Jdb@S>l1!rhAH@gUv$QVa;a zDgO!{neZkc9r3p$C%F-KR|svg3|^dzZ3*bbtJtl#8+UyPJoM`n=ch12Fm)s?7j+4h zLXlh>92V)huNN10*3OOD3V6pbzvs2{`)Zu<2o3ux6FP+<#J)G^uPi*VSqAm~B^3RF zgOhf$m7;5D4*f_~q?oiWAZ<5+aNwyvp9oXg4og0PvOzA}!3pl9BP7H-tUMzZ{l}_= zFM6rHyns*70TC`gFyEtfANTnTPT|M6-`*Oz3f7}TH+5Ha&7 zHRBBuVs+c3F=vu4XVH4nxRWbIPx2)CeLMDRFvm2!LeGtu49waC(&?ntBm~g4e1vlr zzuHo@uEKh+X^~cIB;`vW0JmZuICI|U!`i<{S-~=4s*x_} zbz9B{@k!txvTd-XsV8HW+9~mDh+DAEDU<&{L}F*7Lf+tH6W(V~X)B|}r6nt>6tC_mW zhc+Vi!Xh?MFeGkxhP2yHe=HbMJ<)$^ajQZ&`ktPSqo2R(7-W-jBa%6%slW#jUzM;BOjHp* z->9vg3mfC>bj5;5;dkdbwV`~06+mgbY`4A0jAkE3w*R09SqsKsLq5OreiiI9&N|(- zHN>}2l5QDa|Bd)N{+21f=%fv_+f=bb+QCp>zzFfY38g2?uwnmbhBz|6IHRI@sen35 zM(a%AT32a4N-dtpIeD+RcVkQyl8qeAAd}cWb^tDZkvaPXaMEteNIH8)8y$zc=u!CD zJ-K7Vj}H>hH&22Z9zyY1Llh!a{S(k*bZ?D-StuliOYGGjyoyou7hoaOjn5Zf<|A3& zw@*cUXY?pa%|t0fGt(k=s0>?Zh})`p@7M*JhcSu~R#7eHM(z(wVkW|EBc-77FgJ`N zlz4U0(a+w%9UPaej1dX$S|1lg3|y7&A>Qz^Q(4{J&nflX3`)w+O!e0xzqto~^Q2dp z7lP+pV3&KopVxr&>eG6?=F%M*lazAFt2z8m90kS|@g$QlF6Xxjd4)MRYWik>gbGej z&a-udF)J}MdvT;Eiyw<+%$~2_3={GnhK>JV2W#8>lWGeo&@K;JhF{CY($lUR!#82E z_K`p2E5x)}1;E)Z4OU;)DG}~SGL8^OaY^@f#Nfczyp;M}iX~+qO;&^k(sByoinsbn z&`{TWOEo07Afi@YVH8zYsPk7I7Fqd|fI}nqMSf`|{wNto@sv&GXWi5xb)d42szncz zJXAD1{<%mI8%H?P7OGGs<@hc>r)Nb?Da6`_t`+wa(E`jb(Ci8<;P=)0TF?fN<7Y6F zPDp9;b|yzw)}M$==t%N#mvDeR*G+l#IUX*uL%*Q9H|d#g#z;Pr8Eln|fu$Ya%hzx` zo%AyUyq!@%uz+fLsQPeGR}HP7IA=|dlOF}#r$cR)u@%wb#rDkS9>QWF2WtXkb;i_X zXO`US>-XO$T@zHzM%&ZelZLaM&t1H6c{4IjdY4!}?q$Eo_WpV4&1Dl1laIb3RJje> z1aux0j&peNT?NKu^`d|x@v$F#1)L9Ia*>j6JT-m4dA;>U?JR2J4KO(f5)w-I66 z4hhKfN3UbHf)`8&8ftFY>%)5p5SHAo8a53`Y$xyqgYAHy+w`+O)4E^8kKW+{tT>CW z=FF-(Y{_^@>a2pJ8u?{LZx{^|1G>QI^ zsKC}#dD_@x331*JxG)K;!%nYhiDb)?9DPn1&c3pFya`iNOUGgs6klz~J`-LKfPH)m zFi(ccZR~_mG6c)?kU8#dZc`*N?q4PFz>k{Q&4hR>2@I~m(u_=>eMqh;WGN+U^hhcS z^AdssM(& zV?OldP@~!OsBO3g+&$X4SeneZO!Ag{O#pprKMNEGTFQeo!ASxU1G=TnGdfk*VA1|r zpNF&~NnDNRzXeG`cd4+&#+{H?>sp;V?GrN*^V*t9u5(VA_SU!gCKz$--G`Kvs8udu zg*W{gYvSMuk4E6>Jo-}tjV%>xGQ?{H@8e@$BN>DCJ_txF`_nh{)d=q#4i5N1Rj7C~ z{5dT!s5SKCRezpm&X}WVoK7uRsG7O~oR%V^rb+T#jn!j#qe1nIJNpKCZ_@}VxOqUa;5wsr@xqU<1D!pQ&@Sy zR33J^7w+%;7iBvJV%*J<-yKfa4w4{#Hv`OIz-2|j3IGUk&W5T^{bgijO zf7WZkuVU3(zVj7CMkxWBQzQmaJW@+f`$49p7X?6|)Ae1wjV*v7;p1@4B_x=JwTMqI zHxVI0C&9tv85}tfIFrZ?u?a}S7o&ZMFCH{MaIOxAi ztm>uX61nkn;OL6E?9a4=zQJVECSA8NPLonoHt6Z7hglkoi$IpQ4>CP#n{aPAEm(uc z3`t7t@B>rocVmJQPw#=j40dqBVQ5G9Hq8$?a;_gIYa9h*G+8-ZaHr+ez_zjO%;xRA zQo@3Cp;jBeOhS~*o%&uJZQ`s}4iplM)Cqor?B(=#-yVts13#PPRk>YQhg4F!p6oXK z-4n0mK8@*E=!O|@%K*SiyAe*b-1{iCOQ-X9`-5FC-TeyjV$!sn%U;_Ve2I~3=1)QT z({yJA;eKc>31XsqIuFv4VKPNO{O}PMT@}^*Ckur00cJhjUi9Cl@Z?EcUDNU(h>ZoV z21VDb`Xad?ce8Rv#v!|Hzge7~dFPA8m3UiGu`IS-g9S<$MZ>z1bAG3Lh`mo^h#Cm! ziSW+~(;6_2zH~NKQmrte3IXmh3nvRv!qs63owARen6+P%3n#PF^>b*M4b4Ext? z6U9;7&QI+pp7}GzrS^TYs8`E0%iOWu1n+ijGDpwNmV(6&>-`6Kun;<6xZekAusH2G zrylrpRL{uwhX2dN$S}#ivvcUa;PurkqslV843yqWGmY|!V-)jz9w8Ia*^_UMawFjr zM@w_KvFsYo7o==_Ox|0&C+ida{yFzPQ}M!I^g`$sh3O5`TN%d8iYx!;Yx&rxRK_;M zl=^EZh!5)TJQl)L=z}Er$0GNOWz&xqVG;p}1e{3^CG2_h){tX|Nsul1=>Hmr97rdo zslprw?Gh>A#IsTsEHDe7>t3ZA3;YA72Oiv46i)_lqfEYm*&sQ!(y>CuT?Ty2IVTj3*7(o%12`S z+!OvA;0Lb|+p8adx}n&myq0;(WE@+PMJS*9de0$Bp9C1Rwp{nm&H^iSpT zJ~M!3kx_9lK0}KbaYJAcxD=RuwSo(%6rgy8qsA@F;8xqHeCY)PS@kI#$y(flKp8bj zET$R@Sd6{}BW*dpi^x=sNMruL;AbM;7>0dP|IF(c?DxFvW)dSP@8;L(8D~YV?e1L* z09EardtDyuN*e`>Tl1+)^MANz`v?Bn6q0!jH-+jW;K))|$(z>|Zvv>jneo_-?u~-Y zsH@4A-QndZ!n?2q(?wCcs>N}^XS0hv31U$U;?SSD7R=P8jhDHlQcSJ8ydS~B7*uE) z$X%dCYA2P#PPR&z^TDh{H~^cwi!InqUc%mm0&|x0Q3kI@R5W)_FH&&bw0tE6PH0B# z_HF~BypoMtjKA2HJ4rU~>TuOoW~3eIJw=x=hWuS{@S?31l7dMts*K(xB|I#`2za)R z%>Px5bC59Y+UP-@ZDOsU$-!k=Wx8j^gehC#h-}$*d_NB7YI-*4uiwuBx*w09jEMwh2Bi^25oum`=XK>atiJyorXy<7JQDN4^j5lf1wpc z3F<5cqCHYtGF^$k+^=$6nL@j{l{*a|rP~CG2t^GVwQLyd>d67?guSlgTqU%zo-q{p zo2gV-*sQgqKKVORj%Jz)iFiX#RPf1fd!E6DZo(!idg{( zacVqL7ztnYYC_de<;d?TP%_j;Jc1hA6r79%=cU-TFk^KtC_xmfEeq|~bJ0*Mcw|T&!Q*qH?c|}*eA&~K>?xlkHb~M<$p42G znmjd=JgviRDeyB`5<9|FIOPMQB_SbPS zR)(4)@BFFx>mD=@zyn(5t#k{p^1;qx48+^1O-a zG)|k^nC9l&lX4{!h%iNmi<9ej@NUJq0$c*!E;7IS@QWnEL8b$L2t&j!-gTG3_15LCCYxT(#)XdzN6VG)_zEY>F88A&hSY>WCsZj@dC)@}ARfg#2gFITYx``#tvE&De0-SQh*gH{DCCGSEYdLV_jnUpwj#7$yoB5pknBh4WHebiZ#Q^;*fS&%^I*l# zWoor)+W8125135lX$qb78Ea;+$Bkr1<{5OLfZ6Or-u71uJT4DGDk$&%bR z;GaO2f@f)*gYKMaDjoB}{6>4IQB&%Zx;=OyAfdwdNmzrJ0e}|9aZDWZVmG6Fj_=;W z%*|PZA^w*0HbRUA4~a<-C^~gx;hgOXBc*?FQ@Zc2)@-*Z$UAZ*!Xf7WkF)sFe;XBT zAGIbSZayAx&cj%3M;(e+(96$ZTKYrmcffuVWw53QK_^5!Z8^FcHH!n8@9ly)L z3bI$nGEg)_uVij$1Q>_a12x$Mzj&9KnhPSUwJrWFeD(TSFTx}`Ez?$XEI>7j(Tq7L zHgg>ohlEFgNq%&rHG|h%5vBa=!1J=BkkpE)w%6b5T;s8THyuY;QVuMiJN6;!rZN2bqSiIO13l9CKoInGgQU62O z06;vVnx%|NxdnvWfqocv7JBGeq1EFfv zj@-U6%sgxB3b=GNR61R19B-d4(p9h)yI(Iw7&`)TO3NOe|9tDL@C6k>n$N)_tUhb; zBbZ~ZqptO0`5SI^ptOmJ3Oxy92eo8VoF&)jA3#}ZPS$> z#_v340xd0{(zET|VAvc;U^8bM>q+<0`Et^4(Bto+-S9dwXodT{xeuDH754V!d`mP? zdQJ-jDMXp_vGWi%W4e6x4k@_CFp}YeZ99`NpC&*Ip&u`UtI`?6Q}QUh8E5~o;{GyyM^rV znS_)Oo-y^ZvHd^gk!OYoYLIei=K4M8d!s!_Ef9p0(16Nc3oWl@v3PfInxuFStimsG z;&Q56yF5SNQz8;vB3x&{ZT&kPk9eP?#1vJbTcVNiFq{pRvMc!AV1Y(nir}s z1+{UdDN6^Nm0L6;RdiUaAiKA2d-}(ovDz5Byl#AGrsIsqiUE0&{?U7zpS?gQe11R@ zGqrnyeJMmILA#sjK*hM~=sl#Z)h^72p`w(OBUNW;w*)}opH~k_x&S1C|Ab|>(iSSK zUsg_PkIJS0jx|4p*Jzm+Z0_=pVD?yoo@OS2rj)sJmEVcFQzmcX3S)-MBAHy?u;&k4 zv?xp2)OysF@#0q!=`jX{BkV*R^qUJTr?kqUwy?EP(f7-hRgob?2MFV6FtDec50cwz zl_`g-n>Y0R?y+$?b>3bEld@B}t8*?RG`1a}STL<$D~quLV2X>TalRF2{1}7Y&|#2R zigS~RP3GSTJ!Ed)0z3Z>p3u3z$9m4zW&jYf__fON;mwgS`+yVWKrFZ0n| z6i7p)BkYM;48tNtX6*;7YOjO!q$z3x@it-@cvx$)`78Gb3ZQC$?I~K!vpQ5DuWJX1 z7!ARjka5nQYnD{b%UijAbX7n5xaz)wOmartu~HcUP8@oA_CFBW3Xd! zxCZp32rD-SYLE_>T~Sgcyg`h?JIJGepUwp!AKq@V^r})xt4eDPPpB{XrxJbejBlXCs?b6)9Py?E?CMm ze6NutF1JRORGQeCLcBx|SV2QVY!Xi8#GG9BE>v^yf3y)Q2BAPH%WjPo9Qn)Qjj`$2 zaJlY#nZNI8Gjm%zsRB1mNFR<)?QyUxq>4U#clOMTPhu+%Ez^Mbr{~#q@l-)_|7jW2 zd^bB<0M=bRtOB$K+(<+)_Pau3w4`h0y7yZID`>l%vWl!|Mt;{LKHk3>K}eIW1Wwgu z=geiO=ie+ezE#o1G5Hs_=YwEZ%M+VVUOniW?&mVTg5)CpfE?Ua^9LnK_Ma_eGM0Qs znt2K1l&Dt&S{bY&j3+R1i(1P8@b@#x)XntAuxztmZ2fo ztoWxBj%3v>8i_B6@UrD9-6G0pmSW8PKu2Fa>zQ|`>< z{M3-xJLT&7mG@=Y&kbC*sk!biqB*iPcQiDRbrODNY9)?lhrY+@7i)Qyt-!e2DJwCq(eDjXh-M1-n%`t~N=yH_~pVVq-YxC*=OwQJambp0I%`3)Ir(Af^$FP zz%L!d?wUj2KC-G<6I3{j2kmc!BSqlL6Oi!PQl*ot!I=t@6z{7%jjXp&;9h;DZhR^i z0_y!6i#_QoEK}rWLO_9M z*BftgJ_eHaeY|@rdSQU<5THJ7?lw;8R>UFa#V=S`hpU!7CyT1)^bK+oz)={?PP58K z_Cb(;x}LVdMIi1NC1C+ucx*B~CS8K*tvAHKsKAkpRC{$%SFT2W+)jCQ4{5ip&aH5g zl%bB&XE$BR`v)Ku+mRou!+bmEaSpiy{nybaavRnW>i={#Tdv;w0cdvQn6%&Buu_>H z<{`cS8tzW|AEkoXFmp%`0s>0o3X;2Q(FB`7lr)dU#s-U^xxFjADms2LqTgyN+B6<` z1z#l?6I<&7_9t@JBN2F{M`}SAumBU5a}Wlmce=sp566M#fl6>ITtvmPW_gG~?pIAP zh67#KpJRijNfVv;J{@nOh-h571oKkQ>{oShQ5SZgk%ju`2P){;O!}pObWqEdt8FPf zsUEwTSY>>D$KZa-tDu0j@8H01X!pkm$~m*%qbYfwl+#u33)wXUz&>8NJ5xDby)9M3 zX}{X|(Krh3LPuDJXQ6yN(N<8`ZHl3eml|oFPZXPs@6QT@<#5s~&r+Q(zukjEMXiU8 z7`n4S_he(fDo!&aDLS$XaQ)?s5v{qGx^PF&Kd9D~pmA1JE-_x2E zT)t9^>4fEOZD3TR>XbNMc?VS#eL*=y8$*#GS=YN)zr^dbOU}J7Fr-Z3a2ORI~p)YQ@IzQcd&1)|^j`ccdB(k~z(K zux@{*Wg*4Y59(FoU94a=J5^Xns}mCyP18 z2NO$wzyNz8N7fE652k&mh(85rXTuC$9J4GpxGa9^hOdn3x-;q=s{>w1n=8{-gPIXz z;7(Q^b8fzLWFEjCtGDMc?QGBBTGhx)^Bizo56L=J8EtGUk%!gjL@F_m1>|)4h5LZ` zm@{NTV_XA{d+8-B30o(XKvL`#00hdRbU-{=4*gey5e{vbRqK0!ZqTg8$^Wv&o%90U z3J;2uHMj`_C|miDEo~8iDu547sWc1Wgn_Ou#W^THXu?h0ZVP5^jKCAfQ?keg5Wl9c z5rF-1bU<&qgh?G8wViQmrnz+yAx<|QqSg1=PaMyKmJ@nHL^WF2U?qZ7x5DlA_57Gw zI-zi3NE#FDvexXQ%tisPI3>tK(>52XYaoANdH~}-+Hhr9eE=1YjPv-`;|1{bmh+uJ4 zEWYr9Sn{@9R*QeGsCig_zq+S?*hi@_W*4~KeL>$J>t)AW%qLs#Q9t?szb1|5e%zDQ z_e*ND_HtI2%g-p|2+wEm#(pC4#tejAL$K8UICIDNz+V zx-flshVQWMxdF5H9svHzMiZ2G7m(xkRShijztkUzZus+ng0aM>=e@4O#u&vy$gk%}H#0BQw0rFnxzv1Uv`aED@ z6|3z5%dR^V+!z8N;tm2IMv5sWB-|Hm&iX_397H5;l<{hai^naE#zU)MKQ@|<$E!>5 zPi;Z1<(4eY*(UTh(()XuJ(Fp6*?Bfx?3NvEB+1a_p5ZBuY_KDn8@VQFcVy{IHI4(H zwNfseq4v9E+Rm&t_VViGVuYP zvH^BhN8@RrvvlgrB4Jj1VIKw}MHizSjX9KC=0_|&<2=G~%JJ^QBPRxgM%BNy+TpOp z-ia?PkH&Ti!fdlY0Sa|e8A==b5$gl6xHWmuJEK!&pQU1XQ=_MJuX9Dh+jPBp zT*v_B!t+M^n%cVWvud?#o?lexfJa%;CRK9wt7B0!GYO%he%v%sSs=K$i0qV`piyMf#`fM5v4GG zYc4w9e`yYz^Ity<07_7kZv0U^LOOE#BZQf|Kh%?eBiDmTaD2`>%7 zrF^bCibzA(&YmwnwQKRC4k?%oZ?GWVVOh`{=c7j#uLPLcZ_V#KohRqv;e+7_0~Z z#_d#sw40u0_*%F|1gpI2cGSacID<5o^UHrgC(Dk+Ql|F_F@MW#+od*MUK-d>S;}XC z#&8?3PlJ<7;1)J_@Wf%>iDJt>oSxLrKtrEhW<>CPo&A#du$1L_Tv5tZ)!>Sc{0XXx z10}5k+WH6T^cYi2j@6tGc>mqKvC}jKSjfD5MF|&Ie&Z&UW*Tm3$??pQzqfPOxyMv=j&VlD)!# z6eM>ujQWpaw<&xRFl^*fov&tgBFP+XOPVsr7IFWomtUtTgiBs~X9-b2qlrG!nKbM8 zJ8+NTJy(qLNiUmd`mwV~;g>t%OmJtwoc}};DHO2Knxm>rpad~RM0|UOMEH}+e3?;y zFQ)^*El0xB;z#_SWtr>(i)4epZI#>q;zKti-|kW(4TEYZj4E$e@MmN@tUqGYQ@`>` zMOO@$y;TH5jvx9=f_v&Z2e<+W`_Ne^$(vMh3qk~qUT{w{Id+9X;siYh46Xpdb;vQ(47wZC+mqVvnx2JEy?ku=A0M(FJv)K3!{( z^oQ6)`t4ZVO@CLb*5;vYy~2!UX+r`)j(N3}=R5pl5v?SYG#`{N1td>iQ$9kuFRPt0(Ft_DM8y3Jk?+BYEM3UhT76S3Ae%-xf_Q>L})Km$=618dVb>#IN&G9 z1#RXwgW^sfKh94GDDi~Li6dVPCNv~~SAvqW5O~qaJb|qJuoYYsC^pl|&+Tkr0(+h;4xn`cYR9Q&@J<9FFs|mZr0y-8~(x;|x+T4?s&Z1b5g7`NlsN z$)_u?`6QIPGb$wLapj}U9N`*a2~h!Pv5=w)jbZo9`O|eX2OJ{s$BREh05zCz6zDl( zh%#MOtD#wPq-z|Qf~tgOuH|qwUv23JJGW})W1R>>3igSbRX%8r2;xyV_tC7=L{SJp zR`wOrqqK+zid+%2_@JgpllpC%*qz_kP(lT&ZrOVmeph?)qZiCWAi#VGGCJ(S7Eq

+[TestFixture] +[Category("ExternalFsInterop")] +public sealed class Reiser4FeatureExternalTests { + + private string _tmpDir = null!; + + [SetUp] + public void SetUp() { + this._tmpDir = Path.Combine(Path.GetTempPath(), "cwb_r4feat_" + Guid.NewGuid().ToString("N")[..8]); + Directory.CreateDirectory(this._tmpDir); + } + + [TearDown] + public void TearDown() { + try { Directory.Delete(this._tmpDir, recursive: true); } catch { /* best effort */ } + } + + private static byte[] Text(int lines, int salt) { + var text = new StringBuilder(); + for (var i = 0; i < lines; ++i) text.Append("line ").Append(i).Append(" of ").Append(salt).Append(": plain words the printf in debugfs cannot misread\n"); + return Encoding.ASCII.GetBytes(text.ToString()); + } + + private string Save(string name, byte[] image) { + var path = Path.Combine(this._tmpDir, name); + File.WriteAllBytes(path, image); + return path; + } + + private byte[] Mkfs(string name, string options) { + var path = Path.Combine(this._tmpDir, name + ".mkfs.img"); + var wsl = FsInteropToolbox.WinToWsl(path); + var run = FsInteropToolbox.RunWsl($"truncate -s 64M {wsl} && mkfs.reiser4 -fffy -L {name} {options} {wsl}"); + Assert.That(run.ExitCode, Is.EqualTo(0), $"mkfs.reiser4 {options} failed:\n{run.StdOut}\n{run.StdErr}"); + return File.ReadAllBytes(path); + } + + private static void AssertFsckConsistent(string path) { + var wsl = FsInteropToolbox.WinToWsl(path); + var run = FsInteropToolbox.RunWsl($"cp {wsl} {wsl}.fsck && fsck.reiser4 --check -y {wsl}.fsck; rc=$?; rm -f {wsl}.fsck; exit $rc"); + var text = run.StdOut + "\n" + run.StdErr; + Assert.That(run.ExitCode, Is.EqualTo(0), $"fsck.reiser4 rejected {Path.GetFileName(path)}:\n{text}"); + Assert.That(text, Does.Contain("FS is consistent"), $"fsck.reiser4 did not call {Path.GetFileName(path)} consistent:\n{text}"); + } + + /// + /// The bytes of a plain-text file as debugfs.reiser4 -k reads them through its own path lookup and + /// body plugins. reiser4progs keys a lookup below the root with its own default profile rather + /// than the root's plugin set (a kernel-written volume behaves the same way), so the volume's + /// mkfs options are handed to it as its profile. + /// + private static string Cat(string path, string member, string profile = "") { + var run = FsInteropToolbox.RunWsl($"debugfs.reiser4 {profile} -k '/{member}' {FsInteropToolbox.WinToWsl(path)} /dev/null"); + Assert.That(run.ExitCode, Is.EqualTo(0), $"debugfs.reiser4 -k /{member} failed:\n{run.StdOut}\n{run.StdErr}"); + return run.StdOut; + } + + /// What debugfs.reiser4 -i prints about an object (its stat data and every item). + private static string Items(string path, string member, string profile = "") { + var run = FsInteropToolbox.RunWsl($"debugfs.reiser4 {profile} -i '/{member}' {FsInteropToolbox.WinToWsl(path)} &1"); + Assert.That(run.ExitCode, Is.EqualTo(0), $"debugfs.reiser4 -i /{member} failed:\n{run.StdOut}\n{run.StdErr}"); + Assert.That(run.StdOut, Does.Not.Contain("Can't find"), $"debugfs.reiser4 cannot resolve /{member}:\n{run.StdOut}"); + return run.StdOut; + } + + private static string RootProfile(string path) { + var info = Items(path, ""); + return string.Join('\n', info.Split('\n').Select(static l => l.Trim()).Where(static l => Regex.IsMatch(l, @"^\w+ : id = "))); + } + + public static readonly string[] Profiles = [ + "-o hash=tea_hash", "-o hash=fnv1_hash", "-o hash=deg_hash", "-o hash=r5_hash", + "-o fibration=lexic_fibre", "-o fibration=dot_o_fibre", "-o fibration=ext_1_fibre", "-o fibration=ext_3_fibre", + "-o formatting=tails", "-o formatting=extents", "-o formatting=smart", "-o create=reg40", + "-o compress=gzip1", "-o compress=zstd1", "-o compressMode=force", "-o compressMode=none", "-o cluster=4K", + "-o node=node41", "-o create=reg40,formatting=tails,hash=tea_hash,fibration=ext_3_fibre", + ]; + + [TestCaseSource(nameof(Profiles)), Category("HappyPath")] + public void GivenAVolumeMkfsMadeWithAPluginProfile_WhenAddingFilesUnderEveryBodyType_ThenFsckPassesTheNamesResolveAndTheProfileStays(string options) { + Reiser4Oracle.Require(); + var original = this.Mkfs("prof", options); + var originalPath = this.Save("original.img", original); + using var image = new MemoryStream(); + image.Write(original); + var descriptor = new Reiser4FormatDescriptor(); + var names = new[] { "plain.txt", "a-name-longer-than-twenty-three-characters.txt", "source.c", "object.o", "x.abc", new string('z', 255) }; + var seed = 0; + foreach (var body in new[] { Reiser4FileBody.Extents, Reiser4FileBody.Tails, Reiser4FileBody.Profile }) + descriptor.Add(image, [.. names.Select(n => ArchiveInputInfo.InMemory($"{body}/{n}", Text(300, ++seed)))], body); + descriptor.AddSymlink(image, "links/to-plain", "../Extents/plain.txt"); + descriptor.AddHardLink(image, "links/hard", "Tails/source.c"); + descriptor.AddSpecialFile(image, "links/fifo", 0x11A4); + var edited = this.Save("edited.img", image.ToArray()); + + AssertFsckConsistent(edited); + Assert.Multiple(() => { + Assert.That(RootProfile(edited), Is.EqualTo(RootProfile(originalPath)).And.Not.Empty, "the root's plugin set"); + seed = 0; + foreach (var body in new[] { Reiser4FileBody.Extents, Reiser4FileBody.Tails, Reiser4FileBody.Profile }) + foreach (var name in names) { + var text = Encoding.ASCII.GetString(Text(300, ++seed)); + var items = Items(edited, $"{body}/{name}", options); + // reiser4progs has no decompressor: a cryptcompress file's bytes are the kernel oracle's to judge. + if (!items.Contains("ccreg40", StringComparison.Ordinal)) + Assert.That(Cat(edited, $"{body}/{name}", options), Does.Contain(text), $"{options}: {body}/{name}"); + } + Assert.That(Items(edited, "links/to-plain", options), Does.Contain("../Extents/plain.txt")); + Assert.That(Items(edited, "links/hard", options), Does.Contain("nlink:\t\t2")); + }); + } + + [Test, Category("HappyPath")] + public void GivenTheRupasovHash_WhenAddingNames_ThenShortNamesAreAddedAndLongOnesRefusedWithTheImageUntouched() { + Reiser4Oracle.Require(); + var original = this.Mkfs("rupasov", "-o hash=rupasov_hash"); + using var image = new MemoryStream(); + image.Write(original); + var descriptor = new Reiser4FormatDescriptor(); + descriptor.Add(image, [ArchiveInputInfo.InMemory("short-name.txt", Text(10, 1))]); + var afterShort = image.ToArray(); + var error = Assert.Throws(() => descriptor.Add(image, + [ArchiveInputInfo.InMemory("a-name-longer-than-twenty-three-characters.txt", Text(10, 2))])); + var path = this.Save("rupasov.img", image.ToArray()); + Assert.Multiple(() => { + Assert.That(error!.Message, Does.Contain("Rupasov")); + Assert.That(image.ToArray(), Is.EqualTo(afterShort), "a refused edit leaves the image byte-identical"); + }); + AssertFsckConsistent(path); + Assert.That(Cat(path, "short-name.txt"), Does.Contain(Encoding.ASCII.GetString(Text(10, 1)))); + } + + [TestCaseSource(typeof(Reiser4KernelVolumeTests), nameof(Reiser4KernelVolumeTests.EditableVolumes)), Category("HappyPath")] + public void GivenAVolumeTheKernelWrote_WhenEditing_ThenFsckCallsItConsistent(string volume) { + Reiser4Oracle.Require(); + using var image = new MemoryStream(); + image.Write(Reiser4KernelVolumeTests.Image(volume)); + var descriptor = new Reiser4FormatDescriptor(); + descriptor.Add(image, [ArchiveInputInfo.InMemory("added/a-new-name-longer-than-twenty-three.txt", Text(500, 3))], Reiser4FileBody.Profile); + descriptor.AddSymlink(image, "added/link", "../f_100"); + descriptor.Remove(image, ["dir/foo.o"]); + AssertFsckConsistent(this.Save($"{volume}.img", image.ToArray())); + } + + [Test, Category("HappyPath")] + public void GivenATallTree_WhenScatteringAndDefragmentingInPlace_ThenFsckCallsEveryStepConsistentAndNoNodeMoves() { + Reiser4Oracle.Require(); + var writer = new Reiser4Writer { BlockCount = 16_384 }; + for (var i = 0; i < 1_500; ++i) writer.AddFile($"t/f{i:D5}", Text(1 + i % 60, i)); + using var image = new MemoryStream(writer.Build()); + var nodes = Reiser4TestLayouts.NodeBlocks(image); + Assert.That(Reiser4TestLayouts.NodeBlocks(image).Length, Is.GreaterThan(20), "a tree of several twigs"); + Reiser4TestLayouts.ScatterInPlace(image); + AssertFsckConsistent(this.Save("scattered.img", image.ToArray())); + new Reiser4FormatDescriptor().Defragment(image); + var path = this.Save("defragmented.img", image.ToArray()); + AssertFsckConsistent(path); + Assert.That(Reiser4TestLayouts.NodeBlocks(image), Is.EqualTo(nodes), "the in-place pass moved data, not nodes"); + Assert.That(Cat(path, "t/f01499"), Does.Contain(Encoding.ASCII.GetString(Text(1 + 1_499 % 60, 1_499)))); + } +} diff --git a/Compression.Tests/Reiser4/Reiser4KernelOracle.cs b/Compression.Tests/Reiser4/Reiser4KernelOracle.cs new file mode 100644 index 000000000..d338e2097 --- /dev/null +++ b/Compression.Tests/Reiser4/Reiser4KernelOracle.cs @@ -0,0 +1,58 @@ +namespace Compression.Tests.Reiser4; + +/// +/// A Reiser4 kernel under QEMU as the oracle: it mounts an image, resolves every path and reads +/// every file whole, and reports what it found as a manifest (see KernelOracle/). Nothing a +/// test does with it is taken on our reader's word. +/// +/// +/// The kernel package is fetched once by kernel-run.sh --prepare; tests do that only when +/// CWB_REISER4_KERNEL_DOWNLOAD=1, and otherwise skip unless it is already in place. +/// +internal static class Reiser4KernelOracle { + + private static readonly string ScriptDirectory = Path.Combine(AppContext.BaseDirectory, "Reiser4", "KernelOracle"); + private static bool? _available; + + internal static void Require() { + if (!FsInteropToolbox.WslAvailable && OperatingSystem.IsWindows()) + Assert.Ignore("WSL is not available on this machine."); + _available ??= Prepare(); + if (_available != true) + Assert.Ignore("The Reiser4 kernel oracle is not prepared (set CWB_REISER4_KERNEL_DOWNLOAD=1 to fetch it; needs qemu-system-x86_64)."); + } + + private static bool Prepare() { + var script = FsInteropToolbox.WinToWsl(Path.Combine(ScriptDirectory, "kernel-run.sh")); + var mode = Environment.GetEnvironmentVariable("CWB_REISER4_KERNEL_DOWNLOAD") == "1" ? "--prepare" : "--check"; + return FsInteropToolbox.RunWsl($"bash {script} {mode}").ExitCode == 0; + } + + /// What the kernel made of an image: its manifest and any complaints it logged. + internal sealed record Mount(IReadOnlyDictionary Manifest, string[] Complaints, string Log); + + /// Mounts a copy of and reads everything in it. + internal static Mount Read(string imagePath) { + var copy = imagePath + ".kernel"; + File.Copy(imagePath, copy, overwrite: true); + try { + var script = FsInteropToolbox.WinToWsl(Path.Combine(ScriptDirectory, "kernel-run.sh")); + var guest = FsInteropToolbox.WinToWsl(Path.Combine(ScriptDirectory, "manifest.sh")); + var run = FsInteropToolbox.RunWsl($"bash {script} {FsInteropToolbox.WinToWsl(copy)} {guest}"); + var log = run.StdOut + "\n" + run.StdErr; + Assert.That(run.ExitCode, Is.EqualTo(0), $"the kernel run did not finish:\n{log}"); + Assert.That(log, Does.Not.Contain("MOUNTFAIL"), $"the kernel refused to mount the volume:\n{log}"); + var complaints = log.Split('\n').Where(static l => l.StartsWith("dmesg:", StringComparison.Ordinal)) + .Where(static l => l.Contains("WARNING", StringComparison.OrdinalIgnoreCase) || l.Contains("error", StringComparison.OrdinalIgnoreCase) || + l.Contains("bad", StringComparison.OrdinalIgnoreCase) || l.Contains("fsck", StringComparison.OrdinalIgnoreCase) || + l.Contains("BUG", StringComparison.Ordinal) || l.Contains("Oops", StringComparison.Ordinal)) + .ToArray(); + var start = log.IndexOf("===MANIFEST===", StringComparison.Ordinal); + var end = log.IndexOf("===END-MANIFEST===", StringComparison.Ordinal); + Assert.That(start >= 0 && end > start, Is.True, $"the kernel printed no manifest:\n{log}"); + return new Mount(Reiser4KernelVolumeTests.ParseManifest(log[start..end]), complaints, log); + } finally { + try { File.Delete(copy); } catch { /* best effort */ } + } + } +} diff --git a/Compression.Tests/Reiser4/Reiser4KernelOracleTests.cs b/Compression.Tests/Reiser4/Reiser4KernelOracleTests.cs new file mode 100644 index 000000000..5d10dcaed --- /dev/null +++ b/Compression.Tests/Reiser4/Reiser4KernelOracleTests.cs @@ -0,0 +1,197 @@ +using System.Security.Cryptography; +using System.Text; +using Compression.Registry; +using FileSystem.Reiser4; + +namespace Compression.Tests.Reiser4; + +/// +/// The Reiser4 kernel judges what the writer produces: it mounts each volume, resolves every path +/// and reads every byte, and its manifest must be what was written. Volumes it wrote itself are +/// edited and handed back to it, so carried objects, new names keyed under every hash and +/// fibration plugin, and compressed clusters written with lzo1, gzip1 and zstd1 are all read by the +/// implementation that owns the format. Wherever reiser4progs is installed, fsck.reiser4 checks the +/// same volumes. +/// +[TestFixture] +[Category("ExternalFsInterop")] +public sealed class Reiser4KernelOracleTests { + + private string _tmpDir = null!; + + [SetUp] + public void SetUp() { + this._tmpDir = Path.Combine(Path.GetTempPath(), "cwb_r4kernel_" + Guid.NewGuid().ToString("N")[..8]); + Directory.CreateDirectory(this._tmpDir); + } + + [TearDown] + public void TearDown() { + try { Directory.Delete(this._tmpDir, recursive: true); } catch { /* best effort */ } + } + + private static byte[] Random(int length, int seed) { + var bytes = new byte[length]; + new Random(seed).NextBytes(bytes); + return bytes; + } + + private static byte[] Text(int lines) { + var text = new StringBuilder(); + for (var i = 0; i < lines; ++i) text.Append("line ").Append(i).Append(": compressible text for the cluster codecs\n"); + return Encoding.ASCII.GetBytes(text.ToString()); + } + + private static string Md5(byte[] data) => Convert.ToHexString(MD5.HashData(data)).ToLowerInvariant(); + + private string Save(string name, byte[] image) { + var path = Path.Combine(this._tmpDir, name); + File.WriteAllBytes(path, image); + return path; + } + + /// fsck.reiser4 --check on a copy, when reiser4progs is reachable. + private static void FsckIfAvailable(string path) { + if (!FsInteropToolbox.WslHasTool("fsck.reiser4")) return; + var wsl = FsInteropToolbox.WinToWsl(path); + var run = FsInteropToolbox.RunWsl($"cp {wsl} {wsl}.fsck && fsck.reiser4 --check -y {wsl}.fsck; rc=$?; rm -f {wsl}.fsck; exit $rc"); + var text = run.StdOut + "\n" + run.StdErr; + Assert.That(run.ExitCode == 0 && text.Contains("FS is consistent"), Is.True, $"fsck.reiser4 rejected {Path.GetFileName(path)}:\n{text}"); + } + + /// What a test expects the kernel to find at a path. + private sealed record Expected(string Type, long Size, string Value, uint Links = 0, int Mode = -1, ulong Device = 0); + + private static void AssertKernelReads(string path, IReadOnlyDictionary expected, IReadOnlySet? unchecked_ = null) { + var mount = Reiser4KernelOracle.Read(path); + Assert.That(mount.Complaints, Is.Empty, "the kernel logged complaints:\n" + string.Join('\n', mount.Complaints)); + var seen = mount.Manifest.Keys.Where(static k => k != ".").Order(StringComparer.Ordinal).ToArray(); + Assert.That(seen, Is.EqualTo(expected.Keys.Order(StringComparer.Ordinal)), "the namespace the kernel resolves"); + Assert.Multiple(() => { + foreach (var (name, want) in expected) { + if (unchecked_?.Contains(name) == true) continue; + var got = mount.Manifest[name]; + Assert.That(got.Type, Is.EqualTo(want.Type), name + " type"); + if (want.Type != "directory") Assert.That(got.Size, Is.EqualTo(want.Size), name + " size"); + if (want.Value.Length > 0) Assert.That(got.Value, Is.EqualTo(want.Value), name + " bytes or target"); + if (want.Links != 0) Assert.That(got.Links, Is.EqualTo(want.Links), name + " links"); + if (want.Mode >= 0) Assert.That(got.Mode, Is.EqualTo(want.Mode), name + " mode"); + if (want.Device != 0) Assert.That(got.Device, Is.EqualTo(want.Device), name + " device"); + } + }); + } + + private static Dictionary FromManifest(IReadOnlyDictionary manifest) + => manifest.Where(static p => p.Key != ".").ToDictionary(static p => p.Key, + static p => new Expected(p.Value.Type, p.Value.Size, p.Value.Value, p.Value.Links, p.Value.Mode, p.Value.Device), StringComparer.Ordinal); + + [TestCase(Reiser4FileBody.Extents)] + [TestCase(Reiser4FileBody.Tails)] + [TestCase(Reiser4FileBody.Smart)] + [TestCase(Reiser4FileBody.Compressed)] + [Category("HappyPath")] + public void GivenEveryObjectKindTheWriterMakes_WhenTheKernelMountsTheVolume_ThenItReadsBackExactlyWhatWasWritten(Reiser4FileBody body) { + Reiser4KernelOracle.Require(); + var writer = new Reiser4Writer { FileBody = body, BlockCount = 8192 }; + var expected = new Dictionary(StringComparer.Ordinal); + void File(string name, byte[] data) { + writer.AddFile(name, data); + expected[name] = new Expected(data.Length == 0 ? "regular empty file" : "regular file", data.Length, Md5(data)); + } + void Directory(string name) => expected[name] = new Expected("directory", 0, ""); + var seed = 0; + foreach (var size in new[] { 0, 1, 4_095, 4_096, 4_097, 16_384, 16_385, 70_000 }) File($"sizes/f{size}", Random(size, ++seed)); + File("sizes/text.c", Text(6_000)); + File("names/" + new string('n', 23), Random(10, ++seed)); + File("names/" + new string('n', 24), Random(10, ++seed)); + File("names/a-name-longer-than-twenty-three.txt", Random(10, ++seed)); + File("names/" + new string('x', 255), Random(10, ++seed)); + File("names/x.c", Random(10, ++seed)); + File("names/x.o", Random(10, ++seed)); + writer.AddDirectory("empty/inner"); + writer.AddSymlink("links/short", "../sizes/f1"); + var longTarget = string.Concat(Enumerable.Repeat("target/", 60)) + "end"; + writer.AddSymlink("links/long", longTarget); + writer.AddHardLink("links/hard", "sizes/f4097"); + writer.AddSpecialFile("special/fifo", 0x11A4); + writer.AddSpecialFile("special/char", 0x21A4, 1UL << 20 | 3); + writer.AddSpecialFile("special/block", 0x61A4, 7UL << 20); + writer.AddSpecialFile("special/socket", 0xC1ED); + expected["sizes/f4097"] = expected["sizes/f4097"] with { Links = 2 }; + expected["links/hard"] = expected["sizes/f4097"]; + expected["links/short"] = new Expected("symbolic link", 11, "../sizes/f1"); + expected["links/long"] = new Expected("symbolic link", longTarget.Length, longTarget); + expected["special/fifo"] = new Expected("fifo", 0, "", Mode: 0x1A4); + expected["special/char"] = new Expected("character special file", 0, "", Device: 1UL << 20 | 3); + expected["special/block"] = new Expected("block special file", 0, "", Device: 7UL << 20); + expected["special/socket"] = new Expected("socket", 0, "", Mode: 0x1ED); + foreach (var dir in new[] { "sizes", "names", "empty", "empty/inner", "links", "special" }) Directory(dir); + + var path = this.Save($"kinds-{body}.img", writer.Build()); + FsckIfAvailable(path); + AssertKernelReads(path, expected); + } + + [TestCaseSource(typeof(Reiser4KernelVolumeTests), nameof(Reiser4KernelVolumeTests.EditableVolumes)), Category("HappyPath")] + public void GivenAVolumeTheKernelWrote_WhenAddingLinkingAndRemoving_ThenTheKernelReadsEveryCarriedAndAddedObject(string volume) { + Reiser4KernelOracle.Require(); + var manifest = Reiser4KernelVolumeTests.Manifest(volume); + var expected = FromManifest(manifest); + using var image = new MemoryStream(); + image.Write(Reiser4KernelVolumeTests.Image(volume)); + var descriptor = new Reiser4FormatDescriptor(); + + var text = Text(4_000); + var noise = Random(30_000, 11); + // Profile: on a cryptcompress volume the new files are compressed clusters made with the + // volume's own compression plugin and cluster size. + descriptor.Add(image, [ + ArchiveInputInfo.InMemory("added/compressible-text-with-a-long-name.txt", text), + ArchiveInputInfo.InMemory("added/noise.bin", noise), + new ArchiveInputInfo("", "added/empty", IsDirectory: true), + ], Reiser4FileBody.Profile); + descriptor.AddSymlink(image, "added/link", "../f_100"); + descriptor.AddHardLink(image, "added/hard", "f_4097"); + var removed = manifest.Keys.First(static k => k.StartsWith("many/", StringComparison.Ordinal)); + descriptor.Remove(image, [removed, "dir/foo.o"]); + + expected.Remove(removed); + expected.Remove("dir/foo.o"); + expected["added"] = new Expected("directory", 0, ""); + expected["added/empty"] = new Expected("directory", 0, ""); + expected["added/compressible-text-with-a-long-name.txt"] = new Expected("regular file", text.Length, Md5(text)); + expected["added/noise.bin"] = new Expected("regular file", noise.Length, Md5(noise)); + expected["added/link"] = new Expected("symbolic link", 8, "../f_100"); + expected["f_4097"] = expected["f_4097"] with { Links = expected["f_4097"].Links + 1 }; + expected["added/hard"] = expected["f_4097"]; + + var path = this.Save($"{volume}-edited.img", image.ToArray()); + FsckIfAvailable(path); + AssertKernelReads(path, expected, new HashSet(StringComparer.Ordinal) { "many", "dir" }); + } + + [Test, Category("HappyPath")] + public void GivenATallTree_WhenDefragmentingInPlace_ThenTheKernelReadsEveryFileFromItsNewBlocks() { + Reiser4KernelOracle.Require(); + var writer = new Reiser4Writer { BlockCount = 16_384 }; + var expected = new Dictionary(StringComparer.Ordinal) { ["t"] = new("directory", 0, "") }; + for (var i = 0; i < 1_500; ++i) { + var data = Random(1 + i % 9_000, i); + writer.AddFile($"t/f{i:D5}", data); + expected[$"t/f{i:D5}"] = new Expected("regular file", data.Length, Md5(data)); + } + using var image = new MemoryStream(writer.Build()); + var descriptor = new Reiser4FormatDescriptor(); + descriptor.Remove(image, [.. Enumerable.Range(0, 1_500).Where(static i => i % 3 == 0).Select(static i => $"t/f{i:D5}")]); + foreach (var i in Enumerable.Range(0, 1_500).Where(static i => i % 3 == 0)) expected.Remove($"t/f{i:D5}"); + // Removal by rebuild leaves the volume compact; scatter it again so the in-place pass has work. + Reiser4TestLayouts.ScatterInPlace(image); + byte[] before = image.ToArray(); + descriptor.Defragment(image); + Assert.That(Reiser4TestLayouts.NodeBlocks(image), Is.EqualTo(Reiser4TestLayouts.NodeBlocks(new MemoryStream(before))), + "an in-place pass leaves every tree node where it was"); + var path = this.Save("tall-defragmented.img", image.ToArray()); + FsckIfAvailable(path); + AssertKernelReads(path, expected); + } +} diff --git a/Compression.Tests/Reiser4/Reiser4KernelVolumeTests.cs b/Compression.Tests/Reiser4/Reiser4KernelVolumeTests.cs new file mode 100644 index 000000000..342b81ed4 --- /dev/null +++ b/Compression.Tests/Reiser4/Reiser4KernelVolumeTests.cs @@ -0,0 +1,185 @@ +using System.Globalization; +using System.IO.Compression; +using System.Security.Cryptography; +using Compression.Registry; +using FileSystem.Reiser4; + +namespace Compression.Tests.Reiser4; + +/// +/// Volumes a Reiser4 kernel wrote (see ReferenceVectors/README.md): each was formatted by +/// mkfs.reiser4 with a plugin profile and filled through the kernel's own write path, and the +/// manifest beside it is what the kernel read back. The reader must agree with it entry for entry, +/// byte for byte, and the editor must carry every object across an edit unchanged. +/// +[TestFixture] +public sealed class Reiser4KernelVolumeTests { + + internal static readonly string[] Volumes = [ + "default", "gzip1-force-8k", "zstd1-latt-16k", "lzo1-none-4k", "reg40-smart", "reg40-tails", "reg40-node41", + "node41", "tea-lexic", "fnv1-dot-o", "deg-ext-3", "rupasov", "journal-replay", + ]; + + /// Volumes populate.sh filled whose names the writer may key: every hash but Rupasov. + internal static readonly string[] EditableVolumes = [.. Volumes.Where(static v => v is not ("rupasov" or "journal-replay"))]; + + internal static byte[] Image(string name) { + using var resource = typeof(Reiser4KernelVolumeTests).Assembly.GetManifestResourceStream($"Reiser4Vectors.{name}.img.gz") + ?? throw new InvalidOperationException($"reference volume {name} is not embedded"); + using var gzip = new GZipStream(resource, CompressionMode.Decompress); + using var bytes = new MemoryStream(); + gzip.CopyTo(bytes); + return bytes.ToArray(); + } + + /// One line of a kernel manifest. + internal sealed record ManifestEntry(string Path, string Type, int Mode, uint Uid, uint Gid, long Size, uint Links, + long ModifiedTime, ulong Device, string Value); + + internal static Dictionary Manifest(string name) { + using var resource = typeof(Reiser4KernelVolumeTests).Assembly.GetManifestResourceStream($"Reiser4Vectors.{name}.manifest") + ?? throw new InvalidOperationException($"manifest {name} is not embedded"); + using var reader = new StreamReader(resource); + return ParseManifest(reader.ReadToEnd()); + } + + internal static Dictionary ParseManifest(string text) { + var result = new Dictionary(StringComparer.Ordinal); + foreach (var raw in text.Split('\n')) { + var line = raw.TrimEnd('\r'); + if (!line.StartsWith("./", StringComparison.Ordinal)) continue; + var f = line.Split('|'); + var device = f[8].Split(':'); + var major = Convert.ToUInt64(device[0], 16); + var minor = Convert.ToUInt64(device[1], 16); + result[f[0][2..]] = new ManifestEntry(f[0][2..], f[1], Convert.ToInt32(f[2], 8), uint.Parse(f[3], CultureInfo.InvariantCulture), + uint.Parse(f[4], CultureInfo.InvariantCulture), long.Parse(f[5], CultureInfo.InvariantCulture), uint.Parse(f[6], CultureInfo.InvariantCulture), + long.Parse(f[7], CultureInfo.InvariantCulture), major << 20 | minor, string.Join('|', f[9..])); + } + return result; + } + + private static string Md5(byte[] data) => Convert.ToHexString(MD5.HashData(data)).ToLowerInvariant(); + + /// Asserts the reader sees exactly what the kernel manifest lists. + internal static void AssertMatches(Reiser4Reader reader, IReadOnlyDictionary manifest, string label, + IReadOnlySet? skip = null) { + Assert.That(reader.NativeTreeValid, Is.True, $"{label}: {reader.NativeProblem}"); + var entries = reader.Entries.ToDictionary(static e => e.Name, StringComparer.Ordinal); + var expected = manifest.Where(p => p.Key != "." && skip?.Contains(p.Key) != true).ToDictionary(StringComparer.Ordinal); + Assert.That(entries.Keys.Where(k => skip?.Contains(k) != true).Order(StringComparer.Ordinal), + Is.EqualTo(expected.Keys.Order(StringComparer.Ordinal)), $"{label}: the namespace"); + foreach (var (path, want) in expected) { + var entry = entries[path]; + var metadata = entry.Metadata!; + var where = $"{label}: {path}"; + Assert.That(metadata.Mode & 0xFFF, Is.EqualTo(want.Mode), where + " mode"); + Assert.That(metadata.UserId, Is.EqualTo(want.Uid), where + " uid"); + Assert.That(metadata.GroupId, Is.EqualTo(want.Gid), where + " gid"); + Assert.That(metadata.ModifiedTime, Is.EqualTo((uint)want.ModifiedTime), where + " mtime"); + Assert.That(metadata.LinkCount, Is.EqualTo(want.Links), where + " links"); + switch (want.Type) { + case "directory": + Assert.That(entry.IsDirectory, Is.True, where); + Assert.That(metadata.Size, Is.EqualTo(want.Size), where + " size"); + break; + case "regular file" or "regular empty file": + Assert.That(entry.Kind, Is.EqualTo(Reiser4Reader.EntryKind.File), where); + Assert.That(entry.Size, Is.EqualTo(want.Size), where + " size"); + Assert.That(Md5(reader.Extract(entry)), Is.EqualTo(want.Value), where + " bytes"); + break; + case "symbolic link": + Assert.That(entry.Kind, Is.EqualTo(Reiser4Reader.EntryKind.Symlink), where); + Assert.That(entry.LinkTarget, Is.EqualTo(want.Value), where + " target"); + break; + case "fifo": + Assert.That(entry.Kind, Is.EqualTo(Reiser4Reader.EntryKind.Fifo), where); + break; + case "character special file": + Assert.That(entry.Kind, Is.EqualTo(Reiser4Reader.EntryKind.CharacterDevice), where); + Assert.That(entry.Device, Is.EqualTo(want.Device), where + " device"); + break; + case "block special file": + Assert.That(entry.Kind, Is.EqualTo(Reiser4Reader.EntryKind.BlockDevice), where); + Assert.That(entry.Device, Is.EqualTo(want.Device), where + " device"); + break; + default: + Assert.Fail($"{where}: unexpected manifest type {want.Type}"); + break; + } + } + } + + [TestCaseSource(nameof(Volumes)), Category("HappyPath")] + public void GivenAVolumeTheKernelWrote_WhenReading_ThenEveryEntryMatchesWhatTheKernelReadBack(string volume) { + using var reader = new Reiser4Reader(new MemoryStream(Image(volume))); + Assert.Multiple(() => AssertMatches(reader, Manifest(volume), volume)); + } + + [Test, Category("HappyPath")] + public void GivenAVolumeWithACommittedButUnflushedTransaction_WhenReading_ThenTheReplayedViewIsWhatTheKernelMounted() { + var image = Image("journal-replay"); + using var reader = new Reiser4Reader(new MemoryStream(image)); + Assert.That(reader.ReplayedTransactions, Is.GreaterThan(0), "the reference volume must need a replay to be meaningful"); + var unreplayed = image.ToArray(); + Array.Clear(unreplayed, 19 * 4096, 2 * 4096); + using var stale = new Reiser4Reader(new MemoryStream(unreplayed)); + var manifest = Manifest("journal-replay"); + Assert.That(stale.Entries.Select(static e => e.Name).Order(), Is.Not.EqualTo(manifest.Keys.Where(static k => k != ".").Order()), + "without the replay the namespace is the one before the last commit"); + } + + [TestCaseSource(nameof(EditableVolumes)), Category("HappyPath")] + public void GivenAVolumeTheKernelWrote_WhenAddingAndRemoving_ThenEveryOtherObjectIsCarriedUnchanged(string volume) { + var image = new MemoryStream(); + image.Write(Image(volume)); + var manifest = Manifest(volume); + var payload = new byte[9_000]; + new Random(7).NextBytes(payload); + var removed = manifest.Keys.First(static k => k.StartsWith("many/", StringComparison.Ordinal)); + var descriptor = new Reiser4FormatDescriptor(); + descriptor.Add(image, [ArchiveInputInfo.InMemory("added/a-new-name-longer-than-twenty-three.bin", payload)]); + descriptor.Remove(image, [removed]); + + using var reader = new Reiser4Reader(image); + Assert.Multiple(() => { + AssertMatches(reader, manifest, volume, new HashSet(StringComparer.Ordinal) { removed, "many", "added", "added/a-new-name-longer-than-twenty-three.bin" }); + Assert.That(reader.ReplayedTransactions, Is.Zero, "a rebuilt volume has its journal folded in"); + Assert.That(reader.Entries.Any(e => e.Name == removed), Is.False); + Assert.That(reader.Extract(reader.Entries.Single(static e => e.Name == "added/a-new-name-longer-than-twenty-three.bin")), Is.EqualTo(payload)); + }); + } + + [Test, Category("HappyPath")] + public void GivenAVolumeWithAPendingTransaction_WhenEditing_ThenTheReplayedStateIsWhatIsCarried() { + var image = new MemoryStream(); + image.Write(Image("journal-replay")); + var manifest = Manifest("journal-replay"); + new Reiser4FormatDescriptor().Add(image, [ArchiveInputInfo.InMemory("added.bin", [1, 2, 3])]); + using var reader = new Reiser4Reader(image); + Assert.Multiple(() => { + Assert.That(reader.ReplayedTransactions, Is.Zero, "the rebuilt journal is blank"); + Assert.That(image.ToArray().AsSpan(19 * 4096, 2 * 4096).ToArray(), Is.All.Zero); + AssertMatches(reader, manifest, "journal-replay", new HashSet(StringComparer.Ordinal) { "added.bin" }); + }); + } + + [TestCaseSource(nameof(EditableVolumes)), TestCase("rupasov"), Category("Spec")] + public void GivenTheEntriesTheKernelKeyed_WhenKeyingTheirNamesAgain_ThenTheKeysAreIdentical(string volume) { + using var reader = new Reiser4Reader(new MemoryStream(Image(volume))); + var vol = reader.Volume!; + var checkedNames = 0; + foreach (var directory in vol.Objects.Values.Where(static o => o.IsDirectory)) { + var hash = (Reiser4HashId)vol.Plugin(directory, 4); + var fibration = (Reiser4FibrationId)vol.Plugin(directory, 5); + foreach (var entry in directory.Entries.Where(static e => !e.IsDot)) { + if (entry.Hashed && !Reiser4NameKeys.CanHash(hash)) continue; + var (ordering, objectId, offset, _) = Reiser4NameKeys.Make(entry.Name, hash, fibration); + Assert.That((ordering, objectId, offset), Is.EqualTo((entry.Ordering, entry.ObjectId, entry.Offset)), + $"{volume}: {Reiser4Volume.DecodeName(entry.Name)} under {hash}/{fibration}"); + ++checkedNames; + } + } + Assert.That(checkedNames, Is.GreaterThan(300)); + } +} diff --git a/Compression.Tests/Reiser4/Reiser4NativeTreeTests.cs b/Compression.Tests/Reiser4/Reiser4NativeTreeTests.cs index 957765405..b2ac04d69 100644 --- a/Compression.Tests/Reiser4/Reiser4NativeTreeTests.cs +++ b/Compression.Tests/Reiser4/Reiser4NativeTreeTests.cs @@ -422,13 +422,10 @@ public void GivenAVolume_WhenEditingAndDefragmentingByRebuild_ThenTheMkfsIdSurvi }); } - // Offsets inside the fixed blocks that carry the profile rather than the identity: - // the format40 tail policy (block 17, byte 70), the backup of the root directory's - // plugin set (block 22, from byte 127 on), the status block (21) and the journal (19, 20). - [TestCase(17, 70, (byte)1, TestName = "GivenATailsOnlyPolicy_WhenEditing_ThenTheEditIsRefusedAndTheImageIsUntouched")] - [TestCase(22, 131, (byte)2, TestName = "GivenANonDefaultHashInTheBackedUpPluginSet_WhenEditing_ThenTheEditIsRefusedAndTheImageIsUntouched")] + // A status block not marked consistent belongs to a volume the tools found damaged, and a journal + // header naming a transaction that is not there cannot be replayed: neither is rewritten. [TestCase(21, 16, (byte)2, TestName = "GivenAStatusBlockNotMarkedConsistent_WhenEditing_ThenTheEditIsRefusedAndTheImageIsUntouched")] - [TestCase(19, 0, (byte)1, TestName = "GivenAJournalHeaderThatIsNotBlank_WhenEditing_ThenTheEditIsRefusedAndTheImageIsUntouched")] + [TestCase(19, 0, (byte)1, TestName = "GivenAJournalHeaderNamingNoTransaction_WhenEditing_ThenTheEditIsRefusedAndTheImageIsUntouched")] public void VolumeOutsideTheWriterProfile_IsRefusedForEveryRebuild(int block, int offset, byte value) { var writer = new Reiser4Writer(); writer.AddFile("d/f.bin", Payload(3_000, 32)); @@ -453,6 +450,28 @@ public void VolumeOutsideTheWriterProfile_IsRefusedForEveryRebuild(int block, in }); } + // The format40 tail policy (block 17, byte 70) and the backed-up plugin set (block 22) are the + // volume's profile: an edit carries them byte for byte. + [TestCase(17, 70, (byte)1, TestName = "GivenATailsOnlyPolicy_WhenEditing_ThenThePolicyIsCarried")] + [TestCase(22, 131, (byte)2, TestName = "GivenANonDefaultHashInTheBackedUpPluginSet_WhenEditing_ThenTheBackupIsCarried")] + public void ProfileBytesOfTheFixedBlocks_AreCarriedAcrossEdits(int block, int offset, byte value) { + var writer = new Reiser4Writer(); + writer.AddFile("d/f.bin", Payload(3_000, 32)); + var original = writer.Build(); + original[block * Reiser4Writer.BlockSize + offset] = value; + using var image = new MemoryStream(original.ToArray()); + var descriptor = new Reiser4FormatDescriptor(); + descriptor.Add(image, [ArchiveInputInfo.InMemory("x.bin", Payload(10, 33))]); + descriptor.Remove(image, ["d/f.bin"]); + descriptor.Defragment(image); + using var reader = new Reiser4Reader(image); + Assert.Multiple(() => { + Assert.That(image.ToArray()[block * Reiser4Writer.BlockSize + offset], Is.EqualTo(value)); + Assert.That(reader.Entries.Select(static e => e.Name), Is.EquivalentTo(new[] { "d", "x.bin" })); + Assert.That(reader.Extract(reader.Entries.Single(static e => e.Name == "x.bin")), Is.EqualTo(Payload(10, 33))); + }); + } + private static Reiser4Reader.FileMetadata MetadataOfOneFile() { var writer = new Reiser4Writer(); writer.AddFile("f.bin", Payload(100, 39)); @@ -468,7 +487,7 @@ public void GivenStatDataBytesItsMaskDoesNotDeclare_WhenWriting_ThenTheyAreRefus Assert.Throws(() => writer.Build()); } - [TestCase(3, TestName = "GivenASymlinkStatExtension_WhenWriting_ThenItIsRefused")] + [TestCase(6, TestName = "GivenAnUnassignedStatExtension_WhenWriting_ThenItIsRefused")] [TestCase(7, TestName = "GivenACryptoStatExtension_WhenWriting_ThenItIsRefused")] [TestCase(15, TestName = "GivenAChainedExtensionMask_WhenWriting_ThenItIsRefused")] public void UnsupportedStatExtension_IsRefused(int bit) { diff --git a/Compression.Tests/Reiser4/Reiser4ProfileExternalTests.cs b/Compression.Tests/Reiser4/Reiser4ProfileExternalTests.cs index d6e850b63..503857a04 100644 --- a/Compression.Tests/Reiser4/Reiser4ProfileExternalTests.cs +++ b/Compression.Tests/Reiser4/Reiser4ProfileExternalTests.cs @@ -143,22 +143,6 @@ public void GivenAVolumeMkfsWrote_WhenAddingNestedFilesLongNamesAndAnEmptyDirect }); } - [TestCase("-o hash=tea_hash", TestName = "GivenAVolumeMkfsWroteWithTheTeaHash_WhenAdding_ThenTheEditIsRefusedAndTheImageIsUntouched")] - [TestCase("-o formatting=tails", TestName = "GivenAVolumeMkfsWroteWithATailsOnlyPolicy_WhenAdding_ThenTheEditIsRefusedAndTheImageIsUntouched")] - [TestCase("-o fibration=lexic_fibre", TestName = "GivenAVolumeMkfsWroteWithLexicographicFibration_WhenAdding_ThenTheEditIsRefusedAndTheImageIsUntouched")] - public void VolumeWithAnotherPluginProfile_IsReadButNotRewritten(string options) { - RequireReiser4Progs(); - var original = this.Mkfs("cwbprof", options); - using var image = new MemoryStream(); - image.Write(original); - using (var reader = new Reiser4Reader(image)) - Assert.That(reader.NativeTreeValid, Is.True, "an empty volume of another profile is still read"); - var error = Assert.Throws(() => new Reiser4FormatDescriptor().Add(image, - [ArchiveInputInfo.InMemory("a-name-longer-than-twenty-three.txt", Payload(100, 5))])); - Assert.That(error!.Message, Does.Contain("refusing")); - Assert.That(image.ToArray(), Is.EqualTo(original)); - } - [Test, Category("Boundary")] public void GivenTwelveThousandFiles_WhenWriting_ThenFsckAcceptsAFourLevelTreeAndTheProgsReadTheBoundaryFiles() { RequireReiser4Progs(); diff --git a/Compression.Tests/Reiser4/Reiser4TestLayouts.cs b/Compression.Tests/Reiser4/Reiser4TestLayouts.cs new file mode 100644 index 000000000..7108c4841 --- /dev/null +++ b/Compression.Tests/Reiser4/Reiser4TestLayouts.cs @@ -0,0 +1,47 @@ +using FileSystem.Reiser4; + +namespace Compression.Tests.Reiser4; + +/// Layout helpers for the in-place defragmentation tests. +internal static class Reiser4TestLayouts { + + /// The blocks the tree's nodes occupy, in order. + internal static ulong[] NodeBlocks(Stream image) { + using var reader = new Reiser4Reader(image); + Assert.That(reader.NativeTreeValid, Is.True, reader.NativeProblem); + return [.. reader.NativeNodeBlocks.Order()]; + } + + /// + /// Fragments a compact volume through the block mover itself: every other file's runs go to the + /// free blocks at the end of the volume, last file highest, and the tree and bitmap are settled. + /// + internal static void ScatterInPlace(Stream image) { + var descriptor = new Reiser4FormatDescriptor(); + image.Position = 0; + var extents = descriptor.EnumerateExtents(image).ToList(); + var used = extents.Max(static e => e.Offset + e.Length); + var mover = new Reiser4BlockMover(); + mover.Init(image); + var top = image.Length; + var files = extents.Where(static e => e.Kind == Compression.Registry.DefragBlockKind.Used).GroupBy(static e => e.FileName!).ToList(); + for (var i = 0; i < files.Count; i += 2) + foreach (var run in files[i]) { + var blocks = (run.Length + mover.BlockSize - 1) / mover.BlockSize * mover.BlockSize; + var target = (top - blocks) / mover.BlockSize * mover.BlockSize; + while (IsBitmap(target, blocks, mover.BlockSize)) target -= mover.BlockSize; + Assert.That(target, Is.GreaterThan(used), "the volume has room to scatter into"); + mover.MoveExtent(image, run.Offset, target, run.Length); + mover.UpdateAllocationAfterMove(image, run.FileName!, run.Offset, target, run.Length); + top = target; + } + mover.SettleDirectory(image); + image.Position = 0; + } + + private static bool IsBitmap(long offset, long length, int blockSize) { + for (var block = (ulong)(offset / blockSize); block < (ulong)((offset + length) / blockSize); ++block) + if (block == 18 || block % Reiser4Writer.BlocksPerBitmap == 0) return true; + return false; + } +} diff --git a/Hawkynt.FileFormats.FileSystems/FileSystems/FileSystem.Reiser4/Reiser4BlockMover.cs b/Hawkynt.FileFormats.FileSystems/FileSystems/FileSystem.Reiser4/Reiser4BlockMover.cs index 5209068b1..1b87ea028 100644 --- a/Hawkynt.FileFormats.FileSystems/FileSystems/FileSystem.Reiser4/Reiser4BlockMover.cs +++ b/Hawkynt.FileFormats.FileSystems/FileSystems/FileSystem.Reiser4/Reiser4BlockMover.cs @@ -1,117 +1,92 @@ #pragma warning disable CS1591 using System.Buffers.Binary; -using System.Text; using Compression.Registry; namespace FileSystem.Reiser4; /// -/// Moves a file's blocks inside a Reiser4 payload area and rewrites the -/// directory entry that said where it started. +/// Moves the data blocks of a Reiser4 volume's extent files in place and repoints the extent +/// units that name them, wherever in the tree their twig nodes sit. /// /// -/// A file here is the run of blocks that begins at the block its -/// directory entry names, stepping over the allocator bitmaps that sit at -/// stride boundaries. Nothing else records the position — there is one field -/// per file and the rest is implied — so a move is the copy plus those eight -/// bytes. -/// -/// Because the position is implied, a file can only be put somewhere its -/// blocks stay in that order: consecutive, bitmaps stepped over. The directory -/// is written once the pass is over and checked against that rule; a layout -/// that breaks it is refused rather than written down. +/// Every data run a file has is one extent unit: a start block and a width in some twig +/// node. A move is the copy plus that unit's start, so the planner may move each unit's run on +/// its own. Units are tracked by where their run currently is; once the pass is over +/// writes every new start into its twig, re-seals node41 checksums, +/// and moves the allocator bits: the blocks every unit left are cleared and the blocks it landed on +/// set, so no other bit of the bitmap changes. +/// Tails and compressed clusters live inside tree nodes and do not move; nor do the nodes. +/// A volume whose journal still holds transactions, or a file whose extent covers blocks past its +/// end, is refused, and the caller falls back to a staged rebuild. /// public sealed class Reiser4BlockMover : IFilesystemBlockMover { - private const ulong NativeLeafBlock = 24; - private const ulong NativeTwigBlock = 23; - private const int NativeItemHeaderBytes = 38; - private const ushort NativeExtent40Plugin = 5; - private const byte NativeFileBodyMinor = 4; - private const uint NativeNodeMagic = 0x52344653; - private const ulong RootObjectId = 0x2a; - - /// Where each file's runs are now, in the order its bytes are in. - private readonly Dictionary> _runsOf = new(StringComparer.Ordinal); - - /// The byte length represented by each corresponding physical run. - private readonly Dictionary> _runLengthsOf = new(StringComparer.Ordinal); - - /// Where the field naming each file's first block sits. - private readonly Dictionary _firstBlockFieldOf = new(StringComparer.Ordinal); - - /// Native object id assigned to each file by the writer's tree profile. - private readonly Dictionary _objectIdOf = new(StringComparer.Ordinal); - - /// How long each file is, which is what says how many blocks it takes. - private readonly Dictionary _sizeOf = new(StringComparer.Ordinal); + private sealed class Unit { + internal required ulong Node { get; init; } + internal required int Field { get; init; } + internal required long Original { get; init; } + internal required long Length { get; init; } + internal required ulong Width { get; init; } + internal long Current { get; set; } + } + private readonly Dictionary> _unitsOf = new(StringComparer.Ordinal); + private ushort _nodePlugin; private long _imageLength; - /// Reads the directory once and notes where every file is. + /// Reads the tree once and notes where every extent unit is. public void Init(Stream image) { ArgumentNullException.ThrowIfNull(image); - this._runsOf.Clear(); - this._runLengthsOf.Clear(); - this._firstBlockFieldOf.Clear(); - this._objectIdOf.Clear(); - this._sizeOf.Clear(); + this._unitsOf.Clear(); this._imageLength = image.Length; - image.Position = 0; - using var reader = new Reiser4Reader(image); - if (!reader.Valid) - throw new InvalidDataException("Reiser4: the volume does not carry a payload area this reads."); - - foreach (var entry in reader.Entries) { - if (entry.Size <= 0) continue; - var runs = reader.EnumerateRuns(entry).ToArray(); - this._runsOf[entry.Name] = runs.Select(static run => run.Offset).ToList(); - this._runLengthsOf[entry.Name] = runs.Select(static run => run.Length).ToList(); - this._sizeOf[entry.Name] = entry.Size; - } - - var objectId = RootObjectId + 1; - foreach (var (name, at) in DirectoryFields(image)) { - this._firstBlockFieldOf[name] = at; - this._objectIdOf[name] = objectId++; + using var volume = new Reiser4Volume(image); + if (!volume.TreeValid) + throw new InvalidDataException($"Reiser4: the volume cannot be moved in place: {volume.Problem}."); + if (volume.ReplayedTransactions > 0) + throw new NotSupportedException("Reiser4: the journal holds transactions to replay; blocks cannot be moved in place."); + this._nodePlugin = volume.NodePlugin; + var seen = new HashSet(); + foreach (var (path, _, obj, _) in volume.Paths) { + if (obj.Stat.Kind != Reiser4Stat.Regular || obj.Body.Count == 0 || obj.Body[0].Plugin != Reiser4ItemPlugin.Extent || !seen.Add(obj.StatKey)) + continue; + var remaining = (long)obj.Stat.Size; + var units = new List(); + foreach (var item in obj.Body) { + var body = volume.ReadBody(item); + for (var at = 0; at < body.Length; at += 16) { + var start = BinaryPrimitives.ReadUInt64LittleEndian(body.AsSpan(at)); + var width = BinaryPrimitives.ReadUInt64LittleEndian(body.AsSpan(at + 8)); + var bytes = (long)Math.Min((ulong)Math.Max(0, remaining), width * Reiser4Writer.BlockSize); + remaining -= (long)(width * Reiser4Writer.BlockSize); + if (start == 0) continue; + if ((ulong)((bytes + Reiser4Writer.BlockSize - 1) / Reiser4Writer.BlockSize) != width) + throw new NotSupportedException($"Reiser4: '{path}' holds blocks past its end, which cannot be moved in place."); + units.Add(new Unit { + Node = item.Block, Field = item.BodyOffset + at, Original = checked((long)start * Reiser4Writer.BlockSize), + Length = bytes, Width = width, Current = checked((long)start * Reiser4Writer.BlockSize), + }); + } + } + if (units.Count > 0) this._unitsOf[path] = units; } - - // The reserved blocks and the directory chain come first, and the first - // file starts where they end. - this.FirstDataByte = this._runsOf.Count == 0 - ? Math.Min(image.Length, 25L * Reiser4Writer.BlockSize) - : this._runsOf.Values.Select(r => r[0]).Min(); } - /// A block, which is what the directory counts in. + /// A block, which is what an extent unit counts in. public int BlockSize => Reiser4Writer.BlockSize; - /// - /// First byte a file may occupy: past the reserved blocks and the directory, - /// which is where the first file already sits. - /// - public long FirstDataByte { get; private set; } + /// First byte a file may occupy: past the jump area, the superblocks, the journal, the status and backup blocks and the first two nodes. + public long FirstDataByte => Math.Min(this._imageLength, 25L * Reiser4Writer.BlockSize); - /// - /// Each call notes where one run has got to; a file split by the bitmaps it - /// steps over is simply several calls. - /// + /// Each call notes where one unit's run has got to. public bool RepointsRunsIndependently => true; - /// - /// A run may be held outside the volume while the rest of the layout moves, - /// which is what lets a full volume be rearranged at all. - /// + /// A run may be held outside the volume while the rest of the layout moves. public bool SupportsHeldRuns => true; /// public void MoveExtent(Stream image, long srcOffset, long dstOffset, long length, bool zeroSource = false) { if (length <= 0 || srcOffset == dstOffset) return; - - // Overlap-safe: a run shifted forward by less than its own length - // overwrites its own tail, and copying that front to back reads bytes - // the copy has already replaced. Compression.Core.DiskImage.ExtentCopy.Move(image, srcOffset, dstOffset, length); if (zeroSource) Compression.Core.DiskImage.ExtentCopy.Zero(image, srcOffset, length); @@ -123,238 +98,70 @@ public void UpdateAllocationAfterMove(Stream image, string fileName, long oldOff ArgumentNullException.ThrowIfNull(fileName); if (this._imageLength == 0) this.Init(image); if (oldOffset == newOffset) return; - if (newOffset % Reiser4Writer.BlockSize != 0) throw new NotSupportedException( - $"Reiser4: {newOffset} is not on a {Reiser4Writer.BlockSize}-byte block boundary, which is " + - "all the directory can name."); - - if (!this._runsOf.TryGetValue(fileName, out var runs)) - throw new InvalidOperationException( - $"Reiser4: the directory names no file '{fileName}', so it cannot be repointed."); - - // By where the run is now rather than where it began: the planner may put a - // run down more than once on its way to where it ends up. - var at = runs.IndexOf(oldOffset); - if (at < 0) - throw new InvalidOperationException( - $"Reiser4: no run of '{fileName}' sits at {oldOffset}, so it cannot be repointed."); - - if (!this._runLengthsOf.TryGetValue(fileName, out var lengths) || at >= lengths.Count) - throw new InvalidOperationException($"Reiser4: run accounting for '{fileName}' is incomplete."); - if (length != lengths[at]) + $"Reiser4: {newOffset} is not on a {Reiser4Writer.BlockSize}-byte block boundary, which is all an extent can name."); + if (!this._unitsOf.TryGetValue(fileName, out var units)) + throw new InvalidOperationException($"Reiser4: the tree names no extent file '{fileName}', so it cannot be repointed."); + // By where the run is now rather than where it began: the planner may put a run down more + // than once on its way to where it ends up. + var unit = units.FirstOrDefault(u => u.Current == oldOffset) + ?? throw new InvalidOperationException($"Reiser4: no run of '{fileName}' sits at {oldOffset}, so it cannot be repointed."); + if (length != unit.Length) throw new NotSupportedException( - $"Reiser4: moving only {length} bytes of the {lengths[at]}-byte run of '{fileName}' " + - "would require splitting its native extent40 item."); - - runs[at] = newOffset; + $"Reiser4: moving only {length} bytes of the {unit.Length}-byte run of '{fileName}' would require splitting its extent unit."); + unit.Current = newOffset; } - /// - /// Writes each file's new physical location into both the native extent40 item - /// and the legacy workbench directory once the pass is over. - /// + /// Writes every unit's new start into its twig and moves the allocator bits with it. public void SettleDirectory(Stream image) { ArgumentNullException.ThrowIfNull(image); - - var native = HasNativeTree(image); - Span value = stackalloc byte[8]; - foreach (var (name, runs) in this._runsOf) { - if (runs.Count == 0) continue; - - if (!native) { - var expected = ImpliedRuns(runs[0], this._sizeOf[name]); - if (!expected.SequenceEqual(runs)) - throw new NotSupportedException( - $"Reiser4: '{name}' would not read back from block {runs[0] / Reiser4Writer.BlockSize} — " + - "its blocks are where the legacy layout implies no file can be."); - } - - // Keep the old private directory coherent for pre-native Workbench readers. - if (this._firstBlockFieldOf.TryGetValue(name, out var field)) { - BinaryPrimitives.WriteUInt64LittleEndian(value, (ulong)(runs[0] / Reiser4Writer.BlockSize)); - image.Position = field; - image.Write(value); - } else if (!native) { - throw new InvalidOperationException( - $"Reiser4: the directory holds no entry for '{name}' to write back."); - } + var units = this._unitsOf.Values.SelectMany(static u => u).ToList(); + var nodes = new Dictionary(); + byte[] Node(ulong block) { + if (nodes.TryGetValue(block, out var cached)) return cached; + var buffer = new byte[Reiser4Writer.BlockSize]; + image.Position = checked((long)block * Reiser4Writer.BlockSize); + image.ReadExactly(buffer); + return nodes[block] = buffer; } - if (native) - this.RepointNativeExtents(image); - - image.Flush(); - } - - /// True when block 24 is the native leaf written by the tree profile. - private static bool HasNativeTree(Stream image) { - var offset = checked((long)NativeLeafBlock * Reiser4Writer.BlockSize); - if (!image.CanSeek || offset + Reiser4Writer.BlockSize > image.Length) return false; - - Span header = stackalloc byte[12]; - image.Position = offset; - image.ReadExactly(header); - return BinaryPrimitives.ReadUInt32LittleEndian(header[8..]) == NativeNodeMagic; - } - - /// - /// Repoints only extent40 start blocks in the native leaf. Widths and every - /// other tree byte stay untouched, so defrag does not silently rebuild metadata. - /// - private void RepointNativeExtents(Stream image) { - // Extents are twig items (block 23); images from before the writer put them - // there carry them in the leaf (block 24), so both are searched. - var nodes = new List<(long Offset, byte[] Bytes, ushort ItemCount, ushort BodiesEnd, ushort[] BodyOffsets)>(2); - foreach (var block in (ReadOnlySpan)[NativeTwigBlock, NativeLeafBlock]) { - var nodeOffset = checked((long)block * Reiser4Writer.BlockSize); - var node = new byte[Reiser4Writer.BlockSize]; - image.Position = nodeOffset; - image.ReadExactly(node); - if (BinaryPrimitives.ReadUInt32LittleEndian(node.AsSpan(8, 4)) != NativeNodeMagic) continue; - - var count = BinaryPrimitives.ReadUInt16LittleEndian(node.AsSpan(2, 2)); - var end = BinaryPrimitives.ReadUInt16LittleEndian(node.AsSpan(6, 2)); - if (count == 0 - || count > (Reiser4Writer.BlockSize - Reiser4Tree.NodeHeaderBytes) / NativeItemHeaderBytes - || end < Reiser4Tree.NodeHeaderBytes || end > Reiser4Writer.BlockSize) - throw new InvalidDataException($"Reiser4: malformed native node {block} while settling defragmentation."); - - var offsets = new ushort[count]; - for (var i = 0; i < count; ++i) - offsets[i] = BinaryPrimitives.ReadUInt16LittleEndian( - node.AsSpan(Reiser4Writer.BlockSize - (i + 1) * NativeItemHeaderBytes + 32, 2)); - nodes.Add((nodeOffset, node, count, end, offsets)); + var bitmaps = new Dictionary(); + byte[] Bitmap(ulong index) { + if (bitmaps.TryGetValue(index, out var cached)) return cached; + var buffer = new byte[Reiser4Writer.BlockSize]; + image.Position = checked((long)(index == 0 ? 18 : index * Reiser4Writer.BlocksPerBitmap) * Reiser4Writer.BlockSize); + image.ReadExactly(buffer); + return bitmaps[index] = buffer; } - - foreach (var (name, objectId) in this._objectIdOf) { - if (!this._runsOf.TryGetValue(name, out var runs) || runs.Count == 0) continue; - if (!this._runLengthsOf.TryGetValue(name, out var lengths) || lengths.Count != runs.Count) - throw new InvalidOperationException($"Reiser4: run accounting for '{name}' is incomplete."); - - var found = false; - foreach (var (_, leaf, itemCount, bodiesEnd, bodyOffsets) in nodes) { - for (var i = 0; i < itemCount; ++i) { - var header = Reiser4Writer.BlockSize - (i + 1) * NativeItemHeaderBytes; - var key0 = BinaryPrimitives.ReadUInt64LittleEndian(leaf.AsSpan(header, 8)); - var itemObjectId = BinaryPrimitives.ReadUInt64LittleEndian(leaf.AsSpan(header + 16, 8)); - var plugin = BinaryPrimitives.ReadUInt16LittleEndian(leaf.AsSpan(header + 36, 2)); - if ((byte)(key0 & 0xF) != NativeFileBodyMinor - || plugin != NativeExtent40Plugin || itemObjectId != objectId) - continue; - - var body = bodyOffsets[i]; - var end = bodiesEnd; - foreach (var candidate in bodyOffsets) - if (candidate > body && candidate < end) end = candidate; - var bodyLength = end - body; - if (bodyLength != runs.Count * 16) - throw new NotSupportedException( - $"Reiser4: native extent40 body for '{name}' has {bodyLength / 16} runs, " + - $"but the mover tracks {runs.Count}."); - - for (var r = 0; r < runs.Count; ++r) { - if ((runs[r] & (Reiser4Writer.BlockSize - 1)) != 0) - throw new InvalidOperationException($"Reiser4: run of '{name}' is not block aligned."); - var startBlock = checked((ulong)(runs[r] / Reiser4Writer.BlockSize)); - var width = checked((ulong)((lengths[r] + Reiser4Writer.BlockSize - 1) / Reiser4Writer.BlockSize)); - BinaryPrimitives.WriteUInt64LittleEndian(leaf.AsSpan(body + r * 16, 8), startBlock); - var existingWidth = BinaryPrimitives.ReadUInt64LittleEndian(leaf.AsSpan(body + r * 16 + 8, 8)); - if (existingWidth != width) - throw new NotSupportedException( - $"Reiser4: native extent40 width for '{name}' is {existingWidth} blocks; " + - $"the mover accounts for {width}."); - } - - found = true; - break; - } - if (found) break; + void Mark(long offset, ulong width, bool used) { + var first = (ulong)(offset / Reiser4Writer.BlockSize); + for (var block = first; block < first + width; ++block) { + var map = Bitmap(block / Reiser4Writer.BlocksPerBitmap); + var bit = block % Reiser4Writer.BlocksPerBitmap; + ref var cell = ref map[4 + (int)(bit >> 3)]; + cell = used ? (byte)(cell | 1 << (int)(bit & 7)) : (byte)(cell & ~(1 << (int)(bit & 7))); } - - if (!found) - throw new InvalidDataException($"Reiser4: native tree has no extent40 item for '{name}'."); } - foreach (var (nodeOffset, node, _, _, _) in nodes) { - image.Position = nodeOffset; - image.Write(node); + foreach (var unit in units.Where(static u => u.Current != u.Original)) Mark(unit.Original, unit.Width, used: false); + foreach (var unit in units.Where(static u => u.Current != u.Original)) { + if (unit.Current < 0 || unit.Current % Reiser4Writer.BlockSize != 0) + throw new InvalidOperationException("Reiser4: a run did not land on a block boundary inside the volume."); + Mark(unit.Current, unit.Width, used: true); + BinaryPrimitives.WriteUInt64LittleEndian(Node(unit.Node).AsSpan(unit.Field), (ulong)(unit.Current / Reiser4Writer.BlockSize)); } - } - - /// - /// The runs a file of this length occupies when it starts at - /// : consecutive blocks, broken wherever a - /// bitmap sits. - /// - private List ImpliedRuns(long firstOffset, long size) { - var runs = new List(); - var blockSize = (long)Reiser4Writer.BlockSize; - var block = (ulong)(firstOffset / blockSize); - var remaining = size; - - while (remaining > 0) { - while (IsBitmapBlock(block)) ++block; - var start = (long)block * blockSize; - if (start < 0 || start >= this._imageLength) break; - - long run = 0; - while (remaining - run > 0 && !IsBitmapBlock(block)) { - var take = Math.Min(blockSize, remaining - run); - take = Math.Min(take, this._imageLength - (start + run)); - if (take <= 0) break; - run += take; - ++block; - } - if (run <= 0) break; - runs.Add(start); - remaining -= run; + foreach (var (block, node) in nodes) { + if (this._nodePlugin == 1) Reiser4Volume.SealNode41(node); + image.Position = checked((long)block * Reiser4Writer.BlockSize); + image.Write(node); } - - return runs; - } - - /// Bitmap blocks sit at stride boundaries, and one sits at block 18. - private static bool IsBitmapBlock(ulong block) - => block == 18 || (block != 0 && block % Reiser4Writer.BlocksPerBitmap == 0); - - /// Walks the directory chain and yields where each name's first-block field sits. - private static IEnumerable<(string Name, long At)> DirectoryFields(Stream image) { - var master = new byte[Reiser4Writer.BlockSize]; - image.Position = Reiser4Reader.MasterOffset; - image.ReadExactly(master); - - var block = BinaryPrimitives.ReadUInt64LittleEndian( - master.AsSpan(Reiser4Writer.MasterPayloadDirOff, 8)); - - var visited = new HashSet(); - var buffer = new byte[Reiser4Writer.BlockSize]; - while (block != 0 && visited.Add(block)) { - var at = (long)block * Reiser4Writer.BlockSize; - if (at < 0 || at + Reiser4Writer.BlockSize > image.Length) yield break; - - image.Position = at; - image.ReadExactly(buffer); - if (!buffer.AsSpan(0, Reiser4Writer.DirMagic.Length).SequenceEqual(Reiser4Writer.DirMagic)) - yield break; - - var next = BinaryPrimitives.ReadUInt64LittleEndian(buffer.AsSpan(8, 8)); - var count = BinaryPrimitives.ReadUInt32LittleEndian(buffer.AsSpan(16, 4)); - for (var i = 0; i < count && i < Reiser4Writer.DirEntriesPerBlock; ++i) { - var entry = Reiser4Writer.DirHeadSize + i * Reiser4Writer.DirEntrySize; - var name = ReadName(buffer.AsSpan(entry, Reiser4Writer.DirNameLength)); - if (name.Length == 0) continue; - yield return (name, at + entry + Reiser4Writer.DirNameLength); - } - - block = next; + foreach (var (index, map) in bitmaps) { + Reiser4Volume.SealBitmap(map); + image.Position = checked((long)(index == 0 ? 18 : index * Reiser4Writer.BlocksPerBitmap) * Reiser4Writer.BlockSize); + image.Write(map); } - } - - private static string ReadName(ReadOnlySpan span) { - var end = span.IndexOf((byte)0); - if (end < 0) end = span.Length; - return end == 0 ? "" : Encoding.UTF8.GetString(span[..end]); + image.Flush(); } } diff --git a/Hawkynt.FileFormats.FileSystems/FileSystems/FileSystem.Reiser4/Reiser4Clusters.cs b/Hawkynt.FileFormats.FileSystems/FileSystems/FileSystem.Reiser4/Reiser4Clusters.cs new file mode 100644 index 000000000..0408a4bbe --- /dev/null +++ b/Hawkynt.FileFormats.FileSystems/FileSystems/FileSystem.Reiser4/Reiser4Clusters.cs @@ -0,0 +1,79 @@ +#pragma warning disable CS1591 +using System.Buffers.Binary; +using Compression.Core.Checksums; +using Compression.Core.Deflate; +using Compression.Core.Dictionary.Lzo; +using Compression.Core.Streams; +using FileFormat.Zstd; + +namespace FileSystem.Reiser4; + +/// Compression transform plugins (plugin type 0xC) a cryptcompress file names. +internal enum Reiser4CompressionId : ushort { Lzo1 = 0, Gzip1 = 1, Zstd1 = 2 } + +/// Compression mode plugins (plugin type 0xD). +internal enum Reiser4CompressionModeId : ushort { None = 0, Lattice = 1, Ultimate = 2, Force = 3, Convert = 4 } + +/// +/// The disk-cluster encoding of a cryptcompress (ccreg40) file: each logical cluster is +/// stored either as its plain bytes or, when that is shorter, as the compressed stream followed by +/// the stream's 32-bit Adler checksum, little-endian. +/// +/// +/// Which of the two a disk cluster holds is not flagged anywhere: it is compressed exactly when +/// it is shorter than the logical cluster it stands for — the cluster size, or what is left of the +/// file in the last cluster. The compressors are the workbench's own: raw LZO1X for lzo1, a +/// raw deflate stream for gzip1, a Zstandard frame for zstd1. A compressed result is +/// kept only when it and its checksum together are shorter than the input, and inputs below the +/// plugin's minimum (256 bytes for lzo1 and zstd1, 64 for gzip1) are stored plain. +/// Verified by a Reiser4 kernel reading clusters this writes and by this reader decoding +/// clusters the kernel wrote; see docs/REISER4-NATIVE-PROFILE.md. +/// +internal static class Reiser4Clusters { + + internal const int ChecksumBytes = 4; + + internal static int MinimumToCompress(Reiser4CompressionId id) => id == Reiser4CompressionId.Gzip1 ? 64 : 256; + + /// The logical bytes of one disk cluster. + internal static byte[] Decode(ReadOnlySpan disk, int logicalLength, Reiser4CompressionId id) { + if (disk.Length == logicalLength) return disk.ToArray(); + if (disk.Length > logicalLength || disk.Length <= ChecksumBytes) + throw new InvalidDataException("Reiser4: a disk cluster is longer than the data it stands for."); + var stream = disk[..^ChecksumBytes]; + if (Adler32.Compute(stream) != BinaryPrimitives.ReadUInt32LittleEndian(disk[^ChecksumBytes..])) + throw new InvalidDataException("Reiser4: a compressed disk cluster fails its checksum."); + var plain = id switch { + Reiser4CompressionId.Lzo1 => Lzo1xDecompressor.Decompress(stream, logicalLength), + Reiser4CompressionId.Gzip1 => DeflateDecompressor.Decompress(stream), + Reiser4CompressionId.Zstd1 => new ZstdBuildingBlock().Decompress(stream), + _ => throw new NotSupportedException($"Reiser4: compression plugin {id} is not supported."), + }; + if (plain.Length != logicalLength) + throw new InvalidDataException("Reiser4: a disk cluster decompresses to the wrong length."); + return plain; + } + + /// The disk form of a logical cluster: compressed with its checksum when that is shorter. + internal static byte[] Encode(ReadOnlySpan logical, Reiser4CompressionId id, Reiser4CompressionModeId mode) { + if (mode == Reiser4CompressionModeId.None || logical.Length < MinimumToCompress(id)) return logical.ToArray(); + var stream = id switch { + Reiser4CompressionId.Lzo1 => Lzo1xCompressor.Compress(logical), + Reiser4CompressionId.Gzip1 => DeflateCompressor.Compress(logical, DeflateCompressionLevel.Fast), + Reiser4CompressionId.Zstd1 => CompressZstd(logical), + _ => throw new NotSupportedException($"Reiser4: compression plugin {id} is not supported."), + }; + if (stream.Length + ChecksumBytes >= logical.Length) return logical.ToArray(); + var disk = new byte[stream.Length + ChecksumBytes]; + stream.CopyTo(disk, 0); + BinaryPrimitives.WriteUInt32LittleEndian(disk.AsSpan(stream.Length), Adler32.Compute(stream)); + return disk; + } + + private static byte[] CompressZstd(ReadOnlySpan data) { + using var output = new MemoryStream(); + using (var zstd = new ZstdStream(output, CompressionStreamMode.Compress, ZstdCompressionLevel.Fast, leaveOpen: true)) + zstd.Write(data); + return output.ToArray(); + } +} diff --git a/Hawkynt.FileFormats.FileSystems/FileSystems/FileSystem.Reiser4/Reiser4FormatDescriptor.cs b/Hawkynt.FileFormats.FileSystems/FileSystems/FileSystem.Reiser4/Reiser4FormatDescriptor.cs index 2f0b0d9d1..477f4c349 100644 --- a/Hawkynt.FileFormats.FileSystems/FileSystems/FileSystem.Reiser4/Reiser4FormatDescriptor.cs +++ b/Hawkynt.FileFormats.FileSystems/FileSystems/FileSystem.Reiser4/Reiser4FormatDescriptor.cs @@ -2,6 +2,7 @@ using System.Buffers.Binary; using System.Globalization; using System.Text; +using Compression.Core.DiskImage; using Compression.Registry; using static Compression.Registry.FormatHelpers; @@ -9,11 +10,12 @@ namespace FileSystem.Reiser4; /// /// Descriptor for Reiser4 filesystem images (successor to ReiserFS 3.6 — completely -/// different on-disk layout). Volumes whose node40 tree the reader walks completely list -/// and extract their files and directories, and are created and edited through staged -/// rebuilds that carry the volume's identity and every object's metadata across; other -/// images surface the master superblock at offset 65536, the format40 superblock that -/// follows it, a structured metadata bundle and the raw image. +/// different on-disk layout). Volumes whose node40/node41 tree the reader walks completely list +/// and extract their files, directories, links and special files — after replaying a pending +/// journal — and are created and edited through staged rebuilds that carry the volume's identity, +/// plugin profile and every object's keys, metadata and body across; other images surface the +/// master superblock at offset 65536, the format40 superblock that follows it, a structured +/// metadata bundle and the raw image. /// /// Magic: /// @@ -33,89 +35,51 @@ public sealed class Reiser4FormatDescriptor : IFormatDescriptor, IArchiveFormatO // ── IFormatOptionsSchema ──────────────────────────────────────────────── /// - /// Knobs the empty-filesystem writer actually honours. VolumeLabel is - /// written into the master superblock label field (and the backup record) and - /// surfaces through fsck.reiser4 / our metadata readback; - /// ImageSize drives (4 KB - /// blocks, clamped to the writer minimum). The 4 KB block size is fixed — - /// the embedded mkfs.reiser4 templates are byte-exact 4096-byte captures — so - /// it is intentionally not exposed. + /// Knobs the writer honours. VolumeLabel is written into the master superblock label + /// field (and the backup record); ImageSize drives + /// (4 KB blocks, clamped to the writer minimum); FileBody picks how regular files are + /// stored (). The 4 KB block size is fixed — the embedded + /// mkfs.reiser4 templates are byte-exact 4096-byte captures — so it is intentionally not exposed. /// public IReadOnlyList OptionsSchema { get; } = [ FilesystemSchemaPresets.VolumeLabel(maxChars: 16), FilesystemSchemaPresets.ImageSize(["16 MB", "32 MB", "64 MB", "128 MB"]), + new FormatOptionDescriptor("FileBody", "File body", FormatOptionKind.Enum, nameof(Reiser4FileBody.Extents), + AllowedValues: Enum.GetNames(), + Description: "How regular files are stored: extents, tails, the kernel's smart policy (tails up to four blocks), " + + "compressed cryptcompress clusters, or whatever the volume's plugin profile says.", + IsOptimizationAxis: false), ]; - /// - /// Gets the id. - /// public string Id => "Reiser4"; - /// - /// Gets the display name. - /// public string DisplayName => "Reiser4"; - /// - /// Gets the category. - /// public FormatCategory Category => FormatCategory.Archive; - /// - /// Gets the capabilities. - /// public FormatCapabilities Capabilities => FormatCapabilities.CanList | FormatCapabilities.CanExtract | FormatCapabilities.CanTest | FormatCapabilities.CanCreate | FormatCapabilities.CanModify | FormatCapabilities.SupportsDirectories; - /// - /// Gets the default extension. - /// public string DefaultExtension => ".reiser4"; - /// - /// Gets the extensions. - /// public IReadOnlyList Extensions => [".reiser4"]; - /// - /// Gets the compound extensions. - /// public IReadOnlyList CompoundExtensions => []; - /// - /// Gets the magic signatures. - /// public IReadOnlyList MagicSignatures => [ // "ReIsEr4" at byte offset 65536 (= 16 * 4096). Confidence 0.9: the 7-byte // magic is highly unlikely to land at exactly this offset by chance, but // it shares the "ReIsEr" prefix with the older ReiserFS 3.6 magic // ("ReIsErFs", "ReIsEr2Fs", "ReIsEr3Fs") which lives at offset 65536+52. - // The disambiguation is unambiguous (different offsets, different suffixes) - // so 0.9 is appropriate — slightly below the 0.95 used for unique 4+ byte - // magics that live at position 0. new("ReIsEr4"u8.ToArray(), Offset: (int)Reiser4MasterSb.MasterOffset, Confidence: 0.9), ]; - /// - /// Gets the methods. - /// public IReadOnlyList Methods => [new("stored", "Stored")]; - /// - /// Gets the tar compression format id. - /// public string? TarCompressionFormatId => null; - /// - /// Gets the family. - /// public AlgorithmFamily Family => AlgorithmFamily.Archive; - /// - /// Gets the description. - /// - public string Description => "Reiser4 filesystem image — native node40 traversal and multi-leaf writing with nested directories and metadata-preserving rebuilds."; + public string Description => "Reiser4 filesystem image — every node40/node41 plugin profile, journal replay, " + + "extents, tails, compressed clusters, symlinks, special files and hard links, edited through metadata-preserving rebuilds."; - /// - /// Lists the entries in the supplied container. - /// + /// Lists the entries in the supplied container. public List List(Stream stream, string? password) { var entries = new List(); byte[] image; try { image = ReadAllBounded(stream); } catch { - // Stream blew up before we got anywhere. Surface the irreducible minimum. entries.Add(new ArchiveEntryInfo(0, "FULL.reiser4", 0, 0, "stored", false, false, null)); entries.Add(new ArchiveEntryInfo(1, "metadata.ini", 0, 0, "stored", false, false, null)); return entries; @@ -134,19 +98,19 @@ public List List(Stream stream, string? password) { // header entries alongside them would make every rebuild (shrink, defrag) // fold them back in as real files, so they stay on the carver path — empty // or foreign images, where the header IS all we can offer. - var payload = ReadPayload(stream); var idx = 0; - if (payload.Count > 0) { - foreach (var e in payload) - entries.Add(new ArchiveEntryInfo(idx++, e.Name, e.Size, e.Size, "stored", e.IsDirectory, false, - e.Metadata?.LastModified)); - return entries; + try { + if (stream.CanSeek) stream.Position = 0; + using var reader = new Reiser4Reader(stream); + if (reader.NativeTreeValid || reader.Entries.Count > 0) { + foreach (var e in reader.Entries) + entries.Add(ToInfo(idx++, e)); + return entries; + } + } catch { + // fall through to the carver view } - if (stream.CanSeek) stream.Position = 0; - using (var native = new Reiser4Reader(stream)) - if (native.NativeTreeValid) return entries; - entries.Add(new ArchiveEntryInfo(idx++, "FULL.reiser4", image.LongLength, image.LongLength, "stored", false, false, null)); entries.Add(new ArchiveEntryInfo(idx++, "metadata.ini", 0, 0, "stored", false, false, null)); if (sb.Valid) @@ -156,20 +120,16 @@ public List List(Stream stream, string? password) { return entries; } - /// Files the workbench-layout payload area holds. Never throws — empty when there are none. - private static IReadOnlyList ReadPayload(Stream stream) { - try { - if (stream.CanSeek) stream.Position = 0; - using var reader = new Reiser4Reader(stream); - return reader.Entries; - } catch { - return []; - } - } + private static ArchiveEntryInfo ToInfo(int index, Reiser4Reader.Entry e) => e.Kind switch { + Reiser4Reader.EntryKind.Symlink => new ArchiveEntryInfo(index, e.Name, 0, 0, "stored", false, false, + e.Metadata?.LastModified, IsSymlink: true, LinkTarget: e.LinkTarget), + Reiser4Reader.EntryKind.CharacterDevice or Reiser4Reader.EntryKind.BlockDevice or Reiser4Reader.EntryKind.Fifo or Reiser4Reader.EntryKind.Socket => + new ArchiveEntryInfo(index, e.Name, 0, 0, "stored", false, false, e.Metadata?.LastModified, Kind: e.Kind.ToString()), + _ => new ArchiveEntryInfo(index, e.Name, e.Size, e.Size, e.Body is "ctail" ? "compressed" : "stored", e.IsDirectory, false, + e.Metadata?.LastModified), + }; - /// - /// Decodes the supplied input. - /// + /// Decodes the supplied input. public void Extract(Stream stream, string outputDir, string? password, string[]? files) { byte[] image; try { @@ -188,15 +148,16 @@ public void Extract(Stream stream, string outputDir, string? password, string[]? return; } - // A volume that carries files extracts exactly those, mirroring List. if (stream.CanSeek) stream.Position = 0; using (var reader = new Reiser4Reader(stream)) { if (reader.NativeTreeValid || reader.Entries.Count > 0) { foreach (var e in reader.Entries) { if (files is { Length: > 0 } && !MatchesFilter(e.Name, files)) continue; - var target = Path.Combine(outputDir, e.Name.Replace('/', Path.DirectorySeparatorChar)); + var target = SafeMemberPath(outputDir, e.Name); Directory.CreateDirectory(Path.GetDirectoryName(target) ?? outputDir); if (e.IsDirectory) { Directory.CreateDirectory(target); continue; } + // Links and special files have no bytes to extract; List names them and their targets. + if (e.Kind != Reiser4Reader.EntryKind.File) continue; using var output = File.Create(target); reader.ExtractTo(e, output); } @@ -240,66 +201,66 @@ private static byte[] BuildMetadata(Reiser4MasterSb sb) { } // ── IArchiveCreatable ──────────────────────────────────────────────── - // A captured mkfs prefix supplies the format defaults; native stat40, cde40 - // and extent40 items describe the supported namespace across native nodes. - /// - /// Performs the create operation. - /// - public void Create(Stream output, IReadOnlyList inputs, FormatCreateOptions options) - => CreateCore(output, inputs, options); - private static void CreateCore(Stream output, IReadOnlyList inputs, FormatCreateOptions options, - RebuildMetadata? saved = null) { + /// Creates a volume holding . + public void Create(Stream output, IReadOnlyList inputs, FormatCreateOptions options) { ArgumentNullException.ThrowIfNull(output); var w = new Reiser4Writer(); - if (saved is not null) { - w.Label = saved.Label; - w.Uuid = Convert.FromHexString(saved.UuidHex); - w.MkfsId = saved.MkfsId; - w.BlockCount = (ulong)(saved.Length / Reiser4Writer.BlockSize); - w.AddDirectory("", saved.Root); - } - - // Volume label: prefer the schema knob, falling back to the legacy - // password-slot mapping (kept for callers that pre-date the schema). - var label = options?.GetOption("VolumeLabel", "") ?? ""; - if (string.IsNullOrEmpty(label) && !string.IsNullOrEmpty(options?.Password)) - label = options.Password; - if (!string.IsNullOrEmpty(label)) - w.Label = label; + ApplyCreateOptions(w, options); - // Image size: the writer counts 4 KB blocks. "Auto (fit to files)" and any - // unset/unparsable value leave the default (and writer minimum) in place. var sizes = new List(); if (inputs != null) foreach (var i in inputs) { var name = i.ArchiveName.Replace('\\', '/').TrimEnd('/'); - var metadata = saved?.Entries.GetValueOrDefault(name)?.Metadata; - if (i.IsDirectory) { w.AddDirectory(name, metadata); continue; } + if (i.IsDirectory) { w.AddDirectory(name, ToFileMetadata(i.Metadata)); continue; } var length = i.InMemoryContent?.LongLength ?? new FileInfo(i.FullPath).Length; sizes.Add(length); if (i.InMemoryContent is { } bytes) { - w.AddFile(i.ArchiveName, bytes, metadata); + w.AddFile(i.ArchiveName, bytes, ToFileMetadata(i.Metadata)); continue; } var path = i.FullPath; - w.AddStreamingFile(i.ArchiveName, length, () => File.OpenRead(path), metadata); + w.AddStreamingFile(i.ArchiveName, length, () => File.OpenRead(path), ToFileMetadata(i.Metadata)); } - // The requested size is a floor: the volume has to be at least large enough - // for the payload's directory chain, data blocks and bitmaps. var sizeBytes = FilesystemSchemaPresets.ParseSize(options?.GetOption("ImageSize", "")); var requested = sizeBytes > 0 ? (ulong)Math.Max(1, sizeBytes / Reiser4Writer.BlockSize) : 0UL; - w.BlockCount = Math.Max(w.BlockCount, Math.Max(requested, Reiser4Writer.EstimateBlockCount(sizes))); - + w.BlockCount = Math.Max(requested, Reiser4Writer.EstimateBlockCount(sizes)); w.Write(output); } + private static void ApplyCreateOptions(Reiser4Writer writer, FormatCreateOptions? options) { + // Volume label: prefer the schema knob, falling back to the legacy + // password-slot mapping (kept for callers that pre-date the schema). + var label = options?.GetOption("VolumeLabel", "") ?? ""; + if (string.IsNullOrEmpty(label) && !string.IsNullOrEmpty(options?.Password)) + label = options.Password; + if (!string.IsNullOrEmpty(label)) writer.Label = label; + writer.FileBody = ParseFileBody(options?.GetOption("FileBody", "")); + } + + private static Reiser4FileBody ParseFileBody(string? value) { + if (string.IsNullOrWhiteSpace(value)) return Reiser4FileBody.Extents; + return Enum.TryParse(value, ignoreCase: true, out var body) + ? body + : throw new NotSupportedException($"Reiser4: unknown FileBody '{value}'."); + } + + /// Metadata an archive input carries, in the shape the writer applies to a new object. + private static Reiser4Reader.FileMetadata? ToFileMetadata(ArchiveEntryMetadata? metadata) { + if (metadata is null) return null; + var now = (uint)DateTimeOffset.UtcNow.ToUnixTimeSeconds(); + static uint Seconds(DateTimeOffset? time, uint fallback) => time is { } t && t.ToUnixTimeSeconds() is >= 0 and <= uint.MaxValue ? (uint)t.ToUnixTimeSeconds() : fallback; + var modified = Seconds(metadata.LastWriteTimeUtc, now); + return new Reiser4Reader.FileMetadata(0, (ushort)((metadata.UnixMode ?? 0x1A4) & 0xFFF), 1, + metadata.UnixUserId ?? 0, metadata.UnixGroupId ?? 0, modified, Seconds(metadata.LastAccessTimeUtc, modified), + Seconds(metadata.StatusChangeTimeUtc, modified), []); + } + /// - /// Creates the supported native node40 profile from input streams. Each source - /// is consumed once into a temporary file, then copied in bounded chunks by - /// ; no complete file is staged in memory. Directory - /// inputs retain empty directories and nested paths. + /// Creates the volume from input streams. Each source is consumed once into a temporary file, + /// then copied in bounded chunks by ; no complete file is staged in + /// memory. Directory inputs retain empty directories and nested paths. /// public void CreateFromStreams(Stream target, IEnumerable inputs, @@ -336,11 +297,7 @@ public void CreateFromStreams(Stream target, FileOptions.SequentialScan)); } - var label = options?.GetOption("VolumeLabel", "") ?? ""; - if (string.IsNullOrEmpty(label) && !string.IsNullOrEmpty(options?.Password)) - label = options.Password; - if (!string.IsNullOrEmpty(label)) writer.Label = label; - + ApplyCreateOptions(writer, options); var requestedBytes = FilesystemSchemaPresets.ParseSize(options?.GetOption("ImageSize", "")); var requestedBlocks = requestedBytes > 0 ? (ulong)Math.Max(1, requestedBytes / Reiser4Writer.BlockSize) @@ -354,26 +311,75 @@ public void CreateFromStreams(Stream target, } } + // ── Rebuilds ───────────────────────────────────────────────────────── + /// - /// Performs the defragment operation. + /// Reads the volume into a plan, applies , writes the result to scratch, + /// reads it back and verifies it, and only then replaces . A volume + /// outside the profile — or an edit the profile cannot represent — is refused before anything + /// is written. /// - public void Defragment(Stream archive) - => this.Defragment(archive, new DefragOptions { Mode = DefragMode.ConsolidateAtStart }); + private static void EditStaged(Stream archive, Action edit, Func? minimumBlocks = null) { + ArgumentNullException.ThrowIfNull(archive); + using var staged = RebuildVerb.CreateScratchStream(); + StageTo(archive, staged, edit, minimumBlocks); + archive.Position = 0; + archive.SetLength(0); + staged.Position = 0; + staged.CopyTo(archive); + archive.Flush(); + } + + /// Writes the edited plan of to and verifies it there. + private static void StageTo(Stream source, Stream target, Action edit, Func? minimumBlocks) { + source.Position = 0; + using var volume = new Reiser4Volume(source); + var plan = Reiser4Plan.FromVolume(volume); + edit(plan); + if (minimumBlocks is not null) plan.MinimumBlocks = minimumBlocks(plan); + target.Position = 0; + target.SetLength(0); + plan.Write(target); + Verify(plan, target, volume); + } /// - /// Largest volume the in-place pass is offered for. Its guard holds a copy of - /// the image to compare payloads across the pass. + /// The staged volume must read back whole, keep the volume's identity, name exactly what the + /// plan names, and hold every object's stat data as the plan wrote it. /// + private static void Verify(Reiser4Plan plan, Stream staged, Reiser4Volume source) { + staged.Position = 0; + using var rebuilt = new Reiser4Volume(staged); + if (!rebuilt.TreeValid) + throw new InvalidDataException($"Reiser4: the rebuilt tree failed verification: {rebuilt.Problem}."); + if (rebuilt.UuidHex != source.UuidHex || rebuilt.Label != source.Label) + throw new InvalidDataException("Reiser4: the rebuilt volume lost its identity."); + var expected = plan.Paths.ToDictionary(static p => p.Key, static p => p.Value.Entry.Target, StringComparer.Ordinal); + if (rebuilt.Paths.Count != expected.Count) + throw new InvalidDataException("Reiser4: the rebuilt namespace failed verification."); + var objects = plan.Objects.ToDictionary(static o => o.StatKey); + foreach (var (path, _, obj, _) in rebuilt.Paths) { + if (!expected.TryGetValue(path, out var key) || key != obj.StatKey || !objects.TryGetValue(key, out var planned) || + !planned.Stat.AsSpan().SequenceEqual(obj.Stat.Raw)) + throw new InvalidDataException($"Reiser4: '{path}' failed verification after the rebuild."); + } + } + + /// Performs the defragment operation. + public void Defragment(Stream archive) + => this.Defragment(archive, new DefragOptions { Mode = DefragMode.ConsolidateAtStart }); + + /// Largest volume the in-place pass is offered for. Its guard holds a copy of the image to compare payloads across the pass. private const long MaxBufferedImageBytes = 256L * 1024 * 1024; /// Every file's bytes, as the guard compares them before and after. private static IReadOnlyList ReadPayloadsForGuard(Stream stream) { stream.Position = 0; using var reader = new Reiser4Reader(stream, leaveOpen: true); - return reader.Entries.Where(e => !e.IsDirectory && e.Size > 0).Select(reader.Extract).ToList(); + return reader.Entries.Where(e => e.Kind == Reiser4Reader.EntryKind.File && e.Size > 0).Select(reader.Extract).ToList(); } - /// Plans the new layout and moves the runs into it, repointing at the end. + /// Plans the new layout and moves the runs into it, repointing every extent at the end. private void DefragmentWithPlanner(Stream archive, DefragOptions options) { archive.Position = 0; var mover = new Reiser4BlockMover(); @@ -397,8 +403,8 @@ private void DefragmentWithPlanner(Stream archive, DefragOptions options) { Compression.Core.Layout.DefragPlannerExecutor.Execute(archive, options, mover, moves, archive.Length, reinitAfterMove: null); - // The directory is written once every run has landed: a file's position is - // one field, and what it means depends on where all of its blocks are. + // The tree is written once every run has landed: an extent unit is one field, and what it + // means depends on where all of a file's blocks are. mover.SettleDirectory(archive); archive.Position = 0; @@ -408,57 +414,60 @@ private void DefragmentWithPlanner(Stream archive, DefragOptions options) { } /// - /// Rewrites the volume with every file laid out contiguously from the start of - /// the payload area. Each entry is spilled to scratch and the writer pulls it - /// back, so the rebuild is not bounded by what a byte[] can hold. + /// Defragments the volume: in place when the planner's moves can be written back as extent + /// repoints (any tree height), otherwise by a staged rebuild that lays every file out + /// contiguously at the same volume size. /// public void Defragment(Stream archive, DefragOptions options) { ArgumentNullException.ThrowIfNull(archive); ArgumentNullException.ThrowIfNull(options); - var saved = CaptureMetadata(archive); - - using (var reader = new Reiser4Reader(archive)) { - var plannerProfile = reader.NativeNodeBlocks.Count == 2 && reader.NativeNodeBlocks.Contains(23UL) && - reader.NativeNodeBlocks.Contains(24UL) && reader.Entries.All(static entry => !entry.IsDirectory); - if (plannerProfile && archive.CanSeek && archive.Length <= MaxBufferedImageBytes) { - var planned = false; - DefragContentGuard.RunOrRebuild(archive, - readContents: ReadPayloadsForGuard, - inPlace: () => { - DefragmentWithPlanner(archive, options); - var moved = CaptureMetadata(archive); - if (saved.Root is { } root && !MetadataMatches(root, moved.Root) || - saved.Entries.Any(pair => !moved.Entries.TryGetValue(pair.Key, out var entry) || - pair.Value.Metadata is { } metadata && !MetadataMatches(metadata, entry.Metadata))) - throw new InvalidDataException("Reiser4: in-place defrag changed native metadata."); - planned = true; - }, - rebuild: () => planned = false); - if (planned) return; - archive.Position = 0; - } + archive.Position = 0; + Dictionary before; + bool inPlace; + using (var volume = new Reiser4Volume(archive)) { + if (!volume.TreeValid) throw new NotSupportedException($"Reiser4: refusing to defragment: {volume.Problem}."); + _ = Reiser4Plan.FromVolume(volume); + before = volume.Objects.ToDictionary(static pair => pair.Key.ToString(), static pair => pair.Value.Stat.Raw); + inPlace = volume.ReplayedTransactions == 0 && archive.CanSeek && archive.Length <= MaxBufferedImageBytes; + } + if (inPlace) { + var planned = false; + DefragContentGuard.RunOrRebuild(archive, + readContents: ReadPayloadsForGuard, + inPlace: () => { + this.DefragmentWithPlanner(archive, options); + archive.Position = 0; + using var moved = new Reiser4Volume(archive); + if (!moved.TreeValid || moved.Objects.Count != before.Count || + moved.Objects.Any(pair => !before.TryGetValue(pair.Key.ToString(), out var raw) || !raw.AsSpan().SequenceEqual(pair.Value.Stat.Raw))) + throw new InvalidDataException("Reiser4: in-place defrag changed native metadata."); + planned = true; + }, + rebuild: () => planned = false); + if (planned) return; + archive.Position = 0; } if (options.Mode is not (DefragMode.ConsolidateAtStart or DefragMode.FillHolesLazy)) throw new NotSupportedException( $"Reiser4 defragmentation supports ConsolidateAtStart and FillHolesLazy; got {options.Mode}."); - using var source = new RebuildSource(this, archive); - RebuildVerb.RebuildInPlace(archive, source, new MetadataCreator(saved), - onProgress: options.OnProgress, cancellationToken: options.CancellationToken); + options.OnProgress?.Invoke(new DefragProgressEvent("rebuilding", 0.1, -1, -1, archive.Length, null, "Rebuilding the volume")); + EditStaged(archive, static _ => { }); + options.OnProgress?.Invoke(new DefragProgressEvent("complete", 1, -1, -1, archive.Length, null, "Rebuild committed successfully")); } - /// Rebuilds tightly while retaining native metadata, or copies through on failure. + /// Rebuilds tightly while retaining native metadata, or copies through when the volume cannot be rebuilt smaller. public void Shrink(Stream input, Stream output) { using var staged = RebuildVerb.CreateScratchStream(); var useStaged = false; try { - var saved = CaptureMetadata(input) with { Length = 0 }; - using var source = new RebuildSource(this, input); - RebuildVerb.RebuildToStream(input, staged, source, new MetadataCreator(saved)); + StageTo(input, staged, static _ => { }, static _ => Reiser4Writer.MinBlockCount); useStaged = staged.Length < input.Length; - } catch { /* retain the original when the supported writer cannot represent it */ } + } catch (Exception ex) when (ex is NotSupportedException or InvalidDataException) { + // the original is retained when the writer cannot represent it + } input.Position = 0; output.Position = 0; output.SetLength(0); @@ -466,22 +475,20 @@ public void Shrink(Stream input, Stream output) { else input.CopyTo(output); } - /// Rebuilds the supported native profile while carrying existing metadata. + /// Rebuilds the volume while carrying existing metadata, at the requested image size or the smallest that holds it. public void RebuildStreaming(Stream source, Stream target, LayoutRebuildOptions options) { ArgumentNullException.ThrowIfNull(options); if (options.UnitSize is not (0 or Reiser4Writer.BlockSize) || options.MakeSparse || options.DeduplicateWithLinks) throw new NotSupportedException("Reiser4: this writer uses 4096-byte blocks without sparse or shared-file transforms."); - var parameters = new Dictionary(StringComparer.OrdinalIgnoreCase); - if (options.ImageSize > 0) parameters["ImageSize"] = options.ImageSize.ToString(CultureInfo.InvariantCulture); + var imageSize = options.ImageSize; if (options.Parameters is not null) foreach (var pair in options.Parameters) { if (!pair.Key.Equals("ImageSize", StringComparison.OrdinalIgnoreCase)) throw new NotSupportedException($"Reiser4: unsupported rebuild parameter '{pair.Key}'."); - parameters[pair.Key] = pair.Value; + imageSize = FilesystemSchemaPresets.ParseSize(pair.Value); } - var saved = CaptureMetadata(source) with { Length = 0 }; - using var sourceOps = new RebuildSource(this, source); - RebuildVerb.RebuildToStream(source, target, sourceOps, new MetadataCreator(saved), parameters); + var blocks = imageSize > 0 ? (ulong)(imageSize / Reiser4Writer.BlockSize) : Reiser4Writer.MinBlockCount; + StageTo(source, target, static _ => { }, _ => Math.Max(Reiser4Writer.MinBlockCount, blocks)); } private static string SafeMemberPath(string root, string name) { @@ -492,127 +499,6 @@ private static string SafeMemberPath(string root, string name) { return Path.Combine(root, Path.Combine(components)); } - // One native walk for a rebuild; opening every member must not reparse a wide tree. - private sealed class RebuildSource : IArchiveFormatOperations, IDisposable { - private readonly Reiser4FormatDescriptor _owner; - private readonly Stream _source; - private readonly Reiser4Reader _reader; - private readonly Dictionary _entries; - - internal RebuildSource(Reiser4FormatDescriptor owner, Stream source) { - this._owner = owner; - this._source = source; - this._reader = new Reiser4Reader(source); - if (!this._reader.NativeTreeValid) throw new NotSupportedException("Reiser4: unsupported rebuild source."); - this._entries = this._reader.Entries.ToDictionary(static entry => entry.Name, StringComparer.Ordinal); - } - - public List List(Stream stream, string? password) - => ReferenceEquals(stream, this._source) - ? this._reader.Entries.Select(static (entry, index) => new ArchiveEntryInfo(index, entry.Name, - entry.Size, entry.Size, "stored", entry.IsDirectory, false, entry.Metadata?.LastModified)).ToList() - : this._owner.List(stream, password); - - public void Extract(Stream stream, string outputDir, string? password, string[]? files) { - if (!ReferenceEquals(stream, this._source)) { this._owner.Extract(stream, outputDir, password, files); return; } - foreach (var entry in this._reader.Entries) { - if (files is { Length: > 0 } && !MatchesFilter(entry.Name, files)) continue; - var destination = SafeMemberPath(outputDir, entry.Name); - if (entry.IsDirectory) { Directory.CreateDirectory(destination); continue; } - Directory.CreateDirectory(Path.GetDirectoryName(destination)!); - using var output = File.Create(destination); - if (this._reader.ExtractTo(entry, output) != entry.Size) - throw new EndOfStreamException($"Reiser4: truncated source member '{entry.Name}'."); - } - } - - public Stream OpenEntry(Stream archive, string entryName, string? password) { - if (!ReferenceEquals(archive, this._source)) - return ((IArchiveFormatOperations)this._owner).OpenEntry(archive, entryName, password); - if (!this._entries.TryGetValue(entryName, out var entry) || entry.IsDirectory) - throw new FileNotFoundException("Reiser4: source member was not found.", entryName); - if (entry.Size == 0) return new MemoryStream([], writable: false); - var spool = RebuildVerb.CreateScratchStream(); - try { - if (this._reader.ExtractTo(entry, spool) != entry.Size) - throw new EndOfStreamException($"Reiser4: truncated source member '{entryName}'."); - spool.Position = 0; - return spool; - } catch { spool.Dispose(); throw; } - } - - public void Dispose() => this._reader.Dispose(); - } - - private sealed record RebuildMetadata(string Label, string UuidHex, uint MkfsId, long Length, - Reiser4Reader.FileMetadata? Root, Dictionary Entries); - - /// - /// Everything a rebuild has to carry across, taken before anything is written. A tree the - /// reader cannot walk completely, or fixed blocks the writer would not reproduce, are - /// refused here, so the source is never touched. - /// - private static RebuildMetadata CaptureMetadata(Stream archive) { - using var reader = new Reiser4Reader(archive); - if (!reader.NativeTreeValid) - throw new NotSupportedException("Reiser4: refusing to rebuild an incomplete or unsupported native tree."); - var blocks = new Dictionary(); - byte[] Block(int number) { - if (blocks.TryGetValue(number, out var cached)) return cached; - var buffer = new byte[Reiser4Writer.BlockSize]; - archive.Position = (long)number * Reiser4Writer.BlockSize; - archive.ReadExactly(buffer); - return blocks[number] = buffer; - } - if (Reiser4Writer.ProfileMismatch(Block) is { } reason) - throw new NotSupportedException($"Reiser4: refusing to rebuild: {reason}."); - var mkfsId = BinaryPrimitives.ReadUInt32LittleEndian(Block(17).AsSpan(48, 4)); - archive.Position = 0; - return new(reader.Label, reader.UuidHex, mkfsId, reader.Length, reader.RootMetadata, - reader.Entries.ToDictionary(static entry => entry.Name, StringComparer.Ordinal)); - } - - private sealed class MetadataCreator(RebuildMetadata saved) : IArchiveCreatable { - public void Create(Stream output, IReadOnlyList inputs, FormatCreateOptions options) { - var directoryNames = inputs.Where(static input => input.IsDirectory) - .Select(static input => input.ArchiveName.Replace('\\', '/').TrimEnd('/')).ToArray(); - uint DirectoryLinks(string name) => checked((name.Length == 0 ? 3U : 2U) + (uint)directoryNames.Count(path => { - var slash = path.LastIndexOf('/'); - return (slash < 0 ? "" : path[..slash]) == name; - })); - var entries = saved.Entries.ToDictionary(static pair => pair.Key, pair => pair.Value.IsDirectory && pair.Value.Metadata is { } metadata - ? pair.Value with { Metadata = metadata with { LinkCount = DirectoryLinks(pair.Key) } } : pair.Value, StringComparer.Ordinal); - var effective = saved with { - Entries = entries, Root = saved.Root is { } rootMetadata ? rootMetadata with { LinkCount = DirectoryLinks("") } : null, - }; - CreateCore(output, inputs, options, effective); - using var rebuilt = new Reiser4Reader(output); - if (!rebuilt.NativeTreeValid || rebuilt.Label != saved.Label || rebuilt.UuidHex != saved.UuidHex) - throw new InvalidDataException("Reiser4: rebuilt native tree or volume identity failed verification."); - var expectedNames = inputs.Select(static input => input.ArchiveName.Replace('\\', '/').TrimEnd('/')) - .Order(StringComparer.Ordinal).ToArray(); - if (!rebuilt.Entries.Select(static entry => entry.Name).Order(StringComparer.Ordinal) - .SequenceEqual(expectedNames, StringComparer.Ordinal)) - throw new InvalidDataException("Reiser4: rebuilt namespace failed verification."); - if (effective.Root is { } root && !MetadataMatches(root, rebuilt.RootMetadata)) - throw new InvalidDataException("Reiser4: root metadata failed verification."); - foreach (var entry in rebuilt.Entries) { - if (effective.Entries.TryGetValue(entry.Name, out var original) && original.Metadata is { } before && - !MetadataMatches(before, entry.Metadata)) - throw new InvalidDataException($"Reiser4: metadata was lost for '{entry.Name}'."); - } - } - } - - private static bool MetadataMatches(Reiser4Reader.FileMetadata expected, Reiser4Reader.FileMetadata? actual) - => actual is not null && expected.ObjectId == actual.ObjectId && expected.StatLocality == actual.StatLocality && - expected.Mode == actual.Mode && expected.LinkCount == actual.LinkCount && - expected.UserId == actual.UserId && expected.GroupId == actual.GroupId && - expected.ModifiedTime == actual.ModifiedTime && expected.AccessedTime == actual.AccessedTime && - expected.ChangedTime == actual.ChangedTime && expected.RawStatData.Length == actual.RawStatData.Length && - expected.RawStatData.AsSpan(0, 2).SequenceEqual(actual.RawStatData.AsSpan(0, 2)) && - expected.RawStatData.AsSpan(44).SequenceEqual(actual.RawStatData.AsSpan(44)); - /// Updates a native object's mode, owner and timestamps through a staged rebuild. /// The readable, writable, seekable volume to update. /// The member path, or an empty string for the root directory. @@ -622,87 +508,80 @@ private static bool MetadataMatches(Reiser4Reader.FileMetadata expected, Reiser4 /// its extension bytes, or the volume is outside the supported profile; the volume is unchanged. public void UpdateMetadata(Stream archive, string name, Reiser4Reader.FileMetadata metadata) { ArgumentNullException.ThrowIfNull(metadata); - var saved = CaptureMetadata(archive); - var normalized = name.Replace('\\', '/').TrimEnd('/'); - var original = normalized.Length == 0 ? saved.Root : saved.Entries.GetValueOrDefault(normalized)?.Metadata; - if (original is null) throw new FileNotFoundException("Reiser4: native object was not found.", name); - if ((metadata.Mode & 0xF000) != (original.Mode & 0xF000)) - throw new NotSupportedException("Reiser4: metadata updates cannot change an object's kind."); - // The link count follows the namespace: a file has one name, a directory one more than - // its sub-directories. Any other value is what fsck.reiser4 reports as wrong. - if (metadata.LinkCount != original.LinkCount) - throw new NotSupportedException("Reiser4: the link count follows the namespace and cannot be set."); - // Extension bytes past the Unix fields are carried as found because their meaning is not - // verified here; accepting new ones would write a stat data nothing has checked. - if (metadata.RawStatData.Length != original.RawStatData.Length || - !metadata.RawStatData.AsSpan(0, 2).SequenceEqual(original.RawStatData.AsSpan(0, 2)) || - !metadata.RawStatData.AsSpan(Math.Min(44, metadata.RawStatData.Length)).SequenceEqual(original.RawStatData.AsSpan(Math.Min(44, original.RawStatData.Length)))) - throw new NotSupportedException("Reiser4: stat-data extensions other than the Unix fields cannot be changed."); - var updated = metadata with { - Size = original.Size, ObjectId = original.ObjectId, StatLocality = original.StatLocality, - RawStatData = original.RawStatData.ToArray(), - }; - if (normalized.Length == 0) saved = saved with { Root = updated }; - else saved.Entries[normalized] = saved.Entries[normalized] with { Metadata = updated }; - using var source = new RebuildSource(this, archive); - RebuildVerb.EditViaRebuild(archive, source, new MetadataCreator(saved), static _ => { }); + EditStaged(archive, plan => { + var target = plan.Find(name) ?? throw new FileNotFoundException("Reiser4: native object was not found.", name); + var original = Reiser4Stat.Parse(target.Stat, out _)!; + if ((metadata.Mode & 0xF000) != (original.Mode & 0xF000)) + throw new NotSupportedException("Reiser4: metadata updates cannot change an object's kind."); + // The link count follows the namespace: a file has one name per link, a directory one more + // than its sub-directories. Any other value is what fsck.reiser4 reports as wrong. + if (metadata.LinkCount != original.Links) + throw new NotSupportedException("Reiser4: the link count follows the namespace and cannot be set."); + // Extension bytes past the Unix fields are carried as found because their meaning is not + // verified here; accepting new ones would write a stat data nothing has checked. + if (metadata.RawStatData.Length != original.Raw.Length || + !metadata.RawStatData.AsSpan(0, 2).SequenceEqual(original.Raw.AsSpan(0, 2)) || + !metadata.RawStatData.AsSpan(Math.Min(44, metadata.RawStatData.Length)).SequenceEqual(original.Raw.AsSpan(Math.Min(44, original.Raw.Length)))) + throw new NotSupportedException("Reiser4: stat-data extensions other than the Unix fields cannot be changed."); + plan.ApplyMetadata(target, metadata); + }); } - /// Adds or replaces members while retaining existing stat-data extensions. - public void Add(Stream archive, IReadOnlyList inputs) { - var saved = CaptureMetadata(archive); - using var source = new RebuildSource(this, archive); - RebuildVerb.EditViaRebuild(archive, source, new MetadataCreator(saved), directory => { + /// Adds or replaces members while retaining every existing object; new files are stored as extents. + public void Add(Stream archive, IReadOnlyList inputs) => this.Add(archive, inputs, Reiser4FileBody.Extents); + + /// Adds or replaces members, storing new regular files as says. + /// A replaced file keeps its identity, metadata and plugin: a cryptcompress file stays one. + public void Add(Stream archive, IReadOnlyList inputs, Reiser4FileBody body) { + ArgumentNullException.ThrowIfNull(inputs); + foreach (var input in inputs) + if (!this.CanAccept(input, out var reason)) throw new NotSupportedException("Reiser4: " + reason + "."); + EditStaged(archive, plan => { + plan.FileBody = body; foreach (var input in inputs) { - var destination = SafeMemberPath(directory, input.ArchiveName); - if (input.IsDirectory) { Directory.CreateDirectory(destination); continue; } - Directory.CreateDirectory(Path.GetDirectoryName(destination)!); - if (input.InMemoryContent is { } bytes) File.WriteAllBytes(destination, bytes); - else File.Copy(input.FullPath, destination, overwrite: true); + var name = input.ArchiveName.Replace('\\', '/').TrimEnd('/'); + if (input.IsDirectory) { plan.AddDirectory(name, ToFileMetadata(input.Metadata)); continue; } + var payload = input.InMemoryContent is { } bytes + ? FilePayload.FromBytes(bytes) + : FilePayload.FromStream(new FileInfo(input.FullPath).Length, () => File.OpenRead(input.FullPath)); + plan.AddFile(name, payload, ToFileMetadata(input.Metadata)); } }); } + /// Adds a symbolic link at pointing at . + public void AddSymlink(Stream archive, string path, string target) + => EditStaged(archive, plan => plan.AddSymlink(path, target)); + + /// Adds as a further name of the existing file . + public void AddHardLink(Stream archive, string path, string existing) + => EditStaged(archive, plan => plan.AddHardLink(path, existing)); + + /// Adds a device node ( = major << 20 | minor), FIFO or socket. + public void AddSpecialFile(Stream archive, string path, ushort mode, ulong device = 0) + => EditStaged(archive, plan => plan.AddSpecial(path, mode, device)); + /// Removes members and directory subtrees through a metadata-preserving rebuild. public void Remove(Stream archive, string[] entryNames) { - var saved = CaptureMetadata(archive); - using var source = new RebuildSource(this, archive); - RebuildVerb.EditViaRebuild(archive, source, new MetadataCreator(saved), directory => { - foreach (var name in entryNames) { - var destination = SafeMemberPath(directory, name); - if (Directory.Exists(destination)) Directory.Delete(destination, recursive: true); - else if (File.Exists(destination)) File.Delete(destination); - } + ArgumentNullException.ThrowIfNull(entryNames); + EditStaged(archive, plan => { + foreach (var name in entryNames) plan.Remove(name); }); } // ── IArchiveWriteConstraints ───────────────────────────────────────── - /// - /// Performs the can accept operation. - /// public bool CanAccept(ArchiveInputInfo input, out string? reason) { ArgumentNullException.ThrowIfNull(input); reason = Reiser4Writer.RejectName(input.IsDirectory ? input.ArchiveName.TrimEnd('/', '\\') : input.ArchiveName); return reason is null; } - /// - /// Gets the max total archive size. - /// public long? MaxTotalArchiveSize => null; - /// - /// Gets the min total archive size. - /// public long? MinTotalArchiveSize => Reiser4Writer.BlockSize * (long)Reiser4Writer.MinBlockCount; // 16 MB - /// - /// Gets the accepted inputs description. - /// public string AcceptedInputsDescription => "Reiser4 image; regular files and nested directories named by the native tree."; // Bounded read — must NOT pull multi-GB images into memory when the carver - // runs us speculatively. Master SB is at 65536, format40 SB at 65536+blocksize - // (4 KB typical). Cap at 96 KB so the format40 block at 69632..70112 always - // fits even when blocksize is 4 KB. + // runs us speculatively. Master SB is at 65536, format40 SB at 65536+blocksize. private const int HeaderReadCap = 96 * 1024; private static byte[] ReadAllBounded(Stream stream) { @@ -717,9 +596,9 @@ private static byte[] ReadAllBounded(Stream stream) { // ── IFilesystemExtentMap + IWipeEmpty ───────────────────────────────── /// - /// Reports the volume's layout: the reserved blocks and the payload directory - /// chain as metadata, then each file's blocks. A file's blocks are consecutive - /// apart from the block-allocator bitmaps they step over. + /// Reports the volume's layout: the reserved blocks, the tree nodes and the allocator bitmaps as + /// metadata, then each file's extent runs. A volume whose journal still holds transactions to + /// replay reports nothing: its blocks are not yet where the tree says. /// public IEnumerable EnumerateExtents(Stream image) { ArgumentNullException.ThrowIfNull(image); @@ -727,16 +606,14 @@ public IEnumerable EnumerateExtents(Stream image) { try { if (image.CanSeek) image.Position = 0; using var reader = new Reiser4Reader(image); - if (!reader.NativeTreeValid) return []; + if (!reader.NativeTreeValid || reader.ReplayedTransactions > 0) return []; var blockSize = reader.BlockSize; - // Everything before the first file's blocks is reserved or directory. var firstData = reader.Length; List> files = []; + var seen = new HashSet(); foreach (var e in reader.Entries) { - if (e.Size <= 0) continue; - // A file is not one run: the allocator bitmaps inside it are stepped - // over, so its bytes continue past where its length alone would end. + if (e.Kind != Reiser4Reader.EntryKind.File || e.Size <= 0 || e.Native is null || !seen.Add(e.Native.StatKey)) continue; List runs = []; foreach (var (offset, length) in reader.EnumerateRuns(e)) { if (offset < firstData) firstData = offset; @@ -745,16 +622,15 @@ public IEnumerable EnumerateExtents(Stream image) { if (runs.Count > 0) files.Add(runs); } - var metadataEnd = files.Count > 0 ? firstData : Math.Min(reader.Length, 25L * blockSize); + var metadataEnd = Math.Min(reader.Length, 25L * blockSize); result.Add(new DefragBlockInfo(0, metadataEnd, DefragBlockKind.MetadataReserved, - "Reserved blocks and the payload directory")); + "Reserved blocks")); foreach (var node in reader.NativeNodeBlocks) if ((long)node * blockSize >= metadataEnd) result.Add(new DefragBlockInfo((long)node * blockSize, blockSize, DefragBlockKind.MetadataReserved, "Native tree node")); - // The bitmaps sit at stride boundaries inside the payload area. for (var block = Reiser4Writer.BlocksPerBitmap; (long)block * blockSize + blockSize <= reader.Length; block += Reiser4Writer.BlocksPerBitmap) @@ -762,10 +638,7 @@ public IEnumerable EnumerateExtents(Stream image) { DefragBlockKind.MetadataReserved, "Block-allocator bitmap")); // A map is read as a walk over the volume: each file keeps its own runs in - // chain order, but the files themselves follow the bytes, not the - // directory. The native tree lists names in key order, which is not where - // their blocks are, and a map in that order makes the defrag planner shuffle - // an already-consolidated volume. + // logical order, but the files themselves follow the bytes, not the tree. foreach (var runs in files.OrderBy(static runs => runs[0].Offset)) result.AddRange(runs); } catch { @@ -783,5 +656,4 @@ public long WipeUnusedSpace(Stream image, bool wipeClusterTips = true, bool wipe return UnusedSpaceWiper.Wipe(image, extents, image.Length, wipeClusterTips: false, fileSizeLookup: null); } - } diff --git a/Hawkynt.FileFormats.FileSystems/FileSystems/FileSystem.Reiser4/Reiser4Journal.cs b/Hawkynt.FileFormats.FileSystems/FileSystems/FileSystem.Reiser4/Reiser4Journal.cs new file mode 100644 index 000000000..515efd3c1 --- /dev/null +++ b/Hawkynt.FileFormats.FileSystems/FileSystems/FileSystem.Reiser4/Reiser4Journal.cs @@ -0,0 +1,94 @@ +#pragma warning disable CS1591 +using System.Buffers.Binary; + +namespace FileSystem.Reiser4; + +/// +/// Replays the format40 journal ("wandered logs") into an in-memory overlay, the way the kernel +/// and fsck.reiser4 do before they read the tree. +/// +/// +/// Block 19 (journal header) names the last committed transaction, block 20 (journal footer) +/// the last one whose blocks were written back to their home locations. Every transaction between +/// the two, oldest first, is replayed: its head block ("TxMagic4") links to the previous +/// transaction and to a chain of wander records ("LogMagc4"), each listing +/// (original, wandered) block pairs; replay copies each wandered block over its original. +/// The layout is written down in docs/REISER4-NATIVE-PROFILE.md and was confirmed on a +/// volume captured between a kernel commit and its write-back. +/// +internal static class Reiser4Journal { + + internal const ulong HeaderBlock = 19; + internal const ulong FooterBlock = 20; + + private static readonly byte[] TxMagic = "TxMagic4"u8.ToArray(); + private static readonly byte[] RecordMagic = "LogMagc4"u8.ToArray(); + + /// Outcome of a replay: the replaced blocks and how many transactions they came from. + internal sealed record Replay(IReadOnlyDictionary Blocks, int Transactions); + + /// + /// Replays every committed but unflushed transaction. Returns an empty replay when the journal + /// has nothing pending, and with a reason when the chain does not parse. + /// + internal static Replay? Read(Func readRaw, ulong blockCount, out string? problem) { + problem = null; + var header = readRaw(HeaderBlock); + var footer = readRaw(FooterBlock); + var lastCommitted = BinaryPrimitives.ReadUInt64LittleEndian(header); + var lastFlushed = BinaryPrimitives.ReadUInt64LittleEndian(footer); + var blocks = new Dictionary(); + if (lastCommitted == 0 || lastCommitted == lastFlushed) return new(blocks, 0); + + var chain = new List(); + var seen = new HashSet(); + for (var tx = lastCommitted; tx != lastFlushed;) { + if (tx == 0 || tx >= blockCount || !seen.Add(tx) || chain.Count > 4096) { + problem = "the journal's transaction chain does not reach the last flushed transaction"; + return null; + } + var head = readRaw(tx); + if (!head.AsSpan(0, TxMagic.Length).SequenceEqual(TxMagic)) { + problem = $"journal block {tx} is not a transaction head"; + return null; + } + chain.Add(head); + tx = BinaryPrimitives.ReadUInt64LittleEndian(head.AsSpan(24)); + } + + byte[] Current(ulong block) => blocks.TryGetValue(block, out var replaced) ? replaced : readRaw(block); + for (var i = chain.Count - 1; i >= 0; --i) { + var head = chain[i]; + var total = BinaryPrimitives.ReadUInt32LittleEndian(head.AsSpan(16)); + var record = BinaryPrimitives.ReadUInt64LittleEndian(head.AsSpan(32)); + var pending = new List<(ulong Original, ulong Wandered)>(); + for (var serial = 1U; serial < total; ++serial) { + if (record == 0 || record >= blockCount) { + problem = "a wander record lies outside the volume"; + return null; + } + var log = Current(record); + if (!log.AsSpan(0, RecordMagic.Length).SequenceEqual(RecordMagic) || + BinaryPrimitives.ReadUInt32LittleEndian(log.AsSpan(20)) != serial) { + problem = $"journal block {record} is not wander record {serial}"; + return null; + } + for (var at = 32; at + 16 <= log.Length; at += 16) { + var original = BinaryPrimitives.ReadUInt64LittleEndian(log.AsSpan(at)); + var wandered = BinaryPrimitives.ReadUInt64LittleEndian(log.AsSpan(at + 8)); + if (original == 0) break; + if (original >= blockCount || wandered == 0 || wandered >= blockCount) { + problem = "a wander record names a block outside the volume"; + return null; + } + pending.Add((original, wandered)); + } + record = BinaryPrimitives.ReadUInt64LittleEndian(log.AsSpan(24)); + } + // Read every wandered copy before writing any home location: a transaction is applied whole. + var copies = pending.Select(pair => (pair.Original, Bytes: Current(pair.Wandered).ToArray())).ToList(); + foreach (var (original, bytes) in copies) blocks[original] = bytes; + } + return new(blocks, chain.Count); + } +} diff --git a/Hawkynt.FileFormats.FileSystems/FileSystems/FileSystem.Reiser4/Reiser4Keys.cs b/Hawkynt.FileFormats.FileSystems/FileSystems/FileSystem.Reiser4/Reiser4Keys.cs new file mode 100644 index 000000000..b333f5012 --- /dev/null +++ b/Hawkynt.FileFormats.FileSystems/FileSystems/FileSystem.Reiser4/Reiser4Keys.cs @@ -0,0 +1,214 @@ +#pragma warning disable CS1591 +using System.Buffers.Binary; + +namespace FileSystem.Reiser4; + +/// A large (four-word) Reiser4 key, compared word by word as unsigned values. +/// +/// The first word holds the locality in its top sixty bits and the item type ("minor") in its +/// low four; then come the ordering, the object id and the offset. See +/// docs/REISER4-NATIVE-PROFILE.md for how each item kind fills them. +/// +internal readonly record struct Reiser4Key(ulong Word0, ulong Ordering, ulong ObjectId, ulong Offset) : IComparable { + + internal const byte MinorName = 0; + internal const byte MinorStatData = 1; + internal const byte MinorBody = 4; + + internal ulong Locality => this.Word0 >> 4; + internal byte Minor => (byte)(this.Word0 & 0xF); + + internal static Reiser4Key Of(ulong locality, byte minor, ulong ordering, ulong objectId, ulong offset) + => new(locality << 4 | minor, ordering, objectId, offset); + + /// The stat-data key of the object this key belongs to. + internal Reiser4Key StatKey => Of(this.Locality, MinorStatData, this.Ordering, this.ObjectId, 0); + + public int CompareTo(Reiser4Key other) { + var c = this.Word0.CompareTo(other.Word0); + if (c != 0) return c; + c = this.Ordering.CompareTo(other.Ordering); + if (c != 0) return c; + c = this.ObjectId.CompareTo(other.ObjectId); + return c != 0 ? c : this.Offset.CompareTo(other.Offset); + } + + internal static Reiser4Key Read(ReadOnlySpan at) => new( + BinaryPrimitives.ReadUInt64LittleEndian(at), + BinaryPrimitives.ReadUInt64LittleEndian(at[8..]), + BinaryPrimitives.ReadUInt64LittleEndian(at[16..]), + BinaryPrimitives.ReadUInt64LittleEndian(at[24..])); + + internal void Write(Span at) { + BinaryPrimitives.WriteUInt64LittleEndian(at, this.Word0); + BinaryPrimitives.WriteUInt64LittleEndian(at[8..], this.Ordering); + BinaryPrimitives.WriteUInt64LittleEndian(at[16..], this.ObjectId); + BinaryPrimitives.WriteUInt64LittleEndian(at[24..], this.Offset); + } +} + +/// Plugin identifiers of the hash and fibration plugin types (plugin type 3 and 4). +internal enum Reiser4HashId : ushort { Rupasov = 0, R5 = 1, Tea = 2, Fnv1 = 3, Degenerate = 4 } + +internal enum Reiser4FibrationId : ushort { Lexicographic = 0, DotO = 1, Extension1 = 2, Extension3 = 3 } + +/// +/// How a directory entry's key is made from its name: the bytes packed into the key where they +/// fit, a hash of the rest where they do not, and a "fibre" chosen by the fibration plugin in the +/// ordering's top seven bits. +/// +/// +/// Derived from the format description in docs/REISER4-NATIVE-PROFILE.md and checked +/// against directory entries a Reiser4 kernel wrote with every hash and fibration plugin; none of +/// the reference implementations' code was carried over. +/// +internal static class Reiser4NameKeys { + + /// Names up to this many bytes are held in the key itself and stored nowhere else. + internal const int MaxInlineLength = 23; + + /// The ordering bit that says the name was hashed rather than held. + internal const ulong LongNameBit = 0x0100_0000_0000_0000; + + private const int FibreShift = 57; + + /// Up to eight (or seven) bytes of , big-endian, from . + private static ulong Pack(ReadOnlySpan name, int from, int skip) { + ulong value = 0; + var room = 8 - skip; + var taken = 0; + for (var i = from; i < name.Length && taken < room; ++i, ++taken) + value = value << 8 | name[i]; + return value << (room - taken) * 8; + } + + /// Whether can key new long names this writer is asked to add. + /// + /// The Rupasov hash is computed differently by the kernel and by reiser4progs — a kernel-written + /// entry is reported by fsck.reiser4 as carrying the wrong offset — so no long name keyed + /// with it can satisfy both. Existing entries are carried with their keys as found. + /// + internal static bool CanHash(Reiser4HashId hash) => hash is Reiser4HashId.R5 or Reiser4HashId.Tea + or Reiser4HashId.Fnv1 or Reiser4HashId.Degenerate; + + /// The three words of the entry key for , and whether it was hashed. + internal static (ulong Ordering, ulong ObjectId, ulong Offset, bool Hashed) Make( + ReadOnlySpan name, Reiser4HashId hash, Reiser4FibrationId fibration) { + if (name.Length == 1 && name[0] == (byte)'.') return (0, 0, 0, false); + var ordering = Pack(name, 0, 1); + var objectId = name.Length > 7 ? Pack(name, 7, 0) : 0UL; + ulong offset = 0; + var hashed = name.Length > MaxInlineLength; + if (hashed) { + ordering |= LongNameBit; + offset = Hash(hash, name[15..]); + } else if (name.Length > 15) + offset = Pack(name, 15, 0); + return (ordering | Fibre(fibration, name), objectId, offset, hashed); + } + + /// The fibre bits a name sorts under, already shifted into place. + internal static ulong Fibre(Reiser4FibrationId fibration, ReadOnlySpan name) { + var n = name.Length; + ulong fibre = fibration switch { + Reiser4FibrationId.Lexicographic => 0, + Reiser4FibrationId.DotO => n > 2 && name[n - 1] == (byte)'o' && name[n - 2] == (byte)'.' ? 1UL : 0, + Reiser4FibrationId.Extension1 => n > 2 && name[n - 2] == (byte)'.' ? (ulong)(sbyte)name[n - 1] : 0, + Reiser4FibrationId.Extension3 => n > 4 && name[n - 4] == (byte)'.' + ? (ulong)((sbyte)name[n - 3] + (sbyte)name[n - 2] + (sbyte)name[n - 1]) : 0, + _ => throw new NotSupportedException($"Reiser4: fibration plugin {fibration} is not supported."), + }; + // Only seven bits survive the shift: the eighth and above fall off the word. + return fibre << FibreShift; + } + + internal static ulong Hash(Reiser4HashId hash, ReadOnlySpan tail) => hash switch { + Reiser4HashId.R5 => R5(tail), + Reiser4HashId.Tea => Tea(tail), + Reiser4HashId.Fnv1 => Fnv1(tail), + Reiser4HashId.Degenerate => 0xC0C0_C0C0_1010_1010UL, + _ => throw new NotSupportedException($"Reiser4: names cannot be hashed with the {hash} hash."), + }; + + private static ulong R5(ReadOnlySpan data) { + ulong a = 0; + foreach (var b in data) { + a += (ulong)b << 4; + a += (ulong)b >> 4; + a *= 11; + } + return a; + } + + /// FNV-1 (64-bit): multiply by the prime, then xor the octet. + private static ulong Fnv1(ReadOnlySpan data) { + var a = 0xCBF2_9CE4_8422_2325UL; + foreach (var b in data) { + a *= 0x0000_0100_0000_01B3UL; + a ^= b; + } + return a; + } + + /// + /// The TEA-based Davies–Meyer hash in the 64-bit arithmetic Reiser4 evaluates it in: sixteen-byte + /// blocks get six rounds, the padded remainder ten, and the result is the two halves xored. + /// + private static ulong Tea(ReadOnlySpan name) { + ulong h0 = 0x9464A485u, h1 = 0x542E1A94u; + var len = name.Length; + var pad = (ulong)(uint)len | (ulong)(uint)len << 8; + pad |= pad << 16; + + static ulong Word(ReadOnlySpan s) => s[0] | (ulong)s[1] << 8 | (ulong)s[2] << 16 | (ulong)s[3] << 24; + + void Mix(ulong a, ulong b, ulong c, ulong d, int rounds) { + ulong sum = 0, b0 = h0, b1 = h1; + for (var n = 0; n < rounds; ++n) { + sum += 0x9E3779B9u; + b0 += ((b1 << 4) + a) ^ (b1 + sum) ^ ((b1 >> 5) + b); + b1 += ((b0 << 4) + c) ^ (b0 + sum) ^ ((b0 >> 5) + d); + } + h0 += b0; + h1 += b1; + } + + var at = 0; + while (len - at >= 16) { + var s = name[at..]; + Mix(Word(s), Word(s[4..]), Word(s[8..]), Word(s[12..]), 6); + at += 16; + } + + var rest = name[at..]; + ulong wa, wb, wc, wd; + static ulong Tail(ReadOnlySpan rest, int from, ulong pad) { + var v = pad; + for (var i = from; i < rest.Length; ++i) v = v << 8 | rest[i]; + return v; + } + if (rest.Length >= 12) { wa = Word(rest); wb = Word(rest[4..]); wc = Word(rest[8..]); wd = Tail(rest, 12, pad); } + else if (rest.Length >= 8) { wa = Word(rest); wb = Word(rest[4..]); wc = Tail(rest, 8, pad); wd = pad; } + else if (rest.Length >= 4) { wa = Word(rest); wb = Tail(rest, 4, pad); wc = wd = pad; } + else { wa = Tail(rest, 0, pad); wb = wc = wd = pad; } + Mix(wa, wb, wc, wd, 10); + return h0 ^ h1; + } + + /// The name a key holds whole, or when the key hashed it. + internal static byte[]? Unpack(ulong ordering, ulong objectId, ulong offset) { + if ((ordering & LongNameBit) != 0) return null; + if (ordering == 0 && objectId == 0 && offset == 0) return [(byte)'.']; + var bytes = new List(23); + static bool Take(List into, ulong value, int count) { + for (var shift = (count - 1) * 8; shift >= 0; shift -= 8) { + var b = (byte)(value >> shift); + if (b == 0) return false; + into.Add(b); + } + return true; + } + if (Take(bytes, ordering & 0x00FF_FFFF_FFFF_FFFFUL, 7) && Take(bytes, objectId, 8)) Take(bytes, offset, 8); + return [.. bytes]; + } +} diff --git a/Hawkynt.FileFormats.FileSystems/FileSystems/FileSystem.Reiser4/Reiser4Plan.cs b/Hawkynt.FileFormats.FileSystems/FileSystems/FileSystem.Reiser4/Reiser4Plan.cs new file mode 100644 index 000000000..dbbc76e33 --- /dev/null +++ b/Hawkynt.FileFormats.FileSystems/FileSystems/FileSystem.Reiser4/Reiser4Plan.cs @@ -0,0 +1,481 @@ +#pragma warning disable CS1591 +using System.Buffers.Binary; +using System.Text; +using Compression.Core.DiskImage; + +namespace FileSystem.Reiser4; + +/// How the body of a regular file this writer creates is stored. +public enum Reiser4FileBody { + /// Extent items in twigs pointing at data blocks (reg40, "extents" formatting). + Extents, + /// Tail (plain40) items in leaves holding the bytes themselves (reg40, "tails" formatting). + Tails, + /// Tails up to four blocks, extents above that — the kernel's "smart" formatting. + Smart, + /// A cryptcompress (ccreg40) file: compressed disk clusters in ctail40 items. + Compressed, + /// Whatever the volume's root plugin set says new files are: its create plugin, then its formatting. + Profile, +} + +/// One unit of an extent body: a hole (no payload) or blocks that receive the payload's bytes. +internal readonly record struct Reiser4PlanUnit(ulong Width, FilePayload? Payload); + +/// An object as the writer lays it out. +internal sealed class Reiser4PlanObject { + internal required Reiser4Key StatKey { get; set; } + internal required byte[] Stat { get; set; } + internal List Entries { get; } = []; + internal List<(Reiser4Key Key, ushort Plugin, byte[] Body)> Items { get; set; } = []; + internal List Extents { get; set; } = []; + + internal ushort Mode => BinaryPrimitives.ReadUInt16LittleEndian(this.Stat.AsSpan(2)); + internal int Kind => this.Mode & Reiser4Stat.FileType; + internal bool IsDirectory => this.Kind == Reiser4Stat.Directory; + internal ulong ObjectId => this.StatKey.ObjectId; + internal bool IsCryptcompress { + get { + var stat = Reiser4Stat.Parse(this.Stat, out _); + return stat is not null && stat.PluginSet.TryGetValue(Reiser4PsetMember.File, out var file) && file == 4; + } + } + + internal void SetLinks(uint links) => BinaryPrimitives.WriteUInt32LittleEndian(this.Stat.AsSpan(4), links); + internal void SetSize(ulong size) => BinaryPrimitives.WriteUInt64LittleEndian(this.Stat.AsSpan(8), size); + internal void SetBytes(ulong bytes) => BinaryPrimitives.WriteUInt64LittleEndian(this.Stat.AsSpan(36), bytes); +} + +/// +/// A whole volume as the writer will lay it out: the fixed blocks it carries (master, format, +/// status, backup), the node plugin, and every object with its stat data, body and entries. +/// Edits — add, replace, remove, metadata updates, links — are made here, and +/// turns the result into an image. +/// +/// +/// Objects read from a volume keep their stat data, keys, directory entry keys and file bodies as +/// found; only the counters the namespace implies (link counts, directory sizes) are recomputed. +/// New names are keyed with the directory's own hash and fibration plugins. +/// +internal sealed class Reiser4Plan { + + internal byte[] Master { get; set; } = []; + internal byte[] Format { get; set; } = []; + internal byte[] Status { get; set; } = []; + internal byte[] Backup { get; set; } = []; + internal ushort NodePlugin { get; set; } + internal uint MkfsId { get; set; } + internal ulong MinimumBlocks { get; set; } + internal ulong NextObjectId { get; set; } + + /// How new regular files are stored. + internal Reiser4FileBody FileBody { get; set; } = Reiser4FileBody.Extents; + + private readonly Dictionary _objects = []; + internal IReadOnlyList Objects => [.. this._objects.Values.OrderBy(static o => o.StatKey)]; + internal Reiser4PlanObject Root => this._objects[Reiser4Volume.RootStatKey]; + + private int MaxItemBody => Reiser4Volume.BlockSize - (this.NodePlugin == 1 ? 32 : Reiser4Tree.NodeHeaderBytes) - Reiser4Tree.ItemHeaderBytes; + + // ── Construction ─────────────────────────────────────────────────────── + + /// A plan holding everything holds, bodies referencing its blocks. + internal static Reiser4Plan FromVolume(Reiser4Volume volume) { + if (!volume.TreeValid || volume.Root is null) + throw new NotSupportedException($"Reiser4: refusing to rebuild: {volume.Problem ?? "the tree was not read"}."); + var status = volume.ReadBlock(21); + if (!status.AsSpan(0, 15).SequenceEqual("ReiSeR4StATusBl"u8) || BinaryPrimitives.ReadUInt64LittleEndian(status.AsSpan(16)) != 0) + throw new NotSupportedException("Reiser4: refusing to rebuild: the status block does not mark the volume consistent."); + var format = volume.ReadBlock(17); + var plan = new Reiser4Plan { + Master = volume.ReadBlock(16), + Format = format, + Status = status, + Backup = volume.ReadBlock(22), + NodePlugin = volume.NodePlugin, + MkfsId = BinaryPrimitives.ReadUInt32LittleEndian(format.AsSpan(48)), + MinimumBlocks = volume.BlockCount, + }; + var maxId = Reiser4Volume.RootObjectId; + foreach (var obj in volume.Objects.Values) { + var planned = new Reiser4PlanObject { StatKey = obj.StatKey, Stat = obj.Stat.Raw.ToArray() }; + planned.Entries.AddRange(obj.Entries); + if (obj.Body.Count > 0 && obj.Body[0].Plugin == Reiser4ItemPlugin.Extent) { + foreach (var (start, width) in volume.ExtentUnits(obj)) + planned.Extents.Add(new Reiser4PlanUnit(width, start == 0 ? null : BlockPayload(volume, start, width))); + } else { + foreach (var item in obj.Body) planned.Items.Add((item.Key, item.Plugin, volume.ReadBody(item))); + } + plan._objects.Add(obj.StatKey, planned); + maxId = Math.Max(maxId, obj.ObjectId); + } + var next = BinaryPrimitives.ReadUInt64LittleEndian(format.AsSpan(24)); + plan.NextObjectId = Math.Max(next, Math.Max(0x10000UL, maxId + 1)); + plan._paths = null; + return plan; + } + + /// An empty volume made from the captured mkfs blocks: a root directory holding only its dot entries. + internal static Reiser4Plan Fresh(byte[] master, byte[] format, byte[] status, byte[] backup, byte[] rootLeaf, uint mkfsId, ulong blocks) { + var rootStatOffset = BinaryPrimitives.ReadUInt16LittleEndian(rootLeaf.AsSpan(Reiser4Volume.BlockSize - Reiser4Tree.ItemHeaderBytes + 32)); + var rootStatEnd = BinaryPrimitives.ReadUInt16LittleEndian(rootLeaf.AsSpan(Reiser4Volume.BlockSize - 2 * Reiser4Tree.ItemHeaderBytes + 32)); + var plan = new Reiser4Plan { + Master = master, Format = format, Status = status, Backup = backup, + NodePlugin = 0, MkfsId = mkfsId, MinimumBlocks = blocks, NextObjectId = 0x10000, + }; + var root = new Reiser4PlanObject { StatKey = Reiser4Volume.RootStatKey, Stat = rootLeaf.AsSpan(rootStatOffset, rootStatEnd - rootStatOffset).ToArray() }; + root.Entries.Add(new Reiser4DirEntry(0, 0, 0, [(byte)'.'], Reiser4Volume.RootStatKey)); + var (o, i, f, _) = Reiser4NameKeys.Make(".."u8, Reiser4HashId.R5, Reiser4FibrationId.Extension1); + root.Entries.Add(new Reiser4DirEntry(o, i, f, ".."u8.ToArray(), Reiser4Volume.RootStatKey)); + plan._objects.Add(root.StatKey, root); + return plan; + } + + private static FilePayload BlockPayload(Reiser4Volume volume, ulong start, ulong width) + => FilePayload.FromStream(checked((long)width * Reiser4Volume.BlockSize), () => { + var buffer = new MemoryStream(); + volume.CopyBlocks(start, width, buffer, checked((long)width * Reiser4Volume.BlockSize)); + buffer.Position = 0; + return buffer; + }); + + // ── Profile ──────────────────────────────────────────────────────────── + + /// A plugin-set member of : its own, else the root's, else the kernel default. + internal ushort Plugin(Reiser4PlanObject owner, ushort member) { + if (Reiser4Stat.Parse(owner.Stat, out _) is { } own && own.PluginSet.TryGetValue(member, out var value)) return value; + if (Reiser4Stat.Parse(this.Root.Stat, out _) is { } root && root.PluginSet.TryGetValue(member, out var inherited)) return inherited; + return member switch { + Reiser4PsetMember.Formatting => 2, + Reiser4PsetMember.Hash => (ushort)Reiser4HashId.R5, + Reiser4PsetMember.Fibration => (ushort)Reiser4FibrationId.Extension1, + Reiser4PsetMember.CompressionMode => (ushort)Reiser4CompressionModeId.Convert, + _ => 0, + }; + } + + // ── Namespace ────────────────────────────────────────────────────────── + + private Dictionary? _paths; + + /// Every path, with the directory that names it and the entry that does. + internal IReadOnlyDictionary Paths { + get { + if (this._paths is { } cached) return cached; + var paths = new Dictionary(StringComparer.Ordinal); + void Walk(Reiser4PlanObject directory, string prefix, int depth) { + if (depth > 128) throw new InvalidDataException("Reiser4: the namespace is deeper than this writer walks."); + foreach (var entry in directory.Entries) { + if (entry.IsDot || entry.IsDotDot) continue; + var path = prefix.Length == 0 ? Reiser4Volume.DecodeName(entry.Name) : prefix + "/" + Reiser4Volume.DecodeName(entry.Name); + paths[path] = (directory, entry); + if (this._objects.TryGetValue(entry.Target, out var target) && target.IsDirectory) Walk(target, path, depth + 1); + } + } + Walk(this.Root, "", 0); + return this._paths = paths; + } + } + + internal Reiser4PlanObject? Find(string path) { + var normalized = Normalize(path); + if (normalized.Length == 0) return this.Root; + return this.Paths.TryGetValue(normalized, out var hit) ? this._objects.GetValueOrDefault(hit.Entry.Target) : null; + } + + internal static string Normalize(string path) => path.Replace('\\', '/').Trim('/'); + + private Reiser4PlanObject EnsureDirectory(string path, Reiser4Reader.FileMetadata? metadata = null) { + var normalized = Normalize(path); + if (normalized.Length == 0) return this.Root; + if (this.Find(normalized) is { } existing) { + if (!existing.IsDirectory) throw new InvalidDataException($"Reiser4: file/directory collision at '{normalized}'."); + return existing; + } + var slash = normalized.LastIndexOf('/'); + var parent = this.EnsureDirectory(slash < 0 ? "" : normalized[..slash]); + var name = Encoding.UTF8.GetBytes(slash < 0 ? normalized : normalized[(slash + 1)..]); + var stat = this.NewStat(metadata, 0x41ED, 0, 0, symlink: null, pluginSet: null); + var directory = this.Link(parent, name, stat, metadata?.ObjectId ?? 0); + var (o, i, f, _) = Reiser4NameKeys.Make(".."u8, Reiser4HashId.R5, Reiser4FibrationId.Extension1); + directory.Entries.Add(new Reiser4DirEntry(0, 0, 0, [(byte)'.'], directory.StatKey)); + directory.Entries.Add(new Reiser4DirEntry(o, i, f, ".."u8.ToArray(), parent.StatKey)); + return directory; + } + + /// Creates a new object named in . + private Reiser4PlanObject Link(Reiser4PlanObject parent, byte[] name, byte[] stat, ulong requestedId) { + var hash = (Reiser4HashId)this.Plugin(parent, Reiser4PsetMember.Hash); + var fibration = (Reiser4FibrationId)this.Plugin(parent, Reiser4PsetMember.Fibration); + var (ordering, objectId, offset, hashed) = MakeKey(name, hash, fibration); + if (parent.Entries.Any(e => e.Ordering == ordering && e.ObjectId == objectId && e.Offset == offset)) + throw new NotSupportedException($"Reiser4: the name '{Reiser4Volume.DecodeName(name)}' would share its key with an existing entry."); + ulong id; + if (requestedId > Reiser4Volume.RootObjectId && this._objects.Values.All(o => o.ObjectId != requestedId)) { + id = requestedId; + this.NextObjectId = Math.Max(this.NextObjectId, id + 1); + } else id = this.NextObjectId++; + var statKey = Reiser4Key.Of(parent.ObjectId, Reiser4Key.MinorStatData, ordering, id, 0); + var obj = new Reiser4PlanObject { StatKey = statKey, Stat = stat }; + this._objects.Add(statKey, obj); + parent.Entries.Add(new Reiser4DirEntry(ordering, objectId, offset, name, statKey)); + this._paths = null; + _ = hashed; + return obj; + } + + private static (ulong Ordering, ulong ObjectId, ulong Offset, bool Hashed) MakeKey(byte[] name, Reiser4HashId hash, Reiser4FibrationId fibration) { + if (name.Length > Reiser4NameKeys.MaxInlineLength && !Reiser4NameKeys.CanHash(hash)) + throw new NotSupportedException( + $"Reiser4: names longer than {Reiser4NameKeys.MaxInlineLength} bytes cannot be added under the {hash} hash, which the kernel and reiser4progs compute differently."); + return Reiser4NameKeys.Make(name, hash, fibration); + } + + private (Reiser4PlanObject Parent, byte[] Name) ParentOf(string path) { + var normalized = Normalize(path); + if (Reiser4Writer.RejectName(normalized) is { } reason) throw new NotSupportedException("Reiser4: " + reason + "."); + var slash = normalized.LastIndexOf('/'); + var parent = this.EnsureDirectory(slash < 0 ? "" : normalized[..slash]); + return (parent, Encoding.UTF8.GetBytes(slash < 0 ? normalized : normalized[(slash + 1)..])); + } + + // ── Edits ────────────────────────────────────────────────────────────── + + internal void AddDirectory(string path, Reiser4Reader.FileMetadata? metadata = null) { + var normalized = Normalize(path); + if (normalized.Length == 0) { + if (metadata is not null) this.ApplyMetadata(this.Root, metadata); + return; + } + if (Reiser4Writer.RejectName(normalized) is { } reason) throw new NotSupportedException("Reiser4: " + reason + "."); + var existing = this.Find(normalized); + var directory = this.EnsureDirectory(normalized, metadata); + if (existing is not null && metadata is not null) this.ApplyMetadata(directory, metadata); + } + + /// Adds a regular file, or replaces the body of the one already there (keeping its identity and metadata). + internal void AddFile(string path, FilePayload payload, Reiser4Reader.FileMetadata? metadata = null) { + var (parent, name) = this.ParentOf(path); + var existing = this.Find(path); + Reiser4PlanObject file; + bool compressed; + if (existing is not null) { + if (existing.Kind != Reiser4Stat.Regular) + throw new InvalidDataException($"Reiser4: '{Normalize(path)}' exists and is not a regular file."); + file = existing; + compressed = existing.IsCryptcompress; + if (metadata is not null) this.ApplyMetadata(file, metadata); + } else { + compressed = this.ResolveBody(parent, payload.Size) == Reiser4FileBody.Compressed || + metadata is { RawStatData.Length: >= 44 } carried && Reiser4Stat.Parse(carried.RawStatData, out _) is { } carriedStat && + carriedStat.PluginSet.TryGetValue(Reiser4PsetMember.File, out var carriedFile) && carriedFile == 4; + var pset = compressed && metadata is not { RawStatData.Length: >= 44 } ? new Dictionary { [Reiser4PsetMember.File] = 4 } : null; + file = this.Link(parent, name, this.NewStat(metadata, 0x81A4, 0, 0, null, pset), metadata?.ObjectId ?? 0); + } + this.SetBody(file, parent, payload, compressed); + } + + private Reiser4FileBody ResolveBody(Reiser4PlanObject parent, long size) { + var body = this.FileBody; + if (body == Reiser4FileBody.Profile) { + if (this.Plugin(parent, Reiser4PsetMember.Create) == 4) return Reiser4FileBody.Compressed; + body = this.Plugin(parent, Reiser4PsetMember.Formatting) switch { 0 => Reiser4FileBody.Extents, 1 => Reiser4FileBody.Tails, _ => Reiser4FileBody.Smart }; + } + if (body == Reiser4FileBody.Smart) body = size > 4 * Reiser4Volume.BlockSize ? Reiser4FileBody.Extents : Reiser4FileBody.Tails; + return body; + } + + private void SetBody(Reiser4PlanObject file, Reiser4PlanObject parent, FilePayload payload, bool compressed) { + file.Items = []; + file.Extents = []; + var size = (ulong)payload.Size; + file.SetSize(size); + var key = file.StatKey; + Reiser4Key BodyKey(ulong offset) => Reiser4Key.Of(key.Locality, Reiser4Key.MinorBody, key.Ordering, key.ObjectId, offset); + if (compressed) { + var clusterId = this.Plugin(file, Reiser4PsetMember.Cluster); + if (clusterId > 4) throw new NotSupportedException($"Reiser4: cluster plugin {clusterId} is not supported."); + var shift = 16 - clusterId; + var clusterSize = 1 << shift; + var compression = (Reiser4CompressionId)this.Plugin(file, Reiser4PsetMember.Compression); + var mode = (Reiser4CompressionModeId)this.Plugin(file, Reiser4PsetMember.CompressionMode); + using var source = payload.Open(); + var buffer = new byte[clusterSize]; + ulong clusters = 0; + for (ulong start = 0; start < size; start += (ulong)clusterSize) { + var length = (int)Math.Min((ulong)clusterSize, size - start); + source.ReadExactly(buffer, 0, length); + var disk = Reiser4Clusters.Encode(buffer.AsSpan(0, length), compression, mode); + for (var at = 0; at < disk.Length;) { + var take = Math.Min(this.MaxItemBody - 1, disk.Length - at); + var item = new byte[take + 1]; + item[0] = (byte)shift; + disk.AsSpan(at, take).CopyTo(item.AsSpan(1)); + file.Items.Add((BodyKey(start + (ulong)at), Reiser4ItemPlugin.CompressedTail, item)); + at += take; + } + ++clusters; + } + file.SetBytes(clusters * (ulong)clusterSize); + return; + } + var body = this.ResolveBody(parent, payload.Size); + if (body == Reiser4FileBody.Tails) { + using var source = payload.Open(); + for (ulong at = 0; at < size;) { + var take = (int)Math.Min((ulong)this.MaxItemBody, size - at); + var chunk = new byte[take]; + source.ReadExactly(chunk); + file.Items.Add((BodyKey(at), Reiser4ItemPlugin.Tail, chunk)); + at += (ulong)take; + } + file.SetBytes(size); + return; + } + var blocks = (size + Reiser4Volume.BlockSize - 1) / Reiser4Volume.BlockSize; + if (blocks > 0) file.Extents.Add(new Reiser4PlanUnit(blocks, payload)); + file.SetBytes(blocks * Reiser4Volume.BlockSize); + } + + /// Adds a symbolic link holding . + internal void AddSymlink(string path, string target, Reiser4Reader.FileMetadata? metadata = null) { + var bytes = Encoding.UTF8.GetBytes(target); + if (bytes.Length is 0 or > 4095 || Array.IndexOf(bytes, (byte)0) >= 0) + throw new NotSupportedException("Reiser4: a symlink target must be 1..4095 bytes without NUL."); + if (this.Find(path) is not null) throw new InvalidDataException($"Reiser4: '{Normalize(path)}' already exists."); + var (parent, name) = this.ParentOf(path); + this.Link(parent, name, this.NewStat(metadata, 0xA1FF, (ulong)bytes.Length, 0, bytes, null), metadata?.ObjectId ?? 0); + } + + /// Adds a device node, FIFO or socket. is the kernel's (major << 20 | minor). + internal void AddSpecial(string path, ushort mode, ulong device, Reiser4Reader.FileMetadata? metadata = null) { + var kind = mode & Reiser4Stat.FileType; + if (kind is not (Reiser4Stat.CharDevice or Reiser4Stat.BlockDevice or Reiser4Stat.Fifo or Reiser4Stat.Socket)) + throw new NotSupportedException("Reiser4: special files are character or block devices, FIFOs or sockets."); + if (kind is Reiser4Stat.Fifo or Reiser4Stat.Socket && device != 0) + throw new NotSupportedException("Reiser4: a FIFO or socket has no device number."); + if (this.Find(path) is not null) throw new InvalidDataException($"Reiser4: '{Normalize(path)}' already exists."); + var (parent, name) = this.ParentOf(path); + this.Link(parent, name, this.NewStat(metadata, mode, 0, device, null, null), metadata?.ObjectId ?? 0); + } + + /// Adds a second name for an existing non-directory object. + internal void AddHardLink(string path, string existingPath) { + var target = this.Find(existingPath) ?? throw new FileNotFoundException("Reiser4: the link target was not found.", existingPath); + if (target.IsDirectory) throw new NotSupportedException("Reiser4: directories cannot be hard-linked."); + if (this.Find(path) is not null) throw new InvalidDataException($"Reiser4: '{Normalize(path)}' already exists."); + var (parent, name) = this.ParentOf(path); + var hash = (Reiser4HashId)this.Plugin(parent, Reiser4PsetMember.Hash); + var fibration = (Reiser4FibrationId)this.Plugin(parent, Reiser4PsetMember.Fibration); + var (ordering, objectId, offset, _) = MakeKey(name, hash, fibration); + if (parent.Entries.Any(e => e.Ordering == ordering && e.ObjectId == objectId && e.Offset == offset)) + throw new NotSupportedException($"Reiser4: the name '{Reiser4Volume.DecodeName(name)}' would share its key with an existing entry."); + parent.Entries.Add(new Reiser4DirEntry(ordering, objectId, offset, name, target.StatKey)); + this._paths = null; + } + + /// Removes a name; a directory goes with everything beneath it, an object with its last name. + internal bool Remove(string path) { + var normalized = Normalize(path); + if (normalized.Length == 0 || !this.Paths.TryGetValue(normalized, out var hit)) return false; + hit.Parent.Entries.Remove(hit.Entry); + this._paths = null; + this.CollectUnreachable(); + return true; + } + + private void CollectUnreachable() { + var reached = new HashSet { this.Root.StatKey }; + var stack = new Stack([this.Root]); + while (stack.Count > 0) + foreach (var entry in stack.Pop().Entries) { + if (entry.IsDot || entry.IsDotDot || !reached.Add(entry.Target)) continue; + if (this._objects.TryGetValue(entry.Target, out var target) && target.IsDirectory) stack.Push(target); + } + foreach (var key in this._objects.Keys.Where(k => !reached.Contains(k)).ToList()) this._objects.Remove(key); + } + + /// Sets mode permission bits, owner and the three timestamps of an object. + internal void ApplyMetadata(Reiser4PlanObject obj, Reiser4Reader.FileMetadata metadata) { + var stat = obj.Stat; + var kind = obj.Mode & Reiser4Stat.FileType; + BinaryPrimitives.WriteUInt16LittleEndian(stat.AsSpan(2), (ushort)(kind | (metadata.Mode & 0x0FFF))); + BinaryPrimitives.WriteUInt32LittleEndian(stat.AsSpan(16), metadata.UserId); + BinaryPrimitives.WriteUInt32LittleEndian(stat.AsSpan(20), metadata.GroupId); + BinaryPrimitives.WriteUInt32LittleEndian(stat.AsSpan(24), metadata.AccessedTime); + BinaryPrimitives.WriteUInt32LittleEndian(stat.AsSpan(28), metadata.ModifiedTime); + BinaryPrimitives.WriteUInt32LittleEndian(stat.AsSpan(32), metadata.ChangedTime); + } + + /// + /// A stat data for a new object: the light-weight and Unix extensions, plus a symlink target or a + /// plugin set where the object needs one. A caller's raw stat data is carried instead when it + /// parses, with the fields this writer owns patched in. + /// + private byte[] NewStat(Reiser4Reader.FileMetadata? metadata, ushort mode, ulong size, ulong bytesOrDevice, + byte[]? symlink, Dictionary? pluginSet) { + var now = (uint)DateTimeOffset.UtcNow.ToUnixTimeSeconds(); + byte[] stat; + if (metadata is { RawStatData.Length: >= 44 } carried && symlink is null && pluginSet is null) { + if (Reiser4Stat.Parse(carried.RawStatData, out var problem) is null) throw new NotSupportedException($"Reiser4: {problem}."); + stat = carried.RawStatData.ToArray(); + } else { + var mask = (ushort)(0x3 | (symlink is null ? 0 : 0x8) | (pluginSet is null ? 0 : 0x10)); + var length = 44 + (symlink is null ? 0 : symlink.Length + 1) + (pluginSet is null ? 0 : 2 + 4 * pluginSet.Count); + stat = new byte[length]; + BinaryPrimitives.WriteUInt16LittleEndian(stat, mask); + var at = 44; + if (symlink is not null) { symlink.CopyTo(stat.AsSpan(at)); at += symlink.Length + 1; } + if (pluginSet is not null) { + BinaryPrimitives.WriteUInt16LittleEndian(stat.AsSpan(at), (ushort)pluginSet.Count); + var slot = at + 2; + foreach (var (member, id) in pluginSet.OrderBy(static p => p.Key)) { + BinaryPrimitives.WriteUInt16LittleEndian(stat.AsSpan(slot), member); + BinaryPrimitives.WriteUInt16LittleEndian(stat.AsSpan(slot + 2), id); + slot += 4; + } + } + } + var kind = mode & Reiser4Stat.FileType; + BinaryPrimitives.WriteUInt16LittleEndian(stat.AsSpan(2), (ushort)(kind | ((metadata?.Mode ?? mode) & 0x0FFF))); + BinaryPrimitives.WriteUInt32LittleEndian(stat.AsSpan(4), 1); + BinaryPrimitives.WriteUInt64LittleEndian(stat.AsSpan(8), size); + BinaryPrimitives.WriteUInt32LittleEndian(stat.AsSpan(16), metadata?.UserId ?? 0); + BinaryPrimitives.WriteUInt32LittleEndian(stat.AsSpan(20), metadata?.GroupId ?? 0); + BinaryPrimitives.WriteUInt32LittleEndian(stat.AsSpan(24), metadata?.AccessedTime ?? now); + BinaryPrimitives.WriteUInt32LittleEndian(stat.AsSpan(28), metadata?.ModifiedTime ?? now); + BinaryPrimitives.WriteUInt32LittleEndian(stat.AsSpan(32), metadata?.ChangedTime ?? now); + BinaryPrimitives.WriteUInt64LittleEndian(stat.AsSpan(36), bytesOrDevice); + return stat; + } + + // ── Finishing ────────────────────────────────────────────────────────── + + /// Recomputes what the namespace implies: link counts, directory sizes and directory bytes. + internal void Finish() { + var names = new Dictionary(); + var subdirectories = new Dictionary(); + foreach (var directory in this._objects.Values.Where(static o => o.IsDirectory)) + foreach (var entry in directory.Entries) { + if (entry.IsDot || entry.IsDotDot) continue; + names[entry.Target] = names.GetValueOrDefault(entry.Target) + 1; + if (this._objects.TryGetValue(entry.Target, out var target) && target.IsDirectory) + subdirectories[directory.StatKey] = subdirectories.GetValueOrDefault(directory.StatKey) + 1; + } + foreach (var obj in this._objects.Values) { + if (obj.IsDirectory) { + var isRoot = obj.StatKey == Reiser4Volume.RootStatKey; + obj.SetLinks((isRoot ? 3U : 2U) + subdirectories.GetValueOrDefault(obj.StatKey)); + obj.SetSize((ulong)obj.Entries.Count); + obj.SetBytes(Reiser4Tree.DirectoryBytes(obj.Entries)); + } else { + obj.SetLinks(names.GetValueOrDefault(obj.StatKey)); + } + } + } + + internal Reiser4Tree.Result Write(Stream output) { + this.Finish(); + return Reiser4Tree.Write(this, output); + } +} diff --git a/Hawkynt.FileFormats.FileSystems/FileSystems/FileSystem.Reiser4/Reiser4Reader.cs b/Hawkynt.FileFormats.FileSystems/FileSystems/FileSystem.Reiser4/Reiser4Reader.cs index 7cf8b8105..3bab1a603 100644 --- a/Hawkynt.FileFormats.FileSystems/FileSystems/FileSystem.Reiser4/Reiser4Reader.cs +++ b/Hawkynt.FileFormats.FileSystems/FileSystems/FileSystem.Reiser4/Reiser4Reader.cs @@ -6,32 +6,22 @@ namespace FileSystem.Reiser4; /// -/// Reads a Reiser4 image: the master superblock's label, UUID and block size, -/// plus regular files represented by the native stat40/cde40/extent40 items -/// emitted by . The older workbench payload directory -/// remains a compatibility fallback for images written before native tree items -/// became authoritative. +/// Reads a Reiser4 image: the master superblock's label, UUID and block size, and every object of +/// the node40/node41 tree after the journal is replayed — directories, regular files whose bodies +/// are extents, tails or compressed clusters (holes included), symbolic links, device nodes, FIFOs, +/// sockets and hard links. The older workbench payload directory remains a compatibility fallback +/// for images written before native tree items became authoritative. /// public sealed class Reiser4Reader : IDisposable { /// Byte offset of the master superblock: block 16 at a 4 KB block size. public const long MasterOffset = 65536; - private const int ItemHeaderBytes = 38; - private const int DirectoryUnitHeaderBytes = 26; - private const int TargetKeyBytes = 24; - private const ushort PluginStat40 = 0; - private const ushort PluginCde40 = 2; - private const ushort PluginExtent40 = 5; - private const byte MinorStatData = 1; - private const byte MinorFileBody = 4; - private const ulong HashedNameBit = 0x0100000000000000; - private static readonly byte[] MasterMagic = "ReIsEr4"u8.ToArray(); private readonly ImageAccessor _image; + private readonly Reiser4Volume? _volume; private readonly List _entries = []; - private readonly HashSet _nativeNames = new(StringComparer.Ordinal); /// True when the image carries a valid Reiser4 master superblock. public bool Valid { get; } @@ -45,56 +35,48 @@ public sealed class Reiser4Reader : IDisposable { /// Volume UUID from the master superblock, as hex. public string UuidHex { get; } = ""; - /// Files and directories found in the native tree, or files in the legacy payload directory. + /// Files, directories, links and special files found in the native tree, or files in the legacy payload directory. public IReadOnlyList Entries => this._entries; /// Total size of the backing image in bytes. public long Length => this._image.Length; - /// - /// Initializes a new instance of . - /// - public Reiser4Reader(Stream stream, bool leaveOpen = true) { - ArgumentNullException.ThrowIfNull(stream); - if (stream.CanSeek) stream.Position = 0; - this._image = new ImageAccessor(stream, leaveOpen); - if (this._image.Length < MasterOffset + Reiser4Writer.BlockSize) return; - - var master = this._image.Read(MasterOffset, Reiser4Writer.BlockSize); - if (!master.AsSpan(0, MasterMagic.Length).SequenceEqual(MasterMagic)) return; - this.Valid = true; - - var blockSize = BinaryPrimitives.ReadUInt16LittleEndian(master.AsSpan(18, 2)); - if (blockSize is >= 512 and <= 8192) this.BlockSize = blockSize; - this.UuidHex = Convert.ToHexString(master.AsSpan(20, 16)); - this.Label = ReadCString(master.AsSpan(36, 16)); - - // Native metadata is authoritative. The private payload directory is kept - // only so old workbench images remain readable while they are migrated. - if (this.TryReadNativeTree()) { this.NativeTreeValid = true; return; } - this._entries.Clear(); - this._nativeNames.Clear(); - this.RootMetadata = null; + /// True when the complete native namespace was decoded. + public bool NativeTreeValid { get; } - if (!master.AsSpan(Reiser4Writer.MasterPayloadMarkerOff, Reiser4Writer.PayloadMarker.Length) - .SequenceEqual(Reiser4Writer.PayloadMarker)) - return; + /// Why the native tree was not decoded, when it was not. + public string? NativeProblem { get; } - var dirBlock = BinaryPrimitives.ReadUInt64LittleEndian( - master.AsSpan(Reiser4Writer.MasterPayloadDirOff, 8)); - this.ReadLegacyDirectory(dirBlock); - } - - /// True when the complete supported native namespace was decoded. - public bool NativeTreeValid { get; private set; } + /// Journal transactions replayed before the tree was read (0 when the journal was clean). + public int ReplayedTransactions { get; } /// Root stat-data, including inherited plugin settings. - public FileMetadata? RootMetadata { get; private set; } + public FileMetadata? RootMetadata { get; } + + internal IReadOnlyList NativeNodeBlocks { get; } = []; - internal IReadOnlyList NativeNodeBlocks { get; private set; } = []; + internal Reiser4Volume? Volume => this.NativeTreeValid ? this._volume : null; internal readonly record struct NativeRun(ulong Start, ulong Width); + /// What kind of object an entry names. + public enum EntryKind { + /// A regular file. + File, + /// A directory. + Directory, + /// A symbolic link; holds its target. + Symlink, + /// A character device; holds its number. + CharacterDevice, + /// A block device; holds its number. + BlockDevice, + /// A named pipe. + Fifo, + /// A socket. + Socket, + } + /// Stat-data fields which can be represented by the current writer. public sealed record FileMetadata( long Size, ushort Mode, uint LinkCount, uint UserId, uint GroupId, @@ -104,6 +86,8 @@ public sealed record FileMetadata( public ulong ObjectId { get; init; } /// Locality of the object stat key. public ulong StatLocality { get; init; } + /// Ordering word of the object stat key (the kernel derives it from the object's first name). + public ulong StatOrdering { get; init; } /// Last-write timestamp, when the seconds value is representable. public DateTime? LastModified => ModifiedTime == 0 @@ -114,12 +98,120 @@ public sealed record FileMetadata( /// One filesystem object and its physical extents. public sealed record Entry(string Name, ulong FirstBlock, long Size) { internal IReadOnlyList? NativeRuns { get; init; } + internal Reiser4Object? Native { get; init; } /// True when this entry is a directory. public bool IsDirectory { get; init; } + /// What kind of object this entry names. + public EntryKind Kind { get; init; } + /// The target of a symbolic link. + public string? LinkTarget { get; init; } + /// The device number of a device node, as the kernel encodes it (major << 20 | minor). + public ulong Device { get; init; } + /// The path this entry is a further name of, when the object has more than one name. + public string? HardLinkOf { get; init; } + /// How the body of a regular file is stored: "extent", "tail", "ctail" or "" for none. + public string Body { get; init; } = ""; /// On-disk stat-data fields retained for metadata-preserving rebuilds. public FileMetadata? Metadata { get; init; } } + /// Initializes a new instance of . + public Reiser4Reader(Stream stream, bool leaveOpen = true) { + ArgumentNullException.ThrowIfNull(stream); + if (stream.CanSeek) stream.Position = 0; + this._image = new ImageAccessor(stream, leaveOpen: true); + this._leaveOpen = leaveOpen; + this._stream = stream; + if (this._image.Length < MasterOffset + Reiser4Writer.BlockSize) return; + + var master = this._image.Read(MasterOffset, Reiser4Writer.BlockSize); + if (!master.AsSpan(0, MasterMagic.Length).SequenceEqual(MasterMagic)) return; + this.Valid = true; + + var blockSize = BinaryPrimitives.ReadUInt16LittleEndian(master.AsSpan(18, 2)); + if (blockSize is >= 512 and <= 8192) this.BlockSize = blockSize; + this.UuidHex = Convert.ToHexString(master.AsSpan(20, 16)); + this.Label = ReadCString(master.AsSpan(36, 16)); + + // Native metadata is authoritative. The private payload directory is kept + // only so old workbench images remain readable while they are migrated. + this._volume = new Reiser4Volume(stream, leaveOpen: true); + if (this._volume.TreeValid) { + this.NativeTreeValid = true; + this.ReplayedTransactions = this._volume.ReplayedTransactions; + this.NativeNodeBlocks = [.. this._volume.NodeBlocks]; + this.RootMetadata = ToMetadata(this._volume.Root!); + this.BuildEntries(this._volume); + return; + } + this.NativeProblem = this._volume.Problem; + + if (!master.AsSpan(Reiser4Writer.MasterPayloadMarkerOff, Reiser4Writer.PayloadMarker.Length) + .SequenceEqual(Reiser4Writer.PayloadMarker)) + return; + + var dirBlock = BinaryPrimitives.ReadUInt64LittleEndian( + master.AsSpan(Reiser4Writer.MasterPayloadDirOff, 8)); + this.ReadLegacyDirectory(dirBlock); + } + + private readonly bool _leaveOpen; + private readonly Stream _stream; + + private void BuildEntries(Reiser4Volume volume) { + var firstName = new Dictionary(); + foreach (var (path, _, obj, _) in volume.Paths) { + var metadata = ToMetadata(obj); + var stat = obj.Stat; + string? linkOf = null; + if (!obj.IsDirectory) { + if (firstName.TryGetValue(obj.StatKey, out var first)) linkOf = first; + else firstName[obj.StatKey] = path; + } + var kind = stat.Kind switch { + Reiser4Stat.Directory => EntryKind.Directory, + Reiser4Stat.Symlink => EntryKind.Symlink, + Reiser4Stat.CharDevice => EntryKind.CharacterDevice, + Reiser4Stat.BlockDevice => EntryKind.BlockDevice, + Reiser4Stat.Fifo => EntryKind.Fifo, + Reiser4Stat.Socket => EntryKind.Socket, + _ => EntryKind.File, + }; + if (kind == EntryKind.Directory) { + this._entries.Add(new Entry(path, 0, 0) { IsDirectory = true, Kind = kind, Metadata = metadata, Native = obj }); + continue; + } + if (kind != EntryKind.File) { + this._entries.Add(new Entry(path, 0, 0) { + Kind = kind, Metadata = metadata, Native = obj, HardLinkOf = linkOf, + LinkTarget = stat.SymlinkTarget is { } target ? Reiser4Volume.DecodeName(target) : null, + Device = kind is EntryKind.CharacterDevice or EntryKind.BlockDevice ? stat.BytesOrDevice : 0, + }); + continue; + } + var body = obj.Body.Count == 0 ? "" : obj.Body[0].Plugin switch { + Reiser4ItemPlugin.Extent => "extent", + Reiser4ItemPlugin.Tail => "tail", + _ => "ctail", + }; + var runs = body == "extent" + ? volume.ExtentUnits(obj).Where(static u => u.Start != 0).Select(static u => new NativeRun(u.Start, u.Width)).ToArray() + : []; + this._entries.Add(new Entry(path, runs.Length == 0 ? 0 : runs[0].Start, (long)stat.Size) { + Kind = kind, Metadata = metadata, Native = obj, HardLinkOf = linkOf, Body = body, + NativeRuns = runs, + }); + } + } + + private static FileMetadata ToMetadata(Reiser4Object obj) { + var stat = obj.Stat; + return new FileMetadata(checked((long)stat.Size), stat.Mode, stat.Links, stat.UserId, stat.GroupId, + stat.ModifyTime, stat.AccessTime, stat.ChangeTime, stat.Raw.ToArray()) { + ObjectId = obj.ObjectId, StatLocality = obj.StatKey.Locality, StatOrdering = obj.StatKey.Ordering, + }; + } + /// Reads a file's contents. Only valid below the array limit. public byte[] Extract(Entry entry) { ArgumentNullException.ThrowIfNull(entry); @@ -135,11 +227,11 @@ public byte[] Extract(Entry entry) { public long ExtractTo(Entry entry, Stream destination) { ArgumentNullException.ThrowIfNull(entry); ArgumentNullException.ThrowIfNull(destination); - if (entry.IsDirectory) return 0; + if (entry.IsDirectory || entry.Kind != EntryKind.File) return 0; if (entry.Size <= 0) return 0; - if (entry.NativeRuns is { } runs) - return this.ExtractNative(runs, entry.Size, destination); + if (entry.Native is { } native && this._volume is { } volume) + return volume.ExtractTo(native, destination); var blocksPerBitmap = Reiser4Writer.BlocksPerBitmap; var block = entry.FirstBlock; @@ -158,38 +250,13 @@ public long ExtractTo(Entry entry, Stream destination) { return written; } - private long ExtractNative(IReadOnlyList runs, long size, Stream destination) { - long written = 0; - foreach (var run in runs) { - if (written >= size || run.Width == 0) break; - var offset = checked((long)run.Start * this.BlockSize); - if (offset < 0 || offset >= this._image.Length) break; - var runBytes = checked((long)Math.Min(run.Width, (ulong)(long.MaxValue / this.BlockSize)) * this.BlockSize); - var take = Math.Min(Math.Min(runBytes, size - written), this._image.Length - offset); - if (take <= 0) break; - this._image.CopyTo(offset, destination, take); - written += take; - } - return written; - } - - /// Where an entry's bytes live as physical byte runs. + /// Where an entry's bytes live as physical byte runs (extent data only; tails and clusters live in tree nodes). public IEnumerable<(long Offset, long Length)> EnumerateRuns(Entry entry) { ArgumentNullException.ThrowIfNull(entry); if (entry.Size <= 0) yield break; - if (entry.NativeRuns is { } nativeRuns) { - long remaining = entry.Size; - foreach (var run in nativeRuns) { - if (remaining <= 0 || run.Width == 0) yield break; - var offset = checked((long)run.Start * this.BlockSize); - if (offset < 0 || offset >= this._image.Length) yield break; - var capacity = checked((long)Math.Min(run.Width, (ulong)(long.MaxValue / this.BlockSize)) * this.BlockSize); - var length = Math.Min(Math.Min(capacity, remaining), this._image.Length - offset); - if (length <= 0) yield break; - yield return (offset, length); - remaining -= length; - } + if (entry.Native is { } native && this._volume is { } volume) { + foreach (var run in volume.DataRuns(native)) yield return run; yield break; } @@ -215,247 +282,6 @@ private long ExtractNative(IReadOnlyList runs, long size, Stream dest } } - /// - /// Walks formatted node40 internal pointers from the format40 root, collects - /// standard leaf1 items, then resolves cde40 names against stat40 keys. Unknown - /// node and item plugins fail closed so the legacy compatibility path remains - /// available for images carrying it. - /// - private bool TryReadNativeTree() { - if (this.BlockSize != Reiser4Writer.BlockSize) return false; - var format = this._image.Read((long)17 * this.BlockSize, this.BlockSize); - if (format.Length != this.BlockSize || !format.AsSpan(52, Reiser4MasterSb.Format40Magic.Length) - .SequenceEqual(Reiser4MasterSb.Format40Magic)) return false; - var root = BinaryPrimitives.ReadUInt64LittleEndian(format.AsSpan(16, 8)); - if (root == 0) return false; - - var leafBlocks = new List<(ulong Block, byte[] Data)>(); - var nodeBlocks = new HashSet(); - if (!this.WalkNativeNodes(root, nodeBlocks, leafBlocks, 0) || leafBlocks.Count == 0) - return false; - - var statData = new Dictionary<(ulong Locality, ulong ObjectId), FileMetadata>(); - var extents = new Dictionary<(ulong Locality, ulong ObjectId), List<(ulong Offset, List Runs)>>(); - var directories = new Dictionary>(); - foreach (var (_, leaf) in leafBlocks) { - if (!TryReadLeafItems(leaf, out var leafItems, out var bodiesEnd)) return false; - var byBody = leafItems.OrderBy(static item => item.BodyOffset).ToArray(); - for (var i = 0; i < byBody.Length; ++i) { - var item = byBody[i]; - var end = i + 1 < byBody.Length ? byBody[i + 1].BodyOffset : bodiesEnd; - if (end < item.BodyOffset) return false; - var body = leaf.AsSpan(item.BodyOffset, end - item.BodyOffset); - var objectKey = (item.Locality, item.ObjectId); - switch (item.Plugin) { - case PluginStat40 when item.Minor == MinorStatData && item.Ordering == 0 && item.KeyOffset == 0: - if (body.Length < 44 || (BinaryPrimitives.ReadUInt16LittleEndian(body) & 3) != 3) return false; - var size = BinaryPrimitives.ReadUInt64LittleEndian(body.Slice(8, 8)); - if (size > long.MaxValue) return false; - if (statData.ContainsKey(objectKey)) return false; - statData[objectKey] = new FileMetadata((long)size, - BinaryPrimitives.ReadUInt16LittleEndian(body.Slice(2, 2)), - BinaryPrimitives.ReadUInt32LittleEndian(body.Slice(4, 4)), - BinaryPrimitives.ReadUInt32LittleEndian(body.Slice(16, 4)), - BinaryPrimitives.ReadUInt32LittleEndian(body.Slice(20, 4)), - BinaryPrimitives.ReadUInt32LittleEndian(body.Slice(24, 4)), - BinaryPrimitives.ReadUInt32LittleEndian(body.Slice(28, 4)), - BinaryPrimitives.ReadUInt32LittleEndian(body.Slice(32, 4)), body.ToArray()) { - ObjectId = item.ObjectId, StatLocality = item.Locality, - }; - break; - case PluginExtent40 when item.Minor == MinorFileBody && item.Ordering == 0: - if ((body.Length & 15) != 0) return false; - var runs = new List(body.Length / 16); - for (var p = 0; p < body.Length; p += 16) { - var start = BinaryPrimitives.ReadUInt64LittleEndian(body.Slice(p, 8)); - var width = BinaryPrimitives.ReadUInt64LittleEndian(body.Slice(p + 8, 8)); - if (width != 0) runs.Add(new NativeRun(start, width)); - } - if (!extents.TryGetValue(objectKey, out var pieces)) extents[objectKey] = pieces = []; - pieces.Add((item.KeyOffset, runs)); - break; - case PluginCde40 when item.Minor == 0: - if (!directories.TryGetValue(item.Locality, out var items)) directories[item.Locality] = items = []; - items.Add(body.ToArray()); - break; - case PluginNodePointer when leaf[26] == 2: - if (body.Length != 8) return false; - break; - default: return false; - } - } - } - - foreach (var parts in extents.Values) { - ulong logical = 0; - foreach (var part in parts.OrderBy(static p => p.Offset)) { - if (part.Offset != logical) return false; - foreach (var run in part.Runs) { - if (run.Start < 25 || nodeBlocks.Any(node => node >= run.Start && node - run.Start < run.Width) || run.Start >= (ulong)(this.Length / this.BlockSize) || - run.Width > (ulong)(this.Length / this.BlockSize) - run.Start || - run.Width > (ulong)long.MaxValue / (ulong)this.BlockSize - logical / (ulong)this.BlockSize) return false; - logical += run.Width * (ulong)this.BlockSize; - } - } - } - var joinedExtents = extents.ToDictionary(static pair => pair.Key, - static pair => (IReadOnlyList)pair.Value.OrderBy(static part => part.Offset) - .SelectMany(static part => part.Runs).ToArray()); - var visited = new HashSet(); - if (!WalkNativeDirectory(0x2a, "", statData, joinedExtents, directories, visited)) - return false; - if (!statData.TryGetValue((0x29, 0x2a), out var rootMetadata) || (rootMetadata.Mode & 0xF000) != 0x4000) - return false; - if (statData.Count != this._entries.Count + 1 || directories.Keys.Any(key => !visited.Contains(key)) || - extents.Keys.Any(key => !statData.TryGetValue(key, out var metadata) || (metadata.Mode & 0xF000) != 0x8000)) - return false; - this.RootMetadata = rootMetadata; - this.NativeNodeBlocks = nodeBlocks.ToArray(); - return true; - } - - private const ushort PluginNodePointer = 3; - - private readonly record struct NativeItem( - ulong Locality, byte Minor, ulong Ordering, ulong ObjectId, ulong KeyOffset, ushort Plugin, ushort BodyOffset); - - private bool WalkNativeNodes(ulong block, HashSet visited, - List<(ulong Block, byte[] Data)> leaves, int depth, int expectedLevel = 0) { - if (depth > 16 || block >= (ulong)(this._image.Length / this.BlockSize) || !visited.Add(block)) return false; - var node = this._image.Read(checked((long)block * this.BlockSize), this.BlockSize); - if (node.Length != this.BlockSize || BinaryPrimitives.ReadUInt16LittleEndian(node) != 0 - || BinaryPrimitives.ReadUInt32LittleEndian(node.AsSpan(8, 4)) != unchecked((uint)Reiser4Tree.NodeMagic)) - return false; - var level = node[26]; - if (expectedLevel != 0 && level != expectedLevel) return false; - var count = BinaryPrimitives.ReadUInt16LittleEndian(node.AsSpan(2, 2)); - if (count > (this.BlockSize - Reiser4Tree.NodeHeaderBytes) / ItemHeaderBytes) return false; - if (level == 1) { - leaves.Add((block, node)); - return true; - } - if (level < 2 || count == 0) return false; - - if (!TryReadLeafItems(node, out var items, out var bodiesEnd)) return false; - if (level == 2) leaves.Add((block, node)); - var children = new List(count); - var byBody = items.OrderBy(static item => item.BodyOffset).ToArray(); - for (var i = 0; i < byBody.Length; ++i) { - var item = byBody[i]; - var end = i + 1 < byBody.Length ? byBody[i + 1].BodyOffset : bodiesEnd; - if (item.Plugin == PluginExtent40 && level == 2) continue; - if (item.Plugin != PluginNodePointer || end - item.BodyOffset != sizeof(ulong)) return false; - children.Add(BinaryPrimitives.ReadUInt64LittleEndian(node.AsSpan(item.BodyOffset, sizeof(ulong)))); - } - foreach (var child in children) - if (!this.WalkNativeNodes(child, visited, leaves, depth + 1, level - 1)) return false; - return true; - } - - private bool TryReadLeafItems(byte[] leaf, out List items, out int bodiesEnd) { - items = []; - var count = BinaryPrimitives.ReadUInt16LittleEndian(leaf.AsSpan(2, 2)); - bodiesEnd = BinaryPrimitives.ReadUInt16LittleEndian(leaf.AsSpan(6, 2)); - if (count == 0 || count > (this.BlockSize - Reiser4Tree.NodeHeaderBytes) / ItemHeaderBytes - || bodiesEnd < Reiser4Tree.NodeHeaderBytes || bodiesEnd > this.BlockSize - count * ItemHeaderBytes) - return false; - for (var i = 0; i < count; ++i) { - var header = this.BlockSize - (i + 1) * ItemHeaderBytes; - var key0 = BinaryPrimitives.ReadUInt64LittleEndian(leaf.AsSpan(header, 8)); - var bodyOffset = BinaryPrimitives.ReadUInt16LittleEndian(leaf.AsSpan(header + 32, 2)); - var plugin = BinaryPrimitives.ReadUInt16LittleEndian(leaf.AsSpan(header + 36, 2)); - if (bodyOffset < Reiser4Tree.NodeHeaderBytes || bodyOffset > bodiesEnd) return false; - items.Add(new NativeItem(key0 >> 4, (byte)(key0 & 0xf), - BinaryPrimitives.ReadUInt64LittleEndian(leaf.AsSpan(header + 8, 8)), - BinaryPrimitives.ReadUInt64LittleEndian(leaf.AsSpan(header + 16, 8)), - BinaryPrimitives.ReadUInt64LittleEndian(leaf.AsSpan(header + 24, 8)), plugin, bodyOffset)); - } - return true; - } - - private bool WalkNativeDirectory(ulong directoryId, string path, - IReadOnlyDictionary<(ulong Locality, ulong ObjectId), FileMetadata> statData, - IReadOnlyDictionary<(ulong Locality, ulong ObjectId), IReadOnlyList> extents, - IReadOnlyDictionary> directories, HashSet visited) { - if (path.Count(static c => c == '/') > 128 || !visited.Add(directoryId)) return false; - if (!directories.TryGetValue(directoryId, out var directoryItems)) return false; - - foreach (var directory in directoryItems) { - if (directory.Length < 2) return false; - var count = BinaryPrimitives.ReadUInt16LittleEndian(directory); - var unitsStart = 2 + count * DirectoryUnitHeaderBytes; - if (unitsStart > directory.Length) return false; - - for (var i = 0; i < count; ++i) { - var header = 2 + i * DirectoryUnitHeaderBytes; - var ordering = BinaryPrimitives.ReadUInt64LittleEndian(directory.AsSpan(header, 8)); - var objectIdPart = BinaryPrimitives.ReadUInt64LittleEndian(directory.AsSpan(header + 8, 8)); - var offsetPart = BinaryPrimitives.ReadUInt64LittleEndian(directory.AsSpan(header + 16, 8)); - var unit = BinaryPrimitives.ReadUInt16LittleEndian(directory.AsSpan(header + 24, 2)); - var unitEnd = i + 1 < count - ? BinaryPrimitives.ReadUInt16LittleEndian(directory.AsSpan(header + DirectoryUnitHeaderBytes + 24, 2)) - : directory.Length; - if (unit < unitsStart || unitEnd < unit || unitEnd > directory.Length || unit + TargetKeyBytes > unitEnd) - return false; - - var name = DecodeName(directory.AsSpan(unit, unitEnd - unit), ordering, objectIdPart, offsetPart); - if (name.Length == 0 || name is "." or "..") continue; - if (name.Contains('/') || name.Contains('\\') || name.Contains('\0') || name.Contains(':') || name.Any(static c => c > 127)) return false; - var targetLocality = BinaryPrimitives.ReadUInt64LittleEndian(directory.AsSpan(unit, 8)) >> 4; - var targetObjectId = BinaryPrimitives.ReadUInt64LittleEndian(directory.AsSpan(unit + 16, 8)); - if (!statData.TryGetValue((targetLocality, targetObjectId), out var metadata)) return false; - - var fullName = string.IsNullOrEmpty(path) ? name : $"{path}/{name}"; - if (!this._nativeNames.Add(fullName)) return false; - var modeType = metadata.Mode & 0xF000; - if (modeType == 0x4000) { - this._entries.Add(new Entry(fullName, 0, 0) { IsDirectory = true, Metadata = metadata }); - if (!this.WalkNativeDirectory(targetObjectId, fullName, statData, extents, directories, visited)) - return false; - continue; - } - - if (modeType != 0x8000) return false; - extents.TryGetValue((targetLocality, targetObjectId), out var runs); - runs ??= Array.Empty(); - if (runs.Aggregate(0UL, static (sum, run) => sum + run.Width) * (ulong)this.BlockSize < (ulong)metadata.Size) return false; - this._entries.Add(new Entry(fullName, runs.Count == 0 ? 0 : runs[0].Start, metadata.Size) { - NativeRuns = runs, - Metadata = metadata, - }); - } - } - return true; - } - - private static string DecodeName( - ReadOnlySpan unit, ulong ordering, ulong objectId, ulong offset) { - if (ordering == 0 && objectId == 0 && offset == 0) return "."; - if ((ordering & HashedNameBit) != 0) { - var stored = unit[TargetKeyBytes..]; - var nul = stored.IndexOf((byte)0); - if (nul >= 0) stored = stored[..nul]; - return Encoding.Latin1.GetString(stored); - } - - Span name = stackalloc byte[23]; - var length = 0; - length += Unpack(name[length..], ordering & 0x00FF_FFFF_FFFF_FFFFUL, 7); - length += Unpack(name[length..], objectId, 8); - length += Unpack(name[length..], offset, 8); - return Encoding.Latin1.GetString(name[..length]); - } - - private static int Unpack(Span destination, ulong value, int bytes) { - var written = 0; - for (var shift = (bytes - 1) * 8; shift >= 0; shift -= 8) { - var b = (byte)(value >> shift); - if (b == 0) break; - destination[written++] = b; - } - return written; - } - private void ReadLegacyDirectory(ulong firstBlock) { var visited = new HashSet(); var block = firstBlock; @@ -491,5 +317,9 @@ private static string ReadCString(ReadOnlySpan span) { } /// Releases resources held by this instance. - public void Dispose() => this._image.Dispose(); + public void Dispose() { + this._volume?.Dispose(); + this._image.Dispose(); + if (!this._leaveOpen) this._stream.Dispose(); + } } diff --git a/Hawkynt.FileFormats.FileSystems/FileSystems/FileSystem.Reiser4/Reiser4Tree.cs b/Hawkynt.FileFormats.FileSystems/FileSystems/FileSystem.Reiser4/Reiser4Tree.cs index 3c68a540b..a2f5abb10 100644 --- a/Hawkynt.FileFormats.FileSystems/FileSystems/FileSystem.Reiser4/Reiser4Tree.cs +++ b/Hawkynt.FileFormats.FileSystems/FileSystems/FileSystem.Reiser4/Reiser4Tree.cs @@ -1,29 +1,22 @@ #pragma warning disable CS1591 using System.Buffers.Binary; -using System.Text; +using Compression.Core.Checksums; +using Compression.Core.DiskImage; namespace FileSystem.Reiser4; /// -/// Builds a reiser4 node40 tree containing directory stat data and entries, -/// plus stat data and extents for regular files. +/// Lays a out as a volume: data blocks for extents, then a node40 (or +/// node41) tree of stat data, directory entries and tail items in leaves, extents in twigs, and as +/// many internal levels above them as it takes — plus the allocator bitmaps and the counters the +/// format superblock keeps. /// /// -/// A node is a 28-byte header, item bodies growing up from there, and an -/// array of 38-byte item headers growing down from the node's end — each a -/// four-word key, the body's offset, flags, and which plugin reads it. Items sit -/// in key order. -/// -/// A key is four little-endian words: the locality in the top sixty bits of -/// the first with the item's type in its low four, an ordering, an object id, and -/// an offset. A file's stat data and its body share the first three and differ in -/// the type and the offset, so every stat data sorts ahead of every body. -/// -/// A directory entry carries its name in its own key rather than a hash of -/// it, for any name of twenty-three characters or fewer. The bytes pack -/// big-endian into the ordering starting one byte in, then the object id, then the -/// offset; the ordering's top seven bits hold a fibre, which is the last character -/// when the one before it is a dot. A name held that way is stored nowhere else. +/// A node is a 28-byte header (32 for node41, whose last four bytes are a CRC-32C of the +/// rest), item bodies growing up from there, and an array of 38-byte item headers growing down +/// from the node's end — each a four-word key, the body's offset, flags, and the item plugin. +/// Items sit in key order. A leaf never straddles a twig extent: the leaf run is ended before an +/// extent's key and resumed after it. /// internal static class Reiser4Tree { @@ -31,216 +24,196 @@ internal static class Reiser4Tree { internal const int ItemHeaderBytes = 38; internal const int NodeMagic = 0x52344653; - private const int PluginStat40 = 0x0; - private const int PluginCde40 = 0x2; - private const int PluginExtent40 = 0x5; + /// First data block: blocks 0..24 are the jump area, superblocks, journal, status, backup and the first two nodes. + internal const ulong FirstDataBlock = 25; - private const byte MinorFileName = 0; - private const byte MinorStatData = 1; - private const byte MinorFileBody = 4; + internal const ulong BlocksPerBitmap = (ulong)(Reiser4Volume.BlockSize - 4) * 8; - /// Characters of a name the ordering holds, its top byte being the fibre. - private const int OrderingChars = 7; + internal static bool IsBitmapBlock(ulong block) => block == 18 || block != 0 && block % BlocksPerBitmap == 0; - /// And the object id after it. - private const int ObjectIdChars = 8; + private sealed record Item(Reiser4Key Key, ushort Plugin, byte[] Body); - /// Past this many a name no longer fits its key and is hashed into it. - internal const int MaxInlineNameLength = OrderingChars + ObjectIdChars + 8; + /// What a laid-out volume amounts to. + internal sealed record Result(ulong Blocks, ushort Height, ulong ObjectCount, IReadOnlyList NodeBlocks); - /// The bit in the ordering that says the name was hashed, not held. - private const ulong HashedNameBit = 0x0100000000000000; + /// Lays out and writes the whole volume to . + internal static Result Write(Reiser4Plan plan, Stream output) { + ArgumentNullException.ThrowIfNull(plan); + ArgumentNullException.ThrowIfNull(output); + const int blockSize = Reiser4Volume.BlockSize; + var headerBytes = plan.NodePlugin == 1 ? 32 : NodeHeaderBytes; + var capacity = blockSize - headerBytes; + var maxBody = capacity - ItemHeaderBytes; - /// One run of blocks holding part of a file. - internal readonly record struct Run(ulong Start, ulong Width); - - /// A file to put in the tree. - internal sealed record Entry { - internal required string Name { get; init; } - internal required ulong ParentObjectId { get; init; } - internal required ulong ObjectId { get; init; } - internal required long Size { get; init; } - internal required IReadOnlyList Runs { get; init; } - internal Reiser4Reader.FileMetadata? Metadata { get; init; } - } - - private sealed record Item(ulong Locality, byte Minor, ulong Ordering, ulong ObjectId, ulong Offset, - int Plugin, byte[] Body); - - internal sealed record Layout(ulong NextObjectId, ulong ObjectCount, byte Height, IReadOnlyDictionary Nodes); - - private sealed class DirectoryNode { - internal required string Path { get; init; } - internal required string Name { get; init; } - internal required ulong ObjectId { get; init; } - internal required ulong ParentObjectId { get; init; } - internal required ulong StatLocality { get; init; } - internal required ulong ParentStatLocality { get; init; } - internal List<(string Name, ulong ObjectId)> Children { get; } = []; - } - - /// The name packed into a word, big-endian, from . - private static ulong PackName(string name, int from, int skip) { - ulong value = 0; - var taken = 0; - for (var i = from; i < name.Length && taken < 8 - skip; ++i, ++taken) - value = value << 8 | (byte)name[i]; - - return value << (8 - taken - skip) * 8; - } - - /// The fibre a name sorts under: its last character after a one-letter suffix. - private static byte Fibre(string name) - => name.Length > 2 && name[^2] == '.' ? (byte)name[^1] : (byte)0; - - private static void WriteKey(Span at, ulong locality, byte minor, - ulong ordering, ulong objectId, ulong offset) { - BinaryPrimitives.WriteUInt64LittleEndian(at, locality << 4 | minor); - BinaryPrimitives.WriteUInt64LittleEndian(at[8..], ordering); - BinaryPrimitives.WriteUInt64LittleEndian(at[16..], objectId); - BinaryPrimitives.WriteUInt64LittleEndian(at[24..], offset); - } - - /// - /// The r5 hash, which a name too long to be held in its key is reduced to. - /// - private static ulong R5Hash(string name, int from) { - ulong a = 0; - for (var i = from; i < name.Length; ++i) { - var b = (byte)name[i]; - a += (ulong)(b << 4); - a += (ulong)(b >> 4); - a *= 11; + var cursor = FirstDataBlock; + ulong Allocate() { + while (IsBitmapBlock(cursor)) ++cursor; + return cursor++; } - return a; - } - - /// The three words a directory entry's key carries a name in. - /// - /// A name of twenty-three characters or fewer fits whole; past that only its - /// first fifteen are held and the rest becomes a hash, with a bit set in the - /// ordering to say so — and the name itself is then stored beside the entry. - /// - private static (ulong Ordering, ulong ObjectId, ulong Offset, bool Hashed) NameKey(string name) { - if (name == ".") return (0, 0, 0, false); - - var ordering = PackName(name, 0, 1); - var objectId = name.Length > OrderingChars ? PackName(name, OrderingChars, 0) : 0; - - ulong offset; - var hashed = name.Length > MaxInlineNameLength; - if (hashed) { - ordering |= HashedNameBit; - offset = R5Hash(name, OrderingChars + ObjectIdChars); - } else { - offset = name.Length > OrderingChars + ObjectIdChars - ? PackName(name, OrderingChars + ObjectIdChars, 0) - : 0; + // ── Data blocks, in object order ──────────────────────────────────── + var payloads = new DeferredPayloads(); + var items = new List(); + foreach (var obj in plan.Objects) { + items.Add(new Item(obj.StatKey, Reiser4ItemPlugin.StatData, obj.Stat)); + if (obj.IsDirectory) { + items.AddRange(DirectoryItems(obj, maxBody)); + continue; + } + foreach (var (key, plugin, body) in obj.Items) { + if (body.Length > maxBody) throw new InvalidDataException("Reiser4: a body item exceeds node capacity."); + items.Add(new Item(key, plugin, body)); + } + if (obj.Extents.Count == 0) continue; + + var units = new List<(ulong Start, ulong Width)>(); + foreach (var unit in obj.Extents) { + if (unit.Payload is not { } payload) { units.Add((0, unit.Width)); continue; } + // A run of blocks never includes an allocator bitmap; one that would is split around it. + ulong done = 0; + while (done < unit.Width) { + var start = Allocate(); + ulong width = 1; + while (done + width < unit.Width && !IsBitmapBlock(cursor)) { ++cursor; ++width; } + var byteOffset = (long)(done * blockSize); + var byteLength = Math.Min((long)(width * blockSize), payload.Size - byteOffset); + if (byteLength > 0) payloads.Add((long)start * blockSize, Slice(payload, byteOffset, byteLength)); + if (units.Count > 0 && units[^1].Start != 0 && units[^1].Start + units[^1].Width == start) + units[^1] = (units[^1].Start, units[^1].Width + width); + else + units.Add((start, width)); + done += width; + } + } + var perItem = maxBody / 16; + ulong logical = 0; + var bodyKey = obj.StatKey; + for (var first = 0; first < units.Count; first += perItem) { + var count = Math.Min(perItem, units.Count - first); + var body = new byte[count * 16]; + for (var i = 0; i < count; ++i) { + BinaryPrimitives.WriteUInt64LittleEndian(body.AsSpan(i * 16), units[first + i].Start); + BinaryPrimitives.WriteUInt64LittleEndian(body.AsSpan(i * 16 + 8), units[first + i].Width); + } + items.Add(new Item(Reiser4Key.Of(bodyKey.Locality, Reiser4Key.MinorBody, bodyKey.Ordering, bodyKey.ObjectId, logical), + Reiser4ItemPlugin.Extent, body)); + for (var i = 0; i < count; ++i) logical = checked(logical + units[first + i].Width * blockSize); + } } - return (ordering | (ulong)Fibre(name) << 57, objectId, offset, hashed); - } + items.Sort(static (a, b) => a.Key.CompareTo(b.Key)); + for (var i = 1; i < items.Count; ++i) + if (items[i].Key.CompareTo(items[i - 1].Key) == 0 && items[i].Plugin != Reiser4ItemPlugin.DirEntries) + throw new InvalidDataException("Reiser4: two items share one key."); - /// - /// Why a stat-data body does not hold exactly the extensions its mask declares, or - /// when it does. - /// - /// - /// Extensions follow the 16-bit mask in bit order: light-weight (bit 0, 14 bytes), - /// Unix (bit 1, 28), large times (bit 2, three 32-bit nanosecond fields), the plugin - /// set (bit 4) and heir set (bit 8) — a 16-bit count of 4-byte member/plugin slots — - /// and flags (bit 5, 32 bits). Anything else, including bit 15, which chains a - /// further mask, is not carried: a body that does not parse is what - /// fsck.reiser4 calls a fatal corruption. - /// - internal static string? StatDataProblem(ReadOnlySpan body) { - if (body.Length < 2) return "the stat data has no extension mask"; - var mask = BinaryPrimitives.ReadUInt16LittleEndian(body); - if ((mask & 3) != 3) return "the stat data lacks the light-weight or Unix extension"; - var at = 2; - for (var bit = 0; bit < 16; ++bit) { - if ((mask & 1 << bit) == 0) continue; - int length; - switch (bit) { - case 0: length = 14; break; - case 1: length = 28; break; - case 2: length = 12; break; - case 5: length = 4; break; - case 4 or 8: - if (at + 2 > body.Length) return "a plugin-set extension is truncated"; - length = 2 + 4 * BinaryPrimitives.ReadUInt16LittleEndian(body[at..]); - break; - default: return $"stat-data extension {bit} is not supported"; + // ── Leaves and twigs ──────────────────────────────────────────────── + var nodes = new Dictionary(); + var twigItems = new List(); + var pending = new List(); + var firstLeaf = true; + void FlushLeaves() { + foreach (var group in Pack(pending, capacity)) { + var block = firstLeaf ? 24UL : Allocate(); + firstLeaf = false; + nodes.Add(block, EncodeNode(group, plan, headerBytes, 1)); + twigItems.Add(new Item(group[0].Key, Reiser4ItemPlugin.NodePointer, PointerBody(block))); } - if (at + length > body.Length) return $"stat-data extension {bit} is truncated"; - at += length; + pending.Clear(); } - return at == body.Length ? null : "the stat data holds bytes its extension mask does not declare"; - } - - /// A stat data saying what a file is and how long. - private static byte[] StatData(ushort mode, uint links, ulong size, ulong bytes, uint time, - Reiser4Reader.FileMetadata? metadata = null) { - if (metadata is { RawStatData.Length: > 0 } carried && StatDataProblem(carried.RawStatData) is { } problem) - throw new NotSupportedException($"Reiser4: {problem}."); - if (metadata is { } saved && saved.RawStatData.Length >= 44) { - var preserved = saved.RawStatData.ToArray(); - BinaryPrimitives.WriteUInt16LittleEndian(preserved.AsSpan(2), saved.Mode); - BinaryPrimitives.WriteUInt32LittleEndian(preserved.AsSpan(4), saved.LinkCount); - BinaryPrimitives.WriteUInt64LittleEndian(preserved.AsSpan(8), size); - BinaryPrimitives.WriteUInt32LittleEndian(preserved.AsSpan(16), saved.UserId); - BinaryPrimitives.WriteUInt32LittleEndian(preserved.AsSpan(20), saved.GroupId); - BinaryPrimitives.WriteUInt32LittleEndian(preserved.AsSpan(24), saved.ModifiedTime); - BinaryPrimitives.WriteUInt32LittleEndian(preserved.AsSpan(28), saved.AccessedTime); - BinaryPrimitives.WriteUInt32LittleEndian(preserved.AsSpan(32), saved.ChangedTime); - BinaryPrimitives.WriteUInt64LittleEndian(preserved.AsSpan(36), bytes); - return preserved; + foreach (var item in items) { + if (item.Plugin == Reiser4ItemPlugin.Extent) { + FlushLeaves(); + twigItems.Add(item); + } else pending.Add(item); } - var body = new byte[2 + 14 + 28]; - BinaryPrimitives.WriteUInt16LittleEndian(body, 0x3); // light-weight and unix - BinaryPrimitives.WriteUInt16LittleEndian(body.AsSpan(2), metadata?.Mode ?? mode); - BinaryPrimitives.WriteUInt32LittleEndian(body.AsSpan(4), metadata?.LinkCount ?? links); - BinaryPrimitives.WriteUInt64LittleEndian(body.AsSpan(8), size); - BinaryPrimitives.WriteUInt32LittleEndian(body.AsSpan(16), metadata?.UserId ?? 0); - BinaryPrimitives.WriteUInt32LittleEndian(body.AsSpan(20), metadata?.GroupId ?? 0); - BinaryPrimitives.WriteUInt32LittleEndian(body.AsSpan(24), metadata?.ModifiedTime ?? time); - BinaryPrimitives.WriteUInt32LittleEndian(body.AsSpan(28), metadata?.AccessedTime ?? time); - BinaryPrimitives.WriteUInt32LittleEndian(body.AsSpan(32), metadata?.ChangedTime ?? time); - BinaryPrimitives.WriteUInt64LittleEndian(body.AsSpan(36), bytes); - return body; - } - - /// The root's entries, its own two and one for each file. - private static IEnumerable Directory(DirectoryNode directory, int blockSize) { - var names = new List<(string Name, ulong Locality, ulong ObjectId)> { - (".", directory.StatLocality, directory.ObjectId), - ("..", directory.ParentStatLocality, directory.ParentObjectId), - }; - foreach (var child in directory.Children) names.Add((child.Name, directory.ObjectId, child.ObjectId)); + FlushLeaves(); - var keyed = new List<(ulong Ordering, ulong ObjectId, ulong Offset, bool Hashed, - string Name, ulong Locality, ulong Target)>(); - foreach (var (name, locality, target) in names) { - var (ordering, objectId, offset, hashed) = NameKey(name); - keyed.Add((ordering, objectId, offset, hashed, name, locality, target)); + ushort level = 2; + var parentItems = twigItems; + while (true) { + var groups = Pack(parentItems, capacity).ToList(); + if (groups.Count == 1) { + nodes.Add(23, EncodeNode(groups[0], plan, headerBytes, (byte)level)); + break; + } + parentItems = []; + foreach (var group in groups) { + var block = Allocate(); + nodes.Add(block, EncodeNode(group, plan, headerBytes, (byte)level)); + parentItems.Add(new Item(group[0].Key, Reiser4ItemPlugin.NodePointer, PointerBody(block))); + } + level = checked((ushort)(level + 1)); } - keyed.Sort((a, b) => a.Ordering != b.Ordering ? a.Ordering.CompareTo(b.Ordering) - : a.ObjectId != b.ObjectId ? a.ObjectId.CompareTo(b.ObjectId) - : a.Offset.CompareTo(b.Offset)); + // ── Counters, bitmaps and the fixed blocks ────────────────────────── + var used = cursor; + var blocks = Math.Max(plan.MinimumBlocks, used + 1); + var format = plan.Format.ToArray(); + var backup = plan.Backup.ToArray(); + var objects = (ulong)plan.Objects.Count; + var tailBitmaps = (blocks - 1) / BlocksPerBitmap - (used - 1) / BlocksPerBitmap; + BinaryPrimitives.WriteUInt64LittleEndian(format.AsSpan(0), blocks); + BinaryPrimitives.WriteUInt64LittleEndian(format.AsSpan(8), blocks - used - tailBitmaps); + BinaryPrimitives.WriteUInt64LittleEndian(format.AsSpan(16), 23); + BinaryPrimitives.WriteUInt64LittleEndian(format.AsSpan(24), plan.NextObjectId); + BinaryPrimitives.WriteUInt64LittleEndian(format.AsSpan(32), objects); + BinaryPrimitives.WriteUInt32LittleEndian(format.AsSpan(48), plan.MkfsId); + BinaryPrimitives.WriteUInt16LittleEndian(format.AsSpan(68), level); + BinaryPrimitives.WriteUInt64LittleEndian(backup.AsSpan(0x4D), blocks); + BinaryPrimitives.WriteUInt32LittleEndian(backup.AsSpan(0x55), plan.MkfsId); + + var basePosition = output.Position; + var zero = new byte[blockSize]; + var bitmaps = BuildBitmaps(blocks, used); + for (var b = 0UL; b < FirstDataBlock; ++b) { + var bytes = b switch { + 16 => plan.Master, + 17 => format, + 18 => bitmaps[0].Bytes, + 21 => plan.Status, + 22 => backup, + 23 => nodes[23], + 24 => nodes[24], + _ => zero, + }; + output.Write(bytes, 0, blockSize); + } + output.SetLength(basePosition + checked((long)blocks * blockSize)); + foreach (var (block, bytes) in bitmaps.Skip(1)) { + output.Position = basePosition + (long)block * blockSize; + output.Write(bytes); + } + foreach (var (block, node) in nodes) { + if (block is 23 or 24) continue; + output.Position = basePosition + checked((long)block * blockSize); + output.Write(node); + } + payloads.FlushTo(output, basePosition); + output.Position = basePosition + (long)blocks * blockSize; + output.Flush(); + return new Result(blocks, level, objects, [.. nodes.Keys]); + } + /// The cde40 items of a directory: its entries in key order, packed into items that fit a node. + private static IEnumerable DirectoryItems(Reiser4PlanObject directory, int maxBody) { + var entries = directory.Entries.Select(static (entry, index) => (entry, index)).ToList(); + entries.Sort(static (a, b) => { + var c = a.entry.Ordering.CompareTo(b.entry.Ordering); + if (c != 0) return c; + c = a.entry.ObjectId.CompareTo(b.entry.ObjectId); + if (c != 0) return c; + c = a.entry.Offset.CompareTo(b.entry.Offset); + return c != 0 ? c : a.index.CompareTo(b.index); + }); const int unitHeaderBytes = 26; const int targetKeyBytes = 24; - var first = 0; - while (first < keyed.Count) { + while (first < entries.Count) { var last = first; var bodySize = 2; - while (last < keyed.Count) { - var entrySize = unitHeaderBytes + targetKeyBytes + - (keyed[last].Hashed ? Encoding.ASCII.GetByteCount(keyed[last].Name) + 1 : 0); - if (bodySize + entrySize > blockSize - NodeHeaderBytes - ItemHeaderBytes) break; + while (last < entries.Count) { + var entrySize = unitHeaderBytes + targetKeyBytes + (entries[last].entry.Hashed ? entries[last].entry.Name.Length + 1 : 0); + if (bodySize + entrySize > maxBody) break; bodySize += entrySize; ++last; } @@ -249,191 +222,53 @@ private static IEnumerable Directory(DirectoryNode directory, int blockSiz BinaryPrimitives.WriteUInt16LittleEndian(body, checked((ushort)(last - first))); var unit = 2 + (last - first) * unitHeaderBytes; for (var i = first; i < last; ++i) { - var entry = keyed[i]; + var entry = entries[i].entry; var header = 2 + (i - first) * unitHeaderBytes; BinaryPrimitives.WriteUInt64LittleEndian(body.AsSpan(header), entry.Ordering); BinaryPrimitives.WriteUInt64LittleEndian(body.AsSpan(header + 8), entry.ObjectId); BinaryPrimitives.WriteUInt64LittleEndian(body.AsSpan(header + 16), entry.Offset); BinaryPrimitives.WriteUInt16LittleEndian(body.AsSpan(header + 24), checked((ushort)unit)); - BinaryPrimitives.WriteUInt64LittleEndian(body.AsSpan(unit), entry.Locality << 4 | MinorStatData); - BinaryPrimitives.WriteUInt64LittleEndian(body.AsSpan(unit + 16), entry.Target); + BinaryPrimitives.WriteUInt64LittleEndian(body.AsSpan(unit), entry.Target.Word0); + BinaryPrimitives.WriteUInt64LittleEndian(body.AsSpan(unit + 8), entry.Target.Ordering); + BinaryPrimitives.WriteUInt64LittleEndian(body.AsSpan(unit + 16), entry.Target.ObjectId); unit += targetKeyBytes; if (entry.Hashed) { - var bytes = Encoding.ASCII.GetBytes(entry.Name); - bytes.CopyTo(body.AsSpan(unit)); - unit += bytes.Length + 1; + entry.Name.CopyTo(body.AsSpan(unit)); + unit += entry.Name.Length + 1; } } - var firstKey = keyed[first]; - yield return new(directory.ObjectId, MinorFileName, firstKey.Ordering, firstKey.ObjectId, - firstKey.Offset, PluginCde40, body); + var key = entries[first].entry; + yield return new Item(Reiser4Key.Of(directory.StatKey.ObjectId, Reiser4Key.MinorName, key.Ordering, key.ObjectId, key.Offset), + Reiser4ItemPlugin.DirEntries, body); first = last; } } - /// - /// Builds leaves, twig extents and pointer levels from the captured root defaults. - /// - internal static Layout Build(byte[] leaf, int blockSize, uint mkfsId, uint time, - ulong rootLocality, ulong rootObjectId, IReadOnlyList sourceFiles, - IReadOnlyDictionary? savedDirectories, Func allocate) { - // The root's own stat data, kept as mkfs wrote it — it carries the plugin set - // every file below it inherits, which this does not attempt to rebuild. - var rootStatOffset = BinaryPrimitives.ReadUInt16LittleEndian(leaf[(blockSize - ItemHeaderBytes + 32)..]); - var rootStatLength = BinaryPrimitives.ReadUInt16LittleEndian(leaf[(blockSize - 2 * ItemHeaderBytes + 32)..]) - - rootStatOffset; - var rootStat = leaf.AsSpan(rootStatOffset, rootStatLength).ToArray(); - if (savedDirectories?.GetValueOrDefault("") is { } rootMetadata) - rootStat = StatData(rootMetadata.Mode, rootMetadata.LinkCount, (ulong)rootMetadata.Size, - BinaryPrimitives.ReadUInt64LittleEndian(rootMetadata.RawStatData.AsSpan(36)), time, rootMetadata); - - var rootDirectory = new DirectoryNode { - Path = "", Name = "", ObjectId = rootObjectId, ParentObjectId = rootObjectId, - StatLocality = rootLocality, ParentStatLocality = rootLocality, - }; - var directories = new List { rootDirectory }; - var byPath = new Dictionary(StringComparer.Ordinal) { [""] = rootDirectory }; - var knownIds = sourceFiles.Select(static entry => entry.Metadata?.ObjectId ?? 0) - .Concat(savedDirectories?.Values.Select(static metadata => metadata?.ObjectId ?? 0) ?? []); - var nextObjectId = checked(Math.Max(0xFFFFUL, Math.Max(rootObjectId, knownIds.DefaultIfEmpty().Max())) + 1); - var assignedIds = new HashSet { rootObjectId }; - ulong ObjectId(Reiser4Reader.FileMetadata? metadata) { - var id = metadata?.ObjectId is > 0 ? metadata.ObjectId : nextObjectId; - if (metadata?.ObjectId is not > 0) nextObjectId = checked(nextObjectId + 1); - if (id <= rootObjectId || !assignedIds.Add(id)) - throw new InvalidDataException("Reiser4: duplicate or reserved object identity."); - return id; - } - var fileParents = new List<(Entry Source, ulong ParentObjectId, ulong ObjectId)>(); - - var allSources = (savedDirectories?.Keys.Where(static path => path.Length > 0) ?? []) - .Select(static path => new Entry { Name = path + "/", ParentObjectId = 0, ObjectId = 0, Size = 0, Runs = [] }) - .Concat(sourceFiles); - foreach (var source in allSources) { - var isDirectory = source.Name.EndsWith('/'); - var components = source.Name.Replace('\\', '/').Split('/', StringSplitOptions.RemoveEmptyEntries); - if (components.Length == 0 || components.Any(static component => component is "." or ".." || - component.Contains(':') || component.Contains('\0') || component.Any(static c => c > 127))) - throw new InvalidDataException($"Reiser4: invalid archive path '{source.Name}'."); - - var parentPath = ""; - var parent = rootDirectory; - for (var i = 0; i < components.Length - (isDirectory ? 0 : 1); ++i) { - var path = parentPath.Length == 0 ? components[i] : $"{parentPath}/{components[i]}"; - if (!byPath.TryGetValue(path, out var directory)) { - if (parent.Children.Any(child => child.Name == components[i])) - throw new InvalidDataException($"Reiser4: file/directory collision at '{path}'."); - directory = new DirectoryNode { - Path = path, Name = components[i], ObjectId = ObjectId(savedDirectories?.GetValueOrDefault(path)), ParentObjectId = parent.ObjectId, - StatLocality = parent.ObjectId, ParentStatLocality = parent.StatLocality, - }; - byPath.Add(path, directory); - directories.Add(directory); - parent.Children.Add((directory.Name, directory.ObjectId)); - } - parent = directory; - parentPath = path; - } - - if (isDirectory) continue; - var leafName = components[^1]; - if (parent.Children.Any(child => string.Equals(child.Name, leafName, StringComparison.Ordinal))) - throw new InvalidDataException($"Reiser4: duplicate path or file/directory collision at '{source.Name}'."); - var objectId = ObjectId(source.Metadata); - parent.Children.Add((leafName, objectId)); - fileParents.Add((source with { Name = leafName }, parent.ObjectId, objectId)); - } - - var files = fileParents.Select(static file => new Entry { - Name = file.Source.Name, ParentObjectId = file.ParentObjectId, ObjectId = file.ObjectId, - Size = file.Source.Size, Runs = file.Source.Runs, Metadata = file.Source.Metadata, - }).ToArray(); - - var rootItems = Directory(rootDirectory, blockSize).ToArray(); - BinaryPrimitives.WriteUInt32LittleEndian(rootStat.AsSpan(4), checked(3U + (uint)directories.Count(directory => directory != rootDirectory && directory.ParentObjectId == rootObjectId))); - BinaryPrimitives.WriteUInt64LittleEndian(rootStat.AsSpan(8), (ulong)rootDirectory.Children.Count + 2); - BinaryPrimitives.WriteUInt64LittleEndian(rootStat.AsSpan(36), (ulong)rootItems.Sum(static item => item.Body.Length - 2)); - var bodies = new List { - new(rootLocality, MinorStatData, 0, rootObjectId, 0, PluginStat40, rootStat), - }; - bodies.AddRange(rootItems); - - foreach (var directory in directories.Skip(1)) { - var directoryItems = Directory(directory, blockSize).ToArray(); - bodies.Add(new(directory.StatLocality, MinorStatData, 0, directory.ObjectId, 0, PluginStat40, - StatData(0x41ED, checked(2U + (uint)directories.Count(child => child.ParentObjectId == directory.ObjectId)), (ulong)directory.Children.Count + 2, (ulong)directoryItems.Sum(static item => item.Body.Length - 2), time, - savedDirectories?.GetValueOrDefault(directory.Path)))); - bodies.AddRange(directoryItems); - } - - foreach (var file in files) { - var held = file.Runs.Aggregate(0UL, static (sum, run) => checked(sum + run.Width)); - bodies.Add(new(file.ParentObjectId, MinorStatData, 0, file.ObjectId, 0, PluginStat40, - StatData(0x81A4, 1, (ulong)file.Size, held * (ulong)blockSize, time, file.Metadata))); - if (file.Runs.Count == 0) continue; - var runsPerItem = (blockSize - NodeHeaderBytes - ItemHeaderBytes) / 16; - ulong logicalOffset = 0; - for (var firstRun = 0; firstRun < file.Runs.Count; firstRun += runsPerItem) { - var count = Math.Min(runsPerItem, file.Runs.Count - firstRun); - var extents = new byte[count * 16]; - for (var i = 0; i < count; ++i) { - var run = file.Runs[firstRun + i]; - BinaryPrimitives.WriteUInt64LittleEndian(extents.AsSpan(i * 16), run.Start); - BinaryPrimitives.WriteUInt64LittleEndian(extents.AsSpan(i * 16 + 8), run.Width); - } - bodies.Add(new(file.ParentObjectId, MinorFileBody, 0, file.ObjectId, logicalOffset, PluginExtent40, extents)); - for (var i = 0; i < count; ++i) - logicalOffset = checked(logicalOffset + file.Runs[firstRun + i].Width * (ulong)blockSize); - } - } + /// The body bytes of a directory's entries as its stat data's "bytes" counts them. + internal static ulong DirectoryBytes(IEnumerable entries) + => (ulong)entries.Sum(static e => 26 + 24 + (e.Hashed ? e.Name.Length + 1 : 0)); - bodies.Sort(static (a, b) => { - var c = (a.Locality << 4 | a.Minor).CompareTo(b.Locality << 4 | b.Minor); - if (c != 0) return c; - c = a.Ordering.CompareTo(b.Ordering); - if (c != 0) return c; - c = a.ObjectId.CompareTo(b.ObjectId); - return c != 0 ? c : a.Offset.CompareTo(b.Offset); - }); + /// A byte range of , read lazily. + internal static FilePayload Slice(FilePayload payload, long offset, long length) { + if (offset == 0 && length == payload.Size) return payload; + if (payload.Data is { } data) return FilePayload.FromBytes(data.AsSpan(checked((int)offset), checked((int)length)).ToArray()); + return FilePayload.FromStream(length, () => SkipTo(payload.Open(), offset)); + } - var nodes = new Dictionary(); - var twigItems = new List(); - var pending = new List(); - var firstLeaf = true; - void FlushLeaves() { - foreach (var group in Pack(pending, blockSize)) { - var block = firstLeaf ? 24UL : allocate(); - firstLeaf = false; - nodes.Add(block, EncodeNode(group, blockSize, mkfsId, 1)); - twigItems.Add(group[0] with { Plugin = 3, Body = PointerBody(block) }); - } - pending.Clear(); + private static Stream SkipTo(Stream source, long offset) { + if (offset <= 0) return source; + if (source.CanSeek) { + source.Position = offset; + return source; } - // A leaf cannot straddle a key range occupied by a twig extent item. - // End the leaf run before that extent, then resume after it. - foreach (var item in bodies) { - if (item.Plugin == PluginExtent40) { - FlushLeaves(); - twigItems.Add(item); - } else pending.Add(item); - } - FlushLeaves(); - byte level = 2; - var parentItems = twigItems; - while (true) { - var groups = Pack(parentItems, blockSize).ToList(); - if (groups.Count == 1) { - nodes.Add(23, EncodeNode(groups[0], blockSize, mkfsId, level)); - return new(nextObjectId, (ulong)assignedIds.Count, level, nodes); - } - parentItems = []; - foreach (var group in groups) { - var block = allocate(); - nodes.Add(block, EncodeNode(group, blockSize, mkfsId, level)); - parentItems.Add(group[0] with { Plugin = 3, Body = PointerBody(block) }); - } - level = checked((byte)(level + 1)); + var buffer = new byte[64 * 1024]; + var remaining = offset; + while (remaining > 0) { + var n = source.Read(buffer, 0, (int)Math.Min(buffer.Length, remaining)); + if (n <= 0) break; + remaining -= n; } + return source; } private static byte[] PointerBody(ulong block) { @@ -442,17 +277,16 @@ private static byte[] PointerBody(ulong block) { return body; } - private static IEnumerable> Pack(IReadOnlyList items, int blockSize) { + private static IEnumerable> Pack(IReadOnlyList items, int capacity) { var group = new List(); - var bytes = NodeHeaderBytes; + var bytes = 0; foreach (var item in items) { var need = checked(item.Body.Length + ItemHeaderBytes); - if (need > blockSize - NodeHeaderBytes) - throw new InvalidDataException("Reiser4: an indivisible item exceeds node capacity."); - if (bytes + need > blockSize) { + if (need > capacity) throw new InvalidDataException("Reiser4: an indivisible item exceeds node capacity."); + if (bytes + need > capacity) { yield return group; group = []; - bytes = NodeHeaderBytes; + bytes = 0; } group.Add(item); bytes += need; @@ -460,24 +294,51 @@ private static IEnumerable> Pack(IReadOnlyList items, int block if (group.Count > 0) yield return group; } - private static byte[] EncodeNode(IReadOnlyList items, int blockSize, uint mkfsId, byte level) { + private static byte[] EncodeNode(IReadOnlyList items, Reiser4Plan plan, int headerBytes, byte level) { + const int blockSize = Reiser4Volume.BlockSize; var node = new byte[blockSize]; - var at = NodeHeaderBytes; + var at = headerBytes; for (var i = 0; i < items.Count; ++i) { var item = items[i]; item.Body.CopyTo(node.AsSpan(at)); var header = blockSize - (i + 1) * ItemHeaderBytes; - WriteKey(node.AsSpan(header), item.Locality, item.Minor, item.Ordering, item.ObjectId, item.Offset); + item.Key.Write(node.AsSpan(header)); BinaryPrimitives.WriteUInt16LittleEndian(node.AsSpan(header + 32), checked((ushort)at)); - BinaryPrimitives.WriteUInt16LittleEndian(node.AsSpan(header + 36), checked((ushort)item.Plugin)); + BinaryPrimitives.WriteUInt16LittleEndian(node.AsSpan(header + 36), item.Plugin); at += item.Body.Length; } + BinaryPrimitives.WriteUInt16LittleEndian(node, plan.NodePlugin); BinaryPrimitives.WriteUInt16LittleEndian(node.AsSpan(2), checked((ushort)items.Count)); BinaryPrimitives.WriteUInt16LittleEndian(node.AsSpan(4), checked((ushort)(blockSize - items.Count * ItemHeaderBytes - at))); BinaryPrimitives.WriteUInt16LittleEndian(node.AsSpan(6), checked((ushort)at)); - BinaryPrimitives.WriteUInt32LittleEndian(node.AsSpan(8), unchecked((uint)NodeMagic)); - BinaryPrimitives.WriteUInt32LittleEndian(node.AsSpan(12), mkfsId); + BinaryPrimitives.WriteUInt32LittleEndian(node.AsSpan(8), plan.NodePlugin == 1 ? Reiser4Volume.Node41Magic : unchecked((uint)NodeMagic)); + BinaryPrimitives.WriteUInt32LittleEndian(node.AsSpan(12), plan.MkfsId); node[26] = level; + if (plan.NodePlugin == 1) Reiser4Volume.SealNode41(node); return node; } + + /// + /// Every block-allocator bitmap. Bitmap i covers blocks [i × BlocksPerBitmap, (i+1) × + /// BlocksPerBitmap); the first lives at block 18 and the rest at the stride boundaries. Blocks + /// below , every bitmap block and everything past the end of the volume + /// are marked allocated. + /// + internal static List<(ulong Block, byte[] Bytes)> BuildBitmaps(ulong blocks, ulong used) { + var result = new List<(ulong Block, byte[] Bytes)>(); + var count = (blocks + BlocksPerBitmap - 1) / BlocksPerBitmap; + for (var i = 0UL; i < count; ++i) { + var block = i == 0 ? 18UL : i * BlocksPerBitmap; + var buffer = new byte[Reiser4Volume.BlockSize]; + var baseBlock = i * BlocksPerBitmap; + for (var bit = 0UL; bit < BlocksPerBitmap; ++bit) { + var target = baseBlock + bit; + if (target >= used && target < blocks && !IsBitmapBlock(target)) continue; + buffer[4 + (int)(bit >> 3)] |= (byte)(1 << (int)(bit & 7)); + } + BinaryPrimitives.WriteUInt32LittleEndian(buffer, Adler32.Compute(buffer.AsSpan(4))); + result.Add((block, buffer)); + } + return result; + } } diff --git a/Hawkynt.FileFormats.FileSystems/FileSystems/FileSystem.Reiser4/Reiser4Volume.cs b/Hawkynt.FileFormats.FileSystems/FileSystems/FileSystem.Reiser4/Reiser4Volume.cs new file mode 100644 index 000000000..e9b575c75 --- /dev/null +++ b/Hawkynt.FileFormats.FileSystems/FileSystems/FileSystem.Reiser4/Reiser4Volume.cs @@ -0,0 +1,625 @@ +#pragma warning disable CS1591 +using System.Buffers.Binary; +using System.Text; +using Compression.Core.Checksums; +using Compression.Core.DiskImage; + +namespace FileSystem.Reiser4; + +/// Item plugin identifiers (plugin type 1). +internal static class Reiser4ItemPlugin { + internal const ushort StatData = 0; + internal const ushort DirEntries = 2; + internal const ushort NodePointer = 3; + internal const ushort Extent = 5; + internal const ushort Tail = 6; + internal const ushort CompressedTail = 7; +} + +/// Plugin-set member slots (the sdext_plugin_set member numbers). +internal static class Reiser4PsetMember { + internal const ushort File = 0; + internal const ushort Directory = 1; + internal const ushort Formatting = 3; + internal const ushort Hash = 4; + internal const ushort Fibration = 5; + internal const ushort Cipher = 8; + internal const ushort Compression = 10; + internal const ushort CompressionMode = 11; + internal const ushort Cluster = 12; + internal const ushort Create = 13; +} + +/// One item as it sits in a node: its key, plugin and where its body lives. +internal sealed record Reiser4ItemRef(Reiser4Key Key, ushort Plugin, ushort Flags, ulong Block, int BodyOffset, int BodyLength); + +/// One directory entry: the three key words its name produced, the name and its target. +internal sealed record Reiser4DirEntry(ulong Ordering, ulong ObjectId, ulong Offset, byte[] Name, Reiser4Key Target) { + internal bool Hashed => (this.Ordering & Reiser4NameKeys.LongNameBit) != 0; + internal bool IsDot => this.Name is [(byte)'.']; + internal bool IsDotDot => this.Name is [(byte)'.', (byte)'.']; +} + +/// +/// The stat data of an object, parsed only as far as the writer needs it; the raw body is always +/// kept so a rebuild can carry every extension byte for byte. +/// +internal sealed class Reiser4Stat { + + internal byte[] Raw { get; } + internal ushort Mask => BinaryPrimitives.ReadUInt16LittleEndian(this.Raw); + internal ushort Mode => BinaryPrimitives.ReadUInt16LittleEndian(this.Raw.AsSpan(2)); + internal uint Links => BinaryPrimitives.ReadUInt32LittleEndian(this.Raw.AsSpan(4)); + internal ulong Size => BinaryPrimitives.ReadUInt64LittleEndian(this.Raw.AsSpan(8)); + internal uint UserId => BinaryPrimitives.ReadUInt32LittleEndian(this.Raw.AsSpan(16)); + internal uint GroupId => BinaryPrimitives.ReadUInt32LittleEndian(this.Raw.AsSpan(20)); + internal uint AccessTime => BinaryPrimitives.ReadUInt32LittleEndian(this.Raw.AsSpan(24)); + internal uint ModifyTime => BinaryPrimitives.ReadUInt32LittleEndian(this.Raw.AsSpan(28)); + internal uint ChangeTime => BinaryPrimitives.ReadUInt32LittleEndian(this.Raw.AsSpan(32)); + /// Allocated bytes for files and directories; the device number for special files. + internal ulong BytesOrDevice => BinaryPrimitives.ReadUInt64LittleEndian(this.Raw.AsSpan(36)); + + /// The object's own plugin-set members, member → plugin id. + internal IReadOnlyDictionary PluginSet { get; } + + /// Byte range of the plugin-set extension, or (-1, 0) when there is none. + internal (int Start, int Length) PluginSetRange { get; } = (-1, 0); + + /// The symlink target the symlink extension holds. + internal byte[]? SymlinkTarget { get; } + + internal const int FileType = 0xF000; + internal const int Directory = 0x4000; + internal const int Regular = 0x8000; + internal const int Symlink = 0xA000; + internal const int CharDevice = 0x2000; + internal const int BlockDevice = 0x6000; + internal const int Fifo = 0x1000; + internal const int Socket = 0xC000; + + private Reiser4Stat(byte[] raw, Dictionary pset, (int, int) psetRange, byte[]? symlink) { + this.Raw = raw; + this.PluginSet = pset; + this.PluginSetRange = psetRange; + this.SymlinkTarget = symlink; + } + + /// + /// Parses a stat-data body, or returns why it is outside what this profile carries: an + /// extension nobody verified (crypto, a chained mask) or bytes the mask does not declare. + /// + internal static Reiser4Stat? Parse(ReadOnlySpan body, out string? problem) { + problem = null; + if (body.Length < 2) { problem = "the stat data has no extension mask"; return null; } + var mask = BinaryPrimitives.ReadUInt16LittleEndian(body); + if ((mask & 3) != 3) { problem = "the stat data lacks the light-weight or Unix extension"; return null; } + var at = 2; + var pset = new Dictionary(); + (int, int) psetRange = (-1, 0); + byte[]? symlink = null; + for (var bit = 0; bit < 16; ++bit) { + if ((mask & 1 << bit) == 0) continue; + int length; + switch (bit) { + case 0: length = 14; break; + case 1: length = 28; break; + case 2: length = 12; break; + case 3: { + // Symlink: the target, as long as the light-weight extension's size says, then a NUL. + var size = BinaryPrimitives.ReadUInt64LittleEndian(body[8..]); + if (size > 4096) { problem = "a symlink target is longer than a page"; return null; } + length = (int)size + 1; + if (at + length > body.Length) { problem = "the symlink extension is truncated"; return null; } + symlink = body.Slice(at, (int)size).ToArray(); + break; + } + case 5: length = 4; break; + case 4 or 8: { + if (at + 2 > body.Length) { problem = "a plugin-set extension is truncated"; return null; } + var count = BinaryPrimitives.ReadUInt16LittleEndian(body[at..]); + length = 2 + 4 * count; + if (at + length > body.Length) { problem = $"stat-data extension {bit} is truncated"; return null; } + if (bit == 4) { + psetRange = (at, length); + for (var i = 0; i < count; ++i) + pset[BinaryPrimitives.ReadUInt16LittleEndian(body[(at + 2 + 4 * i)..])] = + BinaryPrimitives.ReadUInt16LittleEndian(body[(at + 4 + 4 * i)..]); + } + break; + } + default: problem = $"stat-data extension {bit} is not supported"; return null; + } + if (at + length > body.Length) { problem = $"stat-data extension {bit} is truncated"; return null; } + at += length; + } + if (at != body.Length) { problem = "the stat data holds bytes its extension mask does not declare"; return null; } + if (pset.TryGetValue(Reiser4PsetMember.Cipher, out var cipher) && cipher != 0) { + problem = "the object is encrypted"; + return null; + } + return new Reiser4Stat(body.ToArray(), pset, psetRange, symlink); + } + + internal int Kind => this.Mode & FileType; +} + +/// One object of the volume: its stat data, its body items and, for a directory, its entries. +internal sealed class Reiser4Object { + internal required Reiser4Key StatKey { get; init; } + internal required Reiser4Stat Stat { get; init; } + internal List Body { get; } = []; + internal List Entries { get; } = []; + internal ulong ObjectId => this.StatKey.ObjectId; + internal bool IsDirectory => this.Stat.Kind == Reiser4Stat.Directory; +} + +/// +/// A Reiser4 volume read whole: the fixed blocks after journal replay, the root's plugin profile +/// and every object the node40/node41 tree holds, resolved into a namespace. +/// +/// +/// The layout this reads — and the reasons it refuses what it does not — is written down in +/// docs/REISER4-NATIVE-PROFILE.md. +/// +internal sealed class Reiser4Volume : IDisposable { + + internal const int BlockSize = 4096; + internal const long MasterOffset = 65536; + internal const ulong RootLocality = 0x29; + internal const ulong RootObjectId = 0x2a; + internal static readonly Reiser4Key RootStatKey = Reiser4Key.Of(RootLocality, Reiser4Key.MinorStatData, 0, RootObjectId, 0); + + private static readonly byte[] MasterMagic = "ReIsEr4"u8.ToArray(); + private static readonly byte[] FormatMagic = "ReIsEr40FoRmAt"u8.ToArray(); + private const uint NodeMagic = 0x52344653; + /// The magic a node41 (checksummed) node carries instead. + internal const uint Node41Magic = 0x19051966; + private const int ItemHeaderBytes = 38; + + private readonly ImageAccessor _image; + private Dictionary _replayed = []; + + internal bool Valid { get; } + internal string Label { get; } = ""; + internal string UuidHex { get; } = ""; + internal int VolumeBlockSize { get; } = BlockSize; + internal long Length => this._image.Length; + internal ulong BlockCount => (ulong)(this._image.Length / BlockSize); + + /// True when the whole tree was read and every object is one this profile carries. + internal bool TreeValid { get; private set; } + + /// Why the tree was not read, when it was not. + internal string? Problem { get; private set; } + + /// Number of journal transactions replayed before the tree was read. + internal int ReplayedTransactions { get; private set; } + + /// Node plugin the format superblock names: 0 node40, 1 node41 (checksummed). + internal ushort NodePlugin { get; private set; } + internal int NodeHeaderBytes => this.NodePlugin == 1 ? 32 : 28; + + internal ushort TreeHeight { get; private set; } + + internal Dictionary Objects { get; } = []; + internal Reiser4Object? Root { get; private set; } + internal List NodeBlocks { get; } = []; + + /// Every path the namespace resolves, in walk order, with the object each one names. + internal List<(string Path, byte[] Name, Reiser4Object Object, Reiser4Object Parent)> Paths { get; } = []; + + internal Reiser4Volume(Stream stream, bool leaveOpen = true) { + ArgumentNullException.ThrowIfNull(stream); + if (stream.CanSeek) stream.Position = 0; + this._image = new ImageAccessor(stream, leaveOpen); + if (this._image.Length < MasterOffset + BlockSize) return; + var master = this._image.Read(MasterOffset, BlockSize); + if (!master.AsSpan(0, MasterMagic.Length).SequenceEqual(MasterMagic)) return; + this.Valid = true; + var blockSize = BinaryPrimitives.ReadUInt16LittleEndian(master.AsSpan(18, 2)); + if (blockSize is >= 512 and <= 8192) this.VolumeBlockSize = blockSize; + this.UuidHex = Convert.ToHexString(master.AsSpan(20, 16)); + var label = master.AsSpan(36, 16); + var nul = label.IndexOf((byte)0); + this.Label = Encoding.UTF8.GetString(nul < 0 ? label : label[..nul]); + try { + this.Problem = this.Load(); + } catch (Exception ex) when (ex is InvalidDataException or NotSupportedException or OverflowException or ArgumentException or IndexOutOfRangeException) { + this.Problem = ex.Message; + } + this.TreeValid = this.Problem is null; + } + + /// A block as the volume holds it once the journal is replayed. + internal byte[] ReadBlock(ulong block) { + if (this._replayed.TryGetValue(block, out var replayed)) return replayed.ToArray(); + return this._image.Read(checked((long)block * BlockSize), BlockSize); + } + + /// Bytes of an item body. + internal byte[] ReadBody(Reiser4ItemRef item) => this.ReadBlock(item.Block).AsSpan(item.BodyOffset, item.BodyLength).ToArray(); + + /// Copies whole blocks from the volume, journal replay included. + internal void CopyBlocks(ulong start, ulong count, Stream destination, long byteLimit) { + for (ulong i = 0; i < count && byteLimit > 0; ++i) { + var block = start + i; + var take = (int)Math.Min(BlockSize, byteLimit); + if (this._replayed.TryGetValue(block, out var replayed)) destination.Write(replayed, 0, take); + else this._image.CopyTo(checked((long)block * BlockSize), destination, take); + byteLimit -= take; + } + } + + private string? Load() { + if (this.VolumeBlockSize != BlockSize) return "only 4096-byte blocks are read natively"; + if (this.BlockCount <= 25) return "the image is too small for a format40 volume"; + var replay = Reiser4Journal.Read(block => this._image.Read(checked((long)block * BlockSize), BlockSize), this.BlockCount, out var journalProblem); + if (replay is null) return journalProblem; + this._replayed = replay.Blocks.ToDictionary(static pair => pair.Key, static pair => pair.Value); + this.ReplayedTransactions = replay.Transactions; + + var format = this.ReadBlock(17); + if (!format.AsSpan(52, FormatMagic.Length).SequenceEqual(FormatMagic)) return "the format40 superblock is missing"; + var flags = BinaryPrimitives.ReadUInt64LittleEndian(format.AsSpan(72)); + if ((flags & 1) == 0) return "the volume uses short keys"; + this.NodePlugin = (ushort)BinaryPrimitives.ReadUInt32LittleEndian(format.AsSpan(84)); + if (this.NodePlugin > 1) return $"node plugin {this.NodePlugin} is not supported"; + var root = BinaryPrimitives.ReadUInt64LittleEndian(format.AsSpan(16)); + this.TreeHeight = BinaryPrimitives.ReadUInt16LittleEndian(format.AsSpan(68)); + if (root == 0 || root >= this.BlockCount) return "the tree root lies outside the volume"; + + var items = new List(); + var visited = new HashSet(); + if (this.Walk(root, 0, visited, items) is { } walkProblem) return walkProblem; + this.NodeBlocks.AddRange(visited); + return this.Assemble(items); + } + + private string? Walk(ulong block, int expectedLevel, HashSet visited, List items) { + if (block < 23 || block >= this.BlockCount) return $"a tree pointer names block {block}, outside the volume"; + if (!visited.Add(block)) return $"node {block} is reached twice"; + if (visited.Count > 16_000_000) return "the tree is larger than this reader walks"; + var node = this.ReadBlock(block); + var plugin = BinaryPrimitives.ReadUInt16LittleEndian(node); + if (plugin != this.NodePlugin || BinaryPrimitives.ReadUInt32LittleEndian(node.AsSpan(8)) != (this.NodePlugin == 1 ? Node41Magic : NodeMagic)) + return $"block {block} is not a formatted node of the volume's node plugin"; + if (this.NodePlugin == 1 && NodeChecksum(node) != BinaryPrimitives.ReadUInt32LittleEndian(node.AsSpan(28))) + return $"node {block} fails its checksum"; + var level = node[26]; + if (level == 0 || expectedLevel != 0 && level != expectedLevel) return $"node {block} sits at the wrong tree level"; + var count = BinaryPrimitives.ReadUInt16LittleEndian(node.AsSpan(2)); + var bodiesEnd = BinaryPrimitives.ReadUInt16LittleEndian(node.AsSpan(6)); + if (count == 0 || count > (BlockSize - this.NodeHeaderBytes) / ItemHeaderBytes || + bodiesEnd < this.NodeHeaderBytes || bodiesEnd > BlockSize - count * ItemHeaderBytes) + return $"node {block} has a malformed header"; + var headers = new (Reiser4Key Key, ushort Offset, ushort Flags, ushort Plugin)[count]; + for (var i = 0; i < count; ++i) { + var at = BlockSize - (i + 1) * ItemHeaderBytes; + headers[i] = (Reiser4Key.Read(node.AsSpan(at)), BinaryPrimitives.ReadUInt16LittleEndian(node.AsSpan(at + 32)), + BinaryPrimitives.ReadUInt16LittleEndian(node.AsSpan(at + 34)), BinaryPrimitives.ReadUInt16LittleEndian(node.AsSpan(at + 36))); + if (headers[i].Offset < this.NodeHeaderBytes || headers[i].Offset > bodiesEnd) return $"node {block} has an item outside its body area"; + if (i > 0 && headers[i].Key.CompareTo(headers[i - 1].Key) < 0) return $"node {block} holds items out of key order"; + } + var ends = headers.Select(static h => (int)h.Offset).Append(bodiesEnd).Distinct().Order().ToArray(); + var children = new List(); + for (var i = 0; i < count; ++i) { + var (key, offset, itemFlags, itemPlugin) = headers[i]; + var end = ends[Array.IndexOf(ends, offset) + 1]; + var length = end - offset; + if (level > 1 && itemPlugin == Reiser4ItemPlugin.NodePointer) { + if (length != 8) return $"node {block} holds a malformed node pointer"; + children.Add(BinaryPrimitives.ReadUInt64LittleEndian(node.AsSpan(offset))); + continue; + } + // Extents live at the twig level (the earliest workbench images also put them in leaves); + // every other item lives in a leaf. + if (level > 2 || level == 2 && itemPlugin != Reiser4ItemPlugin.Extent) + return $"node {block} holds item plugin {itemPlugin} at level {level}"; + items.Add(new Reiser4ItemRef(key, itemPlugin, itemFlags, block, offset, length)); + } + if (level == 1 && children.Count > 0) return $"leaf {block} holds a node pointer"; + foreach (var child in children) + if (this.Walk(child, level - 1, visited, items) is { } problem) return problem; + return null; + } + + /// The CRC-32C node41 keeps at byte 28: over the node40 header and everything after the checksum. + internal static uint NodeChecksum(ReadOnlySpan node) { + var crc = Crc32CUpdate(0xFFFF_FFFFu, node[..28]); + return Crc32CUpdate(crc, node[32..]); + } + + private static readonly uint[] Crc32CTable = BuildCrc32CTable(); + + private static uint[] BuildCrc32CTable() { + var table = new uint[256]; + for (var n = 0u; n < 256; ++n) { + var c = n; + for (var k = 0; k < 8; ++k) c = (c & 1) != 0 ? 0x82F63B78u ^ (c >> 1) : c >> 1; + table[n] = c; + } + return table; + } + + /// The CRC-32C register advanced over , without the final inversion. + private static uint Crc32CUpdate(uint crc, ReadOnlySpan data) { + foreach (var b in data) crc = Crc32CTable[(crc ^ b) & 0xFF] ^ (crc >> 8); + return crc; + } + + private string? Assemble(List items) { + var directoryItems = new Dictionary>(); + foreach (var item in items) { + var key = item.Key; + switch (key.Minor) { + case Reiser4Key.MinorStatData when item.Plugin == Reiser4ItemPlugin.StatData && key.Offset == 0: { + var stat = Reiser4Stat.Parse(this.ReadBody(item), out var problem); + if (stat is null) return problem; + if (!this.Objects.TryAdd(key, new Reiser4Object { StatKey = key, Stat = stat })) return "an object has two stat data"; + break; + } + case Reiser4Key.MinorName when item.Plugin == Reiser4ItemPlugin.DirEntries: + if (!directoryItems.TryGetValue(key.Locality, out var list)) directoryItems[key.Locality] = list = []; + list.Add(item); + break; + case Reiser4Key.MinorBody when item.Plugin is Reiser4ItemPlugin.Extent or Reiser4ItemPlugin.Tail or Reiser4ItemPlugin.CompressedTail: + break; + default: + return $"item plugin {item.Plugin} with key type {key.Minor} is not supported"; + } + } + foreach (var item in items.Where(static item => item.Key.Minor == Reiser4Key.MinorBody)) { + if (!this.Objects.TryGetValue(item.Key.StatKey, out var owner)) return "a file body has no stat data"; + if (owner.Stat.Kind != Reiser4Stat.Regular) return "a body item belongs to an object that is not a regular file"; + owner.Body.Add(item); + } + foreach (var owner in this.Objects.Values) { + owner.Body.Sort(static (a, b) => a.Key.Offset.CompareTo(b.Key.Offset)); + if (this.BodyProblem(owner) is { } bodyProblem) return bodyProblem; + } + + var byObjectId = this.Objects.Values.Where(static o => o.IsDirectory).GroupBy(static o => o.ObjectId) + .ToDictionary(static g => g.Key, static g => g.ToList()); + foreach (var (directoryId, list) in directoryItems) { + if (!byObjectId.TryGetValue(directoryId, out var owners) || owners.Count != 1) return "directory entries have no directory"; + foreach (var item in list) { + var body = this.ReadBody(item); + if (DecodeEntries(body, item.Key, owners[0].Entries) is { } entryProblem) return entryProblem; + } + } + + if (!this.Objects.TryGetValue(RootStatKey, out var rootObject) || !rootObject.IsDirectory) return "the root directory is missing"; + this.Root = rootObject; + var reached = new HashSet { RootStatKey }; + var walked = new HashSet(); + if (this.WalkNamespace(rootObject, "", 0, reached, walked) is { } nsProblem) return nsProblem; + if (reached.Count != this.Objects.Count) return "the tree holds objects no directory names"; + return null; + } + + private string? BodyProblem(Reiser4Object owner) { + if (owner.Body.Count == 0) return null; + var plugins = owner.Body.Select(static item => item.Plugin).Distinct().ToArray(); + if (plugins.Contains(Reiser4ItemPlugin.CompressedTail) && plugins.Length > 1) + return "a file mixes compressed and plain body items"; + if (plugins.Contains(Reiser4ItemPlugin.CompressedTail)) { + foreach (var item in owner.Body) + if (item.BodyLength < 2) return "a compressed body item is empty"; + return null; + } + ulong expected = 0; + foreach (var item in owner.Body) { + if (item.Key.Offset != expected) return "a file body has a gap or an overlap between items"; + if (item.Plugin == Reiser4ItemPlugin.Tail) { expected += (ulong)item.BodyLength; continue; } + if (item.BodyLength == 0 || item.BodyLength % 16 != 0) return "an extent item is malformed"; + var body = this.ReadBody(item); + for (var at = 0; at < body.Length; at += 16) { + var start = BinaryPrimitives.ReadUInt64LittleEndian(body.AsSpan(at)); + var width = BinaryPrimitives.ReadUInt64LittleEndian(body.AsSpan(at + 8)); + if (width == 0 || start == 1 || start != 0 && (start < 25 || start >= this.BlockCount || width > this.BlockCount - start)) + return "an extent unit lies outside the volume or is unallocated"; + expected = checked(expected + width * BlockSize); + } + } + return null; + } + + private static string? DecodeEntries(byte[] body, Reiser4Key itemKey, List into) { + if (body.Length < 2) return "a directory item is truncated"; + var count = BinaryPrimitives.ReadUInt16LittleEndian(body); + var unitsStart = 2 + count * 26; + if (count == 0 || unitsStart > body.Length) return "a directory item is truncated"; + for (var i = 0; i < count; ++i) { + var header = 2 + i * 26; + var ordering = BinaryPrimitives.ReadUInt64LittleEndian(body.AsSpan(header)); + var objectId = BinaryPrimitives.ReadUInt64LittleEndian(body.AsSpan(header + 8)); + var offset = BinaryPrimitives.ReadUInt64LittleEndian(body.AsSpan(header + 16)); + int unit = BinaryPrimitives.ReadUInt16LittleEndian(body.AsSpan(header + 24)); + int unitEnd = i + 1 < count ? BinaryPrimitives.ReadUInt16LittleEndian(body.AsSpan(header + 26 + 24)) : body.Length; + if (unit < unitsStart || unitEnd < unit + 24 || unitEnd > body.Length) return "a directory unit lies outside its item"; + if (i == 0 && (ordering != itemKey.Ordering || objectId != itemKey.ObjectId || offset != itemKey.Offset)) + return "a directory item's key is not its first entry's"; + var targetWord0 = BinaryPrimitives.ReadUInt64LittleEndian(body.AsSpan(unit)); + var target = Reiser4Key.Of(targetWord0 >> 4, Reiser4Key.MinorStatData, + BinaryPrimitives.ReadUInt64LittleEndian(body.AsSpan(unit + 8)), BinaryPrimitives.ReadUInt64LittleEndian(body.AsSpan(unit + 16)), 0); + byte[] name; + if ((ordering & Reiser4NameKeys.LongNameBit) != 0) { + var stored = body.AsSpan(unit + 24, unitEnd - unit - 24); + var nul = stored.IndexOf((byte)0); + if (nul <= 0) return "a long directory entry has no stored name"; + name = stored[..nul].ToArray(); + } else { + name = Reiser4NameKeys.Unpack(ordering, objectId, offset) ?? []; + if (unitEnd != unit + 24) return "a short directory entry carries a stored name"; + } + if (name.Length == 0 || name.AsSpan().IndexOf((byte)'/') >= 0) return "a directory entry has an invalid name"; + into.Add(new Reiser4DirEntry(ordering, objectId, offset, name, target)); + } + return null; + } + + private string? WalkNamespace(Reiser4Object directory, string path, int depth, HashSet reached, HashSet walked) { + if (depth > 128) return "the namespace is deeper than this reader walks"; + if (!walked.Add(directory.StatKey)) return "a directory is reached through two paths"; + var names = new HashSet(StringComparer.Ordinal); + foreach (var entry in directory.Entries) { + if (entry.IsDot || entry.IsDotDot) continue; + if (!this.Objects.TryGetValue(entry.Target, out var target)) return "a directory entry names a missing object"; + var name = DecodeName(entry.Name); + if (!names.Add(name)) return "a directory holds the same name twice"; + var full = path.Length == 0 ? name : path + "/" + name; + this.Paths.Add((full, entry.Name, target, directory)); + reached.Add(entry.Target); + if (target.IsDirectory && this.WalkNamespace(target, full, depth + 1, reached, walked) is { } problem) return problem; + } + return null; + } + + /// Names are bytes; they are shown as UTF-8 where they are valid UTF-8 and as Latin-1 otherwise. + internal static string DecodeName(byte[] name) { + try { + return new UTF8Encoding(false, true).GetString(name); + } catch (DecoderFallbackException) { + return Encoding.Latin1.GetString(name); + } + } + + // ── Profile ──────────────────────────────────────────────────────────── + + /// A plugin-set member as an object inherits it: its own, else the root's, else the kernel default. + internal ushort Plugin(Reiser4Object? owner, ushort member) { + if (owner is not null && owner.Stat.PluginSet.TryGetValue(member, out var own)) return own; + if (this.Root is { } root && root.Stat.PluginSet.TryGetValue(member, out var inherited)) return inherited; + return member switch { + Reiser4PsetMember.Formatting => 2, + Reiser4PsetMember.Hash => (ushort)Reiser4HashId.R5, + Reiser4PsetMember.Fibration => (ushort)Reiser4FibrationId.Extension1, + Reiser4PsetMember.CompressionMode => (ushort)Reiser4CompressionModeId.Convert, + _ => 0, + }; + } + + // ── File bodies ──────────────────────────────────────────────────────── + + /// The extent units of a file, in logical order: (start, width), start 0 being a hole. + internal IEnumerable<(ulong Start, ulong Width)> ExtentUnits(Reiser4Object file) { + foreach (var item in file.Body.Where(static i => i.Plugin == Reiser4ItemPlugin.Extent)) { + var body = this.ReadBody(item); + for (var at = 0; at < body.Length; at += 16) + yield return (BinaryPrimitives.ReadUInt64LittleEndian(body.AsSpan(at)), BinaryPrimitives.ReadUInt64LittleEndian(body.AsSpan(at + 8))); + } + } + + /// Writes a regular file's logical bytes, holes as zeros, into . + internal long ExtractTo(Reiser4Object file, Stream destination) { + var size = checked((long)file.Stat.Size); + if (file.Stat.Kind != Reiser4Stat.Regular || size == 0) return 0; + long written = 0; + void Zeros(long count) { + Span zero = stackalloc byte[4096]; + zero.Clear(); + while (count > 0) { + var n = (int)Math.Min(zero.Length, count); + destination.Write(zero[..n]); + count -= n; + written += n; + } + } + if (file.Body.Count > 0 && file.Body[0].Plugin == Reiser4ItemPlugin.CompressedTail) { + foreach (var (start, bytes) in this.Clusters(file)) { + if (start >= size) break; + if (start > written) Zeros(start - written); + var take = (int)Math.Min(bytes.Length, size - written); + destination.Write(bytes, 0, take); + written += take; + } + if (written < size) Zeros(size - written); + return written; + } + foreach (var item in file.Body) { + if (written >= size) break; + if (item.Plugin == Reiser4ItemPlugin.Tail) { + var bytes = this.ReadBody(item); + var take = (int)Math.Min(bytes.Length, size - written); + destination.Write(bytes, 0, take); + written += take; + continue; + } + var body = this.ReadBody(item); + for (var at = 0; at < body.Length && written < size; at += 16) { + var start = BinaryPrimitives.ReadUInt64LittleEndian(body.AsSpan(at)); + var width = BinaryPrimitives.ReadUInt64LittleEndian(body.AsSpan(at + 8)); + var bytes = (long)Math.Min((ulong)(size - written), width * BlockSize); + if (start == 0) { Zeros(bytes); continue; } + this.CopyBlocks(start, width, destination, bytes); + written += bytes; + } + } + if (written < size) Zeros(size - written); + return written; + } + + /// The cluster shift of a cryptcompress file, from its body items. + internal int ClusterShift(Reiser4Object file) => this.ReadBlock(file.Body[0].Block)[file.Body[0].BodyOffset]; + + /// + /// Each present logical cluster of a cryptcompress file: its start and its decoded bytes. Absent + /// clusters are holes. + /// + internal IEnumerable<(long Start, byte[] Bytes)> Clusters(Reiser4Object file) { + var size = (long)file.Stat.Size; + var compression = (Reiser4CompressionId)this.Plugin(file, Reiser4PsetMember.Compression); + foreach (var (index, shift, disk) in this.DiskClusters(file)) { + var start = index << shift; + if (start >= size) yield break; + var logical = (int)Math.Min(1L << shift, size - start); + yield return (start, Reiser4Clusters.Decode(disk, logical, compression)); + } + } + + /// Each disk cluster of a cryptcompress file as stored: index, shift and bytes. + internal IEnumerable<(long Index, int Shift, byte[] Disk)> DiskClusters(Reiser4Object file) { + using var current = new MemoryStream(); + long index = -1; + var shift = 0; + ulong expected = 0; + foreach (var item in file.Body) { + var body = this.ReadBody(item); + var itemShift = body[0]; + if (itemShift is < 12 or > 16) throw new InvalidDataException("Reiser4: a compressed body item names an unsupported cluster size."); + var itemIndex = (long)(item.Key.Offset >> itemShift); + if (itemIndex != index) { + if (index >= 0) yield return (index, shift, current.ToArray()); + if (item.Key.Offset != (ulong)itemIndex << itemShift) + throw new InvalidDataException("Reiser4: a disk cluster does not start at its cluster's offset."); + current.SetLength(0); + index = itemIndex; + shift = itemShift; + expected = item.Key.Offset; + } else if (itemShift != shift || item.Key.Offset != expected) + throw new InvalidDataException("Reiser4: a disk cluster's items are not contiguous."); + current.Write(body, 1, body.Length - 1); + expected += (ulong)(body.Length - 1); + } + if (index >= 0) yield return (index, shift, current.ToArray()); + } + + /// Physical byte runs that hold a regular file's extent data. + internal IEnumerable<(long Offset, long Length)> DataRuns(Reiser4Object file) { + var remaining = (long)file.Stat.Size; + foreach (var (start, width) in this.ExtentUnits(file)) { + if (remaining <= 0) yield break; + var bytes = (long)Math.Min((ulong)remaining, width * BlockSize); + if (start != 0) yield return ((long)start * BlockSize, bytes); + remaining -= bytes; + } + } + + public void Dispose() => this._image.Dispose(); + + /// Recomputes a node41 checksum in place. + internal static void SealNode41(Span node) => BinaryPrimitives.WriteUInt32LittleEndian(node[28..], NodeChecksum(node)); + + /// Recomputes a bitmap block's leading adler32. + internal static void SealBitmap(Span bitmap) => BinaryPrimitives.WriteUInt32LittleEndian(bitmap, Adler32.Compute(bitmap[4..])); +} diff --git a/Hawkynt.FileFormats.FileSystems/FileSystems/FileSystem.Reiser4/Reiser4Writer.cs b/Hawkynt.FileFormats.FileSystems/FileSystems/FileSystem.Reiser4/Reiser4Writer.cs index 0e5b8e197..83171c2b7 100644 --- a/Hawkynt.FileFormats.FileSystems/FileSystems/FileSystem.Reiser4/Reiser4Writer.cs +++ b/Hawkynt.FileFormats.FileSystems/FileSystems/FileSystem.Reiser4/Reiser4Writer.cs @@ -1,8 +1,5 @@ #pragma warning disable CS1591 -using System.Buffers.Binary; -using System.Reflection; using System.Text; -using Compression.Core.Checksums; using Compression.Core.DiskImage; namespace FileSystem.Reiser4; @@ -10,10 +7,10 @@ namespace FileSystem.Reiser4; /// /// Creator for a Reiser4 filesystem image that starts from what /// mkfs.reiser4 -fffy from reiser4progs 1.2.2 produces and adds -/// directories and regular files through the native tree — stat data and directory -/// entries in leaves, extents in twigs, as many internal levels above them as the -/// tree needs — so that fsck.reiser4 validates the result as -/// "FS is consistent." with or without files. +/// directories, regular files, symbolic links, device nodes, FIFOs, sockets and hard links +/// through the native tree — stat data, directory entries and tails in leaves, extents in twigs, +/// as many internal levels above them as the tree needs — so that fsck.reiser4 validates +/// the result as "FS is consistent." and a Reiser4 kernel mounts and reads it. /// /// /// The image holds 25 reserved blocks at fixed positions (block size = 4 KB): @@ -22,33 +19,20 @@ namespace FileSystem.Reiser4; /// 16 — master superblock ("ReIsEr4" at offset 65536). /// 17 — format40 superblock ("ReIsEr40FoRmAt" at offset 52). /// 18 — block-allocator bitmap (4-byte adler32 + bit array). -/// 19..20 — journal header / footer (zero for an empty FS). +/// 19..20 — journal header / footer (zero for an unjournalled volume). /// 21 — status block ("ReiSeR4StATusBl"). /// 22 — superblock backup record. -/// 23 — storage-tree root (twig, level 2). -/// 24 — leaf containing the root-directory stat-data + ".", "..". +/// 23 — storage-tree root (twig, level 2, or higher). +/// 24 — first leaf (the root directory's stat data and entries). /// /// /// /// -/// Implementation strategy: we embed the seven non-zero reference blocks as -/// resources captured byte-exact from a real mkfs.reiser4 image, then -/// patch in only the per-image fields: -/// -/// -/// UUID (16 bytes, random) -/// Label (≤ 16 bytes, optional) -/// mkfs_id (4 bytes, random) — appears in 4 places: format40 -/// SB, backup record, twig header, leaf header. -/// block_count / free_blocks (in format40 SB and backup). -/// Bitmap (block 18) — bits 0..24 set for the 25 reserved -/// blocks plus filler bits for the unused tail of the bitmap range, then -/// adler32 of the bitmap data prepended. -/// -/// -/// -/// Round-trips with fsck.reiser4 -y exit 0 and produces output identical -/// to the reference image except for the random fields above. +/// The fixed blocks are byte-exact captures of a real mkfs.reiser4 image with only the +/// per-image fields patched in: UUID, label, mkfs id, block and free-block counts, the root, the +/// next object id, the file count and the tree height. Regular files are written as extents by +/// default; selects tails, the kernel's smart policy or compressed +/// (cryptcompress) files instead. /// /// public sealed class Reiser4Writer { @@ -62,65 +46,12 @@ public sealed class Reiser4Writer { /// reference capture and avoid bitmap-truncation edge cases. public const ulong MinBlockCount = 4096; - /// Number of blocks the empty filesystem permanently occupies - /// (jump area + master + format40 + bitmap + journal pair + status + backup - /// + twig root + leaf). private const ulong ReservedBlockCount = 25; - // Field offsets — captured by inspecting the reference image with xxd. - private const int MasterMagicOff = 0; // "ReIsEr4" - private const int MasterFormatOff = 16; // d16 disk plugin id (= 0) - private const int MasterBlksizeOff = 18; // d16 = 4096 - private const int MasterUuidOff = 20; // 16 bytes - private const int MasterLabelOff = 36; // 16 bytes - - private const int F40BlockCountOff = 0; - private const int F40FreeBlocksOff = 8; - private const int F40RootBlockOff = 16; - private const int F40OidNextOff = 24; - private const int F40OidFileCountOff = 32; - private const int F40FlushesOff = 40; - private const int F40MkfsIdOff = 48; - private const int F40MagicOff = 52; // "ReIsEr40FoRmAt" - private const int F40TreeHeightOff = 68; - private const int F40PolicyOff = 70; - private const int F40FlagsOff = 72; - private const int F40VersionOff = 80; - - // Backup record (block 22) — packed format-specific struct (not a direct copy of - // master + format40 SBs). Reverse-engineered from the reference image: - // 0x00 pad (1 byte) - // 0x01-0x10 master ms_magic[16] ("ReIsEr4" + zeros) - // 0x11-0x12 master ms_format (d16 = 0) - // 0x13-0x14 master ms_blksize (d16 LE = 4096 → 00 10) - // 0x15-0x24 master ms_uuid[16] - // 0x25-0x34 master ms_label[16] - // 0x35-0x3C reserved zeros - // 0x3D-0x4C format40 sb_magic[16] ("ReIsEr40FoRmAt" + 2 NUL) - // 0x4D-0x54 sb_block_count (d64) - // 0x55-0x58 sb_mkfs_id (d32) - // 0x59-0x5A sb_policy (d16) - // 0x5B-0x62 sb_flags (d64) - // 0x63-0x6F more — including a "PsEt" magic at 0x6F (PSET = plugin-set sentinel) - // Note: backup struct does NOT carry sb_free_blocks — only block_count. - private const int BackupUuidOff = 0x15; // 21 - private const int BackupBlkSizeOff = 0x13; // 19 — d16 (was master+18) - private const int BackupLabelOff = 0x25; // 37 - private const int BackupF40BlockCountOff = 0x4D; // 77 — d64 - private const int BackupF40MkfsIdOff = 0x55; // 85 — d32 - - // Tree-node header offsets — same for twig (block 23) and leaf (block 24). - private const int NodeMkfsIdOff = 12; // d32 - - /// The root directory's own object id, and the locality above it. - /// Fixed: the tree this writer starts from is a byte-exact mkfs capture. - private const ulong RootLocality = 0x29; - private const ulong RootObjectId = 0x2a; - - // Bitmap (block 18) - private const int BitmapAdlerOff = 0; // d32 adler32 over bytes 4..4095 - private const int BitmapDataOff = 4; - private const int BitmapDataLength = BlockSize - 4; // 4092 bytes = 32736 bits + private const int MasterUuidOff = 20; + private const int MasterLabelOff = 36; + private const int BackupUuidOff = 0x15; + private const int BackupLabelOff = 0x25; /// Customisable label written to the master SB (NUL-padded to 16 /// bytes; longer strings are truncated; null = empty/zero). @@ -137,13 +68,11 @@ public sealed class Reiser4Writer { /// .
/// Opens the raw virtual disk content as a seekable read/write stream. /// Uses format-specific stream wrappers (VhdStream, VhdxStream, etc.) that diff --git a/Compression.NativeUI/ViewModels/MainViewModel.cs b/Compression.NativeUI/ViewModels/MainViewModel.cs index 1ded0cc36..af0a2ada9 100644 --- a/Compression.NativeUI/ViewModels/MainViewModel.cs +++ b/Compression.NativeUI/ViewModels/MainViewModel.cs @@ -2074,8 +2074,10 @@ internal void HandleFileDrop(string[] files) { // Per-file + cumulative-size check via optional constraints. if (ops is Compression.Registry.IArchiveWriteConstraints constraints) { long cumulative = 0; + // The entry lands in the folder being browsed, as AddFilesToArchiveImpl names it. + var folderPrefix = _currentFolder.Length > 0 ? _currentFolder.TrimEnd('/') + "/" : ""; foreach (var path in files) { - var entryName = System.IO.Path.GetFileName(path); + var entryName = folderPrefix + System.IO.Path.GetFileName(path); var size = new FileInfo(path).Exists ? new FileInfo(path).Length : 0; cumulative += size; var input = new Compression.Registry.ArchiveInputInfo(path, entryName, IsDirectory: false); diff --git a/Compression.NativeUI/Views/PartitionsWindow.cs b/Compression.NativeUI/Views/PartitionsWindow.cs index 2a1f78f7c..5005e789f 100644 --- a/Compression.NativeUI/Views/PartitionsWindow.cs +++ b/Compression.NativeUI/Views/PartitionsWindow.cs @@ -268,8 +268,8 @@ private void RefreshGrid() { var partitions = editor.ListPartitions(); var rows = partitions.Select(p => { - var startLba = p.StartOffset / PartitionEditor.SectorSize; - var endLba = (p.StartOffset + p.Size) / PartitionEditor.SectorSize - 1; + var startLba = p.StartOffset / editor.LogicalSectorSize; + var endLba = (p.StartOffset + p.Size) / editor.LogicalSectorSize - 1; return new PartitionRow { Index = p.Index, IndexDisplay = p.Index.ToString(), diff --git a/Compression.Tests/DiskImage/PartitionSchemeDetectionTests.cs b/Compression.Tests/DiskImage/PartitionSchemeDetectionTests.cs new file mode 100644 index 000000000..f0c73bd31 --- /dev/null +++ b/Compression.Tests/DiskImage/PartitionSchemeDetectionTests.cs @@ -0,0 +1,317 @@ +#pragma warning disable CS1591 +using System.Buffers.Binary; +using Compression.Core.DiskImage; + +namespace Compression.Tests.DiskImage; + +/// +/// Partition schemes beyond the classic 512-byte MBR/GPT: 4Kn GPT, GPT recovery from the backup +/// header, protective/hybrid MBRs, EBR chains, and the checksummed labels of SGI, Sun, BSD and +/// Amiga. The labels here are laid out field by field from the scheme's specification; the +/// external fixture checks the same readers against labels parted and sfdisk write. +/// +[TestFixture] +public class PartitionSchemeDetectionTests { + + [SetUp] + public void EnsureRegistered() => Compression.Lib.FormatRegistration.EnsureInitialized(); + + /// A zeroed, writable stream whose buffer the test may patch through GetBuffer. + private static MemoryStream Buffered(long length) { + var bytes = new byte[length]; + return new MemoryStream(bytes, 0, bytes.Length, writable: true, publiclyVisible: true); + } + + private static MemoryStream GptDisk(int sectorSize, long sectors, params (long Start, long Length)[] parts) { + var ms = Buffered(sectors * sectorSize); + var editor = PartitionEditor.CreateEmpty(ms, PartitionScheme.Gpt, sectorSize); + foreach (var (start, length) in parts) + editor.AddPartition(start * sectorSize, length * sectorSize, PartitionType.Linux, "p"); + return ms; + } + + // ── GPT ──────────────────────────────────────────────────────────── + + [TestCase(512)] + [TestCase(4096)] + [Category("HappyPath")] + public void Given_GptAtBlockSize_When_Detected_Then_SectorSizeAndOffsetsFollowIt(int sectorSize) { + using var disk = GptDisk(sectorSize, 4096, (256, 512)); + var head = disk.ToArray().AsSpan(0, GptParser.ProbeBytes); + + Assert.That(GptParser.DetectSectorSize(head), Is.EqualTo(sectorSize)); + var detection = PartitionTableDetector.Detect(disk); + Assert.That(detection.Scheme, Is.EqualTo("GPT")); + Assert.That(detection.SectorSize, Is.EqualTo(sectorSize)); + Assert.That(detection.Partitions.Single().StartOffset, Is.EqualTo(256L * sectorSize)); + Assert.That(detection.Partitions.Single().Size, Is.EqualTo(512L * sectorSize)); + } + + [Test, Category("HappyPath")] + public void Given_4KnGpt_When_Written_Then_EntryArrayTakesFourBlocksAndUsableRangeFollows() { + using var disk = GptDisk(4096, 1024); + var info = GptParser.ReadHeader(disk)!; + Assert.That(info.SectorSize, Is.EqualTo(4096)); + Assert.That(info.FirstUsableLba, Is.EqualTo(6UL), "LBA0 MBR + LBA1 header + 4 blocks of 128x128-byte entries"); + Assert.That(info.LastUsableLba, Is.EqualTo(1024UL - 6), "backup array (4) + backup header (1) at the end"); + Assert.That(info.AlternateLba, Is.EqualTo(1023UL)); + } + + [Test, Category("Boundary")] + public void Given_GptPartitionEndingAtLastUsableLba_When_Added_Then_AcceptedButOneMoreSectorRefused() { + using var disk = GptDisk(512, 2048); + var editor = new PartitionEditor(disk); + var lastUsable = 2048 - 34; // 32 backup-array sectors + backup header, then the LBA before + Assert.That(() => editor.AddPartition(1024L * 512, (lastUsable - 1024 + 2) * 512L, PartitionType.Linux, null), + Throws.InvalidOperationException, "would run into the backup entry array"); + editor.AddPartition(1024L * 512, (lastUsable - 1024 + 1) * 512L, PartitionType.Linux, null); + Assert.That(editor.Verify().IsValid, Is.True, string.Join("; ", editor.Verify().Issues)); + Assert.That(() => editor.AddPartition(33L * 512, 8 * 512, PartitionType.Linux, null), + Throws.InvalidOperationException, "LBA 33 is the primary entry array"); + } + + [Test, Category("Boundary")] + public void Given_GptWith128Entries_When_129thAdded_Then_Refused() { + using var disk = GptDisk(512, 34 + 128 + 34 + 8); + var editor = new PartitionEditor(disk); + for (var i = 0; i < 128; ++i) + editor.AddPartition((34L + i) * 512, 512, PartitionType.Linux, null); + Assert.That(PartitionTableDetector.Detect(disk).Partitions, Has.Count.EqualTo(128)); + Assert.That(() => editor.AddPartition((34L + 128) * 512, 512, PartitionType.Linux, null), Throws.InvalidOperationException); + } + + [Test, Category("ErrorHandling")] + public void Given_PrimaryHeaderCrcBroken_When_Parsed_Then_TheBackupHeaderIsUsed() { + using var disk = GptDisk(512, 4096, (2048, 1024)); + disk.Position = 512 + 40; // FirstUsableLBA inside the primary header: breaks its CRC + disk.WriteByte(0x77); + + var detection = PartitionTableDetector.Detect(disk); + Assert.That(detection.Scheme, Is.EqualTo("GPT")); + Assert.That(detection.Partitions.Single().StartOffset, Is.EqualTo(2048L * 512)); + Assert.That(GptParser.ReadHeader(disk)!.FromBackup, Is.True); + } + + [Test, Category("ErrorHandling")] + public void Given_PrimaryEntryArrayCorrupted_When_Parsed_Then_TheBackupArrayIsUsed() { + using var disk = GptDisk(512, 4096, (2048, 1024)); + disk.Position = 2 * 512 + 32; // first entry's FirstLBA + disk.Write(new byte[8]); + + var part = PartitionTableDetector.Detect(disk).Partitions.Single(); + Assert.That(part.StartOffset, Is.EqualTo(2048L * 512)); + } + + [Test, Category("ErrorHandling")] + public void Given_BothGptHeadersBroken_When_Detected_Then_NoTableAndNoProtectiveEntryListed() { + using var disk = GptDisk(512, 4096, (2048, 1024)); + disk.Position = 512 + 40; disk.WriteByte(0x77); + disk.Position = 4095L * 512 + 40; disk.WriteByte(0x77); + disk.Position = 512; disk.Write(new byte[8]); // and no signature for the lenient reading either + + var detection = PartitionTableDetector.Detect(disk); + Assert.That(detection.Partitions, Is.Empty, "a protective 0xEE entry describes the GPT, not data"); + } + + [Test, Category("EdgeCase")] + public void Given_HybridMbr_When_Detected_Then_GptWins() { + using var disk = GptDisk(512, 4096, (2048, 1024)); + // Hybrid: a real MBR entry mirroring the GPT partition beside the 0xEE entry. + var entry = disk.GetBuffer().AsSpan(0x1BE + 16, 16); + entry[4] = 0x83; + BinaryPrimitives.WriteUInt32LittleEndian(entry[8..], 2048); + BinaryPrimitives.WriteUInt32LittleEndian(entry[12..], 1024); + + var detection = PartitionTableDetector.Detect(disk); + Assert.That(detection.Scheme, Is.EqualTo("GPT")); + Assert.That(detection.Partitions.Single().Source, Is.EqualTo("GPT")); + } + + [Test, Category("EdgeCase")] + public void Given_GptEntryWithInvertedRange_When_Parsed_Then_Skipped() { + using var disk = GptDisk(512, 4096, (2048, 1024), (3072, 16)); + // Invert the second entry and recompute both CRCs through a re-read of the editor's own layout. + var bytes = disk.GetBuffer(); + var slot = bytes.AsSpan(2 * 512 + 128, 128); + BinaryPrimitives.WriteUInt64LittleEndian(slot[40..], 100); // LastLBA < FirstLBA + FixGptCrcs(bytes, 512, 4096); + + Assert.That(PartitionTableDetector.Detect(disk).Partitions, Has.Count.EqualTo(1)); + } + + private static void FixGptCrcs(byte[] disk, int sectorSize, long sectors) { + foreach (var headerLba in new[] { 1L, sectors - 1 }) { + var header = disk.AsSpan((int)(headerLba * sectorSize), 92); + var entriesLba = BinaryPrimitives.ReadUInt64LittleEndian(header[72..]); + var count = BinaryPrimitives.ReadUInt32LittleEndian(header[80..]); + var size = BinaryPrimitives.ReadUInt32LittleEndian(header[84..]); + if (headerLba != 1) // keep the backup array identical to the primary + disk.AsSpan(2 * sectorSize, (int)(count * size)).CopyTo(disk.AsSpan((int)((long)entriesLba * sectorSize))); + var crc = Compression.Core.Checksums.Crc32.Compute(disk.AsSpan((int)((long)entriesLba * sectorSize), (int)(count * size))); + BinaryPrimitives.WriteUInt32LittleEndian(header[88..], crc); + header.Slice(16, 4).Clear(); + BinaryPrimitives.WriteUInt32LittleEndian(header[16..], Compression.Core.Checksums.Crc32.Compute(header)); + } + } + + // ── MBR / EBR ────────────────────────────────────────────────────── + + [Test, Category("HappyPath")] + public void Given_ExtendedPartitionWithTwoLogicals_When_Detected_Then_BothLogicalsListedAtTheirAbsoluteOffsets() { + using var disk = Buffered(8192 * 512); + var editor = PartitionEditor.CreateEmpty(disk, PartitionScheme.Mbr); + editor.AddPartition(2048L * 512, 6000L * 512, PartitionType.ExtendedLba, null); + editor.AddLogicalPartition(2049L * 512, 1000L * 512, PartitionType.Linux, null); + editor.AddLogicalPartition(4000L * 512, 1000L * 512, PartitionType.Fat32Lba, null); + + var parts = PartitionTableDetector.Detect(disk).Partitions; + Assert.That(parts.Select(p => (p.Source, p.StartOffset)), + Is.EqualTo(new[] { ("EBR", 2049L * 512), ("EBR", 4000L * 512) })); + } + + [Test, Category("ErrorHandling")] + public void Given_EbrChainThatLoops_When_Detected_Then_TheWalkStops() { + using var disk = Buffered(8192 * 512); + var editor = PartitionEditor.CreateEmpty(disk, PartitionScheme.Mbr); + editor.AddPartition(2048L * 512, 6000L * 512, PartitionType.ExtendedLba, null); + editor.AddLogicalPartition(2049L * 512, 1000L * 512, PartitionType.Linux, null); + // Point the first EBR's link back at itself. + var link = disk.GetBuffer().AsSpan(2048 * 512 + 0x1BE + 16, 16); + link[4] = 0x05; + BinaryPrimitives.WriteUInt32LittleEndian(link[8..], 0); + BinaryPrimitives.WriteUInt32LittleEndian(link[12..], 1); + + Assert.That(PartitionTableDetector.Detect(disk).Partitions, Has.Count.EqualTo(1)); + } + + // ── SGI / Sun / BSD / Amiga ──────────────────────────────────────── + + [Test, Category("HappyPath")] + public void Given_SgiVolumeHeader_When_Detected_Then_PartitionsListedWithoutTheWholeVolume() { + var disk = new byte[8 * 1024 * 1024]; + var s = disk.AsSpan(0, 512); + BinaryPrimitives.WriteUInt32BigEndian(s, 0x0BE5A941); + void Part(int slot, uint blocks, uint first, uint type) { + var r = disk.AsSpan(312 + slot * 12); + BinaryPrimitives.WriteUInt32BigEndian(r, blocks); + BinaryPrimitives.WriteUInt32BigEndian(r[4..], first); + BinaryPrimitives.WriteUInt32BigEndian(r[8..], type); + } + Part(0, 4096, 2048, 0x83); + Part(8, 2048, 0, 0); // volume header + Part(10, 16384, 0, 6); // whole volume + uint sum = 0; + for (var i = 0; i < 512; i += 4) sum += BinaryPrimitives.ReadUInt32BigEndian(s[i..]); + BinaryPrimitives.WriteUInt32BigEndian(s[504..], unchecked(0u - sum)); + + var detection = PartitionTableDetector.Detect(disk); + Assert.That(detection.Scheme, Is.EqualTo("SGI")); + Assert.That(detection.Partitions.Select(p => (p.StartOffset, p.Size)), + Is.EqualTo(new[] { (2048L * 512, 4096L * 512), (0L, 2048L * 512) })); + using var ms = new MemoryStream(disk); + Assert.That(PartitionTableDetector.HasSelfValidatingLabel(ms), Is.True); + + disk[400] ^= 1; // checksum now wrong + Assert.That(PartitionTableDetector.Detect(disk).Scheme, Is.EqualTo("None")); + } + + [Test, Category("HappyPath")] + public void Given_SunLabel_When_Detected_Then_SlicesPlacedByCylinderGeometry() { + var disk = new byte[16 * 1024 * 1024]; + var s = disk.AsSpan(0, 512); + BinaryPrimitives.WriteUInt32BigEndian(s[128..], 1); // vtoc version + BinaryPrimitives.WriteUInt16BigEndian(s[140..], 8); // nparts + BinaryPrimitives.WriteUInt16BigEndian(s[142..], 0x83); // slice a: Linux native + BinaryPrimitives.WriteUInt16BigEndian(s[150..], 5); // slice c: whole disk + BinaryPrimitives.WriteUInt32BigEndian(s[188..], 0x600DDEEE); // vtoc sanity + BinaryPrimitives.WriteUInt16BigEndian(s[436..], 16); // ntrks + BinaryPrimitives.WriteUInt16BigEndian(s[438..], 63); // nsect + BinaryPrimitives.WriteUInt32BigEndian(s[444..], 2); // a: start cylinder 2 + BinaryPrimitives.WriteUInt32BigEndian(s[448..], 1008 * 5); + BinaryPrimitives.WriteUInt32BigEndian(s[464..], 1008 * 32); + BinaryPrimitives.WriteUInt16BigEndian(s[508..], 0xDABE); + ushort xor = 0; + for (var i = 0; i < 510; i += 2) xor ^= BinaryPrimitives.ReadUInt16BigEndian(s[i..]); + BinaryPrimitives.WriteUInt16BigEndian(s[510..], xor); + + var detection = PartitionTableDetector.Detect(disk); + Assert.That(detection.Scheme, Is.EqualTo("Sun")); + var part = detection.Partitions.Single(); + Assert.That(part.StartOffset, Is.EqualTo(2L * 16 * 63 * 512)); + Assert.That(part.Size, Is.EqualTo(1008L * 5 * 512)); + } + + [Test, Category("HappyPath")] + public void Given_StandaloneBsdDisklabel_When_Detected_Then_SlicesListedFromTheWholeDisk() { + var disk = new byte[8 * 1024 * 1024]; + var l = disk.AsSpan(512, 148 + 8 * 16); + BinaryPrimitives.WriteUInt32LittleEndian(l, 0x82564557); + BinaryPrimitives.WriteUInt32LittleEndian(l[40..], 512); + BinaryPrimitives.WriteUInt32LittleEndian(l[132..], 0x82564557); + BinaryPrimitives.WriteUInt16LittleEndian(l[138..], 8); + void Part(int slot, uint size, uint offset, byte fstype) { + var r = disk.AsSpan(512 + 148 + slot * 16); + BinaryPrimitives.WriteUInt32LittleEndian(r, size); + BinaryPrimitives.WriteUInt32LittleEndian(r[4..], offset); + r[12] = fstype; + } + Part(0, 4096, 64, 7); // a: 4.2BSD + Part(1, 2048, 4160, 1); // b: swap + Part(2, 16384, 0, 0); // c: whole disk + ushort xor = 0; + for (var i = 0; i < l.Length; i += 2) xor ^= BinaryPrimitives.ReadUInt16LittleEndian(l[i..]); + BinaryPrimitives.WriteUInt16LittleEndian(l[136..], xor); + + var detection = PartitionTableDetector.Detect(disk); + Assert.That(detection.Scheme, Is.EqualTo("BSD")); + Assert.That(detection.Partitions.Select(p => (p.Name, p.StartOffset)), + Is.EqualTo(new[] { ("a", 64L * 512), ("b", 4160L * 512) })); + + disk[512 + 132] ^= 1; + Assert.That(PartitionTableDetector.Detect(disk).Scheme, Is.EqualTo("None"), "without d_magic2 the label proves nothing"); + } + + [Test, Category("HappyPath")] + public void Given_AmigaRigidDiskBlock_When_Detected_Then_PartitionsPlacedByDosEnvecGeometry() { + var disk = new byte[16 * 1024 * 1024]; + void Checksum(Span block) { + var longs = BinaryPrimitives.ReadUInt32BigEndian(block[4..]); + block.Slice(8, 4).Clear(); + uint sum = 0; + for (var i = 0; i < longs; ++i) sum += BinaryPrimitives.ReadUInt32BigEndian(block[(i * 4)..]); + BinaryPrimitives.WriteUInt32BigEndian(block[8..], unchecked(0u - sum)); + } + var rdb = disk.AsSpan(1 * 512, 512); // RDSK in block 1 + BinaryPrimitives.WriteUInt32BigEndian(rdb, 0x5244534B); + BinaryPrimitives.WriteUInt32BigEndian(rdb[4..], 64); + BinaryPrimitives.WriteUInt32BigEndian(rdb[16..], 512); + BinaryPrimitives.WriteUInt32BigEndian(rdb[24..], 0xFFFFFFFF); + BinaryPrimitives.WriteUInt32BigEndian(rdb[28..], 3); // partition list → block 3 + BinaryPrimitives.WriteUInt32BigEndian(rdb[32..], 0xFFFFFFFF); + Checksum(rdb); + + var part = disk.AsSpan(3 * 512, 512); + BinaryPrimitives.WriteUInt32BigEndian(part, 0x50415254); + BinaryPrimitives.WriteUInt32BigEndian(part[4..], 64); + BinaryPrimitives.WriteUInt32BigEndian(part[16..], 0xFFFFFFFF); // no next + part[36] = 3; "DH0"u8.CopyTo(part[37..]); + void Env(int i, uint v) => BinaryPrimitives.WriteUInt32BigEndian(disk.AsSpan(3 * 512 + 128 + i * 4), v); + Env(0, 16); Env(1, 128); Env(3, 2); Env(5, 32); Env(9, 4); Env(10, 99); Env(16, 0x444F5301); + Checksum(part); + + var detection = PartitionTableDetector.Detect(disk); + Assert.That(detection.Scheme, Is.EqualTo("RDB")); + var p = detection.Partitions.Single(); + Assert.That(p.Name, Is.EqualTo("DH0")); + Assert.That(p.TypeName, Is.EqualTo("DOS1")); + Assert.That(p.StartOffset, Is.EqualTo(4L * 2 * 32 * 512)); + Assert.That(p.Size, Is.EqualTo(96L * 2 * 32 * 512)); + } + + [Test, Category("EdgeCase")] + public void Given_ZeroedDisk_When_Detected_Then_NoSchemeClaimsIt() { + Assert.That(PartitionTableDetector.Detect(new byte[1024 * 1024]).Scheme, Is.EqualTo("None")); + using var ms = new MemoryStream(new byte[1024 * 1024]); + Assert.That(PartitionTableDetector.HasSelfValidatingLabel(ms), Is.False); + } +} diff --git a/Compression.Tests/DiskImage/PartitionedDiskExternalTests.cs b/Compression.Tests/DiskImage/PartitionedDiskExternalTests.cs new file mode 100644 index 000000000..538c46dc2 --- /dev/null +++ b/Compression.Tests/DiskImage/PartitionedDiskExternalTests.cs @@ -0,0 +1,258 @@ +#pragma warning disable CS1591 +using System.Globalization; +using Compression.Core.DiskImage; +using Compression.Registry; +using FileFormat.PartitionedDisk; + +namespace Compression.Tests.DiskImage; + +/// +/// The partitioned-disk reader and writer against the reference Linux tools: tables written here +/// must pass sgdisk -v / sfdisk --verify and read back in parted; filesystems +/// edited in place inside a partition must pass fsck.vfat / e2fsck; and the +/// tables sfdisk, fdisk -b 4096 and parted (bsd, amiga, sun, dvh) write must +/// be read at the offsets those tools report. Skipped when WSL (or, off Windows, a tool) is missing. +/// +[TestFixture] +[Category("ExternalFsInterop")] +public class PartitionedDiskExternalTests { + + private static readonly PartitionedDiskFormatDescriptor Desc = new(); + private string _dir = null!; + + [SetUp] + public void SetUp() { + Compression.Lib.FormatRegistration.EnsureInitialized(); + this._dir = Path.Combine(Path.GetTempPath(), "cwb_pdisk_ext_" + Guid.NewGuid().ToString("N")[..10]); + Directory.CreateDirectory(this._dir); + } + + [TearDown] + public void TearDown() { + try { Directory.Delete(this._dir, recursive: true); } catch { /* best effort */ } + } + + private static void RequireTools(params string[] tools) { + if (!FsInteropToolbox.WslAvailable) Assert.Ignore("WSL is not available."); + foreach (var tool in tools) + if (!FsInteropToolbox.WslHasTool(tool)) + Assert.Ignore($"'{tool}' is not installed in the WSL distro."); + } + + /// Runs a bash script in the fixture directory; returns stdout+stderr, asserting success unless told otherwise. + private string Bash(string script, bool mustSucceed = true) { + var dir = FsInteropToolbox.WinToWsl(this._dir); + var result = FsInteropToolbox.RunWsl($"set -e; export LC_ALL=C; cd {dir}; {script}"); + var output = result.StdOut + result.StdErr; + if (mustSucceed) + Assert.That(result.ExitCode, Is.EqualTo(0), $"script failed:\n{script}\n{output}"); + return output; + } + + private string PathOf(string name) => Path.Combine(this._dir, name); + + private static FormatCreateOptions Options(string scheme, int sectorSize = 512) => new() { + FormatSpecific = new(StringComparer.OrdinalIgnoreCase) { + ["scheme"] = scheme, ["sectorSize"] = sectorSize.ToString(CultureInfo.InvariantCulture), + }, + }; + + private void CreateDisk(string disk, string scheme, int sectorSize, params string[] images) { + using var fs = File.Create(this.PathOf(disk)); + Desc.Create(fs, [.. images.Select(i => new ArchiveInputInfo(this.PathOf(i), i, false))], Options(scheme, sectorSize)); + } + + /// Partition (start, size) in bytes as parted -m unit B print reports them. + private List<(long Start, long Size)> PartedLayout(string disk) { + var output = this.Bash($"parted -s -m {disk} unit B print"); + var result = new List<(long, long)>(); + foreach (var line in output.Split('\n')) { + var f = line.Trim().Split(':'); + if (f.Length < 4 || !int.TryParse(f[0], out _)) continue; + result.Add((long.Parse(f[1].TrimEnd('B'), CultureInfo.InvariantCulture), + long.Parse(f[3].TrimEnd('B'), CultureInfo.InvariantCulture))); + } + return result; + } + + // ── Create, verified by the table tools and fsck ─────────────────── + + [Test] + public void Given_VfatAndExt4Images_When_CreatedAsGpt_Then_SgdiskSfdiskPartedAndFsckAgree() { + RequireTools("sgdisk", "sfdisk", "parted", "mkfs.vfat", "fsck.vfat", "mkfs.ext4", "e2fsck", "mcopy"); + this.Bash( + "echo dos > dos.txt; mkdir -p root && echo linux > root/linux.txt; " + + "mkfs.vfat -C a.img 8192 >/dev/null; mcopy -i a.img dos.txt ::/DOS.TXT; " + + "truncate -s 12M b.img; mkfs.ext4 -q -F -d root b.img"); + + this.CreateDisk("disk.img", "gpt", 512, "a.img", "b.img"); + + var sgdisk = this.Bash("sgdisk -v disk.img"); + Assert.That(sgdisk, Does.Contain("No problems found"), sgdisk); + var sfdisk = this.Bash("sfdisk --verify disk.img"); + Assert.That(sfdisk, Does.Contain("No errors detected"), sfdisk); + + var layout = this.PartedLayout("disk.img"); + var ours = PartitionTableDetector.Detect(File.ReadAllBytes(this.PathOf("disk.img"))).Partitions; + Assert.That(layout, Is.EqualTo(ours.Select(p => (p.StartOffset, p.Size)).ToList())); + Assert.That(layout[0].Start, Is.EqualTo(1024 * 1024)); + + var p1 = ours[0]; var p2 = ours[1]; + this.Bash( + $"dd if=disk.img of=p1.img bs=512 skip={p1.StartOffset / 512} count={p1.Size / 512} status=none; " + + $"dd if=disk.img of=p2.img bs=512 skip={p2.StartOffset / 512} count={p2.Size / 512} status=none; " + + "fsck.vfat -n p1.img; e2fsck -fn p2.img; test \"$(mcopy -i disk.img@@1M ::/DOS.TXT -)\" = dos"); + } + + [Test] + public void Given_VfatImage_When_CreatedAsMbr_Then_SfdiskVerifiesAndTheTypeIsFat32() { + RequireTools("sfdisk", "mkfs.vfat", "fsck.vfat", "mcopy"); + this.Bash("echo dos > dos.txt; mkfs.vfat -C a.img 8192 >/dev/null; mcopy -i a.img dos.txt ::/DOS.TXT"); + + this.CreateDisk("disk.img", "mbr", 512, "a.img"); + + var verify = this.Bash("sfdisk --verify disk.img"); + Assert.That(verify, Does.Contain("No errors detected"), verify); + var dump = this.Bash("sfdisk --dump disk.img"); + Assert.That(dump, Does.Contain("label: dos")); + Assert.That(dump, Does.Match(@"start=\s*2048, size=\s*16384, type=c"), dump); + Assert.That(this.Bash("mcopy -i disk.img@@1M ::/DOS.TXT -").Trim(), Is.EqualTo("dos")); + } + + [Test] + public void Given_VfatImage_When_CreatedAs4KnGpt_Then_FdiskWith4096ByteSectorsReadsTheSameLayout() { + RequireTools("fdisk", "mkfs.vfat", "mcopy"); + this.Bash("echo dos > dos.txt; mkfs.vfat -S 4096 -C a.img 8192 >/dev/null; mcopy -i a.img dos.txt ::/DOS.TXT"); + + this.CreateDisk("disk.img", "gpt", 4096, "a.img"); + + var listing = this.Bash("fdisk -b 4096 -l disk.img"); + Assert.That(listing, Does.Contain("Disklabel type: gpt"), listing); + Assert.That(listing, Does.Match(@"disk\.img1\s+256\s+2303\s+2048"), listing); // 1 MiB / 4096 = LBA 256, 8 MiB = 2048 blocks + Assert.That(listing, Does.Not.Contain("corrupt").And.Not.Contain("mismatch"), listing); + Assert.That(this.Bash("mcopy -i disk.img@@1M ::/DOS.TXT -").Trim(), Is.EqualTo("dos")); + } + + // ── Read what the tools write ────────────────────────────────────── + + [Test] + public void Given_FdiskGptAt4096ByteSectors_When_Listed_Then_TheVfatPartitionBrowses() { + RequireTools("fdisk", "mkfs.vfat", "mcopy"); + this.Bash( + "echo dos > dos.txt; truncate -s 24M disk.img; " + + "printf 'g\\nn\\n1\\n256\\n+8M\\nw\\n' | fdisk -b 4096 disk.img >/dev/null; " + + "mkfs.vfat -S 4096 -C p1.img 8192 >/dev/null; mcopy -i p1.img dos.txt ::/DOS.TXT; " + + "dd if=p1.img of=disk.img bs=4096 seek=256 conv=notrunc status=none"); + + var detection = PartitionTableDetector.Detect(File.ReadAllBytes(this.PathOf("disk.img"))); + Assert.That(detection.Scheme, Is.EqualTo("GPT")); + Assert.That(detection.SectorSize, Is.EqualTo(4096)); + Assert.That(detection.Partitions.Single().StartOffset, Is.EqualTo(256L * 4096)); + Assert.That(Compression.Lib.FormatDetector.Detect(this.PathOf("disk.img")).ToString(), Is.EqualTo("PartitionedDisk")); + Assert.That(Compression.Lib.ArchiveOperations.List(this.PathOf("disk.img"), null).Select(e => e.Name), + Has.Some.Match("^Partition1_.*/DOS\\.TXT$")); + } + + [Test] + public void Given_SfdiskExtendedWithLogicals_When_Listed_Then_LogicalsAppearAtSfdiskOffsets() { + RequireTools("sfdisk", "mkfs.vfat", "mcopy"); + this.Bash( + "echo dos > dos.txt; truncate -s 32M disk.img; " + + "printf 'label: dos\\nstart=2048, size=8192, type=83\\nstart=10240, type=5\\nstart=12288, size=8192, type=c\\nstart=22528, size=8192, type=83\\n' | sfdisk -q disk.img; " + + "mkfs.vfat --offset=12288 disk.img 4096 >/dev/null; mcopy -i disk.img@@6M dos.txt ::/DOS.TXT"); + + var dump = this.Bash("sfdisk --dump disk.img"); + var sfdiskStarts = System.Text.RegularExpressions.Regex.Matches(dump, @"start=\s*(\d+), size=\s*(\d+), type=(\w+)") + .Where(m => m.Groups[3].Value != "5") + .Select(m => (long.Parse(m.Groups[1].Value, CultureInfo.InvariantCulture) * 512, long.Parse(m.Groups[2].Value, CultureInfo.InvariantCulture) * 512)) + .ToList(); + var ours = PartitionTableDetector.Detect(File.ReadAllBytes(this.PathOf("disk.img"))).Partitions; + Assert.That(ours.Select(p => (p.StartOffset, p.Size)), Is.EquivalentTo(sfdiskStarts), dump); + Assert.That(ours.Count(p => p.Source == "EBR"), Is.EqualTo(2)); + Assert.That(Compression.Lib.ArchiveOperations.List(this.PathOf("disk.img"), null).Select(e => e.Name), + Has.Some.Match("/DOS\\.TXT$")); + } + + [TestCase("bsd")] + [TestCase("amiga")] + [TestCase("sun")] + [TestCase("dvh")] + public void Given_PartedLabel_When_Detected_Then_PartitionsMatchPartedsOffsets(string label) { + RequireTools("parted"); + // mkpart's leading arguments differ per label: amiga takes a name, dvh a primary/logical + // kind plus a filesystem type, bsd and sun only a filesystem type. + var kind = label switch { "amiga" => "primary", "dvh" => "primary ext2", _ => "ext2" }; + var made = this.Bash( + $"truncate -s 64M disk.img; parted -s disk.img mklabel {label}; " + + $"parted -s disk.img mkpart {kind} 4MiB 24MiB; parted -s disk.img mkpart {kind} 24MiB 44MiB; " + + "xxd -l 1536 disk.img | grep -v ' 0000 0000 0000 0000 0000 0000 0000 0000 '", mustSucceed: false); + var parted = this.PartedLayout("disk.img"); + if (parted.Count == 0) Assert.Ignore($"parted cannot write a {label} label here: {made}"); + + var bytes = File.ReadAllBytes(this.PathOf("disk.img")); + var detection = PartitionTableDetector.Detect(bytes); + var expectedScheme = label switch { "bsd" => "BSD", "amiga" => "RDB", "sun" => "Sun", _ => "SGI" }; + Assert.That(detection.Scheme, Is.EqualTo(expectedScheme), made); + // parted lists the label's bookkeeping slices (SGI volume header, Sun whole-disk) as partitions + // too; every data partition we report must be one parted reports, and each of parted's two + // mkpart partitions must be among ours. + var ours = detection.Partitions.Select(p => (p.StartOffset, p.Size)).ToList(); + Assert.That(parted, Is.SupersetOf(ours.Where(o => parted.Contains(o)))); + var dataPartitions = parted.Where(p => p.Start >= 1024 * 1024 - 64 * 1024 && p.Size >= 16L * 1024 * 1024).ToList(); + Assert.That(dataPartitions, Has.Count.EqualTo(2), $"{string.Join(", ", parted)}\n{made}"); + Assert.That(ours, Is.SupersetOf(dataPartitions), $"ours: {string.Join(", ", ours)}; parted: {string.Join(", ", parted)}"); + + using var ms = new MemoryStream(bytes); + Assert.That(PartitionTableDetector.HasSelfValidatingLabel(ms), Is.True); + Assert.That(Compression.Lib.FormatDetector.Detect(this.PathOf("disk.img")).ToString(), Is.EqualTo("PartitionedDisk")); + } + + // ── Edit in place, verified by fsck ──────────────────────────────── + + [Test] + public void Given_SfdiskGptWithVfatAndExt4_When_FilesEditedInPlace_Then_FsckIsCleanAndTheToolsReadTheEdits() { + RequireTools("sfdisk", "sgdisk", "mkfs.vfat", "fsck.vfat", "mkfs.ext4", "e2fsck", "debugfs", "mcopy"); + this.Bash( + "mkdir -p rootfs && echo linux > rootfs/linux.txt && echo gone > rootfs/gone.txt && echo dos > dos.txt; " + + "truncate -s 24M disk.img; " + + "printf 'label: gpt\\nstart=2048, size=16384, type=EBD0A0A2-B9E5-4433-87C0-68B6B72699C7\\nstart=18432, size=28672, type=0FC63DAF-8483-4772-8E79-3D69D8477DE4\\n' | sfdisk -q disk.img; " + + "mkfs.vfat --offset=2048 disk.img 8192 >/dev/null; mcopy -i disk.img@@1M dos.txt ::/DOS.TXT; " + + "mkfs.ext4 -q -F -d rootfs -E offset=9437184 disk.img 14M"); + + var path = this.PathOf("disk.img"); + var before = File.ReadAllBytes(path); + var parts = PartitionTableDetector.Detect(before).Partitions; + string fat, ext; + using (var fs = new FileStream(path, FileMode.Open, FileAccess.ReadWrite)) { + fat = PartitionedDiskLister.MakePartitionPrefix(parts[0]); + ext = PartitionedDiskLister.MakePartitionPrefix(parts[1]); + Desc.Add(fs, [ + ArchiveInputInfo.InMemory($"{fat}/NEW.TXT", "added to fat\n"u8.ToArray()), + ArchiveInputInfo.InMemory($"{ext}/added.txt", "added to ext4\n"u8.ToArray()), + ]); + Desc.Remove(fs, [$"{ext}/gone.txt"]); + } + + var after = File.ReadAllBytes(path); + Assert.That(after.Length, Is.EqualTo(before.Length)); + // Nothing outside the two partitions moved: table, gaps and backup GPT are byte-identical. + var inside = new bool[after.Length]; + foreach (var p in parts) Array.Fill(inside, true, (int)p.StartOffset, (int)p.Size); + for (var i = 0; i < after.Length; ++i) + if (!inside[i] && after[i] != before[i]) + Assert.Fail($"byte {i} outside the partitions changed"); + + var output = this.Bash( + "sgdisk -v disk.img; " + + $"dd if=disk.img of=p1.img bs=512 skip={parts[0].StartOffset / 512} count={parts[0].Size / 512} status=none; " + + $"dd if=disk.img of=p2.img bs=512 skip={parts[1].StartOffset / 512} count={parts[1].Size / 512} status=none; " + + "fsck.vfat -n p1.img; e2fsck -fn p2.img; " + + "echo FAT=$(mcopy -i disk.img@@1M ::/NEW.TXT -); " + + "echo EXT=$(debugfs -R 'cat /added.txt' p2.img 2>/dev/null); " + + "echo GONE=$(debugfs -R 'ls -l /' p2.img 2>/dev/null | grep -c gone.txt || true)"); + Assert.That(output, Does.Contain("No problems found"), output); + Assert.That(output, Does.Contain("FAT=added to fat"), output); + Assert.That(output, Does.Contain("EXT=added to ext4"), output); + Assert.That(output, Does.Contain("GONE=0"), output); + } +} diff --git a/Compression.Tests/DiskImage/PartitionedDiskWriteTests.cs b/Compression.Tests/DiskImage/PartitionedDiskWriteTests.cs new file mode 100644 index 000000000..f41973b5e --- /dev/null +++ b/Compression.Tests/DiskImage/PartitionedDiskWriteTests.cs @@ -0,0 +1,279 @@ +#pragma warning disable CS1591 +using System.Buffers.Binary; +using Compression.Core.DiskImage; +using Compression.Registry; +using FileFormat.PartitionedDisk; + +namespace Compression.Tests.DiskImage; + +/// +/// Write support of the raw partitioned-disk format: files edited inside a partition's +/// filesystem in place, partitions added and deleted, fresh disks created from partition images — +/// and every refusal leaving the image byte-identical. +/// +[TestFixture] +public class PartitionedDiskWriteTests { + + [SetUp] + public void EnsureRegistered() => Compression.Lib.FormatRegistration.EnsureInitialized(); + + private static readonly PartitionedDiskFormatDescriptor Desc = new(); + + private static byte[] FatImage(string name, byte[] content, int sectors = 2880) { + var writer = new FileSystem.Fat.FatWriter(); + writer.AddFile(name, content); + return writer.Build(totalSectors: sectors); + } + + private static MemoryStream CreateDisk(string scheme, int sectorSize, params (string Name, byte[] Data)[] images) { + var ms = new MemoryStream(); + var options = new FormatCreateOptions { FormatSpecific = new(StringComparer.OrdinalIgnoreCase) { + ["scheme"] = scheme, ["sectorSize"] = sectorSize.ToString(System.Globalization.CultureInfo.InvariantCulture) } }; + Desc.Create(ms, [.. images.Select(i => ArchiveInputInfo.InMemory(i.Name, i.Data))], options); + return ms; + } + + private static string Prefix(Stream disk, int index) { + var detection = PartitionTableDetector.Detect(disk); + return PartitionedDiskLister.MakePartitionPrefix(detection.Partitions[index]); + } + + private static byte[] ReadEntry(Stream disk, string name) { + using var s = Desc.OpenEntry(disk, name, null); + using var ms = new MemoryStream(); + s.CopyTo(ms); + return ms.ToArray(); + } + + // ── Create ───────────────────────────────────────────────────────── + + [TestCase("gpt", 512)] + [TestCase("gpt", 4096)] + [TestCase("mbr", 512)] + [Category("HappyPath")] + public void Given_TwoFatImages_When_Created_Then_EachPartitionListsItsFileAtMiBAlignment(string scheme, int sectorSize) { + using var disk = CreateDisk(scheme, sectorSize, + ("boot.img", FatImage("A.TXT", "first"u8.ToArray())), + ("data.img", FatImage("B.TXT", "second"u8.ToArray()))); + + var detection = PartitionTableDetector.Detect(disk); + Assert.That(detection.Scheme, Is.EqualTo(scheme.ToUpperInvariant())); + Assert.That(detection.SectorSize, Is.EqualTo(sectorSize)); + Assert.That(detection.Partitions, Has.Count.EqualTo(2)); + Assert.That(detection.Partitions[0].StartOffset, Is.EqualTo(1024 * 1024)); + Assert.That(detection.Partitions[1].StartOffset % (1024 * 1024), Is.Zero); + + var names = Desc.List(disk, null).Select(e => e.Name).ToList(); + Assert.That(names, Has.Some.Match("^Partition1_[^/]+/A\\.TXT$"), string.Join(", ", names)); + Assert.That(names, Has.Some.Match("^Partition2_[^/]+/B\\.TXT$"), string.Join(", ", names)); + + var verify = new PartitionEditor(disk).Verify(); + Assert.That(verify.IsValid, Is.True, string.Join("; ", verify.Issues)); + } + + [Test, Category("HappyPath")] + public void Given_GptCreate_When_InputNamed_Then_PartitionNameIsTheStem() { + using var disk = CreateDisk("gpt", 512, ("Partition1_EFI.raw", new byte[4096])); + var part = PartitionTableDetector.Detect(disk).Partitions.Single(); + Assert.That(part.Name, Is.EqualTo("EFI.raw".Replace(".raw", ""))); + Assert.That(part.Size, Is.EqualTo(4096)); + } + + [Test, Category("ErrorHandling")] + public void Given_LooseTextFile_When_Created_Then_Refused() { + Assert.That(() => CreateDisk("gpt", 512, ("PROBE.TXT", "hello"u8.ToArray())), Throws.ArgumentException); + } + + [Test, Category("ErrorHandling")] + public void Given_NoInputs_When_Created_Then_Refused() { + Assert.That(() => CreateDisk("gpt", 512), Throws.ArgumentException); + } + + [Test, Category("Boundary")] + public void Given_FiveImagesOnMbr_When_Created_Then_RefusedBecauseOnlyFourPrimariesExist() { + var images = Enumerable.Range(1, 5).Select(i => ($"p{i}.raw", new byte[512])).ToArray(); + Assert.That(() => CreateDisk("mbr", 512, images), Throws.ArgumentException); + Assert.That(() => CreateDisk("mbr", 512, images[..4]), Throws.Nothing); + } + + [TestCase("scheme", "apm")] + [TestCase("sectorSize", "1024")] + [Category("ErrorHandling")] + public void Given_UnknownOption_When_Created_Then_Refused(string key, string value) { + var options = new FormatCreateOptions { FormatSpecific = new(StringComparer.OrdinalIgnoreCase) { [key] = value } }; + Assert.That(() => Desc.Create(new MemoryStream(), [ArchiveInputInfo.InMemory("a.raw", new byte[512])], options), + Throws.ArgumentException); + } + + // ── Edit inside a partition ──────────────────────────────────────── + + [TestCase("gpt", 512)] + [TestCase("gpt", 4096)] + [TestCase("mbr", 512)] + [Category("HappyPath")] + public void Given_FatPartition_When_FileAdded_Then_ItReadsBackAndBytesOutsideThePartitionAreUntouched(string scheme, int sectorSize) { + using var disk = CreateDisk(scheme, sectorSize, + ("a.img", FatImage("A.TXT", "first"u8.ToArray())), + ("b.img", FatImage("B.TXT", "second"u8.ToArray()))); + var before = disk.ToArray(); + var p1 = PartitionTableDetector.Detect(disk).Partitions[0]; + var prefix = Prefix(disk, 0); + + Desc.Add(disk, [ArchiveInputInfo.InMemory($"{prefix}/NEW.TXT", "added in place"u8.ToArray())]); + + Assert.That(ReadEntry(disk, $"{prefix}/NEW.TXT"), Is.EqualTo("added in place"u8.ToArray())); + Assert.That(ReadEntry(disk, $"{prefix}/A.TXT"), Is.EqualTo("first"u8.ToArray())); + var after = disk.ToArray(); + Assert.That(after.Length, Is.EqualTo(before.Length)); + Assert.That(after.AsSpan(0, (int)p1.StartOffset).SequenceEqual(before.AsSpan(0, (int)p1.StartOffset)), Is.True, + "bytes before the partition changed"); + var end = (int)(p1.StartOffset + p1.Size); + Assert.That(after.AsSpan(end).SequenceEqual(before.AsSpan(end)), Is.True, "bytes after the partition changed"); + } + + [Test, Category("HappyPath")] + public void Given_FatPartition_When_FileRemoved_Then_ItIsGoneAndTheOtherStays() { + using var disk = CreateDisk("gpt", 512, ("a.img", FatImage("A.TXT", "first"u8.ToArray()))); + var prefix = Prefix(disk, 0); + Desc.Add(disk, [ArchiveInputInfo.InMemory($"{prefix}/KEEP.TXT", "keep"u8.ToArray())]); + + Desc.Remove(disk, [$"{prefix}/A.TXT"]); + + var names = Desc.List(disk, null).Select(e => e.Name).ToList(); + Assert.That(names, Has.None.EqualTo($"{prefix}/A.TXT")); + Assert.That(names, Has.Some.EqualTo($"{prefix}/KEEP.TXT")); + } + + [Test, Category("ErrorHandling")] + public void Given_RawPartitionWithoutFilesystem_When_FileAdded_Then_RefusedAndByteIdentical() { + using var disk = CreateDisk("gpt", 512, ("blob.raw", new byte[64 * 1024])); + var before = disk.ToArray(); + var prefix = Prefix(disk, 0); + + Assert.That(() => Desc.Add(disk, [ArchiveInputInfo.InMemory($"{prefix}/X.TXT", "x"u8.ToArray())]), + Throws.InvalidOperationException); + Assert.That(disk.ToArray(), Is.EqualTo(before)); + } + + [Test, Category("Boundary")] + public void Given_FullFatVolume_When_OversizedFileAdded_Then_RefusedAndByteIdentical() { + using var disk = CreateDisk("gpt", 512, ("a.img", FatImage("A.TXT", "first"u8.ToArray()))); + var before = disk.ToArray(); + var prefix = Prefix(disk, 0); + + Assert.That(() => Desc.Add(disk, [ArchiveInputInfo.InMemory($"{prefix}/BIG.BIN", new byte[4 * 1024 * 1024])]), + Throws.InvalidOperationException); + Assert.That(disk.ToArray(), Is.EqualTo(before)); + } + + [Test, Category("ErrorHandling")] + public void Given_TwoEditsWhereTheSecondFails_When_Added_Then_NeitherIsWritten() { + using var disk = CreateDisk("gpt", 512, + ("a.img", FatImage("A.TXT", "first"u8.ToArray())), + ("blob.raw", new byte[64 * 1024])); + var before = disk.ToArray(); + + Assert.That(() => Desc.Add(disk, [ + ArchiveInputInfo.InMemory($"{Prefix(disk, 0)}/OK.TXT", "fine"u8.ToArray()), + ArchiveInputInfo.InMemory($"{Prefix(disk, 1)}/NO.TXT", "refused"u8.ToArray()), + ]), Throws.InvalidOperationException); + Assert.That(disk.ToArray(), Is.EqualTo(before)); + } + + [Test, Category("ErrorHandling")] + public void Given_NameOutsideAnyPartition_When_Removed_Then_FileNotFoundAndByteIdentical() { + using var disk = CreateDisk("gpt", 512, ("a.img", FatImage("A.TXT", "first"u8.ToArray()))); + var before = disk.ToArray(); + Assert.That(() => Desc.Remove(disk, ["Partition9_Nope/A.TXT"]), Throws.InstanceOf()); + Assert.That(disk.ToArray(), Is.EqualTo(before)); + } + + // ── Whole partitions ─────────────────────────────────────────────── + + [TestCase("gpt")] + [TestCase("mbr")] + [Category("HappyPath")] + public void Given_TwoPartitions_When_FirstRemovedWhole_Then_TableShrinksAndItsSectorsStay(string scheme) { + using var disk = CreateDisk(scheme, 512, + ("a.img", FatImage("A.TXT", "first"u8.ToArray())), + ("b.img", FatImage("B.TXT", "second"u8.ToArray()))); + var first = PartitionTableDetector.Detect(disk).Partitions[0]; + var payload = disk.ToArray().AsSpan((int)first.StartOffset, (int)first.Size).ToArray(); + + Desc.Remove(disk, [Prefix(disk, 0)]); + + var left = PartitionTableDetector.Detect(disk).Partitions; + Assert.That(left, Has.Count.EqualTo(1)); + Assert.That(Desc.List(disk, null).Select(e => e.Name), Has.Some.EndsWith("/B.TXT")); + Assert.That(disk.ToArray().AsSpan((int)first.StartOffset, (int)first.Size).ToArray(), Is.EqualTo(payload)); + Assert.That(new PartitionEditor(disk).Verify().IsValid, Is.True); + } + + [Test, Category("HappyPath")] + public void Given_GptDisk_When_FilesystemImageAddedAtRoot_Then_ItBecomesAMiBAlignedPartition() { + using var disk = CreateDisk("gpt", 512, ("a.img", FatImage("A.TXT", "first"u8.ToArray()))); + disk.SetLength(disk.Length + 4 * 1024 * 1024); + new PartitionEditor(disk).Reload(); + // Re-home the backup GPT at the new end: a grown disk is what partition tools hand over. + var grow = new PartitionEditor(disk); + grow.ConvertGptToMbr(); + grow.ConvertMbrToGpt(); + + Desc.Add(disk, [ArchiveInputInfo.InMemory("second.img", FatImage("N.TXT", "new"u8.ToArray()))]); + + var parts = PartitionTableDetector.Detect(disk).Partitions; + Assert.That(parts, Has.Count.EqualTo(2)); + Assert.That(parts[1].StartOffset % (1024 * 1024), Is.Zero); + Assert.That(Desc.List(disk, null).Select(e => e.Name), Has.Some.EndsWith("/N.TXT")); + Assert.That(new PartitionEditor(disk).Verify().IsValid, Is.True); + } + + [Test, Category("Boundary")] + public void Given_NoFreeSpace_When_ImageAddedAtRoot_Then_RefusedAndByteIdentical() { + using var disk = CreateDisk("gpt", 512, ("a.img", FatImage("A.TXT", "first"u8.ToArray()))); + var before = disk.ToArray(); + Assert.That(() => Desc.Add(disk, [ArchiveInputInfo.InMemory("second.img", FatImage("N.TXT", "new"u8.ToArray()))]), + Throws.InvalidOperationException); + Assert.That(disk.ToArray(), Is.EqualTo(before)); + } + + [Test, Category("ErrorHandling")] + public void Given_LooseFileAtRoot_When_Added_Then_RefusedAndByteIdentical() { + using var disk = CreateDisk("gpt", 512, ("a.img", FatImage("A.TXT", "first"u8.ToArray()))); + var before = disk.ToArray(); + Assert.That(() => Desc.Add(disk, [ArchiveInputInfo.InMemory("notes.txt", "text"u8.ToArray())]), + Throws.InvalidOperationException); + Assert.That(disk.ToArray(), Is.EqualTo(before)); + } + + // ── Staged window ────────────────────────────────────────────────── + + [Test, Category("Boundary")] + public void Given_StagedWindow_When_WritePastItsEnd_Then_ThrowsAndDiskUntouched() { + var bytes = Enumerable.Range(0, 8192).Select(i => (byte)i).ToArray(); + using var disk = new MemoryStream(bytes.ToArray()); + var window = new StagedWindowStream(disk, 1024, 4096); + window.Position = 4090; + Assert.That(() => window.Write(new byte[7]), Throws.InstanceOf()); + Assert.That(() => window.SetLength(4097), Throws.InstanceOf()); + window.SetLength(100); // shrinking is a no-op + Assert.That(disk.ToArray(), Is.EqualTo(bytes)); + } + + [Test, Category("HappyPath")] + public void Given_StagedWrites_When_ReadBackBeforeCommit_Then_SeenOnlyThroughTheWindowUntilCommitted() { + var bytes = new byte[16384]; + using var disk = new MemoryStream(bytes.ToArray()); + var window = new StagedWindowStream(disk, 4096, 8192); + window.Position = 4094; // straddles a page boundary + window.Write([1, 2, 3, 4]); + window.Position = 4094; + var back = new byte[4]; + window.ReadExactly(back); + Assert.That(back, Is.EqualTo(new byte[] { 1, 2, 3, 4 })); + Assert.That(disk.ToArray(), Is.EqualTo(bytes), "nothing reaches the disk before Commit"); + + window.Commit(); + Assert.That(disk.ToArray().AsSpan(4096 + 4094, 4).ToArray(), Is.EqualTo(new byte[] { 1, 2, 3, 4 })); + } +} diff --git a/Compression.Tests/NativeUI/ShellContentDetectionTests.cs b/Compression.Tests/NativeUI/ShellContentDetectionTests.cs index 5590561ef..1cfafbcbd 100644 --- a/Compression.Tests/NativeUI/ShellContentDetectionTests.cs +++ b/Compression.Tests/NativeUI/ShellContentDetectionTests.cs @@ -59,16 +59,30 @@ private string Write(string name, byte[] data) { } [Test] - public void GivenAnImgHoldingAPartitionTable_WhenOpened_ThenItIsAPartitionedDiskAndNothingIsOfferedToBeAddedToIt() { + public void GivenAnImgHoldingAPartitionTable_WhenOpened_ThenItIsAPartitionedDiskWhoseAddsGoThroughThePartitions() { this._model.Open(this.Write("disk.img", PartitionedDisk())); Assert.Multiple(() => { Assert.That(this._model.Format, Is.EqualTo("PartitionedDisk"), "the extension says FAT; the bytes say whole disk"); - Assert.That(this._model.AddFilesCommand.CanExecute(null), Is.False, - "adding through the FAT writer would write a FAT structure over the partition table"); + // Adding is offered, but through the partition-aware writer — never the FAT writer, which + // would write a FAT structure over the partition table. + Assert.That(this._model.AddFilesCommand.CanExecute(null), Is.True); + Assert.That(FormatRegistry.GetArchiveOps("PartitionedDisk"), Is.InstanceOf()); }); } + [Test] + public void GivenAPartitionedDisk_WhenAFileIsDroppedIntoAPartitionFolder_ThenTheDropIsAccepted() { + var disk = PartitionedDisk(); + this._model.Open(this.Write("disk.img", disk)); + this._model.CurrentFolder = PartitionedDiskLister.MakePartitionPrefix(PartitionTableDetector.Detect(disk).Partitions[0]); + var dropped = this.Write("any.txt", "dropped"u8.ToArray()); + + var (allowed, _) = this._model.EvaluateDropAgainstCurrentArchive([dropped]); + + Assert.That(allowed, Is.True); + } + [Test] public void GivenAnImgHoldingABareFatVolume_WhenOpened_ThenFilesCanBeAddedToIt() { this._model.Open(this.Write("floppy.img", Fat())); diff --git a/Compression.Tests/Nested/NestedStreamResolverTests.cs b/Compression.Tests/Nested/NestedStreamResolverTests.cs index 94ac99129..732174fc3 100644 --- a/Compression.Tests/Nested/NestedStreamResolverTests.cs +++ b/Compression.Tests/Nested/NestedStreamResolverTests.cs @@ -111,4 +111,28 @@ public void ResolveDeepest_AddFileThroughResolved_AppearsOnReRead() { Assert.Ignore("FAT descriptor does not implement IArchiveModifiable (unexpected)"); } } + + [TestCase("gpt", 512)] + [TestCase("gpt", 4096)] + [TestCase("mbr", 512)] + [Category("HappyPath")] + public void Given_RawPartitionedDisk_When_Resolved_Then_TheFilesystemInsideThePartitionIsReturned(string scheme, int sectorSize) { + var fatWriter = new FileSystem.Fat.FatWriter(); + fatWriter.AddFile("inner.txt", "inside a partition"u8.ToArray()); + var fat = fatWriter.Build(totalSectors: 2880); + using var disk = new MemoryStream(); + new FileFormat.PartitionedDisk.PartitionedDiskFormatDescriptor().Create(disk, [ArchiveInputInfo.InMemory("fat.img", fat)], + new FormatCreateOptions { FormatSpecific = new(StringComparer.OrdinalIgnoreCase) { + ["scheme"] = scheme, ["sectorSize"] = sectorSize.ToString(System.Globalization.CultureInfo.InvariantCulture) } }); + + var resolution = NestedStreamResolver.ResolveDeepest(disk); + + Assert.That(resolution, Is.Not.Null, "a raw disk's partitions must be descended into"); + Assert.That(resolution!.InnerDescriptor.Id, Is.EqualTo("Fat")); + Assert.That(resolution.NestingPath, Does.Contain($"{scheme.ToUpperInvariant()} partition 0")); + Assert.That(resolution.InnerStream.Length, Is.EqualTo(fat.Length)); + resolution.InnerStream.Position = 0; + Assert.That(FormatRegistry.GetArchiveOps("Fat")!.List(resolution.InnerStream, null).Select(e => e.Name), + Has.Some.EqualTo("inner.txt")); + } } diff --git a/README.md b/README.md index bc4c13f2b..094cc1dff 100644 --- a/README.md +++ b/README.md @@ -457,6 +457,10 @@ checks. **Partition-table support.** `MbrParser`, `GptParser` and `PartitionTypeDatabase` feed recursive descent so `--recursive` can follow disk image → partition table → filesystem → nested format. +Raw disk images (`PartitionedDisk`) read GPT (512- and 4096-byte LBAs), MBR with logical +partitions, APM, BSD disklabels, Amiga RDB, Sun and SGI labels; files inside a partition are edited +in place by that partition's filesystem editor, GPT/MBR partitions are added and removed, and new +disks are created from partition images — see [ARCHITECTURE.md](ARCHITECTURE.md). Analysis does not change format ownership: discovering JPEG data inside damaged storage does not make JPEG an archive format, and finding an ext superblock does not make `Compression.Analysis` the ext diff --git a/docs/catalogue/our-registry.csv b/docs/catalogue/our-registry.csv index 22ea9daba..a9ce7575f 100644 --- a/docs/catalogue/our-registry.csv +++ b/docs/catalogue/our-registry.csv @@ -395,7 +395,7 @@ format,Paragon,Paragon Backup,Archive,,.pbf,Y,Y,Y,Y format,ParallelsHdd,Parallels Disk (HDS),Archive,,.hds,Y,Y,, format,Parquet,Apache Parquet,Archive,,.parquet,Y,Y,, format,Partclone,partclone (Clonezilla),Archive,,.aa;.img,Y,Y,Y, -format,PartitionedDisk,Partitioned disk image,Archive,,,Y,Y,, +format,PartitionedDisk,Partitioned disk image,Archive,,,Y,Y,Y,Y format,Pbp,PSP PBP Archive,Archive,,.pbp,Y,Y,Y, format,Pc98,NEC PC-98 DOS,Archive,Y,.hdm;.fdi;.d88,Y,Y,Y,Y format,Pcap,PCAP (libpcap capture),Archive,,.pcap;.cap,Y,Y,, diff --git a/docs/catalogue/reference-formats.csv b/docs/catalogue/reference-formats.csv index 0184360a7..0fecd73e3 100644 --- a/docs/catalogue/reference-formats.csv +++ b/docs/catalogue/reference-formats.csv @@ -243,10 +243,10 @@ ISO 9660 (Joliet / Rock Ridge / El Torito),iso;cdr;bin;cd-rom;cdi;dmg;img;joliet High Sierra format,iso;hsf,filesystem,,,,,,,Y,1,,,,,,MISSING,, UDF,udf;cdr;dmg;iso;toast,filesystem,R,,,,,fmt/1738;fmt/1739;fmt/1757,Y,3,https://www.osta.org/specs/,Udf,Y,Y,Y,PARTIAL,,type-1 partition maps only: no VAT/sparable/metadata partitions (UDF 1.50+ media) (UdfReader.cs) Roxio Toast image,toast,disk-image,,,,,,,Y,1,,Iso;Hfs,Y,Y,Y,OK,, -Apple Partition Map,apm;bin;cdr;dmg;img;iso;toast,partition-table,R,,,,,fmt/1740;fmt/1741;fmt/1757,,2,https://en.wikipedia.org/wiki/Apple_Partition_Map,PartitionedDisk,Y,,,READ-ONLY-BUT-SOURCES-WRITE,pdisk / hdiutil, -MBR partition table,mbr,partition-table,R,,,R,,,,2,https://en.wikipedia.org/wiki/Master_boot_record,PartitionedDisk,Y,,,READ-ONLY-BUT-SOURCES-WRITE,fdisk / sfdisk, -GUID Partition Table (GPT),gpt,partition-table,R,,,D,,,,2,https://uefi.org/specifications,PartitionedDisk,Y,,,READ-ONLY-BUT-SOURCES-WRITE,sgdisk / gdisk, -Raw disk image,img;raw;dd;bin,disk-image,,,,,,,Y,1,,PartitionedDisk,Y,,,READ-ONLY-BUT-SOURCES-WRITE,dd, +Apple Partition Map,apm;bin;cdr;dmg;img;iso;toast,partition-table,R,,,,,fmt/1740;fmt/1741;fmt/1757,,2,https://en.wikipedia.org/wiki/Apple_Partition_Map,PartitionedDisk,Y,Y,Y,PARTIAL,pdisk / hdiutil,APM tables are read and their partitions' filesystems edited in place; APM entries cannot be created; added or removed +MBR partition table,mbr,partition-table,R,,,R,,,,2,https://en.wikipedia.org/wiki/Master_boot_record,PartitionedDisk,Y,Y,Y,OK,fdisk / sfdisk,incl. EBR logical partitions; create/modify checked with sfdisk --verify and fsck +GUID Partition Table (GPT),gpt,partition-table,R,,,D,,,,2,https://uefi.org/specifications,PartitionedDisk,Y,Y,Y,OK,sgdisk / gdisk,512- and 4096-byte LBAs; create/modify checked with sgdisk -v; sfdisk --verify and fdisk -b 4096 +Raw disk image,img;raw;dd;bin,disk-image,,,,,,,Y,1,,PartitionedDisk,Y,Y,Y,OK,dd,files inside partitions are edited in place by the partition filesystem's own editor Linux LVM2,lvm,partition-table,R,,,,,,,1,,,,,,MISSING,,https://man7.org/linux/man-pages/man8/lvm.8.html Android logical partitions (super.img),img;lp,partition-table,R,,,,,,,1,,,,,,MISSING,,https://source.android.com/docs/core/ota/dynamic_partitions Apple Disk Image (UDIF),dmg;smi;img,disk-image,R,,,R,R,fmt/1071,Y,5,https://en.wikipedia.org/wiki/Apple_Disk_Image,Dmg,Y,Y,Y,OK,, From 2cb06be81531c32872453d9605f084593a6dc175 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 26 Oct 2026 12:06:10 +0000 Subject: [PATCH 19/48] * refresh the archive browser screenshot --- docs/screenshots/archive-browser.png | Bin 66518 -> 65657 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/screenshots/archive-browser.png b/docs/screenshots/archive-browser.png index de88d7dd43f38a733fe5557dd0e66b254aa140ee..e3795c0d04a8041389e0aaa3edc8cc5c89e36820 100644 GIT binary patch literal 65657 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

J-t(C?D*vNbSd$Mpldw%6G^3`$t6)P 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 O*JNyHeySLKDeAvN*8HCU literal 66518 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 Kj%4xcAO8X%gq{lk From ad124fa96b2cd5af165c699285851fa5a341f13f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 26 Oct 2026 12:06:16 +0000 Subject: [PATCH 20/48] * refresh the application screenshot --- screenshots/main-window.png | Bin 65657 -> 66510 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/screenshots/main-window.png b/screenshots/main-window.png index e3795c0d04a8041389e0aaa3edc8cc5c89e36820..a8d91cb6875fd05a6e6bed08a6f241f4bb446625 100644 GIT binary patch literal 66510 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 z zQ6F!zX{^9NEH0^6$gnqg7@ImJsj+e9bSC@bGbO1(*+673z6xedyi|;3<_5#UiDyUm zp0=RI7d8F(3b8QOJiGm{iP)W%st1N7pjlPmcdcO&r>@H~d@dkSID`Ez6!8-KBk{3j z7<>m9nD3*1OMC;>$98Iac*`GhNnGO%{E!+ExQ1*^?Nk*i7>Ix6|LV)}_3FAUQgznG T5?6D@2WE2C;!LiA^I!i3jR{9W literal 65657 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

J-t(C?D*vNbSd$Mpldw%6G^3`$t6)P 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 O*JNyHeySLKDeAvN*8HCU From fc8ce06787c403199d76736e8e9c59c7b39bbed5 Mon Sep 17 00:00:00 2001 From: Hawkynt Date: Mon, 26 Oct 2026 13:06:53 +0100 Subject: [PATCH 21/48] * regenerate references --- Compression.Core/README.md | 2 +- docs/catalogue/GAPS.md | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Compression.Core/README.md b/Compression.Core/README.md index 483e87991..e918da817 100644 --- a/Compression.Core/README.md +++ b/Compression.Core/README.md @@ -205,7 +205,7 @@ Use the concrete version you intend to consume; this document does not predict a -Every public and protected member of all 728 types, generated from the built assembly and its XML documentation, is in [REFERENCE.md](https://github.com/Hawkynt/CompressionWorkbench/blob/main/Compression.Core/REFERENCE.md). +Every public and protected member of all 734 types, generated from the built assembly and its XML documentation, is in [REFERENCE.md](https://github.com/Hawkynt/CompressionWorkbench/blob/main/Compression.Core/REFERENCE.md). diff --git a/docs/catalogue/GAPS.md b/docs/catalogue/GAPS.md index 9bb95c1b8..f04ba09fa 100644 --- a/docs/catalogue/GAPS.md +++ b/docs/catalogue/GAPS.md @@ -24,9 +24,9 @@ exists. It warns when a capability letter has drifted from the live descriptor. | Gap type | Rows | Meaning | | --- | ---: | --- | | `MISSING` | 240 | a source lists it; no descriptor or building block covers it | -| `READ-ONLY-BUT-SOURCES-WRITE` | 24 | we only read it; a source or the format's own tool writes it | -| `PARTIAL` | 40 | covered, but the reader handles only part of the format (see the table below) | -| `OK` | 221 | covered with no known gap against what the sources list | +| `READ-ONLY-BUT-SOURCES-WRITE` | 20 | we only read it; a source or the format's own tool writes it | +| `PARTIAL` | 41 | covered, but the reader handles only part of the format (see the table below) | +| `OK` | 224 | covered with no known gap against what the sources list | | `OURS-ONLY` | 458 | in our registry, listed by none of the seven sources | ### Per source @@ -36,13 +36,13 @@ read-only rows. | Source | Rows it lists | Mapped | % | OK | | --- | ---: | ---: | ---: | ---: | -| 7-Zip (formats + codecs) | 96 | 89 | 92.7 | 72 | +| 7-Zip (formats + codecs) | 96 | 89 | 92.7 | 74 | | libarchive (formats + filters) | 28 | 27 | 96.4 | 23 | | XADMaster / The Unarchiver | 126 | 95 | 75.4 | 78 | -| binwalk v3 | 79 | 48 | 60.8 | 36 | +| binwalk v3 | 79 | 48 | 60.8 | 38 | | Universal Extractor 2 | 124 | 71 | 57.3 | 48 | | PRONOM | 87 | 63 | 72.4 | 43 | -| Wikipedia | 266 | 156 | 58.6 | 117 | +| Wikipedia | 266 | 156 | 58.6 | 118 | The libarchive and 7-Zip lists are almost fully covered. The rows still open are libarchive's grzip, plus seven 7-Zip rows: LVM, Android `super.img` (LP), AVB, TE, the Swap2/Swap4 filter, PKWARE strong From 1cfcb4f8a11967be613694bbf2d1159a9172b6db Mon Sep 17 00:00:00 2001 From: Hawkynt Date: Mon, 26 Oct 2026 13:06:56 +0100 Subject: [PATCH 22/48] # partition add counts in the disk's own sector size on 4Kn disks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Symptom: `cwb partition add --start/--length` and the shell's Add Partition dialog multiplied LBAs by 512, so on a 4Kn GPT disk a partition asked for at LBA 256 landed at byte 131072 instead of 1 MiB, and the dialog suggested start sector 2048 (8 MiB) and described 512-byte sectors. Root cause: both used the PartitionEditor.SectorSize constant instead of the block size the disk's GPT validated at. Fix: PartitionOperations.List reports the disk's logical sector size and the new AddBySectors converts LBAs with it; the CLI uses it and says which sector size applied. The dialog takes the editor's LogicalSectorSize: the default start is 1 MiB in that size (2048 or 256) and the hints name it. Sourcing: no format work; UEFI 2.10 §5.3 counts every LBA in the logical block size. Tests: AddBySectors on 512- and 4096-byte GPT disks, the last-usable-LBA boundary on a 4Kn disk (refusal leaves it byte-identical), negative/empty ranges. --- Compression.CLI/Program.cs | 15 ++--- Compression.Lib/PartitionOperations.cs | 21 ++++++- .../Views/PartitionDialogs.cs | 24 ++++---- .../Views/PartitionsWindow.cs | 2 +- Compression.Tests/Cli/PartitionCliTests.cs | 57 +++++++++++++++++++ 5 files changed, 98 insertions(+), 21 deletions(-) diff --git a/Compression.CLI/Program.cs b/Compression.CLI/Program.cs index 950e91cc1..7d8090e98 100644 --- a/Compression.CLI/Program.cs +++ b/Compression.CLI/Program.cs @@ -2592,15 +2592,16 @@ List all partitions in a disk image. Auto-detects the host container }); var partitionAddImageArg = new Argument("image") { Description = "Disk image to modify" }; -var partitionAddStartOpt = new Option("--start") { Description = "Start sector (LBA, multiplied by 512 internally)", Required = true }; -var partitionAddLengthOpt = new Option("--length") { Description = "Length in sectors", Required = true }; +var partitionAddStartOpt = new Option("--start") { Description = "Start sector (LBA, in the disk's logical sectors: 512 B, or 4096 B on a 4Kn GPT disk)", Required = true }; +var partitionAddLengthOpt = new Option("--length") { Description = "Length in the disk's logical sectors", Required = true }; var partitionAddTypeOpt = new Option("--type") { Description = "Partition type: Linux, Fat32Lba, NtfsExfat, EfiSystem, ExtendedLba, …", Required = true }; var partitionAddLabelOpt = new Option("--label") { Description = "Partition label (GPT only)" }; var partitionAddCmd = new Command("add", """ Add a primary or logical partition. If an extended container exists and the range falls inside it, the new entry is added as a logical partition. - Sectors are 512 bytes each. + Sectors are the disk's logical sectors, as fdisk and sgdisk count them: + 512 bytes, or 4096 bytes on a 4Kn GPT disk. Example: cwb partition add disk.vhd --start 2048 --length 2048 --type Linux cwb partition add disk.img --start 4096 --length 1024 --type Fat32Lba --label boot @@ -2610,10 +2611,10 @@ cwb partition add disk.img --start 4096 --length 1024 --type Fat32Lba --label bo if (!image.Exists) { Console.Error.WriteLine($"File not found: {image.FullName}"); return 1; } try { var type = PartitionOperations.ParseType(ctx.GetValue(partitionAddTypeOpt)!); - var startBytes = ctx.GetValue(partitionAddStartOpt) * PartitionEditor.SectorSize; - var lengthBytes = ctx.GetValue(partitionAddLengthOpt) * PartitionEditor.SectorSize; - PartitionOperations.Add(image.FullName, startBytes, lengthBytes, type, ctx.GetValue(partitionAddLabelOpt)); - Console.WriteLine($"Added {type} partition: start={startBytes:N0} bytes, size={lengthBytes:N0} bytes."); + var startLba = ctx.GetValue(partitionAddStartOpt); + var lengthSectors = ctx.GetValue(partitionAddLengthOpt); + var sectorSize = PartitionOperations.AddBySectors(image.FullName, startLba, lengthSectors, type, ctx.GetValue(partitionAddLabelOpt)); + Console.WriteLine($"Added {type} partition: start={startLba * sectorSize:N0} bytes, size={lengthSectors * sectorSize:N0} bytes ({sectorSize}-byte sectors)."); return 0; } catch (Exception ex) { Console.Error.WriteLine($"Add failed: {ex.Message}"); diff --git a/Compression.Lib/PartitionOperations.cs b/Compression.Lib/PartitionOperations.cs index 141b36e37..de9fa2eee 100644 --- a/Compression.Lib/PartitionOperations.cs +++ b/Compression.Lib/PartitionOperations.cs @@ -43,9 +43,11 @@ public sealed record PartitionInfo( /// Snapshot returned by : the detected scheme plus all /// primary and logical entries currently on disk. ///