From 49c43baa4c80b3bf8f5febae40baf99e1f2a0262 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Sat, 18 Jul 2026 23:19:45 +0100 Subject: [PATCH] Preserve dirty CultCache state during pulls --- Directory.Build.props | 2 +- .../DirectoryMessagePackBackingStore.cs | 10 +- src/GameCult.Caching/CultCache.cs | 7 ++ .../BackingStoreTests.cs | 101 ++++++++++++++++++ .../Plugins/GameCult.Caching.MessagePack.dll | Bin 27136 -> 27136 bytes .../Plugins/GameCult.Caching.MessagePack.pdb | Bin 16744 -> 16744 bytes .../Runtime/Plugins/GameCult.Caching.dll | Bin 82944 -> 82944 bytes .../Runtime/Plugins/GameCult.Caching.pdb | Bin 29364 -> 29376 bytes .../Runtime/Plugins/GameCult.Logging.dll | Bin 6656 -> 6656 bytes .../Runtime/Plugins/GameCult.Logging.pdb | Bin 9536 -> 9536 bytes .../Runtime/Plugins/GameCult.Mesh.dll | Bin 481280 -> 481280 bytes .../Runtime/Plugins/GameCult.Mesh.pdb | Bin 172544 -> 172544 bytes .../Runtime/Plugins/GameCult.Networking.dll | Bin 429056 -> 429056 bytes .../Runtime/Plugins/GameCult.Networking.pdb | Bin 217612 -> 217612 bytes unity/org.gamecult.cultlib/package.json | 2 +- 15 files changed, 117 insertions(+), 5 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index 3c84b8a5..5cc68296 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -14,7 +14,7 @@ MIT © Meta Vens and contributors true - 1.0.17 + 1.0.18 true diff --git a/src/GameCult.Caching.MessagePack/DirectoryMessagePackBackingStore.cs b/src/GameCult.Caching.MessagePack/DirectoryMessagePackBackingStore.cs index 1597be2a..77528970 100644 --- a/src/GameCult.Caching.MessagePack/DirectoryMessagePackBackingStore.cs +++ b/src/GameCult.Caching.MessagePack/DirectoryMessagePackBackingStore.cs @@ -75,6 +75,9 @@ public sealed class DirectoryMessagePackBackingStore : CacheBackingStore foreach (var pair in loaded) { + if (_dirtyKeys.ContainsKey(pair.Key) || _deletedKeys.ContainsKey(pair.Key)) + continue; + if (Entries.TryGetValue(pair.Key, out var existing) && string.Equals(existing.StoredAt, pair.Value.StoredAt, StringComparison.Ordinal) && string.Equals(existing.Descriptor.SchemaId, pair.Value.Descriptor.SchemaId, StringComparison.Ordinal)) @@ -91,14 +94,15 @@ public sealed class DirectoryMessagePackBackingStore : CacheBackingStore foreach (var removedKey in Entries.Keys.Where(key => !loaded.ContainsKey(key)).ToArray()) { + if (_dirtyKeys.ContainsKey(removedKey) || _deletedKeys.ContainsKey(removedKey)) + continue; + if (Entries.TryRemove(removedKey, out var removed)) EntryDeleted.OnNext(removed); } SetLastSchemaMigrationReports(reports); - _dirtyKeys.Clear(); - _deletedKeys.Clear(); - IsDirty = false; + IsDirty = !_dirtyKeys.IsEmpty || !_deletedKeys.IsEmpty; } /// diff --git a/src/GameCult.Caching/CultCache.cs b/src/GameCult.Caching/CultCache.cs index ba9bdbdf..b06391be 100644 --- a/src/GameCult.Caching/CultCache.cs +++ b/src/GameCult.Caching/CultCache.cs @@ -2092,6 +2092,13 @@ namespace GameCult.Caching return; } + // A single-file snapshot cannot distinguish local dirty keys from clean keys. + // Pulling while local mutations are staged would let an older disk snapshot + // erase those mutations before the next flush. Flush first; clean readers can + // still poll external snapshots incrementally. + if (IsDirty) + return; + CultPersistedStoreSnapshot snapshot; try { diff --git a/tests/GameCult.Caching.Tests/BackingStoreTests.cs b/tests/GameCult.Caching.Tests/BackingStoreTests.cs index 328b778e..9e9a7606 100644 --- a/tests/GameCult.Caching.Tests/BackingStoreTests.cs +++ b/tests/GameCult.Caching.Tests/BackingStoreTests.cs @@ -107,6 +107,53 @@ namespace GameCult.Caching.Tests } } + [Test] + public async Task SingleFileMessagePackBackingStore_PullAll_DoesNotEraseUnflushedLocalMutations() + { + var filePath = Path.Combine(Path.GetTempPath(), $"cultlib-tests-{Guid.NewGuid():N}.msgpack"); + + try + { + using (var seed = await CultCacheMessagePack.OpenAsync(filePath)) + { + await seed.UpsertAsync(new NamedTestEntry + { + Name = "persisted", + Value = "before-local-write" + }); + await seed.FlushAsync(); + } + + CultRecordHandle localHandle; + using (var cache = await CultCacheMessagePack.OpenAsync(filePath)) + { + localHandle = await cache.UpsertAsync(new NamedTestEntry + { + Name = "local", + Value = "must-survive-pull" + }); + + Assert.That(cache.IsDirty, Is.True); + await cache.PullAllBackingStoresAsync(); + + Assert.That(cache.Get(localHandle.Key)?.Value, + Is.EqualTo("must-survive-pull")); + Assert.That(cache.IsDirty, Is.True, + "pulling a clean disk snapshot must not pardon staged local mutations"); + await cache.FlushAsync(); + } + + using var reopened = await CultCacheMessagePack.OpenAsync(filePath); + Assert.That(reopened.Get(localHandle.Key)?.Value, + Is.EqualTo("must-survive-pull")); + } + finally + { + if (File.Exists(filePath)) + File.Delete(filePath); + } + } + [Test] public async Task CultCache_DirtyState_Tracks_Mutations_And_ExplicitFlush() { @@ -425,6 +472,60 @@ namespace GameCult.Caching.Tests } } + [Test] + public async Task DirectoryMessagePackBackingStore_PullAll_PreservesUnflushedLocalKeys() + { + var filePath = Path.Combine(Path.GetTempPath(), $"cultlib-tests-{Guid.NewGuid():N}.cc"); + var recordsPath = DirectoryMessagePackBackingStore.DefaultRecordDirectoryPath(filePath); + + try + { + using (var seed = await CultCacheMessagePack.OpenAsync( + filePath, + new CultCacheOpenOptions { UseDirectoryStore = true })) + { + await seed.UpsertAsync(new NamedTestEntry + { + Name = "persisted", + Value = "before-local-write" + }); + await seed.FlushAsync(); + } + + CultRecordHandle localHandle; + using (var cache = await CultCacheMessagePack.OpenAsync( + filePath, + new CultCacheOpenOptions { UseDirectoryStore = true })) + { + localHandle = await cache.UpsertAsync(new NamedTestEntry + { + Name = "local", + Value = "must-survive-pull" + }); + + await cache.PullAllBackingStoresAsync(); + + Assert.That(cache.Get(localHandle.Key)?.Value, + Is.EqualTo("must-survive-pull")); + Assert.That(cache.IsDirty, Is.True); + await cache.FlushAsync(); + } + + using var reopened = await CultCacheMessagePack.OpenAsync( + filePath, + new CultCacheOpenOptions { UseDirectoryStore = true }); + Assert.That(reopened.Get(localHandle.Key)?.Value, + Is.EqualTo("must-survive-pull")); + } + finally + { + if (File.Exists(filePath)) + File.Delete(filePath); + if (Directory.Exists(recordsPath)) + Directory.Delete(recordsPath, recursive: true); + } + } + [Test] public async Task DirectoryMessagePackBackingStore_Remains_Dirty_When_Deletion_Fails() { diff --git a/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Caching.MessagePack.dll b/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Caching.MessagePack.dll index a04121ee7925b5262a2ed87ec1ef3d70712dc76b..8786becccf0fbc62e4c95eba7a70518d10c14c6f 100644 GIT binary patch delta 3307 zcmZu!3wRXO6+ZXQ%$@8cyV;q2Zz3edgfTC6^Io(8bP)p80D%%fAcQ1>SO*hI)d-td zt$rU{G@bH=prtJ>r9rL0R>0R+EP|+rV1thq0t>YGem{AHo|#!5`gQWnx#$1SIsbjl z+}U&ukgfsp@Pquf%g+w>#Iwn^p8gq*1u=knz^e;jfbYq5W&9o>195Z(z%)IV7V9&~ z2=biXO=5vwOg63wcvBEyAOf%?3PAMv^Q#k+X;V7+ZDNc4G>IL+48^WK0U)^?w9^Z~ zD-QLq2(>5CjM{7{bozcs_ZhT`K`E83WNKRw6_1fKwXGJNz{d20>fek|K8Bt$xNVo> zu}h4VRdW6JWgV(1vmHz1%n~YOR*M2R?M|1DX|vf0vu*Z z$%^9AcA{LdovJTjE4$2r$-J-8#ml_xT(zj|Nt&jv#Tc~|wSO4-PD{@O-XT&%eCi{} z7s71Zscd8C#*n^uh_T7&e@;#uq7K7%g*a%$RsoQ$F>u-+u~1S#&BB(`jODU=`hLWx z?b7GS!G$kkynv>DxI%vK*ZvYh}$+J5vh zil(M%ucKq{Xu|z+@zw&^Wd5E~Lwk#!>GHAzM$JLJ$W@Md^IZOGEWLvNr+1~L=VDZ5 z>Ucv_ltpz7Dij;e8~RpPsq#;RsogSNbwK~z6&k)7Y3&f26(dkOzrC1dICv_sVA|a+JDe$|3#yoLestl>sJgjxOWZnp8m8iJmP(H^R2yXe+m<* z`T;WPhiKx9@u5{eGT?Dt_Pg94qnj>rUT)PQ?GyAxpZ2L<Cl_ZweMP0>Sz$I(%q3t^-fq%daq+ zdxB_1m0+-t;1dTRLjPvS!M!C_R+Lkz5iRYQf}7QqgZYJc4B)9L6%OMxP9F^BGxLlS zbX!(UrE%_EOt_AA7GnXYi70{Z`^CUqj&_<4uUVOb!=f z?Tc=|rNbE2$qM`g5agyez>X>aW2kxKr`O>D4}0|^S=W=aL~iz?v{*!}gvX1Fl0EQ{ zlR*_M9ciK2nNg_<-cF&L)1y)~j0st>2b>A0frVuT>V~t99%RNHtsZz3J+?g)vE z2foHgO%ez){1|3LEEKklLKHMnk6Bm;1t$8X-|Jye2c;(Z1>6AlOLb6{LQ5eoO@!JM z`U-Su65NnNuhF>lW4I}Wrg0t8jWL*#g7+f438tk`I;@xKVSWl7K+(ytD24t)b!iIR zkwPQ6xHJ{+GLbd32Ix-3`rt9C0oGm?n+EGsu?(_Rng*GP%YxJ4*~IFC*D2YTXuZ0Z zU~{f;Iw5c94aHh)A5;WS(KyTszRmZO&pdgF6_O;+ zlP=689)1}NzyW6+=HJiD!eOulcS1iQf-K+{As8eB@SHDSI0;^l$|vbdwrU|si-S{y z0r&`&`-y^?aoCd;B=MLj6gLA~$QNnLU?x2td;kl+@vRa*Oi5%1w+mmU{0#qhSZs7~ z)?|1xkSS}Y^ z?CfIMCY7XHgPU2BE@!W>_uy{ZNmfVgj*rpu&Y8513cjydn5*@lLFVTU5F?z|*3HRu zV!B-%%k^t{NIyyouMthro8ALe27Qw1Gz5z42i9#*%Lor`e z3{bCUlGx2HNS}j#Q)U7V(s%8xCcjL~#VCVrZk=);`o+P1dJsidiap$`%CE(PbYHMn ztRPPJ1R&%Lw@ds3m*;<3yqfHB9T3B0ln^9Q$P?Z~ztPVi3bo36VicPFJJAo@az??+ zvJ+?8#^`waPl3Uppa)$1PKDHY+3Qr-w8`@wuyvVkre~u(Y8{H__>BdAy z#j9C?TUwXStLqr|(~67`c05odhU+}!-H&ecEMeqa-AT={6CV(Nb0 zXYZ lGqVPDLeQr7v{ec>==#k6VekB{|9NK$Atg@ delta 3044 zcmZWr3v?9K8UF8`nLF%kcC)jaeFsd;Nf^m%A6Yg_TR;qGK*J+Y2!e#yDq0y1L99mD zjh5Eavs!X)J&1Bttd*t+H7rz6Tc8lEf(ja{#fS!I1w_RMML|RVnO!}olQaMSec%7z z|32q#(!C_zOIF`6-nlunyE9WvnmW6t+b^yJmB- zkfCHM?;t6EZ3+YUT!$|O3DOCGSq%V$@17gaPNJ<=GCtdFyFgM;VusVEZ30kScB*Yg z@3d=wFhmuHMDJ)#lI7BN!8bUzp7m`tNayPsD;(@ zim3M7WsSEZu5?mu#}70d;`1ntm~!dTrK5JIZNTFL2&w;GUqH;-s{zFFYF`Co z18fceYkQGD?--n_R2{1LhzlzlGgO^Um%bB0m5pk<48f%vJ*%R3hD%gM)$!n>$g6aa z_6Ul!-Gept-6r&Y2R+)Os0_n3EjHG8G+Fy^Vr&QE&&ak7)NWu`NPrpWV@?1y*SDbm z0oy4~(1Pd%-B^fR7vGO~^?&egH9+?818Tryj5-&$I*HlR3Hna{wHj>RgP{uAZj9{v z8Cb!n?frJ3!H@_81fa+mOFLRo--`)aPp*L55Z0IizttHgFY$Fwjl9fzoMnhlIfs({ zTy^<=egIR-)8&}0tv0e90G0ZyhzcsF4ANgiU~6l|m3N7`30qY0o*JXJd75geDz+O` z6$jW{V}o8diX7xASG0aV!j%;mEU)%ftSmt=z@{5Hxjv1^kNUh4`{buxL2`(*q8jH9 zw@G`0k1Gl>WBv3u`8`EG(#szzGG?@+$e7(R6Ek;d!C_1hG~7_89nMDGRzlw5qdYH> zBV6{Dp{?{zu6+k{6y^yBnQsQw`;gT-C}RCxgxXOw)oke+0!xNb57Xb{8@;7hzmF}VQRw}+{8~SX3e%3Eqxx~Q`Uy1Jf6y%L#`Y_R7}|dg^8vT{!c8X;mglx=={8KD z+9_1D(`Yic;UUyMG^o*+!n{6D3E;MrU~lQRGpJc*!6Q7lNdE}2?A1T!8DE+D36i6Q zOnVr86=T{VzRMSLpGBs$eTvq~Wc@Srvi><&{1eF+e5SvQoZ~C~Wv+9m9|h)}p)h~s zk5uq#|KnTzccLA!vy0KdG8Tn{vmZ}`?g1swq17YNczz`qI< z4+eruRMR#Y*FKGd7KaU?8h&)jupxp@cqCZP%u7Y!vxD_s^6WQ`EYw3$ z#K`P`uk9;n0`{A%6Yg?MP!e!5A3Nh;OMe2PXfE?T|8(W2@XtIuY@eM%dOwa8pc8IV zOXQJI6w9$GgQD^%xY1-CkSuIdMnn4BSRg824Sjj`Sm2k+7+8(7G^)HKrj!Oan`h#n zIr3OY$IY0p*sWQvg^ecTU@J9#IOnq9G`Kl?s^WD@_GNcmwT7UZTse)91AIf3p6Vi>x?d9yKwaPi+6(`( zeJu8qcfHHu0PM7#7aM8P^EE1EZb@n(ZgDyE!a+x)*hN-}R;dpxfnCr=h-8)ULJkB- zFTCizLOKB+wnapH>AXNWJh8R_-EB%*?<^CxeVxCsStzy26XBsSwCID_OerOx8*2nq&E9Ww4$ShHd4uZmW73pzH_MDX}`b{g2&P! zsC2wlmai7p3O2MJk4tV8h8Fte$--iLNlI>{L*)vzzwj-Ggdka>aze=9>249mOZBJ^ zct^^9>T!>iJB0bx>4;kkvv7!>w9PT~C2}c78FUDbIaeaC3Utv!SaX%!DeQM<(|CE~p;q||(F9TXxhS8|PLi+! z-v`KgsgoR$9wK%&5&a6}6G=IHh%8{6$VJ)%ob|wZsT=hkNJ0<%on;Y!Mc$Dmx?Zx- z_1QP;_6OCmw=Y?C7ql&0Hm9+zVbRiMcV(ZObeK3|_R0@Q^OPGN-eg(4eSFi*?7Ath ziK?{(+|G1AwL8MLN z=@6gY>Seu%dRzJ3tyenk2o1KM-B2-M?Y0$K!Q=-f@Ml`rROiJzbMNKvCvV~Qd1;G^F>|rAYvvs%B%WLA8DlQAg{H4w_G Vw+ttiCAojqCyhe-3F!>U{|8X4tSJBh diff --git a/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Caching.MessagePack.pdb b/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Caching.MessagePack.pdb index 52e90dd34ad0c8e52685eea183ce22937fab2492..20d9838388ddf969685811d789807e1d8cdc7618 100644 GIT binary patch delta 1800 zcmZwHc~DbF7y$5ZA1{|cI0O_7m!QEQfdmL3$f-rVj|zeZ5)!F3LR+E8p?M%GD2VZ) z_3U^~K)Gr<(2BLFHR@EfXmzv{MO!ttRV-K)r=|T~#?JJQX6Cow`*y$G?7TO-mU3b# zC)-P1w65o~J9(+`H7>S;m8SK7x-MLH%CJ3v2n}EE(P8jpfd7>Y)TC? zPz|a>Ey#@Sqo>GEM!`JPioydaNJU0uJCOntvLJO31uN0VXg%75wgu6!3oVw@phoGz zH0blOsYPQ$Xpo^$G!?BvpQ0XQLC=xBf(8w$RtVq$daWSvx8lEVj)qxE8s0@qkOt{c zJ}N~Os2bHNxj8iKSAy93aP)1*3DZ5Qi6#fw8bO@mI~^ zz0D&r$4>(>roRNqwEm)$`l6t#4?yjDd&KFXRv05j%g_G8p}4xUT)%)2CH}D3i=FgXk^Cevez-xcYeOr5M`{ zy~id^RXl1xY?%GsL*Q&+EH9NwB4p=hk{*?|9eAC5tyrTQzvqSw5iut>|92#4Ajx0^h>3>p#N$6 zfeB|?we0cod&_$bewt$Y_inzkIQ1kM8nSWo7tR>?vA0${T%?$C*YhvKqU4S@*_+dD z&CB#<%Xo_Hl=gb>ghT6RUOrhdZEl5d(0o}^@W+<({x5fo&5IVB5>zo={EjubrB3Qz z?bc`d&cY*Sbw|xds-pJH(szA6daq(a!Qq^dtGCr|&JJ~-z4gY~gSUHMsrWZ6T_?UU z@15_MKKxtK91TH+H z^!(+|S7hMDkY-`d?ShTJc8Pbsx%gl>Df>WKaQBF=4TnxtYG*BrkJenB-y6*8M^^E! zR9H5;o9tb>sesUss8Drys7ezS6`_e(q0oeD)#|Y9C{?ybsZ@k(REmfdks%=~O#D&x z)aWK*)_pig;DNkvdU@FMImdl1FAU!t%VD30C5z+3{s5^rvLzAKj=M<17}6jkMsAceM4LuM z-lg4lk)}@4beF4Z8Y0a+(ma+l%dv*9b73qe_oW(nLGJD zG~NPKmJ8k$VwgPMIhyMf!%_jvp$okrl#i#@lM>=l<^xsWBLu1QJOM;d;17f<^1wBG z^F$utM}Y?fQy>8c3Ix`nkpQx_BFPxQ+ff4JxPpJj7=sHyBvZzw#2WmYWAW}FOe51K za&iS8&2)(TAlDAuxK+lv0t7H-b~rYG+-Ie6a;l7C)8b;>d_?w?Gxt{jiDl#E5_bT< zG8x+tCm{;f9G6PcSkHJV$z-R-U(BfV=IZR2DlaZNGFz-UkExC2avrlUo{PRriw76Q hOzRjf+B2V7b4TW+HJ`@Zm+`TGbf$G$Ci96C`~$|!6Mp~z delta 1748 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 NY6%^IpV8>_`yW{T8W8{h delta 4629 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 nFu delta 3173 zcmYk-3tUuH9>DQ)hRaiifI{8CK;@wbDlf-@kVlG&8ko977^X5qNt7>W0c}t*NmCR) zC?C^A1ZgdNji@UcKGsZKUzm!vD326@wU3W9%Qf~l1GU`G=X?JD|Cw{oJ$LTw=xw?0 zwp=^cqdrQAfzj`OI7C=qp75n$V6%P=-ih2&GBFD*S>dKPfEy zrT9Dc;CHwVVCDLj!J`$4U`0ObY!luKxm( zZP-1`Gy{KccRWeoHQYigeugq!3VRI1a6}^x33v~=SdC-DyXLw~9vmRWyU4?3xCKfv z7-KLgkn2B<jHNQMrJkcZE345x7k*U^MFJixDzny!P` zYAnQS8buW2J6yn3G~h>#Vi3wmMf8F*{sJ#(Fa=4NjWpzABg(J?dr^x^xQ_dH3Qw&f z60jbPa1B*NI8u;{e5?&MElv?7p$1D)8fq!3%^jvrDZUMr;ykY6AsoV_=#5w4jcCN; z4ZMW{Y`_*&Viyje7N>9lkMSIqukv1i3;My!K;w@PgkuaQVH)0s4(Z6iVl2mM6k{_g zP=#t7!AYFM6*S-%IE0%{?2nB%X*h3Egu(C{%>+zA5@sU}3y_0lScM{dj&1k~M%3U0 z&f+qDKnptX2+v?KN{U|SJIb^GDLlI4psr{T!@E01cE`x>IF6m-G0R+c?L3EiKC-bC zD^ZAzD8mly?J@ok_3<9{8S1(o^^H-6u8Es_bhevwu04Z)gDRqHj9moZh3GX~BTc{Yk~2qB&ZB6`ZB04F(a0icJ8&@fq!OhFd%VQQyK7T~ z8?|ST+Aqp9+Cx~1+$c-20&7rg9wEi1C@ISEwXwjq$sycRB}5Ao>pA`|X1oJaol0Fz z-q>BgN8QZV#H+iWL)~Vq>O18{?ccg*4)$U$R%<$ypMx!lR_6S4hz-$nE=;NEMYK2P zUlwWo22X2Od>FUR(nnZ}R_m+mZ>4%d`>SfURK#7SMWu*4iiL%#ZK3^9*`_F>S!vYT zi0}xHP#bYG;vL!{k)^a*kseVt;FXNiEpl}C-5gt2-)7g~vSLwT zZPSMFsTm~?R8HI7Rc)ae=bIKzp0_CT`vuv~r{;co!@fN`_v&iHlhT8p z^<^viiIvhZ@A_zYXj!ZJ#>Q7|mgSv~bzR!qI=((fmF^NYHnz0Xs&-Ch?*6>05mt7p z6UmVYVI$tV8|VlDYXN3ZTjis1tq`4%%7^R@<{zEyY)M}h3|i| z{_Sh;TKZ0%`BlY|^=EIEE>m6Eu(qa8=8s!vSzoHT*3p){vwEvqYq+a(I=5}i%jYT| z9p2+oW5}G??_90Tmd32Y@>PM;#=oIUT<3q;^V}KT{;#JNZ%Vi@A-2z>|6HGc=%<`h zx?NA)+pLo85@Y&LOz&u$p636_n&bPl(PcC1Vqbc-Z}XZXy)#c(r|RQoUd>#NFlzqVsg}o!G$|gIJRvdmMf#L&Udig0#S1E)38~6*@({u|KUMAaXOEk| zuvhZu77f+8$>l{8bd%+dqRl!Vw`^}09<4DBwpOYEicNpjAS=;dNUJOhS^j2Gqwae( z%V8~D3wdrlroSZ}dvuwW6ky!_Zi~w9|Gmb|Y1b_WFYvZzW{3QRKBlP7&oI}H`I$b} UzCyf^pJncM%a1c|nb%+b51)4N>Hq)$ diff --git a/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Logging.dll b/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Logging.dll index bbb197516361ffcecf0ab8c72ca730ecd9fcf203..aa345f224571686a22e608ac3fb3ad7a1eb4b33e 100644 GIT binary patch delta 290 zcmZoLX)u}4!O~lC?bya1Ck{rT&F49OvIwkE5Y*yN`sp_1`Gai36)&D{zQNnTXknpe zz`$U_$e?eiXP{?jp>1qnX`EzgY?fkTX`W)9W|(4{nv`UcY-yI9Vq|1!nqp>Xo@QZS zkT!V&{~ea!p)(FmE)WP1nAmRk?SA}2_bKlgGMkqRX-vK#P_F3&p^-6TszU&$jIC<#XQ-_D9zF`$I#n8N=L^a+atbmqFfanK;O6N|1b1%*3p-VK1NIB(Z>yN9KHj7o;oFo;wKcn832*#-$}odd<{3wur`iA1eJf zeHMT2*^hyfZ$w9I^IWm(*8Q~p5Q|HP4#t-*j5knSH6>gBKhKH0y1Tkgp^NkLU6fY4 zy|}udUdd55FoHj>{;lsv*4xWYbJewf_2@IW_`l(m*(Tjo_D_$kZ6+wJIkCL7zU0H~ z(*nWuU#h*VivC8odauiJ57>PyDr8;uuB~&IziCZsoV9>MP^@=yb=cplc{eY1CEW^_ zPCcAcGLiRpvE2`)BUx{?chxiA?`i+MaaParXEk=lo0IBO)RtV?InRHqrM0y0nGzFi zy|%-P_P;wW;j_5>c0s#nsaeW*>Gofn=S9fKwrsI#SbSGUQsj>GWh<3w0=NAy^7X fo@QZSkhb|3`vMup)XB3|qFGWI7w((=KLp|zK>Qvo2a<;YW`=Ky%nW~lm_>=1fqQa2<7?M!ph^Y?W*}x{IIhSF zq}jl11_llw%?ZTn46F<~Eb2h<%RrKyL6dzNP<A91?W^y% zu9tkZ{aU~Zed`JH?lK)cr}Fgzb4R*I2b<>1_gszV&4K2xopL_wj)B0j_lH29XQrCBTp{eWAxKK>Z$=j&G9!Y9ik5kOEarB7CJV(w)K^|m08T-U;S~dO3c#w zl|OG>n=|iArAI|;cuvJm@&6`x7zdecp(X$>tI^Xc**Ymrlw#wdm7}G?AK}QbGjvS@S=scD3@GM=5wa*&xhUf)ASRs zb(B0*@-_9oJiW6h_t)wdB{p2Qr`KEmYkeeNxWDf9=9Ld7r!Snk`o*!uc_+CvniW+H z-?K9^H!Q7IO36Gw+P&83`l0zy6Ul|f%QY%v^56XcT}-8th2DtGhkpaVPw!Z z)HBdCw9qy-ury9GH8x8zu{2LHPcuw0O-)KNNwzdgPBAhvG)*xxG*7cIFi6{8pvj)0 z%<}PPg4`6q1pB}(2%*1H1eRU9fGGnj>gEoUPg8_pjkW6AQ1(IeADGVk+ zzB!OKXGmi(1k$DqsX*Bzpm;J+#tcZNFc<-$Ay6g-$TtM5v;dl8z>qdQF@)We)q+8f S!C<>!7<(GycE&LF|BL{;&S;JR delta 363 zcmZqJAltA(c0vaWTPyGK#-7$5#?~ID)*j}qJuGQo83m_*{>ox0D#!o>hh~6Sj6f_n z-SHcXFr#35=r@+_q2E}8TLjL{j^ewZ>F>Dp#hu=xXW}}y@2FyHSZ86bXTZQ^qq_L4E+cd;9bNc3~z)^X;pH*pnH9%^9>A5*dscjDXOb!H^*ZNG5}M zX$+P?m;}V8KrxW4B~aEB%ufTVNdt-*14#>@XewB*0Z`6_!E}0J2)ik(IfEX9!FItg N_B6)rjA88m83DNNW%2+3 diff --git a/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Mesh.pdb b/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Mesh.pdb index 23a5cc9265bb6993311da74850ba2f4f7df005c0..88694cb69e6690a62c31c0bb9fc18fba037eeae5 100644 GIT binary patch delta 782 zcmV+p1M&QT#0r4K3XpshLT&1roUlQd}= zbQvv!1xDLt4`UCqbZu+MlF_|d@h9y!_GLqE7816B$D#*=rE||YI=b8}J3s0g4zdhx zL|}JbqD3zl)$49EuBS?W6G*2Jo&~`U0C@`n*g2C%=nlTBge{SP9dN8Hv_Ysv3sM9^ z&{jI{Q8MIMiEr9@5LUsnHU@G8mRGu+B}p{2h?qZqHV(ZiH=bnZ3>f<4IC~BMa#TYnhyW>CIvb zU4~fY>>k$x8We>8Le#Wgmlf}k{P+%QWC0tr)V+^%_T|ud>QDU^NqXHJIy^~M!SEWX zT7uHF-B#dH7}hmHjZ}dWEOJ5EsgtgQ=`I?L5LyZZh4XMPYFq`Az}avR+a+OWy!(oh zDLL(J^G+Mwpr^xsAjjz_9bcuR{?~nH3+L<3r!apbJe!OblYBavsmsM&&5N;`VxC{h z#Z0P;i}6&=#`EH8G%EV*e(+8Ox&MCKTsVy}_a}PNZ1DeSHb=-ZwqNXlgU)UoX?DK- z=uPqpl8U*ZWtNqitB|MC)!8q{S^T`$c_-Kni~Ie-701dL`teQBM!_eq8COo>ofl<| zmO&apl*YQBw@xYnCx$39FgY_~H8VD3G&wh9H)b(pHDzLAG-Ek7V`MTiF*Rg1F*jy7 zFfeAfov;C^0vN3bVc`Iv0RZAI;7Wot@K35C==71qrDvC3vjHs_%w=-m0Du4h;5zBH zC~gK!oCUx&PJCZ%mtM009hbnf0R|ZOef-`4zyJV@s$L-__5Dwfa?q**Sc{yO-m?K0 z7>#(=#sGi-0IVPpDi31$MwI8^YcZ(k<(Cb#0U8*^4~>NY00#h2K-Cv$GNDM8-CkI} M!xW3RKePeC?dbn)RR910 delta 782 zcmV+p1M&QT#0r4K3Xpsh#_Pfh8XBrZhMv_VL|2e+HA)zVfsnP30jei|C>6f$LkxNF zC~w8-%D5?`tMw4hBpNa?f%0kv006C2+iKfD5PdiJ9|k=oq>*f;Mzs?P zsY^nkfs&-|L+Qh6cO-4ui`W@8=#%;z{j#!(Yi!zrO1%#P?VdU3?Ac+m?EI)}I>|D) z5*_>V8XX3~s9q17aXmJFnm~Gm@FWO!04RG9z}}lQLU-_WBV3IH?15utr451=JxI|J zf_Bn}fRdraMtsvgfN%<)v@uX37*7nk+Octi&)S+G;7)vygsbcio{t^PbkdP_H9Yjh zXfF?c(|fE8O4i<8M(Afjgtj#O>UThTy**od+X~lTGY4IEj3w%ZB<3d7nWSfmD&U{MOfL7lYi%y7|YgwRn(Q27A2!s5C!37kzQv0V~|Hu$e7 znUd4dHgB}S4F)=Y404{%(s_~2#$WfHt9-D7PhtK>cqT6LyqK#(=6SVTmdizv7fZER zE-G2&7u73;#eBAWxfrkeA$Zlv{rB7E!fA|oJkg_Oga1#nIYO4P{bCOsbav}Wvk(2p zV3HS*G|VlnvaHtJbY&{N&3-w~;^)0C2f<-j-0lyqI9Bc$9^Q1?DEJgK> z7^D$IX{`GRw@xYnCx$3tGcqzaF=RJmGBRd4Ibu0AH!?RlWHmW8W@BbDGiEqsWj8S} zIW#r5ov;C^0vLgF&Vc}+0RTSYiR9OJWzyJU>4lC;cQ<stqE?pN={mr-m?K0 z81ld{Yt5O$s> Md{>FLKePeC?e-CDN&o-= diff --git a/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Networking.dll b/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Networking.dll index 9d8d79cb9fb9460d0b95b40a2f3a6df9a77dc0ad..551dbfcbbc5e1defb1e275754f7284c3acb014e9 100644 GIT binary patch delta 358 zcmZpeA=NNLYC;FgQU2c6#-7$5#?~IDtv$?NelrS9Z~Vh-38Z%aVO9rHkHJ(s_h07i z+<#dX+p7#Z{p^$he3EwqgdERB;) zjm=U_EX`BQ(+pEgQv4Ovrh$zJvP0xbozlxwpInG=z`l&QK0(hH`8xsZ=S_s z@uEe(ZF_1JnqdQw1dr* W)q+8f!C<>!7h4hIcE&EY|BL|DxNYSC delta 358 zcmZpeA=NNLYC;FgGUtYujXkYBjIBLPTYH$l{ALuK-uQ>v5=ia-!>kUZ9)qcN?!V02 zx&N|!^b!cH&{?wY)kXgXfwFmOHQ}Axc|2It^6kv^3>X+p7#Z{p^$he3&9xJajf~6< zQ_Pc%jM6MElPpcmjm#}mOf5~*lGBWg(=1X_%?%AKO-vaWBp4ZlrytzPBE0?ZcGj5( zS(xot|DB#t$rd1BKY`_{=F|$WMuztlbG={uoPMB^tyKXks^th31*)&L@6|1NXlm0m zFToow%nJ}165A9$xWi@BeV=&k* P*u_@FxSg?!?LQ*`f#YeK diff --git a/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Networking.pdb b/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Networking.pdb index 4175bf717cd6f447eef9ec48908e227c3f86a435..41c757da37e68a011d37d0082670eef4389eacd6 100644 GIT binary patch delta 20317 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 TMSc63*8bzlF8;u}+4=tffHA?s delta 20319 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