From 7755191d8212bc3d92c4a0d9dd317ac02980d616 Mon Sep 17 00:00:00 2001 From: Alexander Pliushchou Date: Mon, 6 May 2024 06:50:43 +0000 Subject: [PATCH] Fix illegal modification on document opening DEVSIX-8167 Autoported commit. Original commit hash: [9ad717077] --- .../itext/kernel/pdf/ParentTreeTest.cs | 84 ++++++++++++++++++ .../cmp_objRefNoStructParentModification.pdf | Bin 0 -> 7486 bytes .../cmp_objRefNoStructParentNoReader.pdf | Bin 0 -> 1273 bytes .../cmp_xObjNoStructParentModification.pdf | Bin 0 -> 2253 bytes .../ParentTreeTest/objRefNoStructParent.pdf | Bin 0 -> 7194 bytes .../pdf/ParentTreeTest/xObjNoStructParent.pdf | Bin 0 -> 2005 bytes .../KernelExceptionMessageConstant.cs | 8 +- .../kernel/pdf/tagging/ParentTreeHandler.cs | 40 ++++++--- port-hash | 2 +- 9 files changed, 119 insertions(+), 15 deletions(-) create mode 100644 itext.tests/itext.kernel.tests/resources/itext/kernel/pdf/ParentTreeTest/cmp_objRefNoStructParentModification.pdf create mode 100644 itext.tests/itext.kernel.tests/resources/itext/kernel/pdf/ParentTreeTest/cmp_objRefNoStructParentNoReader.pdf create mode 100644 itext.tests/itext.kernel.tests/resources/itext/kernel/pdf/ParentTreeTest/cmp_xObjNoStructParentModification.pdf create mode 100644 itext.tests/itext.kernel.tests/resources/itext/kernel/pdf/ParentTreeTest/objRefNoStructParent.pdf create mode 100644 itext.tests/itext.kernel.tests/resources/itext/kernel/pdf/ParentTreeTest/xObjNoStructParent.pdf diff --git a/itext.tests/itext.kernel.tests/itext/kernel/pdf/ParentTreeTest.cs b/itext.tests/itext.kernel.tests/itext/kernel/pdf/ParentTreeTest.cs index 9cd46837df..0560d4bf1e 100644 --- a/itext.tests/itext.kernel.tests/itext/kernel/pdf/ParentTreeTest.cs +++ b/itext.tests/itext.kernel.tests/itext/kernel/pdf/ParentTreeTest.cs @@ -333,6 +333,85 @@ public virtual void XObjDoesntHaveStructParentTest() { )); } + [NUnit.Framework.Test] + [LogMessage(iText.IO.Logs.IoLogMessageConstant.TAG_STRUCTURE_INIT_FAILED)] + public virtual void ObjRefNoStructParentNoModificationTest() { + String pdf = sourceFolder + "objRefNoStructParent.pdf"; + String outPdf = destinationFolder + "objRefNoStructParentNoModification.pdf"; + PdfReader reader = new PdfReader(pdf).SetStrictnessLevel(PdfReader.StrictnessLevel.CONSERVATIVE); + PdfDocument doc = new PdfDocument(reader, CompareTool.CreateTestPdfWriter(outPdf)); + PdfArray nums = doc.GetCatalog().GetPdfObject().GetAsDictionary(PdfName.StructTreeRoot).GetAsDictionary(PdfName + .ParentTree).GetAsArray(PdfName.Nums); + NUnit.Framework.Assert.IsNull(GetStructParentEntry(nums.Get(3))); + NUnit.Framework.Assert.IsNull(GetStructParentEntry(nums.Get(5))); + NUnit.Framework.Assert.IsNull(GetStructParentEntry(nums.Get(7))); + NUnit.Framework.Assert.IsNull(GetStructParentEntry(nums.Get(9))); + doc.Close(); + } + + [NUnit.Framework.Test] + [LogMessage(KernelLogMessageConstant.STRUCT_PARENT_INDEX_MISSED_AND_RECREATED, Count = 4)] + public virtual void ObjRefNoStructParentModificationTest() { + String pdf = sourceFolder + "objRefNoStructParent.pdf"; + String outPdf = destinationFolder + "objRefNoStructParentModification.pdf"; + String cmpPdf = sourceFolder + "cmp_objRefNoStructParentModification.pdf"; + PdfDocument doc = new PdfDocument(new PdfReader(pdf), CompareTool.CreateTestPdfWriter(outPdf)); + doc.Close(); + NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outPdf, cmpPdf, destinationFolder, "diff" + )); + } + + [NUnit.Framework.Test] + [LogMessage(iText.IO.Logs.IoLogMessageConstant.TAG_STRUCTURE_INIT_FAILED)] + public virtual void XObjNoStructParentNoModificationTest() { + String pdf = sourceFolder + "xObjNoStructParent.pdf"; + String outPdf = destinationFolder + "xObjNoStructParentNoModification.pdf"; + PdfReader reader = new PdfReader(pdf).SetStrictnessLevel(PdfReader.StrictnessLevel.CONSERVATIVE); + PdfDocument doc = new PdfDocument(reader, new PdfWriter(outPdf)); + PdfObject obj = doc.GetCatalog().GetPdfObject().GetAsDictionary(PdfName.StructTreeRoot).GetAsDictionary(PdfName + .ParentTree).GetAsArray(PdfName.Nums).Get(1); + PdfStream xObj = ((PdfDictionary)((PdfArray)obj).Get(0)).GetAsDictionary(PdfName.K).GetAsStream(PdfName.Stm + ); + NUnit.Framework.Assert.IsNull(xObj.Get(PdfName.StructParent)); + doc.Close(); + } + + [NUnit.Framework.Test] + [LogMessage(KernelLogMessageConstant.XOBJECT_STRUCT_PARENT_INDEX_MISSED_AND_RECREATED)] + public virtual void XObjNoStructParentModificationTest() { + String pdf = sourceFolder + "xObjNoStructParent.pdf"; + String outPdf = destinationFolder + "xObjNoStructParentModification.pdf"; + String cmpPdf = sourceFolder + "cmp_xObjNoStructParentModification.pdf"; + PdfDocument doc = new PdfDocument(new PdfReader(pdf), CompareTool.CreateTestPdfWriter(outPdf)); + doc.Close(); + NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outPdf, cmpPdf, destinationFolder, "diff" + )); + } + + [NUnit.Framework.Test] + [LogMessage(KernelLogMessageConstant.STRUCT_PARENT_INDEX_MISSED_AND_RECREATED)] + public virtual void ObjRefNoStructParentNoReaderTest() { + String outPdf = destinationFolder + "objRefNoStructParentNoReader.pdf"; + String cmpPdf = sourceFolder + "cmp_objRefNoStructParentNoReader.pdf"; + PdfDocument pdfDoc = new PdfDocument(CompareTool.CreateTestPdfWriter(outPdf)); + pdfDoc.SetTagged(); + PdfPage page = pdfDoc.AddNewPage(); + PdfDictionary mcrDic = new PdfDictionary(); + mcrDic.Put(PdfName.Pg, page.GetPdfObject()); + mcrDic.Put(PdfName.MCID, new PdfNumber(0)); + mcrDic.Put(PdfName.Obj, new PdfDictionary()); + PdfDictionary elemDic = new PdfDictionary(); + elemDic.Put(PdfName.P, pdfDoc.GetStructTreeRoot().GetPdfObject()); + PdfStructElem elem = new PdfStructElem(elemDic); + elem.MakeIndirect(pdfDoc); + PdfMcr mcr = new PdfObjRef(mcrDic, elem); + elem.AddKid(0, mcr); + pdfDoc.GetStructTreeRoot().AddKid(elem); + pdfDoc.Close(); + NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outPdf, cmpPdf, destinationFolder, "diff" + )); + } + [NUnit.Framework.Test] [LogMessage(iText.IO.Logs.IoLogMessageConstant.CREATED_ROOT_TAG_HAS_MAPPING)] public virtual void CopyPageWithMultipleDocumentTagsTest() { @@ -341,6 +420,11 @@ public virtual void CopyPageWithMultipleDocumentTagsTest() { NUnit.Framework.Assert.DoesNotThrow(() => pdfDoc.GetTagStructureContext().NormalizeDocumentRootTag()); } + private PdfObject GetStructParentEntry(PdfObject obj) { + return ((PdfDictionary)obj).GetAsDictionary(PdfName.K).GetAsDictionary(PdfName.Obj).Get(PdfName.StructParent + ); + } + private bool CheckParentTree(String outFileName, String cmpFileName) { PdfReader outReader = CompareTool.CreateOutputReader(outFileName); PdfDocument outDocument = new PdfDocument(outReader); diff --git a/itext.tests/itext.kernel.tests/resources/itext/kernel/pdf/ParentTreeTest/cmp_objRefNoStructParentModification.pdf b/itext.tests/itext.kernel.tests/resources/itext/kernel/pdf/ParentTreeTest/cmp_objRefNoStructParentModification.pdf new file mode 100644 index 0000000000000000000000000000000000000000..30df41ff5da2c43d33658dd51f4a86647a956b5b GIT binary patch literal 7486 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 literal 0 HcmV?d00001 diff --git a/itext.tests/itext.kernel.tests/resources/itext/kernel/pdf/ParentTreeTest/cmp_xObjNoStructParentModification.pdf b/itext.tests/itext.kernel.tests/resources/itext/kernel/pdf/ParentTreeTest/cmp_xObjNoStructParentModification.pdf new file mode 100644 index 0000000000000000000000000000000000000000..cac56ff956f1eb233782ee58993b3bc48618f253 GIT binary patch literal 2253 zcmbVNUvC>l5RZx~MJEtE@Wj);L`{g|+uhsy2a%=3j+-=b;@YMlrKz-cHy5thK67_& z6FvbSf-is&sEAL|f~cBGyr)geD=)w+vv=p%P8x(b$(j|0$mU~rgyP7I@3O|t}KUpx9{`HXkz+Aw`1p72?Al!SyX&ts7zCv+zNysa1fmuXG8kkjQLt^j2|*;+V|)iHVNkf@5*BYrW~%WBICSaMO&0pJC3tSYm5m*4Tmm^;z1o}aLQ&VNKJLlsnCj8>FlnxI-7f4 za(8jtEMuS5#oz|}K ziuo_ujKcfBCHwyzmnQvWlYTa3^2OF5jMX^fD;9vOgR78lL|X3L?75V)k)K#iX0jI_ zPExBSEvKOtk8o?5z8wYWe!d|G#WAa8OD7@u-j*@t)aS!q4E)t1(2bv>B;=o_lvhTm!CZSQAur^4e^Y3vD>Ht_#gbJN%=+s8< zj{507wj|frgNe^k0-=U&b~K#n{9&9}rfHZYB&Cf}MNvIuaBgF$Mi*?9rNl)WLA;l^L^Gu+F#+(nt2^<&Ju6w3s?R0pLc2AkB2wu0ZRt>8Cf!;UD} zX&b-X118+UFYjNL$fyU2x>)hr*k1+af{=DVT}Hit1;Py-*OP&iJ{MNtScYx#&jV1_x>|;W0;=mhf#REfc8EA!Jfg zY0%J+)m769JS&uzD;*YaJ8+ovr7J?P0x39Sh+#M)@GZ}#jwJ(!f(3!3rfUNacql^~ zvkH@%AbrD<%$6+VUg#R3q~M#5krCf;Wfv%*7D0y$=Z4jec o)GJO=8SXNaEOOM=_y$wx5HU;}<>K zG;BNHJ@M4VjCJ?FdUeCOPAZfc|9NE07a0=1`3j~)x~GQ!A6t`9UfbFESM)&>8% zGZ`c*@E^_&>8~yD#kIz%02f7cYmAF(rk*b%iTx7OQ^f=cDM1M-N+^g4 zlB5t)vE0YSOUdHKL7n?bHr=lmTUr8oK1~gist7_%Wd_uz)*%UBHUNnPvB&^eSgK?lWU%#m!asGD3Qrxo?Eo-)!pw-U%xT!%;qx3mzQ|9&e=UbT)cl|#=Tqmq|P_qK9s$< z@a&4utB)^y>b%q@KYFq`aB|AK*FLsmIQTnt+GyRKv4+_7FJImK<@?UHEc*NPr>|MH z|NQjfTV`}EeQWl;o3=l=Zpo{Eta)_)H8;F7G&i>U{czpu$FBR$+y&FV^w-qvZJUC1 zQ!k#q*il$;e&&`L-@g6mH&!Y4Z~a%#E1R#q;n3~Je)-~?`)_>WLdOT+G2Y(3X3pG? zpWn+33I`6>siUv!8&USXnQQmnwC}>|)8G10#~s6O{<(4LiYE`o2R?g3&mVro7{2Y! zhjzWc=fv;tKOb5iO|3o=I&=JyFPsZ5T6_1N+@9&m&R;b=abUs4O?%fH?;VNm>{11yOqK(*R#bPN+g5r#m#_+_O;Z~w zwa1!QT2HlPPOn~i*iGc1MgnXUtw4Kf=fqbJlOG4Q9D-(8u^K_v6HcCV*7ZoSIBb}p z@JRHe&I#;G!D&2E}SAl&ds=>C%Ua9nh^wT+GPno!Ve?Go+cPd!XB5 zhT)k>JSo+hG7ah)#ItUN>(tDzEzf5Ra4!8(Pa|lKpxI$PPXXC6Vhxj{*FGDw*sc|| zoY7xyRw!EgH0{tL7qdn_3@vnhcp<^Oj0qO8%41P%!a^O!bq!pnk#+@$fF&XkA`)I` z#KaPannt>m(#`s8FPwZAQi3>$o8n!q(fG3NUi4FfF>a#D5fea5O`|l3x^6{l>RXpa zS2k_X%>tlU)368)80l;#3ui19viW{X-crbak_y{tpQVn4X@Nm57#BBOD6NC$#)9qw zuZEMURf2Hk+eaH;+gLAnrW+bdCp1P0W?Y`@$fgSkHuv^f45FQGp&U(5?^2%11fs~Q zwRODC9W>Ri)bjl$P}RWQ$}O=*?y^$WiQ7Qhw1Q51bZ(iR+n^V-DGlUd+Jf-FWSwu# z7qaf}&cscL$6IjeR*zy2Tsl%xop9#f41DWH4O}<|EH6(45}PR48$cwh=fD#zC7j8l zte3qVIDnlAfyi*#!pss3seN4aX;F~emx6LdTGgFg4=)RzF|zS35}oo}bO+vd@U`e@ z&9XDMt*)=xVNNSdGe0$DP@6vNpQG3l#ucLC37HhE&aT$kTkwn*-wmwA+0Pw#>8qnp zb>lOK?*8cGXAYl8x1(9Yr~mYzn!Ip4^5nK7jjy~m+ST~Yzil}6nb^+H-CFr%d6)Uq5%` z(G0SvA{c z)!Y{wIr{w6kwDKqdq>{c+}1UJ%?J6dfvu6i{Orveg_}~S@t%%-p=VL(i#@`E;a8=r zexiJL=9Cd_-iQ7g!dfZ&h+US`YTcE9|XOLK$SQ34#o_3H?HOcTH8HJ*rp}6}Xox)`$#ua>ZJRj!|RRa7gsY zVM&EbIaW^K;hn5vjVQz?$IEoA9lMtoRR0>Gm7qe7SA8}_%=>JJJcb^3>|Ts%GwNG& zcTFjI&0c0>_>W6UD*e?gf0~oI`N*xtK9_ zec-MU==&>e0EK*Z1>TLNYnO!R5IhziQRxslb`9)0zH;qiEIBsZHIWZFa;^U4!|^zgM<=;E{trjQIQ_lw;(cLlQ+N zM(!HMvXu)SeaxE`_;}upue(>0;g2a)j@7lIsbzDzN&nimJd6^}s+vymx~%b`q$s2^ zgiocDqNI}y5mS=H^DWIujFTaO*Hlpk?LY!P$!AiKI9L)hl8RgUI696({iSc@bc}`K rOn;1LzYfDNyj}-t*@V+X$Dt-R4h0HD%`CF2EGeQIsI6Vn9SQs!1-U54 literal 0 HcmV?d00001 diff --git a/itext.tests/itext.kernel.tests/resources/itext/kernel/pdf/ParentTreeTest/xObjNoStructParent.pdf b/itext.tests/itext.kernel.tests/resources/itext/kernel/pdf/ParentTreeTest/xObjNoStructParent.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c4f448cc464bd3aeeeb31583588db3b70921d213 GIT binary patch literal 2005 zcmaJ>OK%%h6t0RYMI#U_Sh2dBs0mSgU-JaZl4HkBnmBQ7Q;^bBx-)YpOtELoJlcd` zz>nY$AOtGnSF|9irV{(KY1y&?wwyaNj-8}oq><*HIrlr?d3}q$c4w8=EN$`St7k7X z6A=`<543t6cfwI76WkezOtz&L`x0-<=pg$Nao%X8St7+)JN$0tlnu$XwbqT+J0INs z{q^yqUyb49$)DQk^=rc)ZoJlHZHsNa0}jUYqJgDy#u5&>O<6VMFJO~-4?LH zJ!F@E@n9mN@=wWceI&=TpvtQPZvyyQNt80ZMi`<7QSUz9#oOX2&NBt($z}izLV9^v zlR=zFq(jUtR1k;QRu#K9BSv>IAh zbTF-EQfxG%LoVT9>~5t}m3xxGU8O+s!i<8JI< zb})70%%PXWe(uR+DI7wkKcSXtid`c$eRZ(Y>f-imWr zFN(K9KiwDQy$ES&Qa{P!7iQZq>e8qZ1H~-+~ z-G$AQK^H2FJ!bN$*!_di^^tWO24X`UjL ziZI@gqlYpJJ%QIFkV5DL{ydDDQ5v3|2UQMg(rB54x;j_DIpy2Q$0^8MAvOK|na^P& z0}bq^1`|;{lp)hFxPbyRwV4(msRu<<8zpMf&fAD(g05b$8P;VRRWvU6y$#QxurC+< zxC5hf!NwfWpYt|KE_0#G0o6P2M@SWe&gBa(h2Ol5y`=`+1_7GlWr+w!GEr&`I=xqy z)RDTdeBw~z`qbB*z;;~W3*j-{^lg({1`Bv#Njs2|P@NgN1s>Anj1uO$rsEl4^F=^i zrb`yM+-1UaO_Opa38%VCZDE+YXHj7ql6Xu8R0twC3Akv~b%$Ff)dOFr)NupPG6GBY zCF6o{!KG~MW2J3KiBccrF@~)yJ_q49prj^D$zrkot4dT>i|yCaOe9$`HNco_i;L^K G9qm7`4nn>F literal 0 HcmV?d00001 diff --git a/itext/itext.kernel/itext/kernel/exceptions/KernelExceptionMessageConstant.cs b/itext/itext.kernel/itext/kernel/exceptions/KernelExceptionMessageConstant.cs index 973a3308e2..af3a496ace 100644 --- a/itext/itext.kernel/itext/kernel/exceptions/KernelExceptionMessageConstant.cs +++ b/itext/itext.kernel/itext/kernel/exceptions/KernelExceptionMessageConstant.cs @@ -445,10 +445,8 @@ public const String CONTENT_STREAM_MUST_NOT_INVOKE_OPERATORS_THAT_SPECIFY_COLORS public const String STREAM_SHALL_END_WITH_ENDSTREAM = "Stream shall end with endstream keyword."; - [Obsolete] - public const String STRUCT_PARENT_INDEX_NOT_FOUND_IN_TAGGED_OBJECT = - // Replaced with log message - "StructParent index not found in " + "tagged object."; + public const String STRUCT_PARENT_INDEX_NOT_FOUND_IN_TAGGED_OBJECT = "StructParent index not found in " + + "tagged object."; public const String STRUCTURE_ELEMENT_IN_STRUCTURE_DESTINATION_SHALL_BE_AN_INDIRECT_OBJECT = "Structure " + "element referenced by a structure destination shall be an indirect object."; @@ -544,6 +542,8 @@ public const String WHEN_ADDING_OBJECT_REFERENCE_TO_THE_TAG_TREE_IT_MUST_BE_CONN public const String XREF_STRUCTURE_SIZE_EXCEEDED_THE_LIMIT = "Xref structure contains too many elements " + "and may cause OOM exception. You can increase number of elements by setting custom " + "MemoryLimitsAwareHandler."; + public const String XOBJECT_STRUCT_PARENT_INDEX_MISSED = "XObject has no StructParents index in its stream."; + public const String TOTAL_XOBJECT_SIZE_ONE_PAGE_EXCEEDED_THE_LIMIT = "Pdf contains too many xObject elements on a page " + "and may cause OOM exception. You can increase page size limit by setting custom " + "MemoryLimitsAwareHandler."; diff --git a/itext/itext.kernel/itext/kernel/pdf/tagging/ParentTreeHandler.cs b/itext/itext.kernel/itext/kernel/pdf/tagging/ParentTreeHandler.cs index 304badacbb..29b5a7011e 100644 --- a/itext/itext.kernel/itext/kernel/pdf/tagging/ParentTreeHandler.cs +++ b/itext/itext.kernel/itext/kernel/pdf/tagging/ParentTreeHandler.cs @@ -165,11 +165,16 @@ private void RegisterMcr(PdfMcr mcr, bool registeringOnInit) { } } else { - maxStructParentIndex++; - xObjectToStructParentsInd.Put(stmIndRef, maxStructParentIndex); - xObjectStream.Put(PdfName.StructParents, new PdfNumber(maxStructParentIndex)); - structTreeRoot.GetPdfObject().Put(PdfName.ParentTreeNextKey, new PdfNumber(maxStructParentIndex + 1)); - LOGGER.LogWarning(KernelLogMessageConstant.XOBJECT_STRUCT_PARENT_INDEX_MISSED_AND_RECREATED); + if (IsModificationAllowed()) { + maxStructParentIndex++; + xObjectToStructParentsInd.Put(stmIndRef, maxStructParentIndex); + xObjectStream.Put(PdfName.StructParents, new PdfNumber(maxStructParentIndex)); + structTreeRoot.GetPdfObject().Put(PdfName.ParentTreeNextKey, new PdfNumber(maxStructParentIndex + 1)); + LOGGER.LogWarning(KernelLogMessageConstant.XOBJECT_STRUCT_PARENT_INDEX_MISSED_AND_RECREATED); + } + else { + throw new PdfException(KernelExceptionMessageConstant.XOBJECT_STRUCT_PARENT_INDEX_MISSED); + } } pageMcrs.PutXObjectMcr(stmIndRef, mcr); } @@ -185,11 +190,16 @@ private void RegisterMcr(PdfMcr mcr, bool registeringOnInit) { pageMcrs.PutObjectReferenceMcr(n.IntValue(), mcr); } else { - maxStructParentIndex++; - pageMcrs.PutObjectReferenceMcr(maxStructParentIndex, mcr); - obj.Put(PdfName.StructParent, new PdfNumber(maxStructParentIndex)); - structTreeRoot.GetPdfObject().Put(PdfName.ParentTreeNextKey, new PdfNumber(maxStructParentIndex + 1)); - LOGGER.LogWarning(KernelLogMessageConstant.STRUCT_PARENT_INDEX_MISSED_AND_RECREATED); + if (IsModificationAllowed()) { + maxStructParentIndex++; + pageMcrs.PutObjectReferenceMcr(maxStructParentIndex, mcr); + obj.Put(PdfName.StructParent, new PdfNumber(maxStructParentIndex)); + structTreeRoot.GetPdfObject().Put(PdfName.ParentTreeNextKey, new PdfNumber(maxStructParentIndex + 1)); + LOGGER.LogWarning(KernelLogMessageConstant.STRUCT_PARENT_INDEX_MISSED_AND_RECREATED); + } + else { + throw new PdfException(KernelExceptionMessageConstant.STRUCT_PARENT_INDEX_NOT_FOUND_IN_TAGGED_OBJECT); + } } } else { @@ -251,6 +261,16 @@ public virtual void UnregisterMcr(PdfMcr mcrToUnregister) { } } + private bool IsModificationAllowed() { + PdfReader reader = this.structTreeRoot.GetDocument().GetReader(); + if (reader != null) { + return PdfReader.StrictnessLevel.CONSERVATIVE.IsStricter(reader.GetStrictnessLevel()); + } + else { + return true; + } + } + private void RegisterAllMcrs() { pageToPageMcrs = new Dictionary(); // we create new number tree and not using parentTree, because we want parentTree to be empty diff --git a/port-hash b/port-hash index 0661be00c5..3bd03d7ce3 100644 --- a/port-hash +++ b/port-hash @@ -1 +1 @@ -66f84b927f433f9f4d9d5ff5bda6a3b6d2dec5d4 +9ad717077d0cc1a30ebd87cdd84bfecc36cf0ac4