From 2d88778228072f1747ce136e898dc9011830e99b Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Fri, 3 Jul 2026 12:04:41 +1000 Subject: [PATCH] Canonicalize [Content_Types].xml Default/Override split MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit System.IO.Packaging (via document.Clone, and Aspose's own writer) chooses which content type wins a per-extension vs a per-part through internal collection ordering. For an extension shared by several content types (notably xml: workbook/worksheet/styles/sharedStrings), that choice — and thus which parts become Overrides — was unstable across runs and producers. ContentTypesPatcher only sorted the entries, so the flap survived and Aspose.Cells xlsx serialized non-deterministically run-to-run. Canonicalize the split instead of just sorting: compute each part's effective content type, pick every extension's Default as its most-common content type (Ordinal tiebreak), and emit an explicit for each part that differs. This needs the full part list, so Convert now threads part names through to the patcher set. OPC-preserving: every part still resolves to its original content type (guarded by validator tests). Also drops a stale left behind when its part is removed. --- .../DeterministicPackage.cs | 4 +- .../DeterministicPackage_Convert.cs | 27 ++- .../Patching/ContentTypesPatcher.cs | 195 +++++++++++++++++- src/Directory.Build.props | 2 +- ...ests.MostCommonBecomesDefault.verified.txt | 6 + .../Patching/ContentTypesPatcherTests.cs | 97 +++++++++ src/Tests/Tests.AbsPath.DotNet.verified.xlsx | Bin 12771 -> 12752 bytes src/Tests/Tests.AbsPath.Net.verified.xlsx | Bin 12720 -> 12703 bytes .../[Content_Types].verified.xml | 2 +- .../Tests.Numbering.DotNet.verified.docx | Bin 115023 -> 115010 bytes src/Tests/Tests.Numbering.Net.verified.docx | Bin 114756 -> 114742 bytes .../[Content_Types].verified.xml | 2 +- .../[Content_Types].verified.xml | 2 +- .../[Content_Types].verified.xml | 2 +- ...yAsync_extension=docx.DotNet.verified.docx | Bin 10895 -> 10885 bytes ...naryAsync_extension=docx.Net.verified.docx | Bin 11053 -> 11042 bytes ...sync_extension=nupkg.DotNet.verified.nupkg | Bin 35183 -> 35169 bytes ...ryAsync_extension=nupkg.Net.verified.nupkg | Bin 35672 -> 35656 bytes ...yAsync_extension=xlsx.DotNet.verified.xlsx | Bin 6069 -> 6059 bytes ...naryAsync_extension=xlsx.Net.verified.xlsx | Bin 5989 -> 5980 bytes ...Binary_extension=docx.DotNet.verified.docx | Bin 10894 -> 10884 bytes ...RunBinary_extension=docx.Net.verified.docx | Bin 11053 -> 11042 bytes ...nary_extension=nupkg.DotNet.verified.nupkg | Bin 35183 -> 35169 bytes ...nBinary_extension=nupkg.Net.verified.nupkg | Bin 35672 -> 35656 bytes ...Binary_extension=xlsx.DotNet.verified.xlsx | Bin 6070 -> 6060 bytes ...RunBinary_extension=xlsx.Net.verified.xlsx | Bin 5989 -> 5980 bytes .../[Content_Types].verified.xml | 2 +- .../[Content_Types].verified.xml | 2 +- .../[Content_Types].verified.xml | 2 +- ...ests.WithWorkbookRels.DotNet.verified.xlsx | Bin 12771 -> 12752 bytes .../Tests.WithWorkbookRels.Net.verified.xlsx | Bin 12720 -> 12703 bytes .../[Content_Types].verified.xml | 2 +- 32 files changed, 328 insertions(+), 19 deletions(-) create mode 100644 src/Tests/Patching/ContentTypesPatcherTests.MostCommonBecomesDefault.verified.txt create mode 100644 src/Tests/Patching/ContentTypesPatcherTests.cs diff --git a/src/DeterministicIoPackaging/DeterministicPackage.cs b/src/DeterministicIoPackaging/DeterministicPackage.cs index 0d1fad9..b91bb65 100644 --- a/src/DeterministicIoPackaging/DeterministicPackage.cs +++ b/src/DeterministicIoPackaging/DeterministicPackage.cs @@ -5,7 +5,7 @@ public static partial class DeterministicPackage public static DateTime StableDate { get; } = new(2020, 1, 1, 0, 0, 0, DateTimeKind.Utc); public static DateTimeOffset StableDateOffset { get; } = new(StableDate); - static PatcherSet CreatePatchers() + static PatcherSet CreatePatchers(IReadOnlyCollection partNames) { var workbookRelsPatcher = new WorkbookRelationshipPatcher(); var documentRelsPatcher = new DocumentRelationshipPatcher(); @@ -14,7 +14,7 @@ static PatcherSet CreatePatchers() var pptxRelsPatcher = new PptxRelationshipPatcher(); IReadOnlyList patchers = [ - new ContentTypesPatcher(), + new ContentTypesPatcher(partNames), new RelationshipPatcher(), sheetRelsPatcher, new SheetPatcher(sheetRelsPatcher), diff --git a/src/DeterministicIoPackaging/DeterministicPackage_Convert.cs b/src/DeterministicIoPackaging/DeterministicPackage_Convert.cs index e091ed3..e9128c7 100644 --- a/src/DeterministicIoPackaging/DeterministicPackage_Convert.cs +++ b/src/DeterministicIoPackaging/DeterministicPackage_Convert.cs @@ -9,11 +9,14 @@ public static partial class DeterministicPackage // and patched in place with no extra copy. public static MemoryStream Convert(Stream source) { - var patchers = CreatePatchers(); var target = new MemoryStream(); using (var sourceArchive = ReadArchive(source)) using (var targetArchive = CreateArchive(target)) { + // Part names must be known before patching begins so the + // ContentTypesPatcher can canonicalize the content-type map against + // every part in the package, not just the ones the input map lists. + var patchers = CreatePatchers(CollectPartNames(sourceArchive)); foreach (var sourceEntry in sourceArchive.OrderedEntries()) { DuplicateEntry(sourceEntry, targetArchive, patchers); @@ -27,11 +30,11 @@ public static MemoryStream Convert(Stream source) public static async Task ConvertAsync(Stream source, Cancel token = default) { - var patchers = CreatePatchers(); var target = new MemoryStream(); using (var sourceArchive = ReadArchive(source)) using (var targetArchive = CreateArchive(target)) { + var patchers = CreatePatchers(CollectPartNames(sourceArchive)); foreach (var sourceEntry in sourceArchive.OrderedEntries()) { await DuplicateEntryAsync(sourceEntry, targetArchive, patchers, token); @@ -43,6 +46,26 @@ public static async Task ConvertAsync(Stream source, Cancel token return target; } + // Every part in the package, as leading-slash PartName values, for the + // ContentTypesPatcher. [Content_Types].xml is not itself a part, and skipped + // entries are dropped from the output, so neither belongs in the map. + static IReadOnlyCollection CollectPartNames(Archive archive) + { + var partNames = new List(); + foreach (var entry in archive.Entries) + { + if (entry.FullName is "[Content_Types].xml" || + IsSkippedEntry(entry)) + { + continue; + } + + partNames.Add(ContentTypesPatcher.ToPartName(entry.FullName)); + } + + return partNames; + } + // ZIP local file header signature ("PK\x03\x04"). // Used to detect nested ZIP packages (e.g. xlsx/docx/pptx embedded inside // word/embeddings/, ppt/embeddings/, xl/embeddings/) so they can be diff --git a/src/DeterministicIoPackaging/Patching/ContentTypesPatcher.cs b/src/DeterministicIoPackaging/Patching/ContentTypesPatcher.cs index cb4e941..8d5a106 100644 --- a/src/DeterministicIoPackaging/Patching/ContentTypesPatcher.cs +++ b/src/DeterministicIoPackaging/Patching/ContentTypesPatcher.cs @@ -1,5 +1,42 @@ -class ContentTypesPatcher : IExactMatchPatcher +// Canonicalizes [Content_Types].xml so it is byte-identical run-to-run and +// producer-independent. +// +// The OPC content-type map lets a part's content type be declared two equivalent +// ways: a that applies to every part with that +// extension, or a per-part . For an extension whose +// parts carry several different content types (e.g. "xml", shared by workbook / +// worksheet / styles / sharedStrings / core-properties), the producer must pick +// ONE content type to be the extension's Default and emit Overrides for the rest. +// +// System.IO.Packaging (used by DocumentFormat.OpenXml's Clone, and by producers +// such as Aspose.Cells) makes that pick via internal collection ordering, so +// which content type wins the "xml" Default — and therefore which parts become +// Overrides — is not stable across producers, SDK versions, or runtimes. Merely +// sorting the entries (the previous behavior here) preserves whatever split the +// input happened to use, so the non-determinism survives. +// +// This patcher removes the ambiguity by recomputing the split from scratch: +// 1. Determine every part's effective content type from the input map +// (its Override if present, otherwise the Default for its extension). +// 2. For each extension, choose a canonical Default deterministically: +// the content type shared by the MOST parts of that extension, with the +// lexicographically-smallest (Ordinal) content type breaking ties. +// 3. Emit an for every part whose effective content type differs +// from its extension's chosen Default. +// 4. Sort Defaults by Extension and Overrides by PartName (both Ordinal). +// +// The rewrite is OPC-preserving: every part still resolves to exactly the content +// type it had in the input. It needs the full set of part names — not just what +// the input map lists — because changing an extension's Default turns previously +// implicit parts into ones that must now be spelled out as Overrides. Those names +// come from the package's zip entries, supplied by DeterministicPackage.Convert. +class ContentTypesPatcher(IReadOnlyCollection partNames) : + IExactMatchPatcher { + static XNamespace ns = "http://schemas.openxmlformats.org/package/2006/content-types"; + static XName defaultName = ns + "Default"; + static XName overrideName = ns + "Override"; + public string ExactMatch => "[Content_Types].xml"; public bool IsMatch(Entry entry) => @@ -8,12 +45,158 @@ public bool IsMatch(Entry entry) => public void PatchXml(XDocument xml, string entryName) { var root = xml.Root!; - var elements = root.Elements() - .OrderBy(_ => _.Name.LocalName) - .ThenBy(_ => (string?)_.Attribute("Extension") ?? "") - .ThenBy(_ => (string?)_.Attribute("PartName") ?? "") + + var defaults = ReadDefaults(root); + var overrides = ReadOverrides(root); + + // Group each part by its extension, tracking its effective content type, + // so every extension can be assigned a single canonical Default below. + var byExtension = new Dictionary>(StringComparer.Ordinal); + foreach (var partName in partNames) + { + var extension = Extension(partName); + if (extension.Length == 0) + { + continue; + } + + var contentType = EffectiveContentType(partName, extension, defaults, overrides); + if (contentType == null) + { + // No Override and no Default covers this extension. The part has no + // declared content type in the input; leave the map untouched for it. + continue; + } + + if (!byExtension.TryGetValue(extension, out var parts)) + { + parts = []; + byExtension.Add(extension, parts); + } + + parts.Add(new(partName, contentType)); + } + + var newDefaults = new List(); + var newOverrides = new List(); + foreach (var (extension, parts) in byExtension) + { + var canonicalDefault = ChooseDefault(parts); + newDefaults.Add( + new(defaultName, + new XAttribute("Extension", extension), + new XAttribute("ContentType", canonicalDefault))); + + foreach (var part in parts) + { + if (!string.Equals(part.ContentType, canonicalDefault, StringComparison.Ordinal)) + { + newOverrides.Add( + new(overrideName, + new XAttribute("PartName", part.PartName), + new XAttribute("ContentType", part.ContentType))); + } + } + } + + var ordered = newDefaults + .OrderBy(_ => (string) _.Attribute("Extension")!, StringComparer.Ordinal) + .Concat( + newOverrides + .OrderBy(_ => (string) _.Attribute("PartName")!, StringComparer.Ordinal)) .ToList(); - root.ReplaceAll(elements); + root.ReplaceAll(ordered); + } + + // The content type shared by the most parts wins the extension's Default; + // the lexicographically-smallest content type (Ordinal) breaks ties. Both + // criteria are total and input-order-independent, so the choice is stable + // regardless of how the producer ordered its parts. + static string ChooseDefault(List parts) => + parts + .GroupBy(_ => _.ContentType, StringComparer.Ordinal) + .OrderByDescending(_ => _.Count()) + .ThenBy(_ => _.Key, StringComparer.Ordinal) + .First() + .Key; + + static string? EffectiveContentType( + string partName, + string extension, + Dictionary defaults, + Dictionary overrides) + { + if (overrides.TryGetValue(partName, out var overridden)) + { + return overridden; + } + + if (defaults.TryGetValue(extension, out var byDefault)) + { + return byDefault; + } + + return null; } + + static Dictionary ReadDefaults(XElement root) + { + // Extensions are matched case-insensitively per the OPC spec; normalize to + // lower-case so a part's extension always finds its Default. + var defaults = new Dictionary(StringComparer.Ordinal); + foreach (var element in root.Elements(defaultName)) + { + var extension = (string?) element.Attribute("Extension"); + var contentType = (string?) element.Attribute("ContentType"); + if (extension != null && contentType != null) + { + defaults[extension.ToLowerInvariant()] = contentType; + } + } + + return defaults; + } + + static Dictionary ReadOverrides(XElement root) + { + var overrides = new Dictionary(StringComparer.Ordinal); + foreach (var element in root.Elements(overrideName)) + { + var partName = (string?) element.Attribute("PartName"); + var contentType = (string?) element.Attribute("ContentType"); + if (partName != null && contentType != null) + { + overrides[partName] = contentType; + } + } + + return overrides; + } + + // Part names in the content-type map are absolute ("/xl/workbook.xml"); the + // zip entry names are relative ("xl/workbook.xml"). Normalize entry names to + // the leading-slash form so they line up with the map's PartName values. + internal static string ToPartName(string entryFullName) => + entryFullName.StartsWith('/') ? entryFullName : "/" + entryFullName; + + static string Extension(string partName) + { + var lastDot = partName.LastIndexOf('.'); + if (lastDot < 0 || lastDot == partName.Length - 1) + { + return ""; + } + + // A dot must be in the final segment to be an extension. + var lastSlash = partName.LastIndexOf('/'); + if (lastDot < lastSlash) + { + return ""; + } + + return partName.Substring(lastDot + 1).ToLowerInvariant(); + } + + readonly record struct PartContentType(string PartName, string ContentType); } diff --git a/src/Directory.Build.props b/src/Directory.Build.props index bbb6c2d..154edb7 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -2,7 +2,7 @@ CS1591;CS0649;CA1416;NU1608;NU1109;NU1510 - 0.29.0 + 0.30.0 preview 1.0.0 Modify System.IO.Packaging (https://learn.microsoft.com/en-us/dotnet/api/system.io.packaging) files to ensure they are deterministic. Helpful for testing, build reproducibility, security verification, and ensuring package integrity across different build environments. diff --git a/src/Tests/Patching/ContentTypesPatcherTests.MostCommonBecomesDefault.verified.txt b/src/Tests/Patching/ContentTypesPatcherTests.MostCommonBecomesDefault.verified.txt new file mode 100644 index 0000000..e562852 --- /dev/null +++ b/src/Tests/Patching/ContentTypesPatcherTests.MostCommonBecomesDefault.verified.txt @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/Tests/Patching/ContentTypesPatcherTests.cs b/src/Tests/Patching/ContentTypesPatcherTests.cs new file mode 100644 index 0000000..4a13a16 --- /dev/null +++ b/src/Tests/Patching/ContentTypesPatcherTests.cs @@ -0,0 +1,97 @@ +[TestFixture] +public class ContentTypesPatcherTests +{ + const string variantDefaultIsWorkbook = + """ + + + + + + + + """; + + // Same package, but the producer chose a different content type for the "xml" + // Default and moved the workbook to an Override. Semantically identical. + const string variantDefaultIsWorksheet = + """ + + + + + + + """; + + static string[] partNames = + [ + "/_rels/.rels", + "/xl/workbook.xml", + "/xl/worksheets/sheet1.xml", + "/xl/worksheets/sheet2.xml", + "/xl/styles.xml" + ]; + + static string Patch(string xml) => + PatchHelper + .Patch(new ContentTypesPatcher(partNames), xml, "[Content_Types].xml") + .ToString(); + + // The two equivalent producer splits must canonicalize to identical output. + [Test] + public void SplitChoiceIsCanonicalized() => + Assert.That(Patch(variantDefaultIsWorksheet), Is.EqualTo(Patch(variantDefaultIsWorkbook))); + + // The most-common content type for an extension becomes its Default; here two + // worksheets vs one each of workbook/styles, so worksheet+xml wins the "xml" + // Default and the two worksheet parts carry no Override. + [Test] + public Task MostCommonBecomesDefault() => + Verify(Patch(variantDefaultIsWorkbook)); + + // Every part still resolves to the content type it had in the input: the + // rewrite must be OPC-preserving, only relocating declarations between + // Default and Override. + [Test] + public void ContentTypesArePreserved() + { + var patched = XDocument.Parse(Patch(variantDefaultIsWorkbook)); + + var expected = new Dictionary + { + ["/_rels/.rels"] = "application/vnd.openxmlformats-package.relationships+xml", + ["/xl/workbook.xml"] = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml", + ["/xl/worksheets/sheet1.xml"] = "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml", + ["/xl/worksheets/sheet2.xml"] = "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml", + ["/xl/styles.xml"] = "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml" + }; + + foreach (var (partName, contentType) in expected) + { + Assert.That(Resolve(patched, partName), Is.EqualTo(contentType), + $"'{partName}' resolved to the wrong content type"); + } + } + + // Resolves a part's content type the way an OPC reader would: an Override for + // that exact part wins, otherwise the Default for its extension. + static string? Resolve(XDocument contentTypes, string partName) + { + XNamespace ns = "http://schemas.openxmlformats.org/package/2006/content-types"; + var root = contentTypes.Root!; + + var over = root.Elements(ns + "Override") + .FirstOrDefault(_ => (string?) _.Attribute("PartName") == partName); + if (over != null) + { + return (string?) over.Attribute("ContentType"); + } + + var extension = partName[(partName.LastIndexOf('.') + 1)..]; + var def = root.Elements(ns + "Default") + .FirstOrDefault(_ => + string.Equals((string?) _.Attribute("Extension"), extension, StringComparison.OrdinalIgnoreCase)); + return (string?) def?.Attribute("ContentType"); + } +} diff --git a/src/Tests/Tests.AbsPath.DotNet.verified.xlsx b/src/Tests/Tests.AbsPath.DotNet.verified.xlsx index e1cfb1fe3470f5a75d4812e7fa138d250858d95a..a6c9a2105b1e768d9e65161878f60b333fd27b2e 100644 GIT binary patch delta 518 zcmaEyd?C3$z?+#xgn@y91Bev^Iw}*wBN!PN&af~r2m?i;o%8cbQu9jULn;eWi(~aF za&y*9Iq1i%D9{$4dU&hm7P%h7yWax#W(n6aw%m*jO5iYFdprH}1LdDwY1?nDFuZB@ zwsnHRpZmuJepFP?*S+YLvN>WY>O^SSVtxuyMxu zdF7ldGMf8Cy4o!7YPl|JT;Q41bb~EEk#Ck~(z?(~X=}3s!Y7~HY9t}4)W7qzz~`H? zAytoe?#P#XbWgciJy7R+tL$nKE7kWsY3+fzi~l-H)(fVv-M=32Sg7~b1J{NBT)%iP z7uc|B4r6zkutNQ&B~u)uvluKYes)#fJ$>jv~J1>lN8pRJIN-T zVb|t}4UeZ7I;OFg$lOV2yZrJ#@4GVj?wq|ww`QjyP5!e?W@H!H zyoym@mkSXClOO8^GImZj)wf_=H#tw=mN9Sg8hty)HIrZKyEA=Zn`~lW!?<>Gp@AcB zJ|_c1MUH-PNo7uI@gzf$$!vTA+`!m_f~S+;88|TRo~&={sDc*j}hCFTSjZTS` z2JLd-D80qHfmLOPgNM!B6`nFT^Q>*9x%-ZY1}wK>(W+gMI$7t@pZn?Vr*5BqU2x}E zz?sGy$*ZnZ-VA3|={~pIb7@-8cfHVqNt28jg+sD9*Bo2?@UjuJcrH(;_SKFj+G}r` z3Ghyzp}5uXipNEc=^ny!>wD+U;(Xz_zkZ>vTBC|>Wa^5GAK0>txr6R(W6FH%C=elf z{q-Ty)j?{{AFLJZ_dGxOx9iJV0k5VDR|_5+&);ge!YSXS#Jyg~PXFHd#uL^Way%#J zb_Qs^yO|w~)I&Tfa{Jb9Kcp)p+yI0etPBsi#!IEwolsS(;3X$4%l-2GgF$;$`>we zaomdO|N0=eb@V<^5THK$mA@&|p<$qxEbj0Y!2>)SFm zPM)c6$GCs;4SjbecJ|4N1~!ZbCdU~#GB!@6aWAK2mk;8Ay9~UU{_NC007Jc000w{!7dhmt&~kp!!Qtq zuVQ(N61OZ6LQT6UY@rfdz}S<x-Wg3?SF2$EP>OFt$;!S58<+5k8>CSGBKp!Pgjm4 zMC|s%YmAGF51h|s`}?)4{#P{q0#Hi>1e4t^8nd$j^DGL8d0@6aWAK2mk;8AyAiS1HNPd005)~000w{ur3yVwUp6L!Y~wu zU#01-*$P}3V;EeZw@RWfP}?)s(6voZL3lPVd?a7NvmqFaG6;CHW;^Hq|F36TKi=Ml z<5g|h5+WM!3f|9qoPkqb8#gQXB9++-X!yJifQ+;b3tpuZZiPTq zK`k-&0UT9IA8VQDHqJzUkZLYxAO^kOwNTzAa4AcT2OkaZpp*-n*!_wgZ#W`YCc3%@R3FnjRrQAF+Iqd+JyFM z8ht=Pg8Z<}FQC3GjRNvm)FjEFA=03;K$Z}bfp6-A;mSuiJ$*ZBrbc~i38K?eU0BHAN%^a)T)0|b-IE*i6<0rM;h zmuLgNWB~vGqy>|oE>QuMlkqM%0ke}TFFgTplV~qK0jHCvFGm6ClkYD*0i2U9FhK!Y zlW#CO0>llI&kYrmz%VKSi<9dxJOUOMlOY!xlSD8OlY1->3;+NC000000001fER!J@ P6_bQ96$X|r00000ERfv( diff --git a/src/Tests/Tests.AbsPathZip/[Content_Types].verified.xml b/src/Tests/Tests.AbsPathZip/[Content_Types].verified.xml index 1cb0201..54ab818 100644 --- a/src/Tests/Tests.AbsPathZip/[Content_Types].verified.xml +++ b/src/Tests/Tests.AbsPathZip/[Content_Types].verified.xml @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/src/Tests/Tests.Numbering.DotNet.verified.docx b/src/Tests/Tests.Numbering.DotNet.verified.docx index 1762fdc4e0402e5a5bd71930b4fd48f72142d992..2cbdb23489637e17d9ac144c37c910372fe017be 100644 GIT binary patch delta 582 zcmV-M0=fOqf(OEa2Y*mY0|XQR000O8001FSkF~m?dI10c7zO|U6951JTSISdbY*UI zUsQQ;WpiCFcx`O7l)-M>FbsxY#n82gmG)2!L!2JgUfTle3n&t8tCL89ViM=scGx5B z6$aa@F%&DDAn8RHlK=OS2mSu}YjxMfQ0#!SC#=+Uxl{$9C4c9!snk~L#TQj%G3ZPn zgi0MCtGo5;<&Yp3T@08j)rzFAT4&orG`XY%*u_v2MD#X1aS0tP0*;~+t}E%D&=DzFc$QGhZsVBH)K)@-Wu_QdWY_v+TyQP z$qFrELw%gnHTmvv*KD8Odgp1Ft3_fI?hKjD*!9=`SUAA_+0x3K{M54;JFwYs5t0RR9Pm&v^WQUR-%9KHcK z0ne9Jz5zV}P?wXw0X_kFm(sogNdgxKlRyU;mo>iuDgyNimtnsFJptC2pT7Y=0(c*j zp&uBR_`d-v0m+vmzyUu22A5;N0X`4utpNacZ*pWWb98xZWpkG?zX24N#J~X>0mGNy UzyU%5%$Fj;0Vf8dy#W9K0E{;Pd;kCd delta 566 zcmV-60?GZtf(Orn2OCgJ0|XQR000O8001FSrT`LLhXDWpWd;BM6PM1t0TzF>l|gRX zFc3wrB5+$+bh0Rd!g3aEwrzms0yH_2n26$(kUS_Dayz|MwR4FCI& z1O)zm{I$C7VkmY%>=Rb%qFky1&?e`xsnk~L#g!^p3_24MLZuGC>UzDpJ7nOZivhV( ztw{c&HQN@V;WA~wE`~Z$G{S#nqDE(9A4~)Ka=HAhZ9)N*h4c)yUVVewY=aaxodAv= z_Zb>hd>uFTU6t~&2aE&#Y=|K6laR?dcx%Kb)H`%f)E0lWN`f%#;nrvV)Wz^p#V~rY z;TZg}10wIBxHTl-O@vBmm+UR2%-ZB!zK(fDG}X1Y;F8@&Kq;X&a^Qa!nNkK45C5!R zEw_o_{q4tV>eFwn+$VC{wuXeq&&A27c4YP*n;6OgIA1>{Pi^jLnUV$OQDB-x<8fZ3 zPAGR~6X5(N6MEhPw{ZjHu{poRgr2ux5b@aX`6Z6zH#o>4z(*Ji-1&ZKA;P$x{#y)~ z`OZCTety{1{|BE;^zZ~mtp5O$5eF25xdFGi0Rj5E38nxNT!#Sw0A-iFy#Z1IxR(#U z0XPBNmq@+=Jpo;phQ0wl0fv{wz5z)AB$p4r0Yd@;3zHEG6PIVd0V)CGmy*8$KLLf8 z(!T*i0oIomzyUu26PH%N0X_ltmzBT)JOj|S0hi#m0T!3)zyT@&*_Rc;0Vf8qy#W9K E0AUUMWB>pF diff --git a/src/Tests/Tests.Numbering.Net.verified.docx b/src/Tests/Tests.Numbering.Net.verified.docx index 2ed2e4a055094a3af055f7ca79aa044435a7a8b9..2e4de97672d6a18fd7de63962efe73be7c804f13 100644 GIT binary patch delta 557 zcmV+|0@D4&fCsjK2OCgJ0|XQR000O8001FSkF~m?aRC4T7zO|U6PM7u0TzF?lub^< zFc5{W5_yXfw=57sO}hZLP>Ei^wI_+ef3ltaoQ(xX;tEU>8lei5mbRNn_RM?ln~CJl z_m9bJqgAp3AEY%o8D}GsfZ{XcjW-z+k1YUbBctUs8X^_!}#MUXMmMlv@+Q#56V@WIB0(g4HS}j~l%1I9?r; zB)RVzo2;Bj-57KQ`m4x;3VR~voRXYHtkabdduZu5R))&9CsfjfD{S~HqAeYhV2eU> z5SG^(C7JMSjhodf;}!FVKH`B(#0j zr(aM@0|XQR000O8004u$0k^yX0r|QKkF~m?aRC4T7?-}h0a5{?ml3@II03zvO1%L+ z0X>(9y#YP}UYEzc0Z9V$29q5J7?&!(0V)B{msP$2J^`JVl)eE!0Xmn|z5zo4f|nS- v0Y3rAmsr06J^`PXm%jl#0n3-vzX3u6#k&EQ@VfyOmoC5o5C)gL0RR91ACT>4 delta 578 zcmV-I0=@mVfCt2Y2Y*mY0|XQR000O8001FSrT`LLe*pjhWd;BM6951JTSISdbY*UI zUsQQ;WpiCFcx`O8l}%2=Fc5{W5_yXfw=57sO}hZLP>Ei^wI_)o{*mqU=WHxE5?5f7 z(15D8DYV@rif7(?pGQgj`TjAQtW+5-z#wk3Uw=eX+MBQuKI1%{6cA0B3r|d88x@96ow1&xAUSNa1Jq=hG(P)yGCIjT4j?xZvB{@Z? \ No newline at end of file + \ No newline at end of file diff --git a/src/Tests/Tests.RunAsync_extension=nupkg/[Content_Types].verified.xml b/src/Tests/Tests.RunAsync_extension=nupkg/[Content_Types].verified.xml index 9525a5f..7881007 100644 --- a/src/Tests/Tests.RunAsync_extension=nupkg/[Content_Types].verified.xml +++ b/src/Tests/Tests.RunAsync_extension=nupkg/[Content_Types].verified.xml @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/src/Tests/Tests.RunAsync_extension=xlsx/[Content_Types].verified.xml b/src/Tests/Tests.RunAsync_extension=xlsx/[Content_Types].verified.xml index ebb83d2..63dc9cd 100644 --- a/src/Tests/Tests.RunAsync_extension=xlsx/[Content_Types].verified.xml +++ b/src/Tests/Tests.RunAsync_extension=xlsx/[Content_Types].verified.xml @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/src/Tests/Tests.RunBinaryAsync_extension=docx.DotNet.verified.docx b/src/Tests/Tests.RunBinaryAsync_extension=docx.DotNet.verified.docx index f76ce4c0731a6bc68e1dbff17663e363de1cd14d..faf4f65eedd25eb551c95db61024b4ef5088631a 100644 GIT binary patch delta 458 zcmV;*0X6=QRfSa;P)h>@6aWAK2mk;8Ay93ok=0NE0086!kr*9+!!Qs4zY_V161N-> zLQQ)Bu26}7z_mAtg}rOp+cte02cEH6a6X&K*NcCl64mmE-KOWx!oW1eZj1zdP8uN})nT*S8e+5t zvbl=D8q)JfAxTXUij(d8`MTT3DmN639D>gsxTA$gNE%YISbJ9tJ6>5l98wYT zLM@6aWAK2mk;8Ay82p#9CSb001imkr*9+0x=XouQKV@Fa;OJ z7zP&VR!QUnrTsJ0*#6(N9~jQ&!XtSFGlQTp2pC|~P5a+_?V=xV@56E9UABOjEMXxA zd0%9JnvBJ&5OXejw<1fd&?rX;g;+rn(23&VUa7kqM>w~SU5Gn*`wPH&s z7ifN2dS8Y-g6qzt+JL0kM-=DL(=AlbI<#0cw-jDLer&lNBmL0TYv0DklcGCjbBd E0JoaPS^xk5 diff --git a/src/Tests/Tests.RunBinaryAsync_extension=docx.Net.verified.docx b/src/Tests/Tests.RunBinaryAsync_extension=docx.Net.verified.docx index e7175d0a17528505675466ff955260abc250bb9e..d76fc61ffe1b67ef8fda77cf0ec81bfc936bf21d 100644 GIT binary patch delta 469 zcmV;`0V@8jR-#rLP)h>@6aWAK2mk;8Ay93ok=0890086!000w{fhZP#wUkXx!!Qtq zuVQ(N61OZ6LQT5>wor*)z_ll>h5uwv|IWsOBXI>LDGdlArKPZml+1hYdt)VedwCsA zw$8FOq-=t(_^=#s23`ei{G#G3tcz>TGD@$d4IV1KgUl!6(QFqXGxGXe@g-us5hAN4 zIGM{3!PBG;$w{Q!v=C8$s%NRRll;mtRd1+$4AOUCMM?^b1g%Il6D9}Nz99c?eqBQ6tCK4tz z@QHh*15HK)o63X_(owh|7N z()j)&HKAv6Zhx_SUz0AnzeNT_GUdN7aY#O*1MV#RM}s!EpO5sN!u~ouyG0w*&)mTL z>EDk2OL*5rw7;nFJ5Wml1e2X88ndMV!6piAsFBr60RRBx1e0(mQ2~6D!YDWamy`P_ zJpn6|IVnB@Xa$px1s;=^DJlV*lfo%J0fCbNDn9|ZlR+vz0Vk7yDm($*lf5cJ0kD!Q LCk9I>00000QbWgT delta 457 zcmV;)0XF`kR;^YTP)h>@6aWAK2mk;8Ay82p#9CGX001imkr*If3UBUZ# zk27$}YvX1GUtpPCbCys#Ev7I)e`fcTmcOMRvcY$6JpGHgR^lZLC=ZmmyfABvM^0 zo&HA2J_tEYHa%%>Lb{*^&ct3sQ~Hsx8+@eIM5BR?WyA+rQJc_SjiV1q&_I4TW{;>Z zOQV1?78Q-;P#bB`S)fRWXyDWOAYAzfzo+lkR8Jp^T=}R`MJs&jf$KB^D@cjnvC8Ic zrIN;Vi=GLv;GJOSvFvMNFWyOZ@QCk9q100000$S%cK diff --git a/src/Tests/Tests.RunBinaryAsync_extension=nupkg.DotNet.verified.nupkg b/src/Tests/Tests.RunBinaryAsync_extension=nupkg.DotNet.verified.nupkg index 4ead26d764ad59e9857d42f618395127e9a5b327..e2368a778482caf2d28722d50e3c59931ce87458 100644 GIT binary patch delta 354 zcmV-o0iFKuk^qaXe7Y9#MrxzKky*~8q`zZmd5|Fslvq*Y2e}>%*!EzlFPzgB3 z9IS91^JJ2BA9ez>YnmtHA_suk`_+jw$h2Ft!M`1KiDG;-#V@CebyOp&G76KKa_yKDb~?Ht~2Xn`wIX7 z0RR6308mQ<1QY-OvsVM3g9$FCdbZR6000S-|AtZmLIaa*11FPuhbjVj5|eBLCzH*G zF#`4yl883}=94&xIRVI%a)>noY*CZ^h$NHEh%EsellzEL0g{tWi5mu$h5!Hn09r+s A2mk;8 delta 361 zcmV-v0ha#Zk^=9N0X?hcH#g40B`~T022TJ09!+EZggdCbYE0?aAk8{E_iKh zoRUFK#4rp+uM%a8+7uQDp|-OaxB(Z461R;=94mH5;cP585?4UeVTE9Xy7qtnNniea z|L6}jMRkJ0A>*KL+fFM$mwmu_(5p<%gFcM?%Nqf!nj-R`7ZG|ie}>%x$#R%WTNHS385b>$-d6G76wHa_-P${{)j=qp0U9fETTgQLE!6cUBGB62;)Ggp4LT z0ny6*iYC98#FYu$UYc;;jdJpiuFxm+KUQtN7j0cG&``+)MFQ|mP4O>HfynzL1>% H00000&8?o} diff --git a/src/Tests/Tests.RunBinaryAsync_extension=nupkg.Net.verified.nupkg b/src/Tests/Tests.RunBinaryAsync_extension=nupkg.Net.verified.nupkg index 2720e7e32735e5c0e45452a47ae1ce2e50bd20e3..97f085e7d9a12b4b9d2d8e35118449a8e4764b69 100644 GIT binary patch delta 334 zcmcaHjp@WRrVZ{)oO;Wuww+;MVBnk_z$9Hi(bw;=15fLEqfcV0lQ*r zNnzcQBgseoLeCvrd$)Yzvik25Ro+{)VSTxW*jJwMk4idsA~s9Ns1?V`4p#BXJ*t$Ry*=IPc_DsN|C e$SX}xEz!$O3GilR0|piY7Z7e^VqmE00Pz4Q1&*u$ delta 350 zcmV-k0ipiLmIBz80BSsf(m76|Ns1?FMqy&wEOcM)d@0(gq^;x8?69c@&U(A zFEUh*df&G%Zv?DL6}i)s2t66YZi3lzod~cbL&~$2a?GP4>t5{$X4f79naiA{OyIWCgyUwEXYc3+ zeM0|Z)#`iE+NBH?<&tIzz;~tcmnK8xZIVK+9i9T+RIJfIMlkFD>AwK8HUpW32{%XA zcH95}0C1Doh*APZ1CxJ=CzDf&DgpnKeu-HDe3RITI00vq5sEnho|8+8H39aMfr?TB w5{8o=h9{H!iYg+9hX4R>b!TOCE^TB`O9ci10000A015!M0ssJvhyVZp079ylkpKVy diff --git a/src/Tests/Tests.RunBinaryAsync_extension=xlsx.DotNet.verified.xlsx b/src/Tests/Tests.RunBinaryAsync_extension=xlsx.DotNet.verified.xlsx index 562da0d9cd451c8cb04252f877b3a1bfcfc27e09..9595ec62362992e643764474a57965644c1f902b 100644 GIT binary patch delta 447 zcmV;w0YLt>FRL#XP)h>@6aWAK2mk;8Ay8!qTZc^n002{w7ao5DArOXNg>W?stp{UF zw>_v=ZK5xLFuO|%3}L2q`)nS3BwxXFt2H$ywP`PK;OGCo;lRh+`()O~AXZSwW2)s? zjii8N(fQQYa>-3~Ed{Yj&IC+Q%QcXkO()Om3?%v(64kO}&No_@n$8 za=$3m7eN&WLxwt^>7tK83jHTyI68)aP2(*%w95#I6>O>;xGERSP}su{?r{aBcn4x` z3O|?#wbTynykI76v4A?7{ypF3_J5Im(A1d%?um;}EvZFQXQo`hIO+g62DR6HP=wb3 z&TcT29zt^m5w`32WPzdP5b+hu;stSW_6G-G6^&2-5g5{>hwb#a_f2;FI}ttn2-8mh zvw{Jw6A5JqTZc^n002{yI2BR>ev^w8I02)R#1%aPO9Yc~1QU}M7AgT$lR*|o0fv)_ p7C`}Ulgk!50y+wlU@6aWAK2mk;8Ay8BSOYc_!005c<000w{Kou5$tdzk{0x=MV zU#02Q>=ry2V^}z-S0&LGsO{`-L)&RO11`_z!AJ5H42xheC>Xf3htB-pH*@I6+xuwJ z1uqtm$ziPIupCGM(V%s)spOpN;#vw~9j*2lp^{4=IT??hmkCI8!AGiO%baeMBGW?9 zRAPeI1z%$hnyJLxsHDw*OgEq|2ZJkRFfv3gc$Fc?qdTbe+_Sjv7~>P`!4^6JM3ej$Kmk0HJr_Izs}hsF5*m}0 M7Z3&?6#xJL04*QLOaK4? diff --git a/src/Tests/Tests.RunBinaryAsync_extension=xlsx.Net.verified.xlsx b/src/Tests/Tests.RunBinaryAsync_extension=xlsx.Net.verified.xlsx index bfa7808127176bdd38d9bd5b84543fb492868ec0..6e617643129c810f178aa1bab3ded2619ee5854a 100644 GIT binary patch delta 483 zcmV<90UZA2F5E7EP)h>@6aWAK2mk;8Ay8!qTZc&j002`2000vJ003JW5JQQ0uvXC zS|PPnyNQ*|pa1?imcKqeN0U|O#1azP;43*S2U38qgRy>pR>=i5#jO-b+8gbHhf1yi zxq!HueeC-78I?;*#d z2Wa%dk$7D3=S_|T4yCx?2zyo~b&Sr|nz*i(-t19|A418US%a;Oc*O!K)W3*aI)xCL z#@1j$z38}qrG(zffGJ{PVIm8ExM$wbWDSU^PV}TZHdov@WhL_X3Cfe{zw`Co$0Aow zVXG6E7fSp;@pS6m%or1BgDn7cuH5lH7=+diE}kHp9zqizOV~VzX9vhOhluYX&EG

uP6-NST29u5k7L!mGDgjNCdlotZ3<{Gm3Kf&g7AgVs ZllK-p0$UQ3fD#&$PZtmd#uNYm005dV#y@6aWAK2mk;8Ay8BSOYc$v005c<000w{@e~$+t(3t|0x=MV zU#02Q>=ry2V^}z-S0&LGsO>D<&~2N}fbeV{d?a7NVG#^Q0Rxvd-I@RY{!W_xczYj= z7OfX^$mn9IWWVf50l`G;!laTjs*7tWkaV!x#{iXF0?N^F@Vrcbg0%rF*$|~0rO-6c zYAj=dz?C}YRudodL?vy1rg{SEve&y(CI*5)1+6^faBv5;o_P}Y3;w*$k-?)Bx9i3g ztCBh;?~Ep{t9h_LD8(0{WM$WbjZ1jJ4N|CI5nbs|!bbSWqsh*K80$$?sy*zLQ4;4PtchjLKDAkSg-w)19Ucrh_5kEUt*k|ec-&8t#;v< z09`k#Zae+nyGgeG+aRj@u?#-}vw8ts6A4rSOYc$v005ek-xN{`g8={lUvgz^b1#w> z6_ZdE8Udk`YZW~KLzAf$J^@CP=oLo+a+5F?K>=2iauzxP6_c$NKmq-e?iM@&WRoiw LD+bRL00000vCYaE diff --git a/src/Tests/Tests.RunBinary_extension=docx.DotNet.verified.docx b/src/Tests/Tests.RunBinary_extension=docx.DotNet.verified.docx index 65f7c506d2f28c55e505102d4aeb6563cf9d4388..f25e4186e41517a8c24e597a94ad9cceed61eefc 100644 GIT binary patch delta 458 zcmV;*0X6=PRfJU-P)h>@6aWAK2mk;8Ay93ok=0NE0086!kr*9+!!Qs4zY_V161N-> zLQQ)Bu26}7z_mAtg}rOp+cte02cEH6a6X&K*NcCl64mmE-KOWx!oW1eZj1zdP8uN})nT*S8e+5t zvbl=D8q)JfAxTXUij(d8`MTT3DmN639D>gsxTA$gNE%YISbJ9tJ6>5l98wYT zLM}Dklc5CjbBd05bx) AivR!s delta 467 zcmV;^0WAK6RgP5{P)h>@6aWAK2mk;8Ay82p#9CSb001imkr*9+0x=XouQKV@Fa;OJ z7zP&VR!QUnrTsJ0*#6(N9~jQ&!XtSFGlQTp2pC|~P5a+_?V=xV@56E9UABOjEMXxA zd0%9JnvBJ&5OXejw<1fd&?rX;g;+rn(23&VUa7kqM>w~SU5Gn*`wPH&s z7ifN2dS8Y-g6qzt+Jh3?kFk&$&(o=J^`_lSSddN^^=$>J^^Zz*C{*!F_RQ3LIDz!S1Kn4 Jw@6aWAK2mk;8Ay93ok=0890086!000w{fhZP#wUkXx!!Qtq zuVQ(N61OZ6LQT5>wor*)z_ll>h5uwv|IWsOBXI>LDGdlArKPZml+1hYdt)VedwCsA zw$8FOq-=t(_^=#s23`ei{G#G3tcz>TGD@$d4IV1KgUl!6(QFqXGxGXe@g-us5hAN4 zIGM{3!PBG;$w{Q!v=C8$s%NRRll;mtRd1+$4AOUCMM?^b1g%Il6D9}Nz99c?eqBQ6tCK4tz z@QHh*15HK)o63X_(owh|7N z()j)&HKAv6Zhx_SUz0AnzeNT_GUdN7aY#O*1MV#RM}s!EpO5sN!u~ouyG0w*&)mTL z>EDk2OL*5rw7;nFJ5Wml1e2X88ndMV!6piAsFBr60RRBx1e0(mQ2~6D!YDWamy`P_ zJpn6|IVnB@Xa$px1s;=^DJlV*lfo%J0fCbNDn9|ZlR+vz0Vk7yDm($*lf5cJ0kD!Q LCk9I>00000QbWgT delta 457 zcmV;)0XF`kR;^YTP)h>@6aWAK2mk;8Ay82p#9CGX001imkr*If3UBUZ# zk27$}YvX1GUtpPCbCys#Ev7I)e`fcTmcOMRvcY$6JpGHgR^lZLC=ZmmyfABvM^0 zo&HA2J_tEYHa%%>Lb{*^&ct3sQ~Hsx8+@eIM5BR?WyA+rQJc_SjiV1q&_I4TW{;>Z zOQV1?78Q-;P#bB`S)fRWXyDWOAYAzfzo+lkR8Jp^T=}R`MJs&jf$KB^D@cjnvC8Ic zrIN;Vi=GLv;GJOSvFvMNFWyOZ@QCk9q100000$S%cK diff --git a/src/Tests/Tests.RunBinary_extension=nupkg.DotNet.verified.nupkg b/src/Tests/Tests.RunBinary_extension=nupkg.DotNet.verified.nupkg index 4ead26d764ad59e9857d42f618395127e9a5b327..e2368a778482caf2d28722d50e3c59931ce87458 100644 GIT binary patch delta 354 zcmV-o0iFKuk^qaXe7Y9#MrxzKky*~8q`zZmd5|Fslvq*Y2e}>%*!EzlFPzgB3 z9IS91^JJ2BA9ez>YnmtHA_suk`_+jw$h2Ft!M`1KiDG;-#V@CebyOp&G76KKa_yKDb~?Ht~2Xn`wIX7 z0RR6308mQ<1QY-OvsVM3g9$FCdbZR6000S-|AtZmLIaa*11FPuhbjVj5|eBLCzH*G zF#`4yl883}=94&xIRVI%a)>noY*CZ^h$NHEh%EsellzEL0g{tWi5mu$h5!Hn09r+s A2mk;8 delta 361 zcmV-v0ha#Zk^=9N0X?hcH#g40B`~T022TJ09!+EZggdCbYE0?aAk8{E_iKh zoRUFK#4rp+uM%a8+7uQDp|-OaxB(Z461R;=94mH5;cP585?4UeVTE9Xy7qtnNniea z|L6}jMRkJ0A>*KL+fFM$mwmu_(5p<%gFcM?%Nqf!nj-R`7ZG|ie}>%x$#R%WTNHS385b>$-d6G76wHa_-P${{)j=qp0U9fETTgQLE!6cUBGB62;)Ggp4LT z0ny6*iYC98#FYu$UYc;;jdJpiuFxm+KUQtN7j0cG&``+)MFQ|mP4O>HfynzL1>% H00000&8?o} diff --git a/src/Tests/Tests.RunBinary_extension=nupkg.Net.verified.nupkg b/src/Tests/Tests.RunBinary_extension=nupkg.Net.verified.nupkg index 2720e7e32735e5c0e45452a47ae1ce2e50bd20e3..97f085e7d9a12b4b9d2d8e35118449a8e4764b69 100644 GIT binary patch delta 334 zcmcaHjp@WRrVZ{)oO;Wuww+;MVBnk_z$9Hi(bw;=15fLEqfcV0lQ*r zNnzcQBgseoLeCvrd$)Yzvik25Ro+{)VSTxW*jJwMk4idsA~s9Ns1?V`4p#BXJ*t$Ry*=IPc_DsN|C e$SX}xEz!$O3GilR0|piY7Z7e^VqmE00Pz4Q1&*u$ delta 350 zcmV-k0ipiLmIBz80BSsf(m76|Ns1?FMqy&wEOcM)d@0(gq^;x8?69c@&U(A zFEUh*df&G%Zv?DL6}i)s2t66YZi3lzod~cbL&~$2a?GP4>t5{$X4f79naiA{OyIWCgyUwEXYc3+ zeM0|Z)#`iE+NBH?<&tIzz;~tcmnK8xZIVK+9i9T+RIJfIMlkFD>AwK8HUpW32{%XA zcH95}0C1Doh*APZ1CxJ=CzDf&DgpnKeu-HDe3RITI00vq5sEnho|8+8H39aMfr?TB w5{8o=h9{H!iYg+9hX4R>b!TOCE^TB`O9ci10000A015!M0ssJvhyVZp079ylkpKVy diff --git a/src/Tests/Tests.RunBinary_extension=xlsx.DotNet.verified.xlsx b/src/Tests/Tests.RunBinary_extension=xlsx.DotNet.verified.xlsx index 8b472e584cee5452a5979ea864427546206f196f..a5e23e6c3ce9569b5e6c3ce2d395ddfaa4a6c805 100644 GIT binary patch delta 452 zcmV;#0XzP-FRU*YP)h>@6aWAK2mk;8Ay8!qTZc^n002{w7ao5DArOXNg>W?stp{UF zw>_v=ZK5xLFuO|%3}L2q`)nS3BwxXFt2H$ywP`PK;OGCo;lRh+`()O~AXZSwW2)s? zjii8N(fQQYa>-3~Ed{Yj&IC+Q%QcXkO()Om3?%v(64kO}&No_@n$8 za=$3m7eN&WLxwt^>7tK83jHTyI68)aP2(*%w95#I6>O>;xGERSP}su{?r{aBcn4x` z3O|?#wbTynykI76v4A?7{ypF3_J5Im(A1d%?um;}EvZFQXQo`hIO+g62DR6HP=wb3 z&TcT29zt^m5w`32WPzdP5b+hu;stSW_6G-G6^&2-5g5{>hwb#a_f2;FI}ttn2-8mh zvw{Jx6A5JqTZc^n002{yITca?ev^z9I02)R#T7jQO9Yc~1QU}N7AgW%1(SLO9Ft!b uDglO*iWWfuaFfgyIs!ThlVA!JlN}c-0W*_G7d!!?lZ6*61{M_n0002BSGIxx delta 483 zcmV<90UZ9UFSaimP)h>@6aWAK2mk;8Ay8BSOYc_!005c<000w{K@}E%tdzk{0x=MV zU#02Q>=ry2V^}z-S0&LGsO{`-L)&RO11`_z!AJ5H42xheC>Xf3htB-pH*@I6+xuwJ z1uqtm$ziPIupCGM(V%s)spOpN;#vw~9j*2lp^{4=IT??hmkCI8!AGiO%baeMBGW?9 zRAPeI1z%$hnyJLxsHDw*OgEq|2ZJkRFfv3gc$Fc?qdTbe+_Sjv7~@6aWAK2mk;8Ay8!qTZc&j002`2000vJ003JW5JQQ0uvXC zS|PPnyNQ*|pa1?imcKqeN0U|O#1azP;43*S2U38qgRy>pR>=i5#jO-b+8gbHhf1yi zxq!HueeC-78I?;*#d z2Wa%dk$7D3=S_|T4yCx?2zyo~b&Sr|nz*i(-t19|A418US%a;Oc*O!K)W3*aI)xCL z#@1j$z38}qrG(zffGJ{PVIm8ExM$wbWDSU^PV}TZHdov@WhL_X3Cfe{zw`Co$0Aow zVXG6E7fSp;@pS6m%or1BgDn7cuH5lH7=+diE}kHp9zqizOV~VzX9vhOhluYX&EG

uP6-NST29u5k7L!mGDgjNCdlotZ3<{Gm3Kf&g7AgVs ZllK-p0$UQ3fD#&$PZtmd#uNYm005dV#y@6aWAK2mk;8Ay8BSOYc$v005c<000w{@e~$+t(3t|0x=MV zU#02Q>=ry2V^}z-S0&LGsO>D<&~2N}fbeV{d?a7NVG#^Q0Rxvd-I@RY{!W_xczYj= z7OfX^$mn9IWWVf50l`G;!laTjs*7tWkaV!x#{iXF0?N^F@Vrcbg0%rF*$|~0rO-6c zYAj=dz?C}YRudodL?vy1rg{SEve&y(CI*5)1+6^faBv5;o_P}Y3;w*$k-?)Bx9i3g ztCBh;?~Ep{t9h_LD8(0{WM$WbjZ1jJ4N|CI5nbs|!bbSWqsh*K80$$?sy*zLQ4;4PtchjLKDAkSg-w)19Ucrh_5kEUt*k|ec-&8t#;v< z09`k#Zae+nyGgeG+aRj@u?#-}vw8ts6A4rSOYc$v005ek-xN{`g8={lUvgz^b1#w> z6_ZdE8Udk`YZW~KLzAf$J^@CP=oLo+a+5F?K>=2iauzxP6_c$NKmq-e?iM@&WRoiw LD+bRL00000vCYaE diff --git a/src/Tests/Tests.Run_extension=docx/[Content_Types].verified.xml b/src/Tests/Tests.Run_extension=docx/[Content_Types].verified.xml index 7dad325..2d007b1 100644 --- a/src/Tests/Tests.Run_extension=docx/[Content_Types].verified.xml +++ b/src/Tests/Tests.Run_extension=docx/[Content_Types].verified.xml @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/src/Tests/Tests.Run_extension=nupkg/[Content_Types].verified.xml b/src/Tests/Tests.Run_extension=nupkg/[Content_Types].verified.xml index 9525a5f..7881007 100644 --- a/src/Tests/Tests.Run_extension=nupkg/[Content_Types].verified.xml +++ b/src/Tests/Tests.Run_extension=nupkg/[Content_Types].verified.xml @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/src/Tests/Tests.Run_extension=xlsx/[Content_Types].verified.xml b/src/Tests/Tests.Run_extension=xlsx/[Content_Types].verified.xml index ebb83d2..63dc9cd 100644 --- a/src/Tests/Tests.Run_extension=xlsx/[Content_Types].verified.xml +++ b/src/Tests/Tests.Run_extension=xlsx/[Content_Types].verified.xml @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/src/Tests/Tests.WithWorkbookRels.DotNet.verified.xlsx b/src/Tests/Tests.WithWorkbookRels.DotNet.verified.xlsx index e1cfb1fe3470f5a75d4812e7fa138d250858d95a..a6c9a2105b1e768d9e65161878f60b333fd27b2e 100644 GIT binary patch delta 518 zcmaEyd?C3$z?+#xgn@y91Bev^Iw}*wBN!PN&af~r2m?i;o%8cbQu9jULn;eWi(~aF za&y*9Iq1i%D9{$4dU&hm7P%h7yWax#W(n6aw%m*jO5iYFdprH}1LdDwY1?nDFuZB@ zwsnHRpZmuJepFP?*S+YLvN>WY>O^SSVtxuyMxu zdF7ldGMf8Cy4o!7YPl|JT;Q41bb~EEk#Ck~(z?(~X=}3s!Y7~HY9t}4)W7qzz~`H? zAytoe?#P#XbWgciJy7R+tL$nKE7kWsY3+fzi~l-H)(fVv-M=32Sg7~b1J{NBT)%iP z7uc|B4r6zkutNQ&B~u)uvluKYes)#fJ$>jv~J1>lN8pRJIN-T zVb|t}4UeZ7I;OFg$lOV2yZrJ#@4GVj?wq|ww`QjyP5!e?W@H!H zyoym@mkSXClOO8^GImZj)wf_=H#tw=mN9Sg8hty)HIrZKyEA=Zn`~lW!?<>Gp@AcB zJ|_c1MUH-PNo7uI@gzf$$!vTA+`!m_f~S+;88|TRo~&={sDc*j}hCFTSjZTS` z2JLd-D80qHfmLOPgNM!B6`nFT^Q>*9x%-ZY1}wK>(W+gMI$7t@pZn?Vr*5BqU2x}E zz?sGy$*ZnZ-VA3|={~pIb7@-8cfHVqNt28jg+sD9*Bo2?@UjuJcrH(;_SKFj+G}r` z3Ghyzp}5uXipNEc=^ny!>wD+U;(Xz_zkZ>vTBC|>Wa^5GAK0>txr6R(W6FH%C=elf z{q-Ty)j?{{AFLJZ_dGxOx9iJV0k5VDR|_5+&);ge!YSXS#Jyg~PXFHd#uL^Way%#J zb_Qs^yO|w~)I&Tfa{Jb9Kcp)p+yI0etPBsi#!IEwolsS(;3X$4%l-2GgF$;$`>we zaomdO|N0=eb@V<^5THK$mA@&|p<$qxEbj0Y!2>)SFm zPM)c6$GCs;4SjbecJ|4N1~!ZbCdU~#GB!@6aWAK2mk;8Ay9~UU{_NC007Jc000w{!7dhmt&~kp!!Qtq zuVQ(N61OZ6LQT6UY@rfdz}S<x-Wg3?SF2$EP>OFt$;!S58<+5k8>CSGBKp!Pgjm4 zMC|s%YmAGF51h|s`}?)4{#P{q0#Hi>1e4t^8nd$j^DGL8d0@6aWAK2mk;8AyAiS1HNPd005)~000w{ur3yVwUp6L!Y~wu zU#01-*$P}3V;EeZw@RWfP}?)s(6voZL3lPVd?a7NvmqFaG6;CHW;^Hq|F36TKi=Ml z<5g|h5+WM!3f|9qoPkqb8#gQXB9++-X!yJifQ+;b3tpuZZiPTq zK`k-&0UT9IA8VQDHqJzUkZLYxAO^kOwNTzAa4AcT2OkaZpp*-n*!_wgZ#W`YCc3%@R3FnjRrQAF+Iqd+JyFM z8ht=Pg8Z<}FQC3GjRNvm)FjEFA=03;K$Z}bfp6-A;mSuiJ$*ZBrbc~i38K?eU0BHAN%^a)T)0|b-IE*i6<0rM;h zmuLgNWB~vGqy>|oE>QuMlkqM%0ke}TFFgTplV~qK0jHCvFGm6ClkYD*0i2U9FhK!Y zlW#CO0>llI&kYrmz%VKSi<9dxJOUOMlOY!xlSD8OlY1->3;+NC000000001fER!J@ P6_bQ96$X|r00000ERfv( diff --git a/src/Tests/Tests.WithWorkbookRelsZip/[Content_Types].verified.xml b/src/Tests/Tests.WithWorkbookRelsZip/[Content_Types].verified.xml index 1cb0201..54ab818 100644 --- a/src/Tests/Tests.WithWorkbookRelsZip/[Content_Types].verified.xml +++ b/src/Tests/Tests.WithWorkbookRelsZip/[Content_Types].verified.xml @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file