From 70ce09f7e6cf86d30e1984c1687b6a62e7f7149e Mon Sep 17 00:00:00 2001 From: Roze Date: Wed, 30 Oct 2024 23:48:40 +0100 Subject: [PATCH 01/33] feat: Add text-information support to module holo --- .../ModuleSystem/FINModuleSystemHolo.cpp | 24 +++++++++++++++++++ .../Public/ModuleSystem/FINModuleSystemHolo.h | 15 ++++++++++++ 2 files changed, 39 insertions(+) diff --git a/Source/FicsItNetworksMisc/Private/ModuleSystem/FINModuleSystemHolo.cpp b/Source/FicsItNetworksMisc/Private/ModuleSystem/FINModuleSystemHolo.cpp index f76bb835b..162dac60c 100644 --- a/Source/FicsItNetworksMisc/Private/ModuleSystem/FINModuleSystemHolo.cpp +++ b/Source/FicsItNetworksMisc/Private/ModuleSystem/FINModuleSystemHolo.cpp @@ -8,6 +8,17 @@ AFINModuleSystemHolo::AFINModuleSystemHolo() { PrimaryActorTick.bCanEverTick = true; SetActorTickEnabled(true); + + InformationComponent = CreateDefaultSubobject(TEXT("InformationDisplay")); + InformationComponent->SetupAttachment(RootComponent); + InformationComponent->SetMobility(EComponentMobility::Movable); + InformationComponent->SetCollisionEnabled(ECollisionEnabled::NoCollision); + + if(EnableInformationDisplay) { + InformationComponent->SetVisibility(true); + }else{ + InformationComponent->SetVisibility(false); + } } AFINModuleSystemHolo::~AFINModuleSystemHolo() {} @@ -142,6 +153,19 @@ void AFINModuleSystemHolo::SetHologramLocationAndRotation(const FHitResult& hit) //FVector ArrowLocation = {0, } CompassRose->SetRelativeLocation(ActorLocation); } + if(EnableInformationDisplay && IsValid(InformationComponent)) { + // Roze is having issues getting the Z position correct for the text. + const FVector ModuleSize = getModuleSize(); + InformationComponent->SetMobility(EComponentMobility::Movable); + InformationComponent->SetCollisionEnabled(ECollisionEnabled::NoCollision); + FVector ActorLocation = { (ModuleSize.X - 1) * 5, (ModuleSize.Y - 1 ) * 5,0}; + ActorLocation += InformationDisplayOffset; + if(ShowCompass && IsValid(CompassRose)) { + ActorLocation.Z = CompassRose->GetRelativeLocation().Z; // Dunno why this works, but it does. + } + InformationComponent->SetRelativeLocation(ActorLocation); + OnInformationUpdate(InformationComponent, hit, Snapped, SnappedLoc, SnappedRot); + } //if(IsValid(CompassComponent)) { // FVector ActorOrigin = {0, 0, 0}; diff --git a/Source/FicsItNetworksMisc/Public/ModuleSystem/FINModuleSystemHolo.h b/Source/FicsItNetworksMisc/Public/ModuleSystem/FINModuleSystemHolo.h index afa720c12..e8a006263 100644 --- a/Source/FicsItNetworksMisc/Public/ModuleSystem/FINModuleSystemHolo.h +++ b/Source/FicsItNetworksMisc/Public/ModuleSystem/FINModuleSystemHolo.h @@ -1,6 +1,8 @@ #pragma once #include "CoreMinimal.h" +#include "FINModuleSystemPanel.h" +#include "Components/TextRenderComponent.h" #include "Hologram/FGBuildableHologram.h" #include "FINModuleSystemHolo.generated.h" @@ -49,9 +51,22 @@ class FICSITNETWORKSMISC_API AFINModuleSystemHolo : public AFGBuildableHologram UPROPERTY(EditAnywhere) bool ShowCompass = false; + + UPROPERTY(EditAnywhere, BlueprintReadOnly) + UTextRenderComponent* InformationComponent; + + UPROPERTY(EditAnywhere) + bool EnableInformationDisplay = false; + + UPROPERTY(EditAnywhere) + FVector InformationDisplayOffset = FVector(1,6.5,7); + + UFUNCTION(BlueprintImplementableEvent) + void OnInformationUpdate(UTextRenderComponent* Component, const FHitResult& HitResult, UFINModuleSystemPanel* SnappedPanel, const FVector ModuleLocation, const int ModuleRotation); private: bool checkSpace(FVector min, FVector max); + FVector getModuleSize(); UPROPERTY() From 2d9686d9b37fe73a4e6b0e78763d430dc05f23e9 Mon Sep 17 00:00:00 2001 From: Roze Date: Thu, 31 Oct 2024 11:49:35 +0100 Subject: [PATCH 02/33] feat: Added info about grid position to the modular hologram note: Only enabled for the micro-controls atm. --- .../BP_ModuleHoloWithCompass_def.uasset | Bin 23922 -> 89593 bytes Content/Buildings/-Shared/BP_TestArrow.uasset | Bin 27505 -> 30052 bytes Content/Buildings/-Shared/MI_ArrowFont.uasset | Bin 0 -> 16218 bytes Content/Buildings/-Shared/MI_UpArrow.uasset | Bin 8820 -> 9915 bytes Content/Buildings/-Shared/M_ArrowFont.uasset | Bin 0 -> 28343 bytes .../Buildings/-Shared/M_ArrowMaterial.uasset | Bin 12163 -> 13849 bytes 6 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 Content/Buildings/-Shared/MI_ArrowFont.uasset create mode 100644 Content/Buildings/-Shared/M_ArrowFont.uasset diff --git a/Content/Buildings/-Shared/BP_ModuleHoloWithCompass_def.uasset b/Content/Buildings/-Shared/BP_ModuleHoloWithCompass_def.uasset index 73c140423f990b71ed749c14db3e1ed2bde093de..841ace0afd202e7421095c33a6605d6078a04ea2 100644 GIT binary patch literal 89593 zcmeHQ31Ade((VBSjN*X^vWg6c0s=XKB#4?j1js=WZZ%AjPBJjbgqcYoc%dTVt%#y{ z<9(p0D6)!x=X&4Adb{hfy59GC@z?j>tL~neo=GPh>;Ah9lkTopuU=KXs(STaznS0&@v~AnAxm`6ap^K({O=tSA?Ma`j&ibkMuajDq@A=o`Zy2#@d`1$%-fsDD#IS;E z-)ntwpDR9nYt)c^2{vKtvFX1|{Gj_+OSOAWTyWT--3V5G%p0>N7Nz!HG;7g)XMJ*C zb5DXTJ7B=vrKPpEz4KDvTV8$q(_Vgpo&3rP-dnRvKl*Iyq+5pHyWzoBf(?G9^702u z551|N$DozZpR(RFieMk4zP_$k=@|nzocP>rYbO0RE`eZ2g?@c*N#45Lcl%s$VbDFG z-ysCcIrg&G3yL=lz3H~zOWXR@z6+i|Z&>%iCpjy>+vAOtHQDzUBn~H7Lru?*XHFS1 zzxlw-r57A~Xx}{u_SGXqlg>#6-kM-hs6-Df^ath#lX6i`FXjiKo!Rb`gE$gbZ)619le(L$3`~7+8-}ZA)x@GjLmZCHK6MzpoU}QJy(JopJ-Jw@U zjvSkqmY6y^x1vInXxc5K*0>@|2vHpCK0fCQTzo}sK6(tOng^N9Ht6gP0zF|V+W|Vv z`0UfI&|S8+r7`b4bWV0n$RC*Esn&hkjr{^udjS*(c-qPW{$@Q8YSW6={oM;|%nlY5 zmB`+4=Xip;cHY4sKF|vVp^&Ghp^Q4PDWoNCyXgZokfZgVd`s!xbXA@0^Z6I%={`N= z^*3qTzTWGf`vXi}+ekHXTB@skdYQMWNw3uwBpx!QZ&cxQZ_rCP+SH*FCZNIUqF}DS zDHtkfX{ymOzhD0-*dt(3Q%Dcgd1~}rkI$!Fc-CWgLiWryGRyjn%z-|0%BFh)UJofTPY>1v zyv>5dN&6qV=K*1*#d^q-=Lvc8n?iv$?Zu0mmq3F#0o^lyx(-9peq8r^577q|y04CU zA*3$~Y1Qu^f9LLmSY6RlQ=*ykk4i>wfgR;)w@-g=I5dk+MJHBS*r}SS_3U!RmobZHX`2WBv^-|4zf}&s0=_gR(@aj{N-L@q7~}oY!q>GeTb-5 zRPEHdPe)qG5vst-)9XAfzEElPJnH?hD&yvUc>2NCD)o9u28Rmj+^PoMTi+1UCf(ZY zdKjtEci~tIy|tkRZNTft?SUc2Kq~gk*Qa>Nmp#5HMV;M0`4EJyTo3ub$Lph@k=y0y zmtbtUo{(PeC%gUe#FdZ2pcqi%Y1FlI$IaYx9}BR;9|%#WX?^xR_}T6RuYp#y(8AzW z+zILFZqWtsT5)HX=06Yo`!xcG#;AaH+XZ?(24NM>v?u#Na21?JjaXSKF{@-daJpv?Q;pgnUg~|6}S1#7Z*qFw51xZ@uJuNtz0*Myeft_Kgo3C02XX zj$E+!nefm&?bhzC`#=SV9Fz4nt=Hz3IcOO7(s%Ozar{*RL)w#e@;3jGU_{whVZhVe zP~xv84*&L1tEHf#MsL!~{r-^lz}Z*s1{JCrMuDg`zHHNn=x|ji+uY}|@6uovwKVe7 zLrXvYvidxU}5xvvo>5YIN3Su*j=@dPqts`buyjGMqK1Jk<*IiJRQA zpBuox3gbsTIB_P}nMetU3aVZ`sP&!vk1ZfF(M#PBq;W!9epYh=ywqZnMzqqdTKDzi zuv$x@vR4%e8_rqsE!17qM5C&9>Zxt7l-NisnhkM_c{E3Sj> zPfo3>&_klqC!@~Xd#C`xo2v5Knmmo(8jMF(mK3>4q{yo`WLJ)EA6MpzYU-nHoVsZQ zd~$MXR0BqWwXk>LKatib9N`{Srm8pAU3GO-vDrQ*_{I&I! z$uV%s{S<|O^XcjVC4Y+KqN2&u+^pA@d75ZSamS{+rXcT|Lh6xWk0WAG+wgwFC_TXr7exCEE$G&p-(brIs52cPAE3#lU3;KIX8&V&mUllOS1AXeX0f7F{` z7~C7Op7Kr4Ndl-ZWP1*3*WK{--B1dwgt{KXj5c>@)wggOz=TR(xUJi*3@GylXKIhm zS>DA0n56{@KG$LJs1npR{(hMcVL;>y-*tVo7kaOxr7^o!4oDtfQB!kED5#xs{nSNp zB{_^~`sB}Dxb=%vk#1LQgScvt}`mT<$ANvD}CL}HvF4UKO1sUAq~Xdx;8Ou?s3`6D9fJJ z8pE#Of|BDiy&GQ#6BV9Ty>_}+U#KGe@qhU&&w$VN`x~t;$~}RmKQf63~5_4kLV4-P*UunA<#><=)LddH4HR3 zcw~HN1M~^Za!OtFK(3h3tZ=-A)@ZHyXZ;M1 zW0Z>GDcaow_UnQe$gpWmh`{-^+Nf@;dZIJrXfpb_A+u05d%hX4zT11vj~IUqv9&&# zX}!dvn6dsBo`a9Lta)@;Ii)WY)$6Bts{b09D6kZIO4W!B5U?Z&u(cG40&bxWuKf~xq6pD%#-QBx-{wg~pv6RY` z?j62ovQ1+MV~moWIJp^%Q;HvBv7o9jzocq#ft&Ad^)Eu zSWt6?T(yoWGWZ`?UH9}TOBtn+ElBPuVF?EPHC}O<<830#E~Uo-9xMU(TfF#WG!;ER z(cbOT^(O>d>$F4*o;LeH2%><@vRF>gE_-RW!w^JNAuX2$X(-V0-pjPM!EqWH;JCnw zm6qnYh^A*+;Msk15Z0s3&$n*xZbApbFvG2G!>fsDma;Ho+fZAy(xhm$F>iX}Rfrts zq~O<|e_Mg1gNNNB8mTih;h9os`aFuR!R()sV|`V)2DOn9HEYdgG8EqI^X;Ju?@DeC+f(PJL0 z^dj*dCA=RT&;#B!hj`*KCE>Q$uFFO*cKmg5h}YF2UN?t$yE(+`?f~x*QXltCJiP$# zHwStKUN493UgCh>!$j{xhj<@5#QTRsyzd?2^>83BO?X z_0rD)y@yCIKRKYcmGJ)M0B;N7{p=9$7l(MiI>6gZ?Q+bF=SRTfm>Cc6LBi{8qrbl? zURXxR`(+&d*k?Z_JS5yW?Ao>BRZFzEc%Klx@ec7OIKcY{(L2=v-p7P@ghRX|9pL?) z=q+-9_cy|;bAb0A;a%nc?`^_6#R1-1gja8a_pX9*>_L3_Dh?jU9^ic)2ajV9@V<$I z$FT=^-^Rh)Q`zue2yZVNd**RZHM%jm-gs!AGL?~ zp2K$EcZkO^qP=!G*J}^&1DkePHXd7$Pu^~W$GX~2^)K>+mmT22t{NTUU1NjC{Pk7s zK2G%ZSJzf~8IQ**$nm=kyQk?L3g870d|{39;!)BJw-8*GH5aW=MgY# z8vh;^66qN5s668@=rV1F^1U7X&j^Uv#JK-d7nrnMt}6caB$wKsBBR8xcXG&&NVm*@8W#-jhcY6J9n3dkU$pt-vWoA zqmG?j-p2gvls@_y^b3`79s2i}B*O}v(#I4T^u^;QIydsfG>lsGjZ^x)s4D1tm43$Z zL^_&e7{n=ktdoJhSe>Qwm7D;CQH#EDN+0VYpnsy`|Arr;Y1u)X(%&b7{!mWH?TA`n zPU*vJ!2hF)|20PRvkYFb@HRB9AUpd1A|T_4;g*6M z_pf*)PldPlSAmofW1Q{i<1Ge82YswDaeUh-8q~Bq+?}WYV+4JyO@SKpGeOyB!=XEt zKJ%ZY`uDmKJC;8C?-WJrO*2Bujm)#?O6Kg2k_7Is|t54 zeU6{Mp(E&6G^z9Szm3p8)^0%!{6DJtx23rA^uMyu2e11mQegcdW&h(VO!~Mo?@+@$ zh?Eh_82XU~hVJ}M6^x+sVe0zV*|8`p1a)eUKJ13)nwWnfkHB&0oM`$C;WO~;=)Y;< zA3DL>8|py+Dm~Z6+0dursKbu_hZg$7sRq_snLekTIom=10}FlV|6ckqee?m2;YS0~ z{$a=e-!1f^f1V>l{~<+oY6N|NxkWysbvyciTMs+}#Cj#pf1=NU^g%vxFn#u=kDESt zK!>Mied&Y8i?fT1naMf<1=zHtT&bU_0+fP)vb z2_1ts=m7ddKjDnN!WsPq+SWdUtSE!7p)1e;J_^no0> z22ZFDS||tKfN$@CHqo!fP7%>UynQCxv9uNrH5gSQ_MAhUcm!yp$~+?R`Xhu#2RMLK z@u~=Q^JX2nYbeoZUg!h%U_ivaD*-91oK==jPpRo`2cN(*aLi4fR8tfc(bMPv?VLAC zf}dua=D!t zuOPtOl7*WaeP(^bkxB)NMqw^(i4^aMp#;&vC{ep*#HK$KB18zC$Q{3k9x16AW71QS zGelWY5U)3hcR!J>6?lBKe;s3Pfj0*w+N{mnwsob*fqy4yL&bT$x|dKF#U#EuKwTAT z^EAJvYm?}2uGXlvYIWKIEhwNZT8UOo@M^7rph2p!r>ZrT?wSb?&=$h2(?ac*c2RY= zmxu0(PAT!#L@m2$Gp3Zvgs>j=RV6O!IF{VJ+C#yn5tSyAW{`%fHj>CiQCZ?|FSlHO z8tJQ<^b2h*Alk9uyQy}Wb4-8bKbDefx+sjwl8*IZFI8)*=;J)nVhc&#K->kj#Z=Z_ zc@I^eIkeYpPlXjC>e8AT2*S|qm4WL|BD>2W`azNcytfDE^6k|f+N~h1)zc?PAHP;h ze@)%RDo;>a*lhMS|xGrB^phnK^Kjr(xN5` zjV_>)e1W@wEEgJP51XqMXbXkhE%faM&^~a@_z=I;BU60K*df7#(i=<@s=OFEPt&m0uSUh4GWM!*3k+3!M*) zwqjSty=>}>+vr$yv}t0A&a){fb}T^UDHKAW1fUa?lKeQ5PX7iAw(#_g4ZBNbcR zMC$W-WP2{k_hk#wCHtw8_%aMuScTdcZM>F3pD|i0z12OI{uR)9oR&%Vg%sDv(BC|= zf(*(`(gbFzxJx0NbfVHnQQBTvIjgb8LbKQ6m$K!?mzjH|fHY{v5NmsLHT0?JaoZ~s zM~8`Ihl^EowuALkI*iXhW0|}|l6mB#@Vz9g5{_x6B$d?eVv?(l zMz1=$cF~%Ew8?ll{T)fl*^gB|vppBh*msP7u~nHI=aDWOg+9%wY+rhyBT14J)(DD> zM^djOkq4RoMw1=dL33@PIW|y?ZwKulZLp0%2TdX~@r!4bs#4$h0Hq>=u~IxTcYrZtGhn`!|Eb`p&!`6Byipps_F z2J7j(fNJ_hYw!-#L*#4}RO=%~PSAoEEhbtnTG`n#w#C_@%x~oX0n`P*2obsht*WhR``?re;PJ8)J|o$#@h)78EWE zk54SSb^PV*#?&b0i^x`7+7Q*Q)C6j=^_ue@>$q)txtU%4C*)q-*RgXiv&77_%0yNc zBwb^!;G!insV676axKF}E4rp`qp!H%QYp%fqY){Ga)&(19mY}?kxKuNS)|b!S;rX4 zF>*wvF^2vEKbP)Ps8&9;afoUsetSGpl#zvE1{EaFFr{&6hdQFdS$VT1?{#UzR9(}8 zI+u-_JepaxnSGiwC2Q7gEg$Yk2A(A(i`gX4#*#^!ewBmQQGB!NW`v?^_M#~%Yvlif zuS8pU#s6B(NBZCxZ9*`@;$M6_WV_E3HjWHAovw1p?lZ~G3&;bIU#HSNa_LO6 zetgE!bsGJ{T`pOE2DLNNQG1+g$x)z%{CSYb!)j@?!`O-OW|X4D>u{QjBPY-LQba!D zq8*`5WMti7tp#JIOG{MsOuN}W52>WFriL^WYc(uZIcHh%`-n5|dg8rVwBe# zitFigH=f{WRFXpX$ZuiOW68c#$@b-JGL!CHbnm1+bN-G@bb+vGtnXo#f%zH!#n%Oo zR`H`DuQX#75nhAwLuS9>ZH{r&CeJ2{L^e4{tc8SB_T(aMIN_V)u3WKg6)P()p}F>D z=2=mEnI(6S*yIiK`1a{@%&8<@A%DP=2W06}=?-gchzN*a?Nef_i{uomJhjBvB zqS!(+09de(U?o(Bb;cyJut`)}LM6J;E@q&MsSGRVO<~+*I^u>c$x3mMR!sCU&tT7S zkwr_{qT?yYzZ8n3gUI^jUl*;1Inf5s-y*dEOGK;CU8nR*y=k1R)2_E%We{ADir zwwyOcu7|qlt8tz56vx2=5!n#&(ugKTd90M>(uN>eFPrqE|B z{e>OnIBJixeCx9UMG}r^Mb_HK8bX1FH#S=*?%=CGba?xs$6V7=>Hr)0xf5)tV*I6WW zmsaG6rfK#@SV;R_h)^9T-GA4hOld?8`w6BJ&7%)v#m+ldSvvHVEM zOv|6_sI6$r2j~3Hw0x|7^FL|%@CSG_{~JwmM*9P15K|m+!Wp*NAzI{81^|Am$-WQ;s>x5VN5Xvm zJeYP{F(!O|sw26ED6HtGkXYx258+uYdl9lJU1W}avi~;9iLjPfOCM;m+)<0X-UfM^ zXr#kgWu+rdIYL_{M*DI% zi;H^FNsQnKZKYz40@FK9!+gp%!x0V6j4-Cp>`)Di%(FUF10(3{4%L9=&v8_P?XX6y zBs7v2BLjs6a#T6m5gqo@8q!8JkmvB(fnA| za{LT}$IS5*8PaGp982RL);*COVy>J?=M*{@5+s8%#|*k3Pj|?>uttRSP|ToRT9u>r zqQ|lDu?f$bFk*qSIbtD$15~cTN_gyXY_20tcx-T@b&n&8JaSB;zOrUS)sAYjWg~vI zP@WtVRIE=lY8=tw88&BT;3j&F1yV<@TGTqCZ(0nVwPWUh*##^InN<$i5$q>}`YThE z1CmR&l0o;t%csAvF_-W#_*8rg<>yc4NWi&Ml40-hW4?+PRoAr)3;Z-vGz8fSWMP%nnUG) z;pq@ozEkPiMZ1oiXqrcU%y6Qm@j0TwtHIVN(5Py5zCSuQCRxWCj6U3(kz*3WF&WBo8D`JPtB(595Jkb7Q&`)u&nskJ14~5CApe@rn{$XStd$~j zc4+}eQjRwGF!u>!{Yvi4zzzU&>jKAuosleH6pAXrBFK|NA2ycuw>p~uhkZX z(^Z|#r&dv&Aj#|v2ibBUM2AL=<7*RMf4`mKe5}k+2TG;o2 zc_KW2k>bEvUydc8Mtp|HV~rACk0>qIFp+!W2~Ilw!^#f&FO#k_2{(_*usl__ck9G&xF0f?UCqu^)PZelQn-7GN`YUUZV9_SmE4+LBcdrWTesqSVo+B-Y&&F70GT zZE#L7lX{4Ln?UTQKgCf^w$38zm3icwUaIZVPIXi_(pqvUdhuR0Gc$K-OC3>TTTd7E zji(K;@f7O8ab)?3;)v52{o&1s1ej}LZ4>)_F~g8i!KIz%s6FmsY3nBMR?e3>qQtpu z>Wv?9z*ob7v3x5GG>3N1jX}rcrWJi zF6~T5?eTm__Ma&YR&7jK!oBG%N0eE|CQX-iwxgQN6Q0+FsOK>w!B`mmhf#> z8LeG!4cKs6EWUGwC0)bD8BKVqgR>Bq&;xb8pbb6I_h_GSfpz zA+>d}YENbp_{;g|_N>cVcW6Y;q40jIkNOnw7CIx6H(KVvY!!@$y%|w3ki4rvQ> zmT{zSWWC6HF-Bs%#M%W`D=^=|3=+Z8C)E>W25i72n^2ikixjW2^@>e)&g`>PlEqp)Gm5!)z|I68! zq~Ox7>QG&s#&qoW#Lj=0cD19rJjb6+*w=KZ2A+YfQ8hYmpPcO`-jYBpk+W<(^Fs~~9U+1v=3*BO z`t4>%?IkI!cyFBHc^^Md!P(r+BHJ5BJ(5AtSi4znal}c2!a^^E_r|S`>T|F1DoQk+ z+Z@s19>5Mg?8`@f1>b=FF|Hv-%XJ_5jtcsKXT*4Ji}4ey-Y#veYLA~rc6R?7uVF{- z*$WZ$|)=BQ%-L|v{fkmJo|3Rzc0(DK2fDBdR=43ZLsm>byX#!pd*mxYH3`wkJd|%)7UgMV@M>%IQea6!s6kMl>>%pXx!SsI0VA3DT29pNm{aAHBPTi-A`#Q}- zSzeH&Mx6`+OV&=HJtVl#6!+ouQ$(vMMSPQOpeJN2h{Mr5p&z-N`M_AjFv$xjf&)og zwheh8C14nXWqWw;$uO1^YcmYvHZcEV7`K5en_+hHr5WvEM6uT)-m{Z5;%jkKSkEwj z@#sPt$QqySG1Nohw2_0znwW`ludwtO86^z!8^-&ehR2hC+uMJnc3G40`VKlq-yt_+ zZ9~VM>CZ8S6~^yRtV{l{Kik)Ecz|!8BJjUBu9?EiI6op*j5&l0R0!H>H`&q~QbFATI@q078HLNd2TaScr&mse69F7K< zqe)oo)>5J(JLaHF$+Xq**3t~yGGh;BLG87Mkv>v3wr^9D$h*SZvzLzTHnwzj?M3(8 zIHOlsn^@s@B1`nRh#9-AX~t2k@-a;EI+*eV)-rYgN?*6jJdlOTx~VGDL0-aj@yuV= z#cCnraT|<Z*)(l8&+ZV zBxdlkJu}0>+u;n0*OTdn=HmBcx}|ry-&lY4y@ok(ds@H_0f`e|58>X4HH7vk+s6XV zq2sqEvwqCuVV{^)U{1x?8KMWq(>yjnGbCNa4$K*3R0_vNTrtaVg7J1;%H+RIkBGO#NV7oPCPl2^sv?nKFv9- z89DLPp0T99!gCnx#Ba}2ocLh$c#QRi_9%1Pl7Car(kCDjdN(@8WeU#&R{R);bv4OD z{Luo#UT*Il%zr%3;K&(2PK4(GJB#kl&Mm^Ffd1N# zqfR4qbR-3R&aKwvOF?->7eu6>Rh_Wq0KtC6|~w+xjr9y3RY)e#?-c_qf$*wLXgbe;5TXXs*I zq@6CW(j$F8+Q>nekN6p+t7!mXwAYa|_y1kNmG`?PO9 z(fObDrKg$J>Lk9{XeL}Xuy&2!e?E483DLk6Q>L(sCc5N&-R~qd52|9`P71k2RTYJrQ z)<2!}mC3jH^k(~dihJ4gC}i0@+puQePM;s6KIioDSCXs|oyQl}v3&tc5}v_Uw4l*tLi~{+-QEoUia$pPb7aVf%8E|E=(J zte-pglzeBe@Hky7hkbL@k3SxPV~&yWV;nI5w_1)E$WLc@nhnRD4^ z$L4;X_&oqRJTAwNM)5K(^NA_w@n{{Z56qoD<_KZJxChKWF|!Z6x#c7i2=5i^daBu? znO$*M`T$}*WpbsvA0UQb@-iY zA$D^%v;Wv8P0e2k#jF%`3#bYmBb>;-$uvJ7hucqCTa9(G{ zOaU13StZYPWeg49`H5OQCRoRDb5}Mnn3g%`i|>u7gIXBzJ3kw<&v2RB*yEzpaop6Y zy_RL%mAcpH8!9!e#1rzi>bd^LW`C336bjPMI%=f!KJ+)o*P=HEyiK8q(q#H^Lru%B z3HbxXddQRK33+mTo*>?r)wHCFnt-=ClvLoY2^NJ)^w2_oV1BUJ8>~qzC@LxT*S7fd zind@#Z=C4&`RND5BPeOQi(1a6qiEvvx*3gusne1g(+dhFFYtO(L+N8vQ50G@yLd)Y z!{k|Q^HLU1^;1c1VPQ^6eM5fc{6I;1Wx;~Lj71~;CDjY5D1VaPnAuQR zS)Dw8!Q_P%4HM_joL!R93VPX7>64d%tJd;H-@KY+Uvg#R^yJ#q%r;M2aqHBk>CM%J z<;~TNwTq{;rBr$f3)*JSnA$qkms3|cBXfT3j77eR!pvZGN^Ns(VMAVZYRbY{GfNiF zOfC1#uFtLmVMn;W%)IQJpx|R#YDt@CW=`^yWE>dLleT|&w#XO-nwmG}dV z9^e1G@c)AsPNZJneeRdrzTEckFTc?>ML%)urp~L?xtluEkGE>{MPlK{)#^41`Mqu1 zw(X+|Th-a1gh+pHteV5A;3-wuRh@fAAPZ)}XpIxZ?u2xH1mbPrfsRe`B*kYW1};=c zeHkh8{GtM!r_Ri$wnYJ+Q)i~gDw(I?QKu(L#?JnF!N#J^^AGxYb&t~VFGUc@SNBt* zYAV2=)j6`K4E&e{28Kp&rpx1gb;e*Rjs*H!sW&#eEA>So`Z5`LJfhBt>P+7xMn^CD zO!fvF^-x7kgWl*7&^*1))8Y$-U9VBqo>pf=i@PbKyiFBEshMTDRUr(Bpirvr>5I(d zafUjxVJ%Vj+&`j0Mq=P(h15@-qfS{062;%SsvujPS)Yiw;(!f@0xi1XSOuzpF%6#q zoW)I2NG!!c>Ym%zP{7EuRbh@gpRCSYdA@RdmR96pjKsik3aMCCjyjbn2v=af?~B5; z0MddXu?UJKd0Uc%yvUZrYGY@|0)F*zb z&ARXECCz(QEY6CUW$SHbZ_030q z`&hws8;7P}I(6Gf)*I;DtB6H0IGhTej8)i!3a(X!OV!z}&TOO1o&ZDRTNFZM1hle) zQ3Wv>5dw|inh8BY*En37Tb(sc$nKW+rblRhCNk_`TLiMK1~#DFA_cRLc4(Z#7(2M( z#~^`LIdoZCRYV2T$Eq6$ahbXX-EKXXYF`p}EP z_5P&J2W6e92t~Dz&bvKU;UQGO-ND9#nT$9Nq`$^2Gh#|JI>m^^z`aXU(CB+LeDIf>uh6rS>KLOBRIRA-0Xn1$}984d~s@?Q~#xafVOCL-p_NUJP`oNqqQ^7a} z8wK~67a^7)YV1v)!SoqK9~dT%$llZFJ3HmU-Oz4)3Ep?Y(F4CdIRE^4w-l{OJEEM; z5M(-}3^s7qoEWSz_U%AsuS`1N?!feWicbqo>v8y1mv6Q*YrU2_ka}%ZH`CM^W`qN0 z^zKUBh{K@3RW_@F$SMj`$pO)FCW+zUo4erR4+E)Za>q|tLQSE-J#;wVsa0X+v_Ku~s69vWaYET8csYQDaP&HP^NjBBcPd3#! z^_1+6w!;4Qo#)!!{jNfirM?tD?}T zYOU7hyxRNJ8VB~{Y^t%GvdCzSzF~Kp%k_w=Fw&-Cj5rijsEci?#IT8XBUp^=vA8U@ zs&)>uX|EmUKnj9`>Ej%uN*2Mhy3=Z%K<40&vFO;nQH^7}7@Z;k7>~8t4SyvuMRg8k z1~Nw+1K>stIt;)dc`pEcMT;B^3=}J%;dO4yZCeo<4y(ujv!azJ*&+u9qoNhi@G7@x z<-@GV4G0CGA_KxJGE`O^Y++thv;rDlqZS9wl-*~gXx3$FMqLJox&{=jK&XN4S(;h7 ztAZM63<$5xBn2ASzyWG~rDbfvJsqg+f@N%>4-NpLXwMdXI}}B97@D>M8eS&3qbT(~ zw!eUJzKz)vyFEx9^dk3q^jli;0BClPzldI@ODpE=h*mi=qDuL@ z+^UsObgSGA8C^uHRuZ#&yb4C}L92{8yZ_WER5z9LabN>qp(aO9@Fc2nYy?1Aveg^} zP87gOW#_aH_6#1;J`Mw5WqNjZIHPbU9=!}aE1=;O>VXlif#YlRKw!K!aNL-@F==VJ zIdsZTEy&MJ&dtakQ;?ZGEX7y{=tEBPx`DBe*rNlSkv-Gl+a85pdYSJt%r9Ghwsh)iVjDnQ@|>2vJtV{0LkHJ%6|Sx?|rVDQ8Q{XG#?SS1F= z5(45dEP|ysFrvn27SzBvNs=&WuuQ<1eQW_}5BQFn7agzl%mG{+wd%Y{oeR`?xjILk zPFE1N3}{LmZkDI69QKzQ{ zAN1k1H>@qab5^&Z_wikSa+w|M7z=gbBP8>- z?gUK8U!>P)+R>`q+J>cy)uzJ0ac@LJ>_G<->YEQ=ocPOg>+>#4t^Z(LM$rP)Mmgi) zKJtJx$G`K-NxLWfH0g?hH_p6w)@9Gw!5*_zw2{!Y^Cj#@91Pm6qTjiz8%nR6b;n!p zzwn+|opK`Kdx!r?`=RlbN#~xqX+Xbq2R;M|BVl(d359LKF(#*$_-l3HJC&Y5y&ke& zqJuHFk|hbo6KeMqe?4svsCQ5CRtG$RHn)6^?=IKtbb8ufqigg7Jn~>;fP*MdctIF2 z#?9}lau|hJDq%x__^Wbu-yC#boWJq@2d;SJjql&JgKe}lYIOP@1gr=J66iy6YTBO_ z5{qN0BQIkXL}8i$(HgUhb;KXb6Mr8!?}v$Z1bbe1Zryb-hPbwkbwnK2{1W&0jTCuA zmqfU`=)Efyn$cBWID=O3JS3zT_5l?I`EFaZI5?A zBpi;sL!wF@tkbT3dGUiEm);mEzUTRz#G|2uNZ4AgzzqG`XjHXxmtV z*d68;yIag4kdRQQhuk?WUSF*&(p<@k8utp8QY;O`A0pUO!Ya^Bm>a=y&)<0Z-hG~` zDY)Q@hI4*Cdo%KuPP$Q~vlM_79Wk9HW`gh*NgC6WD8Pt=)e_TRN=XMX{bird_{+=} z61RnhJu~^N&n|go>@~^#m<90DRdOXBUrdJW!v;t)*u;b!-QDPI zs;z7B5lecLyCsM`NmQ_fLkw3F!TD}~s6mn=8EW0Fo+jeT zNapDBpW4E81&SUK1n^EpuZ`YsJSAuyAH*1wxh^% zm~kTad2QP%pFVouxkYD9-0PS3CtUm{D#SC+*y+%Yi{t+wH;fs_PgNqZ&&G`7NNr-q z@#fCN@vHjJczEin75O)Q-FD)aq00-H1#rZ19Qx_kSL?c@!JBnK&Qni(HT|XHhSXOcWf=6{m*}0Ujt81iL^(Xr6w@C54ulz~6)YNum45>m~Gw-gv z$7eh`;i?8Z*lR#mhaou{otaSJ^Ls+>;kEvjYM(y3IiS~ggOq2D&|KH43X`~InRlm;d@$>FOJ_2H_j%Oke^~9F<@)O%` zoV2R++^m&{&(F1kz0MWr947v(KZN*r2KN39Ywry;6lJaXM{vk#Ki+p5ICdibpo{Y^ znsMSsMRzZpqMhXH@*~8Lg#8u7)Db5B?0>8H%u+lt|Lx;Iwc?U(J?1#DghF%7gtJrQ zz|0Ac58UVcBl2#0r0*fm4jJXqaV>gQ1!TtlHPh?Kjo}Zu` zq9)9la_z=BcTQe&VBMci_Rjp!4))&}efB5q++X+LaY&w;{gNXwU ztRAd*?V#m73yv(kvLdNh$pas3wuAlq_fDWghcs{e@r^MrPQG*X8@=|t{nl3?LA((L z<&dWER{uH4fyS(hJma#SA3SV?9qch6tHT(#yAwd}4%vx&C%9E7l00+EyQh!6`mF4m zFIL__;`>=RMe`3SoJH{n`&t(-}oX82Ty?E1T2U+TdgguAkK}Tz!7{P zAzu67s|P={`htlk-!T8D*@cO2)ODh!$OSQ|DH8T9h^fQq@IC}Emqp#f=}`hbR2dOt z5tLa4m00pxaa3!@DNJ6ZLy;?zz>Fm?mOyqz3iWZk@OC6Pq=Ti88QzdQ#+<;pI}_eA zbBABq^_(HaSDn!M-PAd+_h%Ns4yRDql=AcI7jL=u(ywwh4ESJbw|>X1v4eHoWzb60 zCLyRw6!0G_PYjE7eo|EqqY$g}*{UGSGt+C!&zO;(bN8a*X@|X)^`srF#nP%_>;m?X zDhXqi$)hZ+Kq2E~#j$|JWtd?fOrWLT{`B~`fBCYm?A6?3WnVFwifh=Q0y!dg6xqRS za~=?I?fhL&b{n!p(`X(SHpi}T+E3y+?F7XX_iRk3y_&|qm`q?6jCmUhW!Knztw;YwZo=7ANoa{zrDOjytVooa4uQVt-r**59F6 zr9OGGN)T3HbMtg(T-;RPPsGZnm?!BQ+f(yZqM`~P2^O?4)({Ns(|arX^9=|Zm5M0 zpAx?PPr!!g4b$6#WKYeC)?v3*f^o_iGuXmUQ zw9Hu#bo$KCH~;zZe$%oxbXzs(m~}%(+QB;RGNXuc_?`pdInLjG*!9yI2>yNMB|py! zy;yqNL&ufP>-G7tlp{-5jvrb0<(FSP z1LoQb`w%SBo9tk=8BZHk4$FAtRwN_ek(muPcGb}C(-zu7>1}HD1iT*Fk{O~MUWx8$ zw2`v_U(rb0Cj;(c&wQQIVY!J(*a@nN4Wn+KzsBS9F80t?22pocY;Up)hwUl#|H%Yv zNoPXM{e8Z?tzhVDIrkl#b+c>BnJ?Le8Z4JTGU?cUpCzr%-!wR}ciFoKl-j{M9%?M3 z^MB3+3!+CpJ+OoQ!6sOCkAK?p43tB(e);ul@7O)DcxmaOGhY7J2_x-bw&CVKV}dpP z)$_KN-EmXSMJp#S_~nj!#Iz$`6kY|r&=HjiV3zxDk0#>LOj>vTKHN(rJI~E8OFaYZ z?e)rySDyIu>CjIk4Cc;C+dl^v zo|<@^cID4MK7O%k5+@EO*a#5$6$5rK+jT%eZ|8pv0&F<)3medMygooVf-E%6ht4g`05MkV4>y zDMHKwS($spi!6xJqnE>P#?Ts!g{^96sr0=rCMpQp}ZSsvFnC;$tC9N8ChT27|Y#YrR1%Q_(xl zlunA*qw#t$y&_F3SOiW?$P0MtDU+&mH`6=VNI0v-_dM`>$h6KCYD?_+0Cv!Y=YKnJ z=4W|#z4q(1)0+qE&I$v=NV;(xK%WcuyZQNB%ATHdu6yG0%C>z^wS!$Lu;rg{qbpP; zR_X>aI+FX#06MsEWOPgi{OG5|Nb?}C0p%ams=EQ1cxC6ETu_rz%9O%M}0L<2tK(4z?ZfgF938siRYe;s^Nse&7@OXQ7vKFIjQg^t~rmePajv zBgYT$yX9ox)B*cmQgq|ZThCik-*<@}Y@$VdM*J8?z&za-^0+JL#W;Gmj^8@O7um#k z2fNBbDD2W|C1C}Y8;sI1-@#_QT^CF6ea*{Mvr&2cWvYPX>P#%@%(_nf+YgU>=&wIa zT-oKTd(Wyh; z2Yw^J;L{HF@9;jDAP!8gBEK#b@b*j;awL`Ze&_ivb@|KEmOjv+9X!|$mJVX-FuXE_ z0LJSi31VMC`!AV9EgbClmrM>Oz7G59-f8>x8eY0N?S@$s=3Wj~9VsLGkl!DvyL-Q! zOL|;ev*@)GWV2VH+$h7{ZPtU_}!i?9{r; zJWaYU!T8A|{*omDj(*1|s{8SE(UvCSEV_hYh2MlxaANb3-y8zTBVlJ*+At)?LX!Nw zR{FkKdVWLiZ}XR+M0Kj;FF~<(D%Mu`i%+cA%#7fKEA%307@ILg;znRV=p*1Y3*uI&LLLBYMS1Zws zy~+jZez`hFolaMf)#_}_(&Mh6J)^MMSv&k_WO3KTzpkBMS+s1xk_%2fWBM~p2y|H? z2hsKKu21?_y?j#k4cC2ez(4lcGSv?D?-+iR{O$Hf?Cln`EmIuP>w;L?#t~hz<9hd9 z3O+IOss`Dlx^Goy!$#u1<=d&P^BGs@v#vSxxXE|jI`6c;dzDSL+6BE*EDpOz zHg>RM6h2Od4|k`VUG@#>h?$WOz`#v=UJPlT`@H81IX4e1y8rXh_bt5QUk}*9Y%SlE za2Gsc8cduPEPvyuuXo!o>#8pMAMpL|4-9lFVdNtYNEivb8^q|qfZ%LPJ%Y5_9~`yJ zvJ0L|q01wmC4u)?T`mNpatQy{`YpqY&irT5dE2&}H8kbp^Xy=+f|xoCquz@EGrYB- z2IIA;&JRaS9OvyGjv#@j+lkBGNYp2;&6{0ZJMG|+cCh)DRt>4JC2*qdt#2^j_WA>e z^@3t`lR6iubH_*6xZkv}RgvWYxL(~udpOu`X3ASlo24#d2J2)p!I*3EZdx_!@F4!; z^F@FA?4iwhODYf8^6<59{l>h46POMTOi3bNm$iejyrL2&^3$aE=6Qq7K2KYThrSd@ zEQw>bB_~_P3~W4L;_D8@1r2S&hIYZ%RqjiSM!v8N31WFW%5d0C)a+m#4}XIErQ)wS zquB8?P2|jx(`PgqPw+_3$yHp&^qgf1A!^~LNflrj9>;$2Wc+nGNL?t2iRlgap3WJH zTB|x6Ne@Kqu&aFh$nrOqB#kV-BzJuAyX$K+>|6x{XXJZVb}*J+Fa~bK*UF~n=clEo zXQq!yPEX0mPcFcZGNmWyj7v|;7?+k(kR!G^7B$g#aMQaHG4?{B?X6M_@KE!S0 zt8|bcp534vdT4&@&KJABczo84Z>-8Ge&@MGcCa1fFj!tgv&LcVF9X=lMHq!x0s{Vr za*Xriy)X72h4mfl823GJ*k!B!{^XQRw;$Fs?aliZSryG=h?{g2=@@n}d&fx2&dem& z$Q+ZMM_5P$hn&tNV3S&3 zUAuDm7ul!G*>~^Mw}#vPyv`t!C-OZ$JJ=SB+#+%rqr#t6iPbeN$Yz=m25jd>G=boU z1NmO$3zC4NoN;g;c|eY#4}3i7@ZlTsSKT!9uD35cd59fs2N^#Ov}gQ~Bl3G0>|nNwM52MC@s|#(<|IV@jad+e6@C-u*cjD1vjZ7& zM82wF2isz4JG|d^e$eVmZAZQ$19qJB+izE1eMR3{TPCepFlPFwlDS7iwn*3&Af^sO zwkZUl*KO2q@!)M5`ModVCvk8???Tf~(NW@uZ1AHt_)Q+&LqDNY=cX@)(dqkk>D3!I zehLhmOLyjLH_W>eeayP@j_T`z^(A-rdu!3VqsHC?eMG|kBZIirgYYZ>Lr53;VBr7< z0u?d=LNKKwY>q<59M`D^i3!CV* zw8mzC6aBaozE-K$UF%mr0YyI{)6$$MNM+HsYu$~tDEcKSdIIdFS+w{v0rR&wdCN8M zle8km4-%X(J}LwshWJ?f5x+U62a^hkd;$GXp}x=`n4ctinneDKq7;mz)Om?IAdP5z z`}zy(C)_>hbWPpk&TqwUX~|9OZu)gG`t4HsZtzA5Utao&FS2gfI_-a_cLl}vcZ){R z<--2if}E=`nW}cMWvU^q4DN{oPw#U5KA-sg3q!8yq$0?L&fi@&A%5;l{NR`eKN#Zn zlaxMBGi*%$!k7TdANJB0c^aGP+bBFR%{JOIy3pg3DrllD{rHJ7Z#{k0m$1d%=}Ru4 zGMKAqgMS>Y!P5!~)%5iiqHYay8KaE`Z%BMGJAR?e=Nm<1gzg?jn>dCk>asOyE5?dz z5I@OQO#;Z@QiH$1qohPKI5oBeLvF!Lb)nuwzakXUOQq~WF+us$On!Vfyl}#Lg~S@N zHg7soZ_>MD9t0VaN2I3Uw9z zC>|NC=?IC|@Ca`b9a={Co#;*MlC<<@oL0r4a}}ZE7(}1;ezQx%pojyhto1P0m>Fsv z>jAUgXDFnoZ5AKVG&?g^;ZQ1oR&hKcPud~sES~@&s#fGyh?_k5n~Y)C&ns-l>m3h| z{^IC|RyIz#xA9*?mk<5DCZq^Nt-?Ina4f_pNF9%=LgpDV;z*Mx zo4?n*whiL}j;N-gubV`X`3-(}MvUWSd5ZP-g9+g!L$hvH0A`H|-4Tu$akpf8mVhj2 zRp+{_TNFwpp_m-4z7)sCqax3E5QC$A^W1vsVOOsD;rbp literal 23922 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

-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 fwKeO|6e0Q#lOo0EtM#15G diff --git a/Content/Buildings/-Shared/BP_TestArrow.uasset b/Content/Buildings/-Shared/BP_TestArrow.uasset index e7be8b61f3b2b28a7ac419d981880ad50da738b7..92c6806d4e36355d2eaf6e9349bb47939355f810 100644 GIT binary patch delta 8880 zcmcIp2|ShA-#_RApCJIbKmE3bqFv%5=w4obbC{L7`HH;DXx6aP_6Jf%e{S{4M|i|%JN75ZaaJwt zu_zv~_$R%C38}OJHkrm(xsuh%G7_+C7a1NI1CC{JgQ`NrR+8nXz&0mdV5CdHdTux< z-Dwn5bxOjTtTF?(yK}<>;zAO*oDBitT$2^xvc1_c?5Wf(H*rYx;BJZo=aZth&(MsCc6CfTGeUF?qZVUoyq@=Pax z+nAWhM2ART9GD_Ie0@H0X;uD|29mZi>^`ZgzoWgYzn87MlkIXBd$1+0{yY{qZKEQR z`vH&jUMGIRu1-6vLH$U0L{ub?3x(Ju>72yAnaalKG*@>k+g{}smvB8v&@zhnvWO!&VtoZuJnmAF_a zUzGk$u;43kTfP$Kj^p_MCV1OdGW_N%aDPD$ZvGHAVLvemlW^hy1g3ll6xBY)J%PCY zd;&*I)-;@kGPES1^r6AH|KA60oWOkqoM?O>$NfrN;Foa3_#+IV^@kcx^nPD3;e~(0 zg?vIV(HE|fqBOl9x^OE2#Ma6!BwzEuGUOOaJiJjF=02j88i2dr7+YQon<_s~DHdZSK=?1GbB){Dp-s-6;BWC-TFal`fpipW)vOpFK;(1!L7m}tS+ z0F|K>Gf@KuFo&CuD81oL^pvB{9)hmKTSWpk!wMm28cvuUDT22u>ZqZ80llsSL;=^u z_`e~9v5#;r_EG=Eg)o?a%#9X7FeN=D^sW;^h@qB?5s{xmav07OS@i@j=S+}e6?JAJ z*$MAKPU30`V(~`oJX;~#XBx&)-kdEjC5_0?5tcKmx|E~I{AXuqg@P#?QhVG=EjaY) zh3Pa>Z%ZE2HKz|4RKfx;2VC_rppkxW&v)^!b1NXH(+Z?2f{P2t#r|j6ZQs8NCIuI! zgAMVetp_Xh0kxw2psQ=CK--?mB3pEsX|B8**A@rZ_Ege*MXjEG=i1RGN^i!i4E4-P z8rYf32i*BK!7qw}UlfQznE_U=;*bKYbGr;Iw0$HS+Xd?OPC~XYnMLt_%IPfz#;6^n zQX3oEvFMQkvBKhxWi)biYmDYkOv_if>{bWkBFr~G;K;jAYz@7TCR`sW9z(PCJLXANq)$<-UpG;}WGiU={ zTf28gJmgeVwg?oWUlt|3EG`sKH9OUO3$v12ACt~X)~P$zS*C-)o&krR0VjK~pobwb z$TU9;^;ZafRkW^*O`m?fTYPrUfL(lXfp~Xnxn!aQKYNd56L~=EMFh2vMykDYrMNSs z5gH{>PAZBnZKlgNGdpRW%N~>3E{|Q_7gc;Y3A%h=$jhRD0&%~bzF@0OraUU>3yUj? zDzd7jf)0a(T=QI@49BV<;$d?wa`m9r3!c^sMA8m5R|AaX@ebZahD`T#V42S6-GAzE z|0!LnE5zV-*OlUq)N+#WVZTG`0K?jk2?2;c{FFYWYr1jXp&SnZO?}1}PV&sJwaNsn8<0ck)CM4%29A&yVl}(q2GZApqE1;Vz zpe5;i8tJ!>rh5l`Ar#X_toPT2yg(BdG?ukwl(ppB1Cx*!C1RwluA<=`xY(X?vHgHO zSp23Tomtj$D9<36bkMDYrk-Rv8WvYzTg$FZZlx7SW=qwV4p`?b>@I7fnCCO#lS-Y& zyfD$3Zxc0Ay4&eWF)~2{!Xm75Mrov?KUGZ6ep{&!$R^lJP$;8u*#WU9tJ$XhLpo=awPgDu=}n zWAj^1+;&ekP#KSM^^`91jdmEZYJ;zd}t_k*9Jcrvs-s0bSM^W1=?`6}SF~+_Hnf?bJWs03# ztgvD@-_hMBPe1wKMU5s?j+4T}sOYBAW(}{bOJ0eqy(PELy`j}pXR$r(__hY)ox-1f zv3a(%in_jT)?XJ#&EBlp+s41}S5f`FG=bbIY?IEBN9uph`BAuOJa&Ap#kYt1Ih!6) z*9h|tTyFL?81fymnfLNiN|kIc%lW>hyUDZS7+KHg@o3iLHs9%93$}IypNC^u=`eKp zSkdfj`Niq{tnyz@RV(&9QPvw<(eQf8KI!?*KOU8i&~vYNQmOazx%3W=q-?&%v=>^% z&GYlFQB2nSt}+rgtLBY**w4?x_G&n6_U=o0n_s!uE|;O_b)=#-)>mpoTdYs%w?{rd z`q4DLyR4F?*?(|ThlOFEXU@GXi|mtcua{Nydk0*EH#y3?k7ewXmXxv49&U_xp32|$ ztoPC0gz`+oUkyi&W1d6tjfJM|D?0fXY_=_Ysyw90m%V!WS1}`r)B4i39VHDlzTg|ZH0GKkdr}T*>}S6A9(l~w zo-y2bHch@~lq37ysVIGC)*`7XE%HlxT7J^|JLx|j`y<1<_~%w-J`R)g9vW%isd!wk zCaQsQHAmrfe2L+nh>AFV@BPztjpM7i=e*;qLha;JO<0)xsBub-Q?nve*on#b$pgp8larYM^*IKS?(K8h_-dk7s8| zh{o-m8Ue0Dr|(RyPCKm_IQP2?J!V%kY`yE2h7OnM*J?iZO^+T-a+760*;UPB#hD#A z(rcM;Tsn6?ru{lhd-~s_Z_U1$v*X@(|Jhs|`7${z{y^e`gT15~5dv-7+P6V(=34Fv z?zq7TRaxr3r)My$uUqv@E1zBJuzKLu(Opx<9sdqIWw?4U@N{bH)n^t*PnjtuRYga3 zIX1O$*wu~+hU0yyMsQgyXrsaXeph;0bFV{lFMS%E^l{Q-;YgC$SdqUlW}D`U#5FCc}Z4jxa?TJVyNcz zr1c97fj32rCj(*3o8{yt_;~)6?J=8W~u%H^2?5D0-xXqB~ol&bhNTHE+kATDdFN4VM+QWE8dJCMb9} z?`8I%zIvp5H0X8PyeEInbFzL^G$-T%42udMIL+T-aH8d4?PyEp!L2Jd1eXnH<-q7@ zS|}VvQ-Os2Y$!su@IWnpv>8QYkKvFuwFpxx*T*UrEO&GtRMx)r?D(!5^=dg5Q|JA@ z!Eo29-*oT2U0&N173Og3QgY>Ha`#&bX3Mx6dWaaP^Qp(k4#g_$l`@b9$zAj)|6NTXv<|7l&hK69@ce%7vQwR)qkv`bJg$sINk})U$wHO@WGmZ!6Wmtu)RS=yfg&DVC41bcZf!q9ou!7ifOA3+m<*2E$(z zG=2N%9)}+S!$ftax?72LI#?&BaX1IYb=${EiwdMIWPRYnrGm3=B@^_()?S7bMY7Uz z|J_YZlo}Cz*IofNqahtebsoL01rjiPlii28p#k$11&Bo@1(FI`(8HswUy}3b(>hXN z49kGym=28+FWY#cs}w0oMyH9({me3W$^i346LInoWqLIwwUrGaFsOGHd6QR~k0uOB zD9m9|T1zZ*(E)+81{S*DK?u$GkqSezv77Kb1}l6lLC;8P8ob0+foDH#hO-LRpr;_= z4v)y^JgV;L9U?1k9(?zX0uQ0+&jHAYa;vJWIpfNzQ}Jd7yx|K1QGf~7!@HV55P{{} z^eA}3QWA&<9GFJ}F8qzfX3`b0BlOwWE*mOoG1hFPkFBM{$&B`Q_v*v^x} zPA-?Bm;rMvdZiV~0=uzdKE`rdLNcjJcbX@r3Ka(TQ}2@T11+$}543b_*o$g46|b4# zIew8aaj{KYpV2=iqC>qO78$B6PmrK_=vo|rd8nC0$NXJsvzNfSD4}CJya^X2;yz~% zUN^-mU6p5h;Wg2Px+z{E8qIOtb+BPM71fy^Q3;hf@YY5{)$JoHQWd53Sb!Hznl(`Y zbFs~C)R}}TpXUhWX(HjD=L!+l!|*2H9iLY(QnNFqeo_i9jnEKQ*Vzz4*WyGvX3L^V zFPN3YkF1WZAY# zlTFW1lL!ldIzp4Iu>!UZNf%v(s7}Hl0`V2u4s%azfUUFqeJUI0LC5n+Z@h&9mf?+v z1xkd)bj;1&Sasn~V{+t>5@3Wuw%w?G3VZI0JOuhy)|`$D`GUDS!vN<6p5`Z+Ua&BAN5@tlC^;dP*oE%30Cw#2KR z*zexKs#bXIla9frdd`4jrQvBsT8^Dsr7Eq7qphKqRB<#LR$`}C8)I6l7humlX{0qG z6uKEh387SAe;lFuzpz<)(q_zc4dMX}lwLZ)7MNgcZ|eVtxf@p@bK_Ti(p+qgFBhBP zBZje7>wVEsV~pyfN3w;kpkhoPnzRkBwl$XK^M7>5=cj?`0Rbe)$9aP$!KVt_z#%~aS^-Ox2?kRjgXP?y z5FRT$AZe1z{s3cfq}&QDCCI^_a2RY5rT6RTJ1a_b(eH$cqT&c#6;NP<5?%EB9uY+e z@_6HFOefghoVe*HprU;ne((me@P8frM~N7IVo{&i#!dv!;2Tc>01+Wf4!Sx{_$r;z z4)s}`3&Ry(=qo^x4v(l+j6jaLp&ZhCWZB^uCHre3R=B(J>?jfG$G8AGF<~&*{X7 zY2XApW)w;_e4h>R35|{;CU@^g&{8`j!;m0}-VYc8zhmH7!n1@!0z}`{u7}F2I)4V? z3cuIrV_IQT;d?qPr=aVN<5uIj51vnCx-eUVMUr#^eZfpvHZ!wWyvWqt)YR0@)WLkQ zt*Nbrt&#Z>(?zECi;OHxEkv&$lN*@`R^fc;cs^;>Q>Z>6gixO#DngZ1HGa7DMf=nj zEPddy+ZwWgNtcddoOkbL(m!u7DNJAQ-fnuJ{#gKYcG6vNjR@iY_zv#Ms<{VH`pxF! K+!|XDX7@k*nfw?4 delta 7149 zcmcIo3tUXw8ee;Qr<9r=lU^vM5J?o(%*aeNNllVWQEAdlDN0DHDS4bb966TPAxcu> za!?-UI397(;gCq~!9gA=MP3~g&0TBH-pQ56@BZ#xwSM1P>-&F?_3dwcYwvmRn0Q`C z?6W1*&jtVhn{@}mEQY=j0O}wE01(Ci0R4ld`cOs;3ot~(xIO@wAzH1E#%MsG@i|1R zQD0&QfQ!?64Q;pffWnlHptyxTW;s&;pFddNSZc!l(ajB;lEW zrrnwnHSEnaw8l#)pUCLTC|{uN%P6nW^kTq4I@h7Ct_cj#-AW9FExPP-|6acl&`Dnc zOZAV!tlmO-G^H$tqRmL5j2e4T6q6`wET!lZgiEBxU&GD*JWdX}E1dIrU>B|h8BX~| zTD_;6Cm0v|RfQ^jGrtix3)v^z*9y?Tn}^ zHGUw1^{j#Lfw7%w61Aj_=s{}C3hrW0?Z)0ijW4O##Y{U>d~UHxEbXDD;xC#+O4Dpy z@GzUJu3{e!{fLc)Fna>Uek~^1znR#X;|dU>!IMX{CA;q(%i9Z)R&@fR^wHp&DC&>L%@w6sV` zLlSd4Q+#%44fOfFB2#S)u_cs*1EMX|SQJmPm#}i6zJ(U!N4;`Wi)4npp*HSF$^J){ zS5Mvl=|yqUu@jC!djB2Ut;ONa_oEdc=-5(oC2%VomQl0vGJ_$=Y;3m(a%+H=i-L&U z);Be)MrhRww1iqhFu}Nyeb%#y*DP=^)ZDs7Lp|ok`c;bvuD)B_cIL76m}dXO9zklF z(&pRw0vTr=7|kqoKQ~gopy`ZxRTEcdvBn_He67n@vO>UZXD(|;f5<9S)3TXfyCiwy zSx)<_jSbnx?#+JHdu7R+hO-IhW}bSoe_pybS0`_}gTr5C&gW*I%^tQ&wzAZ{p>*;i z%dC+j7F-15wBpAZByn^%Bn3ECPf&pGoZQdKw5#LSI=K|oWp8YKBM(v!t8C`kh&Lqm z&E&q@$*?V1y=qSUv>)4p*PRoBC3zyhmDahNHV)g<*Jqqtq4xeKez~izIsFm*I3{Hb5lu=oe_e9mb)k0EtJZ)@tH)6V zLf!icu-y924%>*fvP13iw&I()+&(rFf)h`^a&?~Y@@kXdPCQt_vT7RD9&$8uX}^e9 zXTbOn1=rKPY;ly$vtmcNE?CYgG!SlWnagb6*4w;)G1w<@ z;0;jSp~rc7iqr8x^tZYE(GvOVlY8_l5)1W|VBcva@ED*3$N7Wg|LUg%Tl>iG^skt& z7^T2M13JTelpsS9_yHz;!bF0t`@Cs6o2ccTX(X!Vrr-v+)S*tB(k4w+?XjxZELG#Q z7%D;auaU2-iZP1 zbOT%7a30+r)^Rs<{f$wVHD}{Z6r`PK&GGp=!v>pqHrQWUe3Q$%gZ#|Ahj(fdm8%+Q zNS|y^1T&Q&t`cdNUsi%UjJ$n3+R`CxDXUV8vcxIBOQ{xzOOe78e?F5}S8!gREbgpE z3b!HE8nVQ03RU{Be>ZF>|I}+|tXBY`gS1e+h#qWbRs=Cb{(LzY=ztk#@O*|sj56DA zVo`Qq{!k_m@tI&F37oMqxQ45P*VbZHnatoIMvWgIFh%}onHfZU)a{v|Vy%d)!R*%U zv8)J7sJfSeUC2OP&VZyR{Gq@e;WgQ3kTwOoC|g&Ed|{tKV#tMVip+}?z*&F*M%Y<) z(fVvtN)=XzJCDy?t0#6~7ittEEc?^0j+|Lbx_C+pR~1?HqCL{+X0JGi!&LJ0Co<;_&%#xvdvR&8`ri-|uJlgO|(l z(~{ID@>j0$OU;TSA4r~u9oclRZI<=RPPbLMJP|lD8$09Ob|Nz^MQR_yx9JDsiWL~zy-_ioPQai>2sX7$I+pr?v%`RrlcfC z*CDcE!s$cvm0)Q|!D*)###Rl+9Xs6Ly?j4-TT#W|*T!zl6mNKu|NFD-0h^m#8Z|X| zoSb`GC9D5h&CD&2cFg+OwNB){d-Rd}1a5p889#8`BX|Bv` z=_|^H_2RcOQ>sf7lFRzpu5KSva8HB(Fd-_VPXCSX^7iY~_`$zjd+L4ivRrasoEe~F zP;brxI8k4Dh{Tf74>Ab@q&c>9cNyzn+|zwPw@zyT_<@N!`i~UFpUsgkqdQ>MFZ_+%rXM z6hJIgl@Ge~e4q|&LV6JuLNWt!7NTBJLDrWKMG)zdcU45D$dB8Lk3>GHo!!b`ua62X zS$I(;3;y8nVyXy6e+>Kp>P`CHRUPFYmq)xkH8PxJNFAi0NWmr?WN1JZ(;dZRiPb=> znDdQYs0!426fwFSi`hjv_=4~_MLEnsRCPUJ%cy)4(qjBn(cQG8XiavPPnb(}4h(X1 zR=A2<|H{)=Ni!^8}IYpJ2PRQ%Tr^hxSoo-p*i8GOgnhQA2( z;1d2_Xyn6&D+L2#l#e6f26-;_<@YyR&Qe*(s9}7ncRLz^BUKFKX z>;ZU-zF>M$i}-5HZa=QoMlTvX)e79{Ly8}n(!Z7{PPTM z5$FY zgl1V_7U2O`n=+x!R6TirEQ=bQe0ba?h{pIS)4X8JM2+4Bz#9#Totw%_NtwN1sPjjH z6G><{pQt(LMBa?0CTg@QntH)}mO1=&ss+o5g7g?Vs3kUZ?C$25tx+jHRqXf`wH0DR z`|fH7{f83*YVL}kA7>;rqhs5Z0Qi}>P)zzv;cs-Z(KL=QMQVl2Uh$;qh?o(VrBt%Lwv6j>xu1Hj2ji$j?WEk9PdsXCfhivS>Sk zgQCQQMbYg3p7b6lN}oPziq6jeEqp$-X`DAbhp!Nw)ci>mX&rgHkIEeCAD{O_IBrHRZQ1qT^!Y zWJy7@q8EZuaN8^gVha2*X#`{>SQ94Y{Su-H8yakcz`U5$*(sz%;QZK>S$U{bOx+%?+}28p#D=|W1H?~OoW5(>KRar&Ad?@y>b$51|;LVQwYEhxq} zIfie@F2^Xru4;~r;^%~0h>8HZT*J)dfvhik`E-t<(`UV;jdb@?NL^QsDYg=P!{XKz z8GOy_qmHA~7j@idCasJFbk`_S;XVa6p?&kPxsOBt3@!UoGW0Q|UkAhS595PRQZ{Y5 gDwrMD?=yIR^wwstmmR7CW`~}{*N`zBK5yi|0i_S!-~a#s diff --git a/Content/Buildings/-Shared/MI_ArrowFont.uasset b/Content/Buildings/-Shared/MI_ArrowFont.uasset new file mode 100644 index 0000000000000000000000000000000000000000..66f829346edd58649a732f552c206c1903f3be46 GIT binary patch literal 16218 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 delta 5224 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 diff --git a/Content/Buildings/-Shared/M_ArrowFont.uasset b/Content/Buildings/-Shared/M_ArrowFont.uasset new file mode 100644 index 0000000000000000000000000000000000000000..9892fd24d23fb51688e9833fbee3f2810dad06bd GIT binary patch literal 28343 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 literal 0 HcmV?d00001 diff --git a/Content/Buildings/-Shared/M_ArrowMaterial.uasset b/Content/Buildings/-Shared/M_ArrowMaterial.uasset index 79b0a55dfe7befb6b05a384545c635e2b5c44e7d..56c9f8f43e98944cdd29cfeed65e6a26e339857d 100644 GIT binary patch delta 4314 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 delta 2589 zcmY*b3s@7!8r=lpYQjTgr5aH|1+obN15qM^L?k>yg6u}IMMRB)323YG5Y*cR0jXO+ zBmr>+rGXHlfUls%dKE>`BD5rcrS(xCRRIy-_=5IMqWAXR{l1w!GyCnH^Phj_-#M@` zdv#IQICvHWDSPSjl{Cs)c$zZ=UET8`Wzj%#Sj9=m{|MCIuEZ&8W(9)>OTD1~yZ!=~ z>Fo_*R_b+%LVapOg=Z-#Y=+W$Vlef@Y%|;lAnLA+o5)ah062+hh9368)b5WkA3zmi zo*e>kIm-;ilY*)5KEgTx%RS7q)(-wOH_As9H#z31jSj(7s+aPlLmYL9mzmK6uB9%a zpSlijq2eUL6+*B|A4QerV+O$lAqR$3e}j7}m$fD1#w^)=k{es}CCoFb!ik0v1>W?Y zIIOVk-&LcL}t#9&XRB2MX>!-f2&_8agsR(->!c?F3 zwZ{H-%^Q>-siT~ye`v(Rh3C_7g7ustkUx~gDRzB|pZg)2mf|@nz z(xymfSg+FOn7Z*yH37vi)tNM=y2#{+r3IcbK=V+Y0_u#oN83Pu0_7&wFyF~Hvtli|91d%to&_M)b(X+dDFm|fhs^dw&B zAzXbtkA{XJNk#V@RT$Rgtf^KP<$^BLkziH^8N!7S=Tldrq$QL(u*N?cqV9WARVcMZg6eMs61s1rn^2<@oxw$hQ+j+wK=%TQ9 z#mr_cO|GTkcl_J<7$MiddmKxPiJ<91R~XWxCQ6eR0GRxMz?aOPAf_;?ohL5tSI8^l zC(M3vvmtpv+!}i*U|?TQ%8}Fo?6CjNpQ8&R(;t5?BbfD)D<%!L5;4p5F-F|0XSd%f zv<^PTPIE#ok%(|jGHwg&e~StJHX=MCj0yyd<8Vv@fDKd-xC>qA%7M%(OiIixTtGSE z?RJIbmv*!_?rysEq7p+;bjc4De8r2OZngJdhE+}06=^Ki@a52A35>>( z0qg5PA}ixF+MIlkHO?Z*Wxr3gsQqL4`ou@N>0fT`Ej;69b;u^z#-DMqszNPLEUvML zw5qw>m!?ptRoI+V&iv9MIvKNxL!B<1UkY+A(Nvp*_LO&mMK)wiC?;?y)ztitRQ9y{ z21oi|&64;t8VVj?e5G5mf*m?7xEYv|rL{n19$_|oMm}RRuTGNpa6hkEksKC1os8{H z4pEFx<@oaOCa?~ayo4g#D&9@w!z?=K6HfXF{&NGW3?%iEF+s^Q_6+edNfEPQaPxyb z{l>gGL12H`2wP2cj;SuqL~dSQ{BoJY*wg2=y+?y;C6vtJxOIV=c>Zgyjy{-|9cfh= zt+R->aeCrlAp)-P83*lUQMe)*%@*0P9b^I%iXelIj~cVZot_HIyoCL{4j{?4b85}Q zd?V#opwK`lb!!LEJ`il@1R zfqh+?NeiM(ne9BHQD^!*%4y!_#XUTlR#qQ_FUOL^JG);0%>Hw7`FDNoQRiDMq%F(i zzpi}kWRF?Z#fqK6Td-^tWLACoa}^^hajs&qMz%4Wq|^X?b!`;v&N;Yy{-#5XP9|5HjU-;KDq!V#rxro#-bUoowuLi=##g$ z*o-~6)4Sp1zOC!lv~)d7^0n|4TS&8)r%ej2=x?^wI(?lof%5c=?+@_3e;QoX8ymn6 zSc>>p-_UJahEE&VW@z`sHuZd2yR&(rvEfZyuY17rE002%TTe%vCF9CZ4`-y&hZfB9 z4%T%m2NQee%XPj@w5q0otii;T0;zVjG*aD|4@>S_+JpU7cN`QfQ_(UtiX7PO0L#Fr zb&45c#*ZZq{4q1Fr7`n%uKP;3G39Ef9|7h378LHveKiOBXYtHo{C=BOT~bu{&7x~| zZvvm+7je}8a0&F5NQ91y*K<+n!eyS@@5m}52(DO$MgS(JrgaK9QS67yfQ8%;K))ZB zWll03Zg6FX8=E?Q)~R=HSE&=*_9Q*Ge=ig??e;l02X8*7G$2X#?$%l9jb*2Vb?@yD sk+ufsK;=b;&y-8q<4 Date: Fri, 1 Nov 2024 01:02:56 +0100 Subject: [PATCH 03/33] fix: remove logging output --- .../BP_ModuleHoloWithCompass_def.uasset | Bin 89593 -> 80717 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Content/Buildings/-Shared/BP_ModuleHoloWithCompass_def.uasset b/Content/Buildings/-Shared/BP_ModuleHoloWithCompass_def.uasset index 841ace0afd202e7421095c33a6605d6078a04ea2..e57ad9038e8623c6ba08502bdeb8df539b832b8a 100644 GIT binary patch literal 80717 zcmeHw31Ae(^7kxqD2gI-h!^2dKp-c91W?JHKu7`!$f1T!GD#LT*|56-f{IZQQ9OAd ziWlO2pr|PL6amlYec$(c9?$!}55D?!cg@W1&Tb|lpzr_Lusb`|)zwwiRn^r!z1i)j zA9=-3J9g}ty@#fC?VxF2)0O^f`_SvkJM7wM8yd#h3NU$l#zdj?sAi2lF84EWr|9Er5 zo&;NZ;GwgZ6j$By_6xmldil{$y7>rp>PshkZq6wF@UzJiZW?m;ru*j;Y`{xpm)&1{ z#0|M!`mcQUw2kiJ1baXE)eYT>&+4~n@iVuqoACRnt^_+K_}eqh*&DLn>3QKl0&$1- zIhl1Qq-#R1r!r6wEYgDueEzwCgv>^dx5`sr6G#|QTI=@fRSB6T z<&%6>jb1(9=k*=y3D#!$>KfdEKzWs3O$0h>-CUYhM(U*h+G_`ET7SBxq-A8~q$ZCX znVyxAF)BTMWa{YD)R7r!Ng27>IoVmsgd)okba{~8vgtbT5E_qEO(S|*ztNgDm|j`* zy8qhgGmjWNqG038FI4_GXTsoL`uuarzYmC;aMOs@jRj}<#sMF6z(^+=(GFTB-Cs;YAgeb~}kIwx9AGT1ReaC{TS;%a5KxfYp=uk^tJLoX& zvro1|cNyBYy6kr`I2n~epTE#up?kIK`}oWE1<3DrH`H`GB_v%59 zuU^~n^}e6>0+@!jj#^|kR#bTP5>I`-UZu^8KfJJaMCCM3z(Y9NyH}?C1iRV^#;GEKA6|&snVY5a?sSiR;cK!-tC+ZSJbQp^Ef?eS6+$m($13$UIncTlhK zksvZkBQPcP7ZUL71{6QK8t>^xSJ>3~_XhjPySa>1sD%D+JJKRvz z8MgN6!T-5Rw4h1HuibK?UV~Xx#V76YzV}@TFHlp_Bt1~8ZSTBd2!fb`l{Sj7Q(Rpg z(1TjH9S01+G-_J-r5A4MgHUKdByUN7{4f>HZGg-4x&|)^t-W~DfCmJhR%_HYZJD!P z5H2ptE-xbI(Kh~=JQTq%+!VF%=U@E2BuzGIwK{F=IoID0$I8}j?mWLc1ck#-)SI+! zTN`JAJnp5*=lu7iD+PwM8tv2_zN68dvZ6e{yP>woS4DjM`@{K`iqcBGUZ3Lg1-1Lm zxuO#krCJyjqScs^EgxW5Ri*5+`y=0_VDPJG!l;2Re*AUK`4Y<;beHOtzWSsa+KFr8D6pj%ZMge2P!FM11;hy;SRzs?PGC53j|9}B;M1UdCJ9vazEH2!PWt4xgJ3SW zX(V|)tKYvV9(3gW)C%2S1CuF_IcND3_N{|AR(pN!pw_eL@+aX5xwtcU{`LB|e}^Es zeve*X<(1>V$HR~B4eiO$sXc$y)IGs5<_suV$Pv)8hYmRkN@cJq%e6Cq>xBk+WW0VF zFBw<0rF%{<0|z0|Rx9`*cs*uT+rX-QecHa8&?Y20YM&gQR18fEPDEO#M-$(F0oViT~XOBKaN~h5*HKZQ1gMuJAF7K^YN6yK=+V zkHY3GmCD*ww5mO~`CF*Fpq{2O?ex=UUkmRmsFy)Q>oIWcZ&-K0d|vFau@_WFh%(PI z#v`!q)D+1A)lgQ%*@p1Tqjq%t9p*&Mj0V@fFlvJAmGTPhxuut115=%tTwbaNF-2$} z4?laqK>`HhFVAkOch`9;F-eqL647#zh_2a`Q8uDwT$z!n1%`IdxQBD*Ri^~fm20W6^Hb6AIGF-?Ze!CJz~_lIFr zCb=7oQAu5S>ZurqNqQamsxZnQrp)VNg2Z^9)9=o^;d~NH<^794K6#wzMl>~@YVqCo z90O0_%u=i^v?zoRDJc7urRO8YO7Ik&rbo|wU4-9; z0n6QR5LLzMS}?ZgY&ggy@(oWR;^+-E$GicC!M!2tY2WNQK>+myY^?$9n(My46H0+e z&^TiX&}I)R{}wI*m{7@cw{*Oj0VTe`bnW3;%Q{#9GcdSp;oqT+!~k!4@IumT@%pW@EvxC6$(`cw0|z>^e^a+Rv=z&+G97yBbH6k zD|IpgAyB4HQzaHhUU!4`@%QuY#Z0XbL|qA`2imD8S3C|jRYjSna;`RU@^4Q|WNA}| zPcAFzHQZWZIO4tcy)_gz&Q@4T8qrg-wMTMNZ$b2%qBnRw(y`4L#%e?Q-dhDAA_h29v7bg3{BoJ@>o{CQ9A&^{QzeeSwPO zC;jWQYy&>i=c~)8Bfko2<-N~+3|3THS*zE%wH@~^UjT&$X!)jlkQs z`p}r*Ca4scQz*~S{aIp#u)_7$KtZlnrpAjrSJIn2i!m;O(o=m0qvlH>rw=mCeu+P4NgyJ zIL?cih;}20$A}@Dbmwdh@knOa>k^Z00B@u(5zm$+J=6@@S$_g}^F@na2WJd4Bl@?? zv%9J0VmkQaq|Qm|UW`lL;KHsLP_<82=$5HAv-5W&v4O=DL#row0+rhQoaG{W zXOz-Oh1#8m9?$_HjbT&k5m0lgwBa3B?}@>Xlf#H-2F`$gX3RC?&v*N+`w`QrA-2{t zJ*Au2HZpd|LKEhpmo|(5k46i!9WQM+P%cyGsqnjLL4Vmr9q#J~lo*>=Q&#-?3!!0=9(-VEBt?xxHWu>-B$FfQ*Rh+-g3^aSc?UxZeF zEK2r`b3P5BBT;1f%t&{ynY-E!N$e3CNJI8XwCN1dhfy-(CpKV{M)6}Tr_1wlipr;D zOex67EX>hvUA!b89;ueNT1Vf;<1zZ`Ud{yN6O*;g+b`~hWI&{*Vusd^zt(j;K)HEP z07afUEpO4K6AhhI46Bu??7eZ9 zY(%)=<(cOH=AN^V09vveUM}DC$*kUBL8a%s-6WFcA6H-VAA;Gh>_NnfEGAo=D`p|0hwj7;MOjEq0^D@ zeN{=@MgfZ8TK2o?);>7AA`ctoU$N5CJy+3+Nb^6veukdyMctl}$qW4W|dZ?;PTN?-1_?hj>3a#QVu1-p>y4esPHR zs{_1$k^XpWVvPszzHvyegL-n<61^1;=simPzUdI}ZHIX8IK=zJA>MBe@qTxR_lHBg z9S-q2I~Wh>c`t`}w>j*09|!avp?*JiK<{C~`@#XU_p*X<41gbf5Ce~60PsGHfyXfbcpt^U;}`(E z|Hi;`DVuwe@b<8=Kb}`RsydK*&W4^H-t!LeIJdB~Q)|C3I;6+Ev_y}`s3p8t9QOOF zLp=8BmipyfswKQPZ2D!{IL0GiyTJyJb+xA&U(DxEIKYElc^u+hYJ~pug;vICEHbeQ|j{fHaM9g8__tXb03NBL(Kf9M}?XR)u<2awS{72m+(RGt*xNM6R zBl>4M{y($uj_t6|RCBDMIK~{aH9AdejT8D0S?I4rQi=ZAj{Y|m{-LXxsyS4% z8G}sa^KIhN;#)NOFQ`61f0d#F`adiEU;AW>qy>T<{a-Eo!yK{p!8kzwU*Q9lE1s6u zmfoGxhgv}YE@fQj@x;(V2Tti@l`QyI^s_ivwG(~p6M_E8%70ThFt-!^{S^J}ivJC~ z5NRj+-NWe5`*#b3Rkc(7gKg;NVG&R@EtwOO7P@gtA8H5vdz5~DQ_0 zKg&5miA9|1oYH6iDpd5J*jG&i?L?o)w*rnprOyFvr~jix|9A$2y(`xL1&VCbL2al1 zgM~iE_h)*s{x4Mav)3VQr~iEzeV97yr?0Y~HT~O{KJ*0pWcqgwYG3*s-+qUps608i z?exD3)6cI&57fZ_!%F{;9ocsJUt8!CNv)G21=b%>_IX~SNgtogJG3whkuqWdLqD>> zFq|K&ilKBpQhhE-i$+l)s7p)qVK+A@T&yoJ52Gxyq0c??6?k^^-?H!zogkE<4fKzv zoG548(3dr#?{@S*w9r4C(6Oh-^m$spXea1@V4)BFV=s{DV+>GEN(ZFnV#h!Bceo|= z&r>b*A5>(o4Wkb*_sCb!u%i#Swe+SNyzs;X`)GaXbtt{|r&kYp;i(J8{Q!C$OfTdD zn6I%eMBaA@y^tSc?2yMI*X&2H!{`NG4x$$qj5oK3Y@qW8F$oyxL7$-Y48cGf?g+Zi z(LMNL`e=*KfTJG#0fxRA27Unp9nfYz0R#TC)D|=#A7GFdd_#7~4H&LZ6CPwiJz$`V zw&)9O!6UAKfi7qO2XOQYzM(hp0ePVl=o?q)99QTavI7@wAQS5jaI^;;w4p=D0($t& zV+B0$37+v8{R1Cu!8>>ad}j;#gdE00f5AblBLmv7(NaXCN!VFluo;U0ojDjyBp$s> z^3GDnY9dt0=PKj@k9ebdF+LbS10s&d2uMlUjFKFBGD&B^y#mj`F^|`Q4GeJsJ%RMo ziDaWDAT&H=s2E_X_3AjQs8<E0{bRy4MA_^uY zr;Qw)l$a*!3Ih1jhxj5JGOS#;m%iVJc{10Ni5e}R9t!P2kplmI)%uI;_3Bz`+Nc$26$G!)Y6%*k7W=4Hlj*L3@BnQj+-fb@ zVr>W2c4v9$tmqUIU-i_pi_XnSsZ0p#VSiQQqJd+{%};wP*i@oYPtx?)@TrL;a#3`b z_&dujx1UP-Y9ReWTl0u^GtHfgbuq^>3I z0@@;~YpK4AYR??n>vm6t6(s7?nraEc(4Ccm+fN|7%Ov^%k^;Q91n2sl)gAgRC9T!a zD?l%wRz>fo?xNLqRa)6uKG+tfX_bNl(+5llTesQQzN+^^8u_5`okp#UIQI~ZdeWea zW^ZXx`9h=fs3u3?&Lhi(hS|erYq{D2A$Ox@;+pXxcCE?L&RK8{aS$Z_VPErvXEo4B zn4{2Ay~zjbDl!7PC_j`sDJBmwWexXdw(Oy#BXCho>n|5g?y{}fQ`;nFp95`ONbS<> zVEd{5WUuf{vuEb8P)iX!f{xvY%{E5aMX8IVWR7Ql?IbOaW(in4Vi{y*t5{6f99>!R zXt*xQNtsI*&5ZK%G_8azdMh`vWnTEBPDew@v#tMIg7tRrunMI#!>9bFptZdgs z)2Qslu8v39)ED>By6DP%WQ$&dWS^`Zvwyofj;4GyHEI3CTD6X$)fZiqeMlL1Rt}C- zY;pNC=5xsQT$Jz29wKWFP&Kh-7@)B7w2|5vEs0(uwPgCPYbyQArRyjyo$m7}u8*Ym zY_fth%1lxOX0o_TBAn4grKh5_v$AqlV~vI8sKu^j%Z)8Fk4i3S(2OD0{$^_!Q`6&i zRwj-P`DBNSC^~wGwjHdG(qU}=8O!7ylFT6=h3_R;W`o%@cB3hWGJSMsCE=K6N>WDs zE+VY{B}q?X@hM9I;aF*a)s4w17?P^}4@IYA3vw1{ZAXvd~~Y>Tr)nc-u;jD+-4eZ|%w z*On09jU*Y~`;*Mo#5d+wxpr`AaqYx8&u{3VhN#b{ej2r7h0d`uH8ZN{82ued#Lhi+59Xq@JAM4pO+WM})^MnWEe%nvpUocgUvPA(gU-Wcr89B89HVI!02C zkts5bk@ODyEV@skRyowy;g0&_nWBU&6f39zd4?&Ci~awb3WV%N#ole$|*C_g& zLjQ1=MV6mN{S0%|ALm+f7HA}Y?l1DNDw^#ucVfO7t|;+7oaW-l$*aC3k&n3Ol%f+E zSvS~g!JO&R;#Ir$@{lr`Ybr@Y(RRb4)pM2=dyF{qt|8tVL?15NMrP}m*T43B5nDc9 zAC!;<^cQ={H6&+1>?-jtL4R!;MSfjr*hMzyWaQbpN0L=%lO^W}`$kkxr?@_v?#2*2 zg=&)M9{DY7I+g4@nQULKCe!K8MfXnnGuQ9PMCS>c#{M2w8Caj;Uu<3QY!y2i@=h~$ z5#cqMKV8IWlt{Bh7-PdCXze0^Tp1JOK7fTnR!(dTV}}} zBsO`&I=*H49COM@SI8gmcTn2E>9KlHGxLDm?$>V3IG=D zC0G&FVV^O9ENlYR7Ez5Zw2Kw!BC5j5jNzOR`ezuT3KQSZA>3xX7ZVY?1Ml z<6ja*(*9)q^4&%IVNSHc>$h-iz!DK_L-*qnC=-`EbEtJ`;~e#2FJme7fVsnz@u;XW zveX#6qaF3hvkX>Z@Z4h@wPGvI7vmo-j@fzXct`YkzskA_m@QT}$eDN*DtmX)-~V(n zf*c>mh&{4Qde5d;x|r>=Dd)V)l zz!xiM4Dqzre3CXm8$eM{VnU`o#YJqn1}dz`=PB5+gRFS!#1@ZvK^JqNkF2waqC0j) zs^|sZ&3Duz?;Jp$da+j%5b+pMOvZo$M|60_WTk_BTKTlwMe*Osxbl2#rDEPTj_BI)X727!azuk8GGazit6ISKi(AzKK3dYM7O>OFj#{wQREiZ$9r+ye z3VY#m08<>%VV|m`Kax{H`2f~NI7NZkQm!a;qEo79NejYzF9ivmXQMy&;=LDV+2dI8 zOkuW=t^r5`h@+F6Xkyefwy0*>uIp&dv`U9}usQo#8pZ z8M`<>T5J1T>Ss982loLBinPy}j%e_D1v6HF<}CRnXqKb4ydJmiEFb5nCGSL-5#o5& zuI*lZxT0XSME3AWGy;_*A7oraS-p%;3xw9plQlSvz%9&Yz<`?G-Cr9@k-%(&-K7&8 z$;_S!9~(&{hKw&+aGGe5bb+fwE?+Yu+6pE=RG+Yv?HU%;%6eKT`BTr|c`VhPV#$PpVUE(HW7 zt0h+|I&HVefr^6FBCWjITcw=q;LngszMIcJGS#{ryB#i?7oEsD!r;R^voc%w0G<-! zX_OhGGAU9A$>NbWn$Rq|^C|Bs5&H)4CHdUiB{%^evFAIsf9#W{&|Hv4HVu1Dr8tdq z3z&U4nq!X&J5TTc)XQj&D4#_AR6CM-KZPZ&&R(lE3TF>>HFsDUf=G-^9{(6-Vs%tC z{pmZuE^#_QV)8rB@lG?7BNV;XSq$PBJOSBBLzp)(2QrFTtq+k*w!$+=?3^K%%~2dU z8_QIRQphk6!*XfF5XX>b;Av4NeI7&CB*Ga@5S%{2%siT2*i#%s?=Cu}By|(r?HJKIm*j)gS;CHyO{I~Pi0O#l(1U!6hP?!2S~A8X zs$w6t-cf(78QxC`-Q_By5j#%1WsIVqRk))$(Y{w`W zp$~c52wK3*hLc9{W#|d|$r7H7Sq=H9iz14X{@9~smSWX|sRh3yO0C_ovp(5#k*7G} zmb0VjG(z+jibZq?I%>(*SwN#QhkVmRtzF`Ue%T)E_d>XqttE@%JD-~{^KlnJoyfo= zJeo!fwmgPLFNdypGLT1~arz89MA#k6rGLm)utNs>&ZB#d3NFfjo%F{eEV(y%w{pJF z5hY%igzw4bk&WY2B=%kx(XNO*{f@OszE(g`JXxxxI>24x1XjyB=aH_W)>yY{B6BA<7nPaeNKFrF!zaD$=s-)ulB%qRAsB&vYU_V$OiaVP?U49{H2Z z*kz2(C5(~OPZ~*t7v>$ztfxBakN3x-ok?W=%@c{IIikxeTy772SBOZ2XHG8dbVpP; z5{6pL5=U)$)q#xGZnXQ8CNVY`?=u`xJVIeb#uSXS{ZlWyr(I^hOC9ygHX%>gV1EX_ zn@ctUKSmTrY(~z-{w+@~4=2t{&WN0q!%vSY>J*0H{hwNNtd59RY$8^!7+&uzq zL=WUQGSfpu$)moOss5y&;+^wRrx~%`s^0pvFnkS#?^=0jOaaI40wQ^xWmV5s!FYI1 zXvH*F`Y!FPR%r`smQkc{WWC6HF-Ky)#O@pR+pylj3I`b@*7e8{vGTzuv!}BjZHIsK(+aUwUCOgR{3RuVG5oPp%OaW^G%r1D|%w9g0ya*$P?;*Ifa}>8G z|E;whe#&NDO+jnO#lr0-i+aT~6>r$nS>7iw>-&dcoU8ccak03rbeuiHDO8uX!ckjZ&tvWWk5;w7{^&~8qV4v{*`E{p%%d0< zAPMn}A@kXT34>Kb@>Pl}XV!=;9T5mtCi6o0F-`*^gU3D%A{TZf5eKpf8@YZe!O}pWQml5=mOTf#DxOiGcSIRn<(d)^2Qe#`-XTjK`3auL;~(bCJRyZkyVy~G z?D5v;Iyl2*M%GIl(Xr1C!=F*hUR>H5M>I`cU?i~4!r3iEU%7*f6T65da+QtqxX9tL z?nVSh%*FXGjN7G-`r}oU)k32^-3gb>e7bX)qrMUpR;+JYV85F8s&O?>DoEKz(defU zG}_ah%N=pjRbgSoLr4A!NA1~ycnuy&=SoL(c(gOc7>_2&FxO%x#oj1J8qc_p`^mG} z7;j#Er_d+N)p%y$($=c}cJ`?j@4JUT$qN$wSanxL^v^o7T9);jT;}<4a|W}2qAPc@ z@m&$@m&6{aRC!Gnx~>e@InISc z;zdOB8b@^5o)9gul0+;|6ZV9Y%*aP^ejl}1bz%mWe*_z$@`J&K2_b1Qum|9eYNJMj50t{qfMHCC2A*Y$BX-PaUV)QN%RVA#5dUo zMnd+Am>~)Cmmq;41wKzOvWSGBLbfG=S8k_F%G(w@Yk?+WsSZDL7u=JRPB@AmR z#`{~tW5~bl?LS<*tjSno2OVSVkO#81q2soU=Saf}V~;2HK>r@kmNgtYo_Hp}V`cg{ z`yTrb_6sByRumiw*b-Xnq4;J4j}%k0i-DN&7;jg3D9eRe6mo?|`2U3n7(SltXRY(k zRKv?+k7j6Z$Y&$1M?!dHkpVLfM+2+}B`kVxNfD79>s_W~+G=QTDTZyCu?H)zmU_cX zA1)i)x2Z|wU7`KiOUHH_T{^q|B1dkNF)FN0JWX&SOXR$W-2vIsjHB35WSHc20Obj+ zWt^awzHXO!APbdkV`m=NnPfcfgL|;|I^?gig{gUN!FsSCXU>me>s@Aa*#Cue$QZGo z!k<7 z>;W2%Mord9djn0W8+$sk&cwCT5c4DJOk7igrZyQ@)&W;S(v*(vxZt`_{o^EFG#R@B)} zFy|Z}VL5oFB3qh~)6R0RpTl_4;_cULPAvyd=_Ebu>q*EKXU4 z>j$mamN*76R%>)Gqqy`Oj&E!kJ44sWn6`~y9!=8*p$qnxo#7dKUEz9en=T@)5Iiz1 z(+=%?ADHZiyW0+VMC|PloJD$S+cV4X$QwzUHP*UO-C6Ckh5fC4=?(3nefBKV_Oa7x z##uExWf?E4^C=HjkP8MGnMwH+t$1ZT=BgH;zjr-;k zBy099S0*j{6trS`0V0)rLdV*}H!~P!<}*CMm{_pC@LgK2H6si|nC4$A#zPnENA1ls zW&zW0qpc0>ET*j%D$lk^e~l###u9d7MiaDTPmdkHBIAkE-5m76^J4o%lfU zN5wq-V#aWM;s|A3Cz~f;Vvh^jbCil5#evCjDKd`R`vz0C#uPcXbL2EvORb5KyNWJr zGCIE;CEJ%)F5lITBb3B;x#Bj;s= zEPUd`t~J-S_h}Sp5gG~I54Agw1x#l%Eil;=+dp=+moNV9HGg}J^~9a@{%B{oq_tp2 z6T801SS19uF8w<6v*vd)Rsrxg;%kyIF6Zs|00kW!))~@e6INUMhKr zwjwjnQpWbjSSzw!J(HU{wbQcP*<#(x-%^%8N1NrN-~X+rANZBO5t|}@V%hky*Ra|| z@r%J3l|i3>k{)#9=Uc^3ztT60%%Aaf_LI2c_k%+yX*&H{bY=#Xg8XUK$JY5LPfe&B zotryxp2w3M9G#kss^Ef|la5WOoj9Xu%7XbxjTtFb*-48g`=}->FE2BxrZy*iuD@t> zS?)alu?vU!iYgXRRn7#xF1WMWCjEuQFpehqxr{q!+@gm{v#s?n>9-z9GGm#Fc>*Ajn< z?o~g_9IPdv{2An3{Y%ZUelywWPkM*=&fi}6zvqS7WNe)_{J7)SWA1wgzl=`NPZa#- zJ<3XXp+Ji{2KUe(OMo(6%VM&J=7Jy*Nwv6 z2xh@(xd3b8C*$$a77@SueRde)E#QI5UGgHuXCwwLP)NNQDg64F0-U9;+`YD00Ul9T zrpPL(R`7_+V@0Vmzn*tb!PdEl{IaG?@tDWM2;``H{5-sExkEw2N6J8sT47*llpV=( zr@A62h|-nb%k;X2xH5fVkd_^?+^eqf>MDn!8{JLx1nTr)X=SZm=N8axz1rRA4TgNa zOf`E@T@5XEQbu{5s)$fC%W|zkK;T7T3X|lmM(LX@r>iR)Rq+X$jpr)IXKCpN_%!bfw zSZ^R3GfHn)9Y=8Ag(@yrm5bFiPF>kXnLPo9#yMn$M?fn(m{nk&@Naa2&rE0=eMWI< zaq6nkZ;(@ollP|kX!jEtb};T1&AArm*RuQL7ZdMr|kn zV{{O`+L75S5)Qo6KkcqbX9TBq8GGerTdmAmKZAJ`=#X>TQUNiuXRrt7H25{go||ln z(nNvjVsy%h)gYTD?6tDWXkzUJ<_d;Tm@#>WccTgOxTxNCtGD>SZLGi zD}tf-W>IG}+e*#2w-ZHGD1%XYd&kmSlT9R4pc4C7?etU#f%b4RK} zA($HECUL5!6;1j(Z^E)1Zqo#^n8i@IwTVM(;Mj%~1jQ;#cL`GOMlaST;k`s@lB8%L z6>-7przmBAz=#V{7x28Y`8*Miv& zao&VO<&ic`qJ+w?NMZk?%&kahtyDF{#B#!Zkcb1dm}K8XdGaK)rpavQP zLK`zlfd)2EK&`j5jLiZd7Yi;}h7}M&d!`uML8^_RX)B=iWs*CBQtuP`3K%EMSpION z0JTG2;_OHgb=OmVC!y(eZs2Lz_xHIy@6K0kRzBwL)%R^oy^1UT|Fx{g7Ui&GJ51*8FOae$q}e=gvaIJD*l9)9QeSKXvSd;0A*3uVG%eH04tSU z(?8fVc#H^sR;FimhEoW$=6Gu~v;t~hp%EDB>NloR_xs0a{YH(<9+{Gol}VSJQn5DsitaC>ziHi!3NwM&O1*M6ut8LXHjC2RJJgIb>oaVc zVJ^E!!7aU6bKNs-nsu~q<|i;Vp-z~2LKS3MKra+yG+9sJR$wd?^%5f=O;{xc1}F9g z4VK=(h?px`Py>V0b%O@W1dN#{?7iGuB)^VDZfos3GXEzePv%x!md zA9XSQ?27SoyMOyl&S@uqk>2y@KU~ZL+99H$>_xARUwrn>9;I_~S0DJsp;hNSkY)#4 zFR;}PJ4Rt*a*?k}7Y0-2_Sfh^>qinrcpm++ZCSYM|8RwZn{LAZ2Ukg2A;J{#idG=Z z25s$&i|+rZ`1;_ayPnOAKh6$zy@i12fMswcsv4F7D+CL&#Ti4O@+KN8;kQJH(;<+bPja?VybsE~_sBsudvy1maOQJfpQ;czY8h7dHc8s7D$i0^ z!{jR!fYlP!u!~8AsD|CWErvb)x%eHy!B0(G{@KMZrCycThgkqeNET3_({WR~xNj&s zB>Sv;R*iV%_SbK;gSC@kLsg<*ezWq#uxQsmRO1i|7LRCs3@?zyFq{8Or8Pzz1LbSnWhk!7*d%paB^kI)>-lCneP5=1PDm&Q2 zmJUS+)S2w)9#s>S)uWqteqyrjAZc9hs4ql#!dA zlbw}(yw;!4TFm8<9jL^g`-!F&u7?WNT>8q3$8{W$f6i^&r_B8H=L_v%(fxgws6}X; zhYst;D&e@d3otP~mH?^rdUuu(+y_rzHKo=E=L z>g@BW_YbZw*fAt;OZn%|F8g-lIA#ItU`2)k{XCv|MCsT1s!3Z)4%pn`h*R?HVD04Z zP?hMH->f__EZX%s)i{Jgw83YifiO28@l)f~M?F$>_K6c;DJ;EYh#gF%d#Y#A0d*!j z+Nhw+Di(YpEOJE%Fzg0NTjKCI{1@w7{>*5CBJ+$j%rQS!jsNDugNwJkw=wWt!Fw%c zqaXyi&L7=7Zs64E*>_|=dhEmFuB^3#Jq=`4LS%Jap`iI(9e#BpD;ctu7@sJf#^K5( zM8<9e{r=Po=Uwt%Veyr}&F=EcUIRY_VzlvOB9LcsVcL!?=#;^NtVBi@)ZWilpCo=ZGD0|hhi$5&5b3vhYinqg$kTD$g z?4KwjcO6R>@Qf0<7N0HP<`I&%uaIH}-xE|fY_(B?Z!^WisL58Fg75TkkM`?+!BN?_ zJkT#O>y;Q{<%h|=ZA<^%AABK9 zxRcw#IPgKv5NFkPUqFJfh6hjZ6U)F+4|&cyZ|##go30;!tEXe-B_Ex%&<++obE*d! zDpnJb5cM9l!h(hEq(rf)lxRRh0&aH#e|h4!*T2+j^`sT~vo8GLsTXGhGnRb+M;y4J zE!oq?%;N^Xw(+LSbB|eFG`W1kz1Bfs2S$KD|G+bUUGdTn6ITvAddqp8D<80ft%sti z{LeWsgbAO)>|lQt2M*5+p!8SONu@eRiyQ_T9F) z>Dz~F>eTVOJF+*P+UxhMZ|1+qEPw+fq9|B6u6X5;WqalxU3^7pLbsy(-rs5mn<22} zn=uV_ru(ir3-wA(o384ueOQ{rh~Obup*JBx8e3We8}9k>^^wm{ynW5<-S)Zl=9hpT zYm8A3Y4UFNotx;d8^6juYW%YU1`oA^Z2__>HWIpaorK)06G@)B>76rE*DlYv@gL0@ zAO4o-fh6Iu)`!%1q9PxZbj5cl;-={JRk}aU_@-lAam5_H67Xu>uh&=VTExQ>H~|YH zu2C%^1S|9=WWaHv@#_0uKJ0-t7v`UO-Q1sM=EcVW-HDpQ_d=kiaM;5jriwA(Jqa+) z?QPVhB8F5n#rgH>p_*p9hXYo)M3dKw!?=76k=Jfd35e0;#f-T-vXD<=g}1Rv6qY_} zcw0-s;yi^M5&OosCA__t^-=Cs#W!Z$QPug%D?Y28&Mcr4&O*A==gVB9inAA{jbDG= zs6~mL-uuuF)_Ru_qJ(ecLsg=J->f__EZX&1)i{Jgw83Yqf-vE!s~ya1>D4fH0jpOv zQCW>zVIkRKirtNn!$$ z+Lc=GIwtn23->>YOJzHc)NV2ASs==7;yZv5w? zeWs4z)NytH<2MW%W(R90gNLfny-}<@8NetXo^DIN0AapQzxbCK!RL!_dEms7e-6F) z5<6I(rPI)S;SN<3mDQ*f7Lwr~L*~=NsJ6$_Zl4cMI=Xn}m|=Nee)+{yXb{b?nHb~< zcL+OJ^jyI<$!GGo?zC)nK?Hy^^{4gz-1Jww?WgbpY6D zvHSDTgcJIFmaryg%YgVECGQ+qYzJ#6r``QYK7A4tsD)$%?cB zW&s>vQxOFUpMLhEy>4G~+{BxgmUO;r;T_xTV6FG+c%rO!yX2n&i7O5IJ@qwlg`Nt( z+u!71w`=#u0Eqt4sx9v74=yjdBI$fPSBfDm2N+Qoyg4Ztfh$wWwc6U$eC4tc^C(snR55wtO697H#nAu>wQ;)1?7cS8g1 zXyQ{wJ4uSJttBLZ=}tA_n-)NJBL5BN&A$A-CC?VGKXXyv<8n?L2KmEbwsA0<5U1$D zMt^;r+`#1F&WNkm7pQTLTTtt%tc~*o;(}xZmA?8)cTlgVKlbITkMmW>Wem&IT>-P6{)O`VDC;EA`WbDf7C$G)Aq}xl^U$OX?Gohbw z7|flEVIMf|o2Bfdos0kp2z`^!T10mYa3asNusH?tgu{+vf^-d$C%b*+v2-IoioPHO zirs_^cq}3B1_G6p@?uVa`08EM`DPpGHR{rDZCm!D)*g7p1)V+}kav3giP{yv{P?Kd ze1qpp{X3QRId4sE@ijAUd-J{L-d$w}vyQhh7(zadd{*j8aCwPZ5rP$Z6EX&UsqT#j zFN**5nT^?(CfB?_Dy=}w*0II_E_~$n2e(!yjJ1RP8GBJ|Uk4M9 zAG#V2ICAbD8Ea;GH&2_=Z83OvB3t-#LC6*k8wO&kgpAuR+-GCi@c1cwpA)P&kuCff zKV%DstpG7qLS&10OxONjqpoad3@Xdiwj9gj=*}`GGR}7jV zvbp{N5EXVS@qJzilJ8t$g|+lK#NS|(arf%)&g@m6xv9^qZx+lrRH)jCY@c-g_hU=W z++)&NYbu+5Up`|`$QBO6-;CiBDq9Z)jw(Xb3Z`ds6-AK16A|h0-Iium8F2!9t*T&QF!`ZiuCW#u{W%0#%G6aH7oyLT)x9<)tRj*G5&)FQ zn&q;>`1^Jo$Tjpi4Mru|R1gIz4JYTNOV{69=X#KkyNzbcQcu*zexPJO7X)M--h_HmPGmg zJboPf^7iff2ae8Pb@8i(U6v1hp0x?(a{M@uKHui9(Ow?BKL6@(#&<02d0d$`{kE^V+Z>y#}Dwk?NsmNL-)V9;QAZ4pWj^5 zyV(xL$u6{L#E-#rldXG$?zmE&_RXpSU30xYcQ9^9fOd|(`iKU- zN@L!}-tPPSTFucAHXOFW(t{x^hP|{N4{)mDO5F9jx2y3djpIt20zth_f*quC??7^E zi6*%fC;W2=1t-HC{%vJQ9u7Oh(u*NEQd{}Ao8t<7^qhv~mafz26u!@|MGUIrFJ4;* z6?-WBWozqaW=3$r4e+=+{LA7%bfSVzQ&Jx2@z&dUH@{FaYpZ|iVyGY-b|#3aVyFPK zvr@qnUr?%`pgySA=%j;sg&lPiqgAj-XphYk+wTS{;w{QITOsb^owA2iH!M@DAGt5u zBmTAZbIS^r9@>22>1R!QiV1-(D+Jq-f4DyGUH;-J8P{F&{(=APzHPD{?9Z5Hl>9A@ zNAzPA*r-N{-2cNjFHjUBe&E*uiEfd|V747O?56#!6j*5?sUNTD?9W$ z@cX^)1IUqV;g2sMTR5!sM`+OdZg{qYK@EQ%gr1`fDnAu~kZ*3>Hl*O}PYcf9v2FRF zq>s+GgFOXes)QJ9+b0($hwDyHF5ubSaq-gEt9Wde<|L0 zg3MC)r&)Lo`Pi)PBBG=?Z%36#A5bF0HAj)?@sn27QMbeKXNIOq(ve5@U~;XVbU%7% z+3U>-!zNvvHD=N~8>`ZoKXd})K(YIpqaBQ;7mY+@=uaPWl2S({k4i}&nUa~Bm6eiA z|1(qRR}(XHM&>4^Wu%LzLIw5JK7XA&+;6A)S z4-IeL{`?-#pEUmZ*H>pwdi$A$cCdB|U|7qCuwWgpkct>LArzts2>4&hF)pC&D5_(; zOSam+jj#-XI6@bB)}!R#F)Wz@*jwB+o}k-52P zqf>J;vs06@M`dJY(Vu!wNlHomi#W#qBxCp&tYBNw>;`ox&_lRm*unl!IK~novZl3u z#@MV{o}#Wi2X$BX)#@5?3IDyXotSdg?iItc+VuC6Cd_|%{mNxuWSll@|NWBR9Af*Y zlkL7kV+UgmK?5Rk8MDG2N-0*?4AE26iV&>O8_@+ve4KF!|1J{HTQYvgG3dUJCX5}j zDQEQ!gYJ0i(o+Z8!P?3A`7sVy6Q#|9Gl6IV0vTb)w9)wx5$ z`6nEheba`VJN}q`-R;)F;Pq-h(qs5~$qx2su2+%9hp#(fAJJ?BbtsS{{Oibeuq^^x zzU{!paO_>b7RRjCmgA0)Bm7*r9V}|lYM*a0KwH)#)Q53F!K1D4^Z0-}8MoiBSbKTz z8QUhTn>TXW@S@qrLAG$%Y7kRJbc}H;BmkZ5_j~mDx;(l+AAh3+NA_`!f4Z**ZVgJAoKKwT3D6f`8sY`1@pK|nkHb&i!xO5= z72>k|I+=eac}xT8F=(8|1b%|?!>aJ?5I#x;9~z5~6hr)`ydFr%Bl5X^dRyT0&rJ~H zLLzTfk_EykwOyiCNFzGOKr+LvA1~Sf(Rg@9(`OoWzx}D`Wlfq8EerfhFn-HbL3owiPW@}JyQ#5Wy8fM`6~-qKCf3C%P{1cMk<0_ z82r6t7Yl0jda^bW!i~pkaXymL>u!LJN%Iom;c>K!5~nY8*EM)`3aezAO>~@Wf!ixp zP>(N~#Zi#1p~q9g7Wc|U1L!Y6U%a9|eB#e&1>$Pm^Fg7)>yzrMWG{ez@C7)0^Upj47gyI92ufxu^7MKglSHwU zT_`3%9R=Zhh*h}OC?wX9wR_W%kk<>B$kgdOhKitJmCkKoJdM;Y9H8AdIDg*22v4wj zbv!{#uNFoLJEkM-G*kg$;ielK(6T{)R5mCA5qt2Ns=}J#WGPsL zAcLsFiuliHh)j4B@C#uYcx5$7{o{*Pl@9&Qb ztr;}_Y6W1{n9z-(h+%il)5Z%(^L%x!9)FEO2`3blqcxYH+;dF$6{|;-md$hf=|^6% h`iEtL~neo=GPh>;Ah9lkTopuU=KXs(STaznS0&@v~AnAxm`6ap^K({O=tSA?Ma`j&ibkMuajDq@A=o`Zy2#@d`1$%-fsDD#IS;E z-)ntwpDR9nYt)c^2{vKtvFX1|{Gj_+OSOAWTyWT--3V5G%p0>N7Nz!HG;7g)XMJ*C zb5DXTJ7B=vrKPpEz4KDvTV8$q(_Vgpo&3rP-dnRvKl*Iyq+5pHyWzoBf(?G9^702u z551|N$DozZpR(RFieMk4zP_$k=@|nzocP>rYbO0RE`eZ2g?@c*N#45Lcl%s$VbDFG z-ysCcIrg&G3yL=lz3H~zOWXR@z6+i|Z&>%iCpjy>+vAOtHQDzUBn~H7Lru?*XHFS1 zzxlw-r57A~Xx}{u_SGXqlg>#6-kM-hs6-Df^ath#lX6i`FXjiKo!Rb`gE$gbZ)619le(L$3`~7+8-}ZA)x@GjLmZCHK6MzpoU}QJy(JopJ-Jw@U zjvSkqmY6y^x1vInXxc5K*0>@|2vHpCK0fCQTzo}sK6(tOng^N9Ht6gP0zF|V+W|Vv z`0UfI&|S8+r7`b4bWV0n$RC*Esn&hkjr{^udjS*(c-qPW{$@Q8YSW6={oM;|%nlY5 zmB`+4=Xip;cHY4sKF|vVp^&Ghp^Q4PDWoNCyXgZokfZgVd`s!xbXA@0^Z6I%={`N= z^*3qTzTWGf`vXi}+ekHXTB@skdYQMWNw3uwBpx!QZ&cxQZ_rCP+SH*FCZNIUqF}DS zDHtkfX{ymOzhD0-*dt(3Q%Dcgd1~}rkI$!Fc-CWgLiWryGRyjn%z-|0%BFh)UJofTPY>1v zyv>5dN&6qV=K*1*#d^q-=Lvc8n?iv$?Zu0mmq3F#0o^lyx(-9peq8r^577q|y04CU zA*3$~Y1Qu^f9LLmSY6RlQ=*ykk4i>wfgR;)w@-g=I5dk+MJHBS*r}SS_3U!RmobZHX`2WBv^-|4zf}&s0=_gR(@aj{N-L@q7~}oY!q>GeTb-5 zRPEHdPe)qG5vst-)9XAfzEElPJnH?hD&yvUc>2NCD)o9u28Rmj+^PoMTi+1UCf(ZY zdKjtEci~tIy|tkRZNTft?SUc2Kq~gk*Qa>Nmp#5HMV;M0`4EJyTo3ub$Lph@k=y0y zmtbtUo{(PeC%gUe#FdZ2pcqi%Y1FlI$IaYx9}BR;9|%#WX?^xR_}T6RuYp#y(8AzW z+zILFZqWtsT5)HX=06Yo`!xcG#;AaH+XZ?(24NM>v?u#Na21?JjaXSKF{@-daJpv?Q;pgnUg~|6}S1#7Z*qFw51xZ@uJuNtz0*Myeft_Kgo3C02XX zj$E+!nefm&?bhzC`#=SV9Fz4nt=Hz3IcOO7(s%Ozar{*RL)w#e@;3jGU_{whVZhVe zP~xv84*&L1tEHf#MsL!~{r-^lz}Z*s1{JCrMuDg`zHHNn=x|ji+uY}|@6uovwKVe7 zLrXvYvidxU}5xvvo>5YIN3Su*j=@dPqts`buyjGMqK1Jk<*IiJRQA zpBuox3gbsTIB_P}nMetU3aVZ`sP&!vk1ZfF(M#PBq;W!9epYh=ywqZnMzqqdTKDzi zuv$x@vR4%e8_rqsE!17qM5C&9>Zxt7l-NisnhkM_c{E3Sj> zPfo3>&_klqC!@~Xd#C`xo2v5Knmmo(8jMF(mK3>4q{yo`WLJ)EA6MpzYU-nHoVsZQ zd~$MXR0BqWwXk>LKatib9N`{Srm8pAU3GO-vDrQ*_{I&I! z$uV%s{S<|O^XcjVC4Y+KqN2&u+^pA@d75ZSamS{+rXcT|Lh6xWk0WAG+wgwFC_TXr7exCEE$G&p-(brIs52cPAE3#lU3;KIX8&V&mUllOS1AXeX0f7F{` z7~C7Op7Kr4Ndl-ZWP1*3*WK{--B1dwgt{KXj5c>@)wggOz=TR(xUJi*3@GylXKIhm zS>DA0n56{@KG$LJs1npR{(hMcVL;>y-*tVo7kaOxr7^o!4oDtfQB!kED5#xs{nSNp zB{_^~`sB}Dxb=%vk#1LQgScvt}`mT<$ANvD}CL}HvF4UKO1sUAq~Xdx;8Ou?s3`6D9fJJ z8pE#Of|BDiy&GQ#6BV9Ty>_}+U#KGe@qhU&&w$VN`x~t;$~}RmKQf63~5_4kLV4-P*UunA<#><=)LddH4HR3 zcw~HN1M~^Za!OtFK(3h3tZ=-A)@ZHyXZ;M1 zW0Z>GDcaow_UnQe$gpWmh`{-^+Nf@;dZIJrXfpb_A+u05d%hX4zT11vj~IUqv9&&# zX}!dvn6dsBo`a9Lta)@;Ii)WY)$6Bts{b09D6kZIO4W!B5U?Z&u(cG40&bxWuKf~xq6pD%#-QBx-{wg~pv6RY` z?j62ovQ1+MV~moWIJp^%Q;HvBv7o9jzocq#ft&Ad^)Eu zSWt6?T(yoWGWZ`?UH9}TOBtn+ElBPuVF?EPHC}O<<830#E~Uo-9xMU(TfF#WG!;ER z(cbOT^(O>d>$F4*o;LeH2%><@vRF>gE_-RW!w^JNAuX2$X(-V0-pjPM!EqWH;JCnw zm6qnYh^A*+;Msk15Z0s3&$n*xZbApbFvG2G!>fsDma;Ho+fZAy(xhm$F>iX}Rfrts zq~O<|e_Mg1gNNNB8mTih;h9os`aFuR!R()sV|`V)2DOn9HEYdgG8EqI^X;Ju?@DeC+f(PJL0 z^dj*dCA=RT&;#B!hj`*KCE>Q$uFFO*cKmg5h}YF2UN?t$yE(+`?f~x*QXltCJiP$# zHwStKUN493UgCh>!$j{xhj<@5#QTRsyzd?2^>83BO?X z_0rD)y@yCIKRKYcmGJ)M0B;N7{p=9$7l(MiI>6gZ?Q+bF=SRTfm>Cc6LBi{8qrbl? zURXxR`(+&d*k?Z_JS5yW?Ao>BRZFzEc%Klx@ec7OIKcY{(L2=v-p7P@ghRX|9pL?) z=q+-9_cy|;bAb0A;a%nc?`^_6#R1-1gja8a_pX9*>_L3_Dh?jU9^ic)2ajV9@V<$I z$FT=^-^Rh)Q`zue2yZVNd**RZHM%jm-gs!AGL?~ zp2K$EcZkO^qP=!G*J}^&1DkePHXd7$Pu^~W$GX~2^)K>+mmT22t{NTUU1NjC{Pk7s zK2G%ZSJzf~8IQ**$nm=kyQk?L3g870d|{39;!)BJw-8*GH5aW=MgY# z8vh;^66qN5s668@=rV1F^1U7X&j^Uv#JK-d7nrnMt}6caB$wKsBBR8xcXG&&NVm*@8W#-jhcY6J9n3dkU$pt-vWoA zqmG?j-p2gvls@_y^b3`79s2i}B*O}v(#I4T^u^;QIydsfG>lsGjZ^x)s4D1tm43$Z zL^_&e7{n=ktdoJhSe>Qwm7D;CQH#EDN+0VYpnsy`|Arr;Y1u)X(%&b7{!mWH?TA`n zPU*vJ!2hF)|20PRvkYFb@HRB9AUpd1A|T_4;g*6M z_pf*)PldPlSAmofW1Q{i<1Ge82YswDaeUh-8q~Bq+?}WYV+4JyO@SKpGeOyB!=XEt zKJ%ZY`uDmKJC;8C?-WJrO*2Bujm)#?O6Kg2k_7Is|t54 zeU6{Mp(E&6G^z9Szm3p8)^0%!{6DJtx23rA^uMyu2e11mQegcdW&h(VO!~Mo?@+@$ zh?Eh_82XU~hVJ}M6^x+sVe0zV*|8`p1a)eUKJ13)nwWnfkHB&0oM`$C;WO~;=)Y;< zA3DL>8|py+Dm~Z6+0dursKbu_hZg$7sRq_snLekTIom=10}FlV|6ckqee?m2;YS0~ z{$a=e-!1f^f1V>l{~<+oY6N|NxkWysbvyciTMs+}#Cj#pf1=NU^g%vxFn#u=kDESt zK!>Mied&Y8i?fT1naMf<1=zHtT&bU_0+fP)vb z2_1ts=m7ddKjDnN!WsPq+SWdUtSE!7p)1e;J_^no0> z22ZFDS||tKfN$@CHqo!fP7%>UynQCxv9uNrH5gSQ_MAhUcm!yp$~+?R`Xhu#2RMLK z@u~=Q^JX2nYbeoZUg!h%U_ivaD*-91oK==jPpRo`2cN(*aLi4fR8tfc(bMPv?VLAC zf}dua=D!t zuOPtOl7*WaeP(^bkxB)NMqw^(i4^aMp#;&vC{ep*#HK$KB18zC$Q{3k9x16AW71QS zGelWY5U)3hcR!J>6?lBKe;s3Pfj0*w+N{mnwsob*fqy4yL&bT$x|dKF#U#EuKwTAT z^EAJvYm?}2uGXlvYIWKIEhwNZT8UOo@M^7rph2p!r>ZrT?wSb?&=$h2(?ac*c2RY= zmxu0(PAT!#L@m2$Gp3Zvgs>j=RV6O!IF{VJ+C#yn5tSyAW{`%fHj>CiQCZ?|FSlHO z8tJQ<^b2h*Alk9uyQy}Wb4-8bKbDefx+sjwl8*IZFI8)*=;J)nVhc&#K->kj#Z=Z_ zc@I^eIkeYpPlXjC>e8AT2*S|qm4WL|BD>2W`azNcytfDE^6k|f+N~h1)zc?PAHP;h ze@)%RDo;>a*lhMS|xGrB^phnK^Kjr(xN5` zjV_>)e1W@wEEgJP51XqMXbXkhE%faM&^~a@_z=I;BU60K*df7#(i=<@s=OFEPt&m0uSUh4GWM!*3k+3!M*) zwqjSty=>}>+vr$yv}t0A&a){fb}T^UDHKAW1fUa?lKeQ5PX7iAw(#_g4ZBNbcR zMC$W-WP2{k_hk#wCHtw8_%aMuScTdcZM>F3pD|i0z12OI{uR)9oR&%Vg%sDv(BC|= zf(*(`(gbFzxJx0NbfVHnQQBTvIjgb8LbKQ6m$K!?mzjH|fHY{v5NmsLHT0?JaoZ~s zM~8`Ihl^EowuALkI*iXhW0|}|l6mB#@Vz9g5{_x6B$d?eVv?(l zMz1=$cF~%Ew8?ll{T)fl*^gB|vppBh*msP7u~nHI=aDWOg+9%wY+rhyBT14J)(DD> zM^djOkq4RoMw1=dL33@PIW|y?ZwKulZLp0%2TdX~@r!4bs#4$h0Hq>=u~IxTcYrZtGhn`!|Eb`p&!`6Byipps_F z2J7j(fNJ_hYw!-#L*#4}RO=%~PSAoEEhbtnTG`n#w#C_@%x~oX0n`P*2obsht*WhR``?re;PJ8)J|o$#@h)78EWE zk54SSb^PV*#?&b0i^x`7+7Q*Q)C6j=^_ue@>$q)txtU%4C*)q-*RgXiv&77_%0yNc zBwb^!;G!insV676axKF}E4rp`qp!H%QYp%fqY){Ga)&(19mY}?kxKuNS)|b!S;rX4 zF>*wvF^2vEKbP)Ps8&9;afoUsetSGpl#zvE1{EaFFr{&6hdQFdS$VT1?{#UzR9(}8 zI+u-_JepaxnSGiwC2Q7gEg$Yk2A(A(i`gX4#*#^!ewBmQQGB!NW`v?^_M#~%Yvlif zuS8pU#s6B(NBZCxZ9*`@;$M6_WV_E3HjWHAovw1p?lZ~G3&;bIU#HSNa_LO6 zetgE!bsGJ{T`pOE2DLNNQG1+g$x)z%{CSYb!)j@?!`O-OW|X4D>u{QjBPY-LQba!D zq8*`5WMti7tp#JIOG{MsOuN}W52>WFriL^WYc(uZIcHh%`-n5|dg8rVwBe# zitFigH=f{WRFXpX$ZuiOW68c#$@b-JGL!CHbnm1+bN-G@bb+vGtnXo#f%zH!#n%Oo zR`H`DuQX#75nhAwLuS9>ZH{r&CeJ2{L^e4{tc8SB_T(aMIN_V)u3WKg6)P()p}F>D z=2=mEnI(6S*yIiK`1a{@%&8<@A%DP=2W06}=?-gchzN*a?Nef_i{uomJhjBvB zqS!(+09de(U?o(Bb;cyJut`)}LM6J;E@q&MsSGRVO<~+*I^u>c$x3mMR!sCU&tT7S zkwr_{qT?yYzZ8n3gUI^jUl*;1Inf5s-y*dEOGK;CU8nR*y=k1R)2_E%We{ADir zwwyOcu7|qlt8tz56vx2=5!n#&(ugKTd90M>(uN>eFPrqE|B z{e>OnIBJixeCx9UMG}r^Mb_HK8bX1FH#S=*?%=CGba?xs$6V7=>Hr)0xf5)tV*I6WW zmsaG6rfK#@SV;R_h)^9T-GA4hOld?8`w6BJ&7%)v#m+ldSvvHVEM zOv|6_sI6$r2j~3Hw0x|7^FL|%@CSG_{~JwmM*9P15K|m+!Wp*NAzI{81^|Am$-WQ;s>x5VN5Xvm zJeYP{F(!O|sw26ED6HtGkXYx258+uYdl9lJU1W}avi~;9iLjPfOCM;m+)<0X-UfM^ zXr#kgWu+rdIYL_{M*DI% zi;H^FNsQnKZKYz40@FK9!+gp%!x0V6j4-Cp>`)Di%(FUF10(3{4%L9=&v8_P?XX6y zBs7v2BLjs6a#T6m5gqo@8q!8JkmvB(fnA| za{LT}$IS5*8PaGp982RL);*COVy>J?=M*{@5+s8%#|*k3Pj|?>uttRSP|ToRT9u>r zqQ|lDu?f$bFk*qSIbtD$15~cTN_gyXY_20tcx-T@b&n&8JaSB;zOrUS)sAYjWg~vI zP@WtVRIE=lY8=tw88&BT;3j&F1yV<@TGTqCZ(0nVwPWUh*##^InN<$i5$q>}`YThE z1CmR&l0o;t%csAvF_-W#_*8rg<>yc4NWi&Ml40-hW4?+PRoAr)3;Z-vGz8fSWMP%nnUG) z;pq@ozEkPiMZ1oiXqrcU%y6Qm@j0TwtHIVN(5Py5zCSuQCRxWCj6U3(kz*3WF&WBo8D`JPtB(595Jkb7Q&`)u&nskJ14~5CApe@rn{$XStd$~j zc4+}eQjRwGF!u>!{Yvi4zzzU&>jKAuosleH6pAXrBFK|NA2ycuw>p~uhkZX z(^Z|#r&dv&Aj#|v2ibBUM2AL=<7*RMf4`mKe5}k+2TG;o2 zc_KW2k>bEvUydc8Mtp|HV~rACk0>qIFp+!W2~Ilw!^#f&FO#k_2{(_*usl__ck9G&xF0f?UCqu^)PZelQn-7GN`YUUZV9_SmE4+LBcdrWTesqSVo+B-Y&&F70GT zZE#L7lX{4Ln?UTQKgCf^w$38zm3icwUaIZVPIXi_(pqvUdhuR0Gc$K-OC3>TTTd7E zji(K;@f7O8ab)?3;)v52{o&1s1ej}LZ4>)_F~g8i!KIz%s6FmsY3nBMR?e3>qQtpu z>Wv?9z*ob7v3x5GG>3N1jX}rcrWJi zF6~T5?eTm__Ma&YR&7jK!oBG%N0eE|CQX-iwxgQN6Q0+FsOK>w!B`mmhf#> z8LeG!4cKs6EWUGwC0)bD8BKVqgR>Bq&;xb8pbb6I_h_GSfpz zA+>d}YENbp_{;g|_N>cVcW6Y;q40jIkNOnw7CIx6H(KVvY!!@$y%|w3ki4rvQ> zmT{zSWWC6HF-Bs%#M%W`D=^=|3=+Z8C)E>W25i72n^2ikixjW2^@>e)&g`>PlEqp)Gm5!)z|I68! zq~Ox7>QG&s#&qoW#Lj=0cD19rJjb6+*w=KZ2A+YfQ8hYmpPcO`-jYBpk+W<(^Fs~~9U+1v=3*BO z`t4>%?IkI!cyFBHc^^Md!P(r+BHJ5BJ(5AtSi4znal}c2!a^^E_r|S`>T|F1DoQk+ z+Z@s19>5Mg?8`@f1>b=FF|Hv-%XJ_5jtcsKXT*4Ji}4ey-Y#veYLA~rc6R?7uVF{- z*$WZ$|)=BQ%-L|v{fkmJo|3Rzc0(DK2fDBdR=43ZLsm>byX#!pd*mxYH3`wkJd|%)7UgMV@M>%IQea6!s6kMl>>%pXx!SsI0VA3DT29pNm{aAHBPTi-A`#Q}- zSzeH&Mx6`+OV&=HJtVl#6!+ouQ$(vMMSPQOpeJN2h{Mr5p&z-N`M_AjFv$xjf&)og zwheh8C14nXWqWw;$uO1^YcmYvHZcEV7`K5en_+hHr5WvEM6uT)-m{Z5;%jkKSkEwj z@#sPt$QqySG1Nohw2_0znwW`ludwtO86^z!8^-&ehR2hC+uMJnc3G40`VKlq-yt_+ zZ9~VM>CZ8S6~^yRtV{l{Kik)Ecz|!8BJjUBu9?EiI6op*j5&l0R0!H>H`&q~QbFATI@q078HLNd2TaScr&mse69F7K< zqe)oo)>5J(JLaHF$+Xq**3t~yGGh;BLG87Mkv>v3wr^9D$h*SZvzLzTHnwzj?M3(8 zIHOlsn^@s@B1`nRh#9-AX~t2k@-a;EI+*eV)-rYgN?*6jJdlOTx~VGDL0-aj@yuV= z#cCnraT|<Z*)(l8&+ZV zBxdlkJu}0>+u;n0*OTdn=HmBcx}|ry-&lY4y@ok(ds@H_0f`e|58>X4HH7vk+s6XV zq2sqEvwqCuVV{^)U{1x?8KMWq(>yjnGbCNa4$K*3R0_vNTrtaVg7J1;%H+RIkBGO#NV7oPCPl2^sv?nKFv9- z89DLPp0T99!gCnx#Ba}2ocLh$c#QRi_9%1Pl7Car(kCDjdN(@8WeU#&R{R);bv4OD z{Luo#UT*Il%zr%3;K&(2PK4(GJB#kl&Mm^Ffd1N# zqfR4qbR-3R&aKwvOF?->7eu6>Rh_Wq0KtC6|~w+xjr9y3RY)e#?-c_qf$*wLXgbe;5TXXs*I zq@6CW(j$F8+Q>nekN6p+t7!mXwAYa|_y1kNmG`?PO9 z(fObDrKg$J>Lk9{XeL}Xuy&2!e?E483DLk6Q>L(sCc5N&-R~qd52|9`P71k2RTYJrQ z)<2!}mC3jH^k(~dihJ4gC}i0@+puQePM;s6KIioDSCXs|oyQl}v3&tc5}v_Uw4l*tLi~{+-QEoUia$pPb7aVf%8E|E=(J zte-pglzeBe@Hky7hkbL@k3SxPV~&yWV;nI5w_1)E$WLc@nhnRD4^ z$L4;X_&oqRJTAwNM)5K(^NA_w@n{{Z56qoD<_KZJxChKWF|!Z6x#c7i2=5i^daBu? znO$*M`T$}*WpbsvA0UQb@-iY zA$D^%v;Wv8P0e2k#jF%`3#bYmBb>;-$uvJ7hucqCTa9(G{ zOaU13StZYPWeg49`H5OQCRoRDb5}Mnn3g%`i|>u7gIXBzJ3kw<&v2RB*yEzpaop6Y zy_RL%mAcpH8!9!e#1rzi>bd^LW`C336bjPMI%=f!KJ+)o*P=HEyiK8q(q#H^Lru%B z3HbxXddQRK33+mTo*>?r)wHCFnt-=ClvLoY2^NJ)^w2_oV1BUJ8>~qzC@LxT*S7fd zind@#Z=C4&`RND5BPeOQi(1a6qiEvvx*3gusne1g(+dhFFYtO(L+N8vQ50G@yLd)Y z!{k|Q^HLU1^;1c1VPQ^6eM5fc{6I;1Wx;~Lj71~;CDjY5D1VaPnAuQR zS)Dw8!Q_P%4HM_joL!R93VPX7>64d%tJd;H-@KY+Uvg#R^yJ#q%r;M2aqHBk>CM%J z<;~TNwTq{;rBr$f3)*JSnA$qkms3|cBXfT3j77eR!pvZGN^Ns(VMAVZYRbY{GfNiF zOfC1#uFtLmVMn;W%)IQJpx|R#YDt@CW=`^yWE>dLleT|&w#XO-nwmG}dV z9^e1G@c)AsPNZJneeRdrzTEckFTc?>ML%)urp~L?xtluEkGE>{MPlK{)#^41`Mqu1 zw(X+|Th-a1gh+pHteV5A;3-wuRh@fAAPZ)}XpIxZ?u2xH1mbPrfsRe`B*kYW1};=c zeHkh8{GtM!r_Ri$wnYJ+Q)i~gDw(I?QKu(L#?JnF!N#J^^AGxYb&t~VFGUc@SNBt* zYAV2=)j6`K4E&e{28Kp&rpx1gb;e*Rjs*H!sW&#eEA>So`Z5`LJfhBt>P+7xMn^CD zO!fvF^-x7kgWl*7&^*1))8Y$-U9VBqo>pf=i@PbKyiFBEshMTDRUr(Bpirvr>5I(d zafUjxVJ%Vj+&`j0Mq=P(h15@-qfS{062;%SsvujPS)Yiw;(!f@0xi1XSOuzpF%6#q zoW)I2NG!!c>Ym%zP{7EuRbh@gpRCSYdA@RdmR96pjKsik3aMCCjyjbn2v=af?~B5; z0MddXu?UJKd0Uc%yvUZrYGY@|0)F*zb z&ARXECCz(QEY6CUW$SHbZ_030q z`&hws8;7P}I(6Gf)*I;DtB6H0IGhTej8)i!3a(X!OV!z}&TOO1o&ZDRTNFZM1hle) zQ3Wv>5dw|inh8BY*En37Tb(sc$nKW+rblRhCNk_`TLiMK1~#DFA_cRLc4(Z#7(2M( z#~^`LIdoZCRYV2T$Eq6$ahbXX-EKXXYF`p}EP z_5P&J2W6e92t~Dz&bvKU;UQGO-ND9#nT$9Nq`$^2Gh#|JI>m^^z`aXU(CB+LeDIf>uh6rS>KLOBRIRA-0Xn1$}984d~s@?Q~#xafVOCL-p_NUJP`oNqqQ^7a} z8wK~67a^7)YV1v)!SoqK9~dT%$llZFJ3HmU-Oz4)3Ep?Y(F4CdIRE^4w-l{OJEEM; z5M(-}3^s7qoEWSz_U%AsuS`1N?!feWicbqo>v8y1mv6Q*YrU2_ka}%ZH`CM^W`qN0 z^zKUBh{K@3RW_@F$SMj`$pO)FCW+zUo4erR4+E)Za>q|tLQSE-J#;wVsa0X+v_Ku~s69vWaYET8csYQDaP&HP^NjBBcPd3#! z^_1+6w!;4Qo#)!!{jNfirM?tD?}T zYOU7hyxRNJ8VB~{Y^t%GvdCzSzF~Kp%k_w=Fw&-Cj5rijsEci?#IT8XBUp^=vA8U@ zs&)>uX|EmUKnj9`>Ej%uN*2Mhy3=Z%K<40&vFO;nQH^7}7@Z;k7>~8t4SyvuMRg8k z1~Nw+1K>stIt;)dc`pEcMT;B^3=}J%;dO4yZCeo<4y(ujv!azJ*&+u9qoNhi@G7@x z<-@GV4G0CGA_KxJGE`O^Y++thv;rDlqZS9wl-*~gXx3$FMqLJox&{=jK&XN4S(;h7 ztAZM63<$5xBn2ASzyWG~rDbfvJsqg+f@N%>4-NpLXwMdXI}}B97@D>M8eS&3qbT(~ zw!eUJzKz)vyFEx9^dk3q^jli;0BClPzldI@ODpE=h*mi=qDuL@ z+^UsObgSGA8C^uHRuZ#&yb4C}L92{8yZ_WER5z9LabN>qp(aO9@Fc2nYy?1Aveg^} zP87gOW#_aH_6#1;J`Mw5WqNjZIHPbU9=!}aE1=;O>VXlif#YlRKw!K!aNL-@F==VJ zIdsZTEy&MJ&dtakQ;?ZGEX7y{=tEBPx`DBe*rNlSkv-Gl+a85pdYSJt%r9Ghwsh)iVjDnQ@|>2vJtV{0LkHJ%6|Sx?|rVDQ8Q{XG#?SS1F= z5(45dEP|ysFrvn27SzBvNs=&WuuQ<1eQW_}5BQFn7agzl%mG{+wd%Y{oeR`?xjILk zPFE1N3}{LmZkDI69QKzQ{ zAN1k1H>@qab5^&Z_wikSa+w|M7z=gbBP8>- z?gUK8U!>P)+R>`q+J>cy)uzJ0ac@LJ>_G<->YEQ=ocPOg>+>#4t^Z(LM$rP)Mmgi) zKJtJx$G`K-NxLWfH0g?hH_p6w)@9Gw!5*_zw2{!Y^Cj#@91Pm6qTjiz8%nR6b;n!p zzwn+|opK`Kdx!r?`=RlbN#~xqX+Xbq2R;M|BVl(d359LKF(#*$_-l3HJC&Y5y&ke& zqJuHFk|hbo6KeMqe?4svsCQ5CRtG$RHn)6^?=IKtbb8ufqigg7Jn~>;fP*MdctIF2 z#?9}lau|hJDq%x__^Wbu-yC#boWJq@2d;SJjql&JgKe}lYIOP@1gr=J66iy6YTBO_ z5{qN0BQIkXL}8i$(HgUhb;KXb6Mr8!?}v$Z1bbe1Zryb-hPbwkbwnK2{1W&0jTCuA zmqfU`=)Efyn$cBWID=O3JS3zT_5l?I`EFaZI5?A zBpi;sL!wF@tkbT3dGUiEm);mEzUTRz#G|2uNZ4AgzzqG`XjHXxmtV z*d68;yIag4kdRQQhuk?WUSF*&(p<@k8utp8QY;O`A0pUO!Ya^Bm>a=y&)<0Z-hG~` zDY)Q@hI4*Cdo%KuPP$Q~vlM_79Wk9HW`gh*NgC6WD8Pt=)e_TRN=XMX{bird_{+=} z61RnhJu~^N&n|go>@~^#m<90DRdOXBUrdJW!v;t)*u;b!-QDPI zs;z7B5lecLyCsM`NmQ_fLkw3F!TD}~s6mn=8EW0Fo+jeT zNapDBpW4E81&SUK1n^EpuZ`YsJSAuyAH*1wxh^% zm~kTad2QP%pFVouxkYD9-0PS3CtUm{D#SC+*y+%Yi{t+wH;fs_PgNqZ&&G`7NNr-q z@#fCN@vHjJczEin75O)Q-FD)aq00-H1#rZ19Qx_kSL?c@!JBnK&Qni(HT|XHhSXOcWf=6{m*}0Ujt81iL^(Xr6w@C54ulz~6)YNum45>m~Gw-gv z$7eh`;i?8Z*lR#mhaou{otaSJ^Ls+>;kEvjYM(y3IiS~ggOq2D&|KH43X`~InRlm;d@$>FOJ_2H_j%Oke^~9F<@)O%` zoV2R++^m&{&(F1kz0MWr947v(KZN*r2KN39Ywry;6lJaXM{vk#Ki+p5ICdibpo{Y^ znsMSsMRzZpqMhXH@*~8Lg#8u7)Db5B?0>8H%u+lt|Lx;Iwc?U(J?1#DghF%7gtJrQ zz|0Ac58UVcBl2#0r0*fm4jJXqaV>gQ1!TtlHPh?Kjo}Zu` zq9)9la_z=BcTQe&VBMci_Rjp!4))&}efB5q++X+LaY&w;{gNXwU ztRAd*?V#m73yv(kvLdNh$pas3wuAlq_fDWghcs{e@r^MrPQG*X8@=|t{nl3?LA((L z<&dWER{uH4fyS(hJma#SA3SV?9qch6tHT(#yAwd}4%vx&C%9E7l00+EyQh!6`mF4m zFIL__;`>=RMe`3SoJH{n`&t(-}oX82Ty?E1T2U+TdgguAkK}Tz!7{P zAzu67s|P={`htlk-!T8D*@cO2)ODh!$OSQ|DH8T9h^fQq@IC}Emqp#f=}`hbR2dOt z5tLa4m00pxaa3!@DNJ6ZLy;?zz>Fm?mOyqz3iWZk@OC6Pq=Ti88QzdQ#+<;pI}_eA zbBABq^_(HaSDn!M-PAd+_h%Ns4yRDql=AcI7jL=u(ywwh4ESJbw|>X1v4eHoWzb60 zCLyRw6!0G_PYjE7eo|EqqY$g}*{UGSGt+C!&zO;(bN8a*X@|X)^`srF#nP%_>;m?X zDhXqi$)hZ+Kq2E~#j$|JWtd?fOrWLT{`B~`fBCYm?A6?3WnVFwifh=Q0y!dg6xqRS za~=?I?fhL&b{n!p(`X(SHpi}T+E3y+?F7XX_iRk3y_&|qm`q?6jCmUhW!Knztw;YwZo=7ANoa{zrDOjytVooa4uQVt-r**59F6 zr9OGGN)T3HbMtg(T-;RPPsGZnm?!BQ+f(yZqM`~P2^O?4)({Ns(|arX^9=|Zm5M0 zpAx?PPr!!g4b$6#WKYeC)?v3*f^o_iGuXmUQ zw9Hu#bo$KCH~;zZe$%oxbXzs(m~}%(+QB;RGNXuc_?`pdInLjG*!9yI2>yNMB|py! zy;yqNL&ufP>-G7tlp{-5jvrb0<(FSP z1LoQb`w%SBo9tk=8BZHk4$FAtRwN_ek(muPcGb}C(-zu7>1}HD1iT*Fk{O~MUWx8$ zw2`v_U(rb0Cj;(c&wQQIVY!J(*a@nN4Wn+KzsBS9F80t?22pocY;Up)hwUl#|H%Yv zNoPXM{e8Z?tzhVDIrkl#b+c>BnJ?Le8Z4JTGU?cUpCzr%-!wR}ciFoKl-j{M9%?M3 z^MB3+3!+CpJ+OoQ!6sOCkAK?p43tB(e);ul@7O)DcxmaOGhY7J2_x-bw&CVKV}dpP z)$_KN-EmXSMJp#S_~nj!#Iz$`6kY|r&=HjiV3zxDk0#>LOj>vTKHN(rJI~E8OFaYZ z?e)rySDyIu>CjIk4Cc;C+dl^v zo|<@^cID4MK7O%k5+@EO*a#5$6$5rK+jT%eZ|8pv0&F<)3medMygooVf-E%6ht4g`05MkV4>y zDMHKwS($spi!6xJqnE>P#?Ts!g{^96sr0=rCMpQp}ZSsvFnC;$tC9N8ChT27|Y#YrR1%Q_(xl zlunA*qw#t$y&_F3SOiW?$P0MtDU+&mH`6=VNI0v-_dM`>$h6KCYD?_+0Cv!Y=YKnJ z=4W|#z4q(1)0+qE&I$v=NV;(xK%WcuyZQNB%ATHdu6yG0%C>z^wS!$Lu;rg{qbpP; zR_X>aI+FX#06MsEWOPgi{OG5|Nb?}C0p%ams=EQ1cxC6ETu_rz%9O%M}0L<2tK(4z?ZfgF938siRYe;s^Nse&7@OXQ7vKFIjQg^t~rmePajv zBgYT$yX9ox)B*cmQgq|ZThCik-*<@}Y@$VdM*J8?z&za-^0+JL#W;Gmj^8@O7um#k z2fNBbDD2W|C1C}Y8;sI1-@#_QT^CF6ea*{Mvr&2cWvYPX>P#%@%(_nf+YgU>=&wIa zT-oKTd(Wyh; z2Yw^J;L{HF@9;jDAP!8gBEK#b@b*j;awL`Ze&_ivb@|KEmOjv+9X!|$mJVX-FuXE_ z0LJSi31VMC`!AV9EgbClmrM>Oz7G59-f8>x8eY0N?S@$s=3Wj~9VsLGkl!DvyL-Q! zOL|;ev*@)GWV2VH+$h7{ZPtU_}!i?9{r; zJWaYU!T8A|{*omDj(*1|s{8SE(UvCSEV_hYh2MlxaANb3-y8zTBVlJ*+At)?LX!Nw zR{FkKdVWLiZ}XR+M0Kj;FF~<(D%Mu`i%+cA%#7fKEA%307@ILg;znRV=p*1Y3*uI&LLLBYMS1Zws zy~+jZez`hFolaMf)#_}_(&Mh6J)^MMSv&k_WO3KTzpkBMS+s1xk_%2fWBM~p2y|H? z2hsKKu21?_y?j#k4cC2ez(4lcGSv?D?-+iR{O$Hf?Cln`EmIuP>w;L?#t~hz<9hd9 z3O+IOss`Dlx^Goy!$#u1<=d&P^BGs@v#vSxxXE|jI`6c;dzDSL+6BE*EDpOz zHg>RM6h2Od4|k`VUG@#>h?$WOz`#v=UJPlT`@H81IX4e1y8rXh_bt5QUk}*9Y%SlE za2Gsc8cduPEPvyuuXo!o>#8pMAMpL|4-9lFVdNtYNEivb8^q|qfZ%LPJ%Y5_9~`yJ zvJ0L|q01wmC4u)?T`mNpatQy{`YpqY&irT5dE2&}H8kbp^Xy=+f|xoCquz@EGrYB- z2IIA;&JRaS9OvyGjv#@j+lkBGNYp2;&6{0ZJMG|+cCh)DRt>4JC2*qdt#2^j_WA>e z^@3t`lR6iubH_*6xZkv}RgvWYxL(~udpOu`X3ASlo24#d2J2)p!I*3EZdx_!@F4!; z^F@FA?4iwhODYf8^6<59{l>h46POMTOi3bNm$iejyrL2&^3$aE=6Qq7K2KYThrSd@ zEQw>bB_~_P3~W4L;_D8@1r2S&hIYZ%RqjiSM!v8N31WFW%5d0C)a+m#4}XIErQ)wS zquB8?P2|jx(`PgqPw+_3$yHp&^qgf1A!^~LNflrj9>;$2Wc+nGNL?t2iRlgap3WJH zTB|x6Ne@Kqu&aFh$nrOqB#kV-BzJuAyX$K+>|6x{XXJZVb}*J+Fa~bK*UF~n=clEo zXQq!yPEX0mPcFcZGNmWyj7v|;7?+k(kR!G^7B$g#aMQaHG4?{B?X6M_@KE!S0 zt8|bcp534vdT4&@&KJABczo84Z>-8Ge&@MGcCa1fFj!tgv&LcVF9X=lMHq!x0s{Vr za*Xriy)X72h4mfl823GJ*k!B!{^XQRw;$Fs?aliZSryG=h?{g2=@@n}d&fx2&dem& z$Q+ZMM_5P$hn&tNV3S&3 zUAuDm7ul!G*>~^Mw}#vPyv`t!C-OZ$JJ=SB+#+%rqr#t6iPbeN$Yz=m25jd>G=boU z1NmO$3zC4NoN;g;c|eY#4}3i7@ZlTsSKT!9uD35cd59fs2N^#Ov}gQ~Bl3G0>|nNwM52MC@s|#(<|IV@jad+e6@C-u*cjD1vjZ7& zM82wF2isz4JG|d^e$eVmZAZQ$19qJB+izE1eMR3{TPCepFlPFwlDS7iwn*3&Af^sO zwkZUl*KO2q@!)M5`ModVCvk8???Tf~(NW@uZ1AHt_)Q+&LqDNY=cX@)(dqkk>D3!I zehLhmOLyjLH_W>eeayP@j_T`z^(A-rdu!3VqsHC?eMG|kBZIirgYYZ>Lr53;VBr7< z0u?d=LNKKwY>q<59M`D^i3!CV* zw8mzC6aBaozE-K$UF%mr0YyI{)6$$MNM+HsYu$~tDEcKSdIIdFS+w{v0rR&wdCN8M zle8km4-%X(J}LwshWJ?f5x+U62a^hkd;$GXp}x=`n4ctinneDKq7;mz)Om?IAdP5z z`}zy(C)_>hbWPpk&TqwUX~|9OZu)gG`t4HsZtzA5Utao&FS2gfI_-a_cLl}vcZ){R z<--2if}E=`nW}cMWvU^q4DN{oPw#U5KA-sg3q!8yq$0?L&fi@&A%5;l{NR`eKN#Zn zlaxMBGi*%$!k7TdANJB0c^aGP+bBFR%{JOIy3pg3DrllD{rHJ7Z#{k0m$1d%=}Ru4 zGMKAqgMS>Y!P5!~)%5iiqHYay8KaE`Z%BMGJAR?e=Nm<1gzg?jn>dCk>asOyE5?dz z5I@OQO#;Z@QiH$1qohPKI5oBeLvF!Lb)nuwzakXUOQq~WF+us$On!Vfyl}#Lg~S@N zHg7soZ_>MD9t0VaN2I3Uw9z zC>|NC=?IC|@Ca`b9a={Co#;*MlC<<@oL0r4a}}ZE7(}1;ezQx%pojyhto1P0m>Fsv z>jAUgXDFnoZ5AKVG&?g^;ZQ1oR&hKcPud~sES~@&s#fGyh?_k5n~Y)C&ns-l>m3h| z{^IC|RyIz#xA9*?mk<5DCZq^Nt-?Ina4f_pNF9%=LgpDV;z*Mx zo4?n*whiL}j;N-gubV`X`3-(}MvUWSd5ZP-g9+g!L$hvH0A`H|-4Tu$akpf8mVhj2 zRp+{_TNFwpp_m-4z7)sCqax3E5QC$A^W1vsVOOsD;rbp From 58a0401b8758a5ae265a126c5701be788ddd23e3 Mon Sep 17 00:00:00 2001 From: Panakotta00 Date: Fri, 8 Nov 2024 20:38:12 +0100 Subject: [PATCH 04/33] feat: Improved Lua Syntax Highlighter --- .../Private/UI/FINLuaCodeEditor.cpp | 388 +----------------- .../FicsItNetworks/Private/UI/FINLuaLexer.cpp | 295 +++++++++++++ .../Private/UI/FINLuaSyntaxHighlighter.cpp | 143 +++++++ .../Public/UI/FINLuaCodeEditor.h | 16 +- .../FicsItNetworks/Public/UI/FINLuaSyntax.h | 123 ++++++ ThirdParty/eris | 2 +- 6 files changed, 567 insertions(+), 400 deletions(-) create mode 100644 Source/FicsItNetworks/Private/UI/FINLuaLexer.cpp create mode 100644 Source/FicsItNetworks/Private/UI/FINLuaSyntaxHighlighter.cpp create mode 100644 Source/FicsItNetworks/Public/UI/FINLuaSyntax.h diff --git a/Source/FicsItNetworks/Private/UI/FINLuaCodeEditor.cpp b/Source/FicsItNetworks/Private/UI/FINLuaCodeEditor.cpp index ad94faef9..b56b48f09 100644 --- a/Source/FicsItNetworks/Private/UI/FINLuaCodeEditor.cpp +++ b/Source/FicsItNetworks/Private/UI/FINLuaCodeEditor.cpp @@ -1,5 +1,6 @@ #include "UI/FINLuaCodeEditor.h" +#include "FINLuaSyntax.h" #include "FINUtils.h" #include "TimerManager.h" #include "Engine/World.h" @@ -152,391 +153,10 @@ int32 FFINTabRun::CalcCharacterTillNextTabStop(const FString& Text, int32 Offset return TabWidth - FillerChars; } -void FFINLuaSyntaxHighlighterTextLayoutMarshaller::SetText(const FString& SourceString, FTextLayout& TargetTextLayout) { - TArray TokenizedLines; - TArray LineRanges; - FTextRange::CalculateLineRangesFromString(SourceString, LineRanges); - - TArray Rules = TArray({ - " ", "\t", "\\.", "\\:", "\\\"", "\\\'", "\\,", "\\\\", "\\(", "\\)", "for", "in", "while", "do", "if", "then", "elseif", "else", - "end", "local", "true", "false", "not", "and", "or", "function", "return", "--\\[\\[", "\\]\\]--", "--", "\\+", "\\-", "\\/", - "\\*", "\\%", "\\[", "\\]", "\\{", "\\}", "\\=", "\\!", "\\~", "\\#", "\\>", "\\<"}); - - FString Pat; - for (const FString& Rule : Rules) { - Pat += FString::Printf(TEXT("(%s)|"), *Rule); - } - if (Rules.Num() > 0) Pat = Pat.LeftChop(1); - FRegexPattern Pattern(Pat); - - for (const FTextRange& LineRange : LineRanges) { - FSyntaxTokenizer::FTokenizedLine TokenizedLine; - TokenizedLine.Range = LineRange; - - FString Line = SourceString.Mid(LineRange.BeginIndex, LineRange.EndIndex - LineRange.BeginIndex); - FRegexMatcher Match(Pattern, Line); - int32 Start = 0; - int32 End = 0; - while (Match.FindNext()) { - int32 MatchStart = Match.GetMatchBeginning(); - End = Match.GetMatchEnding(); - if (MatchStart != Start) { - TokenizedLine.Tokens.Add(FSyntaxTokenizer::FToken(FSyntaxTokenizer::ETokenType::Literal, FTextRange(LineRange.BeginIndex + Start, LineRange.BeginIndex + MatchStart))); - } - Start = End; - TokenizedLine.Tokens.Add(FSyntaxTokenizer::FToken(FSyntaxTokenizer::ETokenType::Syntax, FTextRange(LineRange.BeginIndex + MatchStart, LineRange.BeginIndex + End))); - } - if (End < LineRange.EndIndex - LineRange.BeginIndex || TokenizedLine.Tokens.Num() < 1) { - TokenizedLine.Tokens.Add(FSyntaxTokenizer::FToken(FSyntaxTokenizer::ETokenType::Syntax, FTextRange(LineRange.BeginIndex + End, LineRange.EndIndex))); - } - TokenizedLines.Add(TokenizedLine); - } - - ParseTokens(SourceString, TargetTextLayout, TokenizedLines); -} - -bool FFINLuaSyntaxHighlighterTextLayoutMarshaller::RequiresLiveUpdate() const { - return true; -} - -FFINLuaSyntaxHighlighterTextLayoutMarshaller::FFINLuaSyntaxHighlighterTextLayoutMarshaller(const FFINLuaCodeEditorStyle* InLuaSyntaxTextStyle, FFINReflectionReferenceDecorator::FOnNavigate InNavigateDelegate) - : SyntaxTextStyle(InLuaSyntaxTextStyle), NavigateDelegate(InNavigateDelegate){ - /*TArray TokenizerRules; - for (FString Token : TArray({ - " ", "\t", ".", ":", "\"", "\'", "\\", ",", "(", ")", "for", "in", "while", "do", "if", "then", "elseif", "else", - "end", "local", "true", "false", "not", "and", "or", "function", "return", "--[[", "]]--", "--", "+", "-", "/", - "*", "%", "[", "]", "{", "}", "=", "!", "~", "#", ">", "<"})) { - TokenizerRules.Add(FSyntaxTokenizer::FRule(Token)); - } - - TokenizerRules.Sort([](const FSyntaxTokenizer::FRule& A, const FSyntaxTokenizer::FRule& B) { - return A.MatchText.Len() > B.MatchText.Len(); - });*/ -} - -void FFINLuaSyntaxHighlighterTextLayoutMarshaller::ParseTokens(const FString& SourceString, FTextLayout& TargetTextLayout, TArray TokenizedLines) { - ZoneScoped; - - TArray LinesToAdd; - LinesToAdd.Reserve(TokenizedLines.Num()); - - // Multiline State - bool bInString = false; - bool bInBlockComment = false; - - TSharedPtr Run; - for (const FSyntaxTokenizer::FTokenizedLine& TokenizedLine : TokenizedLines) { - TSharedRef ModelString = MakeShareable(new FString()); - TArray> Runs; - - auto DoNormal = [&](FTextRange Range) { - FTextBlockStyle Style = SyntaxTextStyle->NormalTextStyle; - - if (Runs.Num() > 0) { - bool bNew = Runs.Last() == Run; - const FString& Name = Run->GetRunInfo().Name; - if (Name == "SyntaxHighlight.FINLua.Normal") { - Range.BeginIndex = Run->GetTextRange().BeginIndex; - if (bNew) Runs.Pop(); - } else if (Name == TEXT("SyntaxHighlight.FINLua.ReflectionReference")) { - - FRunInfo RunInfo(TEXT("SyntaxHighlight.FINLua.ReflectionReference")); - RunInfo.MetaData = Run->GetRunInfo().MetaData; - const FString& Variant = RunInfo.MetaData[FFINReflectionReferenceDecorator::MetaDataVariantKey]; - if (!bNew) RunInfo.MetaData[FFINReflectionReferenceDecorator::MetaDataTypeKey] = UFINUtils::TextRange(*ModelString, FTextRange(Range.BeginIndex+8, Range.EndIndex)); - else RunInfo.MetaData[FFINReflectionReferenceDecorator::MetaDataTypeKey].Append(UFINUtils::TextRange(*ModelString, Range)); - - Range.BeginIndex = Run->GetTextRange().BeginIndex; - if (bNew) Runs.Pop(); - - const FString& Type = RunInfo.MetaData[FFINReflectionReferenceDecorator::MetaDataTypeKey]; - bool bValid = nullptr != FFINReflectionReferenceDecorator::ReflectionItemFromType(Variant, Type); - FHyperlinkStyle LinkStyle; - LinkStyle.SetUnderlineStyle(bValid ? SyntaxTextStyle->UnderlineStyleValid : SyntaxTextStyle->UnderlineStyleInvalid); - LinkStyle.SetTextStyle(SyntaxTextStyle->NormalTextStyle); - - Run = FFINReflectionReferenceDecorator::CreateRun(RunInfo, ModelString, &LinkStyle, NavigateDelegate, Range, true); - Runs.Add(Run.ToSharedRef()); - return; - } - } - - if (Runs.Num() >= 2) { - const FRunInfo& OpInfo = Runs[Runs.Num()-1]->GetRunInfo(); - const TSharedRef& LibRun = Runs[Runs.Num()-2]; - const FRunInfo& LibInfo = LibRun->GetRunInfo(); - - bool bReflectionReference = OpInfo.Name == TEXT("SyntaxHighlight.FINLua.Operator") && OpInfo.MetaData[TEXT("Operator")] == TEXT("."); - bReflectionReference = bReflectionReference && LibInfo.Name == TEXT("SyntaxHighlight.FINLua.Normal"); - bool bLib = UFINUtils::TextRange(*ModelString, LibRun->GetTextRange()) == TEXT("classes"); - bLib = bLib || UFINUtils::TextRange(*ModelString, LibRun->GetTextRange()) == TEXT("structs"); - bReflectionReference = bReflectionReference && bLib; - if (bReflectionReference) { - FRunInfo RunInfo(TEXT("SyntaxHighlight.FINLua.ReflectionReference")); - FString Variant = UFINUtils::TextRange(*ModelString, LibRun->GetTextRange()); - FString Type = UFINUtils::TextRange(*ModelString, Range); - if (Variant == TEXT("structs")) Variant = TEXT("struct"); - if (Variant == TEXT("classes")) Variant = TEXT("class"); - RunInfo.MetaData.Add(FFINReflectionReferenceDecorator::MetaDataVariantKey, Variant); - RunInfo.MetaData.Add(FFINReflectionReferenceDecorator::MetaDataTypeKey, Type); - - Runs.Pop(); - Range.BeginIndex = Runs[Runs.Num()-1]->GetTextRange().BeginIndex; - Runs.Pop(); - - bool bValid = nullptr != FFINReflectionReferenceDecorator::ReflectionItemFromType(Variant, Type); - FHyperlinkStyle LinkStyle; - LinkStyle.SetUnderlineStyle(bValid ? SyntaxTextStyle->UnderlineStyleValid : SyntaxTextStyle->UnderlineStyleInvalid); - LinkStyle.SetTextStyle(SyntaxTextStyle->NormalTextStyle); - - Run = FFINReflectionReferenceDecorator::CreateRun(RunInfo, ModelString, &LinkStyle, NavigateDelegate, Range, true); - Runs.Add(Run.ToSharedRef()); - - return; - } - } - - FRunInfo RunInfo(TEXT("SyntaxHighlight.FINLua.Normal")); - Run = FSlateTextRun::Create(RunInfo, ModelString, Style, Range); - Runs.Add(Run.ToSharedRef()); - }; - auto DoComment = [&](const FTextRange& Range) { - FTextBlockStyle Style = SyntaxTextStyle->CommentTextStyle; - FRunInfo RunInfo(TEXT("SyntaxHighlight.FINLua.Comment")); - RunInfo.MetaData.Add(TEXT("Splitting"), TEXT("")); - Run = FSlateTextRun::Create(RunInfo, ModelString, Style, Range); - Runs.Add(Run.ToSharedRef()); - }; - auto DoString = [&](const FTextRange& Range) { - FTextBlockStyle Style = SyntaxTextStyle->StringTextStyle; - FRunInfo RunInfo(TEXT("SyntaxHighlight.FINLua.String")); - RunInfo.MetaData.Add(TEXT("Splitting"), TEXT("")); - Run = FSlateTextRun::Create(RunInfo, ModelString, Style, Range); - Runs.Add(Run.ToSharedRef()); - }; - auto DoKeyword = [&](const FTextRange& Range) { - FTextBlockStyle Style = SyntaxTextStyle->KeywordTextStyle; - FRunInfo RunInfo(TEXT("SyntaxHighlight.FINLua.Keyword")); - Run = FSlateTextRun::Create(RunInfo, ModelString, Style, Range); - Runs.Add(Run.ToSharedRef()); - }; - auto DoTrue = [&](const FTextRange& Range) { - FTextBlockStyle Style = SyntaxTextStyle->BoolTrueTextStyle; - FRunInfo RunInfo(TEXT("SyntaxHighlight.FINLua.Keyword")); - Run = FSlateTextRun::Create(RunInfo, ModelString, Style, Range); - Runs.Add(Run.ToSharedRef()); - }; - auto DoFalse = [&](const FTextRange& Range) { - FTextBlockStyle Style = SyntaxTextStyle->BoolFalseTextStyle; - FRunInfo RunInfo(TEXT("SyntaxHighlight.FINLua.Keyword")); - Run = FSlateTextRun::Create(RunInfo, ModelString, Style, Range); - Runs.Add(Run.ToSharedRef()); - }; - auto DoNumber = [&](const FTextRange& Range) { - FTextBlockStyle Style = SyntaxTextStyle->NumberTextStyle; - FRunInfo RunInfo(TEXT("SyntaxHighlight.FINLua.Number")); - Run = FSlateTextRun::Create(RunInfo, ModelString, Style, Range); - Runs.Add(Run.ToSharedRef()); - }; - auto DoWhitespace = [&](const FTextRange& Range) { - FTextBlockStyle Style = SyntaxTextStyle->NormalTextStyle; - FRunInfo RunInfo(TEXT("SyntaxHighlight.FINLua.Whitespace")); - RunInfo.MetaData.Add(TEXT("Splitting"), TEXT("")); - if ((*ModelString)[Range.BeginIndex] == '\t') { - Run = FFINTabRun::Create(RunInfo, ModelString, Style, Range, 4); - } else { - Run = FSlateTextRun::Create(RunInfo, ModelString, Style, Range); - } - Runs.Add(Run.ToSharedRef()); - }; - auto DoOperator = [&](const FTextRange& Range, bool bColored) { - FTextBlockStyle Style = bColored ? SyntaxTextStyle->OperatorTextStyle : SyntaxTextStyle->NormalTextStyle; - FRunInfo RunInfo(TEXT("SyntaxHighlight.FINLua.Operator")); - RunInfo.MetaData.Add(TEXT("Splitting"), TEXT("")); - RunInfo.MetaData.Add("Operator", ModelString->Mid(Range.BeginIndex, Range.Len())); - Run = FSlateTextRun::Create(RunInfo, ModelString, Style, Range); - Runs.Add(Run.ToSharedRef()); - }; - auto DoFunction = [&](const FTextRange& Range, bool bDeclaration) { - FTextBlockStyle Style = bDeclaration ? SyntaxTextStyle->FunctionDeclarationTextStyle : SyntaxTextStyle->FunctionCallTextStyle; - FRunInfo RunInfo(TEXT("SyntaxHighlight.FINLua.Function")); - Run = FSlateTextRun::Create(RunInfo, ModelString, Style, Range); - Runs.Add(Run.ToSharedRef()); - }; - auto FindPrevNoWhitespaceRun = [&](int32 StartIndex = -1) { - if (StartIndex < 0) StartIndex = Runs.Num()-1; - for (int i = StartIndex; i >= 0; i--) { - if (Runs[i]->GetRunInfo().Name != "SyntaxHighlight.FINLua.Whitespace") { - return i; - } - } - return -1; - }; - - int StringStart = ModelString->Len(); - int StringEnd = ModelString->Len(); - - // Single-Line State - bool bInNumber = false; - bool bNumberHadDecimal = false; - bool bInLineComment = false; - bool bIsEscaped = false; - - for (const FSyntaxTokenizer::FToken& Token : TokenizedLine.Tokens) { - const FString TokenString = SourceString.Mid(Token.Range.BeginIndex, Token.Range.Len()); - - int Start = ModelString->Len(); - int End = Start + TokenString.Len(); - ModelString->Append(TokenString); - - // Update Escaped-State - bool bWasEscaped = bIsEscaped; - bIsEscaped = false; - - bool bIsNew = !Run.IsValid() || Start < 1 || Run->GetRunInfo().MetaData.Contains("Splitting"); - - if (bInString || bInLineComment || bInBlockComment) { - StringEnd += TokenString.Len(); - } - if (!bInBlockComment && !bInLineComment && (TokenString == "\\")) { - if (bInString) { - bIsEscaped = !bWasEscaped; - continue; - } - } - if (!bInBlockComment && !bInLineComment && (TokenString == "\"" || TokenString == "\'")) { - if (bInNumber) { - DoNumber(FTextRange(StringStart, StringEnd)); - bIsNew = true; - bInNumber = false; - } - if (bInString) { - if (Start > 0 && bWasEscaped) continue; - DoString(FTextRange(StringStart, StringEnd)); - bInString = false; - continue; - } - bInString = true; - StringStart = Start; - StringEnd = End; - continue; - } - if (!bInString) { - if (TokenString == "--[[" && !bInBlockComment && !bInLineComment) { - if (bInNumber) { - bInNumber = false; - DoNumber(FTextRange(StringStart, StringEnd)); - } - if (!bInBlockComment) { - bInBlockComment = true; - StringStart = Start; - StringEnd = End; - } - } else if (TokenString == "]]--" && bInBlockComment) { - bInBlockComment = false; - DoComment(FTextRange(StringStart, StringEnd)); - continue; - } else if (TokenString == "--" && !bInLineComment && !bInBlockComment) { - if (bInNumber) { - bInNumber = false; - DoNumber(FTextRange(StringStart, StringEnd)); - } - bInLineComment = true; - StringStart = Start; - StringEnd = End; - } - } - if (bInString || bInLineComment || bInBlockComment) continue; - if (bInNumber) { - bool bStillNumber = false; - if (TokenString == ".") { - if (!bNumberHadDecimal) { - bNumberHadDecimal = true; - bStillNumber = true; - } - } else if (FRegexMatcher(FRegexPattern("^[0-9]+$"), TokenString).FindNext()) bStillNumber = true; - if (bStillNumber) { - StringEnd += TokenString.Len(); - continue; - } - DoNumber(FTextRange(StringStart, StringEnd)); - bIsNew = true; - bInNumber = false; - } - - if (Token.Type == FSyntaxTokenizer::ETokenType::Syntax) { - if (bIsNew) { - if (TArray({"while", "for", "in", "do", "if", "then", "elseif", "else", "end", "local", "not", "and", "or", "function", "return"}).Contains(TokenString)) { - DoKeyword(FTextRange(Start, End)); - continue; - } else if (TokenString == "true") { - DoTrue(FTextRange(Start, End)); - continue; - } else if (TokenString == "false") { - DoFalse(FTextRange(Start, End)); - continue; - } - } - if (TokenString == "(") { - int Index = FindPrevNoWhitespaceRun(); - if (Index >= 0 && (Runs[Index]->GetRunInfo().Name == "SyntaxHighlight.FINLua.Normal")) { - FTextRange OldRange = Runs[Index]->GetTextRange(); - Runs.RemoveAt(Index); - int KeywordIndex = FindPrevNoWhitespaceRun(Index-1); - FString Keyword; - if (KeywordIndex >= 0) Keyword = ModelString->Mid(Runs[KeywordIndex]->GetTextRange().BeginIndex, Runs[KeywordIndex]->GetTextRange().EndIndex - Runs[KeywordIndex]->GetTextRange().BeginIndex); - DoFunction(OldRange, KeywordIndex >= 0 && Runs[KeywordIndex]->GetRunInfo().Name == "SyntaxHighlight.FINLua.Keyword" && Keyword == "function"); - TSharedRef NewRun = Runs[Runs.Num()-1]; - Runs.RemoveAt(Runs.Num()-1); - Runs.Insert(NewRun, Index); - DoOperator(FTextRange(Start, End), false); - continue; - } - } - if (TArray({" ","\t"}).Contains(TokenString)) { - DoWhitespace(FTextRange(Start, End)); - continue; - } - if (TArray({".",",",":","(",")","[","]","{","}"}).Contains(TokenString)) { - DoOperator(FTextRange(Start, End), false); - continue; - } - if (TArray({"+","-","*","/","%","#","=","~","!",">","<"}).Contains(TokenString)) { - DoOperator(FTextRange(Start, End), true); - continue; - } - } else { - if (!bIsNew) { - FTextRange ModelRange = Run->GetTextRange(); - Runs.RemoveAt(Runs.Num()-1); - DoNormal(ModelRange); - bIsNew = false; - } else if (TokenString.IsNumeric()) { - bInNumber = true; - StringStart = Start; - StringEnd = End; - continue; - } - } - if (TokenString.IsNumeric()) DoNumber(FTextRange(Start, End)); - else DoNormal(FTextRange(Start, End)); - } - - if (bInNumber) { - DoNumber(FTextRange(StringStart, StringEnd)); - } else if (bInString) { - DoString(FTextRange(StringStart, StringEnd)); - } else if (bInLineComment || bInBlockComment) { - DoComment(FTextRange(StringStart, StringEnd)); - } - - LinesToAdd.Emplace(MoveTemp(ModelString), MoveTemp(Runs)); - } - TargetTextLayout.AddLines(LinesToAdd); -} - void SFINLuaCodeEditor::Construct(const FArguments& InArgs) { - SyntaxHighlighter = MakeShared(InArgs._Style, InArgs._OnNavigateReflection); + //SyntaxHighlighter = MakeShared(InArgs._Style, InArgs._OnNavigateReflection); + SyntaxHighlighter = MakeShared(InArgs._Style); + Style = InArgs._Style; HScrollBar = SNew(SScrollBar) diff --git a/Source/FicsItNetworks/Private/UI/FINLuaLexer.cpp b/Source/FicsItNetworks/Private/UI/FINLuaLexer.cpp new file mode 100644 index 000000000..1baf96499 --- /dev/null +++ b/Source/FicsItNetworks/Private/UI/FINLuaLexer.cpp @@ -0,0 +1,295 @@ +#include "UI/FINLuaSyntax.h" +#include "Internationalization/Regex.h" + +TArray FIN_Lua_Keywords = { + +}; + +TArray FIN_Lua_MainTokens = { + {R"(\[(=*)\[)", FIN_Lua_Token_String_Long, 1}, + {R"(--\[(=*)\[)", FIN_Lua_Token_Comment_Long, 1}, + {"--", FIN_Lua_Token_Comment}, + + {"and(?![a-zA-Z0-9])", FIN_Lua_Token_Keyword}, + {"or(?![a-zA-Z0-9])", FIN_Lua_Token_Keyword}, + {"not(?![a-zA-Z0-9])", FIN_Lua_Token_Keyword}, + {"function(?![a-zA-Z0-9])", FIN_Lua_Token_Keyword}, + {"if(?![a-zA-Z0-9])", FIN_Lua_Token_Keyword}, + {"else(?![a-zA-Z0-9])", FIN_Lua_Token_Keyword}, + {"elseif(?![a-zA-Z0-9])", FIN_Lua_Token_Keyword}, + {"then(?![a-zA-Z0-9])", FIN_Lua_Token_Keyword}, + {"for(?![a-zA-Z0-9])", FIN_Lua_Token_Keyword}, + {"while(?![a-zA-Z0-9])", FIN_Lua_Token_Keyword}, + {"in(?![a-zA-Z0-9])", FIN_Lua_Token_Keyword}, + {"repeat(?![a-zA-Z0-9])", FIN_Lua_Token_Keyword}, + {"until(?![a-zA-Z0-9])", FIN_Lua_Token_Keyword}, + {"do(?![a-zA-Z0-9])", FIN_Lua_Token_Keyword}, + {"break(?![a-zA-Z0-9])", FIN_Lua_Token_Keyword}, + {"end(?![a-zA-Z0-9])", FIN_Lua_Token_Keyword}, + {"goto(?![a-zA-Z0-9])", FIN_Lua_Token_Keyword}, + {"local(?![a-zA-Z0-9])", FIN_Lua_Token_Keyword}, + {"return(?![a-zA-Z0-9])", FIN_Lua_Token_Keyword}, + + {"::([a-zA-Z_][a-zA-Z0-9_]*)::", FIN_Lua_Token_Label, 1}, + + {"true(?![a-zA-Z0-9])", FIN_Lua_Token_Boolean}, + {"false(?![a-zA-Z0-9])", FIN_Lua_Token_Boolean}, + {"nil(?![a-zA-Z0-9])", FIN_Lua_Token_Nil}, + {R"(0[xX][0-9a-fA-F]*\.[0-9a-fA-F]+([pP][+-]?[0-9]+)?)", FIN_Lua_Token_Number, 1}, + {R"(0[xX][0-9a-fA-F]+\.?[0-9a-fA-F]*([pP][+-]?[0-9]+)?)", FIN_Lua_Token_Number, 1}, + {R"([0-9]*\.[0-9]+([eE][+-]?[0-9]+)?)", FIN_Lua_Token_Number, 1}, + {R"([0-9]+\.?[0-9]*([eE][+-]?[0-9]+)?)", FIN_Lua_Token_Number, 1}, + + {R"(\+)", FIN_Lua_Token_Operator}, + {R"(\-)", FIN_Lua_Token_Operator}, + {R"(\*)", FIN_Lua_Token_Operator}, + {R"(\/)", FIN_Lua_Token_Operator}, + {R"(\%)", FIN_Lua_Token_Operator}, + {R"(\^)", FIN_Lua_Token_Operator}, + {R"(//)", FIN_Lua_Token_Operator}, + + {R"(\&)", FIN_Lua_Token_Operator}, + {R"(\~)", FIN_Lua_Token_Operator}, + {R"(\|)", FIN_Lua_Token_Operator}, + {R"(<<)", FIN_Lua_Token_Operator}, + {R"(>>)", FIN_Lua_Token_Operator}, + + {R"(\==)", FIN_Lua_Token_Operator}, + {R"(\~=)", FIN_Lua_Token_Operator}, + {R"(\<=)", FIN_Lua_Token_Operator}, + {R"(\>=)", FIN_Lua_Token_Operator}, + {R"(\<)", FIN_Lua_Token_Operator}, + {R"(\>)", FIN_Lua_Token_Operator}, + {R"(\=)", FIN_Lua_Token_Operator}, + + {R"(\#)", FIN_Lua_Token_Operator}, + {R"(\.\.)", FIN_Lua_Token_Operator}, + {R"(\.\.\.)", FIN_Lua_Token_Operator}, + + {"'", FIN_Lua_Token_Quote}, + {"\"", FIN_Lua_Token_Quote}, + + {R"(\.)", FIN_Lua_Token_Access}, + {":", FIN_Lua_Token_Access}, + + {",", FIN_Lua_Token_Comma}, + + {";", FIN_Lua_Token_Separator}, + + {R"(\()", FIN_Lua_Token_Parenthesis}, + {R"(\))", FIN_Lua_Token_Parenthesis}, + {R"(\[)", FIN_Lua_Token_ParenthesisSquare}, + {R"(\])", FIN_Lua_Token_ParenthesisSquare}, + {R"(\{)", FIN_Lua_Token_ParenthesisCurly}, + {R"(\})", FIN_Lua_Token_ParenthesisCurly}, + + {"[ \\t]+", FIN_Lua_Token_WhiteSpace}, + {"[a-zA-Z_][a-zA-Z0-9_]*", FIN_Lua_Token_Identifier}, +}; + +TArray FIN_Lua_StringTokens = { + {R"(\](=*)\])", FIN_Lua_Token_LongBracketClose, 1}, + + {R"(\\a)", FIN_Lua_Token_String_Escape}, + {R"(\\b)", FIN_Lua_Token_String_Escape}, + {R"(\\f)", FIN_Lua_Token_String_Escape}, + {R"(\\n)", FIN_Lua_Token_String_Escape}, + {R"(\\r)", FIN_Lua_Token_String_Escape}, + {R"(\\t)", FIN_Lua_Token_String_Escape}, + {R"(\\v)", FIN_Lua_Token_String_Escape}, + {R"(\\\\)", FIN_Lua_Token_String_Escape}, + {R"(\\")", FIN_Lua_Token_String_Escape}, + {R"(\\')", FIN_Lua_Token_String_Escape}, + {R"(\\z)", FIN_Lua_Token_String_Escape}, + {R"(\\x[0-9a-fA-F][0-9a-fA-F])", FIN_Lua_Token_String_Escape}, + {R"(\\[0-9][0-9]?[0-9]?)", FIN_Lua_Token_String_Escape}, + {R"(\\\{[0-9a-fA-F]+\})", FIN_Lua_Token_String_Escape}, + + {"'", FIN_Lua_Token_Quote}, + {"\"", FIN_Lua_Token_Quote}, +}; + +TArray FIN_Lua_CommentTokens = { + {R"(\](=*)\])", FIN_Lua_Token_LongBracketClose, 1}, +}; + +FFINLexerRuleSet FIN_Lua_CreateLexerPattern(TArrayView Tokens) { + TMap groups; + TMap tokenMap; + FStringBuilderBase str; + + int group = 0; + for (const auto& token : Tokens) { + str.Appendf(TEXT("(%s)|"), *token.Pattern); + groups.Add(token.Token, ++group); + tokenMap.Add(group, token.Token); + group += token.Groups; + } + + str.RemoveSuffix(1); + + FRegexPattern pattern(str.ToString()); + + return {pattern, groups, tokenMap}; +} + +TOptional> FFINLexerRuleSet::FindMatchedToken(FRegexMatcher& Matcher, const FStringView Code) const { + for (const auto& [group, token] : TokenMap) { + int32 beginning = Matcher.GetCaptureGroupBeginning(group); + if (beginning == INDEX_NONE) { + continue; + } + int32 ending = Matcher.GetCaptureGroupEnding(group); + + FTextRange matched = FTextRange(beginning, ending); + FStringView text = Code.Mid(matched.BeginIndex, matched.Len()); + + return {{token, matched}}; + } + + return {}; +} + +bool FFINLuaLexer::bInitialized = false; +FFINLexerRuleSet FFINLuaLexer::MainContext; +FFINLexerRuleSet FFINLuaLexer::StringContext; +FFINLexerRuleSet FFINLuaLexer::CommentContext; + +void FFINLuaLexer::Initialize() { + if (bInitialized) return; + + MainContext = FIN_Lua_CreateLexerPattern(FIN_Lua_MainTokens); + StringContext = FIN_Lua_CreateLexerPattern(FIN_Lua_StringTokens); + CommentContext = FIN_Lua_CreateLexerPattern(FIN_Lua_CommentTokens); +} + +const FFINLexerRuleSet& FFINLuaLexer::GetContext(EContext context) { + switch (context) { + case Context_Main: + return MainContext; + case Context_String: + return StringContext; + case Context_Comment: + return CommentContext; + } + return MainContext; +} + +void FFINLuaLexer::SetContext(EContext Context) { + CurrentContext = Context; + if (CurrentMatcher) { + const FFINLexerRuleSet& context = GetContext(CurrentContext); + //int32 beginLimit = CurrentMatcher->GetBeginLimit(); + //int32 endLimit = CurrentMatcher->GetEndLimit(); + offset += prevEnd; + prevEnd = 0; + CurrentMatcher = FRegexMatcher(context.Regex, FString(Code.Mid(offset))); + //CurrentMatcher->SetLimits(beginLimit, endLimit); + } else { + SetCode(Code); + } +} + +void FFINLuaLexer::Reset(const FStringView InCode) { + BlockLevel.Reset(); + Quote.Reset(); + Code = InCode; + CurrentMatcher = {}; + SetContext(Context_Main); +} + +void FFINLuaLexer::SetCode(const FStringView InCode) { + Code = InCode; + prevEnd = 0; + offset = 0; + bFound = false; + const FFINLexerRuleSet& context = GetContext(CurrentContext); + CurrentMatcher = FRegexMatcher(context.Regex, FString(Code)); +} +UE_DISABLE_OPTIMIZATION_SHIP +TOptional FFINLuaLexer::NextToken() { + const FFINLexerRuleSet& context = GetContext(CurrentContext); + FRegexMatcher& matcher = *CurrentMatcher; + + if (offset+prevEnd >= Code.Len()) { + // Reached end of string -> Return no Token + if (!BlockLevel.IsSet()) { + SetContext(Context_Main); + } + return {}; + } + + if (!bFound) { + if (!matcher.FindNext()) { + // No match found -> Return Invalid Token containing rest of string + FTextRange range(prevEnd+offset, Code.Len()); + prevEnd = Code.Len()-offset; + return FFINLuaToken(range); + } + + int begin = matcher.GetMatchBeginning(); + if (prevEnd != begin) { + // Match found but it skipped some characters -> Mark next call to use match & now return Invalid Token Containing skipped characters + bFound = true; + FTextRange range(prevEnd+offset, matcher.GetMatchBeginning()+offset); + prevEnd = matcher.GetMatchEnding()-1; + return FFINLuaToken(range); + } + } + bFound = false; + + prevEnd = matcher.GetMatchEnding(); + + const TOptional> optionalToken = context.FindMatchedToken(matcher, Code.Mid(offset)); + if (!optionalToken.IsSet()) { + // Matched but no Token Enum found -> Return Invalid Token with matched string + FTextRange range(matcher.GetMatchBeginning()+offset, matcher.GetMatchEnding()+offset); + return FFINLuaToken(range); + } + EFINLuaToken token = optionalToken->Get<0>(); + FTextRange textRange = optionalToken->Get<1>(); + textRange.BeginIndex += offset; + textRange.EndIndex += offset; + FStringView text = Code.Left(textRange.EndIndex).Mid(textRange.BeginIndex); + + switch (token) { + case FIN_Lua_Token_Quote: + if (Quote) { + if (Quote == text[0]) { + SetContext(Context_Main); + Quote.Reset(); + } + } else { + Quote = text[0]; + SetContext(Context_String); + } + break; + case FIN_Lua_Token_Comment_Long: { + int group = context.GroupMap[FIN_Lua_Token_Comment_Long]+1; + int level = matcher.GetCaptureGroupEnding(group) - matcher.GetCaptureGroupBeginning(group); + BlockLevel = level; + } case FIN_Lua_Token_Comment: + SetContext(Context_Comment); + break; + case FIN_Lua_Token_String_Long: { + int group = context.GroupMap[FIN_Lua_Token_String_Long]+1; + int level = matcher.GetCaptureGroupEnding(group) - matcher.GetCaptureGroupBeginning(group); + BlockLevel = level; + SetContext(Context_String); + break; + } + case FIN_Lua_Token_LongBracketClose: { + int group = context.GroupMap[FIN_Lua_Token_LongBracketClose]+1; + int level = matcher.GetCaptureGroupEnding(group) - matcher.GetCaptureGroupBeginning(group); + if (*BlockLevel == level) { + BlockLevel.Reset(); + SetContext(Context_Main); + } + break; + } + default: ; + } + + return FFINLuaToken(token, textRange); +} +UE_ENABLE_OPTIMIZATION_SHIP \ No newline at end of file diff --git a/Source/FicsItNetworks/Private/UI/FINLuaSyntaxHighlighter.cpp b/Source/FicsItNetworks/Private/UI/FINLuaSyntaxHighlighter.cpp new file mode 100644 index 000000000..1dc64af93 --- /dev/null +++ b/Source/FicsItNetworks/Private/UI/FINLuaSyntaxHighlighter.cpp @@ -0,0 +1,143 @@ +#include "FindLast.h" +#include "FINLuaSyntax.h" +#include "FINLuaCodeEditor.h" +#include "Framework/Text/IRun.h" +#include "Framework/Text/TextLayout.h" +UE_DISABLE_OPTIMIZATION_SHIP +void FFINLuaSyntaxHighlighter::SetText(const FString& SourceString, FTextLayout& TargetTextLayout) { + Lexer.Reset(TEXT("")); + + TArray lineRanges; + FTextRange::CalculateLineRangesFromString(SourceString, lineRanges); + + for (const FTextRange& lineRange : lineRanges) { + TSharedRef str = MakeShared(SourceString.Mid(lineRange.BeginIndex, lineRange.Len())); + Lexer.SetCode(*str); + TArray> runs; + + bool bFunctionDeclaration = false; + + while (true) { + FFINLuaLexer::EContext prevContext = Lexer.GetContext(); + auto optToken = Lexer.NextToken(); + if (!optToken.IsSet()) { + if (runs.IsEmpty()) { + FTextBlockStyle Style = SyntaxTextStyle->NormalTextStyle; + FRunInfo RunInfo(TEXT("SyntaxHighlight.FINLua.Normal")); + TSharedPtr Run = FSlateTextRun::Create(RunInfo, str, Style, FTextRange(0,0)); + runs.Add(Run.ToSharedRef()); + } + break; + } + auto [token, textRange] = *optToken; + FStringView text = FStringView(*str).Mid(textRange.BeginIndex, textRange.Len()); + if (token.IsSet() && Lexer.GetContext() == FFINLuaLexer::Context_Main && prevContext == FFINLuaLexer::Context_Main) { + switch (*token) { + case FIN_Lua_Token_Keyword: + case FIN_Lua_Token_Nil: + case FIN_Lua_Token_Operator: { + FTextBlockStyle Style = SyntaxTextStyle->KeywordTextStyle; + FRunInfo RunInfo(TEXT("SyntaxHighlight.FINLua.Keyword")); + TSharedPtr Run = FSlateTextRun::Create(RunInfo, str, Style, textRange); + runs.Add(Run.ToSharedRef()); + if (text == TEXT("function")) { + bFunctionDeclaration = true; + } + continue; + } + case FIN_Lua_Token_Boolean: + if (text == TEXT("true")) { + FTextBlockStyle Style = SyntaxTextStyle->BoolTrueTextStyle; + FRunInfo RunInfo(TEXT("SyntaxHighlight.FINLua.Keyword")); + TSharedPtr Run = FSlateTextRun::Create(RunInfo, str, Style, textRange); + runs.Add(Run.ToSharedRef()); + } else { + FTextBlockStyle Style = SyntaxTextStyle->BoolFalseTextStyle; + FRunInfo RunInfo(TEXT("SyntaxHighlight.FINLua.Keyword")); + TSharedPtr Run = FSlateTextRun::Create(RunInfo, str, Style, textRange); + runs.Add(Run.ToSharedRef()); + } + continue; + case FIN_Lua_Token_Number: { + FTextBlockStyle Style = SyntaxTextStyle->NumberTextStyle; + FRunInfo RunInfo(TEXT("SyntaxHighlight.FINLua.Number")); + TSharedPtr Run = FSlateTextRun::Create(RunInfo, str, Style, textRange); + runs.Add(Run.ToSharedRef()); + continue; + } + case FIN_Lua_Token_Parenthesis: + if (text == TEXT("(")) { + TSharedRef* prevRun = Algo::FindLastByPredicate(runs, [](const TSharedRef& run) { + return run->GetRunInfo().Name == TEXT("SyntaxHighlight.FINLua.Identifier"); + }); + if (prevRun) { + TSharedRef& run = *prevRun; + FTextBlockStyle style; + if (bFunctionDeclaration) { + style = SyntaxTextStyle->FunctionDeclarationTextStyle; + } else { + style = SyntaxTextStyle->FunctionCallTextStyle; + } + run = FSlateTextRun::Create(run->GetRunInfo(), str, style, run->GetTextRange()); + } + bFunctionDeclaration = false; + } + break; + case FIN_Lua_Token_Identifier: { + int num = runs.Num(); + if (num >= 2) { + int runBegin = runs[num-2]->GetTextRange().BeginIndex; + auto prevText = FStringView(*str).Left(textRange.BeginIndex).Mid(runBegin); + bool bClass = prevText == TEXT("classes."); + bool bStruct = prevText == TEXT("structs."); + if (bClass || bStruct) { + FRunInfo RunInfo(TEXT("SyntaxHighlight.FINLua.ReflectionReference")); + FString Variant = bClass ? TEXT("class") : TEXT("struct"); + FString Type = FString(text); + RunInfo.MetaData.Add(FFINReflectionReferenceDecorator::MetaDataVariantKey, Variant); + RunInfo.MetaData.Add(FFINReflectionReferenceDecorator::MetaDataTypeKey, Type); + bool bValid = nullptr != FFINReflectionReferenceDecorator::ReflectionItemFromType(Variant, Type); + FHyperlinkStyle LinkStyle; + LinkStyle.SetUnderlineStyle(bValid ? SyntaxTextStyle->UnderlineStyleValid : SyntaxTextStyle->UnderlineStyleInvalid); + LinkStyle.SetTextStyle(SyntaxTextStyle->NormalTextStyle); + runs.Pop(); + runs.Pop(); + runs.Add(FFINReflectionReferenceDecorator::CreateRun(RunInfo, str, &LinkStyle, FFINReflectionReferenceDecorator::FOnNavigate(), FTextRange(runBegin, textRange.EndIndex), true)); + continue; + } + } + FTextBlockStyle Style = SyntaxTextStyle->NormalTextStyle; + FRunInfo RunInfo(TEXT("SyntaxHighlight.FINLua.Identifier")); + TSharedPtr Run = FSlateTextRun::Create(RunInfo, str, Style, textRange); + runs.Add(Run.ToSharedRef()); + continue; + } + default: break; + } + } + + if (Lexer.GetContext() == FFINLuaLexer::Context_String || prevContext == FFINLuaLexer::Context_String) { + FTextBlockStyle Style = SyntaxTextStyle->StringTextStyle; + FRunInfo RunInfo(TEXT("SyntaxHighlight.FINLua.String")); + TSharedPtr Run = FSlateTextRun::Create(RunInfo, str, Style, textRange); + runs.Add(Run.ToSharedRef()); + continue; + } + + if (Lexer.GetContext() == FFINLuaLexer::Context_Comment || prevContext == FFINLuaLexer::Context_Comment) { + FTextBlockStyle Style = SyntaxTextStyle->CommentTextStyle; + FRunInfo RunInfo(TEXT("SyntaxHighlight.FINLua.Comment")); + TSharedPtr Run = FSlateTextRun::Create(RunInfo, str, Style, textRange); + runs.Add(Run.ToSharedRef()); + continue; + } + + FTextBlockStyle Style = SyntaxTextStyle->NormalTextStyle; + FRunInfo RunInfo(TEXT("SyntaxHighlight.FINLua.Normal")); + TSharedPtr Run = FSlateTextRun::Create(RunInfo, str, Style, textRange); + runs.Add(Run.ToSharedRef()); + } + TargetTextLayout.AddLine(FTextLayout::FNewLineData(str, runs)); + } +} +UE_ENABLE_OPTIMIZATION_SHIP \ No newline at end of file diff --git a/Source/FicsItNetworks/Public/UI/FINLuaCodeEditor.h b/Source/FicsItNetworks/Public/UI/FINLuaCodeEditor.h index e098eacc0..27324d670 100644 --- a/Source/FicsItNetworks/Public/UI/FINLuaCodeEditor.h +++ b/Source/FicsItNetworks/Public/UI/FINLuaCodeEditor.h @@ -137,26 +137,12 @@ class FICSITNETWORKS_API FFINTabRun : public ISlateRun, public TSharedFromThis TokenizedLines); - - const FFINLuaCodeEditorStyle* SyntaxTextStyle; - FFINReflectionReferenceDecorator::FOnNavigate NavigateDelegate; -}; - class SFINLuaCodeEditor : public SBorder { public: typedef FFINReflectionReferenceDecorator::FOnNavigate FOnNavigateReflection; private: - TSharedPtr SyntaxHighlighter; + TSharedPtr SyntaxHighlighter; TSharedPtr TextLayout; diff --git a/Source/FicsItNetworks/Public/UI/FINLuaSyntax.h b/Source/FicsItNetworks/Public/UI/FINLuaSyntax.h new file mode 100644 index 000000000..7bb6b7fc3 --- /dev/null +++ b/Source/FicsItNetworks/Public/UI/FINLuaSyntax.h @@ -0,0 +1,123 @@ +#pragma once + +#include "CoreMinimal.h" +#include "BaseTextLayoutMarshaller.h" +#include "Regex.h" +#include "TextLayout.h" + +struct FFINLuaCodeEditorStyle; + +enum EFINLuaToken { + FIN_Lua_Token_Operator, + FIN_Lua_Token_Keyword, + FIN_Lua_Token_Label, + + FIN_Lua_Token_Parenthesis, + FIN_Lua_Token_ParenthesisSquare, + FIN_Lua_Token_ParenthesisCurly, + FIN_Lua_Token_Quote, + FIN_Lua_Token_Comma, + FIN_Lua_Token_Access, + FIN_Lua_Token_Separator, + + FIN_Lua_Token_Nil, + FIN_Lua_Token_Boolean, + FIN_Lua_Token_Number, + + FIN_Lua_Token_WhiteSpace, + FIN_Lua_Token_Identifier, + + FIN_Lua_Token_String_Long, + FIN_Lua_Token_String_Escape, + + FIN_Lua_Token_Comment, + FIN_Lua_Token_Comment_Long, + + FIN_Lua_Token_LongBracketClose, +}; + +struct FFINLexerPattern { + FString Pattern; + EFINLuaToken Token; + int Groups = 0; +}; + +struct FFINLexerRuleSet { + FRegexPattern Regex = FRegexPattern(TEXT("")); + TMap GroupMap; + TMap TokenMap; + + TOptional> FindMatchedToken(FRegexMatcher& Matcher, const FStringView Code) const; +}; + +struct FFINLuaToken { + TOptional Token; + FTextRange TextRange; + + FFINLuaToken(EFINLuaToken Token, FTextRange TextRange) : Token(Token), TextRange(TextRange) {} + FFINLuaToken(FTextRange TextRange) : TextRange(TextRange) {} +}; + +class FFINLuaLexer { +public: + enum EContext { + Context_Main, + Context_String, + Context_Comment, + }; +private: + static bool bInitialized; + static FFINLexerRuleSet MainContext; + static FFINLexerRuleSet StringContext; + static FFINLexerRuleSet CommentContext; + + static void Initialize(); + + static const FFINLexerRuleSet& GetContext(EContext context); + + EContext CurrentContext; + TOptional BlockLevel; + TOptional Quote; + FStringView Code; + int32 prevEnd = 0; + int32 offset = 0; + TOptional CurrentMatcher; + bool bFound = false; + + void SetContext(EContext Context); + +public: + void Reset(const FStringView InCode); + void SetCode(const FStringView InCode); + + EContext GetContext() const { + return CurrentContext; + } + + FFINLuaLexer() { + Initialize(); + Reset(TEXT("")); + } + + TOptional NextToken(); +}; + +class FFINLuaSyntaxHighlighter : public FBaseTextLayoutMarshaller { +private: + const FFINLuaCodeEditorStyle* SyntaxTextStyle; + + FFINLuaLexer Lexer; + +public: + FFINLuaSyntaxHighlighter(const FFINLuaCodeEditorStyle* SyntaxTextStyle) : SyntaxTextStyle(SyntaxTextStyle) {} + + virtual bool RequiresLiveUpdate() const override { + return true; + } + + virtual void SetText(const FString& SourceString, FTextLayout& TargetTextLayout) override; + + virtual void GetText(FString& TargetString, const FTextLayout& SourceTextLayout) override { + SourceTextLayout.GetAsText(TargetString); + } +}; diff --git a/ThirdParty/eris b/ThirdParty/eris index 7b81cb7f6..ecd2a6e01 160000 --- a/ThirdParty/eris +++ b/ThirdParty/eris @@ -1 +1 @@ -Subproject commit 7b81cb7f6baf23b5d80a0eabaa2bf93bcc7cc041 +Subproject commit ecd2a6e014e57910fce6481a603f2705ae85e0ac From 9018e8573297d495627a18094563362795edb82b Mon Sep 17 00:00:00 2001 From: Panakotta00 Date: Sun, 10 Nov 2024 23:00:28 +0100 Subject: [PATCH 05/33] fix: Missing Tab Run of new Syntax Highlighter --- Source/FicsItNetworks/Private/UI/FINLuaLexer.cpp | 3 ++- .../FicsItNetworks/Private/UI/FINLuaSyntaxHighlighter.cpp | 6 ++++++ Source/FicsItNetworks/Public/UI/FINLuaSyntax.h | 1 + 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/Source/FicsItNetworks/Private/UI/FINLuaLexer.cpp b/Source/FicsItNetworks/Private/UI/FINLuaLexer.cpp index 1baf96499..1433ece13 100644 --- a/Source/FicsItNetworks/Private/UI/FINLuaLexer.cpp +++ b/Source/FicsItNetworks/Private/UI/FINLuaLexer.cpp @@ -83,7 +83,8 @@ TArray FIN_Lua_MainTokens = { {R"(\{)", FIN_Lua_Token_ParenthesisCurly}, {R"(\})", FIN_Lua_Token_ParenthesisCurly}, - {"[ \\t]+", FIN_Lua_Token_WhiteSpace}, + {"\\t", FIN_Lua_Token_Tab}, + {"[ ]+", FIN_Lua_Token_WhiteSpace}, {"[a-zA-Z_][a-zA-Z0-9_]*", FIN_Lua_Token_Identifier}, }; diff --git a/Source/FicsItNetworks/Private/UI/FINLuaSyntaxHighlighter.cpp b/Source/FicsItNetworks/Private/UI/FINLuaSyntaxHighlighter.cpp index 1dc64af93..3afa7a514 100644 --- a/Source/FicsItNetworks/Private/UI/FINLuaSyntaxHighlighter.cpp +++ b/Source/FicsItNetworks/Private/UI/FINLuaSyntaxHighlighter.cpp @@ -112,6 +112,12 @@ void FFINLuaSyntaxHighlighter::SetText(const FString& SourceString, FTextLayout& runs.Add(Run.ToSharedRef()); continue; } + case FIN_Lua_Token_Tab: { + FTextBlockStyle Style = SyntaxTextStyle->NormalTextStyle; + FRunInfo RunInfo(TEXT("SyntaxHighlight.FINLua.Normal")); + runs.Add(FFINTabRun::Create(RunInfo, str, Style, textRange, 4)); + continue; + } default: break; } } diff --git a/Source/FicsItNetworks/Public/UI/FINLuaSyntax.h b/Source/FicsItNetworks/Public/UI/FINLuaSyntax.h index 7bb6b7fc3..583c2f096 100644 --- a/Source/FicsItNetworks/Public/UI/FINLuaSyntax.h +++ b/Source/FicsItNetworks/Public/UI/FINLuaSyntax.h @@ -25,6 +25,7 @@ enum EFINLuaToken { FIN_Lua_Token_Number, FIN_Lua_Token_WhiteSpace, + FIN_Lua_Token_Tab, FIN_Lua_Token_Identifier, FIN_Lua_Token_String_Long, From 62083fd8664fbc258ff6d3314310292958002ac4 Mon Sep 17 00:00:00 2001 From: Panakotta00 Date: Mon, 11 Nov 2024 01:35:58 +0100 Subject: [PATCH 06/33] feat: lua: event.loop --- .../Private/FINLua/API/LuaEventAPI.cpp | 31 +++++++++ .../Private/FINLua/LuaFuture.cpp | 64 ++++++++++--------- .../Public/FINLua/LuaFuture.h | 2 + 3 files changed, 66 insertions(+), 31 deletions(-) diff --git a/Source/FicsItNetworksLua/Private/FINLua/API/LuaEventAPI.cpp b/Source/FicsItNetworksLua/Private/FINLua/API/LuaEventAPI.cpp index 7f66695e9..bf36dfe57 100644 --- a/Source/FicsItNetworksLua/Private/FINLua/API/LuaEventAPI.cpp +++ b/Source/FicsItNetworksLua/Private/FINLua/API/LuaEventAPI.cpp @@ -469,6 +469,33 @@ namespace FINLua { luaFIN_pushLuaFutureCFunction(L, luaWaitFor, 2); return 1; } + int luaLoopContinue(lua_State* L, int, lua_KContext) { + while (true) { + UFINLuaProcessor* luaProc = UFINLuaProcessor::luaGetProcessor(L); + check(luaProc); + UFINKernelNetworkController* net = luaProc->GetKernel()->GetNetwork(); + int bSignal = net && net->GetSignalCount() > 0; + if (bSignal) { + FFIRTrace sender; + FFINSignalData signal = net->PopSignal(sender); + luaFIN_handleEvent(L, sender, signal); + } + luaFIN_futureRun(L, 1); + if (!bSignal) { + return lua_yieldk(L, 0, 0, luaLoopContinue); + } + } + } + LuaModuleTableFunction(R"(/** + * @LuaFunction loop + * @DisplayName Loop + * + * Runs an infinite loop or `future.run()`, `event.pull(0)` and `coroutine.yield()`. + */)", loop) { + lua_pop(L, lua_gettop(L)); + lua_getglobal(L, "future"); + return luaLoopContinue(L, 0, 0); + } } LuaModulePostSetup() { @@ -511,6 +538,10 @@ namespace FINLua { lua_pushcfunction(L, reinterpret_cast(reinterpret_cast(EventQueue::luaPullContinue))); luaFIN_persistValue(L, -1, "EventQueuePullContinue"); lua_pop(L, 1); + + lua_pushcfunction(L, reinterpret_cast(reinterpret_cast(event::luaLoopContinue))); + luaFIN_persistValue(L, -1, "LoopContinue"); + lua_pop(L, 1); } } diff --git a/Source/FicsItNetworksLua/Private/FINLua/LuaFuture.cpp b/Source/FicsItNetworksLua/Private/FINLua/LuaFuture.cpp index 9c57e416e..f6d1caddb 100644 --- a/Source/FicsItNetworksLua/Private/FINLua/LuaFuture.cpp +++ b/Source/FicsItNetworksLua/Private/FINLua/LuaFuture.cpp @@ -10,6 +10,7 @@ namespace FINLua { int lua_futureStruct(lua_State* L); int lua_futureStructContinue(lua_State* L, int, lua_KContext); int awaitContinue(lua_State* L, int, lua_KContext); + int luaFIN_futureRun(lua_State* L, int index); LuaModule(R"(/** * @LuaModule FutureModule @@ -306,48 +307,19 @@ namespace FINLua { return 0; } - int luaRun(lua_State* L, int index) { - //lua_getglobal(L, "future"); - int num = lua_gettop(L); - if (lua_getfield(L, index, "tasks") != LUA_TTABLE) { - // lua_remove(L, -1); - return luaL_typeerror(L, -1, "table"); - } - //lua_remove(L, -2); - int len = luaL_len(L, -1); - int shift = 0; - for (int i = 1; i <= len; ++i) { - lua_geti(L, -1, i); - lua_State* thread; - int status = Future::pollInternal(L, -1, thread); - lua_pop(L, 1); - if (status == LUA_OK) { - shift += 1; - } else if (shift > 0) { - lua_geti(L, -1, i); - lua_seti(L, -2, i-shift); - } - if (len - i < shift) { - lua_pushnil(L); - lua_seti(L, -2, i); - } - } - lua_pop(L, 1); - return len-shift; - } LuaModuleTableFunction(R"(/** * @LuaFunction run() * @DisplayName Run * * Runs the default task scheduler once. */)", run) { - int numTasksLeft = luaRun(L, lua_upvalueindex(2)); + int numTasksLeft = luaFIN_futureRun(L, lua_upvalueindex(2)); lua_pushinteger(L, numTasksLeft); return 1; } int luaLoopContinue(lua_State* L, int, lua_KContext) { - int numTasksLeft = luaRun(L, -1); + int numTasksLeft = luaFIN_futureRun(L, -1); if (numTasksLeft > 0) { return lua_yieldk(L, 0, NULL, &luaLoopContinue); } @@ -526,4 +498,34 @@ namespace FINLua { lua_seti(L, -2, len+1); lua_pop(L, 2); } + + int luaFIN_futureRun(lua_State* L, int index) { + //lua_getglobal(L, "future"); + int num = lua_gettop(L); + if (lua_getfield(L, index, "tasks") != LUA_TTABLE) { + // lua_remove(L, -1); + return luaL_typeerror(L, -1, "table"); + } + //lua_remove(L, -2); + int len = luaL_len(L, -1); + int shift = 0; + for (int i = 1; i <= len; ++i) { + lua_geti(L, -1, i); + lua_State* thread; + int status = FutureModule::Future::pollInternal(L, -1, thread); + lua_pop(L, 1); + if (status == LUA_OK) { + shift += 1; + } else if (shift > 0) { + lua_geti(L, -1, i); + lua_seti(L, -2, i-shift); + } + if (len - i < shift) { + lua_pushnil(L); + lua_seti(L, -2, i); + } + } + lua_pop(L, 1); + return len-shift; + } } diff --git a/Source/FicsItNetworksLua/Public/FINLua/LuaFuture.h b/Source/FicsItNetworksLua/Public/FINLua/LuaFuture.h index b46bf918e..7e2bcbc15 100644 --- a/Source/FicsItNetworksLua/Public/FINLua/LuaFuture.h +++ b/Source/FicsItNetworksLua/Public/FINLua/LuaFuture.h @@ -57,4 +57,6 @@ namespace FINLua { * @param index the index of the future */ void luaFIN_addTask(lua_State* L, int index); + + int luaFIN_futureRun(lua_State* L, int index); } From 4585e73788e5e8ecd3e4cec388de55646452c65b Mon Sep 17 00:00:00 2001 From: Panakotta00 Date: Mon, 11 Nov 2024 14:30:44 +0100 Subject: [PATCH 07/33] feat: FIN-Dependency and MAM Tree proof-of-concept --- .../BP_FIN_Dependency.uasset | Bin 0 -> 22377 bytes .../BPD_ResearchTree_Network.uasset | Bin 0 -> 7637 bytes Content/Schematics/Schematic_Test2.uasset | Bin 0 -> 8074 bytes Content/UI/Misc/BPW_FIN_Dependency.uasset | Bin 0 -> 46019 bytes .../Private/FicsItNetworksModule.cpp | 33 ++++++++++++++++++ .../Private/Utils/FINDependencies.cpp | 7 ++++ .../Public/Utils/FINDependencies.h | 22 ++++++++++++ Source/FicsItReflection/Public/FIRSubsystem.h | 6 ++++ 8 files changed, 68 insertions(+) create mode 100644 Content/Organization/AvailabilityDependency/BP_FIN_Dependency.uasset create mode 100644 Content/Organization/BPD_ResearchTree_Network.uasset create mode 100644 Content/Schematics/Schematic_Test2.uasset create mode 100644 Content/UI/Misc/BPW_FIN_Dependency.uasset create mode 100644 Source/FicsItNetworks/Private/Utils/FINDependencies.cpp create mode 100644 Source/FicsItNetworks/Public/Utils/FINDependencies.h diff --git a/Content/Organization/AvailabilityDependency/BP_FIN_Dependency.uasset b/Content/Organization/AvailabilityDependency/BP_FIN_Dependency.uasset new file mode 100644 index 0000000000000000000000000000000000000000..ecd5f137ba20aac6192fc38b6e1d99cff03690f7 GIT binary patch literal 22377 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 EFV`|^W&i*H literal 0 HcmV?d00001 diff --git a/Content/Organization/BPD_ResearchTree_Network.uasset b/Content/Organization/BPD_ResearchTree_Network.uasset new file mode 100644 index 0000000000000000000000000000000000000000..6d4ac30a1ae7f9f232169bffe8d25a926ebbe1e3 GIT binary patch literal 7637 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 literal 0 HcmV?d00001 diff --git a/Content/Schematics/Schematic_Test2.uasset b/Content/Schematics/Schematic_Test2.uasset new file mode 100644 index 0000000000000000000000000000000000000000..e0e6d60e3eb67875301fd13329f1947d32dba4b1 GIT binary patch literal 8074 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 literal 0 HcmV?d00001 diff --git a/Content/UI/Misc/BPW_FIN_Dependency.uasset b/Content/UI/Misc/BPW_FIN_Dependency.uasset new file mode 100644 index 0000000000000000000000000000000000000000..27b38fc5926a46b954340744102cd71c8a7abb3b GIT binary patch literal 46019 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 literal 0 HcmV?d00001 diff --git a/Source/FicsItNetworks/Private/FicsItNetworksModule.cpp b/Source/FicsItNetworks/Private/FicsItNetworksModule.cpp index e8b70d88f..5ea231bb9 100644 --- a/Source/FicsItNetworks/Private/FicsItNetworksModule.cpp +++ b/Source/FicsItNetworks/Private/FicsItNetworksModule.cpp @@ -7,6 +7,10 @@ #include "FGGameState.h" #include "FicsItNetworksMisc.h" #include "FicsItReflection.h" +#include "FINDependencies.h" +#include "ReflectionHelper.h" +#include "WrapBox.h" +#include "WrapBoxSlot.h" #include "AssetRegistry/AssetRegistryModule.h" #include "Components/VerticalBox.h" #include "FicsItKernel/FicsItFS/FINItemStateFileSystem.h" @@ -63,6 +67,30 @@ void InventorSlot_CreateWidgetSlider_Hook(FBlueprintHookHelper& HookHelper) { } } +void ResearchNodeInfoWidget_CanResearch_Hook(FBlueprintHookHelper& HookHelper) { + UObject* Widget = HookHelper.GetContext(); + TSubclassOf schematic = FReflectionHelper::GetObjectPropertyValue(Widget, TEXT("mSchematic")); + bool& canResearch = *HookHelper.GetOutVariablePtr>(TEXT("Can Research")); + canResearch = canResearch && UFGSchematic::AreSchematicDependenciesMet(schematic, Widget);; +} + +void ResearchNodeInfoWidget_UpdateState_Hook(FBlueprintHookHelper& HookHelper) { + UUserWidget* Widget = Cast(HookHelper.GetContext()); + TSubclassOf schematic = FReflectionHelper::GetObjectPropertyValue(Widget, TEXT("mSchematic")); + UWrapBox* wrapBox = FReflectionHelper::GetObjectPropertyValue(Widget, TEXT("mCostSlotsContainer")); + TArray dependencies; + UFGSchematic::GetSchematicDependencies(schematic, dependencies); + TSubclassOf dependencyWidgetClass = LoadClass(nullptr, TEXT("/FicsItNetworks/UI/Misc/BPW_FIN_Dependency.BPW_FIN_Dependency_C")); + for (UFGAvailabilityDependency* dependency : dependencies) { + UFINDependency* FINDependency = Cast(dependency); + if (!IsValid(FINDependency)) continue; + UUserWidget* dependencyWidget = Widget->WidgetTree->ConstructWidget(dependencyWidgetClass); + FReflectionHelper::SetPropertyValue(dependencyWidget, TEXT("Dependency"), FINDependency); + UWrapBoxSlot* slot = wrapBox->AddChildToWrapBox(dependencyWidget); + slot->SetFillEmptySpace(true); + } +} + #define FIN_CoreRedirect(Type, OldName, NewName) \ redirects.Add(FCoreRedirect{ECoreRedirectFlags:: Type, \ TEXT(OldName), \ @@ -348,6 +376,11 @@ void FFicsItNetworksModule::StartupModule(){ UFunction* Function = Slot->FindFunctionByName(TEXT("CreateSplitSlider")); UBlueprintHookManager* HookManager = GEngine->GetEngineSubsystem(); HookManager->HookBlueprintFunction(Function, InventorSlot_CreateWidgetSlider_Hook, EPredefinedHookOffset::Return); + UClass* NodeInfo = LoadObject(NULL, TEXT("/Game/FactoryGame/Interface/UI/InGame/MAMTree/Widget_MAMTree_NodeInfo.Widget_MAMTree_NodeInfo_C")); + Function = NodeInfo->FindFunctionByName(TEXT("Can Research")); + HookManager->HookBlueprintFunction(Function, &ResearchNodeInfoWidget_CanResearch_Hook, EPredefinedHookOffset::Return); + Function = NodeInfo->FindFunctionByName(TEXT("UpdateState")); + HookManager->HookBlueprintFunction(Function, &ResearchNodeInfoWidget_UpdateState_Hook, EPredefinedHookOffset::Return); #endif }); } diff --git a/Source/FicsItNetworks/Private/Utils/FINDependencies.cpp b/Source/FicsItNetworks/Private/Utils/FINDependencies.cpp new file mode 100644 index 000000000..f2f8db6e0 --- /dev/null +++ b/Source/FicsItNetworks/Private/Utils/FINDependencies.cpp @@ -0,0 +1,7 @@ +#include "Utils/FINDependencies.h" + +UE_DISABLE_OPTIMIZATION_SHIP +bool UFINDependency::AreDependenciesMet(UObject* worldContext) const { + return AFIRSubsystem::GetReflectionSubsystem(worldContext)->IsAnyConnectorBlocked(); +} +UE_ENABLE_OPTIMIZATION_SHIP \ No newline at end of file diff --git a/Source/FicsItNetworks/Public/Utils/FINDependencies.h b/Source/FicsItNetworks/Public/Utils/FINDependencies.h new file mode 100644 index 000000000..b2cee04dd --- /dev/null +++ b/Source/FicsItNetworks/Public/Utils/FINDependencies.h @@ -0,0 +1,22 @@ +#pragma once + +#include "CoreMinimal.h" +#include "FGAvailabilityDependency.h" +#include "FGPlayerState.h" +#include "FIRSubsystem.h" +#include "FINDependencies.generated.h" + +UCLASS(Blueprintable) +class UFINDependency : public UFGAvailabilityDependency { + GENERATED_BODY() + + UPROPERTY(EditDefaultsOnly, Category="Dependency") + FText Description; + + // Begin UFGAvailabilityDependency + virtual bool AreDependenciesMet(UObject* worldContext) const override; + // End UFGAvailabilityDependency + + UFUNCTION(BlueprintCallable) + virtual FText GetDescription() const { return Description; } +}; \ No newline at end of file diff --git a/Source/FicsItReflection/Public/FIRSubsystem.h b/Source/FicsItReflection/Public/FIRSubsystem.h index b4df017ab..bdb01641c 100644 --- a/Source/FicsItReflection/Public/FIRSubsystem.h +++ b/Source/FicsItReflection/Public/FIRSubsystem.h @@ -63,6 +63,12 @@ class FICSITREFLECTION_API AFIRSubsystem : public AModSubsystem, public IFGSaveI bool GetFactoryConnectorBlocked(UFGFactoryConnectionComponent* InConnector); int64 AddFactoryConnectorUnblockedTransfers(UFGFactoryConnectionComponent* InConnector, int64 InUnblockedTransfers); int64 GetFactoryConnectorUnblockedTransfers(UFGFactoryConnectionComponent* InConnector); + bool IsAnyConnectorBlocked() const { + for (const auto& settings : FactoryConnectorSettings) { + if (settings.Value.bBlocked) return true; + } + return false; + } private: void UpdateRailroadSwitch(FFIRRailroadSwitchForce& Force, UFGRailroadTrackConnectionComponent* Switch); From 217f50a2cfe4b4ac3d771a4c15b316c0f7939d9f Mon Sep 17 00:00:00 2001 From: Panakotta00 Date: Tue, 12 Nov 2024 02:05:26 +0000 Subject: [PATCH 08/33] docs: Automatic Documentation Update --- docs/modules/ROOT/pages/lua/api/Event.adoc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/modules/ROOT/pages/lua/api/Event.adoc b/docs/modules/ROOT/pages/lua/api/Event.adoc index a4487adeb..0672006b3 100644 --- a/docs/modules/ROOT/pages/lua/api/Event.adoc +++ b/docs/modules/ROOT/pages/lua/api/Event.adoc @@ -46,6 +46,9 @@ Returns all signal senders this computer is listening to. !=== ==== +=== __event.__**loop** () +Runs an infinite loop or `future.run()`, `event.pull(0)` and `coroutine.yield()`. + === __event.__**pull** ([timeout: number]) -> (string|nil, xref:/reflection/classes/Object.adoc[Object], ...) Waits for a signal in the queue. Blocks the execution until a signal got pushed to the signal queue, or the timeout is reached. + Returns directly if there is already a signal in the queue (the tick doesn¬タルt get yielded). From d33f9f3d63ecaf1f66351fd1b5d0c6444164b6b6 Mon Sep 17 00:00:00 2001 From: Panakotta00 Date: Tue, 12 Nov 2024 12:49:11 +0100 Subject: [PATCH 09/33] chore: version bump --- FicsItNetworks.uplugin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FicsItNetworks.uplugin b/FicsItNetworks.uplugin index d64eb1d75..abf648402 100644 --- a/FicsItNetworks.uplugin +++ b/FicsItNetworks.uplugin @@ -2,7 +2,7 @@ "FileVersion": 3, "Version": 0, "VersionName": "0.3", - "SemVersion": "0.3.27", + "SemVersion": "0.3.28", "FriendlyName": "FicsIt-Networks", "Description": "Adds a computer network and programmable computers to the Game.", "Category": "Modding", From 45ce145fa9a9290c20a93bee928a8b3f266c32cc Mon Sep 17 00:00:00 2001 From: Roze Date: Thu, 14 Nov 2024 17:02:01 +0100 Subject: [PATCH 10/33] fix: move blueprint settable initiation settings --- .../Private/ModuleSystem/FINModuleSystemHolo.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/Source/FicsItNetworksMisc/Private/ModuleSystem/FINModuleSystemHolo.cpp b/Source/FicsItNetworksMisc/Private/ModuleSystem/FINModuleSystemHolo.cpp index 162dac60c..f5e64d65c 100644 --- a/Source/FicsItNetworksMisc/Private/ModuleSystem/FINModuleSystemHolo.cpp +++ b/Source/FicsItNetworksMisc/Private/ModuleSystem/FINModuleSystemHolo.cpp @@ -13,12 +13,6 @@ AFINModuleSystemHolo::AFINModuleSystemHolo() { InformationComponent->SetupAttachment(RootComponent); InformationComponent->SetMobility(EComponentMobility::Movable); InformationComponent->SetCollisionEnabled(ECollisionEnabled::NoCollision); - - if(EnableInformationDisplay) { - InformationComponent->SetVisibility(true); - }else{ - InformationComponent->SetVisibility(false); - } } AFINModuleSystemHolo::~AFINModuleSystemHolo() {} @@ -216,4 +210,9 @@ void AFINModuleSystemHolo::OnConstruction(const FTransform& MovieSceneBlends) { CompassRose->SetRelativeLocation(ActorLocation); } + if(EnableInformationDisplay) { + InformationComponent->SetVisibility(true); + }else{ + InformationComponent->SetVisibility(false); + } } From 00fbd2ad7881257249e5291e7fc8de25856063c5 Mon Sep 17 00:00:00 2001 From: Roze Date: Fri, 15 Nov 2024 00:56:52 +0100 Subject: [PATCH 11/33] feat: Added ability to a Modular Panel to receive feedback when a hologram is snapped to it --- .../ModuleSystem/FINModuleSystemHolo.cpp | 35 ++++++++++++++++--- .../Public/ModuleSystem/FINModuleSystemHolo.h | 2 ++ .../ModuleSystem/FINModuleSystemPanel.h | 4 +++ 3 files changed, 37 insertions(+), 4 deletions(-) diff --git a/Source/FicsItNetworksMisc/Private/ModuleSystem/FINModuleSystemHolo.cpp b/Source/FicsItNetworksMisc/Private/ModuleSystem/FINModuleSystemHolo.cpp index f5e64d65c..b0ec41fc6 100644 --- a/Source/FicsItNetworksMisc/Private/ModuleSystem/FINModuleSystemHolo.cpp +++ b/Source/FicsItNetworksMisc/Private/ModuleSystem/FINModuleSystemHolo.cpp @@ -60,6 +60,7 @@ FVector AFINModuleSystemHolo::getModuleSize() { return FVector((float) w, (float) h, 0); } + bool AFINModuleSystemHolo::IsValidHitResult(const FHitResult& hit) const { auto r = GetScrollRotateValue(); @@ -75,12 +76,19 @@ bool AFINModuleSystemHolo::TrySnapToActor(const FHitResult& hitResult) { UFINModuleSystemPanel* panel = Cast(panel_r); if (!IsValid(panel)) { + if(IsValid(Snapped)) { + Snapped->HologramSnapped.Broadcast(false); + } Snapped = nullptr; return false; } + UFINModuleSystemPanel* OldSnapped = Snapped; Snapped = panel; + if(Snapped != OldSnapped) { + panel->HologramSnapped.Broadcast(true); + } - auto loc = Snapped->GetComponentToWorld().InverseTransformPosition(hitResult.Location); + FVector loc = Snapped->GetComponentToWorld().InverseTransformPosition(hitResult.Location); SnappedLoc = loc; SnappedLoc = SnappedLoc / 10.0; SnappedLoc.X = floor(SnappedLoc.X); @@ -108,9 +116,11 @@ bool AFINModuleSystemHolo::TrySnapToActor(const FHitResult& hitResult) { bIsValid = checkSpace(min, max); if (bIsValid) { bIsValid = false; - for (auto& allowed : Snapped->AllowedModules) - if (mBuildClass->IsChildOf(allowed)) + for (auto& allowed : Snapped->AllowedModules) { + if (mBuildClass->IsChildOf(allowed)) { bIsValid = true; + } + } } SetHologramLocationAndRotation(hitResult); return true; @@ -118,7 +128,7 @@ bool AFINModuleSystemHolo::TrySnapToActor(const FHitResult& hitResult) { void AFINModuleSystemHolo::SetHologramLocationAndRotation(const FHitResult& hit) { if (!IsValid(Snapped)) return; - auto loc = SnappedLoc; + FVector loc = SnappedLoc; switch (SnappedRot) { case 0: break; @@ -216,3 +226,20 @@ void AFINModuleSystemHolo::OnConstruction(const FTransform& MovieSceneBlends) { InformationComponent->SetVisibility(false); } } + +void AFINModuleSystemHolo::Destroyed() { + Super::Destroyed(); + + if(IsValid(Snapped)) { + Snapped->HologramSnapped.Broadcast(false); + } +} + +void AFINModuleSystemHolo::OnInvalidHitResult() { + Super::OnInvalidHitResult(); + if(IsValid(Snapped)) { + Snapped->HologramSnapped.Broadcast(false); + Snapped = nullptr; + } +} + diff --git a/Source/FicsItNetworksMisc/Public/ModuleSystem/FINModuleSystemHolo.h b/Source/FicsItNetworksMisc/Public/ModuleSystem/FINModuleSystemHolo.h index e8a006263..81b6e8030 100644 --- a/Source/FicsItNetworksMisc/Public/ModuleSystem/FINModuleSystemHolo.h +++ b/Source/FicsItNetworksMisc/Public/ModuleSystem/FINModuleSystemHolo.h @@ -35,6 +35,8 @@ class FICSITNETWORKSMISC_API AFINModuleSystemHolo : public AFGBuildableHologram virtual void CheckValidPlacement() override; virtual void BeginPlay() override; virtual void OnConstruction(const FTransform& Transform) override; + virtual void Destroyed() override; + virtual void OnInvalidHitResult() override; // End AFGHologram UPROPERTY(EditAnywhere) diff --git a/Source/FicsItNetworksMisc/Public/ModuleSystem/FINModuleSystemPanel.h b/Source/FicsItNetworksMisc/Public/ModuleSystem/FINModuleSystemPanel.h index 268b3454a..179abbb95 100644 --- a/Source/FicsItNetworksMisc/Public/ModuleSystem/FINModuleSystemPanel.h +++ b/Source/FicsItNetworksMisc/Public/ModuleSystem/FINModuleSystemPanel.h @@ -6,6 +6,7 @@ #include "FINModuleSystemPanel.generated.h" DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FFINModuleDelegate, UObject*, module, bool, added); +DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FFINHologramSnapped, bool, snapped); /** * This component manages a collection of modules you can place onto it via the build gun. @@ -30,6 +31,9 @@ class FICSITNETWORKSMISC_API UFINModuleSystemPanel : public USceneComponent, pub UPROPERTY(Replicated) TArray Grid; + UPROPERTY(BlueprintAssignable, Category = "ModuleSystem|Panel") + FFINHologramSnapped HologramSnapped; + // Begin UObject void Serialize(FArchive& Ar) override; virtual void InitializeComponent() override; From 7c44e738f1ea55d3ad39308a82c92bcb369a38f3 Mon Sep 17 00:00:00 2001 From: Roze Date: Fri, 15 Nov 2024 01:00:18 +0100 Subject: [PATCH 12/33] feat: Added support for SizablePanel to use different meshes in construction mode and normal --- .../Private/Components/FINSizeablePanel.cpp | 38 +++++++++++++------ .../Components/FINSizeablePanelHolo.cpp | 3 +- .../Public/Components/FINSizeablePanel.h | 3 ++ 3 files changed, 32 insertions(+), 12 deletions(-) diff --git a/Source/FicsItNetworks/Private/Components/FINSizeablePanel.cpp b/Source/FicsItNetworks/Private/Components/FINSizeablePanel.cpp index 5e4d24915..01c6e6642 100644 --- a/Source/FicsItNetworks/Private/Components/FINSizeablePanel.cpp +++ b/Source/FicsItNetworks/Private/Components/FINSizeablePanel.cpp @@ -75,14 +75,16 @@ bool AFINSizeablePanel::ShouldSave_Implementation() const { void AFINSizeablePanel::ConstructParts() { // Clear Components for (UStaticMeshComponent* comp : Parts) { - comp->UnregisterComponent(); - comp->SetActive(false); - comp->DestroyComponent(); + if(IsValid(comp)) { + comp->UnregisterComponent(); + comp->SetActive(false); + comp->DestroyComponent(); + } } Parts.Empty(); // Create Components - SpawnComponents(UFGColoredInstanceMeshProxy::StaticClass(), PanelWidth, PanelHeight, PanelCornerMesh, PanelSideMesh, PanelCenterMesh, PanelConnectorMesh, this, RootComponent, Parts); + SpawnComponents(UStaticMeshComponent::StaticClass(), PanelWidth, PanelHeight, PanelCornerMesh, PanelSideMesh, PanelCenterMesh, PanelCenterMeshNoConnector, PanelConnectorMesh, this, RootComponent, Parts); FVector ConnectorOffset; if(PanelWidth < 0 && PanelHeight < 0) { ConnectorOffset = {3.3, 0, 8}; @@ -110,29 +112,43 @@ void AFINSizeablePanel::SpawnComponents(TSubclassOf Class, UStaticMesh* ULMesh, UStaticMesh* UCMesh, UStaticMesh* CCMesh, + UStaticMesh* CCMesh_NoCon, UStaticMesh* ConnectorMesh, AActor* Parent, USceneComponent* Attach, TArray& OutParts) { - int xf = PanelWidth/FMath::Abs(PanelWidth); - int yf = PanelHeight/FMath::Abs(PanelHeight); - for (int x = 0; x < FMath::Abs(PanelWidth); ++x) { - for (int y = 0; y < FMath::Abs(PanelHeight); ++y) { + int absPanelWidth = FMath::Abs(PanelWidth); + int absPanelHeight = FMath::Abs(PanelHeight); + int xf = PanelWidth/absPanelWidth; + int yf = PanelHeight/absPanelHeight; + for (int x = 0; x < absPanelWidth; ++x) { + for (int y = 0; y < absPanelHeight; ++y) { UStaticMeshComponent* MiddlePart = NewObject(Parent, Class); MiddlePart->AttachToComponent(Attach, FAttachmentTransformRules::KeepRelativeTransform); MiddlePart->SetRelativeLocation(FVector(0, x * 10 * xf, y * 10 * yf)); MiddlePart->RegisterComponent(); - MiddlePart->CreationMethod = EComponentCreationMethod::UserConstructionScript; + //MiddlePart->CreationMethod = EComponentCreationMethod::UserConstructionScript; MiddlePart->SetStaticMesh(CCMesh); MiddlePart->SetMobility(EComponentMobility::Static); + MiddlePart->SetVisibility(true); OutParts.Add(MiddlePart); } } - if(FMath::Abs(PanelWidth) > 1) { + UStaticMeshComponent* MiddlePart = NewObject(Parent, Class); + MiddlePart->AttachToComponent(Attach, FAttachmentTransformRules::KeepRelativeTransform); + MiddlePart->SetRelativeScale3D(FVector(1, absPanelWidth, absPanelHeight)); + MiddlePart->SetRelativeLocation(FVector(0, (absPanelWidth * 10 / 2 - 5)* (yf > 0?xf:-xf), (absPanelHeight * 10)/ 2 - 5)* yf); + MiddlePart->RegisterComponent(); + //MiddlePart->CreationMethod = EComponentCreationMethod::UserConstructionScript; + MiddlePart->SetStaticMesh(CCMesh_NoCon); + MiddlePart->SetMobility(EComponentMobility::Static); + MiddlePart->SetVisibility(false); + OutParts.Add(MiddlePart); + if(absPanelWidth > 1) { SpawnEdgeComponent(Class, 0, 0, 2, PanelWidth, 1, UCMesh, Parent, Attach, PanelWidth, PanelHeight, OutParts); //DC SpawnEdgeComponent(Class, 0, PanelHeight - 1, 0, PanelWidth, 1, UCMesh, Parent, Attach, PanelWidth, PanelHeight, OutParts); //UC } - if(FMath::Abs(PanelHeight) > 1) { + if(absPanelHeight > 1) { SpawnEdgeComponent(Class, 0, 0, -1, PanelHeight, 1, UCMesh, Parent, Attach, PanelWidth, PanelHeight, OutParts); //CR SpawnEdgeComponent(Class, PanelWidth - 1, 0, 1, PanelHeight, 1, UCMesh, Parent, Attach, PanelWidth, PanelHeight, OutParts); //CL } diff --git a/Source/FicsItNetworks/Private/Components/FINSizeablePanelHolo.cpp b/Source/FicsItNetworks/Private/Components/FINSizeablePanelHolo.cpp index 27da9f4c6..e2570c53b 100644 --- a/Source/FicsItNetworks/Private/Components/FINSizeablePanelHolo.cpp +++ b/Source/FicsItNetworks/Private/Components/FINSizeablePanelHolo.cpp @@ -146,8 +146,9 @@ void AFINSizeablePanelHolo::ConstructParts() { UStaticMesh* UL = Cast(mBuildClass->GetDefaultObject())->PanelCornerMesh; UStaticMesh* UC = Cast(mBuildClass->GetDefaultObject())->PanelSideMesh; UStaticMesh* CC = Cast(mBuildClass->GetDefaultObject())->PanelCenterMesh; + UStaticMesh* CCN = Cast(mBuildClass->GetDefaultObject())->PanelCenterMeshNoConnector; UStaticMesh* Con = Cast(mBuildClass->GetDefaultObject())->PanelConnectorMesh; - AFINSizeablePanel::SpawnComponents(UStaticMeshComponent::StaticClass(), PanelWidth, PanelHeight, UL, UC, CC, Con, this, RootComponent, Parts); + AFINSizeablePanel::SpawnComponents(UStaticMeshComponent::StaticClass(), PanelWidth, PanelHeight, UL, UC, CC, CCN, Con, this, RootComponent, Parts); RootComponent->SetMobility(EComponentMobility::Movable); for (UStaticMeshComponent* Part : Parts) { Part->SetMobility(EComponentMobility::Movable); diff --git a/Source/FicsItNetworks/Public/Components/FINSizeablePanel.h b/Source/FicsItNetworks/Public/Components/FINSizeablePanel.h index f3d4cffab..dcd9e2a70 100644 --- a/Source/FicsItNetworks/Public/Components/FINSizeablePanel.h +++ b/Source/FicsItNetworks/Public/Components/FINSizeablePanel.h @@ -18,6 +18,8 @@ class AFINSizeablePanel : public AFGBuildable { UPROPERTY(EditDefaultsOnly) UStaticMesh* PanelCenterMesh = nullptr; UPROPERTY(EditDefaultsOnly) + UStaticMesh* PanelCenterMeshNoConnector = nullptr; + UPROPERTY(EditDefaultsOnly) UStaticMesh* PanelConnectorMesh = nullptr; UPROPERTY(SaveGame, VisibleAnywhere, BlueprintReadWrite) @@ -60,6 +62,7 @@ class AFINSizeablePanel : public AFGBuildable { UStaticMesh* ULMesh, UStaticMesh* UCMesh, UStaticMesh* CCMesh, + UStaticMesh* CCMesh_NoCon, UStaticMesh* ConnectorMesh, AActor* Parent, USceneComponent* Attach, TArray& OutParts); From 56de051ae358a17506d8d5b922971450276f2169 Mon Sep 17 00:00:00 2001 From: Roze Date: Fri, 15 Nov 2024 01:07:42 +0100 Subject: [PATCH 13/33] feat: Changes to meshes to accommodate testing of connector materials. fix: Implementing the changes made to the c++ in previous commit --- .../Assets/MI_ConnectorMaterial.uasset | Bin 0 -> 8746 bytes .../Assets/MI_SizeablePanelConnector.uasset | Bin 10301 -> 9782 bytes .../Assets/MM_ConnectorMaterial.uasset | Bin 0 -> 9366 bytes .../Assets/SM_SizeablePanel_Center.uasset | Bin 22013 -> 23765 bytes .../SM_SizeablePanel_CenterNoCon.uasset | Bin 0 -> 17084 bytes .../SizeablePanel/Build_SizeablePanel.uasset | Bin 127801 -> 428496 bytes 6 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 Content/Buildings/ModularPanel/Panels/SizeablePanel/Assets/MI_ConnectorMaterial.uasset create mode 100644 Content/Buildings/ModularPanel/Panels/SizeablePanel/Assets/MM_ConnectorMaterial.uasset create mode 100644 Content/Buildings/ModularPanel/Panels/SizeablePanel/Assets/SM_SizeablePanel_CenterNoCon.uasset diff --git a/Content/Buildings/ModularPanel/Panels/SizeablePanel/Assets/MI_ConnectorMaterial.uasset b/Content/Buildings/ModularPanel/Panels/SizeablePanel/Assets/MI_ConnectorMaterial.uasset new file mode 100644 index 0000000000000000000000000000000000000000..303c0ca53f7e5c5866ebc1ca0f8baf64c9388b11 GIT binary patch literal 8746 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

eR&w``nZ<*!!2ytimG zrMtDZI4AXT?sMn?Z>k{!R}xw=Hnd`Pq0Sav;7MyCG%>QJ1&yF(<0`H&NUeyBbM*IH zyu9{tN}lD>hohLU48)EZ(SQDMCz?aPA9KJoKt(k1An|^>Q}w77$J+il`D0PoF~^`s zbRyGCvP5`jpo)66Wad^4izkf}FV1=rP`}OO>Hdjl5|R_vE%em&Fr$tp1iIZVUz~8^ z@J_qfu%2Sj-Anh5CB_!~k`Q;+W0zjkHy1D0>=N6u`F6K%HZdmsbaJ)hQ{UfqG42@6 zOY7Dg*qWCqkD%-D^F7wDAuV^gWzQ%^E_zY$S}s0#Mx>G# zxR)4S+1|BvTV@l!fI?m?kKY%2wxZGAESU@*a~jEJ(M|ZSjq>;c*yZ+E>D_fUB9U>d zWvuSVM}3j4KD}dhto-WthVBJtTJkuA^7V_>^ZO>`hpb+kI|#H=e>tSn-{mT&G}PnX zJO5f;O>Z{ZkWzeHJ2KOG;WrOVYYCAR^*78NBiA~`h-Y?gt$5~o;5=MCHhUVPR6?gd zUha7Rb&EW-A!@J3@kYQn#;YrJ=!yJuRh>^{8Jnvc8O!ibs5b*Fa+|y$xN-c{t6aYXWuc&FCDH$3wvvr*Ys0U=e65DWnt5 zR#sQ7^DqNDg9D}etE&y0R0|UhjlDiOp>*61Glzh@5yrtwa zIj*BQyXtHufkGsNs!7y#>4K2j@Tn0?xp%6wxr-|nOxcl{oC!`$u6UNPV{6gXGHvUq zP5Y{J3eP>)$ltwpnY5_t3LSrh8P^o-LVy5jZG?I`I@k*k%%WsN@dq%O@svM8`-VgLW`4Tz$A_t$1GWY zirn#hAAwYE2v2~M4S@_DR%C^A{I!6&6m5ioo`GGsP{JtMG_EZNRP3w7QGnqA%2>b7 z5KB^LtrNElm)YDcPP!-mYuxiQsfM>Y+c*8xF1CP2N?Z_6x+jQ#l7o{Wshw8jtIYlK zoa1F0)wbtj3Jk@8QKT|_9!ZMMpYRTc;-MGd-j3g%mkd`ZE|g#y#d{=r`yfOHUXvs{ zG;WKUZF>iT{h)e=bi#mQ$#2dB1<5a@`33m_p-bv1x~*BH)-2oSbb{Yydu}@15>lm2 zgiGOW(%xS~xVD#Wh)weXOF(mAW;ov6_NHEiH3>(mxL{JIA}KOFR;DJGud7UISWLo+ z897}=+0Dg1!bc?BS(?*t-Tvw0THt9tNG)l0Ax?I$xw}>_9+Ui{Jo!acHwSk<$KG~k zF*=B#4cfZ7J3NeH5C*f3xnTevv{&_l>4sqx9iFUJ2sOfmgveS2sbz}1+%ypExEtC= zg1Ha~3JCIz;nygt@El&*JhsmaBu$6L7F4(wm)f=f#zOdTYv^d{rub8V`y9Y&aD#uK zKW+bGW$bUOTc|AhNLi6UQvQ|^efYu(c0+YMJFGDGMI8_ye2y#qpDdu^?+cW${fFiug&2dfi7!sK5-_VC7ZBUI9Nhum#Ed zL>BxaGECI4Qh6?9{~IH0{tF+Rf=8(P*^Pv>QB-UWLv4`H5ug$_0_0`{STzTgPe+78 zLdMp<2P)M3Z92P_#6_3F@_+)6;}9sTO#r-sHIKLhKVufnj2r$1WN^F>Z=&Kw8^yLY`2PV|P zYG0W0n8d%0J{mL}uvyT`Lx2gwVv4@0j0k2*>=$YUNo!_fQpYQquw&6^hpMH&B%`tX7a5EKF{lZU3 z3Q!U+M3cher`Q>V9NMXGQ=Ru3kIkZ#qi8!YZ@LToqd{52G5Y#|Sc10b#4HB9C5kGA$o1mgc6t7?7f literal 0 HcmV?d00001 diff --git a/Content/Buildings/ModularPanel/Panels/SizeablePanel/Assets/MI_SizeablePanelConnector.uasset b/Content/Buildings/ModularPanel/Panels/SizeablePanel/Assets/MI_SizeablePanelConnector.uasset index f3c468d4eba7b36b269b4386394e7cf83daf3af4..4c031ef59ef64a19c3afd7f85862b149b6de708e 100644 GIT binary patch delta 2637 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

56^C1S+jA=iz( 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 OaP~ck<*ickd6bqJX zyIvKrA_#hIs30nc((-0b&H)v<_kRET)_QNf^=2iRnZ5Vync1`Vo^mGV;u6!}z6yoH z2r2+F6aYTL7=C~({O(@;Ri)b}d8ORr1w|(39PP~@tUmdriIKdY!L_&Y90<$2pTRun9Qf*eu+IVG zlc&z7K$zbBuwCZ^4flCS>gL>CTt*)QVGqsjLkflQ9N&c0E3^(;U@6RT#}irXeK+BXXej|PG-@$ zL3B2QWrqLq%tD#z40zAhrNZRt%Y+Ru@p>QR0m)PQTU=Jjsi_EM&ISI zbJ^#==^rc)_c^n<{50TQ`WI6hL6IcgqnUgTH;^02UGmV`3Old^aYKPiIFlJeUktv>!7zjt>VC zd$yt37J-;I~(bn zD~H8m@{lObEa^UmdK2lv;YKk6ljw7k89+jKu0bCGJt0>vozM6|63#sDn6Ok%C=)T> zbu(!@)Wd#KTuzDfq{-ntu=~N>E~I09d|(S9|L;l8Qz$N~h(t6DQ<(fXBv^k2FAm%R za!c^GdBct|=`3h0(crbm*~KCtk8E8u_;fWyD2a37g);cy@&s%eE(2c%BPld3F_FRN zrh(#`nby*f$c4p;N^oYez}N9Jr16pDM5lSPMPm(UFZTT@0&-Y=dZi>*nuV+;G7t)z z3p?({U?W{(@W5BNc;K}KSD!#7 za#CRXAQ&Gy9#B%aABpn|O-@3p?m>@YgfQR`0sm05tGGmvlk!Yvg9&qI-@!YN0HLsD z3@bOVSFipHk|wU&P`tI*lHhY7>St9fu3&Y`^T2Z^SQ>+*>LIr z!*x1e;iX9%7MXN35Cfl%qCWQ-H|$#slf?*t&JRdSP5cchK_4=N!As(>c?{r~xxXA~ z&HxM#Xv8(YL;CE>fi*`#XA0&WY9E2T7=)xS=DD*Ni9AqB)18iBZb+3ystTyr+W$a$ z@5YFsC$so{)>Y~~@(l8@KRA>SMiL8-W+GH%-0tT%jGgieA|8j8jKqZNCD?r`cm&c2 zH%>B|K*+Tvd2lq*!v`F6rji6}e`f1WSCKDZu^Z*GRIhzzQhbX*5Fppe77$+3Y5lLWIt@^iN zhz`lpgF)vfa~UG%ismwK`Jm)VG)4Xz?da&oNoDZ(pvh%x@ZXUUv*tZ1I;`+Tt+PH4!$UBpE%zLk^1(#2T=HdZiCi1xHbCIlUz9* zE?f}9A|ku2za%>u$&yB{6=5kq#!{bq3(8UsI0 z6rDvDK=bscdA|wKJPn%w3N~I(LhXd zc4(oBNKD^YKA9a5ht%DlKF^Jj!W4OSKcflDM11D?B|~#X`tFKmOh7&U7n{HYBqs*O z^y_W=hu;>9S~L&Gps9rij2F&+h|@z3KhDTTov+=7qKYA=&zAb;>(6puE+aW3ETI_Q z>=?M3Oadb~4Qol3lfw!3hmb(sIouv+$z+p*@ZI>Zva@WE1>q{}Fv9*Z>Nd*s33c%& zDIc7I!)Aas>hJPMX#ykTpOD%Gv1cIEu zf!_w7IYfaVxH^l0OLE*1fc3QH7g2kInDZDccPl0EMlnk4Wg1#DRs^YkN>C)aY`ADm|+9-&cO27`^ZnP5d^<2f`eKS?##t+5+< zb^=Vwo>X^y%*Ae{96^eMwli>HC2}qJEMr9L`VGxwp-fgBCmF68zn_8>{qEV~NZdt= zN_oJA3LB0VC?CGN6zS1-{*wpN4g)zHh_9hTU~S1f@ahQtPc%ZI+$d5xMMg_=Yq*W~ z2%q7}7K1FujB7})#Ee7uU>>Ner>US7X#Y&~-O|q`nU#S1#R4VPJ7fy|RNu7_JhIxh z0(lfT1@|fT_={WvQ8T!3Uh4y!gI(RI_hAffBJzXKL-$W}E?b`CjxCHa@27b?YDTUy z(v`5d6cMUa0pafGg4&5VP-=BxYlwrEwY2W@Ky3U=s=a9JFnoV{QSAes>FZ{AFo; zxYk{jJC`h z4J`={prSp+lx7K`mGX-YEMi>3l5LSdHqn4V&Ymj`uSNk zWPkW74b6t%Svz>xax(%sR8qj8x%86->KF+icQQ~hc<^wD55&f+l;9;8d^*nmg`jK` z;{QwSG0f6ffzQGN$8DPLf`y_9G^KAV0@h^d%|!m2nA-r)bEO(STZ!g6f3nitF$E07 z7e5F3(M9MrNt7XZ45n>1OaD5BPYEJ#2?YXFrqROo!6GP>h$8R_9?F#wX&w=y=x4f* zknYgGq&xdB={Ecex>i{4seeKD0n(NJOS&_^pxaNtjuG)^$nWsq&>bgm?U3%ozo2V_ zbSHm7N6NXJz@Z2okfQLb@%WyuNJRFJbjAOYj%>?6)l16ipXd(!%X$y~f{v_%)Fq^U zNB)M6)TI_kck~x@y%0`-0rEmfm(jjK3VuD&ya)q2oE|Ko19CDzR(-rkSm$>z#2@J* zS>_Ru*k(mi4~$7#g!vW!pJAs77U-dYGm%cRArde`{J!VekNGwKuAkbEY!3AU$%hon z(eL@FZyZ2mWLq ze%1c&@AxCRkUAy}wJ1o$9v*fR2^b+>5lv1^=IUqx`S<|B4R5 zkp3W>Y5uN%c*9|SEgTr(BVi*@^6~KY02u5KhH%0sz!k_!Ny$h_%F0N~$jiyfD{HAJ zD=I4MX$)7@GBFr!YHVO+G}e-4H`aWjxsj2*pTk5~cQ0?R(YAq;13bcLo?h;V2_`2m zudJx7tD>UoKF(;I`+ppSl|WevwTX)90g5t4RmOx@06cQR#4$XO-Nqwh=DQOv5 zNN_?4P%tW$B1RP#7lTs9G9Vs^DT}MsWukYJnUTgM&v^29v<2GsgJ>nW&7v0*maPT7#UNV47k;&f9o?aS-Ou&Uu@_ z&yxstR|PNM1s0h-RqX`E`B@+<%Q%lxFsH(=_(;7fC<}H67H6tMPEAh)sxRL87aL6n z8LGiFsRsVNWc`eq;JcWww>$84_bl(MZgDCDov=EOzux%(eWMa!nYAgdZEsv#o*1l_ zK0ZKPbA1VL+EH&(vA)E#`Yu-MZ?!;w z|FD*-vh+}Ioko71WR+iCMjZSAc3I9#%@x)ao`t|OAfT*yZ*}(Cy?TNX?pAZ#_s(t4 zleDY18DXyypy-oQ)kIUS3Q1H=9GQcSfXx^8x{$Ixa83nH)?GD-s##*YtDb3$ncR4= z6EXswP;AQQoA$l+=qlPyllJxYrKun}g=&5no?&tRW1d8H^)EzO^_y&HkoU#hV6Pog1)Wn6&cFaOajszTuK=It)uUWXf zNZ*k8ZO1uBAf$MD zqC@&!>KmxYaPao-*KFCr0HemL28rdo2x&RsxG5{qH&F<*Ef$@hlnYpw_qdgRj*fL& zk~xKb?Bpqjb!w7bSE74kivH9%)IvS(!92a!TJWO9W87=)wyF!c?jdzr^#K{toY%qO zd8!Yflur48M93Z-?AYJ-d)GaY3B}YjdDJuo<_k2+IztwNi|+z(`)j`ZVD04xdkgc# z^;3Opcl%6k3doa4bjnf8c~R3;QY{#k)V?=qUsD`*bJ;Tkqs; z!=9g69<{R0Vn1(Y{n_Ojn^#25l8T_|@7a^*Fl|Q1u_5)VdYC&`l&E~xEeaP*N@_2d zWL{ZRT|6DYw!u$^DyWolu!gN(j?6%@Zem=WspE985jlu$4fASng|>w`$zq>m8^_Rn z0E#2o=1dSZ4vK#=ltyIF+YF!zU5IDs^hMX|Cbd^B%5@bbKOBLL-)pmEzR}LK(J7K~ z-IF@MmE3wTqTI7#OkU|7zjnhtm{N$djuzCwlAXzA(L#`Ne1~W9Xu(S7OY2N~N`F75 z7_Y8X)AKgb;Y>|@rAcVXDAQ!<9iW}A?eO;uLBG{_Ui1>EPiUXyJpH)*T`$Ry;&0)8DsEA9iwRn5Qorn@O=#3V$)#Ogc%qQA zfwjHu(0(H;rK~+cBUQsM)UO`7+LgLMe&T&>P-+&_t6jD9jhAA@6aH*#@Au z!PL|Yk#B^a>)z^)xY~&(1=&f)SX-!__H^VX)y~u~|9YiW-HcqCgJaFfEZ0wKvOu!x zpVuC&g?Oz7evOHXNtb7#CiIkJ`_+F+T}J$jm`TjlJs-Q@Q1cH-%vyId zegE&AnBzwhr`~wwVW~K$#D$`1-~GojXtEEopW8VJ?$001lNri6+feA6w5aN(5F`nK zDR^B|IMzD1n6hbZ`$4SjL6diR=Uu0$Kfx%~9^8QsKj-eWgGSYZ_H%s!0vemRpMvYD`I0y;@%5wIjSw=O8 zf^@_S$_cuD=yoO9PWL$0wZ_j*GK^^nY4u4C*u(^BF3JUTho7D_t#6Aka*-5#!yN9V1cU}H= zSEAW{;-wiyuP3Hs_iDzC+fv81vv_l2{e%+h!nzkwkV^#_zt_|`y=qigQoZLX)A%4( z$$n8)I{z+`N&ViZYZ70C?uVXY$lSeizZ6y9r7Wpf;#)Sq8hHx4xV;e_#lbY?;DFk= z+KheJ38?by8XtwH@=%A_&ptqJE(P2Fp8WzjaSC*mw%YOF$qhInxDPkRW zN$qqWW2_1Cn4R+$n3TW-I|tO7z;Q8qT3j=%#7Q6n=ViS@=vz$Qb;LVv=(pyak_S6! zvOc-YvKRfplJqLcfu)N9C^`+@z9OV)mbCsU$kLiyEjb^GJpx{5rs(imj6K#!@=DSZGPURh$0_XW^C&;wrRVgPhrF2cb)D-xdK5zn3QJ+y_n z`8ac+1ZnUKY~LMP-iELl^L6w>80bhp1zt%LJucDHan#Xsbu@#QXSh7G5KcP7ERfA` z<3bWMH%+Gp-0A8*_%gOTheXp z>>RAD91uOc=K=3_r1{Y!8Teytyr7;=#w@&-B1!Z=i$i-%bAXPQMVP*aaUz81K?iXa z2ftP7U=O4rbsrtt2wPZK;$z?URD*}_U9A8rP9EcuFr*~TNl9FIJqt<%KV-0*XJHOM zcr*GAVuRp~1W_3afS&Zhi+^MmoeBBF=c9pccs=I$^-B085M4&{gBJl=KOm6;5RcS& z=(1a14MZcAA)YwZ?nj|M_T5@T=iYrNbm5A{mP$q&pr={ zM}Uwaqo7L^AQ|9?79gd>$gI20o| zN+WudMli&O7&1JK;3$vahzH6eo+zNQD2?DKxQn8`###`0#Q7`kZ3sLO%_U+k5u@W^Jdk{mk3oU#sVIj=-;zj+4qI>){Lb&k{jryNOn{v0EI-7``QCf@e(-BP&T%BXoSJ_P^oEg&Zoq9b$|7!Y|< zSMj+ZkN}cTMr?_^JrRc!G07yI$deX=PaY%@2_z?wDFpF=Xys2_wTOIQ)2I+ISd+*R zMaxwb20Ap70%5;Tqde-!Jd}Vz7k>Zo&q3cau=`|}|ARlq+4TQ>PrHTylaiZ4Ot++v z@RpE7Bv6ka+St$Y$J7QQ%O~Q#)*z=%jxfp1j_}87C4bnOPZ;&8laAcl~IDs4>Jp|7pkUuX4JPA1PCK6lzE#azvOE`icBo&It!U&zE zpfC`lCPMrIV=^d4c2LY_0^>`>q_6NJ^1z=+4X`%orOtN`68Jg}scKXIPO|jDkTMXFO(4+_pde596H;mM!#0wL1U@4C z+7jvCVLu!ZMhW9{6A$x z<6!OiIW{ya{g$GhNITj=UPk8*GijRHAdHq0@BtCLa=vN%_Mw$Gt{!K^Y>B8G)BLGv zTEf=zq&o@tiD3niCy%WLFiiQWz(2|a(pOk0$kKk~blXYuf56CnzJeTL1iz{%Zbk80 zm_T8ID8iq{;mL1X0`@0u)TWVrC1ZjPM#!)9X%MwA5kLN<|Yk zA(td0Q4tmPuNb~|88IvvnET6{ z!rK>yf$@|mVMTB5Z<($@FHkeQTs!&TQYz@#E1>pn7GR4Oodb18UzWfE=FUwr!`5O~ zC+!uUeXRu2FINunw%iYCk9nR+u@@R7!5} zyh10dNh=jp!t+z+DZEZyZ(DVizOS{OpPG47B541ilvIQFiwbU+r^b~Fb(Ol+UUczz zboNt>Ci(H>u#I~pux^zhQp&y3--ZrR5vq24X~8IG;br<>Ok7NyDl66{loC>h2)~I5 z;gx$K{8ckm?&#_qDx>&CRr14&Pw>*c7(q;d#BUI>^sr71Dg_arJ1x54{^>IX`_PNh zElm^==*`Ps41O@|S>0D9p~UcB3-otd_{T}tnZ&yXf}St?=IO+EY3(%evbmG)krA{7 zCC|Vu4IM1!`g4#s!VxRm(i&$c27Wuy)fONLVm=A?jaLCJJbS|?z&$C^*dPf?FAUu_ zC;t;R)loKkmN+n&LecUP9PU~Z(RN7q4fuK92OQe*Ax7NoB?YwkUj_%%T!qtyT?H>pyoCPvGtl>!O9+L)b@a1Y#Bft2Begn~st)QawGnif~3!?0L7jOIq4*Vtq zg4JYzz04;`U{K0DD+C)|v5@m(pwy)se1>IBw|9F?&r0deyFqy#ECj6z-`2cqRZ#2+ zdejN7pX^z*fC4HhLZH9BOZx~0Y^Mo}99uyaTl(%sxd+>&K7FKSuqE?uO$TKLd*reo z4h71Wc0>xV9()Q?o^2OiY8?Sa*4bk!ISn9tr~%-M{U%KMoCwO#-vRbP+przNp&kOd zkY&i!x_d)-ENU9K{^vL>R%IDxsYwAofkTz;o?!2N4xLH%28|2YYd?ko1E0kg+Mab_1I67r-j*0jz>A;EGEx zh>(G|u-AeVc(*oir*J}IFPME8EVS+gJ1zmHf)JS3f|PH)U_u+vi+U(L{6Mn%uFcm4 zHoYLuX*?t@2m#3_grJmxMav4oGak4UCj>N zvrRjN6;+hhSp}co>j1Z?Hx=#X;34a_@PoA@c$fKT(sO<6ZDVcbGexk0cfRO^A7Ctw z5gyb72M=6Zv>GVed99Vi*ljx&mY1CDEqv8X;aB-A7KCaq6zGkMV8=Ejj}>o`g6}$r zWq;L%e|8U)6HF3J(wz{_ql&-o#^OMnPH%m5Y^G2E|9fNH+fC`{s_c>-B3Gt?y=DCQG`Q32-T^*!!^~1kDzJ}>lq;&Wi9OZ*wrIGWQb6sw~O-PMW+xG z3VR`aPcPOf)!PfR)SeMk!w%sWA;xUOnuQppNl2kkp1czIy=PLL7F}Ww+LXTnu}qt1bc>hP4=GRGsADj>^T8J zk#ssORx&JMa$y(ASF?p9SpG4xV<#Ja`1BswL( zNqv>>koh9pF4rdiS>co7N2ONf4=OD~npNMcy&L*=Sd;o2jn~6pX};8YG2*Y0&$XZF zH0n0!J=L!_s2lY}LbBUHyYJ$9cN!(XniqSSzP1#qXx@*hr1`g-l(;Tw3XL3m(f*v z{ZQ-k?S{5qHKQ2qkLp_O`cI7PEl=qF_DN_ozWue$kt^2fz2Z-%U6Ylwkl#1v zp^c$lm72{hz1tFZTqhmu!5m&X-hX9qSJn8Q`3K7{@5FV~43v8$_U!C5gKstrg|8F* z2w!zE6~1oB48Cs23cga{psYK5u@4Kr=19y1zS%3%6u!921ucR7;cHrIwc-EvMkXY`OUQmV@i`^?XzcHo<=ajVUO2n8*<}y*$}a z!RLHSICY$H@`+RZeTwQb=Ss24ZPn`Z5Qz+Va{3>4zS4a!P(bp{E+MbzRhK{mx}A6#>QW{xXY9mYtc&P3?Hz(&98MHMPV1 z#;objZ=C%wOR-|6>HKde-xUFih2`3TfAoxhZFJ+d+0%7jVpm70%V~tq%%P!)Ti{ihF|ay?DmKlS&P*)WT=qcisW<<^zI4;tLm_d86Zyxzdcq&Y zdr_yDU(AbtIA-|%HQU7Ew;3GpxUs=p#)G$OO-|0SIIR$txvjdD`7OKg67puB%W{7U zIJG+b-GYS;?2cRBpVv-V2tv1?XI=~4ZkQXu$O@^euXplw7}>L@Y_`@3yXv>SLTARb z)ZOQAJ4oog(pvEQnwz(7t(X=qcXdam&)n^^PCLD{T&S%WWZCp$QtYka(}%9yDK8vf z*IKpnmd=gq5*uGMdRgmxyE1GlBY^4q!TLYz+OW_qdMZ(4-@Tl?ZK{dF#x?ZKv{BxsiV9x5fbG!_PAvcv z_W2s}UaeSBapc1As5KL=ZnQHPGEVW%5O4j_-j-e)owIi(_=odKU^P4&5bnvPUeA-; za_}P8X6j*yiU|{ntJM@9|Fy1BPF+HdDuFFsq8aUBZbA(|9bfu~OzFN*2ZQW@lE`eS z!iYc4c&<6SVD@_Loy#)U&OQ<%H|2GG`>j7F3tli@*>71Gy#3zIh=Pb)>yE{QmqtlA zUs<-xt-$wTMuwHaR9;4Om+O@eM|!rZrkp5Y+uz)tKIL?%X}l?8h?2buGdRG>e|A88 zzzmk(ab+j(MtF%4!!$5VGjsT1S1qSHH3|i5xXoTWn|*lQow8ZCdvu0j{uvF|u*Z;c zwDK}33Z^4}oie^4d|CMPl7oo{&z-x!@I%Vs$IWLRJr?@6H#hOC9?#7`>FZCGjuCrs zBVgND?_dvX@dWt#hR$84N_LkIQu6cjHiFFYL&i%>3&b!h6&)>1#rhJaGba6mzMk?q zD<1Hs@Fkv)@XAhl)w+8@$F;8YPvTBJsQqf~p;>a`NnFW^2UmyiOit&xnlQG1w$T1# z&#Sa)@kjocnSMAnpB>h8C}h?7sG3=swMN|7YY**=9F`?Loxg4Nx%6+m=?`s8rqGTW z&OH1g{rAn%!?J$MH88AoU-mH6Cls9X43gD#oY2j?Q1{HrObP@nVgUD5t2XVEa@$<& zy{JOpO9@0INq9;Mbm&R1c2!M_UbCjk>Qjlk8%1Z0go=ks!FJc~j>k_VyO-TbT$7@? z_k@KujA)2o+cSW$`-7E`Qg_th12dPcGFfGyTOP0C%5UP{U!A#$YGhEoUoS}6 z;Q4|@M;~$}CUz|-?yei5F;!IG7W;-4^H*ZpzWcg(rlb1z>T8z1sn>$C}P z<7)@{n#6>ZztpeRm$2(g)US=yHhcKz$JXxg4HqtIRNK?E4Cp{M8#gykorrtA;>`l0-epRut z5_@TxoGdT|7kr0QZc33izY-zO^!|h?Xo?96wq_}1l}i=cUwJwINqzXDj^otC=S;iu zuL>LUT_1vK?H8}8Z>Sfu&yL8lzv8ata(3pvt&UywDU#H{Ne&AWW<2f(N!>f zWu2)j)(94@^ctzVr@*3zEuHuHIG_wUs;=a1A!jePxDuT-c~w$qV*pnAc9sritEY}> z$8V5X3N|b6(iyYC+U}^?(d=xnu}IvIHaA^Lcd?_vw#(LSilciY@Tg`u$?k=bWz;nSr0>RdWV;v{4-JqQxB5JyDJ6%^FfJFJ?T!Hvet_pJ=OY=t$|MZ z4l5&Z$4HHvQd7k)uTcBsYzxY(rL!BUS>mqQ)1(@X$OzQtg0(s63ACgY8d!!zguaq= zZBo^;Zlfe6Tb1-ZGqfj^f=d$@U{^9CvDIGJ&0mWdYkZ1o6)zvROOy3@$RUcg&*g0^ zZ(0Et$~}9_XKmZeAD0GPZlRyt8Fyy%nBWs*E2o~O1I6eatBSVA=S#<_Scz}fDcZK! zMI}?INqbA@x7WHlqvi=JzpT4Q^%%85b<~Jq_78RMhRhe&YIN3fmOMKw!kp9VcX8jt zRFBHJvE66XOTcsC3XM&Z#$1^D^7{Vbv`a(B%~6nOTOSSdhJS3BBxTUjaP8u9@%O&j zm&F{_OB+Dl#05GOaoaF*O#&=<+@h|LilQi o>>wSbkzr#D1Y$sX%v?Q3J&K-6%2WGbv6~l6?hp@$&~euP0&m@q&Hw-a literal 22013 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 literal 0 HcmV?d00001 diff --git a/Content/Buildings/ModularPanel/Panels/SizeablePanel/Build_SizeablePanel.uasset b/Content/Buildings/ModularPanel/Panels/SizeablePanel/Build_SizeablePanel.uasset index 7545913c59a575654804920200441d5d85583ee3..ed6d3e99b25e938532d32f6c0d012ede449e8085 100644 GIT binary patch literal 428496 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 literal 127801 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 Date: Fri, 15 Nov 2024 01:12:53 +0100 Subject: [PATCH 14/33] fix: Remove Dynamic Material Instance fix: Changed to Late Creation of Dynamic Material Instance. Only if needed, eg. User set an image on a label interface fix: Remove invalid material reference from Sizablepanel --- .../Indicator/Build_ModuleIndicator.uasset | Bin 160605 -> 146218 bytes .../PushButton/Build_ModulesPushButton.uasset | Bin 698925 -> 695853 bytes .../Panels/-Shared/LabelFunctions.uasset | Bin 710480 -> 721512 bytes .../SizeablePanel/Build_SizeablePanel.uasset | Bin 428496 -> 410049 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/Content/Buildings/ModularPanel/Modules/Indicator/Build_ModuleIndicator.uasset b/Content/Buildings/ModularPanel/Modules/Indicator/Build_ModuleIndicator.uasset index cdcd067fb7618f25c8f34f5e5aa879e886fd14df..b8baf69ff4054bde64d452f811d7f9a604593c1f 100644 GIT binary patch literal 146218 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 literal 160605 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 Uf(wIgs5=xreXyyRMPm8?0~fwyR{#J2 diff --git a/Content/Buildings/ModularPanel/Modules/PushButton/Build_ModulesPushButton.uasset b/Content/Buildings/ModularPanel/Modules/PushButton/Build_ModulesPushButton.uasset index b4ea985648cebcc92ad0f0d0ce206c6c40e21df8..5f219af37f2b79d009f1de32495c16376bfdc367 100644 GIT binary patch delta 14615 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 He)0Za47^=8 delta 17199 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

C-nFeE0*t<9{#9pPhG)7T?u>M~gph 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%0A$`U3s6wG3J;GP5B(2Kx`s3LJywV-2b^QEOoOW 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 V9E1wN`=)8{3deIgvgI;J|9{HGjj{j$ literal 710480 zcmdp9A z=hrib^UgD$;Z8ln8BWym?(`HD_4j^!1agZyP@TlP@NYy0ymx z4?em;Xt-kO$0jP9YRVfXl-I>;^8LTb{N9u2lsCjH^T(9Wir17h)m1cBC+d=dY2#fV z^Su6I7L7muAkWLwv7leUpn}0g{RZ|e=vzFb@9^Tj{fdSZ4jDAO{~-el`wux-Svh!UqpLpMe>;~}HnJ`mZ)o&R_-p&TothKJlqVZa=82`he4ENVCSEtYagKM}pzjKr%bL)T zs29RwZ{*$osNM&NZs^$_bhsU5C6uL_@c(nlj5psL)!hbCk*ZbM+&?>N8dWWz0PJ0uc=8aEQ;5}kv{L2 z|LpjAN0JN6>!u`T&#sA2t4>zWs;;S4)yCh|a|?4bQ43!Rnr6+aiHnzY@k(!gp99A1 z=0BN!(|@`q?oHhPu)|=?tP$nO@eAS&4b_!A=tA zB^Fm!HG8|$6O-eO)5>d_ zXo-7b+RGpPV{eKY6Q5mPv3OiOUO6S9XJ^MJ&x_YgidQAQ^Y1wJQ2M<uVkuwzq|R%J9p2>vpCrpubmceNYZ&r8@D|u19-~f`nb2l z&KJG6FEtulUKt-=CEht6sM?d_wTT7gHD0H;XZ~v|G9?lgz_=ouTJv`L_JU)4uDQJG@TO#AqPF@3 z^}?J_{}$tJ!Gvk$5_$DZQ9N1EP+ji}<*6OJ?SNFL?v9N&mKT*bmKWDGHZ1mDy{vwT z-|mKZ`MhcIipE4k|01vIe|>M>mby%ylURtXt$pX4!%ad{MMXTB^p;;YqGww_$HI8L z-n*x%&t9}~))b9~`h<4e1JMq^U>P&{R&@y4=|>PzpMU9bJ_fR^{0 zbx8(T@2|_tx@5`hE0~O&AO87|mvm0gnd;n(eEo;dIH6OPeB&o&Wc%)oCHZ@1WJ~9L z*>vyR*t30F$uPqky3h3^yQU*({8yAWmQ8MK(Ep6WP8lAX+B1-KL0M6vNpdnJq1>8c zGafj$blLjeEgl$CT^BEJC`{BO8m1)tL&ihvst?$vdy9t*`jiCvG$VW7*2`9CW={2^ z>c61ON}tAjmTFzO?bfRYWIQ6KHO8%0ck140`;5}&KXAg187wHOULX}}nP6Cv@xaWd zpS~>Pf#Ug1B~}KWnarqWPOqQq_%* z?a?`%4aJM<%j+s9lsC@F$hTqWofUcM`7}lxlQJ?6A8_=Y2WDjS`P#5??yT>7`0V|& zJ&|R=?z>`1=L}Ak8g#?UED!AS(6vJ|Bx9te=Z40T>YDiQByyygq<>LH3kK!&o17tg zBa=n(%4&^=c;)1HgC@+3?00^2!IP-;W*sszDdkdKnUU%14sG_wh;7a^x__A_tV!{j z^2X`~@kxnB9TRnBlTm&ns&ymTRMY6qfBp8A83R|=N(S!uip!qK=$0|krP(yy+9%2{ z?v`EwGH#S>&$pjHK0}no#>Ipyt|F)83-T4?CTi8B0ip zsw#8wAFf)(l%Fwacn>}@_YObb_;E#L<75(hYrpH?(>z%xOA;fg*X{Fn>0q7=&LQ4I zU(7qzpPNzTX`O1P3-7J>FFzgg##i-5FwM;19eU19k7B@Nodmqke}4YO{kYqjzW0ho z{o#8b!_PIoVQPJ)nCN_v>vvxf!_p}7ZrggnPP7RFsBliaVxE`$vqKo2H0_kahztWmtdES;zg6ezQ+- z19|jDO>F9h|B#lh!RqbP_x->5rJ4ea$+Oe5-wZ%%^;lOnh zR{20gWe%3ljrjQlG-u@cr#79lP zGjynYEaOStbKB2<@p)O-RO?N9YI%Z=E7k=@dNo6RsFyU=Z>nwXi-~Wp9>$Q{h_&H$ zy=dl&!2NW?!YlsIyvvZS;)aGq!`S3(Z}stC)iXN$1izme_wD9@e1#xbsP5bSz<1hmZRz7x@c0zRbT$mt*F?P_2V5e;pY3OyDDggfcNbe&tGpc zH8zx&)RfOodcU7o(go=)@t!&Sr?-Hwl79B?7&&(|jKIuLlpyYHxqqkGjFXa)<4~@$ zu>3$1`oR17#y74*76SL0o00UIKK=L>s!~#2S81g5ok16jAW%|OlPGWWIxJrOXB2P= zSIxco<4u4631O^C)F|-a9e8x|H7Zylrh7f!uV2ISTuk@c-uvWecQwPi`>vaM(M9sz zE8<4)`IYs0Ox$TAGE*W6s;jJ7>}!B6pZU}Fu--YBeupHzqMkhtM|@p!b8EaCj^5A_ zmX&%9ov(O|M@!>%@dgc_%0lKNZ^bs#r_jM^7N+;if(=9ctSHH5uiX3j!wvq7;uq?B z?rTnaenE4_RH66P%zc??i8U89EE4a3Z!3qL|f^fWPdrwj5TbyJh^ z$&*S8ywA4y^h(nZIbPl?D^~v&VHuh1tO4BFH;KK~iKjdIHA>oqGd}KK;g=aSvAxoJ zKKp|3N_Iopdo#A>(~L!Pn;F9Utk>D?^Zg{$ZJG7tFq+Cz@jHTpe*Dhe_pa=fcPH-0 z=>FLrQ%J8Y74unj$dm~OZ7eU9kP%6gFYS>*j~DNcw$1`SYqE`fEZn8^^KPj;W6S4Z zX*X3gmIZWzuP??O@!$XJ6()DH_$R%K`*zy{C&kuc^1|xIiaE>&Wrel%t{RsN-{l&n zK7X_`k2Fhy_nXhJdYmB=2#-H~^an`{5 z2@1x|N@%hkdRWQ3CQqWiAW^y4oATrh+mUB%c|}9Q%pvQ>?Rp1wP9-%r$h-TvXO{51 z^LV{4@BVK;M&;P@MRfa!c=hZ#jouUeFFqTYx2Z=}SIWv*KYZNFOqv^Up}e>Dp73|S zD)HJ`@djU^d^>4=+fbtBgM}=i|>Adg% zwr>I0{!}+)-{LjYlxjC?kkkIV%_!#Eaq)$IVC|I&kL*qjb=_>)y*c#ZQGS|6uk%1= z?qBvbjAv;2ta;`3Hn+hV5-itmpM2N1F3*HSa=Q1-F=uX(mN3I>DETsuX5yiw_t4L) zYS3Ic;N! z;-kNeahdSrJG#957lw#6a@{h<@VD<c7)Lt|e zrkkA1PS3V`XJ1s(gz}1cnkmOHs;f`%!yr^8S&mJP;Ydpoh;y;uTHG&78uf3BF{6P~!6eretw z>-}zWiBlA0S6st8wD%+DAT{z3YrJWHyrmDCY*M@;u7FNKTn@klmb8|hJjUESyA3l>096LZdq|Aj7yJ!U*Fi}Y(`77U>97l=noiZlfA#6 zJK> zCXC~~dw2emrZtTwRO5BMZkwB6wO!MYy=+AU2WyKp|Mx9DIyq5g4K!boo_gKe*O}xd zS=Y_&d+wl{N>MtK6HQDR-`uto)#6`eD4q554sOrnDf7Vl&GLUe1h0@QaFe?jR9Z0>Vlxy9s(a7~JFV(jP&7>K}u>bG( zBrG!}URz%#qqNM=DRWKhy9%M1g(&aDL(e>z6_Ms#V-ksaSzD4mSzXQ9{xodIb;wyG zcHt944&Q|f7^#b4)wGNYBOh%CpK&+ZmK38Pn+Kscz5nY^FgE;qbv28{h;C&8GbUb*ZSze;mt_bk2VRezCe%ABU!S#=8O`7ZFi zV+P!Z5KNK%Fx?yd*U<&;YKFJr={^Vea8f=~qg$z7?QBk8ZT@`H*8S|Y-@&Eb$7}~Lo7V)V_O030Bq%DWLG69@&;Q*F zi;jvb0QAiBA3cFW(%`T(@?FmL=GGD=!x=JZZ-~LN_S3W%UzQcGfu#H5qk?MM4OJ=Kx z!l}#$`6J7+Sk31@aBVFzJ^LE4^NAF5iYChOGRJy+HD&bTl0Tyx~? zG1apg$`!zV`Q-Vl5IZxQH!fUsp?}2!p?CX*@!33U4B@}U7jtIznj37_&|>x`evyV1H)w*-e+_@VWj55GJUnOLhtgnyS|fA(%8ZY zDNfmbSaRitTN$=CzUs9}tUV4PwbvNUc(;rI@2cB73`Ml;Ju~f>jqdOL?ujefF-D8! zzxvgXDP*m(8Qor9=;O6q0`-o#?y`R&dc}nC%osWDhS+h;9-3T>%PZ!f?!5ypJoa%E zhl?$F4gY=UETl2DaCYX(`t2Ae*@mS!amtU6UPmMCQk^$^?V)E-U+W$hXoSo&Go82B zkB7a6`CxAqYDa-DF3p9%xvZVPE1zW3ebzx{Ksw1>sFCRX|uXz?+bsHpZ&3##ih z0LE*_QMm@9xBCevEKRFRS{TE7ufvw>;hinYkLSWh_5%(7`o?qd(9-UWtc$z5Hy!`= z3MK$|7Y2LD>X;&@} zjlc4*w5m#H_+0ayznQOJ_5pKNS+@tR6)Sh5}a&aNAtN_#XF67eQ=dh>s2J>aG~ z^xoixi!RA>OXyz1i#r$iw_2){9S*tbd%r0ER=Ossxx0NEcqtAe}dl~BD!OD@BqzX*e64eLyxrQOzLOHaXo!ko6r!63Rt6q8cBJ{2^Qytsg z*0)FZetAENN!@p`#2L%4+K0+z(=bb4e`rS&d`QkoO*^BeEnUf=cDsqZkCv>xm@#Vo zLoZo+W=Grwd)=IGb+6yX;roP!>RS2A3y2-q9e6)Hd&bK^__l+F*4fn$y~T_-xk3@= zRJIX&RF;9@Cuf>uT|V1-E#t;a;8t=*cU*R+50hyzJo;$IeQC3Atyl-d)#S*sHki2C`bVXr8&|9R0K$&rfj+eFXZ4QR&TZN{Qm(+sXw26MKs1docDEXUa6CE5&H zVbA~Tp4QRjJKo;ALiw(3C107nce(N{$dYe{O`BV_J6GG-YF=W1zLgqU;WWG~E<~ucHz9k{^Ee)CPw2=8u51DUS$b8E~=35am-x(qE zof$IUSt0YC9Wvj_5cw|EIAUWtpY(Aa9B<^iB4obr4P2{u=ohDJS}T`)PS%?&qq{%Pd2`!=OgUNXH)sG5Bao~?_JgJ*bwz2Ul#+nNj$b& z^Vw9nJx#Vv=Bo&quPJ1{`61hTc1XOHA@kiCGT&Vx^W7aX-^C%@`)WwMPeSJVU&wsl zhRFAh3L$rf@?}o_tlJdPC zGT$3n^0|4?*>c!_@ht6d`J63BzN%L8Ia`i=vs=mMY&r7HX(gYt<;YjvN!)Q@~uXUX@W(rvPTNRM#! zVtHF1zKrZXRLNG$B{g3QDg%oQA1Lh~Y3Uc)hlwvPA%i}@?3=|NdXz=GXtl zH2&ic-~&+v^&e=42OD~m)fIi7c{o~p#0Gr-yIMM4{m0G6|2|Fr(L1btIQc)?22Kuo zGg^En{|`~1KFj|eExyyA4*!S`qs0de{#RN4eD`s*_)h)@aH7v~Uv54=ulO-2=Jh_T zS-JjA+WGf_ucO6x{deNT70+xe!|wjt-py~37hzYt-q5`$Dai|M_YgD4!vge!bJLM zMvKqRDe(Vo`M+CLwD`_`c*WvxJuh1Pj<)`B%bzzB(c-hc3;x_<<>#=bXz|&Fm@c0m zFNzkQeT3k@W%+;ANzvl7*Ax7sEq=q&Xz|%v4gOUY|If>##bg;Io+4c_p zBUXOyI4@d!HkN~5ZRp5c6_~dS+w|68+@mBO0SLR>_^1Wsf1%}1r@uyvf1t&m zZDB8aH(LCIEWT5lKm8+G{C*bS`FH29ixwX=`0wPW*H_Wv53=}9eg^+9TKvHQ{Lg=m z7N2Dc`15ZId+jzh5Tvx$K4JC$5P^W-#?Fryw2u}aH1M7NzobL7_+Uc^+VT6%p3&l$ zTKopfpZ)fW7Jr1rKhg2u1^SfU+9z!PjuQy{nQi&Az5lk{){xD;u=wLGzSEx#y`$yN zgaH0${i4Np>m$zpnmIUH{7JU{r(6C%b7-{qQ!M`WR(?hdixz*X#h+>GKe;$sd>8+8 z>o50>+}>E3AZ-S~C*eSQ}$z8k*||I%O~v_3QZH&vPQ*8XOjzp~*w`E>a6{=E71|0Ym>zSHZ**8#TvC%+UezN`O17JtpF zn~(o>TK$pxQ`72yn8knL^=R>3{l{4Sx$R#!AOF8;^+)cPsQy$N8GX#+PjwTq(pvju zlb`>j;e*R}r(OT{WuZ`?4j*oQ{nPQ$3+ecSZT*YBjs_q8q~pKBLXSQte7E`d{|@kn z?~J?teGf+IGkPa_W7D5({7=V+Kj1t5ceVUEaF=NDUH$jA_+xk5eEhEh{NcOu&GonA zYtCNL;M2d^@K^2|ExzMVS6lx(J8wSzzXJT>9RZF%LoEMa=^8CQupmyf_}le}1|RuM zuYVhhe@w4v@af-l{CzBbS>I^!UH>}%pExjDeCOZg+4`?NBwBp8Kg8j`eps~lZhmq6 z`F2>e_^<`UftEk{#nIwB`_u8KVq~=V&OdVa%f@a#{+9v$z`H@5emDj})#rwZ(c(M# zPg;C$O0@VcKI7`2oE9ywD@j+TA}UV_sXKh zclyW4PnTKI;=BE6uKt%+MvL$Er#b$=RTVA1+n?s@KcG5Ve78T%@qfX*Xz`u?clH0Q zHd=hQKh5Fys*e`m?N4+3Ni;-@@Ajv;`hVCMExy~I=I{?#7%jfrpXTuAERGi6?N4*~ zx1AU*zT2PX@c-q%``OHut^LjBe`TA0-TpL(-)~8@^>_Qz9Dd_z(c-)PX%7FvWzph0 z`_1A1up(M~w?EC{AAVM}_?;yrAUgadE2G8F3*bL>ZnXGa0{B~B5G{V!0RG5}qQ&3e z;=B3xoJ*p`KOj*5PcMrWzgqzRz$>H0?;gOfT@@{Uj{yGNtE0tt{+AnHUtbd~e$PPt z2d{}1-|eq+^eoM6Yy#x41-xe)?p8)>qJEFzU58%Il zSG4$j1NdFnd%LCEk4+!9Y@w;g82L|x-AC4B^?f-QAX?P@B ze7FD8;otvQwD_!sfavhoKM^fHXzBQeJ{>K-i@&-0pYm+9_-=oK!++wrXz-aA)8l&% zzs>W};=A~s!!LayTKr&q;Ov*8!AI|;^T*APFT4^hevm&s{t_*IRY3mdy%8<`Y>V&s zbLU&p;?D`xf7`dC#jg(Fk9jv*{J8=A^WTdWe_jCp)eoY@uL!=mzdnFJub(F`6h-%x9QKO;j_TKrQ3_=WAF#a|M@U(r5V{G|c> zKkghY{%IE9&5t{Dh!)?iFFX04y<4>Srw90R>mJeKFALy*xmUFK%LDxHyKl7kD+2Xj z*(qB5GXnL0F)v#DGXwZN_m39;tN?$Ob&D4N>;V2BdPIxAGJwC`LDAv|_iv2t9WDO3 zf%;#NA1(fQ0sPncMT>ua0DrfE(c)haz@ITVTKo$wzSI9#9}+G8MS=Q%H#A!Oiv#r^ zdU&+>mjv)HJu+JSO9S}-9v&@zaDUY3qG<7X-#PZJlb=URqQ&Pu>FM_Ko+G2h=N--I z_{WZp7XMm{@Az}g*l6*C`_q0HA1(fM0sb65DO&tB0sJLXqQ$={!2hSFMT>uPp#J;K zh!+2r0Dk!~(c%a9AO7~ZXz_#l4}U3(7T@hZbpA!btZ4Cr>kG>(qs0&IKYXq#T70+v z(D7&c>S*zU`wz#>ixxk)|M0@vXz|_tL#Lnrl86>Rxc@M}AzJ+4{=vSrcYcL~go zYgR;yAKZWV@tM)$yZwhwKlfM}Exy}-==9sXbEC!Y7U2K0=SPd*Js_XkUKA~Uk3jt^ zFNqdExc~5`%c8~a8L0odE26~@?mz6kDq8&D{=oXx(c-)Pbt~Cuq0fESM2jEXUw6cs zXz}~0&guT?(%(jlAKbt9^o`NtvksPC|F*Y8iyz#-H|n-%@!kGCr$5iVBU=36{s#_Z^e%nC(?|C3v{KGB2>)&sF7cKq~0sQd~M~i=CfIqiB z5-t9)0REScMT=h$!0-EHwD^Sq{N&To;ui(*A9yxe{Ne!q_s>O(UlPDS?D=T%(f#TA z|I`qQxH*!0-8X zwD{u!{I7X8TKw^W`v2j*Xz?cm@VEOgT71yb$M4vWqQ##W;Qs}mM2kNuQ2)>W87=6>*Xz`B<;7|G{TKwq&{#^QPwD>au_5b(! zXz`B@;1BpQTKr=I_zQlD7XR1){zJb+i+@}Ie?x3LrEK~WcK_$`f=bt)N4AL;zbt@% z+SbwH&kW!{vrV-4#T6`xzLm6oLJiano{OyHF{|=-eeSSDET6`xzKU)6uxiDIMxBu4R z_q;e-e78T);qQNGwD@j+n#1pOd9?UWe>(Zx>&j^Ho&FqS<)_`MXz>}x$fv`fu{v6O zr+*xOZn!2|e5OU}@9?jo*_&(|~?knWo>|??XLyL$vr#zx~JBS5Ms< zExxl)T>aPH6)nCSU#|YYTN^FDlYdwLTONuQ-^stjzvIzp@sUl);otLAwD@j(IsE&d z+kAYh!c<%HnP=xL)|jn%;yv`j=Hq{yHohp~DvM9Kqpkh?Od3A7Z5Fa;d<6ANMuIM0 zNK50n-{=oV`0wh!)0>-Lf5G@4Vzzv5^E46PujD%_=ZUTq-6eWVbiU{U(S;(u<3OB( z?+UP=jXiVhi)8O*XHh2+`v9k^vPX%giB8oudmE?g{2?757wsuxKj;%8z87$r=yK5& zqN_yg_4}>pQ4!yJVDJ6aqSd0`h^`S`E4og!Ms&SsKT#J^SJADa+eEjE?hs8<*>~%B zkLX^}eWJCZ`$Z3kP8a=7^napddwQ*|6B8YMbf*JtSX7t!mYaiTXwZ;IX$y)Ei3>Lbb*!LwaNeMF3h19bdW$1$Se zqE5O-7yc-kEt)BsCMp%p6-^OM7ab;gR#p=>L(f~8Z0_kbcpCs(Jsofv*-w&A1N9p8ZIgj?W*(+qC%Y) ziQ4OYCsDD^OGKrj5u%ZzQKHeJF`}`eaiZ~}38IOjKj^vVM1K_hN%XwvMNzS6wCEX8 zPv!fYj{gvC5N)CBEk$iaZAH6^@Ow6b%(si^@bVDE~X6 zcSU~}y(fBK^ns{GG*Gls)F}E;^pWUTJ@>JWC880ck)pAp!$k*)X6k;qXqKo#)TFee zs6q6J=u^=w(LY6>iPnie7uAXCMe{{ph{lUH_Ss4|+KJFRPwRMqXn#=~(T*bY3-wRf zG~^4}7$ri6w$u@MW6Y4ob32QWJKFk@h&;$J@=Mw_BIFkNoTTHwM3Y5diD(n;q+T6F z$T4}iPkLKXN70_5(?!>4zPm=pCq$QvD1SE*>8o_?EFx`pkxSc0=iuxix>5ud_pa5E z`R6$taQKhYy1=8i{oyk10mDEBwYcZrVF z=U5Rq`-)sTY2biC`@p+Glqb4XME*`9%4J@pT+%v=z@Y75z;mAAS+KzDBI+u-Pjr%K zt>}Icbt9enl818c7LmTc2wY_3DbaBv(hm^1^e1gPWpoow6HO4U)^l&^h>oYvyNjlX z80%N+9%Gv^-(P8iMAW&5s8)o&;ToNZuAHYM?L1IKxyR^umQDLf*Nm6LMT`ZW>m@>N z;ScrgEh-h|i@p{05rN0?D&=8bAP;%T!#Q<5K;wG(g0C^auA35uul;`#{ku-CL<6<-(h*EmoOLqddxfO@xl4 zE(eR??Q$JyH#&{y!KN(AoFgJ_hzLxct+Z+AOw#_UBWcv-P*Fkz9%URR8YZHDnX{Si z$OrH1Mf3ysM~J|pZLZEo+O!Ir2Hr5yR1vt}iMk4p^x-1(BRY(E8U05&1tQXlMU+!0 zqHXZ|J)2gPmiB?p!9zxPhUeFbn72qT5m8Q^j+BGGB^_D8)AbBN)>}XNjl>d1vZKy%|$rm+6@boxdXLD*~VK$Gtwf zM>*u5A^JiTY%A?KS~O1tKF^~oXb<)l`h(|>6@iKF-ADA8sI!PVqT{%CfR6i%mWfD5 zmPtp}7)!`FSjac{j8kk0(vfw_o+)x=({^ymMc~lB_eJ~Y8PaEoNKfk6AX*_J9e%iS z;S<=TSBk)9+|q}PY0~2&@;B;;4S9}^ZADc!o&KdS&lF*AHtEQ7$SKbuzu1ar*z`Fz z{R17*CCf#$jXtIPw{@hyNn@Ol_CFm7TT`l^J=sMADqTh*b5K;CCB5b%Pb$m*+t>{G2N|Ce0^L77O zU2ml$JuRY)Q$?#p)bAk?X-h=d`1Ij;5ot?B*#4xw zq;uMRn&@KDW1>!?y+m7!P8VUvbky--(eFk3iNIMVqArX_>H^Mk(ZM2Q()j_TuMoW> znkB++$7Tlu8HU%hbwp>9cBZIM=T$nsAmVvs6FEgcFiz23)bDH&z6ND6PMyC24!niO z14XozG{)LQoyT>=_a*II(T$?>M0bfOk8{##`yM)8CL-_oBKrLT5w<94oRd!8D|967 zLJ_iYk;vuaoOJU2R!8~}o+DH6pK|FthW_|%6wa(%goJRC`< zufU=%)a@z}eU>L8-<2Zzmv(W@ee$jq@f&Voz2->T9rl_dY4_M``jY(gE6*cO z)CU>h`fky^BFf;J=fEJ1I&dTnTc5n-xzApAvDfqyedez3*E#id*PPQ9(s`b~q)zlJ z*T1vZ|7Wis(vd!X++LGTo`>x=6`dxc{KrL< z$vEKp2@&x`Cnrzp`UKGdBJMwBulKjtPwUuDbc$#z(K90SC9#juI{!?>bI*!S6g_9J z|DfX^MKR@r*QAr@7ZK?^!;y6Ia{VXKIOT6|ubVQ=&yifc8TkFRj^yD;`u0jA57?ALp8x4c8b{Lcx98e4Fu^}S zX}xu%?ca&!i3TWbn2r-fJilI)5N)k=#tG$eB%Sti&3M3uWNh#Za?cppNic7;yy7S#&<6rsRR8@ z-}e!9uz6?$c9Y+Bn@&D(!RV;-Jw@mtuHE_oattQvCL+%sx*nk8T$_jIkt^~M zZz2!RgTo`U z*Z3UBGX2c`zB)24(NA1sn=jJw413+*<{x77Gyc&9F3!X_^F&oP{~(=%zf?p!7`u$) zBXlelQ3hj`F?xu-=15vxY22qQ%3Y#!Fqk*yixMK{5%L_WbLu%!N3QW_$LWZU;+pzV zS7ZbX%BL>7==?|>$-|NKVfLCMY3Ld557+shbu7>k434Cgh)PA|Db(@bI-V)wnm(uh z(Vsj+n<=-0&PV7-9-aqlSDkYW7S}u5Yx42jND=ork~YI$kJ2$Fnr-u=Lx0ry7<->1 zX-C`Zu{yTb{lD1!<8+M;^Cw+XN6we%NL#r_ndpwKM2thO;WIoxN9S!tKTBSp7fn*y z-nzb5)Kzq!$ld?5?oZbJ6O^`0)J}A=Xgd+lb00ZescYo2M#mjROGHaW=p*KysXFeV z<6WZjMHh;;5KUA16FO4AqjY|$jyH%XA6v7Nj;D(r7o8`%Ky;A^9RV+~MM_2RmpPER zlJel&89E|Q@Djd}evHm(Kehxif?ctVz2@G>IwxK;Mn|V}hU=WV9;f@rFm*j%$L>1r zsU!EwbUaE&&S&bJ=Q%IeIXIlp(m6Ve^9r30x962QXIy|A*Ad$d{mXTgt_SNlM8tEm zbzLXoe2$Lw_Pkn0bTqOsSLe%hMAxFb!I_tqMxGj7bN^M*D*K!67fhHkV?uG+xI{y3d5y0bn)8e+uZ<_`%PZoP>fah! zTc2o9O`GqiIl9%Or|-h+ZcV&4UZ)Hr^{1gqk0$+RGm4&2-Z&>4V`x)=7pEv`V{OXJ z+C9Idx*|EUaa_D{VWMGPGQXgyx~8(aZgw(%Y@)KMro3T7d0o6F-~XG;?>%`=c|*K1 zKa+=jGB3*tyZc)*CMauNqv;()+SRBq(GZ_He%9Q0MPncTZg+Rb@_%?mW1^ujA*R&{ zpu0Z@j4N-fUJ#EA5=k1@R68kNUsGLy5KU-E)W;hdtHpW5v9Is!Hg{=JJn2h_BvCib ztkit7P|wd!G%WV-bkyJGJ4MyW`kL~^bi03Zd;RrWTvAg$JL$(5`wbj2aA5zzeLe1t zOcs?lmXEKiS?ue)lJc5l+}Bto)dk$~x_|!DFI#H*=HG#eC2{;xvSd=s-))<(_ONHA z@)Q!9tw-r^p`yYIH2cq&M@4FrwB{@wXUTJ`Qd&%1XK*I!s$Tg>ZBpJU#cVfqcMJRM zudTz@7H67b_oh}YQ(UW~Dr>xWP^Z#j;=SQODy2<}cI{|W#)vbG{&P)Q$ElQmU8Sp8 zy1TEsK=-K|>GX!Clzoy93u4H{K{ zq+-6`-}S0dOg4bw#m4SCUZr|rd;3I7NsGyYbeyeEYwJ|WS-rS|l+9O;ZEUWd;t{o| zlB~yMC75SZC2d}d9S+!Wztt)1^fXrsQ)*0VAyu-wH%9ZYdnQ|t&1~-Fm{h$%O7&-+ zRt`!v8WZ9>ZKthHDo#;uH=3NRZ7gq0){d)XOp42#Pm_;PA^W<@N6#*MjOaX@zrfE| zF9|48P3qJWhWE(jp<3?(r%JU%RtrUQbe_<r?mg((XFmxnoR|xv6Jv+Q~^* zkza13WY%#kCKYNBv)$Xy-rLz8Q`}8IbDU1^*Yxq3D&yC-!_~)0&j`uET*+fhmXK*h z%R5dpx88;>_W6EVlPgtBu)plf{@MdENY@2AAFQhqtwRpfzy3-&M7=pg>7_arD*wTL z?*2k?WB=E-)zv#)Kc;%E^}DV|T5t0%w#_BtU`mIkmp4;Z`T*r>Z*%_IHaRUaLUMS5 z#!9ttv!ywW*LwYTx3x;uotDhi$YVU_r_B&E)jJ1kwIC+j)X2%NZHePZswGoY?g?sF zm1eXmou|0gS{~O2u3qWm%4xEcOr^IkRbEWyax|@SQkAMPTCLXSXG&LPzuUpqq4k#J z+gv@R8;?-0?s=oxv2xJrvE~^qnC|AP);TcM za$u^YAIm0BsAf*hv)9OQqpY0@Uz*~|fvw4Lk?z#$pLwQ9M=ZTO%`vn5^eW}bmqsu4 zt*1G0_6IAaewT!=cYIBw9%?vwB*I1-`MpSdBO(|iv&=;tjCdD$~6J9|~zOCWW#&hgt zbC`T`_hasC?}%#Y<{iV$BFlw2{@6W1Wo+vHKDHi?yV*67n`f~BGr8?7cQ&_luZ+l#AUqTa*-GXVS-xe;d2sDHQ+QD5%nGgl!n}I@{-*JpBJ^ zF+2In#bTZ+T~VosX-Ze5Qu0Fa+u3zkYyD-T7s#R;DvNE9=wMN?EVyD>3WNRo+$qrg zV&%l%E7HFKIxALL4ypC=;p_sVjhZC8dA>bRsd0!7$9L#zYwmn;FXm=?=aKaD=f#-z z0UD`jy-X)lNGm!iracDcIX7lDcPu)YpCUb1Azm2G+ES-%?0&aU^>-HFY}LKqFC(VN zaWpM(-c8U8q#s(l*CSNTo!+0OStxF~Gge1tEwmjot5S>(RQ*xE|^2$KqTptFQVE?c1mbXp`av_%w@r zYobPJ`MNtwsm=yA7HUdj9cN>biZFb1Bgs9NXOZXo{lff=tiFn~TU2G5uHo$QGYnHFXKM%B z%V>n>nNiIAv|4gMru_n8N^!C_U5Mzn*4uq}C``xADXJ-c+orgAL?~2O(-QT>rfYg+ zC`?z=lqPX=L!Q4TgpZl@{Xyd&3=4(oY!0)El!-7r6v7mnt9AX{SMzRzILz9Bi(K?g zvnVKkj^x;k_`Yh<%(T0%rK5a1A-$IQp>xiZ29L=C2qS4O-p8ui;tV;Pt`@|7If=~?b^l_19eAqsG46Cv+?PrdcZvB{|E8aH$SvzWQW7#(T&`CAW9pAE zoNzkA==VH5HA{0aqhze#SM!BZ8VV`9B}gq-$IsCjpQIE!423{{@jry3@s>4X0 z^Yzk^82?0i77Jl~C=}Q&|>VLf88jYCN zE!6B**rZUUx%np3%Sx3!MYT^#`xR71z zr8=?#MeYKPGe%@TmE~p#r zR&{pHNZ-mp(!l0XIL_)s`b52xd>CTn&T z#kA)>Ouz16bETuCR*z?f!f^8;o)7y;V%nd+xn-wT>Su+*a5f%xLPbtb6e>4yb^f)k z0bLo`smwItpFj@b$EKffQc>YYfotV2FvlSe#z&4RB@B)mGZoTG_&E67>_%e^!9-9#rJ4JcM)~78p>k?Mm6dOEnN@S52DHunGppvL z4pA#osjQllIxr)3W2@%GefZaU-#P8X&Zs)|J8Q}&@{#99=#VJ>xv`a6+i)rUbeEQI zx-93FrLXhGG!bk>WPtj;RJ>uI&LHsu9t~DXq3+yT2e5KU`$O$VIwTEDZJhRyLRMC}N7ho3^{r zlp0@7evp`i{t=fnJ3~xF%Xv=Ha>aO-q>#cUPt(mKgPn#5XGGomr zS*+GM;yfBkG@K=hmWqusSGp3MKbzVU8q;@!!tgG;hgmGnCsb~oq_t8b*wi4V?~I4R zO!Ws`#$RNnEE1>jAJL0MYgp|jMpL3QbR^@SNDeFEc%7^boEoY;7lGQChw18{@+p^u z!gV9lJ&&h9OB^9;fEBbf6pEAVbWbX#Z}W%YwhZ6`@d^Oe3E|B(q3%KVN$gKf#`3K10{A$Ai7Q?D{YgKTwj+jEHp@(|6&* z)Y_GYZep+SAu89*r|2@`oTQkU6C1OiUj{4Tlu7)vRDZF7&djMi6JKRK_7?^%80fbT ztRXr>i(=QBoh|TzXc1$XxGbxfXXR8LdU~kv4iT>582e%R`Fa7HX`l$6_S4xAmBKD) zvk!pTzF1|Qol|+lvam?dNZ8`+ye{z(=|?mbnhEF;wwmE+`uUSUVX5Mi;O$g~PM?5Atw!uTR+S^AOQH2w*GOM%KdH>dLGs}em4 zI{Tfle&HH&-%r=@3(KxV*vM3=u8`Ov`Zqwwn7%`r%Q&D{*y&Ly9D0gqC1->Eb388Q z3|eKZJ*-dTyBK>srtiAuQXW1V_9@mRV+}cBCl~GF431*UvLbDB9jx+@Q+km$vjQ?uWnGwKdC0Zt4KtqbSs594G4vb# zg{962FY)uz+sGN;LWt?RzqzyzTv~t}pwG}!j4r%qv=_RK9!964dngH>!d=p0dM8jW zHF5EywvRJEQj>jGxZG=;)|@jVg;IYHRl7gymMKowm54ey*$2O zV|I`-{~8axCI021@SU!r&++`|VPmJ$4{!tBkFGZw3&}&unE?i?hs=n^PQM~ld9FPh zvkQamNZE&1hQfFK!w!3TAx|}r>D^Lcf+ka}q^_!}Zmjp`LUx1ZGo4I*~uOE=kk^{jsS%5^ha4 zrnl0B=`T04XG)x@0kK(j#q%8q*6EFIaeE~04u$XJ4~rgq)mV<$Y}hBp^F$Nl8z70u zBQlBy!e287;qBiOs=Qp*c!DeFsWqN^LzU&C(dm3~EBi6MaVQM`vtyX`lbGIw8U`aJ zscwbx{!q`kvZtz-+5KzcU$vTNl6w9Di_vmKwOlc9D_9&;D+ZaVZfz?wbz>_A4~A+% zp3N1E4WJ>CYE|Z(o$t@Rtcx@ElE=06cNWKRo4>iv`q+*9OP}@G=f-~7P0#q`Xj!l9 zsi|*CX0r%-ZlsOa0uR|bwmt{B5zFjPv;kidyOWWNrO5n%wRnh9@eJ{ynIZ7^u-))* zu^D1|SF7Pk>*eLyTrF*Z?CsB<8q-^1O=+pWx%Q!3CkWGr?D|7~kfnt7%uQD5Zai^i z_64SL#Pnv`Fx=>Eb7ksd6VPJG= z!pQ(uF+6_jpd_;lY@QT0cF_yhcsZGSnWM4$Ixdn^=jX{aEXyF*aj*^Lv;c zar~q;X15}{FesV$agoY0F;AjfL>8E@@#>i4i3-61r1;cMWNnwTCw zD;fr$jrI_~W+f62lV~(4F};O8m-ZnSXg1?5!a=+oBg06KiQ-WXrDLz)#p3OlCu4du zW-jHiQfGE|;LoFB&9_%s(LfIIi5WYr;4z-?!r-fk%Oao8=2V`E7UEa4C&2U{Tx49s zSt3ZZh&GwXHtje3#50fSEw#C{4=y1O_z!sE#@=Jjhr^6LBZrJc>cQ9~n!%ic6&TZ- zb8{(=XN|;zW+EE!jn*KIhMPnTO@x+}3FM1WOEe&+H*JS0&uJ+09w4HGW-m>Xp8k_X zXlW@qUx2yId=n|Aw-1LY&)IYp^6Ocxi|H+xVV*n4<_cOw*zz0yW*|`@z8jeO=1jJB zz7VPgPIEA3unX8jVEj#Ne)NQqa`ZHkP8v}!Mm9Q_5l;`s^#0c{Eq3Km8eT5_Ynl`XJ~)Zf6Q;_ zFGd<^#0=0D^d~K2Jeg=7>x(hHhtrgo`kSjo*2f~GTV&~L=h-7_qck>os}~~wMF*b8;i|j=MLVGbu^W*t?!@$F z-Y`<^`Yv~V{4Er|i<UiTYxl(Tk>+j155=wge@Zm3_*jm*EAq7^1R1vE`Xk`J1aXv8P2yw+BPo&tWIc=^Wlz6qFSrqGx6Xo$1fSP4;i8a z%(R$(QzHz2T;0s>Afyo=0Le%8%vuCCG#)-XudwXR8ZmN-K4Xtmk;?iaRC#V@XuX|Z z{%W3gwFv1vZ%wMr>RF}F`QUo1n}rKxKNC4*XKYNr&65j%@c__-?BGGl(KPrH%n@i* z6W3u}qsfdmFf#}-r2>`pRjBgX+gz=+=ifGulk(KMZwGs4l-jsZyr`8_@xI2OZF{KF zV*1sLTsUANEoNNfwJ{fA$X5$58< z^jMS7Sl8e!Y`h_YH&bH4ruG9n)Xb-1`kkLJt#n$KH=Cwbd5LhamzZ}*@K)tibmW^* zsBUzcSQqh9JSF&rM{ipSdrH#^?H3x(~tVrD_CDzq1VJu{|>D${af8yRa0o*`Sz ztu6)=)9*rs>DzWTm-+4sehFHaw+uDvET&)33WMTmO_T$|Gci^m@d+X!^rwlF8`}n( z151Ypg0ZiNXvFj@RAI_<>n^6&!8-pK3d7ae_)jKI!(5EcqR!a2L_Od-(uQs`vjb}% z#2|@$Gdpa^sXX)pYXxwGSqJ@KyfkWppGI8N>{i8}gG;2CISK3Fr<}?oN=BR%6c=qn z=P-t7E&qt$Qzo`HZA0$RVbmw4Uzo|IPl&6yae$A+dT30)vJ?ix^@*{Fi0WY-GIN_K zJaH3r0lh^Z!5wB7xQXS2mNk1<+`C)DS!`IHj5DOt%v3L}Jn#ujH!9=$?KkN|4L?0_ZA9V|-v5p7whlD4q#&~LpwH@ew1 zHeY?g>~7)_rdPHMh2naJaf;Uc$a&oEbZvb@yD_ zM@$TV8jFk)@VbdeAj@b$Ml`yE7NS$k`XX&c9}q`ums5F+4P+k9nHk0CCcJO(nNiF> zZBsTgrqQ|RI>yP4wmj26{B<^1=KhwA?@4vLqFj_IJ%(`2MPUf*KjT%x|@3+YP*Hs5U!I zfR)KCL$4sA*Z_=HEFN|Rpc~Nk%zQ{WYir~}=Oe>0{kmWnx!Bd#KTKOYhC+0j6Yq|< zIj4UUdbeNQe?6M{ZDe9oqbYM71#`PSXl~ucnNFcEg z^glM9*>OUunT64u%um?Fd_y3Y@{H|h{20n$yy8=0Ei?C^fz56h>;UXu=2@hHyhNJ! z&9OY=*`YVg4h^GIXdRqHQy^c&LYV=u6|s8_AMgVA3sqj89hI4WxYLrUU*teyjAUf@ z%sYiD&GnwKeX&W{;e!9hzGl2wcxiUpyA?RIPl;Kcel%+$G5wlAF1?3b5-T>}*EI1o zRtC66R`E_iCI?m%F=y;F^fxu)cd$%(X3pSmuGU0%%W2+mg;iRmvReLMB&-sb;oAFGLM0jYT@@Pf&7GZa=GpTE+ z@?1P9xAyNJ3cHi#d{7IP_?AAl0dGxitzY=1fiUv6qb+H?5En^iT5`Xe#cAn1x%eV` z!TBbi`O7Z^gelprO-@m{M9k)^COtwu>Fl7?lX-e$DRECThc;^eEWZO2)Ayvp)WofM zx6W--0`i)|KQI)&+fRXxVvma3v%(wx!_=>f?IZjZ){^kZ(bmlC#6$4Mu*J|f*wk3v zi~y_v^p^3`iCOi^sXXQhqWmUmj~!v66QrWk&D#LbaEv784!k*b%95Wfr%hM!J;%rAnX+t^>7P4@Fc;ko{y7fiH` z8Nhhd@CB_*G>5t~|1sO*5gNOi_P}Lk_`W%nXL{T0fD8{6CL5;Cha19Gah`ChyEo*QEUu9#h`SVDL;^c50|^kJ=-NC$H( zvpw(s&xK3Io5lJzkql-c<1H~hh&o_J5=Aqf6@6pMWFBYK49clIGe%8>0r|o*z^(ZV6LU$Di!qI_{!2 z@z1RF5OXsew7HorU4FYoD0~(DcY2^Aj@xrJ0yIQ49Pt z^b$4)vgu}5^ct%fxs*o?!hI9PXhW=L+Qlw3EGIKF;XjgY@)Jd2E=3!T$f-PH+HeWp zxCjgy*0cso0biAwn-*g|qMeB^7@w72WXPp`=37OeV_CS}70jz_;&7Lkd@k)HlFF*MvDC2Uh?Tp@9b*M)qPOr(Xc^WD zJ6MoqEc>xJl}9U>q2UuPMITcJ{+GeVLNa@B;Wi$i=~=uDY`Srw%F9zu{-xg6Xl#&d z8in0O=Is|%s!RIYF8KwDT(}9p=pkBT<{J9bSb4^i#WrPJl8#4(=fv1_5t<31%G=Mj zj&DP>oHdO;Pj3~!RGZnZiMAZWCI03bL(9zqFmKupazAAOnENf;67wd7;z$?E5oCo? zLHq!|qi^vMAY=(CB8Q2NBZH99Mc9im*+^k}+*tq{YuA)t&0qX8{sno)9GKp>nLX>i z??D8OJ%QNgEqC^(@0xdS=W#Yz`jeafuE*3++;Y8RqVOgPf?mN(C3;}`i8+Ls5$(sU z#TYSjFMUQVGp1FNFumh!bL)poa)HP!V5>gW5Jm99&{eo z4z*+TggqH9>PD=FJvK-KxQ;*T#ui$S_Lb#S9&&=5Az|3Zj7+f6jg*R2fTwL@WB5- zIhAMj`ywrjXgmsZ3PEB&Ty;E#ns1mxUF8ni6jl3fR{A0wU`|#PB zeVBuZcEdYbYwS-(29Za8Yb8vJcDLni`WMSmEvXHK>{?>xc60GWviqY<4Z0 zJpfo-jBVP?%uKH`mg{mV&mhvz!~*DlB%f3y!(1cNkXhwNt23_fjo@4&r}CIJAZ870 zeCo{Xg#JT2Vbhp3MYI`tX(PG@4;bB8pHq2emBGaF8P&)J))Si2>{Bp1KaET9S#!DEN2}nPzQ~+8Eu~lv8=2n2}(<6KP}}+khF2@{tZC z6P;}2gqqN&^g&E3|GBi!MD|Q<2+o2}-%$%>5oG$8v58g1SRk%tEJ^IEg*lan4n(ss zmKg!eb@0~2Lh$C88L$zIFTfm!{bXbrTWC?J@|+)Lz9Yk$gYk3uZJAv7L!YB7Xfaxl z{-9r(EsbtBqZz3~Um1;Jcx6_YPsph}Y(V@D6ZxS$tQ!0hB*R2CsR7ue;W-$2p=A2w z#GJ}At77yjwZ|$&a?$Pd5PHJIsaPq+kAWNX1^vTy%sVNk^03lO8H^t4j0`ZdfQXjG zvv;ve;?eLFYs*LszfqG*{~6tb{F+fhPhy!FJp~sj4Gltjn4950a?UyW;*^}q!_x)< z``7qkXgy|C+Q$43SDAU3g^+!smH3=^fY@%Q=2Ra2!_$l_}IBNS_ZHlqcpp_}Dt-)T9PM+?wDW_^d!8Gp119cb2v=~GiK^@ICnK4tu! zo>O^d9z+u|28`Ei{A#QX#vvXHH8Sl(`%@P?HHTX z(P(wX``g}`_))(&!tZ-Gy5WEfwB^3KYsJjQp*I;R!%CUYSY z#F&SNXma)tp|8-`dGVUKqJp9gK3*f0Tmf4)5qgEJ`eOMmZJ={s|+2k-`qR zl{uAX^a%JSMrE`OW6$XwbOF{7?Pe^R=reqW4>9kYoXTVFLlTe}#8I4KL z(nd2w(sT4PI~dOmRi4`ik-0~_WmNjSP-tCLuJLo}4O1)R8ZHnKM5ax;kvq~%`^-#B z%Z&GQeyH-?uB!#|e&X`nS<7!(_X|Q{xw;$6!^FF(9hwiFihY4rG}4Q$iS(iKX(#f? zjEU!WVNT_t(-{NI4fvYy%Gd&oQSKnI$U3tZT90}#e#nicy(p*h=mW+)R;tlHXe4HN zMhdcumM1F548jbG)EkSRam=sfACCV4k3*wB3w7W1E}3faEm35|+;8IhBW3N1qv6 z0G*9hM|_RH*ofGa#!5#UqmAG-UNkcpzo?T7Kbf*84Jcqw%dn_WnEUYcY-&Hx4hpb~8!%^mU z+DCgBkH`_$JvA_vg0Z(qHC#cnuga-BEg9vEJw_U5lwzV=hNskl zIoZf3Hl?wlS#97KgL08i6aB{GW%gp!nb;QdGchhWN;{EDqd#dM^Bz1!UakpMo?A!f zcl>zgrhC(7`gb?Yw>VP2);UG-ixZWfUkS>kO^hHkmWfRnU5~uOHAWbk3VYc^rr{$J zj4m~D$*%;3DbKB=XSON5MSN?-wI|h@HKEYmHZqLjYkluv3iY?4 zP~D!IAS(M=S!W1-Ka&U)zgxszv}eq_!Iooc$6r^|%x5?LE%!XXU76pjHv2zX{su#8 z^`m7?oRyf$W8Q@0>g(SBdSfWgbg{KU$C(j{PGT&gH_!)WwUJl{V~Cgxmawr7u?v{< zm|1QLRi4|WnyP)v7Tz2R$-Onh?1MHa{0>kUDRb+}GgR+eb9&-vJ#m|TV)JF8yXAVA zefdb#LXmlYRk37pf!3DUbL9*1+h;Q~`fAhtc2J<-?heIA*KgQq|Bt;hfwSbQ>VJ2L34}d_ zge8zk*dYl$y>}3pUb8PiKp0G5NIIE;$;@PC0t5`gAO5Hyi+>3qAc}y3fGhzqEFl82 z%c`;|f-Cq(kVORfBmeWQQ|FyqukNdN>s7z**OT|=Q}bR|)va^yS%2r;TUA6nBCBF0 zop}SvXk`OzMkL{Hok_<2L5?71-e#1dC&%R+sWaMlbd?<|sx;qF>G7_jrn0kVBBa<` z`x6mEX@$Sz7RM7HLyLQ75+_Y^T`O>?R z=pCC&E`6+jnj|+ci2WNKd3RD@Z0uy4%$9)TG|yqoI$uLRj31%~j_08g&givnO#aL) z)1TF%M;1s{Oa4Zt4ff}%Abz5pMmVjw6B)r+L_u;6DpRLl1q>YfuM{*lS)Y%e;b6%TqvM1OBB zdg!Ir6hQDKM zAQm)-+6NvE4W)MS{#x{OeGUBMdh}cC8R!gLq%X)9{Qyg8MF)C}pIP%8YSDv+)`>w~ z@Dq9A*Fj=h57&yc&Nx6{>pEm}VAc=h^m>nZc1OS6nHXjSo$m$Pp55cm3T3h%d(M%q zK`tJ>u@+CrOp&72htxmnY>ZZLuxB(I*(ldEkHWsu0N!VmqGR@i9_@3n#~)0(!bw7l zf5-;8p_f|GAeYk|S#vn_lU{2LnYuk*2K^z5kB)pOiJl=JTWjwb(ub4UACvc&=R)|? zQrq7_s8{E$LMdD{9#8{dzC-f|JRmb?*eA9~tpR_?h_Mv@CIiN*$>GV;KaxbxD$q-! zd1UFl7xGfU!g~c#I6pp`bgc*G{J5Xgupc75EaFLji=cWFjd`btg!No(-{RmYGNy;f z-^DB3U#|bLq@Fx9?@4Oz>Z8AJmn=HXs=-blPwJ`5TW7VXH<2TdH|Pwa`Y&)NStDLi ztB6Ix|3Z2+V{flEG-j9r>77_+%}5T$w1K)it~g zc$!i1531l3Mh#BW`Wh7-?bCvc?^Ctt!6j-xROq=5yn{aD0+pzDBVWhc;Tx$bGGfM0 zB>&5tUO8j3C#l$d6x>V9-RIoJ{TR_(-gBh3UT$kO9-g4GJv;X^N#n9Bk!gIke0TO-f1T75 ztI(JnP85yeZ9FMlJ2K-LcgVU7znIk0_^s$u*XCh8L{o4mm2{1-)HT3Z@EgCN7EPRD z-{{Dfa(XI1{6CXc4!xtPttYoQ}l0nkvq3Z9vW z%*+y=1Rp*+@|7fdMN2I9_^Ul!!EKrP+utT#!Sq10C&g8Yycj!k_GCjKX(9sX8cPJJ zG4r8$C|WZ*@^?w}%Gyp}zn0XtUE68-_em{nlz0r)YH}`O1X&3hj&2hb@jg@v@GlyT z$%ybkiZj1niyqlA5tVC`$q~)9f&>-fFROu|i!G7g>I@ctkq7gJofJP{4pB)Wl$b!HwJ zfFk+UY9d}|CV$G;}Cv9^LMI6pdm6p;xoV4!+78Y^+5cI#w}1Z z+~mDFDIDt5W01(VldfPrMp}3SomYm7T9W~hlfRgRcWaYJEUgPLe$VmFh)!)p}Ip}${TP}e6aBo z9)b$65?xJ(9Z`h=8xWbaHcBs`Kt)B@LJ=_+h2BqV($m#4tP$rIaSs_PGSO8u*fI1N zH)G}>wH40gZ8>$uhc%5>1;e}t%ym) z11KXI^ih$Q;xRlKvsSt;*4F6pwj8Cmww|ifs+N_J{W34kynz2onHl%9%lP!?wK%4k zh*lvL)#I~?o?2(owXSFidyyITg^WNetoO4RT3z$Gvz*C4@45e~8u93eM!M>&n>~?l z;fwGZ=m4HU>+Dz1)4IyO zHnk!62|CADQ!^vS;Eg}M@rk}3mDIMKPqe&cQcD{pae%v)hyuiQ`ma@cA_DRz>ZmQj z4`vq816`lGDD-Ysn;z|%jn$cFY=gK!W@b^8sG&ZHn4sB$W*5B6Cxxp=OV9XcSsDKK z>ed@r9-XZn(|2gyCh2;{FJd8fffppQ&~GdUp9lxxCw+!@U=a`s6&P?Ho`@APDgC!O zh|c}KUD9>D-*`c6nG6y=#rBoQ^b#Zrio+LT>%@NkBIYCa(UIFH(Yr&&^-g?0Q)a)P zC{Oj+m92g~I_Ziw0(?5YO4pu)Mi`H+-q4lIXfmD*_6H|b?pvG^lZ&wk@Ll# zACq(?>p5HpgU~OHNuUv}LlBFod*C~CJ`T^q*+eJxIMmovbjIkBU*pG-BvOPrHU`hY zL*OcKy~eCebrrYc>{o>*JEHU_AzF5@ob1gq(Gj5FbnburEc*8fQ5Q zztCTN1y5d1;ZUa@<2Ub|bOq}%ksT{XBUxLbeiK=OK;S;Sh4cI-|3RX7P0fl%NA6OK z9$rN2hg6A>DOFtT7>-cQMcVX4*T|#!=#yqnptQTzqNiC9hy}Wa2+${T9<7yuAMhPu z1R|q)47}cg&^x{sJw+WlGljLnPhy1T#_&~RF}&3J95w{TC$l8)x?3%J#1|w-h6S>L zkJtwMA_9^FYW9QwQ{L+wx{jZB+@xrn=?j%kBo7`$*L7|HGz}Nge<(9*#;xnduts7F z_+oVAgj)27Q`8*blKMe@-!|4eO=H7&%K6O-t9g@e^B`cAuj(v~|m4oX}pufSrqxz0%N(@2AH z=!_q0ACUoCsCOnY8sui0fu@jEGG^X7lS0oTr9IPB`>#(wFFsFvbmX4-6&2I)zg7EF zXI<|jZTMHLo;@w&Ay39`ub!PHN0x=ByuX1bj&SGds?9l3WBJ(EMqi0_khMH_)) zDD|Fb6CN3qOI-@jiO0b@HAdj+@Ynb>t*!DF9n~az8^Y*_>3?xe8gCPNvPh9xn#)=h z1)fp=G?BSsN!GAkCD-?ggSPVb5$YKy2Io*+u&Yz|yk8OrdgL<{u!Z0CyoUm|*Sg*;i8RfN1}$KMuzY7!l@vZCIGR87l9WmRAu$sl8F3sgb` z19O3>kqS13#1#o?V- zFq6GqU~AH~4VU6ySs~1QYfsFiz?*hbxM7um3#HYQrS&f9=|ob?Bl2;r$f$^@yd@`v zqP2Up^jF(WCABk)!d9>((7jre<|Sw~GDVAZkIs&3y+!MHI+r(Hi=I{+Kw;o#G7ant zJEiWx)xneW3e*XuZ}cqd4T^h^r)C|%tI>Vzv=C!h!BEp-hGH3EDf=uI&a z{*<@ZD7|toZI%0}Sr3bAeR&H_oqm!Lvng)GAF2nWFJM-rMb4tq1;OL1HPhJ__ zPb>fp>D?Zht%2={2jCB`uXP@92wXy{R07cGhbGapXl{8vDB(cnV|=xA`dKq4zzu( zdgpbZ3rRh(c$mV=#iT2?OUWZaXDKZuUD>3Bm!{r^U)Jh4RVD0FR|a4yyNv2v(A=X!HA~!4~T}bLRA<>l$Yijp8kc9iR~+iJ~zoszf<56RpXy zMgp8dB^mDEMbAj0XI1U){XaA5dhL9%Sl*d0XC+idxggr$`?Z2jT)@|onSv%3 zr2psU^gM&J%)N+&4gGp{X4#v?dOu?4dS>Ux+Vi#ZlEz!NPv<9H)woEU1dr>?7_~O_ z-FR-Il*$~Gr^rin1bd-Y1Q#!;MUOZQt|Rx;*;%a%=*))B`hp;c0SlMO@e|oS@!Eq-J~<)}qH%u`<0w0Zt+% z#!3B$Zx9bY0{^1;hdi7t4~~w?JYSvh;l1G-HVYQu`XF_(1gsveX~hX_j@4uLaD_?@ zwbDn`qDK{7?|acFI1w#$4T8>u>dXPC2kPKl=;DE(OJ?v(wdgSlG!aw`!a_5s4ik+u zDyijB4QEu05#$3u(BaXMN7tf9TdhZctKg)~h*(7A`a}aVcJLl{uC-}&XH-@-)R7;4 z7du0OXaM8W*&?l(fPfhlh>~0Z9VWNKPU!>hi>X5o&S?z+?Sr4{@ip5+C)BfOehWAB zu4|1B$nUYW=%JHP!aH(h`pqm0GG(q7^bdlDE|vlZwC;tjGQMA~MUQK1R<3vbGd`?L zu`)f-j2s?g9qh;7pr2qJ-Zi8A)c?cG^%ObEKkD?n+j~{2O?%}xm3->VTGOYda-!6j zwC-&0&pc6TBE@$>oha>#@ANclmtyi-e>7r16veYfElstxOUX`t;*(>yR z%H9LgKWoo=$$fG*^_VLw_CGF(!-mn9ga%K|x=Q}PKz@f$w=BM^lK0G{=;mEAuEJNp zGIhKI!pHFHRQ1AlVe(#?l^!ZW+9z8`;qchfqY&U<3x7K^d%CnV9c z>XOat@a~wDe%kE4A=u&*$W*qMCSA#@7xo4UW@dJYye^e@T=1rsl-^h-!`#T_GID*J zy}xyt84`OU+GY6_^}3@3eJ@aMC*A95ARq>8Hufq?>rJLnx`yb zJ-d>wX*#7*fRzw<65<6_Z2UF$=e3nR$2?-kOpk1LK$S zf;@xuBveblTOehyk*=;H7IB1Ft}`P#-%G3<6{>aUaZSzBKx7)v;XN@z*Aam$phUda zK2dE_e2RSb)S|~+jiNpf2oaXJt*a+2))IBWXS%{t(G1a$zj>ERo$;Y}Xd7sYn2P>! zCB5s0IT$!g^d+7W{qbo0Cd(i{*;k7mJR@VogK9iSHgK3s1UZ5~wPK)^6i^!LP4u}u zyi29d_&@`U4~$H;hRPNkh92t+uqk{CBgD$k7_~f(oG#&2p>MoPrOx=!46cM!h(l;ST8PxpP=0|p(NSGbNR(3j1UK<6l{)ko z9XTu2RIoJ|lK-_X4lk_&hJI3Q1s8z=bp_9;*nAy&THj_&YK7owassphU%*VcT0dOI zcOq%D6B&RvpPbWE|Hl88@u#jIuzA98{QxWEm}zQXJFqDBKr8^^?3EszpY_4KtNzWK z=)$vj|4JR6prObRebRXqUC#*8ruqUO@FQ3#T*A`WkN@Cr-oKJU&rm?Iw>GA$ldfTY z8~M`{^k3(!k(8n&`ia)CAK4P=unjba{0Ms;m3Xav?p=#EXU9%%Iv~J1br6w@?Mt|z8lZT>F~WeQ-+nnJFLoV5PK)`;N$R-cpqBn z`Vrpil0whyA$82xG?v6YMV|aiv8Z!1v~W;##MW-4%HY9K89XD2Cnf_T191_&Po&a( zUaQ?$6F7soWf2o^j3(oA@w&VVCPfBT#qB=YXZD5r3levj+kaZgqxq4?%Q4MT&l2AT zZoFE?XI{dN=^Lr-=(CbWZy8(>H}X!;E99T|pdCr_W|$Q2nly>9NCpI@Yh#e0)(!OT zDLf^fljB5g#R(Q=c{5B3z1wHnJsR{p&b#L%UCq`oJyQ5_AoDO(44f;x&qaIHyKg)( z?{R36PN6-@`4Pr-nP|h#EE;<5QQZ67q;Z;*R3g-l$f?2H%-a&t$hC+r$HAoSIFi)e?d~ux8!^PC+wE?JbC6UL3O&;mMR^d&{v6(+g>i)0ollT$#h3YUYJD7 zDkeoQXp}D$3p*famOOfNbJtvV!K?oZd!69T3RD%+9a|t9TXn zzO)uUkTx78PbW8F#8`~lfzI5*d1@Erpj3lFgv28x&bwPu_#cZp#eTm$={mNO>U`k> z{_QOB3-~wQv69jcRy6a^?yAKz?#b4=9uUrI?$XV+;@<8RN%Y+}VPn+Pi0$Yyx<{-> z7U;gtBP-v*WE`g+ptVxoxsozoqXz;cUs72@4=EyVo%4h~5t8}=t9^83qE$GUQF>J^ zdR&LG@r}pOyU@@sGCRHZ%|@;@8s@m@3v&sJLhpBL(bL&|s%cu)!mATyb^RN2s@Oau zqb5XL)s;-@!5H7GYtgg$X~kwpg^dxxQE(d(MzI?+l%OAGK$#_{XS{Qzj{MXIQ`gcu z7FG+6(3P!dkd9IBjX-ylBgh?&^8S@N^w1RKK;?qjAGD4QdFl)~`62s}tV&mDGDb4M z*VLj%|EbUE`hHeafNep;RKW25j7hN(^zhZ_GDsObI6CqNwdkSQ)FlTnUc5p&T@rHI6lu2yYFM_yNp9@peL zWDV4w;TU5@XONrvaH2Z=1s!R%5?w)WdDn}MulG1-zQ^XE@SFA~o$_5<56XS=qXl&z z$Z)sMl-V%oe5@ZK1V?@j*fZB-T*p%Lh44UEXFe&{udhmwP zqpNsO_<^OWzr&93=XiJ`6tf!i4O`XK$Glsn4m}Vha#5?pCNwfI*8`eo{zPXq-~b~7 ziKtIvF2lc_@w&XARAM$Z*M zRzwAS0QeLRD}QzM2b|yxq)X&@OD%d}IjkLdX%&dr#kwjY1SsCFjwirF>2a#9c!klC zKdD7eBc1wJU7G{{nB7x^fi>|r**}uT$MUV7o=El9TJ*r9@Q_*pS5rws3tho7IHDC5 z_UOD9D4&@l5dGU~(t`q{RBsAxqNT1ZA{HrjgLh~Mc!wUKqi7cIm8qjInzK?Bf)f7| zEAdU}E%RE8gb0F-V}Uy3fEH0n8Xb8@Eqc@*&;-y5nxL3XSGnrCBO(ZBM&*Xapj#>d zGQjI<(L-X`1Qi@)gO+MGLUd=pau5B-`tUD!K>o%$M@Qb7)9XD_k?ZsCVG? z#ZCBz7e{CLMHEA8@dsEI_N!Sm+Dyd8Clbqu1>lSK)S`#q)){ZD_j7$+wTCoyb{uOa zD&r-vS`dTID&v>lTZ^8qWB_GoEX3bvz6TY&1F?+QMtq@X#1qC(6eq5{uNFPD77Zph z)wxu~wp8yJgW?aoiB)mHKkyp=j9+?xEqdyM6gBJf4Tz%14I20+#ahS;FRv>|h+?$C zFWpd!9@a)wrv9jvNq*~^byjra`Bk!bXZGXu`Gx0)-UpKCSp`M!;pg2ZSBS4$mG(C# zwKx4nt2KYnh=(@A1AGZtJblA^pyR|{>;SzdDl#74LX%>d=25DutCxz$-6t#M7?Y34 zYpfqkqGU)Nk94KfoSARBKx#uz66@Fc^M`6)hl&!b&A5{HYjotpN!Kw>W3PA;5QJtV z@E$9pUV=4%h(WJlHnIUCB=;kuhaiBzs6|gb5m!Ouuqlpb_JjUWM{zup;urJ+NL3A7f1j~gBNXf1l`kKriS0Q)oZ!Wi*Y zHR7+0f=uH)01Jw6m)iR2g)x`Ga& zIe1UdI2p|+YtaJ%q67FDd?xb42O?4J1NAU!IOq#86)QlhtZiEqdY`IAk8BJIASG%* zU|lK#&_-@tlit`Yh2^Z&ThJcfJX1$supu%t)fxCnOv5tJezgG*gRZ^CF7c|^9|)RA z_vu>n;F0o&tJ8Z%L%c;V$db@Qt-!%ekUCyo^Be5_GqvcEJD`PJ0Z)Zi&;znUVk|r* zTIk(O^ag9-EY0b7Urrr9x)aS_=Aqr!WUf9RY#zCkPHN=OGwHUkrqXVyC4R~3N8gLUIIy&;@Bzi~6nfyB|yYoV`W}}rbmgMItPT$AZFqNMn}F?lODW7?r;-+VlU9fhSV3S6{AI* zrD#~OB{i6Tt3?ltO^hdh#)ir0!5oZ5a~9$vkx_8~=n!;D6b2FT{+~MhBzGaYsEqI( zXa!zV>-idosrNE}f~5HkC*dzh|J$|b;bnB539Upb*b*D#Ku4HYgWu5LZhl4F$^+;< zU7qDRCfjLp2lYkrM7@)wrT)c{@$C0WLgl3F*ku0qRQ~sL_V;76tJt|S`LWsj+`0Vk ztvMYiKtpL+D`KzhGb(V?_9-RW+VxrELQmOeG{##r$gi|5@-2@DZLs4;4`gWjj2^mS z`;^{ga)0k`sfVp*BS4~DeQe|!`8(uUc(p1D6Iq|(2L6LA2$w% zc4YMG*i2D|R3EhW_+^z%i~^BQ&m$J-dDJ(ot#b09+&y$vnvQc8RwOc=$rV;hW zIn~k^^GIpq1Rtl26HH;}DIen=ugpoJm$j_oB)Nc|=hCCfXKkyfmOVLG$66Xykf7~z z{V)n4RhNBTs!b%=E7j>h_BPg3`v4CcPwI^o++{7-ld9`s6;-gH_Ri%BHntwu9jj@H zTPAf$yP9cJEQ(OCu=DCtb=lZh`$4sgP^c_upS8y)$ry-hivKjivClN18l#W}SzF`O zT16l74dbryD5m?pM<4Q>6biBEljfDn-isVBg=Ujcx%O7^Ep1fsSP&bR+d>spG9w#* zJ)5DPYAvfM)Ztv&K4x3iVD>@%Na;E{BfGbK{L;L~^wlvuH5WT?t?h%^?i7ABk#jlb zQ)fw`+Pj>Y2~437Llx8*t!+K+A~Uy^Roc~*s%8?@K+zg9)VWOK>^Hi0nyl+kBuf^{ z8LDH&v#-gJEl1HYYp)*s>21fzW|5m+Pe<5(J*8!%XQsTCpx>XFu0y{BEVQkfY7W397(K0PpQ)#yIsce^w)MJ79 z)!sc06)?Df1RVv2{4g3ZUs@iU%U-Xjx{5C?#~UbHjOeBb>6N;nCYUspr*VnI^lc+G zLG2rzaZLy-v1Y00fyMr{^9f$x4ePe9Y4)`cU@O-g@n2uiCC&eeGoLvmb8vIx;A!M^Y@{8s1Iz%wwq! z4DHs?aktq6v-(5Xy2H7oet8hB*s8u%(P)}gw0ka{2kVV45vQ3iE6;*)O)zD)MSTxL8kxbosb-i3UCL>>&?eieq zk5;Z5`|7)DKc`PGu=bWO`0VAN&x6o^L$B2msZ&cUVnk>d`sybQLl6C=Vb#^OqY=~7 zbbs$_)vNV%5bBQ2{ccgOn%2M8%isIG149`x%N)whJZ5v+&8a`Yy@@}PwJYa zP#)_alk508kJOtL+ip%7`CUSen?PfRd+?;Xe#GzWskS55ocN5Hd4V`?s$NUVDk^W! zvrn{F@s%Y!LBft#={mhnj}OJTq-&71g4{0}jM@0_ScJWff{ZI6!c+Nm_6#vE$}>`w zXD)remnd940DDaKETW z@WU$qP9+?jajwZo{0^(NqY=|0zuU^S$X9%aTI6>yb<-lAbFg`}D3oNCpJ*oCG=JB$ zYE{-;v+ruHT6?~(83%Z!bWGd)VFHB@hV7JQ@jey5)6e~9 z9E16Nd)@qJe=t~h2cM3uc%M%y25W9RMX!{K%hsCidSW%dx6!r4?^z6^tly8gQCi}j zI#o-W4JG27JyafFhr zl5Ra3O?huW6OZy)vevQfNGpX=~yLN)Kn|Ew0uZ<{G|$$6&kIha5x?Mzd6J z7t0yyP>rF-)ENNela^gEYmgdy>a5jKUqbAQuj7c#6M;rdtK7f!jyoL1x$ju{wv4_JpnQ@$HY8}dDU zRa*R+lEeYQ^*hLav;(w`*Av+NuXZ%hWA>VtaE(HW)TdyiuwUC$Vi zon=WXJ70OCu^7q5-f$C-V=*eR+CF{sDAXG^`Qv`uRc`M=%fuuQ8licHnhi<@CljDzfiM{gYe(&zb+k>p7zn{IA@JY zY=m{*KT_6qY{mNR+8%qx9ep&r+6*r8Lb??(l*Nvt!vdB7=(csExGiA8umpvZU^Eqo5kLuBl*-`53C78i1 zw%U%s{C=k49Y=nH|9pet>}9<-jG`NN@WbDO)(>F|3bO>OHsk4O_|Pbr*kA=|;)M&{SMD@#=n4o)x`uyt==(G~!i} zepL67zM&tNe(dfJ&PC>ugF=%hE6|0#1V|A7$G~)7aPNi)9*tz*T zm%n>Bt+XmC+)U4O^(fMP6++RzLoQck|8*#o`A&7Ko$u_k$Wr9H`(mv&$5%tr-jF96 zWWL<3)+OvV;ojY6j@`b>J+G%R=3A=c#URW})sg2$X^ctI|2@XphI*jWE%Qlt=n(^5Dxx4=5lrfhL_W+~F2F_(^>>quVxj#jtTR~7Hm4f(TH z-nA%~^`PLn>Ts6AB97NOn$A+BJ{br}TMS)0KbM{>qU#o~<9;rdkA(W!n};as`^Mo> z#&6R1Y&3QC1y4aJ`#LPk(2hsB*fU+=qjA5R^oQ%5yUoJi)YdttK0Or8O3xIB>zT

8+(~@6q^+9E_ADRO>RCQh8@lUnnd6)NON>ePa&dQiNB$|Y2Q;lFk9%t43 zZ1SJ|L@Srvf3?%qc{5*bxBtBUXXL3w+btU|kBQz|%LllzF&6X+gS+UPQ4b%ou_rh~UJdwcQ39+jWj?;9w&sCToFmC-4A+u(y^U+?G{u}+%g z(br*J-!2UliQ$cd;V4t~EyX0P0SHgKUsa#DNYc&OAPR)zIJ9UC4|w#hzQfqp;)d;# z9iIo^x^Sf$3DZ?b#o$KuKnTP&_w$Qug`${yUo%li&w-xk}hAa((r1{H^oMx6ra5Qs=d=Y)F~qHQLkygS13cm)Ld6WrC{z1*;Jeq zDu%1-av(4JtsNvxn+pP1?6BW{f*_UV7CK0yLM^!7#p@;!Wl+(-F(dI;S8 zJOrUWzP>0VSTM>{fF7elaA!Snpt~1(mTHV3z{d|gWaTdyMLqK|Cd6-au#dl=yRT1h zSmz%f`^t?yW?~YsSh#h&i{~iI4%xUiK}tOKxuavhdz0N;G|jNv@JG^l|F;w3NZ3zw zINX>}EMNCS9S-DO;4|#X9sebgJ)hjR?XtLkl!R%c!(qZ@&;k5&IgmHBaGXQ*w~CG{ z{NAT`8MnF;345WC0aZ!Jq7}A6peuSdFHj&H9qb>dNBtIm2DR8?56q!Le&72W15|Os z$Uzm&3_7!_v_G6S{CE(d>Ig@|U^_ZeCoV~B>6$Gz&cU5D;KXzUoTJLI>Px}E8YdnH zOH)=ao;ByX!8kis1`>I`IzF^t%=?>0aG!&!rt^@8;DBN&6@WSPF*Y$(a9Blj;Oy@a z;_FF$VGLjkEFq3V89P|`%b!nn8}02m-krMXMC>`nJ;XPdaa@s3-kbKZsnjV?AJwA+ ziq$bDQkRYZ>wR!Ihw<`LbfJho$f13#12_S094Z(`Vt^>5Go84YHoR+xE-MzBstqlieBp^$2`$SHTbF@m_4MXl9_tvrd}E^i z|e zU+`TYr<8u5+YH!SW{XDD1vfV3D;f$$fWnCib#a0>lv7IcKXsvNZ6xjE4n`XqIf|=1 zoQ_n&LsBGN3@(;?NRrVpv3*oI>NM>;VQ%HWKRPEby1Qn~+Q&U`5s(kI)}zsJU}5G4 zNt&JAfyadnZzNs4M8dQ=>a;~N7QFg6w9J*)_8Xe)z7|qu{$$Jn^MG@mtt$3@6Vb@) zkKQDNUivV49Qq9m8I9h|;u)k-O6#F>Q+1}oEN3nB|Ty0Qm7&}b{jIIT~QSYQ0^}N0{Lq&ME*g+0*N2B zo$~$lH1_Bl^E^Ec*@gv7Err1 zuu4COq&;r^MZOe>y4+-)Vgu?cWpJA{7t(#B-1jB}okDtI@;N|N-3cda&XtaNT zry$4&z1&IQ6KohH2tY;4CFm?b0{ML}la?2@f>1M3S^N9>h6zI5{eoe)Cs6**9rQ+p zVASZ){M7!BkDnKMr;ZQSgpPs$e+c(Mg%^PW&*0IWf7$zXaNDSA?{GR|0`2SKgqmGu zU81vnK>HdT(ya?dPaKwsMLB>|tT{PC|8fQ}VlhuBvyOX^BZRR&QwR_rZtTw@ z0yj3+2N#6GipCSFfM3In{fSAcX!N5X7C=P~#$VhX8j+AH2-kwE@AtAg)Ro` znFg(c%k|L*+s1!!&Zy9S-D&#^jJH7G*6~8cvp>>D!nA1}oREy{j~zm-0SC+j&e`r4 zwcu5{+!AQP*`Ketb=X$je(MyS+#!1`883y$%)L?ZEB@{-<{SyrW(x)*8B1{sUW58X4p%R?6)liQEPgFr ztw)Rx>rI=Mc{tE|S$LHOO;cTMarsaPZr-uz`1$NV{i4oql5YE3+^$|+-5VrKo6Q@7 zWE}LmMys3ehlyi*WW+7>SnrBCU>x)@x&+|4VaWAfhFsTBXhHp95O zI4U?zugr?sjK@(i^KmHCi?jSvlefRHOEsEt{O#-a)k&B(TW}(h@qwek;?8{!ST7fE zwK>|Q5VOVC(Nys)%>UV}nnlaWlH9Eslw4-v5&ZbyTfkv0n zfxJ7zo5O`~v*R*cXVZM&>&%H@>>^QP`o_~Dk zQsBnM?m%X=Q_T&>qjmpZ-LBwR3mOUTex9g`ugGH%rN4P5}c zqpM&0xE4q`(uK)A-kjN{L;ZP;X0A!TQf56;5IGsmlehJ7Yu%^E$s`BctWI%%ohtY7 zqhi%S3xb22gU#pVH?*#nZ@uouAD%B-4M-$mGpN||AEp+T{7~wEiXA)kk>i6Ik)o8N zNAKxXIz&x&lxZPI%5Gux2M7MwSPJA-RDAVlg!+Yy4&>c}W5$2D>@#$gbm!(qPA82m zGZb5}BAprO;sy!RW($%o2!Z&jS`c`+WyWR1Jo{U`v0Mt48zirDQrWQgo3(KxHreZ6xm8GT7 z+*B;=Dzq{dN-az!BB^j#%Z`GUUBzM(OB+igQ!6VJ-3a1{jHEU;Qgc&DS4$%a#KDy% zkk_Jss>YVMU!qc5p?}rI>9j!6RF$Vw4@Dvth;X^%(9ycj7K z2^-U+D;{!XHVH}n%8@|1K*fLgHko2dN(3y@HWc#y-u$esb}-LJ18#+xke3az*TkyUZwnUTaAq!sgg>@v|$rNEKy}G ze%BFR%11@V9sAdnh`ST9#1iQ|nwuT-zkj8GZj1!l*Ts#~2Q7YN^a=0Tah&d#HlY_! zIj!2>BiGw6@`hr6fmJ9t(v2e|Y=%5K^-I|jv{Oj=MW5AB%v~WeKa<8tfKI5au>}RY z%)S8!5-2lQ5Dq-rmyI_Um&i+kk(pK6k@^N<Hl_y?*Z!Q zyK&z&J<6ZYvR||DK;zk44tG;*9DEUrbmIsK)26!@T$AE z$*oEbr>u9TUKx|_QYI02u`xVRhJ2a4R8IQ%@PceT(Ektbbg15-fV~b|_!=_xbg~*7 z9IcRCs*BO7f}(vd2c5_rp9Wa&KX_W_z#-1NkNUmcb2zs(GyofeZ9D8rr~y`^{7a|- z6hGHHo@xkqGGR2lfdV~nfS#1_@xCHqlxVm` zc-asAE-s>+v+wM-*j*J0msHD!W@cmGigIN4Gm`xPr zjs177Yto-lFB_d(7zvU2sPGiiRjvc$8oH#uy`I&xkLgt4#>T!vX0%hS!dNOQ!B2C8 zQ84dHofSFT++33?F7x{*`MMS4%!gZ>BTw$XHTWcq6;D05V%Ga!z>SUl3z^aGS99Bp z%I!6sryNci%_ZCR{pHbX%zC|iUUr*fNA z@=J0bR5tq#a}Wo#kD-A8DmdW5UZRk&O$uq4+(^AhAu_*S1oPmcB}x!AEmk>=3O0sEAjr6cnqn5px`dhnuL;oG@C5SZ3VNDazFzr7E0cDJ9A7D*jw#2d z@z@IvXgoHCM^(s_*?1%i0i_l>zWt~u0Xm?Hz`1NefI5p1;K5#SkT5*Hg8)o!BpZRH zg4o=%Tq>0O!{C;P;;6F-0UqoH2MNP74G`s5bK8o_RA&(aJlG2k5{BnI#ks`-gdC^p zaR$iKQNN{Z5yBco@xVq>Q3Vo8>Oe8pFCD}1K%g1XONY(J_EB@z5L+cuEvaXNur1JB zj<^SEq`zr=)uDlh3So9FqdN-k3*S5cba*zweS~<$%H~TqTJ<}lXl%f!fFnJyN5W>v zqf@_3`(5&@j#zReoT9(@%d5T9*OIiJ^pGP7n;{pB`ekZH$!q;MR4V&nQ4mC# zRzNuL=qt@>_PBWy>+sY0OHvnp^B`ePkP+>e+%%$3Dz*L(RQ9smxXy)#`#48fwaK`U zZ1WJrQN|C#u-qDvlGgeHC>Xh78VDb>yeAJU9w2`uMT2wyU$cw~Of& zQ;VdYp(s=K2SZ61Oh&O|HlZmEHBiWe!L1BwYQrc6lV*S_P8i(!qsU9<^)_C*=Y-R~C6OLS zYdx(F>6LLSpbIFbLa$Iy;8dYLXiHy4r{t|dp-ppZIX`Ibkk&7$au@x#v5I_k>CE7{ zxleBzx41BCr%O!5<*_dsw5>_PX3+7$V^s4mxS?$WDl;~3`sVwWg2Wl$Zs;!f_uzYw zLs>OLIPl0lce{~QR$04cf3`9Sw#v;WVQvtac1&)DG^$v0I40$D1}MZTkB;FLbvi`{ zIFO-CI}rN3Z@;iIZ|;lcTxoi#NoI0Ch{%U!&$3%OI@@Mjhj)t98-FhUH(<%e@I&a- zK5|7A!O_G8eM{lHR7K+9jp7pg&K!^e*9HCS%bxz`ozg?HfA5x-hSi*4+lUwG+grbx zwHh(Sok5AXYjK6TmQux@vCyDgG3)D&7-HA7ti58dkS8TJdyOOlTJt!m~mYdr}o z9R>ne>eesZ(k6DBedZ9^!UnHf&j%KKSZ39z`P(&*7Y@6prDm>mbVvr4Y^+ooh>l3m z#SV4b=-DMWZrk4b-;9)oYx$C%U&mqd&dq-bH@;4s`*`$68IWdUrOZG;TY`g|Jny`I zoiwx8afgWc&bzMJ?_LDBvbHXO2*?$iSr}DSVmQ=#ko17}!CiOihd699t^DPZ$dd6A z8*Dh>HP78$!jmh#xNAFi+Wt0A$8NVIVcIktQ;>{ojesgtR?QF&Jk|s+$v6=G-ZpXT zs)5&&J@ZId=`b8HjWAu><5}49c)QF8_C2PoPYDMWd{~OYf@@5k)68*O(2*dwo+2+` z$;L{h;SeD~f3ycdr2xUfe?1!f*F!_6#8Hp!Yu)q6C1Iu1aF`(R*Wd7Zd*JN|$&pH3 z=DoS?(E?~GYwH4tfLw9If%fn@XB;Ugg$$A*$9u*x^i5W;l;LX~(|4OJt&qF$9%;q_ zosvD{AYs}t928shqpUh14#>-%S&*>OVIV*XbqoYBV$UK-SgAA+Hb{7NW)?t@J!X)w zQfeT;ma&Ir1S!>MP6Gj}CmEzhj<*f4yLBP|!Qm*^`754zpIxnEL9zi;QHJbo2@<9a z8vuPDTrB!eH8I=Tv8KRwbLfdmzeQHd16-AD03PgZ2@+O1Y{M=jtvcHhz=*vCLBdL< zZ7@W_+xJR(wa9L=Bx%>K-_I-)1|f)7)3Uc9fHWH`rM3YsR_Hg}w7;DDAm=^V6MxT* zd^SWCZBEXN7 z@IWu?IbZKa#7+HJkA!K{Kx{%XE^T)@-%awtdhe1#lL>m|cxe&vc+s{0(W*7>+ecOC zQDep8OFcKl`0d21Ec7(t3oz~9v7xf**~GZ zU%8tktW+9^OGx;pgJK4R+`DI&@TsqRm-$E511V)a2*QEjsIS#hrmmSGJviiv+3o#% zB_ynr83>>SZVmds93Ru#u3% zKlr(ezv&R1JG{P*1T?V4d}N`h$gnTU|)lTgZ%dRKZ2p%u1fy98_+*%Z>jSoBh~f>%dPB{(c+L z07T*924S2kB&(=Ig{)DQGDwab@5$-MWfS)Vd_Le5De3jZsODiq#kRyMG!tcbJLIow zBfp$+*}kBKpRue#brQy{LM4B{Mg)>EIBKPy@n;?DBg>lV`))Z7c80T>u?hi?o&!Gz z?rhrHKHPnkOL9cz3nYwNg-VVauKy88#v68T?Fw%BTCX{{by8sG{!~>DM|kh*JB)oT zZrCo_@pGC-Wx>8LszCQBS+J~^81woWuM-`_4FET5!W;YcKQ z?;v5^s#Wqmcpj3m(5+GLQDK3$YZi(0#oo^^LRF&fM*YLFqQj~MJf`*;8gJWRkjtu0 zW2fwEoW7BSajRCzbF)M;)~^+P{=IHR>y!)6%(m>9*b}&Laf7e|_(87N00*zH;#47- zo*LHaH{tPWXX|;}?HHK8v*nvzO-U*=3yE^-_=cJl@3{*XKdgGIyWh)RButwsv;fJN z{O4aWuGJ>lEfw~S8TjWZYR1D=%~*wiNBQlm-`+i+CrmIHzIBPOz?Ot*LxsvB*}%bs z=-k_Oy)AmYahZ2{TPw4Ltzfg3x<|%)e4m58p2gdzcI|z)Nl=w*fOBz%FizEyDYH&8 zT{To|rjN<1)lVwB&THJP--S&5T#{%s z?x4D>H?CXYNW!>PtK_-$Ml$xS+^0c{TVw3zo;y1D{O1C=-HekPgmJ2n(g9Ab>36eT z*;cZeXRP;q2-7ea`jZKLcoJPz>zR+ z6)Jgdph6lO;FP|cULRd`mZ8$X@t%IqH>pr9OH@so+;qn?54{iB59H~oU#vnT153iR zsY0Yd2}r0?A>h$INe~rL(ZT7+{OgrBH+$qo!nCPE^O20-wuKu%e>l;0y<5ul@NFI8 z{gRyAAdJ%rDcuB6YnuJ?*3)$1_(tM|%_~{v@$ciq?c%a}olW_2mvMy(TOm>}AYs~6A(G`#R?T=I10KWXhYbj{KVrM~ z{i=82f#O;uOq(jy8Of-z>GaX^N>s=i^*9++8*;n{vPDz!>&$2zEZRP$#?kl7pZk)m zPz1`b-l719hZ@!YfcTT+jMl^(2g2g-U+m3uUXbs0SYGMLh}QR-uyT23w9AThynNQ(}eUP)RcM503Xh zX8f(q%$ZGwJFJR&v3yXSZcj-nv=C)zx^4D)vyf}z{h|$5ckQz*L&CUK=x<7>@B2cU zzor(8O4$AP1T)LU4z7zX4G*gQeC2hY&~;*eZaXmLl~!O$&{&< z0A(qIt?d2%O&-!nC1UAUn7v=zrz41$u4Qt+a`7-Z;>0@8=}Ixwt`C0sJ6WY$m;| zq7v(*mI~=!4zu4btuD%H&~0KL`?O&s6(Ug}VcJw7QnN!9a#b@{A&SQdqg#pQ_gyx0 z*!#9uXwV@NrcD)s`!W5!Zr3(=A1665a9Pxn2WjeCA*d0~0d6EJNrwKx@wP%ex(?3q z>0sm?UbQ0 zMgVof^QREv;Y^mH;~k&6<%aKw6R*2^qG4omw{tig$ANR~unGZ>l>t{nr=5S@f_CobEEpLw`&#^{+OOq;6Zfn@ZU-urY@pNG~9@2&l+m*mw8IB-=nRxOfBk}z$k z7FG{ZH&(_C!Z=k3zKNq*75e=}HTQq5T8S1$-Ky}k%Xx2-3XysT3Dc$ukt~X`YQ`!A zJRa%jKl^s3f$Jg9zYbL2C`uz?+Ek&HNJgVNK9vs$*Gl)?pS0mvkT6~uHwfcaA*7g` zDx{ABWsn>>-UHma*{=;2g!nsee?R!^9N!tlYicAzO2Yn&Dg-?K{osG&+ko2+Ti2bh zaBY7Z2?^7t3OOJd_dJ?Y>HguZuJILH+`LhLw+}QjYHu|LGG+Tn0Vqcq`Ul5bh03M3 zG_Bgy#reS2-chUET3#esAyO|OVcJw7lI4Jk;HqY9g@8waLyH3g%dB$U61BIW;(hBd z6807{qa8IlE4nwk?#Oq(i1YIdkXRVoBLhL0cXe{@b4*8>x# z6lT;uyq1J%Q-#_g84m=Ps~k1`mEHCm)jR51ny9ZrFvH~>$Wl;|#-k7k-8-S6{c?J~RLE*!tHENLFYy%5d7b)iZ164woK^>v7$Ge&%En z#;ro^>rR(pzlai){!uJe5m$E1*e}|PV(O)h3a>vdSd#R|?LHKpD>yNy?8C-3SIoGl@w8j~<>s?bFwoiokT7kk&?Y2f?#5T<;x~4}*^zs^w>EpIbo&jf5b!Wd zyi_gZjh|?dU;atg4OiQeFm0-k3z9Kue3!fD3r{;7u#W0`wMtALf;cTKgk{1Ha(FnJ zEkC99nCL^McYr>9O8aO?le;5m-U^$o;EDyJ3vPugC@-1Dj~YxzTR4^8@<&! zX-i;pgFc=&vCh?pAp3qY6{%%sJnDilTU^^HL6O*R9=Z&r-ohE6E<0VF~}{r8gmAFmuC>u~GR8 zJ|!>&6)YNXZD)3VS=Xg)H@(U{=9LAqK;1LyA3y~MJi2~$>tFwLs?+-SRVUrKdBm86 zRa8jB#Kg(6VJ0aXNEZ7o2N*|*|D`hDm> z%urANbv=nVX-Biq)^3KBdhy}>yyNHFt~QB|nU7PG4h&1Q0?ur#G895PCg)fh<)p?L zfb%2xR1p~G!-0L@HgI5L&NxHlGdYypDh(H@io^c~GN>s&s!~8#X|e4Or4MAf;Ew!ZzI>Jz;(pH<-9ZtTGc zxUsR)JYa#m?7@kIX=A{`?E@<*_5)i8QrWNmH;_RsDUK9yPIBrEWcuoCe?)!@tA8)$ zZ^t9X%baJ4L!1=F!vh&?Yp@405~j_8tS6FDoq-H^um>^{rp-M#8i? zkhMoLsxy!Q5B8u%!n8S%0XKC9GT^};v`AQK9>_pm_CQ9$v^kJPA{qZTkfBN-Inss& zo&iwt6-NqE27qx6WN??cj827jJ5_F*zPIyP(W0=xCd;gq$o)V+Q$-2zSOt3y7GXx` z%YKFABP47(T{w7*75^{TJ#350e3W@OuX_4S=Zr~{)3TC0wt*Z_y^Jab zP{9F@v5iH&hkUs&on@Bn(LAT@1rnysu}X?$RA=`Pc(A{MLc+8;R!v1Rs>__Vn#7kFAYcG*af3nsw{K=g1H^;5L2%OniX&%EsUa8rZ zX(z|umd2c&*~~3DChVw@Q{0*EUas9%yd@2AaVXPk7MB{t z=bUui65%TJa9PruglThtvqdt-Pu$Sx^-76#?4x%V+pc86KE{TUeXbANwZfxuh4a6ArG`?kf(*ap0Wo;t;^T zW156%bATh=Wez-mmnv=v=g*yc@+jJI-lpM38}5fD05>+qJ;0IL4Q24%DRzbLsPZF5 zyBVOk1#8lmxAc4Ne0cww^V9cD_J!npxGn#EqOT~qrE}J?vic_i#!ZVu>DX9l9>_pm z$r#ZUr?4Z!1h;Ds21iZWN5Zr@kU1b3tlyQl3e6?-pUsck}{2=wYT4*4`m zymDAUT2ivkHxj1Jfh-rv=%|xve#2|AW2)&K|AWyh-ar+qG8({xee*U6;~vN~(&8Yh zqGK3D(hctrnGZMiSEYa(8`I`M20Fw3Iu~DVW4bn7Hf8Kp+eM-OY%kX*^aOBYW84E7 zsokLDBB$6Dia-?yjCONHk#Fn23n=V;*mm8C?pbRu8P$gLeA-Qvmp{K#{%1+}{Lyv3 zB>XW0xUn&93}ko}3ImYi+(5sy-YcbZ9ddUE={?&5+;*e?oDmbN{JnCYC`GWiV#Yh6 z5O6-6**8T3XEvtIfe&uBWZzuMhub5Fgj_LmUJikr>ynWuP=@}&@!oh#U-mS<`>5*n zD>tlYJFD)}Pl`IME6+NVgegi( z6^s^vl&?eL1|=6cMbbqe>!2(;pTxlAnbQy-77P1il%11k@3b^w{l(cm-!%djYz&IQ zu7p^G;ruE8hglq-y>8`za%HWT+Wu{0vb(}6V8O0{`H6_udX&_nkZcQr~gmg4 zjJx-m)5@=?$cp`e(XA;0JbtL^#JNE4onpGmbzodWm(;h{vwHS1g&kRyy%%`wJiYx! z-QW$bd(TeY-Ew8qP!fjAfjpTSL*fRpiku?pB2d*qD->afsfEzY!m_K4sn|+vWoaoi zHx&!J3ayNVQVUawNGcqr(*i~7DzdQZYGGz+YALobH#V`bu@H;RjV&c&6S0+*u~b66 zifK?$fxtwOO;G@S0PJg3Gn{R|u8zy9I~(0HjY!niGg)@#JV(!$2bva7MF*jOyG z>1tzcWNc+A5sIvgY)q}BQX{HHelH@rRB(^b<=s@3fW|}Nz)uNt-8i}%$(Urv8 zLd8FxSnJ%gBhtgV%ex*OnDSb&J7Ej88D-jQVB5qA()M<{E^JG=_;B@e5~ghn)#k{P z`)>_C31h`m53ZQ?z8BPmvTBBK;PIq&t!o!T2RJ2-xSv_qFFKWkK|a`(G7DuSHa9hv zh%8J^EJR(+Y`RKJ%({xjLK|~rxh!m?RysqG;QhTl1(O5;{y{#$KK_0J|1pAKgpBqd zKi=KX1K~b?!5sxb!R~>5M<9V~T*(RCg6y{@%a*$oVWUk=^V!*yx1s07muf3=6oW@Dwnwpr1O@%^noz9v0o~#T*IaHnyY%kD~ed`RQOVl2M(-9PnT-c}SR|v`k}5 z;)XK)?i8!^JIXwQEhM=;=(fU=WT zD3I?WL24;BmRgvZT1dr~Hl`9Akqw&o*;v|GN-U*9tFF}RPvjH8?<%L3hN<-q$EKzs zZbyFCv5rdhu|>e%*Mjp#>UK8WNIZc zHj{L<=qi>-BxnI@A~YA7TXZ$nX@fWl(QpUTI@-9=Bb@-v_W%uW_w)4SH|#w^nSm=d z?18ovP(g&iIAsql&qPUObV}Z)G2wW#-G`r5mK?DDv-#@z`xx&jDNkp%4f*fy&Cl9e z_ngDQ8$MqBw>=$C!Vc5%!DE;Y;_hcTl_QNpc8dK;0akiQiGUR@07Y#!#={`w!&}$n zDbZO~6RbiYwK5X{;lMNdq+ObMpPR1R-)9Y3^*O%-2}^~@v}17B%LxU#n5$z5k8HQZPj-1UJHI}E;L^mbDWzX5OjNRs z@{>%|v}Wi6!acg8irGQ6tXazAJ_e&cu9MDsFny|_PGK`evw^Ky5-M?)?Z8PjbT^4( z#?~(|u$@1Eg#Dm3Q#nJz8i9O8u@qpXhsCT}#M{;#%Xb>*uxD?};iprNPk_{_v<-Ns zWggj?m)+ZbaeT!&3r8PmO2YmF)(pgs9J8TCgTZ0a#bwg3Z#9@yorG~)GnFl-PBZEJ zz?@cW-qpm|+{n}v?Pm&2jZLjggqC6}8=;kvP%JeTcGUr^Z^yLyd|KEruiE?hCaErnos)db}e#;0_-%V{_;f!RZ%ie7*dQ%t>b#xEj{ugVCsb?V@OzOx3aDo-4iSK_-wP&E1+YNtm+CxOQn?s zo^#tzo!`d#xNA(?3$4F(+*6f={RgZph#faL$FBXhNzVIY$0tiSXXKNxQfy_d;9{ed zsl?P=Xdv(K=jsagAM>as|; z*4wWxt7h+XzhGLH@zy_VpSPn@2XzUIZxfd%%rLwsYFumD9TN6~_Bj@13r=xJkR!!^ z`NUzTDmDwQ(mel6Z=>VVtk2CIhXkrRD8)19{=6l7w@cTL^0@h^$x(L__8+j% zAa>tB-P@-fiWIG0UVZ4vFLlF77`J^^*Q2b;nO6?^Z$6T z?8zhXEFEu;)42}0z=MsIewztWd)^uqu=ayQoH%rZ_o#NByGax2L1@w8bU4l5I zSe(XlnVuROqWxBHD8GB2v2cy;!~y$TO)85;012@0JJ4~T_VEVG(oJmFn2*U7blrWK zgyHy*mg){gw@m&G5OO$o8NQcN4u228=X`vs2ZQN<&A|TPn8m@8!G^>7gpxYebJmN zO)oXcOzsC9*jNKxStyLbp^PD26mB0}a*@v&P!yy10i%83Uf0}nw;Neym9<;;XDgFn ztK4iz!iU>8znh~Mq5wgu#6+Yu6`P1`aJ$@u1zoqp7PLx-&f_2=sM z5AK5?m9_Z#7{(1X_>Cg?4;^(0~cvn^1YIy&mlTa?-sYm~JN{e$CeTSSKj z)yNxfVzbBVX`eO853@s5Nf^dD*swglW^Zz*7n8 z%v*p*?RTx#SIW6*J?~-n))k@*ElJq_YzwL=5(^M=in+@X`j<0+ z5sP_36@jPun@|}0iBO0R;W!SQvmNkgeEE{m|7-6_;A1+s9~zXWcvbqhw7r%-vAjqo zGfAdOXU`@}g-~tDWHL#Hm`P{JLJ@=r(ZrgzmLhgah3eOh-O%zs z=g$46GdK5+NjePb{4#er-*(RV&N<(5zkJ_-p6R`d#+Ckf?Y2eqXlY zygJv>riclY0x4@#M+u78j|(p^dn#p-WZ5n*+zTWD#CKBnI%Ejq7y}u!gJZFFi%}5fD7kMF$VyRy0SJ~2hKYhI)9z0SHP@R zAdXsUGX)8G#XKJZtKf&=wl;T2P!(t8yc99{m7H;Rtl45NG2_fUTbsFX-V`&=R@YRU zpGHXmRG$mybtmcIn0YH8!KW4#a7-GJt9(CFKDG4XFG*`YSn5~-b#3$s@VwCA<4IkL zee+cdyUi88(x-J87Y-X)0?zIPrwtGsbGKobD{p{PEaw*|uYClI2mx@=K+NmSnZe!hF!Ex1Ig(ngx? zs%Er^xVBs-koWsk1ry;YbGLtj>c=4VFn5w;Gv=LllD9JU!j7@QvlLsWK9k~G5x=cF zlc2in2m@!C7}dIe(uOW%h@V@ln3Qf4_s07z#PXk;C>Le@aw4*@s1qRp^C6C8BRuap zQ1HgHeJ)EES}H>?HeB`s7mi2>(>fblCqw}_=5E6knfJU(ahM9ltie{%g;?jcHvP9)=@N?-u;uX1QM6rX~xM5>N=zE1V!Hw$2J6P`Ve>x zf%ii#9=lgzOI&?YqBB!I;e}$}#Y_TXPWC-fhBEwNzm z{~j@Mu5Uzcy{m=RYZs3bS}`9|DVyM#{Y8TdNBE^_01qeV7n3+dr?n{cX85Pq>}bs} zomub#;NvVBi(VV0Gp8zy!_tigox$?bpEyBddlU-e2#D6$M^1#u!^}4dx?p#Z=%eF^N_iq+F`MFaK*Si66?W<@i`F4K2-tZ zyJDPeM!8G@yk=CvM0g&mptL8!K(FY9A;m-boma0-(YN~Xl{mV(UFiwR z4SDj-f4lit(}#y{n>i|9eq-%uE}Vx9goqc5romD61b4T)lZo*$hq=w!CNurdC#bR}kNFok`fBg`O1H`!bky0rV!nPx@4+Bi; z+qSpSn5bA>n9Sc|RCwHRc7(zYn?qLQEd5B97kXi_uG#9VNI9RrU>E}OU+1%4`=8mE z5jOi`PU^sKD*Ba@+%1DhEDQuK+!n-Yl z3V1tH|L2nt@hii({qxv3&4EQQLc6;`ApesK!{d}Gja5^JhVEE-@Z$koI1d?wcUy*; zC=meOmSLYQT+j{u2mqOKrt21_7hux~va?BrEk^Z$_#q~s#*Ijy!16m1)2Gp^KaJ@B zPR?j4QQ@;phSjX-iYpV#fmEI~v5_6l&xk|L#Y*k;d#$@ z?W*1|>Eq(1mlch|BzLC(`o+zQt%+hHqp2kNjFu!V9 z8rT8PY)#_Ac~g^y0gYeG36KA1Z$i{KdCvo-t(9iN1K|VT9f7S$#Y~{vJ_+Z#Xu$bz z@JR}o(9)T3?g}Qnc)gO4p{K@PslT{oqY1}{M9!KzcS*DFT5TeAb(W!`npdJAfVbgK zfWRvFA-LVUUYXUhUXUV2T{QRSOOajbL=X}%6C&oF@O*Jv?->I>xgN0~>$t?P)P?)v=_-8W7|Cv{o>}u$?^C?qO8>&gi~5tBg$GYIC^XPTm$BVr8t#@NCw#I zqGs^C>hhq>9?yTmg&IhKizuc=(u(fnTb3b{siLQ*>juqZ*JdUO8mSo;~Km zJ;bxegjHO!$u)b7%fz|xuCxrR0>#9hRp!EZs3++8S>+Fa0rvTa$e1g}+2-}gdE;H6 zF1+5@A4F4yA_8#R3CA_4ig6zxpoJB^{(wg(3oQTV2AEwUTq2 zx~Zp|N9B*By4XiGm4vpcePc|<2U9c6A~~VBIb|axqXOH-TTS{S$^JP>l+=qt>D5DIbhm5^aZ+fc(3+t z*Yk}LdY9SlnlD*7KoY&Ge98pl!puUtXe=HdIDoA#3MLM3U$26RQ0)^ZnZf!CUv{Xv zE<8aM6ztg{;j0Ogo)V;A2wf@M`0H~|hS^mQIRr{*Kz;tW{o#9>L@J@uyYqJuK%r#Z*g#5j zBBJ!TA^Z3>>N3)gfg>Q<-&QW*XG^%yV?(a@KYSG zwcJ8M0uWzAF#;Fc(Duy`vYB_maOUAGb1z};J|qHu6Rcuh+;)9!64uR&T79&4e&6LI zt(|+#A>?2_!~~Fs(z;(fzbto;a(u|O=l4~%+`)w-EYUR3?6iYNkx(pFiqtBRTp|ky z@fRv(!a$)|E`tM20%1oU8NC>W{-|l&gy+vso7lHTaHPqGVXnLZ4zZ94+leXucC5`G zGq0g=4?ealcl6h*+~IA_bW`v2LWW>hhOZd=a5 zeSft5qV9F+vbNt^#T~=u5?V1IVmUZ3ax`RW!_Q6~QO_`cyJ1Lm@QWx|tdz;% zY#p(GfGh}(4ud1Y#EL+Pce+c&nz2II9v@}MrMiem6L4h)D3`9EpWit-dtBt?P2UWX zjHJeL;XGsp-t9(tRo!Eu8hE|G6sp0q?vRqOSMF#5K1I+IG#!YN2Mvm-Z2!S z?2*9RzU%&X+MfyzoA=AC*W=IsoCm188U*rxX~n|k3(WtDp4flF?ia(=K3urJxj~TL z!e1C@<7YfxgNTK|D)=F|-5olUxpv8(o&Sv96tjHE?cYnCHa8*;bU$QxepPYof5!>b z8_Iik_1oLzG#8FANK-&7RXcc;DMFO6V=Ep4D2JmYgB7Ac|3DaCi^MXaNDSL4d%HVi z1tNc~KR0~V@GRx>gW2gmZ_fD+SwIemY2Z5>Pz2MSGzVHM??mTq`86kTlV(2`?r*O4 zWO#Y6)II^Kp$dKoZmWH7pKC?ObB9NlWqjYs((P&?m#hB-GAueW-|x=O*r7*N=I?*CTg4(*92qKsb*`U_@L+Qda`QB=PcW;3$I4vT(Gy{Ih( zJp+gQQSt|u*SLL=UI(=QMSp{IT_Fq5R1o`cB)|xM}pHIpYt#Uc4gPu`) z`QzZ$8FThoyer#9~YOMSo{I4i~SH~@;*GBn+ zZ>GL^;I}coa~haijefS}WJl$PmV|~+;cB)TGxxX5m#+I&IRE{VLuPT|MlbBKfxJ{#n&sKbASu-q3`-up>)+P)vEdp zqMk0L265p+Fe3(>c&l^od3y=UwYHjfX4@z#Y*|3(!CKA!%}9znyp2BAdW8RYZP>E& z*{u)xl|&+MY#h;S%+rZCK_^53IBJCr!(4d-9AcpwSxi>mZ8Jzzci4Gy^qpx(te>k2 z{H~UlZmCE^cGx)jUqP8n?dPXR%4*7 zW*wZfW47otNf<#xnRV$Jlg6T>LUk56S{(M;sN)gQz(B?IKl(9jxK-5~Z;C5pdn}U9 zlb2i>?c3`KlnopA*oV^+ePDe!Rhyw}+>yPnO^h#97oL5tWa60>PFpAvAAT74X8Uk1 z+-Rb4aJL%|jl1`L?hPnM5r6W-iZgX%3Vjz`*}6Mr8y0;x$AEmWeK;4+n?76$G}gw4 zBOh#k&4s(iKHOuD3TbCMY%bj2(TSrR*bbWu_eePL`}8jcWbtc_J${WB0pt2O{(&h} zZ58|w+@3Ejk4qd8Yy4VTGUK9f?db2eJ9f5wY9Tib_!q6WR|hRsN}I+ zIB)uOY&pU@uNxq$+#Ejj^rii)Uzsuu$-kRlM?T&>vF5$+uKXk|k}oVcy&~c#E}S>~ zI?|8e4iCnZ%I5$2dA@2(|Du`id{g!;^1#LsJ;gko+ui>m3V_tU=ND&UDsdlm1*9ACA!1g;;n0k7u}f=^TC1ED&7D;}M%- z{)Y=+R;zi2!~utY{91KIy`=8e$~C_wr4nsMxspEW5qM^A#>$2BrZ2-yUfG-4A`h-~ z1H+MzNWs>i|D;TbTqnvkZl5*n8W+wRz6@zcSO7n&QOh>g8(GTfZ=Nk%zCv&t@$T@J zobcMNg4cdkO}O^c+aWK$Li5YU@lK8kJn~tr8IT$UgLD|lr%}E2W=qczNWC3sw@TjJ z;i+xG^10 z)T#%5yD(hPaEw6u&dY69g`Qj#!{x-$L9(4V7tR|_oH&C~K;x`~Gpq|TKa!P=*!)%( z!xLX&b=}Pwa5;Z2oHv{`;SG(EEq`};V>@i*jg9lB6UXHVwQ=Ie2iswD;r=d89C>Fu zaW33L>BJqKQWszpdv0hP9pQ&y|CXEpFBtG9{1EH`8hGIhNaG7g;tNRT3rOS(NZ|`e zM zy&?SMp>czwW1>~nBJw5fgaHh&Ge^~F&xG042z!4Bx$x`WrAwoRR2NENgf#&stJb17 z8Yr{Yq))eWqn8rENefyXWie9bbWNs#(vkxf%#_BEL?sz1qa{^mf>i_-Yq}qumDFH_ z)dYAt11>g5g4G6;!lZ-A3pp%GNH^&X7Ao0lpi9E|-36#w2+zRJiHI_s8lT>d=fvV7(8S&zB zjbX4-LvGclB`J(%i^_n@JCdmIWKv_rD~{@G-D#nN13(8bRA{Z z8$eO?mQH3W9g4>jI&>yKB#MJnC=Hj*VD?5sS~islB0?oIff|`m%V5Jpz`z2PMC1}A zV5WTah73R&P1)V3bWkya1t-JoNJ?kX`gOKx6fO@zK#hsDCZ_4N-PNJ?nh3|;6q7-% z9W*8aDy4>%A@zDiJgAjG%O3q&jDu^!{|a>kG!$YIe(($?L8-8UZOV`O16r5@Yn7;E zqlwl$N<-VZqt8GSlVhw{h+hj&flHm-D-|Nznqo)mRv6RL^k(pxc2?qT)=i-zHgw1t zEyqSbWz5i-(lqJlL2b^HW~&>`rY=h}EImyJ#$_`gu#B{!=m5ZN8UYKdyi!uYuITL5 zAQxEkWw4lSGBeW0K<0m{i_`BRSaztXxHq12N&*fN9S=z=W$2p zaYrYq<~`1bwxfe%uZOOq^DINOV@Jo{dA4_S9uH$+X#02=V;h40rSaqgYu&BD5U?lX zIK$GK!EsL6w1q%d;~vcHC-@<>gCA@tBMuG;l#7%Sr35x!f{iw0fig*eOdTvzDbzAS zARU$KEZ}dL5OQ<%9?eAhp1Gq(qTwif3yfu+s|9`z0pUzwFj5ZiqU{FjobdtkiBrVU zFG^jq#+qhvdR8&1++G#hw8y94eb{%0bbXHve&Q4VnXr&44!<2B(52$TAiMxLay{6F z5>#X4Br9SQzKA%oaLkd3C)ho%%e>-W7U%f&s5pw%i`DE18K*;D^*K=9*`GmT{Qn24 C!x}~a literal 428496 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 From 0778f648db0f5f55ee509889da7bca7410481c65 Mon Sep 17 00:00:00 2001 From: Panakotta00 Date: Thu, 14 Nov 2024 22:35:34 +0100 Subject: [PATCH 15/33] feat: Make Lua runtime modular & separate concerns --- .../Private/Signals/FINSignalSubsystem.cpp | 35 +- .../Public/Signals/FINSignalSubsystem.h | 6 +- .../Private/FicsItKernel/FicsItKernel.cpp | 20 - .../Public/FicsItKernel/FicsItKernel.h | 5 - .../Private/CMD/FINCMDGenJsonDoc.cpp | 2 +- .../Private/CMD/FINCMDGenLuaDoc.cpp | 2 +- .../Private/FINLua/API/LuaComponentAPI.cpp | 40 +- .../Private/FINLua/API/LuaComputerAPI.cpp | 346 +------- .../Private/FINLua/API/LuaDebugAPI.cpp | 4 +- .../Private/FINLua/API/LuaEventAPI.cpp | 152 ++-- .../Private/FINLua/API/LuaFileSystemAPI.cpp | 193 +---- .../Private/FINLua/API/LuaKernelAPI.cpp | 316 +++++++ .../Private/FINLua/API/LuaWorldAPI.cpp | 117 +++ .../Private/FINLua/FINLuaModule.cpp | 104 ++- .../Private/FINLua/FINLuaRuntime.cpp | 255 ++++++ .../Private/FINLua/FINLuaThreadedRuntime.cpp | 140 +++ .../{LuaGlobalLib.cpp => LuaBaseModule.cpp} | 314 +++---- .../Private/FINLua/LuaFuture.cpp | 22 +- .../Private/FINLua/LuaMiscModules.cpp | 115 +++ .../Private/FINLua/LuaUtil.cpp | 33 +- .../Private/FINLua/Reflection/LuaObject.cpp | 37 +- .../Private/FINLua/Reflection/LuaRef.cpp | 15 +- .../Private/FINLua/Reflection/LuaStruct.cpp | 52 +- .../Private/FINLuaProcessor.cpp | 808 +++--------------- ...orage.cpp => FINLuaRuntimePersistence.cpp} | 19 +- .../Public/FINLua/API/LuaComponentAPI.h | 49 ++ .../Public/FINLua/API/LuaFileSystemAPI.h | 3 + .../Public/FINLua/API/LuaKernelAPI.h | 12 + .../Public/FINLua/API/LuaWorldAPI.h | 9 + .../Public/FINLua/FINLuaModule.h | 27 +- .../Public/FINLua/FINLuaReferenceCollector.h | 109 +++ .../Public/FINLua/FINLuaRuntime.h | 98 +++ .../Public/FINLua/FINLuaThreadedRuntime.h | 106 +++ .../Public/FINLua/LuaEventAPI.h | 48 +- .../Public/FINLua/LuaExtraSpace.h | 25 - .../Public/FINLua/LuaGlobalLib.h | 7 - .../Public/FINLua/LuaPersistence.h | 5 + .../FicsItNetworksLua/Public/FINLua/LuaUtil.h | 11 +- .../Public/FINLua/Reflection/LuaObject.h | 14 +- .../Public/FINLua/Reflection/LuaStruct.h | 12 +- .../Public/FINLuaProcessor.h | 210 +---- ...teStorage.h => FINLuaRuntimePersistence.h} | 6 +- .../Public/FicsItNetworksLuaModule.h | 2 +- 43 files changed, 2015 insertions(+), 1890 deletions(-) create mode 100644 Source/FicsItNetworksLua/Private/FINLua/API/LuaKernelAPI.cpp create mode 100644 Source/FicsItNetworksLua/Private/FINLua/API/LuaWorldAPI.cpp create mode 100644 Source/FicsItNetworksLua/Private/FINLua/FINLuaRuntime.cpp create mode 100644 Source/FicsItNetworksLua/Private/FINLua/FINLuaThreadedRuntime.cpp rename Source/FicsItNetworksLua/Private/FINLua/{LuaGlobalLib.cpp => LuaBaseModule.cpp} (51%) create mode 100644 Source/FicsItNetworksLua/Private/FINLua/LuaMiscModules.cpp rename Source/FicsItNetworksLua/Private/{FINLuaProcessorStateStorage.cpp => FINLuaRuntimePersistence.cpp} (72%) create mode 100644 Source/FicsItNetworksLua/Public/FINLua/API/LuaComponentAPI.h create mode 100644 Source/FicsItNetworksLua/Public/FINLua/API/LuaKernelAPI.h create mode 100644 Source/FicsItNetworksLua/Public/FINLua/API/LuaWorldAPI.h create mode 100644 Source/FicsItNetworksLua/Public/FINLua/FINLuaReferenceCollector.h create mode 100644 Source/FicsItNetworksLua/Public/FINLua/FINLuaRuntime.h create mode 100644 Source/FicsItNetworksLua/Public/FINLua/FINLuaThreadedRuntime.h delete mode 100644 Source/FicsItNetworksLua/Public/FINLua/LuaExtraSpace.h delete mode 100644 Source/FicsItNetworksLua/Public/FINLua/LuaGlobalLib.h rename Source/FicsItNetworksLua/Public/{FINLuaProcessorStateStorage.h => FINLuaRuntimePersistence.h} (78%) diff --git a/Source/FicsItNetworksCircuit/Private/Signals/FINSignalSubsystem.cpp b/Source/FicsItNetworksCircuit/Private/Signals/FINSignalSubsystem.cpp index 1bdf71227..7367802fd 100644 --- a/Source/FicsItNetworksCircuit/Private/Signals/FINSignalSubsystem.cpp +++ b/Source/FicsItNetworksCircuit/Private/Signals/FINSignalSubsystem.cpp @@ -1,4 +1,6 @@ #include "Signals/FINSignalSubsystem.h" + +#include "FicsItNetworksCircuit.h" #include "Subsystem/SubsystemActorManager.h" #include "Engine/Engine.h" #include "FIRHookSubsystem.h" @@ -30,7 +32,7 @@ void AFINSignalSubsystem::BeginPlay() { Super::BeginPlay(); AFIRHookSubsystem* HookSubsystem = AFIRHookSubsystem::GetHookSubsystem(this); - if (HookSubsystem) for (const TPair& Sender : Listeners) { + if (HookSubsystem) for (const TPair& Sender : Senders) { HookSubsystem->AttachHooks(Sender.Key); } else { UE_LOG(LogFicsItNetworksCircuit, Warning, TEXT("Hook Subsystem not found! Unable to reattach hooks!")); @@ -39,12 +41,12 @@ void AFINSignalSubsystem::BeginPlay() { void AFINSignalSubsystem::Cleanup() { TArray ListenerKeys; - Listeners.GetKeys(ListenerKeys); + Senders.GetKeys(ListenerKeys); for (UObject* Sender : ListenerKeys) { if (!IsValid(Sender)) { - Listeners.Remove(Sender); + Senders.Remove(Sender); } else { - TArray& Listen = Listeners[Sender].Listeners; + TArray& Listen = Senders[Sender].Listeners; for (int i = 0; i < Listen.Num(); ++i) { const FFIRTrace& Listener = Listen[i]; if (!IsValid(Listener.GetUnderlyingPtr())) { @@ -52,7 +54,7 @@ void AFINSignalSubsystem::Cleanup() { } } if (Listen.Num() < 1) { - Listeners.Remove(Sender); + Senders.Remove(Sender); } } } @@ -66,7 +68,7 @@ AFINSignalSubsystem* AFINSignalSubsystem::GetSignalSubsystem(UObject* WorldConte } void AFINSignalSubsystem::BroadcastSignal(UObject* Sender, const FFINSignalData& Signal) { - FFINSignalListeners* ListenerList = Listeners.Find(Sender); + FFINSignalListeners* ListenerList = Senders.Find(Sender); if (!ListenerList) return; for (const FFIRTrace& ReceiverTrace : ListenerList->Listeners) { if (&ReceiverTrace == nullptr) { @@ -81,13 +83,13 @@ void AFINSignalSubsystem::BroadcastSignal(UObject* Sender, const FFINSignalData& } void AFINSignalSubsystem::Listen(UObject* Sender, const FFIRTrace& Receiver) { - TArray& ListenerList = Listeners.FindOrAdd(Sender).Listeners; + TArray& ListenerList = Senders.FindOrAdd(Sender).Listeners; ListenerList.AddUnique(Receiver); AFIRHookSubsystem::GetHookSubsystem(Sender)->AttachHooks(Sender); } void AFINSignalSubsystem::Ignore(UObject* Sender, UObject* Receiver) { - FFINSignalListeners* ListenerList = Listeners.Find(Sender); + FFINSignalListeners* ListenerList = Senders.Find(Sender); if (!ListenerList) return; for (int i = 0; i < ListenerList->Listeners.Num(); ++i) { if (ListenerList->Listeners[i].GetUnderlyingPtr() == Receiver) { @@ -101,18 +103,19 @@ void AFINSignalSubsystem::Ignore(UObject* Sender, UObject* Receiver) { } void AFINSignalSubsystem::IgnoreAll(UObject* Receiver) { - TArray Senders; - Listeners.GetKeys(Senders); - for (UObject* Sender : Senders) { + TArray senders; + Senders.GetKeys(senders); + for (UObject* Sender : senders) { Ignore(Sender, Receiver); } } -TArray AFINSignalSubsystem::GetListening(UObject* Reciever) { - TArray Listening; - for (TPair Sender : Listeners) { - if (Sender.Value.Listeners.Contains(FFIRTrace(Reciever))) { - Listening.Add(Sender.Key); +TArray AFINSignalSubsystem::GetListening(UObject* Reciever) { + TArray Listening; + for (TPair Sender : Senders) { + size_t index = Sender.Value.Listeners.Find(FFIRTrace(Reciever)); + if (index != INDEX_NONE) { + Listening.Add(Sender.Value.Listeners[index].Reverse() / Sender.Key); } } return Listening; diff --git a/Source/FicsItNetworksCircuit/Public/Signals/FINSignalSubsystem.h b/Source/FicsItNetworksCircuit/Public/Signals/FINSignalSubsystem.h index a1f26febb..019946fdb 100644 --- a/Source/FicsItNetworksCircuit/Public/Signals/FINSignalSubsystem.h +++ b/Source/FicsItNetworksCircuit/Public/Signals/FINSignalSubsystem.h @@ -32,7 +32,7 @@ class FICSITNETWORKSCIRCUIT_API AFINSignalSubsystem : public AModSubsystem, publ * Map of sender objects to array of receiver traces, traces point from sender to receiver */ UPROPERTY(SaveGame) - TMap Listeners; + TMap Senders; public: // Begin IFGSaveInterface @@ -49,7 +49,7 @@ class FICSITNETWORKSCIRCUIT_API AFINSignalSubsystem : public AModSubsystem, publ static void AddReferencedObjects(UObject* InThis, FReferenceCollector& ReferenceCollector) { Super::AddReferencedObjects(InThis, ReferenceCollector); AFINSignalSubsystem* SigSubSys = Cast(InThis); - for (TPair& Listener : SigSubSys->Listeners) Listener.Value.AddStructReferencedObjects(ReferenceCollector); + for (TPair& Listener : SigSubSys->Senders) Listener.Value.AddStructReferencedObjects(ReferenceCollector); } /** @@ -93,5 +93,5 @@ class FICSITNETWORKSCIRCUIT_API AFINSignalSubsystem : public AModSubsystem, publ * Returns all the objects this object listens to */ UFUNCTION(BlueprintCallable, Category="Network|Signals") - TArray GetListening(UObject* Reciever); + TArray GetListening(UObject* Reciever); }; diff --git a/Source/FicsItNetworksComputer/Private/FicsItKernel/FicsItKernel.cpp b/Source/FicsItNetworksComputer/Private/FicsItKernel/FicsItKernel.cpp index b03404d1a..e0cffd474 100644 --- a/Source/FicsItNetworksComputer/Private/FicsItKernel/FicsItKernel.cpp +++ b/Source/FicsItNetworksComputer/Private/FicsItKernel/FicsItKernel.cpp @@ -53,16 +53,6 @@ UFINKernelSystem::UFINKernelSystem() { FileSystemListener = MakeShared(this); } -void UFINKernelSystem::AddReferencedObjects(UObject* InThis, FReferenceCollector& Collector) { - Super::AddReferencedObjects(InThis, Collector); - - UFINKernelSystem* This = Cast(InThis); - FScopeLock Lock(&This->ReferenceObjectMutex); - for (const TPair>& Referencer : This->ReferencedObjects) { - Referencer.Value(Referencer.Key, Collector); - } -} - void UFINKernelSystem::Serialize(FStructuredArchive::FRecord Record) { Super::Serialize(Record); @@ -369,16 +359,6 @@ int64 UFINKernelSystem::GetTimeSinceStart() const { return (FDateTime::Now() - FFicsItNetworksComputerModule::GameStart).GetTotalMilliseconds() - SystemResetTimePoint; } -void UFINKernelSystem::AddReferencer(void* Referencer, const TFunction& CollectorFunc) { - UE::TScopeLock Lock(ReferenceObjectMutex); - ReferencedObjects.FindOrAdd(Referencer) = CollectorFunc; -} - -void UFINKernelSystem::RemoveReferencer(void* Referencer) { - UE::TScopeLock Lock(ReferenceObjectMutex); - ReferencedObjects.Remove(Referencer); -} - FInventoryItem UFINKernelSystem::GetEEPROM() { if (OnGetEEPROM.IsBound()) { return OnGetEEPROM.Execute(); diff --git a/Source/FicsItNetworksComputer/Public/FicsItKernel/FicsItKernel.h b/Source/FicsItNetworksComputer/Public/FicsItKernel/FicsItKernel.h index b2ead0b47..92aba9005 100644 --- a/Source/FicsItNetworksComputer/Public/FicsItKernel/FicsItKernel.h +++ b/Source/FicsItNetworksComputer/Public/FicsItKernel/FicsItKernel.h @@ -86,10 +86,7 @@ class FICSITNETWORKSCOMPUTER_API UFINKernelSystem : public UObject, public IFGSa TSharedPtr FileSystemListener; // Cache - TSharedPtr ReadyToUnpersist = nullptr; TQueue>> FutureQueue; - FCriticalSection ReferenceObjectMutex; - TMap> ReferencedObjects; FFileSystemSerializationInfo FileSystemSerializationInfo; public: @@ -109,8 +106,6 @@ class FICSITNETWORKSCOMPUTER_API UFINKernelSystem : public UObject, public IFGSa TDelegate OnSetEEPROM; // Begin UObject - static void AddReferencedObjects(UObject* InThis, FReferenceCollector& Collector); - //virtual void Serialize(FArchive& Ar) override; virtual void Serialize(FStructuredArchive::FRecord Record) override; virtual void BeginDestroy() override; // End UObject diff --git a/Source/FicsItNetworksDocumentation/Private/CMD/FINCMDGenJsonDoc.cpp b/Source/FicsItNetworksDocumentation/Private/CMD/FINCMDGenJsonDoc.cpp index e5abe2e07..44cdc1c82 100644 --- a/Source/FicsItNetworksDocumentation/Private/CMD/FINCMDGenJsonDoc.cpp +++ b/Source/FicsItNetworksDocumentation/Private/CMD/FINCMDGenJsonDoc.cpp @@ -311,7 +311,7 @@ namespace FINGenJsonDoc { TSharedRef modules = MakeShared(); const auto& moduleRegistry = FFINLuaModuleRegistry::GetInstance(); - for (const TSharedRef& module : moduleRegistry.Modules) { + for (const auto& [_, module] : moduleRegistry.Modules) { modules->SetObjectField(module->InternalName, GenLuaModule(module)); } doc->SetObjectField(TEXT("modules"), modules); diff --git a/Source/FicsItNetworksDocumentation/Private/CMD/FINCMDGenLuaDoc.cpp b/Source/FicsItNetworksDocumentation/Private/CMD/FINCMDGenLuaDoc.cpp index f8d5f12b7..49e26042e 100644 --- a/Source/FicsItNetworksDocumentation/Private/CMD/FINCMDGenLuaDoc.cpp +++ b/Source/FicsItNetworksDocumentation/Private/CMD/FINCMDGenLuaDoc.cpp @@ -428,7 +428,7 @@ namespace FINGenLuaDoc { str.Append(TEXT("---@meta\n\n")); const auto& moduleRegistry = FFINLuaModuleRegistry::GetInstance(); - for (const TSharedRef& module : moduleRegistry.Modules) { + for (const auto& [_, module] : moduleRegistry.Modules) { WriteModule(str, module); } diff --git a/Source/FicsItNetworksLua/Private/FINLua/API/LuaComponentAPI.cpp b/Source/FicsItNetworksLua/Private/FINLua/API/LuaComponentAPI.cpp index 11a39fdeb..dd329aed4 100644 --- a/Source/FicsItNetworksLua/Private/FINLua/API/LuaComponentAPI.cpp +++ b/Source/FicsItNetworksLua/Private/FINLua/API/LuaComponentAPI.cpp @@ -1,4 +1,9 @@ -#include "FINLuaProcessor.h" +#include "FINLua/API/LuaComponentAPI.h" + +#include +#include + +#include "FINLuaThreadedRuntime.h" #include "FINNetworkUtils.h" #include "NetworkController.h" #include "FINLua/FINLuaModule.h" @@ -7,7 +12,9 @@ namespace FINLua { LuaModule(R"(/** - * @LuaModule Component Component Module + * @LuaModule ComponentModule + * @DisplayName Component Module + * @Dependency FullReflectionModule * * The Component Module contains the component Library. */)", ComponentModule) { @@ -33,7 +40,7 @@ namespace FINLua { * @return ... Object | Object[] | nil Object[s] The Network-Component[-Array]s associated with the UUIDs, nil if the UUID was not found. */)", proxy) { // ReSharper disable once CppDeclaratorNeverUsed - FLuaSyncCall SyncCall(L); + FLuaSync SyncCall(L); const int args = lua_gettop(L); for (int i = 1; i <= args; ++i) { @@ -55,15 +62,15 @@ namespace FINLua { } int j = 0; for (const auto& id : ids) { - UFINLuaProcessor* Processor = UFINLuaProcessor::luaGetProcessor(L); + IFINLuaComponentNetworkAccessInterface* network = luaFIN_getComponentNetwork(L); FGuid UUID; FGuid::Parse(FString(id.c_str()), UUID); - FFIRTrace comp = Processor->GetKernel()->GetNetwork()->GetComponentByID(UUID); + FFIRTrace comp = network->GetComponentByID(UUID); luaFIN_pushObject(L, UFINNetworkUtils::RedirectIfPossible(comp)); if (isT) lua_seti(L, -2, ++j); } } - return UFINLuaProcessor::luaAPIReturn(L, args); + return args; } LuaModuleTableFunction(R"(/** @@ -77,18 +84,19 @@ namespace FINLua { * @return ... string[] UUIDs List of network component UUIDs which pass the given nick query or are of the given type. */)", findComponent) { // ReSharper disable once CppDeclaratorNeverUsed - FLuaSyncCall SyncCall(L); + FLuaSync SyncCall(L); const int args = lua_gettop(L); for (int i = 1; i <= args; ++i) { lua_newtable(L); TSet comps; + IFINLuaComponentNetworkAccessInterface* network = luaFIN_getComponentNetwork(L); if (lua_isstring(L, i)) { std::string nick = lua_tostring(L, i); - comps = UFINLuaProcessor::luaGetProcessor(L)->GetKernel()->GetNetwork()->GetComponentByNick(nick.c_str()); + comps = network->GetComponentByNick(nick.c_str()); } else { UClass* Class = luaFIN_toUClass(L, i, nullptr); - comps = UFINLuaProcessor::luaGetProcessor(L)->GetKernel()->GetNetwork()->GetComponentByClass(Class, true); + comps = network->GetComponentByClass(Class, true); } int j = 0; for (const FFIRTrace& comp : comps) { @@ -101,8 +109,20 @@ namespace FINLua { } } } - return UFINLuaProcessor::luaAPIReturn(L, args); + return args; } } } + + void luaFIN_setComponentNetwork(lua_State* L, IFINLuaComponentNetworkAccessInterface* ComponentNetwork) { + FFINLuaRuntime& runtime = luaFIN_getRuntime(L); + runtime.GlobalPointers.Add(TEXT("component-network"), ComponentNetwork); + } + + IFINLuaComponentNetworkAccessInterface* luaFIN_getComponentNetwork(lua_State* L) { + FFINLuaRuntime& runtime = luaFIN_getRuntime(L); + IFINLuaComponentNetworkAccessInterface** value = reinterpret_cast(runtime.GlobalPointers.Find(TEXT("component-network"))); + fgcheck(value != nullptr); + return *value; + } } diff --git a/Source/FicsItNetworksLua/Private/FINLua/API/LuaComputerAPI.cpp b/Source/FicsItNetworksLua/Private/FINLua/API/LuaComputerAPI.cpp index cca3f0633..e9aa97644 100644 --- a/Source/FicsItNetworksLua/Private/FINLua/API/LuaComputerAPI.cpp +++ b/Source/FicsItNetworksLua/Private/FINLua/API/LuaComputerAPI.cpp @@ -1,81 +1,34 @@ #include "FGAttentionPingActor.h" #include "FGPlayerController.h" -#include "FINLua/Reflection/LuaClass.h" -#include "FINLua/Reflection/LuaObject.h" #include "FINLuaProcessor.h" -#include "FINItemStateEEPROMText.h" -#include "FGTimeSubsystem.h" -#include "FILLogContainer.h" -#include "FILLogEntry.h" #include "FINMediaSubsystem.h" -#include "FINNetworkUtils.h" #include "FicsItKernel/Network/NetworkController.h" #include "FINLua/FINLuaModule.h" -#include "FINLua/LuaPersistence.h" -#include "FINLua/Reflection/LuaStruct.h" -#include "UI/FGGameUI.h" - -#define LuaFunc() \ - UFINLuaProcessor* processor = UFINLuaProcessor::luaGetProcessor(L); \ - UFINKernelSystem* kernel = processor->GetKernel(); \ - FLuaSyncCall SyncCall(L); namespace FINLua { LuaModule(R"(/** - * @LuaModule Computer + * @LuaModule ComputerModule * @DisplayName Computer Module - * @Dependency ReflectionSystemObjectModule * * The Computer Module provides the Computer Library. - */)", Computer) { + */)", ComputerModule) { LuaModuleLibrary(R"(/** * @LuaLibrary computer * @DisplayName Computer Library * * The Computer Library provides functions for interaction with the computer and especially the Lua Runtime. */)", computer) { - LuaModuleTableFunction(R"(/** - * @LuaFunction (usage: int, capacity: int) getMemory() - * @DisplayName Get Memory - * - * Returns the used memory and memory capacity the computer has. - * - * @return usage int Usage The memory usage at the current time - * @return capacity int Capacity The memory capacity the computer has - */)", getMemory) { - LuaFunc() - - int64 Usage = kernel->GetMemoryUsage(); - int64 Capacity = kernel->GetCapacity(); - lua_pushinteger(L, Usage); - lua_pushinteger(L, Capacity); - return 2; - } - LuaModuleTableFunction(R"(/** - * @LuaFunction ComputerCase getInstance() - * @DisplayName Get Instance - * - * Returns a reference to the computer case in which the current code is running. - * - * @return case ComputerCase The computer case this lua runtime is running in. - */)", getInstance) { - LuaFunc() - - luaFIN_pushObject(L, UFINNetworkUtils::RedirectIfPossible(FFIRTrace(kernel->GetNetwork()->GetComponent().GetObject()))); - return UFINLuaProcessor::luaAPIReturn(L, 1); - } - LuaModuleTableFunction(R"(/** * @LuaFunction reset() * @DisplayName Reset * * Stops the current code execution immediately and queues the system to restart in the next tick. */)", reset) { - LuaFunc(); - - processor->GetTickHelper().shouldReset(); - lua_yield(L, 0); - return 0; + FFINLuaRuntime* runtime = &luaFIN_getRuntime(L); + runtime->TickActions.Enqueue([runtime]() { + runtime->Reset(); + }); + return lua_yield(L, 0); } LuaModuleTableFunction(R"(/** @@ -85,27 +38,12 @@ namespace FINLua { * Stops the current code execution. + * Basically kills the PC runtime immediately. */)", stop) { - LuaFunc(); - - processor->GetTickHelper().shouldStop(); - lua_yield(L, 0); - return 0; - } - - LuaModuleTableFunction(R"(/** - * @LuaFunction panic(error: string) - * @DisplayName Panic - * - * Crashes the computer with the given error message. - */)", panic) { - LuaFunc(); - - processor->GetTickHelper().shouldCrash(MakeShared(FString("PANIC! '") + luaL_checkstring(L, 1) + "'")); - kernel->PushFuture(MakeShared>(FFINFunctionFuture([kernel]() { - kernel->GetAudio()->Beep(); - }))); - lua_yield(L, 0); - return 0; + FFINLuaRuntime& runtime = luaFIN_getRuntime(L); + runtime.TickActions.Enqueue([]() { + //kernel->Stop(); + // TODO: Fix computer.stop() + }); + return lua_yield(L, 0); } LuaModuleTableFunction(R"(/** @@ -119,223 +57,6 @@ namespace FINLua { return 0; } - LuaModuleTableFunction(R"(/** - * @LuaFunction promote() - * @DisplayName Promote - * - * This function is mainly used to allow switching to a higher tick runtime state. - * Usually you use this when you want to make your code run faster when using functions that can run in asynchronous environment. - */)", promote) { - UFINLuaProcessor* processor = UFINLuaProcessor::luaGetProcessor(L); - processor->GetTickHelper().shouldPromote(); - return UFINLuaProcessor::luaAPIReturn(L, 0); - } - - LuaModuleTableFunction(R"(/** - * @LuaFunction demote() - * @DisplayName Demote - * - * This function is used to allow switching back to the normal tick rate. - */)", demote) { - FLuaSyncCall Sync(L); - return UFINLuaProcessor::luaAPIReturn(L, 0); - } - - LuaModuleTableFunction(R"(/** - * @LuaFunction bool isPromoted() - * @DisplayName Is Promoted - * - * Returns true if the Lua runtime is currently promoted/elevated. - * Which means its running in an seperate game thread allowing for fast bulk calculations. - * - * @return isPromoted bool True if the currenty runtime is running in promoted/elevated tick state. - */)", isPromoted) { - UFINLuaProcessor* processor = UFINLuaProcessor::luaGetProcessor(L); - bool bPromoted = (bool)(processor->GetTickHelper().getState() & LUA_ASYNC); - lua_pushboolean(L, bPromoted); - return 1; - } - - LuaModuleTableFunction(R"(/** - * @LuaFunction int state() - * @DisplayName State - * - * DEPRECATED! Please use `isPromoted()` instead - */)", state) { - UFINLuaProcessor* processor = UFINLuaProcessor::luaGetProcessor(L); - int state = 0; - if (processor->GetTickHelper().getState() & LUA_ASYNC) { - state = 1; - } - lua_pushinteger(L, state); - luaFIN_warning(L, "Deprecated function call 'state()', use 'isPromoted()' instead", false); - return UFINLuaProcessor::luaAPIReturn(L, 1); - } - - LuaModuleTableFunction(R"(/** - * @LuaFunction beep(pitch: number) - * @DisplayName Beep - * - * Lets the computer emit a simple beep sound with the given pitch. - * - * @param pitch number a multiplier for the pitch adjustment of the beep sound. - */)", beep) { - LuaFunc(); - - float pitch = 1; - if (lua_isnumber(L, 1)) pitch = lua_tonumber(L, 1); - kernel->PushFuture(MakeShared>(FFINFunctionFuture([kernel, pitch]() { - kernel->GetAudio()->Beep(pitch); - }))); - return UFINLuaProcessor::luaAPIReturn(L, 0); - } - - LuaModuleTableFunction(R"(/** - * @LuaFunction setEEPROM(code: string) - * @DisplayName Set EEPROM - * - * Sets the code of the current eeprom. Doesn’t cause a system reset. - * - * @param code string The new EEPROM Code as string. - */)", setEEPROM) { - LuaFunc(); - - FString code = luaFIN_checkFString(L, 1); - - if (UFINLuaProcessor* luaProcessor = Cast(kernel->GetProcessor())) { - kernel->PushFuture(MakeShared>(FFINFunctionFuture([luaProcessor, code]() { - luaProcessor->SetEEPROM(code); - }))); - } else { - return luaL_error(L, "no eeprom set"); - } - - return 0; - } - - LuaModuleTableFunction(R"(/** - * @LuaFunction string getEEPROM - * @DisplayName Get EEPROM - * - * Returns the current eeprom contents. - * - * @return code string The EEPROM Code as string. - */)", getEEPROM) { - LuaFunc(); - - TOptional Code = Cast(kernel->GetProcessor())->GetEEPROM(); - if (Code.IsSet() == false) return luaL_error(L, "no eeprom set"); - luaFIN_pushFString(L, *Code); - return 1; - } - - LuaModuleTableFunction(R"(/** - * @LuaFunction number time() - * @DisplayName Time - * - * Returns the number of game seconds passed since the save got created. A game day consists of 24 game hours, a game hour consists of 60 game minutes, a game minute consists of 60 game seconds. - * - * @return time number The current number of game seconds passed since the creation of the save. - */)", time) { - LuaFunc(); - - const AFGTimeOfDaySubsystem* Subsystem = AFGTimeOfDaySubsystem::Get(kernel); - lua_pushnumber(L, Subsystem->GetPassedDays() * 86400 + Subsystem->GetDaySeconds()); - return 1; - } - - LuaModuleTableFunction(R"(/** - * @LuaFunction int millis() - * @DisplayName Millis - * - * Returns the amount of milliseconds passed since the system started. - * - * @return millis int The amount of real milliseconds sinde the ingame-computer started. - */)", millis) { - LuaFunc(); - - lua_pushinteger(L, kernel->GetTimeSinceStart()); - return 1; - } - - LuaModuleTableFunction(R"(/** - * @LuaFunction log(verbosity: int, message: string) - * @DisplayName Log - * - * Allows you to print a log message to the computers log with the given log verbosity. - * - * @parameter verbosity int Verbosity The log-level/verbosity of the message you want to log. 0 = Debug, 1 = Info, 2 = Warning, 3 = Error & 4 = Fatal - * @parameter message string Message The log message you want to print - */)", log) { - LuaFunc(); - - int verbosity = luaL_checknumber(L, 1); - FString text = luaFIN_checkFString(L, 2); - verbosity = FMath::Clamp(verbosity, 0, FIL_Verbosity_Max); - kernel->GetLog()->PushLogEntry((EFILLogVerbosity)verbosity, text); - return 0; - } - - LuaModuleTableFunction(R"(/** - * @LuaFunction textNotification(text: string, username: string) - * @DisplayName Text Notification - * - * This function allows you to prompt a user with the given username, with a text message. - * - * @parameter text string Text The Text you want to send as Notification to the user - * @parameter username string Username The username of the user you want to send the notification to - */)", textNotification) { - LuaFunc(); - - FString Text = luaFIN_checkFString(L, 1); - TOptional Player; - if (lua_isstring(L, 2)) Player = luaFIN_checkFString(L, 2); - for (auto players = kernel->GetWorld()->GetPlayerControllerIterator(); players; ++players) { - AFGPlayerController* PlayerController = Cast(players->Get()); - if (Player.IsSet() && PlayerController->GetPlayerState()->GetUserName() != *Player) continue; - kernel->PushFuture(MakeShared>(FFINFunctionFuture([PlayerController, Text]() { - PlayerController->GetGameUI()->ShowTextNotification(FText::FromString(Text)); - }))); - /*kernel->PushFuture(MakeShared>(FFINFunctionFuture([PlayerController, Text]() { - UFINNotificationMessage* Message = NewObject(); - Message->NotificationText = FText::FromString(Text); - PlayerController->GetGameUI()->AddPendingMessage(Message); - UE_LOG(LogFicsItNetworksLua, Warning, TEXT("Pending Messages? %i"), PlayerController->GetGameUI()->CanReceiveMessageQueue()); - UE_LOG(LogFicsItNetworksLua, Warning, TEXT("Pending Message? %i"), PlayerController->GetGameUI()->CanReceiveMessage(UFINNotificationMessage::StaticClass())); - })));*/ - break; - } - return 0; - } - - LuaModuleTableFunction(R"(/** - * @LuaFunction attentionPing(position: Vector, [username: string]) - * @DisplayName Attention Ping - * - * Allows to send a World Marker/Attention Ping for all or the given user. - * - * @parameter position Struct Position The position in the world where the ping should occur - * @parameter username string Username The username of the user you want to ping. - */)", attentionPing) { - LuaFunc(); - - FVector Position = *luaFIN_checkStruct(L, 1, true); - TOptional Player; - if (lua_isstring(L, 2)) Player = luaFIN_checkFString(L, 2); - for (auto players = kernel->GetWorld()->GetPlayerControllerIterator(); players; players++) { - AFGPlayerController* PlayerController = Cast(players->Get()); - if (Player.IsSet() && PlayerController->GetPlayerState()->GetUserName() != *Player) continue; - kernel->PushFuture(MakeShared>(FFINFunctionFuture([PlayerController, Position]() { - UClass* Class = LoadObject(nullptr, TEXT("/Game/FactoryGame/Character/Player/BP_AttentionPingActor.BP_AttentionPingActor_C")); - AFGAttentionPingActor* PingActor = PlayerController->GetWorld()->SpawnActorDeferred(Class, FTransform(Position)); - PingActor->SetOwningPlayerState(PlayerController->GetPlayerState()); - PingActor->FinishSpawning(FTransform(Position)); - }))); - break; - } - return 0; - } - LuaModuleTableFunction(R"(/** * @LuaFunction (int, string, string) magicTime() * @DisplayName Magic Time @@ -354,47 +75,6 @@ namespace FINLua { lua_pushlstring(L, ConvertIso.Get(), ConvertIso.Length()); return 3; } - - LuaModuleTableFunction(R"(/** - * @LuaFunction Object[] getPCIDevices([type: Class]) - * @DisplayName Get PCI-Devices - * - * This function allows you to get all installed https://docs.ficsit.app/ficsit-networks/latest/buildings/ComputerCase/index.html#_pci_interface[PCI-Devices] in a computer of a given type. - * Have a look at https://docs.ficsit.app/ficsit-networks/latest/lua/examples/PCIDevices.html[this] example to fully understand how it works. - * - * @parameter type Class Type Optional type which will be used to filter all PCI-Devices. If not provided, will return all PCI-Devices. - * @return objects Object[] Objects An array containing instances for each PCI-Device built into the computer. - */)", getPCIDevices) { - LuaFunc(); - - lua_newtable(L); - int args = lua_gettop(L); - UFIRClass* Type = nullptr; - if (args > 0) { - Type = luaFIN_toFINClass(L, 1, nullptr); - if (!Type) { - return 1; - } - } - int i = 1; - for (TScriptInterface Device : kernel->GetPCIDevices()) { - if (!Device || (Type && !Device.GetObject()->IsA(Cast(Type->GetOuter())))) continue; - luaFIN_pushObject(L, FFIRTrace(kernel->GetNetwork()->GetComponent().GetObject()) / Device.GetObject()); - lua_seti(L, -2, i++); - } - return 1; - } - - LuaModuleTableBareField(R"(/** - * @LuaBareField media FINMediaSubsystem - * @DisplayName Media - * - * Field containing a reference to the Media Subsystem. - */)", media) { - UFINLuaProcessor* Processor = UFINLuaProcessor::luaGetProcessor(L); - luaFIN_pushObject(L, FIRTrace(AFINMediaSubsystem::GetMediaSubsystem(Processor))); - //luaFIN_persistValue(L, -1, PersistName); - } } } } diff --git a/Source/FicsItNetworksLua/Private/FINLua/API/LuaDebugAPI.cpp b/Source/FicsItNetworksLua/Private/FINLua/API/LuaDebugAPI.cpp index d8b6ef1aa..48550217f 100644 --- a/Source/FicsItNetworksLua/Private/FINLua/API/LuaDebugAPI.cpp +++ b/Source/FicsItNetworksLua/Private/FINLua/API/LuaDebugAPI.cpp @@ -6,9 +6,9 @@ namespace FINLua { LuaModule(R"(/** - * @LuaModule Debug + * @LuaModule DebugModule * @DisplayName Debug Module - */)", Debug) { + */)", DebugModule) { LuaModuleLibrary(R"(/** * @LuaLibrary debug * @DisplayName Debug Library diff --git a/Source/FicsItNetworksLua/Private/FINLua/API/LuaEventAPI.cpp b/Source/FicsItNetworksLua/Private/FINLua/API/LuaEventAPI.cpp index bf36dfe57..88f450556 100644 --- a/Source/FicsItNetworksLua/Private/FINLua/API/LuaEventAPI.cpp +++ b/Source/FicsItNetworksLua/Private/FINLua/API/LuaEventAPI.cpp @@ -7,6 +7,7 @@ #include "FINEventFilter.h" #include "FINLua/Reflection/LuaObject.h" #include "FINLuaProcessor.h" +#include "FINLuaThreadedRuntime.h" #include "FINNetworkUtils.h" #include "LuaFuture.h" #include "LuaStruct.h" @@ -18,37 +19,10 @@ UE_DISABLE_OPTIMIZATION_SHIP -FFINLuaEventQueue::FFINLuaEventQueue(UFINLuaProcessor* Processor, int64 Key): Processor(Processor), Key(Key) { - fgcheck(IsValid(Processor) && IsValid(Processor->GetKernel())); - Processor->GetKernel()->AddReferencer(this, &CollectReferences); -} - - -FFINLuaEventQueue::FFINLuaEventQueue(const FFINLuaEventQueue& Other): Events(Other.Events), Filter(Other.Filter), Processor(Other.Processor), Key(Other.Key) { - fgcheck(IsValid(Processor) && IsValid(Processor->GetKernel())); - Processor->GetKernel()->AddReferencer(this, &CollectReferences); -} - -FFINLuaEventQueue& FFINLuaEventQueue::operator=(const FFINLuaEventQueue& Other) { - if (IsValid(Processor) && IsValid(Processor->GetKernel())) { - Processor->GetKernel()->RemoveReferencer(this); - } - Events = Other.Events; - Filter = Other.Filter; - Processor = Other.Processor; - Key = Other.Key; - fgcheck(IsValid(Processor) && IsValid(Processor->GetKernel())); - Processor->GetKernel()->AddReferencer(this, &CollectReferences); - return *this; -} - -FFINLuaEventQueue::~FFINLuaEventQueue() { - if (IsValid(Processor) && IsValid(Processor->GetKernel())) Processor->GetKernel()->RemoveReferencer(this); -} +FFINLuaEventQueue::FFINLuaEventQueue(FFINLuaReferenceCollector* ReferenceCollector, int64 Key): FFINLuaReferenceCollected(ReferenceCollector), Key(Key) {} -void FFINLuaEventQueue::CollectReferences(void* Obj, FReferenceCollector& Collector) { - FFINLuaEventQueue* Self = static_cast(Obj); - Collector.AddPropertyReferencesWithStructARO(StaticStruct(), Self); +void FFINLuaEventQueue::CollectReferences(FReferenceCollector& Collector) { + Collector.AddPropertyReferencesWithStructARO(StaticStruct(), this); } namespace FINLua { @@ -110,10 +84,10 @@ namespace FINLua { } LuaModule(R"(/** - * @LuaModule Event + * @LuaModule EventModule * @DisplayName Event Module * @Dependency ReflectionSystemStructModule - */)", Event) { + */)", EventModule) { LuaModuleMetatable(R"(/** * @LuaMetatable EventQueue * @DisplayName Event Queue @@ -148,13 +122,13 @@ namespace FINLua { } int unpersist(lua_State* L) { - UFINLuaProcessor* Processor = UFINLuaProcessor::luaGetProcessor(L); - FFINLuaProcessorStateStorage& Storage = Processor->StateStorage; + FFINLuaRuntime& runtime = luaFIN_getRuntime(L); + FFINLuaRuntimePersistenceState& Storage = luaFIN_getPersistence(L); const FFIRInstancedStruct& Struct = *Storage.GetStruct(luaL_checkinteger(L, lua_upvalueindex(1))); FFINLuaEventQueue& queue = Struct.Get(); - queue.Processor = Processor; + queue.ReferenceCollector = luaFIN_getReferenceCollector(L); luaFIN_pushEventQueueInternal(L, MakeShared(queue)); lua_pushvalue(L, lua_upvalueindex(2)); lua_setiuservalue(L, -2, 1); @@ -168,8 +142,7 @@ namespace FINLua { */)", __persist) { FEventQueue& queue = luaFIN_checkEventQueue(L, 1); - UFINLuaProcessor* Processor = UFINLuaProcessor::luaGetProcessor(L); - FFINLuaProcessorStateStorage& Storage = Processor->StateStorage; + FFINLuaRuntimePersistenceState& Storage = luaFIN_getPersistence(L); lua_pushinteger(L, Storage.Add(MakeShared(*queue))); lua_getiuservalue(L, 1, 1); lua_getiuservalue(L, 1, 2); @@ -194,7 +167,8 @@ namespace FINLua { queue->Events.RemoveAt(0); return luaFIN_pushEventData(L, event.Sender, event.Data); } - double currentTime = UFINLuaProcessor::luaGetProcessor(L)->GetKernel()->GetTimeSinceStart(); + IFINLuaEventSystem& eventSystem = luaFIN_getEventSystem(L); + double currentTime = eventSystem.TimeSinceStart(); if (timeout > currentTime) { return lua_yieldk(L, 0, NULL, luaPullContinue); } @@ -206,7 +180,8 @@ namespace FINLua { */)", pull) { FEventQueue& queue = luaFIN_checkEventQueue(L, 1); double timeout = luaL_checknumber(L, 2)*1000; - timeout += UFINLuaProcessor::luaGetProcessor(L)->GetKernel()->GetTimeSinceStart(); + IFINLuaEventSystem& eventSystem = luaFIN_getEventSystem(L); + timeout += eventSystem.TimeSinceStart(); lua_pop(L, 1); lua_pushnumber(L, timeout); return luaPullContinue(L, 0, NULL); @@ -249,11 +224,10 @@ namespace FINLua { * The Event API provides classes, functions and variables for interacting with the component network. */)", event) { void luaListen(lua_State* L, FFIRTrace o) { - const UFINKernelNetworkController* net = UFINLuaProcessor::luaGetProcessor(L)->GetKernel()->GetNetwork(); + IFINLuaEventSystem& eventSystem = luaFIN_getEventSystem(L);; UObject* obj = *o; if (!IsValid(obj)) luaL_error(L, "object is not valid"); - AFINSignalSubsystem* SigSubSys = AFINSignalSubsystem::GetSignalSubsystem(obj); - SigSubSys->Listen(obj, o.Reverse() / net->GetComponent().GetObject()); + eventSystem.Listen(o); } LuaModuleTableFunction(R"(/** @@ -265,14 +239,14 @@ namespace FINLua { * @param objects Object... A list of objects the computer should start listening to. */)", listen) { // ReSharper disable once CppDeclaratorNeverUsed - FLuaSyncCall SyncCall(L); + FLuaSync SyncCall(L); const int args = lua_gettop(L); for (int i = 1; i <= args; ++i) { FFIRTrace trace = luaFIN_checkObject(L, i, nullptr); luaListen(L, trace); } - return UFINLuaProcessor::luaAPIReturn(L, 0); + return 0; } LuaModuleTableFunction(R"(/** @@ -284,15 +258,15 @@ namespace FINLua { * @return listening Object[] An array containing all objects this computer is currently listening to. */)", listening) { // ReSharper disable once CppDeclaratorNeverUsed - FLuaSyncCall SyncCall(L); + FLuaSync SyncCall(L); - UObject* netComp = UFINLuaProcessor::luaGetProcessor(L)->GetKernel()->GetNetwork()->GetComponent().GetObject(); + IFINLuaEventSystem& eventSystem = luaFIN_getEventSystem(L); - TArray Listening = AFINSignalSubsystem::GetSignalSubsystem(netComp)->GetListening(netComp); + TArray Listening = eventSystem.Listening(); int i = 0; lua_newtable(L); - for (UObject* Obj : Listening) { - luaFIN_pushObject(L, FFIRTrace(netComp) / Obj); + for (const FFIRTrace Obj : Listening) { + luaFIN_pushObject(L, Obj); lua_seti(L, -2, ++i); } return 1; @@ -300,9 +274,16 @@ namespace FINLua { // ReSharper disable once CppParameterNeverUsed int luaPullContinue(lua_State* L, int status, lua_KContext ctx) { - const int args = lua_gettop(L); + IFINLuaEventSystem& eventSystem = luaFIN_getEventSystem(L); + TOptional> data = eventSystem.PullSignal(); + if (!data) { + return lua_yield(L, 0); + } + + const auto& [sender, signal] = *data; - return args - ctx; + luaFIN_handleEvent(L, sender, signal); + return luaFIN_pushEventData(L, sender, signal); } LuaModuleTableFunction(R"(/** @@ -318,23 +299,10 @@ namespace FINLua { * @return parameters any... Parameters The parameters passed to the signal. Not set when timeout got reached. */)", pull) { const int args = lua_gettop(L); - double t = 0.0; - if (args > 0) t = lua_tonumber(L, 1); - - UFINLuaProcessor* luaProc = UFINLuaProcessor::luaGetProcessor(L); - check(luaProc); - const int a = luaProc->DoSignal(L); - if (!a && !(args > 0 && lua_isinteger(L, 1) && lua_tointeger(L, 1) == 0)) { - luaProc->Timeout = t; - luaProc->PullStart = (FDateTime::Now() - FFicsItNetworksComputerModule::GameStart).GetTotalMilliseconds(); - luaProc->PullState = (args > 0) ? 1 : 2; + double timeout = 0.0; + if (args > 0) timeout = lua_tonumber(L, 1); - luaProc->GetTickHelper().shouldWaitForSignal(); - - return lua_yieldk(L, 0, args, luaPullContinue); - } - luaProc->PullState = 0; - return UFINLuaProcessor::luaAPIReturn(L, a); + return luaPullContinue(L, 0, 0); } void luaIgnore(lua_State* L, FFIRTrace o) { @@ -353,14 +321,14 @@ namespace FINLua { * @param objects Object... A list of objects this computer should stop listening to. */)", ignore) { // ReSharper disable once CppDeclaratorNeverUsed - FLuaSyncCall SyncCall(L); + FLuaSync SyncCall(L); const int args = lua_gettop(L); for (int i = 1; i <= args; ++i) { FFIRTrace Trace = luaFIN_checkObject(L, i, nullptr); luaIgnore(L, Trace); } - return UFINLuaProcessor::luaAPIReturn(L, 0); + return 0; } LuaModuleTableFunction(R"(/** @@ -370,11 +338,10 @@ namespace FINLua { * Stops listening to any signal sender. If afterwards there are still coming signals in, it might be the system itself or caching bug. */)", ignoreAll) { // ReSharper disable once CppDeclaratorNeverUsed - FLuaSyncCall SyncCall(L); - UFINKernelNetworkController* net = UFINLuaProcessor::luaGetProcessor(L)->GetKernel()->GetNetwork(); - AFINSignalSubsystem* SigSubSys = AFINSignalSubsystem::GetSignalSubsystem(net->GetComponent().GetObject()); - SigSubSys->IgnoreAll(net->GetComponent().GetObject()); - return UFINLuaProcessor::luaAPIReturn(L, 1); + FLuaSync SyncCall(L); + IFINLuaEventSystem& eventSystem = luaFIN_getEventSystem(L); + eventSystem.IgnoreAll(); + return 1; } LuaModuleTableFunction(R"(/** @@ -383,7 +350,8 @@ namespace FINLua { * * Clears every signal from the signal queue. */)", clear) { - UFINLuaProcessor::luaGetProcessor(L)->GetKernel()->GetNetwork()->ClearSignals(); + IFINLuaEventSystem& eventSystem = luaFIN_getEventSystem(L); + eventSystem.Clear(); return 0; } @@ -471,17 +439,14 @@ namespace FINLua { } int luaLoopContinue(lua_State* L, int, lua_KContext) { while (true) { - UFINLuaProcessor* luaProc = UFINLuaProcessor::luaGetProcessor(L); - check(luaProc); - UFINKernelNetworkController* net = luaProc->GetKernel()->GetNetwork(); - int bSignal = net && net->GetSignalCount() > 0; - if (bSignal) { - FFIRTrace sender; - FFINSignalData signal = net->PopSignal(sender); + IFINLuaEventSystem& eventSystem = luaFIN_getEventSystem(L); + TOptional> data = eventSystem.PullSignal(); + if (data) { + const auto& [sender, signal] = *data; luaFIN_handleEvent(L, sender, signal); } luaFIN_futureRun(L, 1); - if (!bSignal) { + if (!data) { return lua_yieldk(L, 0, 0, luaLoopContinue); } } @@ -548,11 +513,12 @@ namespace FINLua { void luaFIN_pushEventQueueInternal(lua_State* L, const FEventQueue& queueRef) { FEventQueue* queue = static_cast(lua_newuserdatauv(L, sizeof(FEventQueue), 2)); new (queue) FEventQueue(queueRef); - luaL_setmetatable(L, Event::EventQueue::_Name); + luaL_setmetatable(L, EventModule::EventQueue::_Name); } FEventQueue luaFIN_pushEventQueue(lua_State* L, int64 key) { - TSharedRef queueRef = MakeShared(UFINLuaProcessor::luaGetProcessor(L), key); + FFINLuaReferenceCollector* referenceCollector = luaFIN_getReferenceCollector(L); + TSharedRef queueRef = MakeShared(referenceCollector, key); luaFIN_pushEventQueueInternal(L, queueRef); lua_newtable(L); lua_setiuservalue(L, -2, 1); @@ -562,12 +528,12 @@ namespace FINLua { } FEventQueue* luaFIN_toEventQueue(lua_State* L, int index) { - return static_cast(luaL_testudata(L, index, Event::EventQueue::_Name)); + return static_cast(luaL_testudata(L, index, EventModule::EventQueue::_Name)); } FEventQueue& luaFIN_checkEventQueue(lua_State* L, int index) { FEventQueue* queue = luaFIN_toEventQueue(L, index); - if (!queue) luaFIN_typeError(L, index, Event::EventQueue::_Name); + if (!queue) luaFIN_typeError(L, index, EventModule::EventQueue::_Name); return *queue; } @@ -634,5 +600,17 @@ namespace FINLua { lua_pop(L, 1); lua_pop(L, 1); } + + void luaFIN_setEventSystem(lua_State* L, IFINLuaEventSystem& EventSystem) { + FFINLuaRuntime& runtime = luaFIN_getRuntime(L); + runtime.GlobalPointers.Add(TEXT("EventSystem"), &EventSystem); + } + + IFINLuaEventSystem& luaFIN_getEventSystem(lua_State* L) { + FFINLuaRuntime& runtime = luaFIN_getRuntime(L); + IFINLuaEventSystem** value = reinterpret_cast(runtime.GlobalPointers.Find(TEXT("EventSystem"))); + fgcheck(value != nullptr); + return **value; + } } UE_ENABLE_OPTIMIZATION_SHIP \ No newline at end of file diff --git a/Source/FicsItNetworksLua/Private/FINLua/API/LuaFileSystemAPI.cpp b/Source/FicsItNetworksLua/Private/FINLua/API/LuaFileSystemAPI.cpp index ceaedf9a1..7b312e302 100644 --- a/Source/FicsItNetworksLua/Private/FINLua/API/LuaFileSystemAPI.cpp +++ b/Source/FicsItNetworksLua/Private/FINLua/API/LuaFileSystemAPI.cpp @@ -2,21 +2,18 @@ #include "FINLuaProcessor.h" #include "FINLua/FINLuaModule.h" -#include "FINLua/LuaExtraSpace.h" #include "FINLua/LuaPersistence.h" +#include "FINLua/FINLuaThreadedRuntime.h" #undef LuaFunc #define LuaFunc() \ - UFINLuaProcessor* processor = UFINLuaProcessor::luaGetProcessor(L); \ - FLuaSyncCall SyncCall(L); \ - UFINKernelSystem* kernel = processor->GetKernel(); \ - FFINKernelFSRoot* self = kernel->GetFileSystem(); \ + CodersFileSystem::FileSystemRoot* self = luaFIN_getFileSystem(L); \ + FLuaSync SyncCall(L); \ if (!self) return luaL_error(L, "component is invalid"); #define LuaFileFunc() \ - UFINLuaProcessor* processor = UFINLuaProcessor::luaGetProcessor(L); \ - FLuaSyncCall SyncCall(L); \ - UFINKernelSystem* kernel = processor->GetKernel(); \ + CodersFileSystem::FileSystemRoot* fileSystem = luaFIN_getFileSystem(L); \ + FLuaSync SyncCall(L); \ LuaFile* self_r = (LuaFile*)luaL_checkudata(L, 1, "File"); \ if (!self_r) return luaL_error(L, "file is invalid"); \ LuaFile& self = *self_r; \ @@ -26,15 +23,13 @@ mode = self->transfer->mode; \ mode = mode & ~CodersFileSystem::FileMode::TRUNC; \ } else mode = CodersFileSystem::INPUT; \ - self->file = kernel->GetFileSystem()->open(self->path, mode); \ + self->file = fileSystem->open(self->path, mode); \ if (self->transfer->open) { \ self->file->seek("set", self->transfer->pos); \ self->transfer = nullptr; \ } else { \ self->file->close(); \ } \ - TArray& streams = FINLua::luaFIN_getExtraSpace(L).FileStreams; \ - streams.Add(self); \ } \ TSharedPtr& file = self->file; \ if (!file) { \ @@ -65,88 +60,6 @@ namespace FINLua { * The filesystem api provides structures, functions and variables for interacting with the virtual file systems. * You can't access files outside the virtual filesystem. If you try to do so, the Lua runtime crashes. */)", filesystem) { - LuaModuleTableFunction(R"(/** - * @LuaFunction bool makeFileSystem(type: string, name: string) - * @DisplayName Make File-System - * - * Trys to create a new file system of the given type with the given name. - * The created filesystem will be added to the system DevDevice. - * - * .Possible Types: - * [%collapsible] - * ==== - * * `tmpfs` - * + - * A temporary filesystem only existing at runtime in the memory of your computer. All data will be lost when the system stops. - * ==== - * - * @parameter type string Type the type of the new filesystem - * @parameter name string Name the name of the new filesystem you want to create - * @return success bool Success returns true if it was able to create the new filesystem - */)", makeFileSystem) { - LuaFunc() - - const std::string type = luaL_checkstring(L, 1); - const std::string name = luaL_checkstring(L, 2); - TSharedPtr device; - if (type == "tmpfs") { - return luaL_argerror(L, 1, "Temp Filesystems are not possible anymore till a complete FileSystem Overhaul."); - } else return luaL_argerror(L, 1, "No valid FileSystem Type"); - /*if (!device.IsValid()) luaL_argerror(L, 1, "Invalid Device"); - TSharedPtr dev = kernel->GetDevDevice(); - try { - lua_pushboolean(L, dev.IsValid() ? dev->addDevice(device, name) : false); - } CatchExceptionLua - return UFINLuaProcessor::luaAPIReturn(L, 1);*/ - } - - LuaModuleTableFunction(R"(/** - * @LuaFunction bool removeFileSystem(name: string) - * @DisplayName Remove File-System - * - * Tries to remove the filesystem with the given name from the system DevDevice. - * All mounts of the device will run invalid. - * - * @parameter name string Name the name of the new filesystem you want to remove - * @return success bool Success returns true if it was able to remove the new filesystem - */)", removeFileSystem) { - LuaFunc(); - - luaL_error(L, "Other FileSystems are not supported anymore until a complete FileSystem Overhaul"); - - const std::string name = luaL_checkstring(L, 1); - TSharedPtr dev = kernel->GetDevDevice(); - if (dev.IsValid()) { - try { - const auto devices = dev->getDevices(); - const auto device = devices.find(name); - /*if (device != devices.end() && dynamic_cast(device->second.get())) { - lua_pushboolean(L, dev->removeDevice(device->second)); - return UFINLuaProcessor::luaAPIReturn(L, 1); - }*/ - } CatchExceptionLua - } - lua_pushboolean(L, false); - return UFINLuaProcessor::luaAPIReturn(L, 1); - } - - LuaModuleTableFunction(R"(/** - * @LuaFunction bool initFileSystem(path: string) - * @DisplayName Init File-System - * - * Trys to mount the system DevDevice to the given location. - * The DevDevice is special Device holding DeviceNodes for all filesystems added to the system. (like TmpFS and drives). It is unmountable as well as getting mounted a seccond time. - * - * @parameter path string Path path to the mountpoint were the dev device should get mounted to - * @return success bool Success returns if it was able to mount the DevDevice - */)", initFileSystem) { - LuaFunc(); - - const std::string path = luaL_checkstring(L, 1); - lua_pushboolean(L, kernel->InitFileSystem(CodersFileSystem::Path(path))); - return UFINLuaProcessor::luaAPIReturn(L, 1); - } - LuaModuleTableFunction(R"(/** * @LuaFunction File open(path: string, mode: string) * @DisplayName Open @@ -198,7 +111,7 @@ namespace FINLua { const TSharedPtr stream = self->open(path, m); luaFIN_pushFile(L, stream, path); } CatchExceptionLua - return UFINLuaProcessor::luaAPIReturn(L, 1); + return 1; } LuaModuleTableFunction(R"(/** @@ -218,7 +131,7 @@ namespace FINLua { try { lua_pushboolean(L, self->createDir(CodersFileSystem::Path(path), all)); } CatchExceptionLua - return UFINLuaProcessor::luaAPIReturn(L, 1); + return 1; } LuaModuleTableFunction(R"(/** @@ -238,7 +151,7 @@ namespace FINLua { try { lua_pushboolean(L, self->remove(path, all)); } CatchExceptionLua - return UFINLuaProcessor::luaAPIReturn(L, 1); + return 1; } LuaModuleTableFunction(R"(/** @@ -260,7 +173,7 @@ namespace FINLua { try { lua_pushboolean(L, self->move(from, to) == 0); } CatchExceptionLua - return UFINLuaProcessor::luaAPIReturn(L, 1); + return 1; } LuaModuleTableFunction(R"(/** @@ -280,7 +193,7 @@ namespace FINLua { try { lua_pushboolean(L, self->rename(from, to)); } CatchExceptionLua - return UFINLuaProcessor::luaAPIReturn(L, 1); + return 1; } LuaModuleTableFunction(R"(/** @@ -295,7 +208,7 @@ namespace FINLua { try { lua_pushboolean(L, self->fileType(path).IsSet()); } CatchExceptionLua - return UFINLuaProcessor::luaAPIReturn(L, 1); + return 1; } LuaModuleTableFunction(R"(/** @@ -317,7 +230,7 @@ namespace FINLua { lua_pushstring(L, child.c_str()); lua_seti(L, -2, i++); } - return UFINLuaProcessor::luaAPIReturn(L, 1); + return 1; } LuaModuleTableFunction(R"(/** @@ -331,7 +244,7 @@ namespace FINLua { try { lua_pushboolean(L, self->fileType(path) == CodersFileSystem::File_Regular); } CatchExceptionLua - return UFINLuaProcessor::luaAPIReturn(L, 1); + return 1; } LuaModuleTableFunction(R"(/** @@ -345,7 +258,7 @@ namespace FINLua { try { lua_pushboolean(L, self->fileType(path) == CodersFileSystem::File_Directory); } CatchExceptionLua - return UFINLuaProcessor::luaAPIReturn(L, 1); + return 1; } LuaModuleTableFunction(R"(/** @@ -369,7 +282,7 @@ namespace FINLua { lua_pushboolean(L, false); } } CatchExceptionLua - return UFINLuaProcessor::luaAPIReturn(L, 1); + return 1; } LuaModuleTableFunction(R"(/** @@ -386,7 +299,7 @@ namespace FINLua { try { lua_pushboolean(L, self->unmount(mountPath)); } CatchExceptionLua - return UFINLuaProcessor::luaAPIReturn(L, 1); + return 1; } static int luaDoFileCont(lua_State *L, int d1, lua_KContext d2) { @@ -447,7 +360,7 @@ namespace FINLua { } CatchExceptionLua luaL_loadbufferx(L, code.c_str(), code.size(), ("@" + path.str()).c_str(), "t"); - return UFINLuaProcessor::luaAPIReturn(L, 1); + return 1; } LuaModuleTableFunction(R"(/** @@ -515,7 +428,7 @@ namespace FINLua { out = path.str(); } if (!custom) lua_pushstring(L,out.c_str()); - return UFINLuaProcessor::luaAPIReturn(L, retargs); + return retargs; } LuaModuleTableFunction(R"(/** @@ -553,7 +466,7 @@ namespace FINLua { if (path.isDir()) flags |= 0b100000; lua_pushinteger(L, flags); } - return UFINLuaProcessor::luaAPIReturn(L, args); + return args; } LuaModuleTableFunction(R"(/** @@ -567,7 +480,7 @@ namespace FINLua { for (int i = 1; i <= args; ++i) { lua_pushboolean(L, CodersFileSystem::Path::isNode(lua_tostring(L, i))); } - return UFINLuaProcessor::luaAPIReturn(L, args); + return args; } LuaModuleTableFunction(R"(/** @@ -614,7 +527,7 @@ namespace FINLua { } lua_setfield(L, -2, "type"); } - return UFINLuaProcessor::luaAPIReturn(L, args); + return args; } } @@ -633,7 +546,7 @@ namespace FINLua { try { file->close(); } CatchExceptionLua - return UFINLuaProcessor::luaAPIReturn(L, 0); + return 0; } LuaModuleTableFunction(R"(/** @@ -652,7 +565,7 @@ namespace FINLua { file->write(std::string(str, str_len)); } CatchExceptionLua } - return UFINLuaProcessor::luaAPIReturn(L, 0); + return 0; } LuaModuleTableFunction(R"(/** @@ -675,7 +588,7 @@ namespace FINLua { luaL_error(L, ex.what()); } } - return UFINLuaProcessor::luaAPIReturn(L, args - 1); + return args - 1; } LuaModuleTableFunction(R"(/** @@ -704,7 +617,7 @@ namespace FINLua { seek = f->file->seek(w, off); } CatchExceptionLua lua_pushinteger(L, seek); - return UFINLuaProcessor::luaAPIReturn(L, 1); + return 1; } LuaModuleTableFunction(R"(/** @@ -718,25 +631,9 @@ namespace FINLua { } int luaFileUnpersist(lua_State* L) { - UFINKernelSystem* kernel = UFINLuaProcessor::luaGetProcessor(L)->GetKernel(); - const bool valid = (bool)lua_toboolean(L, lua_upvalueindex(1)); - std::string path = ""; - if (valid) { - path = lua_tostring(L, lua_upvalueindex(2)); - const bool open = (bool)lua_toboolean(L, lua_upvalueindex(3)); - TSharedPtr stream; - if (open) { - CodersFileSystem::FileMode mode = static_cast(static_cast(lua_tonumber(L, lua_upvalueindex(4)))); - mode = mode & ~CodersFileSystem::FileMode::TRUNC; - stream = kernel->GetFileSystem()->open(CodersFileSystem::Path(path), mode); - stream->seek("set", static_cast(lua_tonumber(L, lua_upvalueindex(5)))); - } else { - path = ""; - stream = nullptr; - } - luaFIN_pushFile(L, stream, path); - } else luaFIN_pushFile(L, nullptr, path); - return UFINLuaProcessor::luaAPIReturn(L, 1); + std::string path = lua_tostring(L, lua_upvalueindex(1)); + luaFIN_pushFile(L, nullptr, path); + return 1; } LuaModuleTableFunction(R"(/** @@ -744,19 +641,9 @@ namespace FINLua { * @DisplayName Persist */)", __persist) { LuaFile& f = *static_cast(luaL_checkudata(L, -1, "File")); - if (f->transfer) { - lua_pushboolean(L, true); - lua_pushstring(L, f->path.c_str()); - lua_pushboolean(L, f->transfer->open); - lua_pushinteger(L, f->transfer->mode); - lua_pushinteger(L, f->transfer->pos); - lua_pushcclosure(L, luaFileUnpersist, 5); - } else { - lua_pushboolean(L, false); - lua_pushstring(L, f->path.c_str()); - lua_pushcclosure(L, luaFileUnpersist, 2); - } - return UFINLuaProcessor::luaAPIReturn(L, 1); + lua_pushstring(L, f->path.c_str()); + lua_pushcclosure(L, luaFileUnpersist, 1); + return 1; } LuaModuleTableFunction(R"(/** @@ -794,9 +681,17 @@ namespace FINLua { new (f) LuaFile(new LuaFileContainer()); f->Get().file = file; f->Get().path = path; - if (file.IsValid()) { - TArray& streams = FINLua::luaFIN_getExtraSpace(L).FileStreams; - streams.Add(*f); - } + } + + void luaFIN_setFileSystem(lua_State* L, CodersFileSystem::FileSystemRoot* FileSystem) { + FFINLuaRuntime& runtime = luaFIN_getRuntime(L); + runtime.GlobalPointers.Add(TEXT("FileSystem"), FileSystem); + } + + CodersFileSystem::FileSystemRoot* luaFIN_getFileSystem(lua_State* L) { + FFINLuaRuntime& runtime = luaFIN_getRuntime(L); + CodersFileSystem::FileSystemRoot** value = reinterpret_cast(runtime.GlobalPointers.Find(TEXT("FileSystem"))); + fgcheck(value != nullptr); + return *value; } } diff --git a/Source/FicsItNetworksLua/Private/FINLua/API/LuaKernelAPI.cpp b/Source/FicsItNetworksLua/Private/FINLua/API/LuaKernelAPI.cpp new file mode 100644 index 000000000..7184de4de --- /dev/null +++ b/Source/FicsItNetworksLua/Private/FINLua/API/LuaKernelAPI.cpp @@ -0,0 +1,316 @@ +#include "FINLua/API/LuaKernelAPI.h" + +#include "FicsItKernel.h" +#include "FicsItLogLibrary.h" +#include "FINLuaModule.h" +#include "FINLuaProcessor.h" +#include "FINLuaThreadedRuntime.h" +#include "FINMediaSubsystem.h" +#include "FINNetworkUtils.h" +#include "LuaClass.h" +#include "LuaObject.h" +#include "LuaPersistence.h" +#include "NetworkController.h" +#include "Path.h" + +namespace FINLua { + LuaModule(R"(/** + * @LuaModule KernelModule + * @DisplayName Kernel Module + * @Dependency ReflectionSystemObjectModule + * + * This Module provides an interface for other Modules to interact with the Kernel. + */)", KernelModule) { + LuaModuleLibrary(R"(/** + * @LuaLibrary filesystem + * @DisplayName File-System Library + */)", filesystem) { + LuaModuleTableFunction(R"(/** + * @LuaFunction bool initFileSystem(path: string) + * @DisplayName Init File-System + * + * Trys to mount the system DevDevice to the given location. + * The DevDevice is special Device holding DeviceNodes for all filesystems added to the system. (like TmpFS and drives). It is unmountable as well as getting mounted a seccond time. + * + * @parameter path string Path path to the mountpoint were the dev device should get mounted to + * @return success bool Success returns if it was able to mount the DevDevice + */)", initFileSystem) { + UFINKernelSystem* kernel = FINLua::luaFIN_getKernel(L); + FLuaSync SyncCall(L); + + const std::string path = luaL_checkstring(L, 1); + lua_pushboolean(L, kernel->InitFileSystem(CodersFileSystem::Path(path))); + return 1; + } + + LuaModuleTableFunction(R"(/** + * @LuaFunction bool makeFileSystem(type: string, name: string) + * @DisplayName Make File-System + * + * Trys to create a new file system of the given type with the given name. + * The created filesystem will be added to the system DevDevice. + * + * .Possible Types: + * [%collapsible] + * ==== + * * `tmpfs` + * + + * A temporary filesystem only existing at runtime in the memory of your computer. All data will be lost when the system stops. + * ==== + * + * @parameter type string Type the type of the new filesystem + * @parameter name string Name the name of the new filesystem you want to create + * @return success bool Success returns true if it was able to create the new filesystem + */)", makeFileSystem) { + UFINKernelSystem* kernel = FINLua::luaFIN_getKernel(L); + FINLua::FLuaSync SyncCall(L); + + const std::string type = luaL_checkstring(L, 1); + const std::string name = luaL_checkstring(L, 2); + TSharedPtr device; + if (type == "tmpfs") { + return luaL_argerror(L, 1, "Temp Filesystems are not possible anymore till a complete FileSystem Overhaul."); + } else return luaL_argerror(L, 1, "No valid FileSystem Type"); + /*if (!device.IsValid()) luaL_argerror(L, 1, "Invalid Device"); + TSharedPtr dev = kernel->GetDevDevice(); + try { + lua_pushboolean(L, dev.IsValid() ? dev->addDevice(device, name) : false); + } CatchExceptionLua + return UFINLuaProcessor::luaAPIReturn(L, 1);*/ + } + + LuaModuleTableFunction(R"(/** + * @LuaFunction bool removeFileSystem(name: string) + * @DisplayName Remove File-System + * + * Tries to remove the filesystem with the given name from the system DevDevice. + * All mounts of the device will run invalid. + * + * @parameter name string Name the name of the new filesystem you want to remove + * @return success bool Success returns true if it was able to remove the new filesystem + */)", removeFileSystem) { + UFINKernelSystem* kernel = FINLua::luaFIN_getKernel(L); + FLuaSync SyncCall(L); + + luaL_error(L, "Other FileSystems are not supported anymore until a complete FileSystem Overhaul"); + + const std::string name = luaL_checkstring(L, 1); + TSharedPtr dev = kernel->GetDevDevice(); + if (dev.IsValid()) { + try { + const auto devices = dev->getDevices(); + const auto device = devices.find(name); + /*if (device != devices.end() && dynamic_cast(device->second.get())) { + lua_pushboolean(L, dev->removeDevice(device->second)); + return UFINLuaProcessor::luaAPIReturn(L, 1); + }*/ + } catch (const std::exception& ex) { \ + FDebug::DumpStackTraceToLog(ELogVerbosity::Warning); \ + return luaL_error(L, ex.what()); \ + } + } + lua_pushboolean(L, false); + return 1; + } + } + + LuaModuleLibrary(R"(/** + * @LuaLibrary computer + * @DisplayName Computer Library + */)", computer) { + LuaModuleTableFunction(R"(/** + * @LuaFunction (usage: int, capacity: int) getMemory() + * @DisplayName Get Memory + * + * Returns the used memory and memory capacity the computer has. + * + * @return usage int Usage The memory usage at the current time + * @return capacity int Capacity The memory capacity the computer has + */)", getMemory) { + FINLua::FLuaSync sync(L); + + UFINKernelSystem* kernel = FINLua::luaFIN_getKernel(L); + + int64 Usage = kernel->GetMemoryUsage(); + int64 Capacity = kernel->GetCapacity(); + + lua_pushinteger(L, Usage); + lua_pushinteger(L, Capacity); + + return 2; + } + + LuaModuleTableFunction(R"(/** + * @LuaFunction ComputerCase getInstance() + * @DisplayName Get Instance + * @Dependency FullReflectionModule + * + * Returns a reference to the computer case in which the current code is running. + * + * @return case ComputerCase The computer case this lua runtime is running in. + */)", getInstance) { + FLuaSync sync(L); + + UFINKernelSystem* kernel = luaFIN_getKernel(L); + + luaFIN_pushObject(L, UFINNetworkUtils::RedirectIfPossible(FFIRTrace(kernel->GetNetwork()->GetComponent().GetObject()))); + + return 1; + } + + LuaModuleTableFunction(R"(/** + * @LuaFunction Object[] getPCIDevices([type: Class]) + * @DisplayName Get PCI-Devices + * + * This function allows you to get all installed https://docs.ficsit.app/ficsit-networks/latest/buildings/ComputerCase/index.html#_pci_interface[PCI-Devices] in a computer of a given type. + * Have a look at https://docs.ficsit.app/ficsit-networks/latest/lua/examples/PCIDevices.html[this] example to fully understand how it works. + * + * @parameter type Class Type Optional type which will be used to filter all PCI-Devices. If not provided, will return all PCI-Devices. + * @return objects Object[] Objects An array containing instances for each PCI-Device built into the computer. + */)", getPCIDevices) { + FLuaSync sync(L); + + UFINKernelSystem* kernel = luaFIN_getKernel(L); + + lua_newtable(L); + int args = lua_gettop(L); + UFIRClass* Type = nullptr; + if (args > 0) { + Type = luaFIN_toFINClass(L, 1, nullptr); + if (!Type) { + return 1; + } + } + int i = 1; + for (TScriptInterface Device : kernel->GetPCIDevices()) { + if (!Device || (Type && !Device.GetObject()->IsA(Cast(Type->GetOuter())))) continue; + luaFIN_pushObject(L, FFIRTrace(kernel->GetNetwork()->GetComponent().GetObject()) / Device.GetObject()); + lua_seti(L, -2, i++); + } + return 1; + } + + LuaModuleTableBareField(R"(/** + * @LuaBareField media FINMediaSubsystem + * @DisplayName Media + * + * Field containing a reference to the Media Subsystem. + */)", media) { + FLuaSync sync(L); + + UFINKernelSystem* kernel = luaFIN_getKernel(L); + luaFIN_pushObject(L, FIRTrace(AFINMediaSubsystem::GetMediaSubsystem(kernel))); + } + + LuaModuleTableFunction(R"(/** + * @LuaFunction int millis() + * @DisplayName Millis + * + * Returns the amount of milliseconds passed since the system started. + * + * @return millis int The amount of real milliseconds sinde the ingame-computer started. + */)", millis) { + FLuaSync sync(L); + + UFINKernelSystem* kernel = luaFIN_getKernel(L); + + lua_pushinteger(L, kernel->GetTimeSinceStart()); + return 1; + } + + LuaModuleTableFunction(R"(/** + * @LuaFunction setEEPROM(code: string) + * @DisplayName Set EEPROM + * + * Sets the code of the current eeprom. Doesn’t cause a system reset. + * + * @param code string The new EEPROM Code as string. + */)", setEEPROM) { + FLuaSync sync(L); + + UFINKernelSystem* kernel = luaFIN_getKernel(L); + if (!kernel) return 0; + + FString code = luaFIN_checkFString(L, 1); + + if (UFINLuaProcessor* luaProcessor = Cast(kernel->GetProcessor())) { + kernel->PushFuture(MakeShared>(FFINFunctionFuture([luaProcessor, code]() { + luaProcessor->SetEEPROM(code); + }))); + } else { + return luaL_error(L, "no eeprom set"); + } + + return 0; + } + + LuaModuleTableFunction(R"(/** + * @LuaFunction string getEEPROM + * @DisplayName Get EEPROM + * + * Returns the current eeprom contents. + * + * @return code string The EEPROM Code as string. + */)", getEEPROM) { + FLuaSync sync(L); + + UFINKernelSystem* kernel = luaFIN_getKernel(L); + + TOptional Code = Cast(kernel->GetProcessor())->GetEEPROM(); + if (Code.IsSet() == false) return luaL_error(L, "no eeprom set"); + luaFIN_pushFString(L, *Code); + return 1; + } + + LuaModuleTableFunction(R"(/** + * @LuaFunction beep(pitch: number) + * @DisplayName Beep + * + * Lets the computer emit a simple beep sound with the given pitch. + * + * @param pitch number a multiplier for the pitch adjustment of the beep sound. + */)", beep) { + FLuaSync sync(L); + + UFINKernelSystem* kernel = luaFIN_getKernel(L); + + float pitch = 1; + if (lua_isnumber(L, 1)) pitch = lua_tonumber(L, 1); + kernel->PushFuture(MakeShared>(FFINFunctionFuture([kernel, pitch]() { + kernel->GetAudio()->Beep(pitch); + }))); + return 0; + } + + LuaModuleTableFunction(R"(/** + * @LuaFunction panic(error: string) + * @DisplayName Panic + * + * Crashes the computer with the given error message. + */)", panic) { + luaL_checkstring(L, -1); + UFINKernelSystem* kernel = luaFIN_getKernel(L); + FString message = luaFIN_toFString(L, -1); + FFINLuaRuntime& runtime = luaFIN_getRuntime(L); + runtime.TickActions.Enqueue([kernel, message]() { + kernel->Crash(MakeShared(FString("PANIC! '") + message + "'")); + kernel->GetAudio()->Beep(); + }); + lua_yield(L, 0); + return 0; + } + } + } + + void luaFIN_setKernel(lua_State* L, UFINKernelSystem* Kernel) { + FFINLuaRuntime& runtime = luaFIN_getRuntime(L); + runtime.GlobalPointers.Add(TEXT("kernel"), Kernel); + } + + UFINKernelSystem* luaFIN_getKernel(lua_State* L) { + FFINLuaRuntime& runtime = luaFIN_getRuntime(L); + UFINKernelSystem** value = reinterpret_cast(runtime.GlobalPointers.Find(TEXT("kernel"))); + fgcheck(value != nullptr); + return *value; + } +} diff --git a/Source/FicsItNetworksLua/Private/FINLua/API/LuaWorldAPI.cpp b/Source/FicsItNetworksLua/Private/FINLua/API/LuaWorldAPI.cpp new file mode 100644 index 000000000..04fca785f --- /dev/null +++ b/Source/FicsItNetworksLua/Private/FINLua/API/LuaWorldAPI.cpp @@ -0,0 +1,117 @@ +#include "LuaWorldAPI.h" + +#include "FGAttentionPingActor.h" +#include "FGGameUI.h" +#include "FGPlayerController.h" +#include "FGTimeSubsystem.h" +#include "FINLuaModule.h" +#include "FINLuaRuntime.h" +#include "FINLuaThreadedRuntime.h" +#include "LuaStruct.h" + +namespace FINLua { + LuaModule(R"(/** + * @LuaModule WorldModule + * @DisplayName World Module + * @Dependency ReflectionSystemObjectModule + */)", WorldModule) { + LuaModuleLibrary(R"(/** + * @LuaLibrary computer + */)", computer) { + LuaModuleTableFunction(R"(/** + * @LuaFunction textNotification(text: string, username: string) + * @DisplayName Text Notification + * + * This function allows you to prompt a user with the given username, with a text message. + * + * @parameter text string Text The Text you want to send as Notification to the user + * @parameter username string Username The username of the user you want to send the notification to + */)", textNotification) { + FLuaSync sync(L); + + FFINLuaRuntime& runtime = luaFIN_getRuntime(L); + UWorld* world = luaFIN_getWorld(L); + + FString Text = luaFIN_checkFString(L, 1); + TOptional Player; + if (lua_isstring(L, 2)) Player = luaFIN_checkFString(L, 2); + for (auto players = world->GetPlayerControllerIterator(); players; ++players) { + AFGPlayerController* PlayerController = Cast(players->Get()); + if (Player.IsSet() && PlayerController->GetPlayerState()->GetUserName() != *Player) continue; + runtime.TickActions.Enqueue([PlayerController, Text]() { + PlayerController->GetGameUI()->ShowTextNotification(FText::FromString(Text)); + }); + /*kernel->PushFuture(MakeShared>(FFINFunctionFuture([PlayerController, Text]() { + UFINNotificationMessage* Message = NewObject(); + Message->NotificationText = FText::FromString(Text); + PlayerController->GetGameUI()->AddPendingMessage(Message); + UE_LOG(LogFicsItNetworksLua, Warning, TEXT("Pending Messages? %i"), PlayerController->GetGameUI()->CanReceiveMessageQueue()); + UE_LOG(LogFicsItNetworksLua, Warning, TEXT("Pending Message? %i"), PlayerController->GetGameUI()->CanReceiveMessage(UFINNotificationMessage::StaticClass())); + })));*/ + break; + } + return 0; + } + + LuaModuleTableFunction(R"(/** + * @LuaFunction attentionPing(position: Vector, [username: string]) + * @DisplayName Attention Ping + * + * Allows to send a World Marker/Attention Ping for all or the given user. + * + * @parameter position Struct Position The position in the world where the ping should occur + * @parameter username string Username The username of the user you want to ping. + */)", attentionPing) { + FLuaSync sync(L); + + FFINLuaRuntime& runtime = luaFIN_getRuntime(L); + UWorld* world = luaFIN_getWorld(L); + + FVector Position = *luaFIN_checkStruct(L, 1, true); + TOptional Player; + if (lua_isstring(L, 2)) Player = luaFIN_checkFString(L, 2); + for (auto players = world->GetPlayerControllerIterator(); players; players++) { + AFGPlayerController* PlayerController = Cast(players->Get()); + if (Player.IsSet() && PlayerController->GetPlayerState()->GetUserName() != *Player) continue; + runtime.TickActions.Enqueue([PlayerController, Position]() { + UClass* Class = LoadObject(nullptr, TEXT("/Game/FactoryGame/Character/Player/BP_AttentionPingActor.BP_AttentionPingActor_C")); + AFGAttentionPingActor* PingActor = PlayerController->GetWorld()->SpawnActorDeferred(Class, FTransform(Position)); + PingActor->SetOwningPlayerState(PlayerController->GetPlayerState()); + PingActor->FinishSpawning(FTransform(Position)); + }); + break; + } + return 0; + } + + LuaModuleTableFunction(R"(/** + * @LuaFunction number time() + * @DisplayName Time + * + * Returns the number of game seconds passed since the save got created. A game day consists of 24 game hours, a game hour consists of 60 game minutes, a game minute consists of 60 game seconds. + * + * @return time number The current number of game seconds passed since the creation of the save. + */)", time) { + FLuaSync sync(L); + + UWorld* world = luaFIN_getWorld(L); + + const AFGTimeOfDaySubsystem* Subsystem = AFGTimeOfDaySubsystem::Get(world); + lua_pushnumber(L, Subsystem->GetPassedDays() * 86400 + Subsystem->GetDaySeconds()); + return 1; + } + } + } + + void luaFIN_setWorld(lua_State* L, UWorld* world) { + FFINLuaRuntime& runtime = luaFIN_getRuntime(L); + runtime.GlobalPointers.Add(TEXT("world"), world); + } + + UWorld* luaFIN_getWorld(lua_State* L) { + FFINLuaRuntime& runtime = luaFIN_getRuntime(L); + UWorld** value = reinterpret_cast(runtime.GlobalPointers.Find(TEXT("world"))); + fgcheck(value != nullptr); + return *value; + } +} diff --git a/Source/FicsItNetworksLua/Private/FINLua/FINLuaModule.cpp b/Source/FicsItNetworksLua/Private/FINLua/FINLuaModule.cpp index 36ef6e598..023ccaec3 100644 --- a/Source/FicsItNetworksLua/Private/FINLua/FINLuaModule.cpp +++ b/Source/FicsItNetworksLua/Private/FINLua/FINLuaModule.cpp @@ -1,8 +1,9 @@ #include "FINLua/FINLuaModule.h" #include "FicsItNetworksLuaModule.h" +#include "FINLuaRuntime.h" +#include "FIRAnyValue.h" #include "Regex.h" -#include "FINLua/LuaExtraSpace.h" #include "FINLua/LuaPersistence.h" #include "Logging/StructuredLog.h" @@ -94,7 +95,7 @@ void FFINLuaTable::PushLuaValue(lua_State* L, const FString& PersistName) { luaL_setmetatable(L, "ModuleTableFunction"); } - lua_settable(L, -3); // table + FINLua::luaFIN_setOrMergeField(L, -3); // table } } @@ -215,8 +216,8 @@ void FFINLuaTable::AddTableFieldByDocumentationComment(TSharedRef field.Description = FText::FromString(block); } -void FFINLuaModule::SetupModule(lua_State* L) { - PreSetup.ExecuteIfBound(*this, L); +void FFINLuaModule::SetupModule(lua_State* L, const FFIRAnyValue& InitValue) { + PreSetup.ExecuteIfBound(*this, L, InitValue); PersistenceNamespace(InternalName); @@ -246,26 +247,17 @@ void FFINLuaModule::SetupModule(lua_State* L) { } lua_geti(L, LUA_REGISTRYINDEX, LUA_RIDX_GLOBALS); // Globals + int globals = lua_absindex(L, -1); for (const FFINLuaGlobal& global : Globals) { FINLua::luaFIN_pushFString(L, global.InternalName); // Globals, string - lua_pushvalue(L, -1); // Globals, string, string - if (lua_gettable(L, -2) > 0) { // Globals, string, nil|any - lua_pop(L, 2); // - UE_LOGFMT(LogFicsItNetworksLuaPersistence, Warning, "Failed to add Global Library '{LibraryName}' of Module '{ModuleName}'! Probably already exists!", global.InternalName, InternalName); - continue; - } - lua_pop(L, 1); // Globals, string - global.Value->PushLuaValue(L, InternalName + TEXT("-Global-") + global.InternalName); // Globals, string, Value - lua_settable(L, 1); // Globals + FINLua::luaFIN_setOrMergeField(L, globals); // Globals } lua_pop(L, 1); // - PostSetup.ExecuteIfBound(*this, L); - - FINLua::luaFIN_getExtraSpace(L).LoadedModules.Add(AsShared()); + PostSetup.ExecuteIfBound(*this, L, InitValue); } void FFINLuaModule::ParseDocumentationComment(const FString& Comment, const TCHAR* _InternalName) { @@ -377,6 +369,84 @@ FFINLuaModuleRegistry& FFINLuaModuleRegistry::GetInstance() { return registry; } +void FINLua::luaFIN_loadModules(lua_State* L, const TMap& LoadModules) { + FFINLuaModuleRegistry& registry = FFINLuaModuleRegistry::GetInstance(); + TMap> modules = registry.Modules; + FFINLuaRuntime& runtime = luaFIN_getRuntime(L); + TMap& loadedModules = runtime.LoadedModules; + + TArray NeedToBeLoaded; + LoadModules.GetKeys(NeedToBeLoaded); + NeedToBeLoaded.Insert(TEXT("ModuleSystem"), 0); + + for (const FString& loadModule : NeedToBeLoaded) { + FString FailedToLoadPrev; + TArray modulesToLoad = {loadModule}; + + while (modulesToLoad.Num() > 0) { + FString moduleName = modulesToLoad.Top(); + + if (loadedModules.Contains(moduleName)) { + modulesToLoad.Pop(); + continue; + } + + if (!modules.Contains(moduleName)) { + if (FailedToLoadPrev.IsEmpty()) { + UE_LOGFMT(LogFicsItNetworksLua, Error, "Failed to load Lua Module '{module}': Module not found!", moduleName); + FailedToLoadPrev = moduleName; + } + modulesToLoad.Pop(); + continue; + } + + TSharedRef module = modules[moduleName]; + + if (!FailedToLoadPrev.IsEmpty()) { + if (module->Dependencies.Contains(FailedToLoadPrev)) { + UE_LOGFMT(LogFicsItNetworksLua, Error, "Failed to load Lua Module '{module}': Failed to load a dependency due to previous error.", moduleName); + modules.Remove(moduleName); + FailedToLoadPrev = moduleName; + } + modulesToLoad.Pop(); + continue; + } + + bool bLoadDependenciesFirst = false; + for (const FString& dependency : module->Dependencies) { + if (!loadedModules.Contains(dependency)) { + bLoadDependenciesFirst = true; + if (modulesToLoad.Contains(dependency)) { + FString chain = dependency; + for (int i = modulesToLoad.Num(); i > 0; --i) { + chain = modulesToLoad[i-1] + " -> " + chain; + if (modulesToLoad[i-1] == dependency) break; + } + UE_LOGFMT(LogFicsItNetworksLua, Error, "Failed to load Lua Module '{dependency}': Circular dependency '{chain}' found!", dependency, chain); + FailedToLoadPrev = moduleName; + break; + } + modulesToLoad.Add(dependency); + } + } + if (bLoadDependenciesFirst) continue; + + FFIRAnyValue optValue; + if (const FFIRAnyValue* value = LoadModules.Find(moduleName)) { + optValue = *value; + } + + module->SetupModule(L, optValue); + + modulesToLoad.Pop(); + modules.Remove(moduleName); + loadedModules.Add(moduleName, optValue); + + UE_LOGFMT(LogFicsItNetworksLua, Display, "Lua Module '{module}' loaded!", moduleName); + } + } +} + namespace FINLua { LuaModule(R"(/** * @LuaModule ModuleSystem @@ -452,4 +522,4 @@ namespace FINLua { } } } -} \ No newline at end of file +} diff --git a/Source/FicsItNetworksLua/Private/FINLua/FINLuaRuntime.cpp b/Source/FicsItNetworksLua/Private/FINLua/FINLuaRuntime.cpp new file mode 100644 index 000000000..6ded000f5 --- /dev/null +++ b/Source/FicsItNetworksLua/Private/FINLua/FINLuaRuntime.cpp @@ -0,0 +1,255 @@ +#include "FINLua/FINLuaRuntime.h" + +#include "Base64.h" +#include "FicsItLogLibrary.h" +#include "FicsItNetworksLuaModule.h" +#include "FINLuaModule.h" +#include "FINLuaRuntimePersistence.h" +#include "ScopeExit.h" +#include "Union.h" + +void luaWarnF(void* ud, const char* msg, int tocont) { + UFILogLibrary::Log(FIL_Verbosity_Warning, UTF8_TO_TCHAR(msg)); +} + +int luaPanicF(lua_State* L) { + FString message = FINLua::luaFIN_toFString(L, -1); + UE_LOG(LogFicsItNetworksLua, Warning, TEXT("A Lua Runtime caused Panic with message: %s"), *message); + throw FFINLuaPanic(message); +} + +FFINLuaRuntime::FFINLuaRuntime() { + Modules.Add(TEXT("BaseModule"), FFIRAnyValue()); +} + +FFINLuaRuntime::~FFINLuaRuntime() { + Destroy(); +} + +void FFINLuaRuntime::Reset() { + Destroy(); + + OnPreReset.Broadcast(); + + // create new lua state + LuaState = luaL_newstate(); + + *static_cast(lua_getextraspace(LuaState)) = this; + + // setup error/warning function + lua_setwarnf(LuaState, luaWarnF, this); + lua_atpanic(LuaState, luaPanicF); + + // setup registry + lua_newtable(LuaState); + lua_setfield(LuaState, LUA_REGISTRYINDEX, LUAFIN_REGISTRYKEY_UNPERSIST); + lua_newtable(LuaState); + lua_setfield(LuaState, LUA_REGISTRYINDEX, LUAFIN_REGISTRYKEY_PERSIST); + lua_newtable(LuaState); + lua_setfield(LuaState, LUA_REGISTRYINDEX, LUAFIN_REGISTRYKEY_HIDDENGLOBALS); + + OnPreModules.Broadcast(); + + FINLua::luaFIN_loadModules(LuaState, Modules); + + // create new thread for user code chunk + LuaThread = lua_newthread(LuaState); + LuaThreadIndex = lua_gettop(LuaState); + + OnPostReset.Broadcast(); +} + +void FFINLuaRuntime::Destroy() { + OnPreDestroy.Broadcast(); + + if (LuaState) { + lua_close(LuaState); + } + + LoadedModules.Empty(); + GlobalData.Empty(); + GlobalPointers.Empty(); + LuaState = nullptr; + LuaThread = nullptr; + LuaThreadIndex = 0; + + TickActions.Empty(); +} + +TOptional FFINLuaRuntime::LoadCode(const FString& Code) { + // setup thread with code + const FTCHARToUTF8 CodeConv(*Code, Code.Len()); + luaL_loadbuffer(LuaThread, CodeConv.Get(), CodeConv.Length(), "=EEPROM"); + if (lua_isstring(LuaThread, -1)) { + // Syntax error + return FINLua::luaFIN_toFString(LuaThread, -1); + } + return {}; +} + +int luaUnpersist(lua_State* L) { + // data-str, uperm + + // unpersist data + eris_unpersist(L, 2, 1); // data-str, uperm, data + + return 1; +} + +TOptional FFINLuaRuntime::LoadState(FFINLuaRuntimePersistenceState& InState) { + if (InState.LuaData.Len() < 1) return {}; + + // decode & check data from json + TArray luaData; + if (!FBase64::Decode(InState.LuaData, luaData)) { + return {}; + } + lua_pushlstring(LuaState, (char*)luaData.GetData(), luaData.Num()); // ..., data-str + + // get uperm table + lua_getfield(LuaState, LUA_REGISTRYINDEX, LUAFIN_REGISTRYKEY_UNPERSIST); // ..., data-str, uperm + + PersistenceState = &InState; + + try { + FINLua::luaFINDebug_dumpStack(LuaState); + eris_unpersist(LuaState, -1, -2); // ..., data-str, uperm, data + } catch(const FFINLuaPanic& e) { + PersistenceState = nullptr; + return e.Message; + } + PersistenceState = nullptr; + + // place persisted data + lua_getfield(LuaState, -1, "thread"); // ..., data-str, uperm, data, thread + lua_replace(LuaState, LuaThreadIndex); // ..., data-str, uperm, data + lua_getfield(LuaState, -1, "globals"); // ..., data-str, uperm, data, globals + lua_seti(LuaState, LUA_REGISTRYINDEX, LUA_RIDX_GLOBALS); // ..., data-str, uperm, data + lua_getfield(LuaState, -1, "hidden-globals"); // ..., data-str, uperm, data, hidden-globals + lua_setfield(LuaState, LUA_REGISTRYINDEX, "hidden-globals"); // ..., data-str, uperm, data + + LuaThread = lua_tothread(LuaState, LuaThreadIndex); + + lua_pop(LuaState, 3); // ... + + return {}; +} + +int luaPersist(lua_State* L) { + // perm, data + eris_persist(L, lua_upvalueindex(1), lua_upvalueindex(2)); // ..., perm, data, data-str + return 1; +} + +TUnion FFINLuaRuntime::SaveState() { + FFINLuaRuntimePersistenceState State; + + // prepare state data + lua_getfield(LuaState, LUA_REGISTRYINDEX, LUAFIN_REGISTRYKEY_PERSIST); // ..., perm + lua_newtable(LuaState); // ..., perm, data + lua_geti(LuaState, LUA_REGISTRYINDEX, LUA_RIDX_GLOBALS); // ..., perm, data, globals + lua_setfield(LuaState, -2, "globals"); // ..., perm, data + lua_pushvalue(LuaState, LuaThreadIndex); // ..., perm, data, thread + lua_setfield(LuaState, -2, "thread"); // ..., perm, data + lua_getfield(LuaState, LUA_REGISTRYINDEX, "hidden-globals"); // ..., perm, data, hidden-globals + lua_setfield(LuaState, -2, "hidden-globals"); // ..., perm, data + + PersistenceState = &State; + + lua_pushcclosure(LuaState, &luaPersist, 2); + int stateCode = lua_pcall(LuaState, 0, 1, 0); // ..., data-str|error + FINLua::luaFINDebug_dumpStack(LuaState); + + PersistenceState = nullptr; + + if (stateCode != LUA_OK) { + FString message = FINLua::luaFIN_toFString(LuaState, -1); + return TUnion(message); + } + + // encode persisted data + size_t data_l = 0; + const char* data_r = lua_tolstring(LuaState, -1, &data_l); + TArray data((uint8*)data_r, data_l); + State.LuaData = FBase64::Encode(data); + + lua_pop(LuaState, 1); // ... + + return TUnion(State); +} + +FFINLuaRuntime& FINLua::luaFIN_getRuntime(lua_State* L) { + return **(FFINLuaRuntime**)lua_getextraspace(L); +} + +void luaFIN_tickHook(lua_State* L, lua_Debug*) { + lua_yield(L, 0); +} + +TOptional> FFINLuaRuntime::Tick() { + if (!TickActions.IsEmpty()) { + TFunction func; + while (TickActions.Dequeue(func)) { + func(); + } + return {}; + } else { + return {LuaTick()}; + } +} + +TTuple FFINLuaRuntime::LuaTick() { + TArray> TickScope; + OnPreLuaTick.Broadcast(TickScope); + + if (Hook_Tick) { + lua_sethook(LuaThread, luaFIN_tickHook, LUA_MASKCOUNT, *Hook_Tick); + } + + int results; + int status = lua_resume(LuaThread, LuaState, 0, &results); + + OnPostLuaTick.Broadcast(status, results); + + if (results > 0) { + lua_pop(LuaThread, results); + } + + if (status == LUA_YIELD) { + lua_gc(LuaState, LUA_GCCOLLECT, 0); + } + + return {status, results}; +} + +FFINLuaRuntime::EStatus FFINLuaRuntime::GetStatus() const { + if (!LuaState) { + return None; + } + int status = lua_status(LuaThread); + switch (status) { + case LUA_YIELD: + return Running; + case LUA_OK: { + int results = lua_gettop(LuaThread); + if (results == 0) { + return Finished; + } + return Running; + } + default: + return Crashed; + } +} + +TOptional FFINLuaRuntime::GetError() const { + if (GetStatus() != Crashed) { + return {}; + } + + const char* message = lua_tostring(LuaThread, -1); + try { + luaL_traceback(LuaThread, LuaThread, message, 0); + } catch (FString error) {} + return {FINLua::luaFIN_toFString(LuaThread, -1)}; +} diff --git a/Source/FicsItNetworksLua/Private/FINLua/FINLuaThreadedRuntime.cpp b/Source/FicsItNetworksLua/Private/FINLua/FINLuaThreadedRuntime.cpp new file mode 100644 index 000000000..4b1e391bb --- /dev/null +++ b/Source/FicsItNetworksLua/Private/FINLua/FINLuaThreadedRuntime.cpp @@ -0,0 +1,140 @@ +#include "FINLuaThreadedRuntime.h" + +#include "FINLuaModule.h" +#include "LuaPersistence.h" + +FFINLuaThreadedRuntime::FFINLuaThreadedRuntime() : LuaTask(FAsyncTask(this)) { + Runtime.Modules.Add("ThreadedRuntimeModule"); + OnPreGarbageCollectionHandle = FCoreUObjectDelegates::GetPreGarbageCollectDelegate().AddLambda([this]() { + PauseAndWait(); + }); + Runtime.OnPostReset.AddLambda([this]() { + SetShouldBePromoted(false); + FINLua::luaFIN_setThreadedRuntime(Runtime.GetLuaState(), *this); + }); + Runtime.OnPreDestroy.AddLambda([this]() { + PauseAndWait(); + }); +} + +FFINLuaThreadedRuntime::~FFINLuaThreadedRuntime() { + FCoreUObjectDelegates::GetPreGarbageCollectDelegate().Remove(OnPreGarbageCollectionHandle); + PauseAndWait(); +} +UE_DISABLE_OPTIMIZATION_SHIP +void FFINLuaTickRunnable::DoWork() { + Runtime->bIsPromotedTick = true; + ON_SCOPE_EXIT { + Runtime->bIsPromotedTick = false; + }; + while (Runtime->ShouldRunInThread.Load() && Runtime->Runtime.TickActions.IsEmpty()) { + TOptional> status = Runtime->Runtime.Tick(); + + if (Runtime->WaitForThread) { + Runtime->ContinueThread = MakeShared(); + Runtime->WaitForThread->Get()->Trigger(); + Runtime->ContinueThread->Get()->Wait(); + } + + if (status && status->Get<0>() != LUA_YIELD) { + break; + } + } +} +UE_ENABLE_OPTIMIZATION_SHIP + +void FFINLuaThreadedRuntime::HandleWaitForGame() { + if (WaitForGame) { + TSharedPtr waitForGame = WaitForGame; + fgcheck(waitForGame.IsValid()); + WaitForGame.Reset(); + fgcheck(!ContinueGame.IsValid()); + TSharedPtr continueGame = ContinueGame = MakeShared(); + waitForGame->Get()->Trigger(); + continueGame->Get()->Wait(); + } +} + +TSharedPtr FFINLuaThreadedRuntime::DoWaitForGame() { + if (!bIsPromotedTick) return nullptr; + IsWaitingForCompletionMutex.Lock(); + if (bIsWaitingForCompletion) { + IsWaitingForCompletionMutex.Unlock(); + return nullptr; + } + fgcheck(!WaitForGame.IsValid()); + TSharedPtr waitForGame = WaitForGame = MakeShared(); + IsWaitingForCompletionMutex.Unlock(); + waitForGame->Get()->Wait(); + TSharedPtr continueGame = ContinueGame; + fgcheck(continueGame.IsValid()); + ContinueGame.Reset(); + return continueGame.ToSharedRef(); +} + +TOptional> FFINLuaThreadedRuntime::Run() { + HandleWaitForGame(); + if (!Runtime.TickActions.IsEmpty()) { + PauseAndWait(); + TFunction func; + while (Runtime.TickActions.Dequeue(func)) { + func(); + } + } else if (LuaTask.IsDone() && GetStatus() == FFINLuaRuntime::Running) { + if (ShouldRunInThread.Load() && Runtime.Hook_Tick.IsSet()) { + LuaTask.StartBackgroundTask(GThreadPool, EQueuedWorkPriority::Normal, EQueuedWorkFlags::DoNotRunInsideBusyWait, -1, TEXT("FINLuaThreadedRuntime")); + } else { + return Runtime.Tick(); + } + } + return {}; +} + +void FFINLuaThreadedRuntime::PauseAndWait() { + bool bShouldThreadRun = ShouldRunInThread.Load(); + ShouldRunInThread.Store(false); + IsWaitingForCompletionMutex.Lock(); + bIsWaitingForCompletion = true; + IsWaitingForCompletionMutex.Unlock(); + HandleWaitForGame(); + LuaTask.EnsureCompletion(false); + bIsWaitingForCompletion = false; + ShouldRunInThread.Store(bShouldThreadRun); + + TFunction func; + while (Runtime.TickActions.Dequeue(func)) { + func(); + } +} + +FFINLuaRuntime::EStatus FFINLuaThreadedRuntime::GetStatus() { + if (LuaTask.IsDone()) { + return Runtime.GetStatus(); + } else { + return FFINLuaRuntime::Running; + } +} + + +namespace FINLua { + void luaFIN_setThreadedRuntime(lua_State* L, FFINLuaThreadedRuntime& threadedRuntime) { + FFINLuaRuntime& runtime = luaFIN_getRuntime(L); + runtime.GlobalPointers.Add(TEXT("threaded"), &threadedRuntime); + } + + FFINLuaThreadedRuntime& luaFIN_getThreadedRuntime(lua_State* L) { + FFINLuaRuntime& runtime = luaFIN_getRuntime(L); + FFINLuaThreadedRuntime** threaded = reinterpret_cast(runtime.GlobalPointers.Find(TEXT("threaded"))); + fgcheck(threaded); + return **threaded; + } + + FFINLuaThreadedRuntime* luaFIN_tryGetThreadedRuntime(lua_State* L) { + FFINLuaRuntime& runtime = luaFIN_getRuntime(L); + FFINLuaThreadedRuntime** threaded = reinterpret_cast(runtime.GlobalPointers.Find(TEXT("threaded"))); + if (!threaded) { + return nullptr; + } + return *threaded; + } +} diff --git a/Source/FicsItNetworksLua/Private/FINLua/LuaGlobalLib.cpp b/Source/FicsItNetworksLua/Private/FINLua/LuaBaseModule.cpp similarity index 51% rename from Source/FicsItNetworksLua/Private/FINLua/LuaGlobalLib.cpp rename to Source/FicsItNetworksLua/Private/FINLua/LuaBaseModule.cpp index a2d755e8f..611053a2e 100644 --- a/Source/FicsItNetworksLua/Private/FINLua/LuaGlobalLib.cpp +++ b/Source/FicsItNetworksLua/Private/FINLua/LuaBaseModule.cpp @@ -1,6 +1,5 @@ -#include "FINLua/LuaGlobalLib.h" - #include "FGBlueprintFunctionLibrary.h" +#include "FicsItLogLibrary.h" #include "FicsItNetworksLuaModule.h" #include "FILLogContainer.h" #include "FINLua/Reflection/LuaClass.h" @@ -20,28 +19,9 @@ namespace FINLua { return 0; } - int luaPrint(lua_State* L) { - // ReSharper disable once CppDeclaratorNeverUsed - FLuaSyncCall SyncCall(L); - const int args = lua_gettop(L); - std::string log; - for (int i = 1; i <= args; ++i) { - size_t s_len = 0; - const char* s = luaL_tolstring(L, i, &s_len); - if (!s) luaL_argerror(L, i, "is not valid type"); - log += std::string(s, s_len) + " "; - } - if (log.length() > 0) log = log.erase(log.length()-1); - - UFINLuaProcessor* Processor = UFINLuaProcessor::luaGetProcessor(L); - Processor->GetKernel()->GetLog()->PushLogEntry(FIL_Verbosity_Info, UTF8_TO_TCHAR(log.c_str())); - - return UFINLuaProcessor::luaAPIReturn(L, 0); - } - int luaYieldResume(lua_State* L, int status, lua_KContext ctx) { // don't pass pushed bool for user executed yield identification - return UFINLuaProcessor::luaAPIReturn(L, lua_gettop(L)-1); + return lua_gettop(L)-1; } int luaYield(lua_State* L) { @@ -49,12 +29,10 @@ namespace FINLua { return luaFIN_yield(L, args, NULL, &luaYieldResume); } - int luaResume(lua_State* L); // pre-declare - + int luaResume(lua_State* L); int luaResumeResume(lua_State* L, int status, lua_KContext ctx) { - return UFINLuaProcessor::luaAPIReturn(L, luaResume(L)); + return luaResume(L); } - int luaResume(lua_State* L) { const int args = lua_gettop(L); luaL_checktype(L, 1, LUA_TTHREAD); @@ -67,7 +45,8 @@ namespace FINLua { } // attach hook for out-of-time exception if thread got loaded from save and hook is not applied - lua_sethook(thread, UFINLuaProcessor::luaHook, LUA_MASKCOUNT, UFINLuaProcessor::luaGetProcessor(L)->GetTickHelper().steps()); + //lua_sethook(thread, UFINLuaProcessor::luaHook, LUA_MASKCOUNT, UFINLuaProcessor::luaGetProcessor(L)->GetTickHelper().steps()); + // TODO: Check if this hook is necessary // copy passed arguments to coroutine so it can return these arguments from the yield function // but don't move the passed coroutine and then resume the coroutine @@ -101,10 +80,10 @@ namespace FINLua { int luaRunning(lua_State* L) { - UFINLuaProcessor* p = UFINLuaProcessor::luaGetProcessor(L); + FFINLuaRuntime& runtime = luaFIN_getRuntime(L); int ismain = lua_pushthread(L); lua_State* thread = lua_tothread(L, -1); - if (thread == p->GetLuaThread()) ismain = 1; + if (thread == runtime.GetLuaThread()) ismain = 1; lua_pushboolean(L, ismain); return 2; } @@ -189,30 +168,25 @@ namespace FINLua { } #pragma optimize("", on) */ - - int luaFindItem(lua_State* L) { - FLuaSyncCall SyncCall(L); - const int NumArgs = lua_gettop(L); - if (NumArgs < 1) return UFINLuaProcessor::luaAPIReturn(L, 0); - const char* str = luaL_tolstring(L, -1, nullptr); - TArray> items; - UFGBlueprintFunctionLibrary::Cheat_GetAllDescriptors(items); - if (str) for (TSubclassOf item : items) { - if (IsValid(item) && UFGItemDescriptor::GetItemName(item).ToString() == FString(str)) { - luaFIN_pushClass(L, item); - return UFINLuaProcessor::luaAPIReturn(L, 1); + int luaTableMerge(lua_State* L) { + int args = lua_gettop(L); + luaL_checktype(L, 1, LUA_TTABLE); + for (int i = 1; i <= args; ++i) { + luaL_checktype(L, i, LUA_TTABLE); + lua_pushnil(L); + while (lua_next(L, i) != 0) { + lua_pushvalue(L, -2); + lua_insert(L, -2); + luaFIN_setOrMergeField(L, 1); } + lua_pop(L, 1); } - - lua_pushnil(L); - return UFINLuaProcessor::luaAPIReturn(L, 1); + return 1; } int luaGetItems(lua_State* L) { - UFINLuaProcessor* processor = UFINLuaProcessor::luaGetProcessor(L); - UFINKernelSystem* kernel = processor->GetKernel(); - UModContentRegistry* ContentRegistry = UModContentRegistry::Get(processor); + FLuaSync SyncCall(L); int top = lua_gettop(L); FString Filter; int i = 1; @@ -226,27 +200,45 @@ namespace FINLua { pageSize = FMath::Clamp(lua_tointeger(L, i++), 1, 100); pageOffset = FMath::Max(0, lua_tointeger(L, i++)); } + lua_newtable(L); - UClass* ItemDescriptorClass = UFGItemDescriptor::StaticClass(); + + TArray> items; + UFGBlueprintFunctionLibrary::Cheat_GetAllDescriptors(items); + int64 CurrentIndex = 0; - bool bDone = false; - ForEachObjectOfClass(UClass::StaticClass(), [&](UObject* LoadedClassObject) { - if (bDone) return; - UClass* Class = Cast(LoadedClassObject); - if (Class->IsChildOf(ItemDescriptorClass)) { - const TSubclassOf ItemDescriptor = Class; - FString Name = UFGItemDescriptor::GetItemName(ItemDescriptor).ToString(); - if (Name.Contains(Filter)) { - if (pageOffset * pageSize <= CurrentIndex) { - luaFIN_pushFString(L, Name); - luaFIN_pushClass(L, ItemDescriptor); - lua_settable(L, -3); - } - CurrentIndex += 1; - if ((pageOffset+1) * pageSize <= CurrentIndex) bDone = true; + for (TSubclassOf ItemDescriptor : items) { + FString Name = UFGItemDescriptor::GetItemName(ItemDescriptor).ToString(); + if (Name.Contains(Filter)) { + if (pageOffset * pageSize <= CurrentIndex) { + luaFIN_pushFString(L, Name); + luaFIN_pushClass(L, ItemDescriptor); + lua_settable(L, -3); } + CurrentIndex += 1; + if ((pageOffset+1) * pageSize <= CurrentIndex) break; } - }); + } + return 1; + } + + int luaFindItem(lua_State* L) { + FLuaSync SyncCall(L); + const int NumArgs = lua_gettop(L); + if (NumArgs < 1) return 0; + const char* str = luaL_tolstring(L, -1, nullptr); + + TArray> items; + UFGBlueprintFunctionLibrary::Cheat_GetAllDescriptors(items); + if (str) for (TSubclassOf item : items) { + if (IsValid(item) && UFGItemDescriptor::GetItemName(item).ToString() == FString(str)) { + luaFIN_pushClass(L, item); + return 1; + } + } + + lua_pushnil(L); + return 1; } @@ -279,135 +271,81 @@ namespace FINLua { if (Class) luaFIN_pushClass(L, Class); else lua_pushnil(L); if (isT) lua_seti(L, -2, ++j); - UFINLuaProcessor::luaGetProcessor(L)->GetKernel()->GetLog()->PushLogEntry(FIL_Verbosity_Warning, FString::Printf(TEXT("Instead of 'findClass(\"%s\")' use 'classes.%s'"), *ClassName, *ClassName)); + UFILogLibrary::Log(FIL_Verbosity_Warning, FString::Printf(TEXT("Instead of 'findClass(\"%s\")' use 'classes.%s'"), *ClassName, *ClassName)); } } - - return UFINLuaProcessor::luaAPIReturn(L, args); + return args; } - - void setupGlobals(lua_State* L) { - PersistenceNamespace("Globals"); -#pragma warning( push ) -#pragma warning( disable : 4996 ) - lua_register(L, "findClass", luaFindClass_DEPRECATED); - PersistGlobal("findClass"); -#pragma warning( pop ) - - luaopen_base(L); - lua_pushnil(L); - lua_setfield(L, -2, "collectgarbage"); - lua_pushnil(L); - lua_setfield(L, -2, "dofile"); - lua_pushnil(L); - lua_setfield(L, -2, "loadfile"); - lua_pushcfunction(L, luaXpcall); - lua_setfield(L, -2, "xpcall"); - lua_pushcfunction(L, luaPrint); - lua_setfield(L, -2, "print"); - PersistTable("global", -1); - lua_pop(L, 1); - - luaL_requiref(L, "table", luaopen_table, true); - PersistTable("table", -1); - lua_pop(L, 1); - - luaL_requiref(L, "coroutine", luaopen_coroutine, true); - lua_pushcfunction(L, luaResume); - lua_setfield(L, -2, "resume"); - lua_pushcfunction(L, luaYield); - lua_setfield(L, -2, "yield"); - lua_pushcfunction(L, luaRunning); - lua_setfield(L, -2, "running"); - PersistTable("coroutine", -1); - lua_pop(L, 1); - - lua_pushcfunction(L, reinterpret_cast(reinterpret_cast(luaYieldResume))); - PersistValue("coroutineYieldContinue"); - lua_pushcfunction(L, reinterpret_cast(reinterpret_cast(luaResumeResume))); - PersistValue("coroutineResumeContinue"); - - luaL_requiref(L, "math", luaopen_math, true); - PersistTable("math", -1); - lua_pop(L, 1); - - luaL_requiref(L, "string", luaopen_string, true); - PersistTable("string", -1); - lua_pop(L, 1); - - lua_register(L, "findItem", luaFindItem); - PersistGlobal("findItem"); - lua_register(L, "getItems", luaGetItems); - PersistGlobal("getItems"); - -/*#ifdef TRACY_ENABLE - tracy::LuaRegister(L); - PersistGlobal("tracy"); -#endif*/ - - setupUtilLib(L); - - TMap> modules; - for (const TSharedRef& module : FFINLuaModuleRegistry::GetInstance().Modules) { - modules.Add(module->InternalName, module); - } - TSet loadedModules; - while (modules.Num() > 0) { - FString FailedToLoadPrev; - TArray modulesToLoad = { modules.begin().Key() }; - while (modulesToLoad.Num() > 0) { - FString moduleName = modulesToLoad.Top(); - - if (!modules.Contains(moduleName)) { - if (FailedToLoadPrev.IsEmpty()) { - UE_LOGFMT(LogFicsItNetworksLua, Error, "Failed to load Lua Module '{module}': Module not found!", moduleName); - FailedToLoadPrev = moduleName; - } - modulesToLoad.Pop(); - continue; - } - - TSharedRef module = modules[moduleName]; - - if (!FailedToLoadPrev.IsEmpty()) { - if (module->Dependencies.Contains(FailedToLoadPrev)) { - UE_LOGFMT(LogFicsItNetworksLua, Error, "Failed to load Lua Module '{module}': Failed to load a dependency due to previous error.", moduleName); - modules.Remove(moduleName); - FailedToLoadPrev = moduleName; - } - modulesToLoad.Pop(); - continue; - } - - bool bLoadDependenciesFirst = false; - for (const FString& dependency : module->Dependencies) { - if (!loadedModules.Contains(dependency)) { - bLoadDependenciesFirst = true; - if (modulesToLoad.Contains(dependency)) { - FString chain = dependency; - for (int i = modulesToLoad.Num(); i > 0; --i) { - chain = modulesToLoad[i-1] + " -> " + chain; - if (modulesToLoad[i-1] == dependency) break; - } - UE_LOGFMT(LogFicsItNetworksLua, Error, "Failed to load Lua Module '{dependency}': Circular dependency '{chain}' found!", dependency, chain); - FailedToLoadPrev = moduleName; - break; - } - modulesToLoad.Add(dependency); - } - } - if (bLoadDependenciesFirst) continue; - - module->SetupModule(L); - - modulesToLoad.Pop(); - modules.Remove(moduleName); - loadedModules.Add(moduleName); - - UE_LOGFMT(LogFicsItNetworksLua, Display, "Lua Module '{module}' loaded!", moduleName); - } + LuaModule(R"(/** + * @LuaModule BaseModule + * @DisplayName Base Module + * + * This module provides based functionallity to the Lua runtime. + * Inluding base Lua Libraries (table, math, coroutine, etc). + */)", BaseModule) { + LuaModulePostSetup() { + PersistenceNamespace("Base"); + + #pragma warning( push ) + #pragma warning( disable : 4996 ) + lua_register(L, "findClass", luaFindClass_DEPRECATED); + PersistGlobal("findClass"); + #pragma warning( pop ) + + luaopen_base(L); + lua_pushnil(L); + lua_setfield(L, -2, "collectgarbage"); + lua_pushnil(L); + lua_setfield(L, -2, "dofile"); + lua_pushnil(L); + lua_setfield(L, -2, "print"); + lua_pushnil(L); + lua_setfield(L, -2, "loadfile"); + lua_pushcfunction(L, luaXpcall); + lua_setfield(L, -2, "xpcall"); + PersistTable("global", -1); + lua_pop(L, 1); + + luaL_requiref(L, "table", luaopen_table, true); + lua_pushcfunction(L, luaTableMerge); + lua_setfield(L, -2, "merge"); + PersistTable("table", -1); + lua_pop(L, 1); + + luaL_requiref(L, "math", luaopen_math, true); + PersistTable("math", -1); + lua_pop(L, 1); + + luaL_requiref(L, "string", luaopen_string, true); + PersistTable("string", -1); + lua_pop(L, 1); + + luaL_requiref(L, "coroutine", luaopen_coroutine, true); + lua_pushcfunction(L, luaResume); + lua_setfield(L, -2, "resume"); + lua_pushcfunction(L, luaYield); + lua_setfield(L, -2, "yield"); + lua_pushcfunction(L, luaRunning); + lua_setfield(L, -2, "running"); + PersistTable("coroutine", -1); + lua_pop(L, 1); + + lua_pushcfunction(L, reinterpret_cast(reinterpret_cast(luaYieldResume))); + PersistValue("coroutineYieldContinue"); + lua_pushcfunction(L, reinterpret_cast(reinterpret_cast(luaResumeResume))); + PersistValue("coroutineResumeContinue"); + + lua_register(L, "findItem", luaFindItem); + PersistGlobal("findItem"); + lua_register(L, "getItems", luaGetItems); + PersistGlobal("getItems"); + + /*#ifdef TRACY_ENABLE + tracy::LuaRegister(L); + PersistGlobal("tracy"); + #endif*/ } } } diff --git a/Source/FicsItNetworksLua/Private/FINLua/LuaFuture.cpp b/Source/FicsItNetworksLua/Private/FINLua/LuaFuture.cpp index f6d1caddb..82a9fb2a4 100644 --- a/Source/FicsItNetworksLua/Private/FINLua/LuaFuture.cpp +++ b/Source/FicsItNetworksLua/Private/FINLua/LuaFuture.cpp @@ -2,7 +2,7 @@ #include "FicsItNetworksLuaModule.h" #include "FINLuaProcessor.h" -#include "LuaExtraSpace.h" +#include "LuaKernelAPI.h" #include "FINLua/FINLuaModule.h" #include "FINLua/LuaPersistence.h" @@ -16,6 +16,8 @@ namespace FINLua { * @LuaModule FutureModule * @DisplayName Future Module * + * @Dependency KernelModule + * * This Module provides the Future type and all its necessary functionallity. */)", FutureModule) { LuaModuleMetatable(R"(/** @@ -32,12 +34,9 @@ namespace FINLua { } int unpersist(lua_State* L) { - UFINLuaProcessor* processor = UFINLuaProcessor::luaGetProcessor(L); - - // get persist storage - FFINLuaProcessorStateStorage& storage = processor->StateStorage; + FFINLuaRuntimePersistenceState& persistence = luaFIN_getPersistence(L); - luaFIN_pushFuture(L, *storage.GetStruct(luaL_checkinteger(L, lua_upvalueindex(1)))); + luaFIN_pushFuture(L, *persistence.GetStruct(luaL_checkinteger(L, lua_upvalueindex(1)))); return 1; } @@ -47,8 +46,7 @@ namespace FINLua { */)", __persist) { FLuaFuture future = luaFIN_checkFutureStruct(L, 1); - UFINLuaProcessor* processor = UFINLuaProcessor::luaGetProcessor(L); - FFINLuaProcessorStateStorage& storage = processor->StateStorage; + FFINLuaRuntimePersistenceState& storage = luaFIN_getPersistence(L); lua_pushinteger(L, storage.Add(future)); lua_pushcclosure(L, unpersist, 1); @@ -253,14 +251,14 @@ namespace FINLua { int luaSleepContinue(lua_State* L, int, lua_KContext) { double timeout = lua_tonumber(L, 1); double start = lua_tonumber(L, 2); - double millis = luaFIN_getExtraSpace(L).Processor->GetKernel()->GetTimeSinceStart(); + double millis = luaFIN_getKernel(L)->GetTimeSinceStart(); if (millis - start < timeout*1000) { return lua_yieldk(L, 0, NULL, luaSleepContinue); } return 0; } int luaSleep(lua_State* L) { - double millis = luaFIN_getExtraSpace(L).Processor->GetKernel()->GetTimeSinceStart(); + double millis = luaFIN_getKernel(L)->GetTimeSinceStart(); lua_pushnumber(L, millis); return luaSleepContinue(L, 0, NULL); } @@ -398,8 +396,6 @@ namespace FINLua { lua_pushcfunction(L, reinterpret_cast(reinterpret_cast(future::luaLoopContinue))); PersistValue("LoopContinue"); - - } } @@ -408,7 +404,7 @@ namespace FINLua { new (future) FLuaFuture(MakeShared>(Future)); luaL_setmetatable(L, FutureModule::FutureStruct::_Name); if (!(**future)->IsDone()) { - UFINKernelSystem* kernel = UFINLuaProcessor::luaGetProcessor(L)->GetKernel(); + UFINKernelSystem* kernel = luaFIN_getKernel(L); kernel->PushFuture(*future); } } diff --git a/Source/FicsItNetworksLua/Private/FINLua/LuaMiscModules.cpp b/Source/FicsItNetworksLua/Private/FINLua/LuaMiscModules.cpp new file mode 100644 index 000000000..5e875df5a --- /dev/null +++ b/Source/FicsItNetworksLua/Private/FINLua/LuaMiscModules.cpp @@ -0,0 +1,115 @@ +#include "FicsItKernel.h" +#include "FicsItLogLibrary.h" +#include "FINLuaModule.h" +#include "FINLuaRuntime.h" +#include "FINLuaThreadedRuntime.h" +#include "FINNetworkUtils.h" +#include "LuaFileSystemAPI.h" +#include "LuaObject.h" +#include "LuaPersistence.h" + +namespace FINLua { + LuaModule(R"(/** + * @LuaModule ThreadedRuntimeModule + * @DisplayName Threaded Runtime Module + * + * This Module provides an interface for other Modules to interact with the Kernel. + */)", ThreadedRuntimeModule) { + LuaModuleLibrary(R"(/** + * @LuaLibrary computer + * @DisplayName Computer Library + * + * The Computer Library provides functions for interaction with the computer and especially the Lua Runtime. + */)", computer) { + LuaModuleTableFunction(R"(/** + * @LuaFunction promote() + * @DisplayName Promote + * + * This function is mainly used to allow switching to a higher tick runtime state. + * Usually you use this when you want to make your code run faster when using functions that can run in asynchronous environment. + */)", promote) { + FFINLuaThreadedRuntime& runtime = luaFIN_getThreadedRuntime(L); + runtime.SetShouldBePromoted(true); + return 0; + } + + LuaModuleTableFunction(R"(/** + * @LuaFunction demote() + * @DisplayName Demote + * + * This function is used to allow switching back to the normal tick rate. + */)", demote) { + FFINLuaThreadedRuntime& runtime = luaFIN_getThreadedRuntime(L); + runtime.SetShouldBePromoted(false); + return 0; + } + + LuaModuleTableFunction(R"(/** + * @LuaFunction bool isPromoted() + * @DisplayName Is Promoted + * + * Returns true if the Lua runtime is currently promoted/elevated. + * Which means its running in an seperate game thread allowing for fast bulk calculations. + * + * @return isPromoted bool True if the currenty runtime is running in promoted/elevated tick state. + */)", isPromoted) { + FFINLuaThreadedRuntime& runtime = luaFIN_getThreadedRuntime(L); + lua_pushboolean(L, runtime.ShouldBePromoted()); + return 1; + } + } + } + + LuaModule(R"(/** + * @LuaModule LogModule + * @DisplayName Log Module + */)", LogModule) { + int luaPrint(lua_State* L) { + const int args = lua_gettop(L); + std::string log; + for (int i = 1; i <= args; ++i) { + size_t s_len = 0; + const char* s = luaL_tolstring(L, i, &s_len); + if (!s) luaL_argerror(L, i, "is not valid type"); + log += std::string(s, s_len) + " "; + } + if (log.length() > 0) log = log.erase(log.length()-1); + + UFILogLibrary::Log(FIL_Verbosity_Info, UTF8_TO_TCHAR(log.c_str())); + + return 0; + } + LuaModuleGlobalBareValue(R"(/** + * @LuaGlobal print function(string...) + * @DisplayName Print + */)", print) { + lua_pushcfunction(L, luaPrint); + luaFIN_persistValue(L, -1, PersistName); + } + + LuaModuleLibrary(R"(/** + * @LuaLibrary computer + * @DisplayName Computer Library + * + * The Computer Library provides functions for interaction with the computer and especially the Lua Runtime. + */)", computer) { + LuaModuleTableFunction(R"(/** + * @LuaFunction log(verbosity: int, message: string) + * @DisplayName Log + * + * Allows you to print a log message to the computers log with the given log verbosity. + * + * @parameter verbosity int Verbosity The log-level/verbosity of the message you want to log. 0 = Debug, 1 = Info, 2 = Warning, 3 = Error & 4 = Fatal + * @parameter message string Message The log message you want to print + */)", log) { + FLuaSync sync(L); + + int verbosity = luaL_checknumber(L, 1); + FString text = FINLua::luaFIN_checkFString(L, 2); + verbosity = FMath::Clamp(verbosity, 0, FIL_Verbosity_Max); + UFILogLibrary::Log((EFILLogVerbosity)verbosity, text); + return 0; + } + } + } +} diff --git a/Source/FicsItNetworksLua/Private/FINLua/LuaUtil.cpp b/Source/FicsItNetworksLua/Private/FINLua/LuaUtil.cpp index eeff8d189..ae82ba634 100644 --- a/Source/FicsItNetworksLua/Private/FINLua/LuaUtil.cpp +++ b/Source/FicsItNetworksLua/Private/FINLua/LuaUtil.cpp @@ -400,6 +400,33 @@ namespace FINLua { return FString(); } + void luaFIN_setOrMergeField(lua_State* L, int targetIndex) { // ..., key, value + targetIndex = lua_absindex(L, targetIndex); + int fieldIndex = lua_absindex(L, -2); + int mergeIndex = lua_absindex(L, -1); + + int top = lua_gettop(L); + + luaL_checktype(L, targetIndex, LUA_TTABLE); + + lua_pushvalue(L, fieldIndex); + int fieldType = lua_gettable(L, targetIndex); // ..., key, value, field + if (fieldType != LUA_TTABLE) { + lua_pop(L, 1); + lua_settable(L, targetIndex); + } else { + lua_pushnil(L); + while (lua_next(L, mergeIndex) != 0) { // ..., key, value, field, key2, value2 + lua_pushvalue(L, -2); + lua_insert(L, -2); // ..., key, value, field, key2, key2, value2 + luaFIN_setOrMergeField(L, -4); // ..., key, value, field, key2 + } + lua_pop(L, 3); + } + + fgcheck(lua_gettop(L) == top-2); + } + void luaFINDebug_dumpStack(lua_State* L) { UE_LOG(LogFicsItNetworksLua, Warning, TEXT("Dumping stack of thread %p:"), L); int args = lua_gettop(L); @@ -421,12 +448,6 @@ namespace FINLua { } lua_pop(L, 1); } - - void setupUtilLib(lua_State* L) { - PersistenceNamespace("UtilLib"); - - - } } FFINLuaLogScope::FFINLuaLogScope(lua_State* L) : FFILLogScope(nullptr, FWhereFunction::CreateLambda([L]() { diff --git a/Source/FicsItNetworksLua/Private/FINLua/Reflection/LuaObject.cpp b/Source/FicsItNetworksLua/Private/FINLua/Reflection/LuaObject.cpp index 37cc4e516..4eb489e6d 100644 --- a/Source/FicsItNetworksLua/Private/FINLua/Reflection/LuaObject.cpp +++ b/Source/FicsItNetworksLua/Private/FINLua/Reflection/LuaObject.cpp @@ -4,27 +4,20 @@ #include "FicsItReflection.h" #include "FINLua/Reflection/LuaRef.h" #include "FINLuaProcessor.h" +#include "FINLuaReferenceCollector.h" #include "FINLua/FINLuaModule.h" #include "FINLua/LuaPersistence.h" #include "Logging/StructuredLog.h" #include "tracy/Tracy.hpp" +#include "FINLuaRuntime.h" namespace FINLua { - FLuaObject::FLuaObject(const FFIRTrace& Object, UFINKernelSystem* Kernel) : Object(Object), Kernel(Kernel) { + FLuaObject::FLuaObject(const FFIRTrace& Object, FFINLuaReferenceCollector* ReferenceCollector) : FFINLuaReferenceCollected(ReferenceCollector), Object(Object) { Type = FFicsItReflectionModule::Get().FindClass(Object.GetUnderlyingPtr()->GetClass()); - Kernel->AddReferencer(this, &CollectReferences); } - FLuaObject::FLuaObject(const FLuaObject& Other) : Type(Other.Type), Object(Other.Object), Kernel(Other.Kernel) { - Kernel->AddReferencer(this, &CollectReferences); - } - - FLuaObject::~FLuaObject() { - Kernel->RemoveReferencer(this); - } - - void FLuaObject::CollectReferences(void* Obj, FReferenceCollector& Collector) { - static_cast(Obj)->Object.AddStructReferencedObjects(Collector); + void FLuaObject::CollectReferences(FReferenceCollector& Collector) { + Object.AddStructReferencedObjects(Collector); } LuaModule(R"(/** @@ -47,11 +40,11 @@ namespace FINLua { FLuaObject* LuaObject2 = luaFIN_toLuaObject(L, 2, nullptr); if (!LuaObject1 || !LuaObject2) { lua_pushboolean(L, false); - return UFINLuaProcessor::luaAPIReturn(L, 1); + return 1; } lua_pushboolean(L, GetTypeHash(LuaObject1->Object) == GetTypeHash(LuaObject2->Object)); - return UFINLuaProcessor::luaAPIReturn(L, 1); + return 1; } LuaModuleTableFunction(R"(/** @@ -62,11 +55,11 @@ namespace FINLua { FLuaObject* LuaObject2 = luaFIN_toLuaObject(L, 2, nullptr); if (!LuaObject1 || !LuaObject2) { lua_pushboolean(L, false); - return UFINLuaProcessor::luaAPIReturn(L, 1); + return 1; } lua_pushboolean(L, GetTypeHash(LuaObject1->Object) < GetTypeHash(LuaObject2->Object)); - return UFINLuaProcessor::luaAPIReturn(L, 1); + return 1; } LuaModuleTableFunction(R"(/** @@ -77,11 +70,11 @@ namespace FINLua { FLuaObject* LuaObject2 = luaFIN_toLuaObject(L, 2, nullptr); if (!LuaObject1 || !LuaObject2) { lua_pushboolean(L, false); - return UFINLuaProcessor::luaAPIReturn(L, 1); + return 1; } lua_pushboolean(L, GetTypeHash(LuaObject1->Object) <= GetTypeHash(LuaObject2->Object)); - return UFINLuaProcessor::luaAPIReturn(L, 1); + return 1; } LuaModuleTableFunction(R"(/** @@ -127,8 +120,7 @@ namespace FINLua { } int luaObjectUnpersist(lua_State* L) { - UFINLuaProcessor* Processor = UFINLuaProcessor::luaGetProcessor(L); - FFINLuaProcessorStateStorage& Storage = Processor->StateStorage; + FFINLuaRuntimePersistenceState& Storage = luaFIN_getPersistence(L); FFIRTrace Object = Storage.GetTrace(luaL_checkinteger(L, lua_upvalueindex(1))); luaFIN_pushObject(L, Object); @@ -142,8 +134,7 @@ namespace FINLua { */)", __persist) { FLuaObject* LuaObject = luaFIN_checkLuaObject(L, 1, nullptr); - UFINLuaProcessor* Processor = UFINLuaProcessor::luaGetProcessor(L); - FFINLuaProcessorStateStorage& Storage = Processor->StateStorage; + FFINLuaRuntimePersistenceState& Storage = luaFIN_getPersistence(L); lua_pushinteger(L, Storage.Add(LuaObject->Object)); lua_pushcclosure(L, &luaObjectUnpersist, 1); @@ -178,7 +169,7 @@ namespace FINLua { return; } FLuaObject* LuaObject = static_cast(lua_newuserdata(L, sizeof(FLuaObject))); - new(LuaObject) FLuaObject(Object, UFINLuaProcessor::luaGetProcessor(L)->GetKernel()); + new(LuaObject) FLuaObject(Object, luaFIN_getReferenceCollector(L)); luaL_setmetatable(L, ReflectionSystemObject::Object::_Name); UE_LOGFMT(LogFicsItNetworksLuaReflection, VeryVerbose, "[{Runtime}] Pushed Object '{Object}' to Lua-Stack ({Index})", L, Object->GetFullName(), lua_gettop(L)); } diff --git a/Source/FicsItNetworksLua/Private/FINLua/Reflection/LuaRef.cpp b/Source/FicsItNetworksLua/Private/FINLua/Reflection/LuaRef.cpp index 307ebef5c..6b767ccd8 100644 --- a/Source/FicsItNetworksLua/Private/FINLua/Reflection/LuaRef.cpp +++ b/Source/FicsItNetworksLua/Private/FINLua/Reflection/LuaRef.cpp @@ -10,6 +10,15 @@ #include "tracy/Tracy.hpp" namespace FINLua { + LuaModule(R"(/** + * @LuaModule FullReflectionModule + * @DisplayName Reflection-System Base Module + * @Dependency ReflectionSystemObjectModule + * @Dependency ReflectionSystemClassModule + * @Dependency ReflectionSystemStructModule + * + * This Module is used as dependency to depend on the entire Reflection System related stuff. + */)", FullReflectionModule) {} LuaModule(R"(/** * @LuaModule ReflectionSystemBaseModule * @DisplayName Reflection-System Base Module @@ -215,7 +224,7 @@ UE_DISABLE_OPTIMIZATION_SHIP if (FuncFlags & FIR_Func_RT_Async && !bForceSync) { return luaFIN_callReflectionFunctionDirectly(L, Function, Ctx, nArgs, nResults); } else if (FuncFlags & FIR_Func_RT_Parallel && !bForceSync) { - [[maybe_unused]] FLuaSyncCall SyncCall(L); + [[maybe_unused]] FLuaSync SyncCall(L); return luaFIN_callReflectionFunctionDirectly(L, Function, Ctx, nArgs, nResults); } else { TArray Input = luaFIN_callReflectionFunctionProcessInput(L, Function, nArgs); @@ -280,7 +289,7 @@ UE_ENABLE_OPTIMIZATION_SHIP luaFIN_pushNetworkValue(L, Property->GetValue(PropertyCtx)); } else if (PropFlags & FIR_Prop_RT_Parallel) { ZoneScopedN("Lua Get Property SyncCall"); - [[maybe_unused]] FLuaSyncCall SyncCall(L); + [[maybe_unused]] FLuaSync SyncCall(L); { ZoneScopedN("Lua Get Property"); luaFIN_pushNetworkValue(L, Property->GetValue(PropertyCtx)); @@ -335,7 +344,7 @@ UE_ENABLE_OPTIMIZATION_SHIP if (PropFlags & FIR_Prop_RT_Async) { Property->SetValue(PropertyCtx, Value.GetValue()); } else if (PropFlags & FIR_Prop_RT_Parallel) { - [[maybe_unused]] FLuaSyncCall SyncCall(L); + [[maybe_unused]] FLuaSync SyncCall(L); Property->SetValue(PropertyCtx, Value.GetValue()); } else { luaFIN_pushFuture(L, FFINFutureReflection(Property, PropertyCtx, Value.GetValue())); diff --git a/Source/FicsItNetworksLua/Private/FINLua/Reflection/LuaStruct.cpp b/Source/FicsItNetworksLua/Private/FINLua/Reflection/LuaStruct.cpp index e075e36fd..ed2a0cd21 100644 --- a/Source/FicsItNetworksLua/Private/FINLua/Reflection/LuaStruct.cpp +++ b/Source/FicsItNetworksLua/Private/FINLua/Reflection/LuaStruct.cpp @@ -2,6 +2,7 @@ #include "FINLua/Reflection/LuaRef.h" #include "FINLuaProcessor.h" +#include "FINLuaReferenceCollector.h" #include "FINLua/FINLuaModule.h" #include "FINLua/LuaFuture.h" #include "FINLua/LuaPersistence.h" @@ -13,35 +14,14 @@ const int _persist_upermTableIdx namespace FINLua { - FLuaStruct::FLuaStruct(UFIRStruct* Type, const FFIRInstancedStruct& Struct, UFINKernelSystem* Kernel) : Type(Type), Struct(MakeShared(Struct)), Kernel(Kernel) { - Kernel->AddReferencer(this, &CollectReferences); - } - - FLuaStruct::FLuaStruct(const FLuaStruct& Other) : Type(Other.Type), Struct(Other.Struct), Kernel(Other.Kernel) { - Kernel->AddReferencer(this, &CollectReferences); - } - - FLuaStruct& FLuaStruct::operator=(const FLuaStruct& Other) { - if (Kernel) Kernel->RemoveReferencer(this); - Type = Other.Type; - Struct = Other.Struct; - Kernel = Other.Kernel; - if (Kernel) Kernel->AddReferencer(this, &CollectReferences); - return *this; - } - - FLuaStruct::~FLuaStruct() { - Kernel->RemoveReferencer(this); - } + FLuaStruct::FLuaStruct(UFIRStruct* Type, const FFIRInstancedStruct& Struct, FFINLuaReferenceCollector* ReferenceCollector) : FFINLuaReferenceCollected(ReferenceCollector), Type(Type), Struct(MakeShared(Struct)) {} - void FLuaStruct::CollectReferences(void* Obj, FReferenceCollector& Collector) { - FLuaStruct* Self = static_cast(Obj); - Collector.AddReferencedObject(Self->Type); - Collector.AddReferencedObject(Self->Kernel ); - Collector.AddPropertyReferencesWithStructARO(FFIRInstancedStruct::StaticStruct(), &*Self->Struct); + UE_DISABLE_OPTIMIZATION_SHIP + void FLuaStruct::CollectReferences(FReferenceCollector& Collector) { + Collector.AddReferencedObject(Type); + Collector.AddPropertyReferencesWithStructARO(FFIRInstancedStruct::StaticStruct(), &Struct.Get()); } -UE_DISABLE_OPTIMIZATION_SHIP /** * Tries to find a UFIRFunction* Operator for the given data. * If none is found returns nullptr. @@ -310,11 +290,11 @@ UE_ENABLE_OPTIMIZATION_SHIP const TSharedPtr Struct2 = luaFIN_toStruct(L, 2, nullptr, false); if (!Struct1->GetData() || !Struct2->GetData() || Struct1->GetStruct() != Struct2->GetStruct()) { lua_pushboolean(L, false); - return UFINLuaProcessor::luaAPIReturn(L, 1); + return 1; } lua_pushboolean(L, Struct1->GetStruct()->GetStructTypeHash(Struct1->GetData()) < Struct2->GetStruct()->GetStructTypeHash(Struct2->GetData())); - return UFINLuaProcessor::luaAPIReturn(L, 1); + return 1; } LuaModuleTableFunction(R"(/** @@ -328,11 +308,11 @@ UE_ENABLE_OPTIMIZATION_SHIP const TSharedPtr Struct2 = luaFIN_toStruct(L, 2, nullptr, false); if (!Struct1->GetData() || !Struct2->GetData() || Struct1->GetStruct() != Struct2->GetStruct()) { lua_pushboolean(L, false); - return UFINLuaProcessor::luaAPIReturn(L, 1); + return 1; } lua_pushboolean(L, Struct1->GetStruct()->GetStructTypeHash(Struct1->GetData()) <= Struct2->GetStruct()->GetStructTypeHash(Struct2->GetData())); - return UFINLuaProcessor::luaAPIReturn(L, 1); + return 1; } int luaStructIndexOp(lua_State* L) { @@ -408,8 +388,7 @@ UE_ENABLE_OPTIMIZATION_SHIP } int luaStructUnpersist(lua_State* L) { - UFINLuaProcessor* Processor = UFINLuaProcessor::luaGetProcessor(L); - FFINLuaProcessorStateStorage& Storage = Processor->StateStorage; + FFINLuaRuntimePersistenceState& Storage = luaFIN_getPersistence(L); const FFIRInstancedStruct& Struct = *Storage.GetStruct(luaL_checkinteger(L, lua_upvalueindex(1))); @@ -431,8 +410,7 @@ UE_ENABLE_OPTIMIZATION_SHIP */)", __persist) { TSharedPtr Struct = luaFIN_checkStruct(L, 1, nullptr, false); - UFINLuaProcessor* Processor = UFINLuaProcessor::luaGetProcessor(L); - FFINLuaProcessorStateStorage& Storage = Processor->StateStorage; + FFINLuaRuntimePersistenceState& Storage = luaFIN_getPersistence(L); lua_pushinteger(L, Storage.Add(Struct)); int i = 0; while (true) { @@ -449,7 +427,7 @@ UE_ENABLE_OPTIMIZATION_SHIP return 1; } - +UE_DISABLE_OPTIMIZATION_SHIP LuaModuleTableFunction(R"(/** * @LuaFunction __gc * @DisplayName Garbage Collect @@ -458,6 +436,7 @@ UE_ENABLE_OPTIMIZATION_SHIP Struct->~FLuaStruct(); return 0; } +UE_ENABLE_OPTIMIZATION_SHIP } LuaModuleMetatable(R"(/** @@ -572,7 +551,8 @@ UE_ENABLE_OPTIMIZATION_SHIP UFIRStruct* Type = FFicsItReflectionModule::Get().FindStruct(Struct.GetStruct()); FLuaStruct* LuaStruct = static_cast(lua_newuserdatauv(L, sizeof(FLuaStruct), numUserValues)); - new (LuaStruct) FLuaStruct(Type, Struct, UFINLuaProcessor::luaGetProcessor(L)->GetKernel()); + + new (LuaStruct) FLuaStruct(Type, Struct, luaFIN_getReferenceCollector(L)); luaL_setmetatable(L, ReflectionSystemStruct::Struct::_Name); return true; diff --git a/Source/FicsItNetworksLua/Private/FINLuaProcessor.cpp b/Source/FicsItNetworksLua/Private/FINLuaProcessor.cpp index e54571b58..a081de3ce 100644 --- a/Source/FicsItNetworksLua/Private/FINLuaProcessor.cpp +++ b/Source/FicsItNetworksLua/Private/FINLuaProcessor.cpp @@ -3,437 +3,104 @@ #include "AsyncWork.h" #include "Base64.h" #include "FGInventoryComponent.h" -#include "FicsItNetworksComputer.h" +#include "FicsItLogLibrary.h" #include "FicsItNetworksLuaModule.h" #include "FILLogContainer.h" #include "FINComputerEEPROMDesc.h" -#include "FINNetworkUtils.h" #include "FINItemStateEEPROMText.h" #include "FINMediaSubsystem.h" -#include "FINLua/LuaExtraSpace.h" -#include "FINLua/LuaGlobalLib.h" -#include "FINLua/Reflection/LuaObject.h" -#include "FIRTrace.h" +#include "FINSignalSubsystem.h" #include "LuaEventAPI.h" +#include "LuaKernelAPI.h" +#include "LuaWorldAPI.h" #include "Engine/Engine.h" #include "FicsItKernel/Network/NetworkController.h" #include "FINLua/LuaUtil.h" #include "Signals/FINSignalData.h" -#include "tracy/Tracy.hpp" void LuaFileSystemListener::onUnmounted(CodersFileSystem::Path path, TSharedRef device) { - for (FINLua::LuaFile file : Parent->GetFileStreams()) { + /*for (FINLua::LuaFile file : Parent->GetFileStreams()) { if (!Parent->GetKernel()->GetFileSystem()) { file->file->close(); } - } + }*/ } void LuaFileSystemListener::onNodeRemoved(CodersFileSystem::Path path, CodersFileSystem::NodeType type) { - for (FINLua::LuaFile file : Parent->GetFileStreams()) { + /*for (FINLua::LuaFile file : Parent->GetFileStreams()) { if (file->path.length() > 0 && (!Parent->GetKernel()->GetFileSystem())) { file->file->close(); } - } -} - -// ReSharper disable once CppMemberFunctionMayBeConst -void FLuaTickRunnable::DoWork() { - while (true) { - if (!Tick->asyncTick()) { - break; - } - } -} - -FFINLuaProcessorTick::FFINLuaProcessorTick() : Runnable(this) {} - -FFINLuaProcessorTick::FFINLuaProcessorTick(UFINLuaProcessor* Processor): Processor(Processor), Runnable(this) { - reset(); -} - -FFINLuaProcessorTick::~FFINLuaProcessorTick() { - stop(); - if (asyncTask) asyncTask->EnsureCompletion(); -} - -void FFINLuaProcessorTick::reset() { - stop(); - - AsyncSync = TPromise(); - SyncAsync = TPromise(); - AsyncSync.EmplaceValue(); - SyncAsync.EmplaceValue(); - bShouldPromote = false; - bShouldDemote = false; - bShouldStop = false; - bShouldReset = false; - bShouldCrash = false; - bDoSync = false; - State = LUA_SYNC; -} - -void FFINLuaProcessorTick::stop() { - if (!(State & LUA_ASYNC)) return; - demote(); - - if (asyncTask.IsValid() && !asyncTask->IsIdle()) { - asyncTask->EnsureCompletion(); - asyncTask->Cancel(); - asyncTask.Reset(); - } -} - -void FFINLuaProcessorTick::promote() { - if (State & LUA_ASYNC) return; - if (bShouldStop || bShouldCrash || bShouldReset) return; - if (asyncTask.IsValid()) { - if (!asyncTask->IsDone()) asyncTask->EnsureCompletion(); - asyncTask->Cancel(); - asyncTask = nullptr; - } - asyncTask = MakeShared>(this); - TickMutex.Lock(); - asyncTask->StartBackgroundTask(); - State = LUA_ASYNC; - TickMutex.Unlock(); -} - -void FFINLuaProcessorTick::demote() { - TickMutex.Lock(); - if (State & LUA_SYNC) { - TickMutex.Unlock(); - return; - } - State = LUA_SYNC; - TickMutex.Unlock(); - if (bDoSync) { - SyncAsync = TPromise(); - AsyncSync.EmplaceValue(); - } - asyncTask->EnsureCompletion(); - asyncTask->Cancel(); - TickMutex.Unlock(); -} - -void FFINLuaProcessorTick::demoteInAsync() { - if (State & LUA_SYNC) return; - AsyncSyncMutex.Lock(); - AsyncSync = TPromise(); - SyncAsync = TPromise(); - const TFuture Future = AsyncSync.GetFuture(); - bDoSync = true; - AsyncSyncMutex.Unlock(); - TickMutex.Unlock(); - Future.Wait(); // wait for sync to continue this async - TickMutex.Lock(); -} - -void FFINLuaProcessorTick::shouldStop() { - bShouldStop = true; -} - -void FFINLuaProcessorTick::shouldReset() { - bShouldReset = true; -} - -void FFINLuaProcessorTick::shouldPromote() { - if (bShouldStop || bShouldCrash || bShouldReset) return; - bShouldPromote = true; -} - -void FFINLuaProcessorTick::shouldDemote() { - bShouldDemote = true; -} - -void FFINLuaProcessorTick::shouldWaitForSignal() { - if (State & LUA_ASYNC) { - bWaitForSignal = true; - } -} - -void FFINLuaProcessorTick::signalFound() { - bWaitForSignal = false; -} - -void FFINLuaProcessorTick::shouldCrash(const TSharedRef& Crash) { - bShouldCrash = true; - ToCrash = Crash; -} - -void FFINLuaProcessorTick::syncTick() { - if (postTick()) return; - if (State & LUA_SYNC) { - if (asyncTask.IsValid() && !asyncTask->IsIdle()) { - asyncTask->EnsureCompletion(); - asyncTask->Cancel(); - asyncTask.Reset(); - } - TickMutex.Lock(); - { - ZoneScoped; - Processor->LuaTick(); - } - TickMutex.Unlock(); - if (bShouldPromote) { - promote(); - } - } else if (State & LUA_ASYNC) { - AsyncSyncMutex.Lock(); - const bool DoSync = bDoSync; - const bool WaitForSignal = bWaitForSignal; - AsyncSyncMutex.Unlock(); - if (DoSync) { - // async tick is waiting for sync - AsyncSyncMutex.Lock(); - SyncAsync = TPromise(); - const TFuture Future = SyncAsync.GetFuture(); - shouldDemote(); - State = LUA_SYNC; - AsyncSync.EmplaceValue(); // continue async tick in sync with factory tick - AsyncSyncMutex.Unlock(); - Future.Wait(); // wait for async tick to finish - AsyncSyncMutex.Lock(); - bDoSync = false; - AsyncSyncMutex.Unlock(); - } else { - if (asyncTask->IsDone() && (!WaitForSignal || Processor->GetKernel()->GetNetwork()->GetSignalCount() > 0 || Processor->PullTimeoutReached())) { - AsyncSyncMutex.Lock(); - bWaitForSignal = false; - AsyncSyncMutex.Unlock(); - asyncTask->StartBackgroundTask(); - } - } - } - if (postTick()) return; -} - -bool FFINLuaProcessorTick::asyncTick() { - if (State & LUA_ASYNC) { - TickMutex.Lock(); - { - ZoneScoped; - Processor->LuaTick(); - } - TickMutex.Unlock(); - AsyncSyncMutex.Lock(); - if (bDoSync) { - SyncAsync.EmplaceValue(); - bDoSync = false; - } - AsyncSyncMutex.Unlock(); - if (bShouldDemote) { - TickMutex.Lock(); - State = LUA_SYNC; - bShouldDemote = false; - TickMutex.Unlock(); - return false; - } - if (bShouldCrash || bShouldStop || bShouldReset) { - TickMutex.Lock(); - State = LUA_SYNC; - TickMutex.Unlock(); - return false; - } - return !bWaitForSignal; - } - return false; -} - -// ReSharper disable once CppMemberFunctionMayBeConst -bool FFINLuaProcessorTick::postTick() { - if (bShouldCrash) { - Processor->GetKernel()->Crash(ToCrash.ToSharedRef()); - return true; - } - if (bShouldStop) { - Processor->GetKernel()->Stop(); - return true; - } - if (bShouldReset) { - Processor->GetKernel()->Reset(); - return true; - } - return false; + }*/ } -void FFINLuaProcessorTick::tickHook(lua_State* L) { - switch (State) { - case LUA_SYNC: - case LUA_ASYNC: - State |= LUA_ERROR; - lua_sethook(Processor->luaThread, UFINLuaProcessor::luaHook, LUA_MASKCOUNT, steps()); - break; - case LUA_SYNC_ERROR: - case LUA_ASYNC_ERROR: - State |= LUA_END; - lua_sethook(Processor->luaThread, UFINLuaProcessor::luaHook, LUA_MASKCOUNT, steps()); - luaL_error(L, "out of time"); - break; - case LUA_SYNC_END: - case LUA_ASYNC_END: - throw FFINKernelCrash("out of time"); - default: ; - } -} - -int luaAPIReturn_Resume(lua_State* L, int status, lua_KContext ctx) { - return static_cast(ctx); -} - -int FFINLuaProcessorTick::apiReturn(lua_State* L, int args) { - if (State != LUA_SYNC && State != LUA_ASYNC) { // tick state in error or crash - if (State & LUA_SYNC) State = LUA_SYNC; - else if (State & LUA_ASYNC) State = LUA_ASYNC; - return lua_yieldk(L, 0, args, &luaAPIReturn_Resume); - } - return args; -} - -int FFINLuaProcessorTick::steps() const { - switch (State) { - case LUA_SYNC: - return SyncLen; - case LUA_SYNC_ERROR: - return SyncErrorLen; - case LUA_SYNC_END: - return SyncEndLen; - case LUA_ASYNC_BEGIN: - return AsyncLen; - case LUA_ASYNC: - return AsyncLen; - case LUA_ASYNC_ERROR: - return AsyncErrorLen; - case LUA_ASYNC_END: - return AsyncEndLen; - default: - return LUA_SYNC; - } -} - -UFINLuaProcessor* UFINLuaProcessor::luaGetProcessor(lua_State* L) { - return FINLua::luaFIN_getExtraSpace(L).Processor; -} - -void UFINLuaProcessor::OnPreGarbageCollection() { - bWasPriorToGCPromoted = (bool)(tickHelper.getState() & LUA_ASYNC); - if (bWasPriorToGCPromoted) { - tickHelper.demote(); - } -} - -void UFINLuaProcessor::OnPostGarbageCollection() { - if (bWasPriorToGCPromoted) { - tickHelper.promote(); - } -} - - -UFINLuaProcessor::UFINLuaProcessor() : tickHelper(this), FileSystemListener(new LuaFileSystemListener(this)) { - OnPreGarbageCollectionHandle = FCoreUObjectDelegates::GetPreGarbageCollectDelegate().AddUObject(this, &UFINLuaProcessor::OnPreGarbageCollection); - OnPostGarbageCollectionHandle = FCoreUObjectDelegates::GetPostGarbageCollect().AddUObject(this, &UFINLuaProcessor::OnPostGarbageCollection); -} - -UFINLuaProcessor::~UFINLuaProcessor() { - tickHelper.demote(); - FCoreUObjectDelegates::GetPreGarbageCollectDelegate().Remove(OnPreGarbageCollectionHandle); - FCoreUObjectDelegates::GetPostGarbageCollect().Remove(OnPostGarbageCollectionHandle); -} - -int luaPersist(lua_State* L) { - UFINLuaProcessor* p = UFINLuaProcessor::luaGetProcessor(L); - UE_LOG(LogFicsItNetworksLua, Display, TEXT("%s: Lua Processor Persist"), *p->DebugInfo); - - // perm, data - - // persist data table - eris_persist(L, 1, 2); // perm, data, data-str - - return 1; -} - -void UFINLuaProcessor::PreSaveGame_Implementation(int32 saveVersion, int32 gameVersion) { - UE_LOG(LogFicsItNetworksLua, Display, TEXT("%s: Lua Processor %s"), *DebugInfo, TEXT("PreSerialize")); - if (!Kernel || Kernel->GetState() != FIN_KERNEL_RUNNING) return; - - tickHelper.stop(); - StateStorage.Clear(); - - for (FINLua::LuaFile file : FileStreams) { - if (file->file) { - file->transfer = MakeShared(); - file->transfer->open = file->file->isOpen(); - if (file->transfer->open) { - file->transfer->mode = file->file->getMode(); - file->transfer->pos = file->file->seek("cur", 0); - } - // TODO: Check if combination of APP & TRUNC need special data transfer & - // TODO: like reading the file store it and then rewrite it to the file when unpersisting. - file->file->close(); - } else file->transfer = nullptr; - } - - UE_LOG(LogFicsItNetworksLua, Display, TEXT("%s: Lua Processor %s"), *DebugInfo, TEXT("'Serialized'")); - - // check state & thread - if (luaState && luaThread && lua_status(luaThread) == LUA_YIELD) { - // prepare state data - lua_getfield(luaState, LUA_REGISTRYINDEX, "PersistPerm"); // ..., perm - lua_geti(luaState, LUA_REGISTRYINDEX, LUA_RIDX_GLOBALS); // ..., perm, globals - lua_pushvalue(luaState, -1); // ..., perm, globals, globals - lua_pushnil(luaState); // ..., perm, globals, globals, nil - lua_settable(luaState, -4); // ..., perm, globals - lua_pushvalue(luaState, -2); // ..., perm, globals, perm - lua_newtable(luaState); // ..., perm, globals, perm, data - lua_pushvalue(luaState, -3); // ..., perm, globals, perm, data, globals - lua_setfield(luaState, -2, "globals"); // ..., perm, globals, perm, data - lua_pushvalue(luaState, luaThreadIndex); // ..., perm, globals, perm, data, thread - lua_setfield(luaState, -2, "thread"); // ..., perm, globals, perm, data - lua_getfield(luaState, LUA_REGISTRYINDEX, "hidden-globals"); // ..., perm, globals, perm, data1, hidden-globals - lua_setfield(luaState, -2, "hidden-globals"); // ..., perm, globals, perm, data - - lua_pushcfunction(luaState, luaPersist); // ..., perm, globals, perm, data, persist-func - lua_insert(luaState, -3); // ..., perm, globals, persist-func, perm, data - const int status = lua_pcall(luaState, 2, 1, 0); // ..., perm, globals, data-str +UFINLuaProcessor::UFINLuaProcessor() { + Runtime.Runtime.Modules.Add("DebugModule"); + Runtime.Runtime.Modules.Add("LogModule"); + Runtime.Runtime.Modules.Add("KernelModule"); + Runtime.Runtime.Modules.Add("ComputerModule"); + Runtime.Runtime.Modules.Add("ComponentModule"); + Runtime.Runtime.Modules.Add("WorldModule"); + Runtime.Runtime.Modules.Add("EventModule"); + Runtime.Runtime.Modules.Add("FutureModule"); + Runtime.Runtime.OnPreLuaTick.AddWeakLambda(this, [this](TArray>& TickStack) { + TickStack.Add(MakeShared(GetKernel()->GetLog())); + }); + Runtime.Runtime.OnPreModules.AddWeakLambda(this, [this]() { + FINLua::luaFIN_setReferenceCollector(Runtime.Runtime.GetLuaState(), ReferenceCollector); + FINLua::luaFIN_setWorld(Runtime.Runtime.GetLuaState(), GetWorld()); + FINLua::luaFIN_setComponentNetwork(Runtime.Runtime.GetLuaState(), &ComponentNetwork); + FINLua::luaFIN_setKernel(Runtime.Runtime.GetLuaState(), GetKernel()); + FINLua::luaFIN_setFileSystem(Runtime.Runtime.GetLuaState(), GetKernel()->GetFileSystem()); + FINLua::luaFIN_setEventSystem(Runtime.Runtime.GetLuaState(), EventSystem); + }); - // check unpersist - if (status == LUA_OK) { - // encode persisted data - size_t data_l = 0; - const char* data_r = lua_tolstring(luaState, -1, &data_l); - TArray data((uint8*)data_r, data_l); - StateStorage.LuaData = FBase64::Encode(data); - - lua_pop(luaState, 1); // ..., perm, globals - } else { - // print error - if (lua_isstring(luaState, -1)) { - FString error = FINLua::luaFIN_toFString(luaState, -1); - FString message = FString::Printf(TEXT("%s: Unable to save computer state into a save-file (computer will restart when loading the save-file): %s"), *DebugInfo, *error); - UE_LOG(LogFicsItNetworksLua, Display, TEXT("%s"), *message); - GetKernel()->GetLog()->PushLogEntry(FIL_Verbosity_Warning, message); - } + ComponentNetwork.OnGetComponentByID.BindWeakLambda(this, [this](const FGuid& ID) { + return GetKernel()->GetNetwork()->GetComponentByID(ID); + }); + ComponentNetwork.OnGetComponentByNick.BindWeakLambda(this, [this](const FString& Nick) { + return GetKernel()->GetNetwork()->GetComponentByNick(Nick); + }); + ComponentNetwork.OnGetComponentByClass.BindWeakLambda(this, [this](UClass* Class, bool bInRedirect) { + return GetKernel()->GetNetwork()->GetComponentByClass(Class, bInRedirect); + }); - lua_pop(luaState, 1); // ..., perm, globals + EventSystem.OnTimeSinceStart.BindWeakLambda(this, [this]() { + return GetKernel()->GetTimeSinceStart(); + }); + EventSystem.OnListen.BindWeakLambda(this, [this](FFIRTrace Object) { + UFINKernelSystem* kernel = GetKernel(); + UFINKernelNetworkController* network = kernel->GetNetwork(); + AFINSignalSubsystem::GetSignalSubsystem(GetKernel())->Listen(Object.GetUnderlyingPtr(), Object.Reverse() / network->GetComponent().GetObject()); + }); + EventSystem.OnListening.BindWeakLambda(this, [this]() { + UObject* comp = GetKernel()->GetNetwork()->GetComponent().GetObject(); + return AFINSignalSubsystem::GetSignalSubsystem(comp)->GetListening(comp); + }); + EventSystem.OnIgnoreAll.BindWeakLambda(this, [this]() { + UObject* comp = GetKernel()->GetNetwork()->GetComponent().GetObject(); + AFINSignalSubsystem::GetSignalSubsystem(comp)->IgnoreAll(comp); + }); + EventSystem.OnClear.BindWeakLambda(this, [this]() { + GetKernel()->GetNetwork()->ClearSignals(); + }); + EventSystem.OnIgnore.BindWeakLambda(this, [this](UObject* Object) { + UObject* comp = GetKernel()->GetNetwork()->GetComponent().GetObject(); + AFINSignalSubsystem::GetSignalSubsystem(comp)->Ignore(comp, Object); + }); + EventSystem.OnPullSignal.BindWeakLambda(this, [this]() -> TOptional> { + if (GetKernel()->GetNetwork()->GetSignalCount() < 1) { + return {}; } - - // cleanup - lua_pushnil(luaState); // ..., perm, globals, nil - lua_settable(luaState, -3); // ..., perm - lua_pop(luaState, 1); // ... - lua_pushnil(luaState); // ..., nil - lua_setfield(luaState, LUA_REGISTRYINDEX, "PersistTraces"); // ... - } -} - -void UFINLuaProcessor::Serialize(FArchive& Ar) { - Super::Serialize(Ar); + FFIRTrace sender; + FFINSignalData data = GetKernel()->GetNetwork()->PopSignal(sender); + return {{sender, data}}; + }); } void UFINLuaProcessor::BeginDestroy() { Super::BeginDestroy(); - tickHelper.stop(); - GEngine->ForceGarbageCollection(true); + Runtime.Runtime.Destroy(); } void UFINLuaProcessor::GatherDependencies_Implementation(TArray& out_dependentObjects) { @@ -441,282 +108,70 @@ void UFINLuaProcessor::GatherDependencies_Implementation(TArray& out_d out_dependentObjects.Add(AFINMediaSubsystem::GetMediaSubsystem(this)); } +void UFINLuaProcessor::PreSaveGame_Implementation(int32 saveVersion, int32 gameVersion) { + Runtime.PauseAndWait(); + RuntimeState.Clear(); + if (GetKernel()->GetState() != FIN_KERNEL_RUNNING) return; + TUnion state = Runtime.Runtime.SaveState(); + if (state.HasSubtype()) { + RuntimeState = state.GetSubtype(); + } else if (state.HasSubtype()) { + FString message = FString::Printf(TEXT("%s: Unable to save computer state into a save-file (computer will restart when loading the save-file): %s"), *DebugInfo, *state.GetSubtype()); + UE_LOG(LogFicsItNetworksLua, Display, TEXT("%s"), *message); + GetKernel()->GetLog()->PushLogEntry(FIL_Verbosity_Warning, message); + } +} + void UFINLuaProcessor::PostSaveGame_Implementation(int32 saveVersion, int32 gameVersion) {} void UFINLuaProcessor::PreLoadGame_Implementation(int32 saveVersion, int32 gameVersion) {} -int luaUnpersist(lua_State* L) { - UFINLuaProcessor* p = UFINLuaProcessor::luaGetProcessor(L); - UE_LOG(LogFicsItNetworksLua, Display, TEXT("%s: Lua Processor Unpersist"), *p->DebugInfo); - - // data-str, uperm - - // unpersist data - eris_unpersist(L, 2, 1); // data-str, uperm, data - - return 1; -} - void UFINLuaProcessor::PostLoadGame_Implementation(int32 saveVersion, int32 gameVersion) { - UE_LOG(LogFicsItNetworksLua, Display, TEXT("%s: Lua Processor %s"), *DebugInfo, TEXT("PostDeserialize")); - if (!Kernel || Kernel->GetState() != FIN_KERNEL_RUNNING) return; - - Reset(); - - // decode & check data from json - TArray data; - FBase64::Decode(StateStorage.LuaData, data); - if (data.Num() <= 1) return; - - // get uperm table - lua_getfield(luaState, LUA_REGISTRYINDEX, "PersistUperm"); // ..., uperm - - // prepare protected unpersist - lua_pushcfunction(luaState, luaUnpersist); // ..., uperm, unpersist-func - - // push data for protected unpersist - lua_pushlstring(luaState, (char*)data.GetData(), data.Num()); // ..., uperm, unpersist-func, data-str - lua_pushvalue(luaState, -3); // ..., uperm, unpersist-func, data-str, uperm - - // do unpersist - const int ok = lua_pcall(luaState, 2, 1, 0); // ..., uperm, data - - // check unpersist - if (ok != LUA_OK) { - // print error - if (lua_isstring(luaState, -1)) { - FString message = FINLua::luaFIN_toFString(luaState, -1); - FString formatted = FString::Printf(TEXT("%s: Unable to unpersist: %s"), *DebugInfo, *message); - UE_LOG(LogFicsItNetworksLua, Display, TEXT("%s"), *formatted); - GetKernel()->GetLog()->PushLogEntry(FIL_Verbosity_Warning, formatted); - } - - // cleanup - lua_pushnil(luaState); // ..., uperm, err, nil - lua_setfield(luaState, -3, "Globals"); // ..., uperm, err - lua_pop(luaState, 1); // ... - lua_pushnil(luaState); // ..., nil - lua_setfield(luaState, LUA_REGISTRYINDEX, "PersistTraces"); // ... - - //throw std::exception("Unable to unpersist"); - } else { - // cleanup - lua_pushnil(luaState); // ..., uperm, data, nil - lua_setfield(luaState, LUA_REGISTRYINDEX, "PersistTraces"); // ..., uperm, data - - // place persisted data - lua_getfield(luaState, -1, "thread"); - lua_replace(luaState, luaThreadIndex); // ..., uperm, data - lua_getfield(luaState, -1, "globals"); - lua_seti(luaState, LUA_REGISTRYINDEX, LUA_RIDX_GLOBALS); // ..., uperm, data - lua_getfield(luaState, -1, "hidden-globals"); - lua_setfield(luaState, LUA_REGISTRYINDEX, "hidden-globals"); - - luaThread = lua_tothread(luaState, luaThreadIndex); - lua_pop(luaState, 2); // ... + Runtime.Runtime.Reset(); + TOptional error = Runtime.Runtime.LoadState(RuntimeState); + if (error) { + GetKernel()->Reset(); + FString message = FString::Printf(TEXT("%s: Unable to load computer state from save-file (computer will restart): %s"), *DebugInfo, **error); + UE_LOG(LogFicsItNetworksLua, Display, TEXT("%s"), *message); + GetKernel()->GetLog()->PushLogEntry(FIL_Verbosity_Warning, message); } } void UFINLuaProcessor::SetKernel(UFINKernelSystem* InKernel) { - if (GetKernel() && GetKernel()->GetFileSystem()) GetKernel()->GetFileSystem()->removeListener(FileSystemListener); + //if (GetKernel() && GetKernel()->GetFileSystem()) GetKernel()->GetFileSystem()->removeListener(FileSystemListener); Kernel = InKernel; } - -//#include "FGPlayerController.h" -//#include "UI/FGGameUI.h" -//#include "UI/FINNotificationMessage.h" void UFINLuaProcessor::Tick(float InDelta) { - if (!luaState || !luaThread) return; - - tickHelper.syncTick(); + Runtime.Run(); - //AFGPlayerController* PlayerController = GetWorld()->GetFirstPlayerController(); - //UE_LOG(LogFicsItNetworksLua, Warning, TEXT("Pending Messages? %i"), PlayerController->GetGameUI()->CanReceiveMessageQueue()); - //UE_LOG(LogFicsItNetworksLua, Warning, TEXT("Pending Message? %i"), PlayerController->GetGameUI()->CanReceiveMessage(UFINNotificationMessage::StaticClass())); + switch (Runtime.GetStatus()) { + case FFINLuaRuntime::Finished: + GetKernel()->Stop(); + break; + case FFINLuaRuntime::Crashed: + GetKernel()->Crash(MakeShared(*Runtime.Runtime.GetError())); + break; + default: break; + } } void UFINLuaProcessor::Stop(bool bIsCrash) { UE_LOG(LogFicsItNetworksLua, Display, TEXT("%s: Lua Processor stop %s"), *DebugInfo, bIsCrash ? TEXT("due to crash") : TEXT("")); - tickHelper.stop(); -} - -void UFINLuaProcessor::LuaTick() { - ZoneScoped; - FFILLogScope LogScope(GetKernel()->GetLog()); - try { - // reset out of time - lua_sethook(luaThread, UFINLuaProcessor::luaHook, LUA_MASKCOUNT, tickHelper.steps()); - - int nres = -1; - int Status; - if (PullState != 0) { - // Runtime is pulling a signal - if (GetKernel() && GetKernel()->GetNetwork() && GetKernel()->GetNetwork()->GetSignalCount() > 0) { - // Signal available -> reset timeout and pull signal from network - PullState = 0; - GetTickHelper().signalFound(); - const int SigArgCount = DoSignal(luaThread); - if (SigArgCount < 1) { - // no signals popped -> crash system - Status = LUA_ERRRUN; - } else { - // signal popped -> resume yield with signal as parameters (passing signals parameters back to pull yield) - Status = lua_resume(luaThread, luaState, SigArgCount, &nres); - } - } else if (PullState == 2 || !PullTimeoutReached()) { - // no signal available & not timeout reached -> skip tick - return; - } else { - // no signal available & timeout reached -> resume yield with no parameters - PullState = 0; - GetTickHelper().signalFound(); - Status = lua_resume(luaThread, luaState, 0, &nres); - } - } else { - // resume runtime normally - Status = lua_resume(luaThread, luaState, 0, &nres); - } - if (Status == LUA_YIELD) { - // system yielded and waits for next tick - lua_gc(luaState, LUA_GCCOLLECT, 0); - if (GetKernel()) { - TSharedPtr Crash = GetKernel()->RecalculateResources(UFINKernelSystem::PROCESSOR); - if (Crash) { - tickHelper.shouldCrash(Crash.ToSharedRef()); - } - } - } else if (Status == LUA_OK) { - // runtime finished execution -> stop system normally - tickHelper.shouldStop(); - } else { - // runtime crashed -> crash system with runtime error message - const char* message = lua_tostring(luaThread, -1); - try { - luaL_traceback(luaThread, luaThread, message, 0); - tickHelper.shouldCrash(MakeShared(FINLua::luaFIN_toFString(luaThread, -1))); - } catch (FString error) { - tickHelper.shouldCrash(MakeShared(UTF8_TO_TCHAR(message))); - } - } - if (nres > -1) { - lua_pop(luaThread, nres); - } - } catch (...) { - // fatal end of time reached - tickHelper.shouldCrash(MakeShared("out of time")); - } - - // clear some data - ClearFileStreams(); -} - -size_t luaLen(lua_State* L, int idx) { - size_t len = 0; - idx = lua_absindex(L, idx); - lua_pushnil(L); - while (lua_next(L, idx) != 0) { - len++; - lua_pop(L, 1); - } - return len; -} - -void UFINLuaProcessor::ClearFileStreams() { - TArray> ToRemove; - for (const TSharedRef& fs : FileStreams) { - ToRemove.Add(fs); - } - for (const TSharedRef& fs : ToRemove) { - FileStreams.Remove(fs); - } -} - -TArray UFINLuaProcessor::GetFileStreams() const { - return FileStreams; -} - -void luaWarnF(void* ud, const char* msg, int tocont) { - UFINLuaProcessor* Processor = static_cast(ud); - - Processor->GetKernel()->GetLog()->PushLogEntry(FIL_Verbosity_Warning, UTF8_TO_TCHAR(msg)); -} - -int luaPanicF(lua_State* L) { - FString message = FINLua::luaFIN_toFString(L, 1); - UE_LOG(LogFicsItNetworksLua, Warning, TEXT("A Lua Runtime caused Panic with message: %s"), *message); - throw message; + Runtime.Runtime.Destroy(); } void UFINLuaProcessor::Reset() { - UE_LOG(LogFicsItNetworksLua, Display, TEXT("%s: Lua Processor Reset"), *DebugInfo); - tickHelper.stop(); - - // can't reset running system state - if (GetKernel()->GetState() != FIN_KERNEL_RUNNING) return; - - // reset temp-data - Timeout = -1; - PullState = 0; - GetKernel()->GetFileSystem()->addListener(FileSystemListener); - - // clear existing lua state - if (luaState) { - FINLua::luaFIN_destroyExtraSpace(luaState); - - lua_close(luaState); - } - - // create new lua state - luaState = luaL_newstate(); - - FINLua::luaFIN_createExtraSpace(luaState, { - .Processor = this, - .FileStreams = FileStreams, - }); - - // setup error/warning function - lua_setwarnf(luaState, luaWarnF, this); - lua_atpanic(luaState, luaPanicF); - - // setup tables for persistence - lua_newtable(luaState); // perm - lua_newtable(luaState); // perm, uperm - lua_setfield(luaState, LUA_REGISTRYINDEX, "PersistUperm"); // perm - lua_setfield(luaState, LUA_REGISTRYINDEX, "PersistPerm"); // - - lua_newtable(luaState); - lua_setfield(luaState, LUA_REGISTRYINDEX, "hidden-globals"); - - FINLua::setupGlobals(luaState); - - // create new thread for user code chunk - luaThread = lua_newthread(luaState); - luaThreadIndex = lua_gettop(luaState); - - // setup thread with code - TOptional eepromCode = GetEEPROM(); - if (eepromCode.IsSet() == false) { - Kernel->Crash(MakeShared("No Valid EEPROM set")); - return; - } - const FTCHARToUTF8 CodeConv(**eepromCode, eepromCode->Len()); - const std::string code = std::string(CodeConv.Get(), CodeConv.Length()); - luaL_loadbuffer(luaThread, code.c_str(), code.size(), "=EEPROM"); - if (lua_isstring(luaThread, -1)) { - // Syntax error - Kernel->Crash(MakeShared(lua_tostring(luaThread, -1))); - return; + Runtime.Runtime.Hook_Tick = {2500}; + Runtime.Runtime.Reset(); + TOptional Code = GetEEPROM(); + if (Code) { + TOptional error = Runtime.Runtime.LoadCode(*Code); + if (error) { + Kernel->Crash(MakeShared(*error)); + } + } else { + Kernel->Crash(MakeShared(TEXT("Invalid EEPROM!"))); } - - // reset tick state - tickHelper.reset(); - - // lua_gc(luaState, LUA_GCSETPAUSE, 100); - // TODO: Check if we actually want to use this or the manual gc call -} - -int64 UFINLuaProcessor::GetMemoryUsage(bool bInRecalc) { - return lua_gc(luaState, LUA_GCCOUNT, 0) * 100; } TOptional UFINLuaProcessor::GetEEPROM() const { @@ -739,44 +194,3 @@ bool UFINLuaProcessor::SetEEPROM(const FString& Code) { return false; } - -FFINLuaProcessorTick& UFINLuaProcessor::GetTickHelper() { - return tickHelper; -} - -bool UFINLuaProcessor::PullTimeoutReached() { - return Timeout <= (static_cast((FDateTime::Now() - FFicsItNetworksComputerModule::GameStart).GetTotalMilliseconds() - PullStart) / 1000.0); -} - -int UFINLuaProcessor::DoSignal(lua_State* L) { - UFINKernelNetworkController* net = GetKernel()->GetNetwork(); - - if (!net || net->GetSignalCount() < 1) return 0; - - FFIRTrace sender; - FFINSignalData signal = net->PopSignal(sender); - - FINLua::luaFIN_handleEvent(L, sender, signal); - - return FINLua::luaFIN_pushEventData(L, sender, signal); -} - -void UFINLuaProcessor::luaHook(lua_State* L, lua_Debug* ar) { - //UFINLuaProcessor* p = UFINLuaProcessor::luaGetProcessor(L); - //p->tickHelper.tickHook(L); - lua_yield(L, 0); -} - -int UFINLuaProcessor::luaAPIReturn(lua_State* L, int args) { - //UFINLuaProcessor* p = UFINLuaProcessor::luaGetProcessor(L); - //return p->tickHelper.apiReturn(L, args); - return args; -} - -lua_State* UFINLuaProcessor::GetLuaState() const { - return luaState; -} - -lua_State* UFINLuaProcessor::GetLuaThread() const { - return luaThread; -} diff --git a/Source/FicsItNetworksLua/Private/FINLuaProcessorStateStorage.cpp b/Source/FicsItNetworksLua/Private/FINLuaRuntimePersistence.cpp similarity index 72% rename from Source/FicsItNetworksLua/Private/FINLuaProcessorStateStorage.cpp rename to Source/FicsItNetworksLua/Private/FINLuaRuntimePersistence.cpp index e61cb5da5..e13e72bca 100644 --- a/Source/FicsItNetworksLua/Private/FINLuaProcessorStateStorage.cpp +++ b/Source/FicsItNetworksLua/Private/FINLuaRuntimePersistence.cpp @@ -1,10 +1,11 @@ -#include "FINLuaProcessorStateStorage.h" +#include "FINLuaRuntimePersistence.h" #include "FicsItNetworksLuaModule.h" #include "FINUtils.h" +#include "Engine/World.h" #include "Util/SemVersion.h" -bool FFINLuaProcessorStateStorage::Serialize(FStructuredArchive::FSlot Slot) { +bool FFINLuaRuntimePersistenceState::Serialize(FStructuredArchive::FSlot Slot) { if (!Slot.GetUnderlyingArchive().IsSaveGame()) return false; FStructuredArchive::FRecord Record = Slot.EnterRecord(); Record.EnterField(SA_FIELD_NAME(TEXT("Traces"))).GetUnderlyingArchive() << Traces; @@ -32,27 +33,27 @@ bool FFINLuaProcessorStateStorage::Serialize(FStructuredArchive::FSlot Slot) { return true; } -int32 FFINLuaProcessorStateStorage::Add(const FFIRTrace& Trace) { +int32 FFINLuaRuntimePersistenceState::Add(const FFIRTrace& Trace) { return Traces.AddUnique(Trace); } -int32 FFINLuaProcessorStateStorage::Add(UObject* Ref) { +int32 FFINLuaRuntimePersistenceState::Add(UObject* Ref) { return References.AddUnique(Ref); } -int32 FFINLuaProcessorStateStorage::Add(TSharedPtr Struct) { +int32 FFINLuaRuntimePersistenceState::Add(TSharedPtr Struct) { return Structs.Add(Struct); } -FFIRTrace FFINLuaProcessorStateStorage::GetTrace(int32 id) { +FFIRTrace FFINLuaRuntimePersistenceState::GetTrace(int32 id) { return Traces[id]; } -UObject* FFINLuaProcessorStateStorage::GetRef(int32 id) { +UObject* FFINLuaRuntimePersistenceState::GetRef(int32 id) { return References[id]; } -TSharedPtr FFINLuaProcessorStateStorage::GetStruct(int32 id) { +TSharedPtr FFINLuaRuntimePersistenceState::GetStruct(int32 id) { if (id >= Structs.Num()) { UE_LOG(LogFicsItNetworksLua, Warning, TEXT("Unable to find struct in lua processor state storage with id %i"), id); return MakeShared(); @@ -60,7 +61,7 @@ TSharedPtr FFINLuaProcessorStateStorage::GetStruct(int32 id return Structs[id]; } -void FFINLuaProcessorStateStorage::Clear() { +void FFINLuaRuntimePersistenceState::Clear() { Traces.Empty(); References.Empty(); Structs.Empty(); diff --git a/Source/FicsItNetworksLua/Public/FINLua/API/LuaComponentAPI.h b/Source/FicsItNetworksLua/Public/FINLua/API/LuaComponentAPI.h new file mode 100644 index 000000000..3ec4e0415 --- /dev/null +++ b/Source/FicsItNetworksLua/Public/FINLua/API/LuaComponentAPI.h @@ -0,0 +1,49 @@ +#pragma once + +#include "CoreMinimal.h" +#include "LuaUtil.h" +#include "FIRTrace.h" + +class IFINLuaComponentNetworkAccessInterface { +public: + virtual ~IFINLuaComponentNetworkAccessInterface() = default; + /** + * tries to find a component with the given ID. + * + * @return the component you searched for, nullptr if it was not able to find the component + */ + virtual FFIRTrace GetComponentByID(const FGuid& InID) const { return FFIRTrace(); } + + /** + * returns the components in the network with the given nick. + */ + virtual TSet GetComponentByNick(const FString& InNick) const { return {}; } + + /** + * returns the components in the network with of the given type. + */ + virtual TSet GetComponentByClass(UClass* InClass, bool bInRedirect) const { return {}; } +}; + +struct FFINLuaComponentNetworkAccessDelegates : public IFINLuaComponentNetworkAccessInterface { + TDelegate OnGetComponentByID; + TDelegate(const FString&)> OnGetComponentByNick; + TDelegate(UClass* Class, bool bInRedirect)> OnGetComponentByClass; + + virtual FFIRTrace GetComponentByID(const FGuid& InID) const override { + return OnGetComponentByID.Execute(InID); + } + + virtual TSet GetComponentByNick(const FString& InNick) const override { + return OnGetComponentByNick.Execute(InNick); + } + + virtual TSet GetComponentByClass(UClass* InClass, bool bInRedirect) const { + return OnGetComponentByClass.Execute(InClass, bInRedirect); + } +}; + +namespace FINLua { + void luaFIN_setComponentNetwork(lua_State* L, IFINLuaComponentNetworkAccessInterface* ComponentNetwork); + IFINLuaComponentNetworkAccessInterface* luaFIN_getComponentNetwork(lua_State* L); +} diff --git a/Source/FicsItNetworksLua/Public/FINLua/API/LuaFileSystemAPI.h b/Source/FicsItNetworksLua/Public/FINLua/API/LuaFileSystemAPI.h index 19c43cd00..aaee45df0 100644 --- a/Source/FicsItNetworksLua/Public/FINLua/API/LuaFileSystemAPI.h +++ b/Source/FicsItNetworksLua/Public/FINLua/API/LuaFileSystemAPI.h @@ -26,4 +26,7 @@ namespace FINLua { * @param path - the path to the file opened by the filestream (needed for persistency) */ void luaFIN_pushFile(lua_State* L, TSharedPtr file, const std::string& path); + + void luaFIN_setFileSystem(lua_State* L, CodersFileSystem::FileSystemRoot* FileSystem); + CodersFileSystem::FileSystemRoot* luaFIN_getFileSystem(lua_State* L); } diff --git a/Source/FicsItNetworksLua/Public/FINLua/API/LuaKernelAPI.h b/Source/FicsItNetworksLua/Public/FINLua/API/LuaKernelAPI.h new file mode 100644 index 000000000..bb90d8775 --- /dev/null +++ b/Source/FicsItNetworksLua/Public/FINLua/API/LuaKernelAPI.h @@ -0,0 +1,12 @@ +#pragma once + +#include "CoreMinimal.h" +#include "LuaUtil.h" +#include "LuaKernelAPI.h" + +class UFINKernelSystem; + +namespace FINLua { + void luaFIN_setKernel(lua_State* L, UFINKernelSystem* Kernel); + UFINKernelSystem* luaFIN_getKernel(lua_State* L); +} diff --git a/Source/FicsItNetworksLua/Public/FINLua/API/LuaWorldAPI.h b/Source/FicsItNetworksLua/Public/FINLua/API/LuaWorldAPI.h new file mode 100644 index 000000000..8cf5987ec --- /dev/null +++ b/Source/FicsItNetworksLua/Public/FINLua/API/LuaWorldAPI.h @@ -0,0 +1,9 @@ +#pragma once + +#include "CoreMinimal.h" +#include "LuaUtil.h" + +namespace FINLua { + void luaFIN_setWorld(lua_State* L, UWorld* world); + UWorld* luaFIN_getWorld(lua_State* L); +} \ No newline at end of file diff --git a/Source/FicsItNetworksLua/Public/FINLua/FINLuaModule.h b/Source/FicsItNetworksLua/Public/FINLua/FINLuaModule.h index d166b1032..56e5282f8 100644 --- a/Source/FicsItNetworksLua/Public/FINLua/FINLuaModule.h +++ b/Source/FicsItNetworksLua/Public/FINLua/FINLuaModule.h @@ -192,10 +192,10 @@ struct FICSITNETWORKSLUA_API FFINLuaModule : TSharedFromThis { TArray Metatables; TArray Globals; - TDelegate PreSetup; - TDelegate PostSetup; + TDelegate PreSetup; + TDelegate PostSetup; - void SetupModule(lua_State* L); + void SetupModule(lua_State* L, const FFIRAnyValue& InitValue); void ParseDocumentationComment(const FString& Comment, const TCHAR* InternalName); @@ -215,17 +215,18 @@ struct FICSITNETWORKSLUA_API FFINLuaModuleRegistry { public: [[nodiscard]] static FFINLuaModuleRegistry& GetInstance(); - TArray> Modules; + TMap> Modules; void AddModule(const TSharedRef& Module) { - if (Module->InternalName == "ModuleSystem") { - Modules.Insert(Module, 0); - } else { - Modules.Add(Module); - } + Modules.Add(Module->InternalName, Module); } }; + +namespace FINLua { + void luaFIN_loadModules(lua_State* L, const TMap& Modules); +} + #define LuaModule(Documentation, InternalName) \ namespace InternalName { \ static TSharedRef Module = MakeShared(); \ @@ -236,17 +237,17 @@ struct FICSITNETWORKSLUA_API FFINLuaModuleRegistry { } \ namespace InternalName #define LuaModulePreSetup() \ - void PreSetup(FFINLuaModule&, lua_State*); \ + void PreSetup(FFINLuaModule&, lua_State*, const FFIRAnyValue&); \ static FFIRStaticGlobalRegisterFunc RegisterPreSetup([]() { \ Module->PreSetup.BindStatic(&PreSetup); \ }); \ - void PreSetup(FFINLuaModule& InModule, lua_State* L) + void PreSetup(FFINLuaModule& InModule, lua_State* L, const FFIRAnyValue& InitValue) #define LuaModulePostSetup() \ - void PostSetup(FFINLuaModule&, lua_State*); \ + void PostSetup(FFINLuaModule&, lua_State*, const FFIRAnyValue&); \ static FFIRStaticGlobalRegisterFunc RegisterPostSetup([]() { \ Module->PostSetup.BindStatic(&PostSetup); \ }); \ - void PostSetup(FFINLuaModule& InModule, lua_State* L) + void PostSetup(FFINLuaModule& InModule, lua_State* L, const FFIRAnyValue& InitValue) #define LuaModuleLibrary(Documentation, InternalName) \ namespace InternalName { \ static TSharedRef Table = MakeShared(); \ diff --git a/Source/FicsItNetworksLua/Public/FINLua/FINLuaReferenceCollector.h b/Source/FicsItNetworksLua/Public/FINLua/FINLuaReferenceCollector.h new file mode 100644 index 000000000..165655316 --- /dev/null +++ b/Source/FicsItNetworksLua/Public/FINLua/FINLuaReferenceCollector.h @@ -0,0 +1,109 @@ +#pragma once + +#include "CoreMinimal.h" +#include "FINLuaRuntime.h" +#include "FINLuaReferenceCollector.generated.h" + +UE_DISABLE_OPTIMIZATION_SHIP +USTRUCT() +struct FFINLuaReferenceCollector { + GENERATED_BODY() +private: + FCriticalSection ReferenceCollectorsMutex; + TMap> ReferencedCollectors; + +public: + FFINLuaReferenceCollector() = default; + FFINLuaReferenceCollector(const FFINLuaReferenceCollector&) = delete; + FFINLuaReferenceCollector(FFINLuaReferenceCollector&&) = delete; + FFINLuaReferenceCollector& operator=(const FFINLuaReferenceCollector&) = delete; + FFINLuaReferenceCollector& operator=(FFINLuaReferenceCollector&&) = delete; + + void AddStructReferencedObjects(FReferenceCollector& ReferenceCollector) { + ReferenceCollector.AddPropertyReferences(StaticStruct(), this); + + FScopeLock Lock(&ReferenceCollectorsMutex); + for (const auto& [instance, func] : ReferencedCollectors) { + func(instance, ReferenceCollector); + } + } + + void AddReferencer(void* Referencer, const TFunction& CollectorFunc) { + FScopeLock Lock(&ReferenceCollectorsMutex); + ReferencedCollectors.FindOrAdd(Referencer) = CollectorFunc; + } + + void RemoveReferencer(void* Referencer) { + FScopeLock Lock(&ReferenceCollectorsMutex); + ReferencedCollectors.Remove(Referencer); + } +}; +UE_ENABLE_OPTIMIZATION_SHIP + +template<> +struct TStructOpsTypeTraits : TStructOpsTypeTraitsBase2 { + enum { + WithAddStructReferencedObjects = true, + WithCopy = false, + }; +}; +UE_DISABLE_OPTIMIZATION_SHIP +USTRUCT() +struct FFINLuaReferenceCollected { + GENERATED_BODY() +public: + FFINLuaReferenceCollector* ReferenceCollector = nullptr; + + static void CollectReferencesInternal(void* self, FReferenceCollector& Collector) { + ((FFINLuaReferenceCollected*)self)->CollectReferences(Collector); + } + +public: + FFINLuaReferenceCollected() = default; + FFINLuaReferenceCollected(FFINLuaReferenceCollector* ReferenceCollector) : ReferenceCollector(ReferenceCollector) { + fgcheck(ReferenceCollector); + ReferenceCollector->AddReferencer(this, &CollectReferencesInternal); + } + FFINLuaReferenceCollected(const FFINLuaReferenceCollected& Other) : ReferenceCollector(Other.ReferenceCollector) { + fgcheck(ReferenceCollector); + ReferenceCollector->AddReferencer(this, &CollectReferencesInternal); + } + FFINLuaReferenceCollected(FFINLuaReferenceCollected&&) = delete; + FFINLuaReferenceCollected& operator=(const FFINLuaReferenceCollected& Other) { + if (ReferenceCollector) { + ReferenceCollector->RemoveReferencer(this); + } + ReferenceCollector = Other.ReferenceCollector; + fgcheck(ReferenceCollector); + ReferenceCollector->AddReferencer(this, &CollectReferencesInternal); + return *this; + } + FFINLuaReferenceCollected& operator=(FFINLuaReferenceCollected&&) = delete; + + virtual ~FFINLuaReferenceCollected() { + if (ReferenceCollector) ReferenceCollector->RemoveReferencer(this); + } + + virtual void CollectReferences(FReferenceCollector& Collector) {} +}; +UE_ENABLE_OPTIMIZATION_SHIP +template<> +struct TStructOpsTypeTraits : TStructOpsTypeTraitsBase2 { + enum { + WithCopy = true, + }; +}; + +namespace FINLua { + FORCEINLINE void luaFIN_setReferenceCollector(lua_State* L, FFINLuaReferenceCollector& ReferenceCollector) { + FFINLuaRuntime& runtime = luaFIN_getRuntime(L); + runtime.GlobalPointers.Add(TEXT("ReferenceCollector"), &ReferenceCollector); + } + + FORCEINLINE FFINLuaReferenceCollector* luaFIN_getReferenceCollector(lua_State* L) { + FFINLuaRuntime& runtime = luaFIN_getRuntime(L); + FFINLuaReferenceCollector** collector = reinterpret_cast(runtime.GlobalPointers.Find(TEXT("ReferenceCollector"))); + if (!collector) return nullptr; + return *collector; + } +} diff --git a/Source/FicsItNetworksLua/Public/FINLua/FINLuaRuntime.h b/Source/FicsItNetworksLua/Public/FINLua/FINLuaRuntime.h new file mode 100644 index 000000000..14200623d --- /dev/null +++ b/Source/FicsItNetworksLua/Public/FINLua/FINLuaRuntime.h @@ -0,0 +1,98 @@ +#pragma once + +#include "CoreMinimal.h" +#include "FIRAnyValue.h" +#include "FIRInstancedStruct.h" +#include "Queue.h" +#include "Union.h" +#include "FINLuaRuntime.generated.h" + +struct FFINLuaRuntimePersistenceState; +struct lua_State; +namespace FINLua { + FFINLuaRuntimePersistenceState& luaFIN_getPersistence(lua_State*); +} + +#define LUAFIN_REGISTRYKEY_UNPERSIST "PersistUperm" +#define LUAFIN_REGISTRYKEY_PERSIST "PersistPerm" +#define LUAFIN_REGISTRYKEY_HIDDENGLOBALS "hidden-globals" + +struct FFINLuaPanic { + FString Message; +}; + +USTRUCT() +struct FFINLuaRuntime { + GENERATED_BODY() + friend FFINLuaRuntimePersistenceState& FINLua::luaFIN_getPersistence(lua_State*); +public: + enum EStatus { + None, + Running, + Finished, + Crashed, + }; +private: + // Lua State + lua_State* LuaState = nullptr; + lua_State* LuaThread = nullptr; + int LuaThreadIndex = 0; + + FFINLuaRuntimePersistenceState* PersistenceState = nullptr; + + FFINLuaRuntime(const FFINLuaRuntime&) = delete; + FFINLuaRuntime(FFINLuaRuntime&&) = delete; + FFINLuaRuntime& operator=(const FFINLuaRuntime&) = delete; + FFINLuaRuntime& operator=(FFINLuaRuntime&&) = delete; + +public: + TMulticastDelegate OnPreReset; + TMulticastDelegate OnPreModules; + TMulticastDelegate OnPostReset; + TMulticastDelegate OnPreDestroy; + TMulticastDelegate>&)> OnPreLuaTick; + TMulticastDelegate OnPostLuaTick; + TMulticastDelegate PreLoadState; + TMulticastDelegate PostLoadState; + TMulticastDelegate PreSaveState; + TMulticastDelegate PostSaveState; + + TOptional Hook_Tick; + TMap Modules; + + TQueue> TickActions; + + TMap LoadedModules; + TMap GlobalData; + TMap GlobalPointers; + + FFINLuaRuntime(); + ~FFINLuaRuntime(); + + void Reset(); + void Destroy(); + + TOptional LoadCode(const FString& Code); + TOptional LoadState(FFINLuaRuntimePersistenceState& InState); + TUnion SaveState(); + + TOptional> Tick(); + TTuple LuaTick(); + + EStatus GetStatus() const; + TOptional GetError() const; + + lua_State* GetLuaState() const { return LuaState; } + lua_State* GetLuaThread() const { return LuaThread; } +}; + +namespace FINLua { + FFINLuaRuntime& luaFIN_getRuntime(lua_State* L); +} + +template<> +struct TStructOpsTypeTraits : TStructOpsTypeTraitsBase2 { + enum { + WithCopy = false, + }; +}; diff --git a/Source/FicsItNetworksLua/Public/FINLua/FINLuaThreadedRuntime.h b/Source/FicsItNetworksLua/Public/FINLua/FINLuaThreadedRuntime.h new file mode 100644 index 000000000..01cf6cef7 --- /dev/null +++ b/Source/FicsItNetworksLua/Public/FINLua/FINLuaThreadedRuntime.h @@ -0,0 +1,106 @@ +#pragma once + +#include "CoreMinimal.h" +#include "AsyncWork.h" +#include "Event.h" +#include "FINLuaRuntime.h" +#include "FINLuaThreadedRuntime.generated.h" + +struct FFINLuaThreadedRuntime; +struct FFINLuaTickRunnable : public FNonAbandonableTask { +private: + FFINLuaThreadedRuntime* Runtime; + +public: + FFINLuaTickRunnable(FFINLuaThreadedRuntime* Runtime) : Runtime(Runtime) {} + + void DoWork(); + + // ReSharper disable once CppMemberFunctionMayBeStatic + FORCEINLINE TStatId GetStatId() const { + RETURN_QUICK_DECLARE_CYCLE_STAT(ExampleAsyncTask, STATGROUP_ThreadPoolAsyncTasks); + } +}; + +USTRUCT() +struct FFINLuaThreadedRuntime { + GENERATED_BODY() + friend FFINLuaTickRunnable; +private: + // Misc + FDelegateHandle OnPreGarbageCollectionHandle; + FDelegateHandle OnPostGarbageCollectionHandle; + + // Thread Handling + FAsyncTask LuaTask; + TAtomic ShouldRunInThread = false; + FCriticalSection IsWaitingForCompletionMutex; + bool bIsWaitingForCompletion = false; + TSharedPtr WaitForThread; + TSharedPtr WaitForGame; + TSharedPtr ContinueThread; + TSharedPtr ContinueGame; + FCriticalSection LuaTickMutex; + bool bIsPromotedTick = false; + +public: + UPROPERTY() + FFINLuaRuntime Runtime; + + FFINLuaThreadedRuntime(); + ~FFINLuaThreadedRuntime(); + + // [Any Thread] + void SetShouldBePromoted(bool bInShouldBePromoted) { ShouldRunInThread.Store(bInShouldBePromoted); } + bool ShouldBePromoted() const { return ShouldRunInThread.Load(); } + + // [Main Thead] + void HandleWaitForGame(); + // [Lua Tick] + TSharedPtr DoWaitForGame(); + + // [Main Thread] + // Resume the Lua Runtime and blocks until yielded or returned. If promoted, but should not be promoted, will not wait. + // If promoted, may sync. + // If should be promoted, but is not, will start thread. + TOptional> Run(); + + // [Main Thread] + // If promoted, blocks and waits for it to yield/return. Runtime has to be resumed manually (f.e Run()). + void PauseAndWait(); + + bool IsTickPromoted() const { return bIsPromotedTick; } + + FFINLuaRuntime::EStatus GetStatus(); +}; + +template<> +struct TStructOpsTypeTraits : TStructOpsTypeTraitsBase2 { + enum { + WithCopy = false, + }; +}; + +namespace FINLua { + void luaFIN_setThreadedRuntime(lua_State* L, FFINLuaThreadedRuntime& threadedRuntime); + FFINLuaThreadedRuntime& luaFIN_getThreadedRuntime(lua_State* L); + FFINLuaThreadedRuntime* luaFIN_tryGetThreadedRuntime(lua_State* L); + + struct FLuaSync { + FFINLuaThreadedRuntime* Runtime = nullptr; + TSharedPtr Event; + FLuaSync(lua_State* L) { + Runtime = luaFIN_tryGetThreadedRuntime(L); + if (Runtime && Runtime->IsTickPromoted()) { + Event = Runtime->DoWaitForGame(); + } + } + ~FLuaSync() { + if (Event) { + Event->Get()->Trigger(); + } + } + }; +} + + diff --git a/Source/FicsItNetworksLua/Public/FINLua/LuaEventAPI.h b/Source/FicsItNetworksLua/Public/FINLua/LuaEventAPI.h index f7dc89470..baa70210e 100644 --- a/Source/FicsItNetworksLua/Public/FINLua/LuaEventAPI.h +++ b/Source/FicsItNetworksLua/Public/FINLua/LuaEventAPI.h @@ -2,11 +2,14 @@ #include "CoreMinimal.h" #include "FINEventFilter.h" +#include "FINLuaReferenceCollector.h" #include "FINSignalData.h" #include "FIRTrace.h" #include "LuaUtil.h" #include "LuaEventAPI.generated.h" +struct FFINLuaReferenceCollector; + USTRUCT() struct FFINLuaEvent { GENERATED_BODY() @@ -19,7 +22,7 @@ struct FFINLuaEvent { }; USTRUCT() -struct FFINLuaEventQueue { +struct FFINLuaEventQueue : public FFINLuaReferenceCollected { GENERATED_BODY() UPROPERTY() @@ -28,24 +31,18 @@ struct FFINLuaEventQueue { UPROPERTY() FFINEventFilterExpression Filter; - UPROPERTY() - class UFINLuaProcessor* Processor = nullptr; - UPROPERTY() int64 Key = 0; FFINLuaEventQueue() = default; - FFINLuaEventQueue(class UFINLuaProcessor* Processor, int64 Key); - FFINLuaEventQueue(const FFINLuaEventQueue& Other); - FFINLuaEventQueue& operator=(const FFINLuaEventQueue& Other); - ~FFINLuaEventQueue(); + FFINLuaEventQueue(FFINLuaReferenceCollector* ReferenceCollector, int64 Key); void AddEvent(const FFIRTrace& Sender, const FFINSignalData& Data) { if (Events.Num() >= 250) return; Events.Add(FFINLuaEvent{Sender, Data}); } - static void CollectReferences(void* Obj, FReferenceCollector& Collector); + virtual void CollectReferences(FReferenceCollector& Collector) override; }; USTRUCT() @@ -70,6 +67,36 @@ struct FFINLuaEventRegistry { } }; +struct IFINLuaEventSystem { + virtual ~IFINLuaEventSystem() = default; + + virtual void Ignore(UObject* Object) = 0; + virtual void IgnoreAll() = 0; + virtual void Clear() = 0; + virtual void Listen(const FFIRTrace& Object) = 0; + virtual TArray Listening() = 0; + virtual TOptional> PullSignal() = 0; + virtual double TimeSinceStart() = 0; +}; + +struct FFINLuaEventSystem : IFINLuaEventSystem { + TDelegate OnIgnore; + TDelegate OnIgnoreAll; + TDelegate OnClear; + TDelegate OnListen; + TDelegate()> OnListening; + TDelegate>()> OnPullSignal; + TDelegate OnTimeSinceStart; + + virtual void Ignore(UObject* Object) override { OnIgnore.Execute(Object); } + virtual void IgnoreAll() override { OnIgnoreAll.Execute(); } + virtual void Clear() override { OnClear.Execute(); } + virtual void Listen(const FFIRTrace& Object) override { OnListen.Execute(Object); } + virtual TArray Listening() override { return OnListening.Execute(); } + virtual TOptional> PullSignal() override { return OnPullSignal.Execute(); } + virtual double TimeSinceStart() override { return OnTimeSinceStart.Execute(); } +}; + namespace FINLua { typedef TSharedRef FEventQueue; @@ -86,4 +113,7 @@ namespace FINLua { int luaFIN_pushEventData(lua_State* L, const FFIRTrace& sender, const FFINSignalData& data); void luaFIN_handleEvent(lua_State* L, const FFIRTrace& sender, const FFINSignalData& data); + + void luaFIN_setEventSystem(lua_State* L, IFINLuaEventSystem& EventSystem); + IFINLuaEventSystem& luaFIN_getEventSystem(lua_State* L); } diff --git a/Source/FicsItNetworksLua/Public/FINLua/LuaExtraSpace.h b/Source/FicsItNetworksLua/Public/FINLua/LuaExtraSpace.h deleted file mode 100644 index 0ea1cf1fa..000000000 --- a/Source/FicsItNetworksLua/Public/FINLua/LuaExtraSpace.h +++ /dev/null @@ -1,25 +0,0 @@ -#pragma once - -#include "LuaUtil.h" - -struct FFINLuaModule; - -namespace FINLua { - struct FLuaExtraSpace { - UFINLuaProcessor* Processor; - TArray& FileStreams; - TArray> LoadedModules; - }; - - [[nodiscard]] inline FLuaExtraSpace& luaFIN_getExtraSpace(lua_State* L) { - return **static_cast(lua_getextraspace(L)); - } - - inline void luaFIN_createExtraSpace(lua_State* L, FLuaExtraSpace&& ExtraSpace) { - *static_cast(lua_getextraspace(L)) = new FLuaExtraSpace(ExtraSpace); - } - - inline void luaFIN_destroyExtraSpace(lua_State* L) { - delete *static_cast(lua_getextraspace(L)); - } -} \ No newline at end of file diff --git a/Source/FicsItNetworksLua/Public/FINLua/LuaGlobalLib.h b/Source/FicsItNetworksLua/Public/FINLua/LuaGlobalLib.h deleted file mode 100644 index 66fecc3b5..000000000 --- a/Source/FicsItNetworksLua/Public/FINLua/LuaGlobalLib.h +++ /dev/null @@ -1,7 +0,0 @@ -#pragma once - -#include "LuaUtil.h" - -namespace FINLua { - void setupGlobals(lua_State* L); -} diff --git a/Source/FicsItNetworksLua/Public/FINLua/LuaPersistence.h b/Source/FicsItNetworksLua/Public/FINLua/LuaPersistence.h index 5e1679c9e..93de2dc76 100644 --- a/Source/FicsItNetworksLua/Public/FINLua/LuaPersistence.h +++ b/Source/FicsItNetworksLua/Public/FINLua/LuaPersistence.h @@ -1,6 +1,7 @@ #pragma once #include "LuaUtil.h" +#include "FINLuaRuntimePersistence.h" namespace FINLua { /** @@ -89,4 +90,8 @@ namespace FINLua { lua_pushvalue(L, idx); PersistValue(name); } + + inline FFINLuaRuntimePersistenceState& luaFIN_getPersistence(lua_State* L) { + return *luaFIN_getRuntime(L).PersistenceState; + } } diff --git a/Source/FicsItNetworksLua/Public/FINLua/LuaUtil.h b/Source/FicsItNetworksLua/Public/FINLua/LuaUtil.h index 6e124fdc2..6407196af 100644 --- a/Source/FicsItNetworksLua/Public/FINLua/LuaUtil.h +++ b/Source/FicsItNetworksLua/Public/FINLua/LuaUtil.h @@ -110,10 +110,17 @@ namespace FINLua { FString luaFIN_where(lua_State* L); FString luaFIN_stack(lua_State* L); + /** + * Tries to set the value on top of the stack as value of the table at the given index with the field key beeing the value right below the stack. + * If the value is a table and the field already contains a table, will merge both tables. + * In any other case will overwrite the field of the target with the value on-top of the stack. + * Raises an error if the targetIndex is not a table. + * Pops the table on-top of the stack. + */ + void luaFIN_setOrMergeField(lua_State* L, int targetIndex); + void luaFINDebug_dumpStack(lua_State* L); void luaFINDebug_dumpTable(lua_State* L, int index); - - void setupUtilLib(lua_State* L); } struct FFINLuaLogScope : public FFILLogScope { diff --git a/Source/FicsItNetworksLua/Public/FINLua/Reflection/LuaObject.h b/Source/FicsItNetworksLua/Public/FINLua/Reflection/LuaObject.h index 70cacf3e9..a9b83c8ec 100644 --- a/Source/FicsItNetworksLua/Public/FINLua/Reflection/LuaObject.h +++ b/Source/FicsItNetworksLua/Public/FINLua/Reflection/LuaObject.h @@ -1,23 +1,23 @@ #pragma once #include "FicsItReflection.h" +#include "FINLuaReferenceCollector.h" #include "FINLua/LuaUtil.h" #include "Reflection/FIRClass.h" -class UFINKernelSystem; +struct FFINLuaReferenceCollector; namespace FINLua { /** * Structure used in the userdata representing a instance. */ - struct FLuaObject { + struct FLuaObject : FFINLuaReferenceCollected { UFIRClass* Type; FFIRTrace Object; - UFINKernelSystem* Kernel; - FLuaObject(const FFIRTrace& Trace, UFINKernelSystem* Kernel); - FLuaObject(const FLuaObject& Other); - ~FLuaObject(); - static void CollectReferences(void* Obj, FReferenceCollector& Collector); + + FLuaObject(const FFIRTrace& Trace, FFINLuaReferenceCollector* ReferenceCollector); + + virtual void CollectReferences(FReferenceCollector& Collector) override; }; /** diff --git a/Source/FicsItNetworksLua/Public/FINLua/Reflection/LuaStruct.h b/Source/FicsItNetworksLua/Public/FINLua/Reflection/LuaStruct.h index f06359a17..9410fc121 100644 --- a/Source/FicsItNetworksLua/Public/FINLua/Reflection/LuaStruct.h +++ b/Source/FicsItNetworksLua/Public/FINLua/Reflection/LuaStruct.h @@ -1,23 +1,21 @@ #pragma once #include "FicsItReflection.h" +#include "FINLuaReferenceCollector.h" #include "FINLua/LuaUtil.h" +struct FFINLuaReferenceCollector; class UFINKernelSystem; namespace FINLua { /** * Contains all information about the struct */ - struct FLuaStruct { + struct FLuaStruct : FFINLuaReferenceCollected { UFIRStruct* Type = nullptr; TSharedRef Struct; - UFINKernelSystem* Kernel; - FLuaStruct(UFIRStruct* Type, const FFIRInstancedStruct& Struct, UFINKernelSystem* Kernel); - FLuaStruct(const FLuaStruct& Other); - FLuaStruct& operator=(const FLuaStruct& Other); - ~FLuaStruct(); - static void CollectReferences(void* Obj, FReferenceCollector& Collector); + FLuaStruct(UFIRStruct* Type, const FFIRInstancedStruct& Struct, FFINLuaReferenceCollector* ReferenceCollector); + virtual void CollectReferences(FReferenceCollector& Collector) override; }; /** diff --git a/Source/FicsItNetworksLua/Public/FINLuaProcessor.h b/Source/FicsItNetworksLua/Public/FINLuaProcessor.h index 6628eebca..b90d21e8e 100644 --- a/Source/FicsItNetworksLua/Public/FINLuaProcessor.h +++ b/Source/FicsItNetworksLua/Public/FINLuaProcessor.h @@ -2,19 +2,19 @@ #include "CoreMinimal.h" #include "AsyncWork.h" -#include "FINLuaProcessorStateStorage.h" +#include "FINLuaReferenceCollector.h" +#include "FINLuaRuntime.h" +#include "FINLuaRuntimePersistence.h" +#include "FINLuaThreadedRuntime.h" #include "Future.h" +#include "LuaComponentAPI.h" +#include "LuaEventAPI.h" #include "FicsItFileSystem/Listener.h" #include "FicsItKernel/Processor/Processor.h" #include "FINLua/API/LuaFileSystemAPI.h" #include "FINLuaProcessor.generated.h" class AFINStateEEPROMLua; -struct lua_State; -struct lua_Debug; -namespace FINLua::Event::event { - int pull(lua_State*); -} class FICSITNETWORKSLUA_API LuaFileSystemListener : public CodersFileSystem::Listener { private: @@ -26,142 +26,24 @@ class FICSITNETWORKSLUA_API LuaFileSystemListener : public CodersFileSystem::Lis virtual void onNodeRemoved(CodersFileSystem::Path path, CodersFileSystem::NodeType type) override; }; -enum LuaTickState { - LUA_SYNC = 0b00001, - LUA_ASYNC = 0b00010, - LUA_ERROR = 0b00100, - LUA_END = 0b01000, - LUA_BEGIN = 0b10000, - LUA_SYNC_ERROR = LUA_SYNC | LUA_ERROR, - LUA_SYNC_END = LUA_SYNC | LUA_END, - LUA_ASYNC_BEGIN = LUA_ASYNC | LUA_BEGIN, - LUA_ASYNC_ERROR = LUA_ASYNC | LUA_ERROR, - LUA_ASYNC_END = LUA_ASYNC | LUA_END, -}; -ENUM_CLASS_FLAGS(LuaTickState); - -struct FICSITNETWORKSLUA_API FLuaTickRunnable : public FNonAbandonableTask { -private: - class FFINLuaProcessorTick* Tick; - -public: - FLuaTickRunnable(class FFINLuaProcessorTick* Tick) : Tick(Tick) {} - - void DoWork(); - - // ReSharper disable once CppMemberFunctionMayBeStatic - FORCEINLINE TStatId GetStatId() const { - RETURN_QUICK_DECLARE_CYCLE_STAT(ExampleAsyncTask, STATGROUP_ThreadPoolAsyncTasks); - } -}; - -class FICSITNETWORKSLUA_API FFINLuaProcessorTick { - // Lua Tick state lua step lengths - int SyncLen = 2500; - int SyncErrorLen = 1250; - int SyncEndLen = 500; - int AsyncLen = 2500; - int AsyncErrorLen = 1200; - int AsyncEndLen = 500; - -private: - class UFINLuaProcessor* Processor = nullptr; - LuaTickState State = LUA_SYNC; - FLuaTickRunnable Runnable; - TSharedPtr> asyncTask; - FCriticalSection StateMutex; - FCriticalSection TickMutex; - bool bShouldPromote = false; - bool bShouldDemote = false; - bool bShouldStop = false; - bool bShouldReset = false; - bool bShouldCrash = false; - bool bDoSync = false; - bool bWaitForSignal = false; - TSharedPtr ToCrash; - TPromise AsyncSync; - TPromise SyncAsync; - FCriticalSection AsyncSyncMutex; - -public: - - FFINLuaProcessorTick(); - FFINLuaProcessorTick(class UFINLuaProcessor* Processor); - - ~FFINLuaProcessorTick(); - - void reset(); - void stop(); - void promote(); - void demote(); - void demoteInAsync(); - void shouldStop(); - void shouldReset(); - void shouldPromote(); - void shouldDemote(); - void shouldWaitForSignal(); - void signalFound(); - void shouldCrash(const TSharedRef& Crash); - int steps() const; - - void syncTick(); - bool asyncTick(); - bool postTick(); - - void tickHook(lua_State* L); - int apiReturn(lua_State* L, int args); - - LuaTickState getState() { return State; } - bool getShouldPromote() { return bShouldPromote; } -}; - UCLASS() class FICSITNETWORKSLUA_API UFINLuaProcessor : public UFINKernelProcessor { GENERATED_BODY() - - friend int FINLua::Event::event::pull(lua_State* L); - friend int luaComputerSkip(lua_State* L); - friend FLuaTickRunnable; - friend struct FLuaSyncCall; - friend FFINLuaProcessorTick; - private: - // Lua runtime - lua_State* luaState = nullptr; - lua_State* luaThread = nullptr; - int luaThreadIndex = 0; - FFINLuaProcessorTick tickHelper; + UPROPERTY() + FFINLuaThreadedRuntime Runtime; + UPROPERTY() + FFINLuaReferenceCollector ReferenceCollector; + FFINLuaComponentNetworkAccessDelegates ComponentNetwork; + FFINLuaEventSystem EventSystem; - // signal pulling - UPROPERTY(SaveGame) - int PullState = 0; // 0 = not pulling, 1 = pulling with timeout, 2 = pull indefinitely - UPROPERTY(SaveGame) - double Timeout = 0.0; - UPROPERTY(SaveGame) - uint64 PullStart = 0; - - // filesystem handling - TArray FileStreams; - TSharedPtr FileSystemListener; - - bool bWasPriorToGCPromoted; - FDelegateHandle OnPreGarbageCollectionHandle; - FDelegateHandle OnPostGarbageCollectionHandle; - - void OnPreGarbageCollection(); - void OnPostGarbageCollection(); - public: UPROPERTY(SaveGame) - FFINLuaProcessorStateStorage StateStorage; - - static UFINLuaProcessor* luaGetProcessor(lua_State* L); + FFINLuaRuntimePersistenceState RuntimeState; UFINLuaProcessor(); - ~UFINLuaProcessor(); // Begin UObject - virtual void Serialize(FArchive& Ar) override; virtual void BeginDestroy() override; // End UObject @@ -178,25 +60,8 @@ class FICSITNETWORKSLUA_API UFINLuaProcessor : public UFINKernelProcessor { virtual void Tick(float InDelta) override; virtual void Stop(bool bInIsCrash) override; virtual void Reset() override; - virtual int64 GetMemoryUsage(bool bInRecalc = false) override; // End Processor - /** - * returns the tick helper - */ - FFINLuaProcessorTick& GetTickHelper(); - - /** - * Checks if the pull timeout has been reached - */ - bool PullTimeoutReached(); - - /** - * Executes one lua tick sync or async. - * Might set after tick cache which should get handled by tick. - */ - void LuaTick(); - /** * Allows to access the eeprom code used by the processor. * None if no eeprom is currently set. @@ -220,53 +85,4 @@ class FICSITNETWORKSLUA_API UFINLuaProcessor : public UFINKernelProcessor { * @return the count of values we have pushed. */ int DoSignal(lua_State* L); - - void ClearFileStreams(); - TArray GetFileStreams() const; - - static void luaHook(lua_State* L, lua_Debug* ar); - - /** - * Access the lua processor in the given state registry and checks - * if the tick process is in the second stage of execution. - * If this is the case yields the runtime with a continuation function - * which will return values of the count of args on top of the stack prior - * to the yield. - * If the tick is in the first stage, we just return. - * - * @param[in] L the lua state all of this should occur - * @param[in] args the count of arguments we should copy and the continuation should return - * @return if it even returns, returns the same as args - */ - static int luaAPIReturn(lua_State* L, int args); - - /** - * Returns the lua state - */ - lua_State* GetLuaState() const; - - /** - * Returns the current lua thread - */ - lua_State* GetLuaThread() const; -}; - -struct FICSITNETWORKSLUA_API FLuaSyncCall { - UFINLuaProcessor* Processor; - bool bShouldPromote; - - FLuaSyncCall(lua_State* L) { - Processor = UFINLuaProcessor::luaGetProcessor(L); - bShouldPromote = Processor->GetTickHelper().getShouldPromote(); - if (Processor->GetTickHelper().getState() & LUA_ASYNC) { - bShouldPromote = true; - Processor->tickHelper.demoteInAsync(); - } - } - - ~FLuaSyncCall() { - if (bShouldPromote) { - Processor->GetTickHelper().shouldPromote(); - } - } }; diff --git a/Source/FicsItNetworksLua/Public/FINLuaProcessorStateStorage.h b/Source/FicsItNetworksLua/Public/FINLuaRuntimePersistence.h similarity index 78% rename from Source/FicsItNetworksLua/Public/FINLuaProcessorStateStorage.h rename to Source/FicsItNetworksLua/Public/FINLuaRuntimePersistence.h index 9776e3775..b075dfbb5 100644 --- a/Source/FicsItNetworksLua/Public/FINLuaProcessorStateStorage.h +++ b/Source/FicsItNetworksLua/Public/FINLuaRuntimePersistence.h @@ -3,13 +3,13 @@ #include "CoreMinimal.h" #include "FIRTrace.h" #include "FIRInstancedStruct.h" -#include "FINLuaProcessorStateStorage.generated.h" +#include "FINLuaRuntimePersistence.generated.h" /** * This struct holds information from the lua processor that is only needed in serialization like persistence data. */ USTRUCT() -struct FICSITNETWORKSLUA_API FFINLuaProcessorStateStorage { +struct FICSITNETWORKSLUA_API FFINLuaRuntimePersistenceState { GENERATED_BODY() private: UPROPERTY(SaveGame) @@ -44,7 +44,7 @@ struct FICSITNETWORKSLUA_API FFINLuaProcessorStateStorage { }; template<> -struct TStructOpsTypeTraits : TStructOpsTypeTraitsBase2 { +struct TStructOpsTypeTraits : TStructOpsTypeTraitsBase2 { enum { WithStructuredSerializer = true, }; diff --git a/Source/FicsItNetworksLua/Public/FicsItNetworksLuaModule.h b/Source/FicsItNetworksLua/Public/FicsItNetworksLuaModule.h index bb24dd08b..d827c4de2 100644 --- a/Source/FicsItNetworksLua/Public/FicsItNetworksLuaModule.h +++ b/Source/FicsItNetworksLua/Public/FicsItNetworksLuaModule.h @@ -35,4 +35,4 @@ class UFINLuaUtils : public UObject { UFUNCTION( BlueprintPure, CustomThunk, Category = "Utilities|Dynamic Struct", meta = (NativeBreakFunc, CustomStructureParam = "out_structureValue" ) ) static bool BreakFINDynamicStruct( const FFGDynamicStruct& inDynamicStruct, int32& out_structureValue ); DECLARE_FUNCTION(execBreakFINDynamicStruct); -}; \ No newline at end of file +}; From 493ddae01e135e276be4151a7b926c5707b894e4 Mon Sep 17 00:00:00 2001 From: Panakotta00 Date: Fri, 15 Nov 2024 00:57:01 +0100 Subject: [PATCH 16/33] fix: ci: failing on no change --- .github/workflows/update-docs.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/update-docs.yml b/.github/workflows/update-docs.yml index d42ea5914..99d8fc9c8 100644 --- a/.github/workflows/update-docs.yml +++ b/.github/workflows/update-docs.yml @@ -74,11 +74,13 @@ jobs: - name: Commit working-directory: FicsItNetworks + continue-on-error: true run: | git add docs git commit -m "docs: Automatic Documentation Update" - name: Push working-directory: FicsItNetworks + continue-on-error: true run: | git push From 0e2c94fe39e9461f9595b31f25d69648b56116ba Mon Sep 17 00:00:00 2001 From: Panakotta00 Date: Fri, 15 Nov 2024 01:10:35 +0100 Subject: [PATCH 17/33] feat: lua: make futures aware of new timeout system --- .../Private/FINLua/API/LuaDebugAPI.cpp | 2 + .../Private/FINLua/API/LuaEventAPI.cpp | 19 +++++++-- .../Private/FINLua/FINLuaRuntime.cpp | 26 +++++++++---- .../Private/FINLua/FINLuaThreadedRuntime.cpp | 13 +++---- .../Private/FINLua/LuaBaseModule.cpp | 3 +- .../Private/FINLua/LuaFuture.cpp | 39 +++++++++++++------ .../Private/FINLua/LuaUtil.cpp | 10 +++-- .../Public/FINLua/FINLuaRuntime.h | 1 + .../FicsItNetworksLua/Public/FINLua/LuaUtil.h | 2 +- 9 files changed, 79 insertions(+), 36 deletions(-) diff --git a/Source/FicsItNetworksLua/Private/FINLua/API/LuaDebugAPI.cpp b/Source/FicsItNetworksLua/Private/FINLua/API/LuaDebugAPI.cpp index 48550217f..bf158e926 100644 --- a/Source/FicsItNetworksLua/Private/FINLua/API/LuaDebugAPI.cpp +++ b/Source/FicsItNetworksLua/Private/FINLua/API/LuaDebugAPI.cpp @@ -58,3 +58,5 @@ namespace FINLua { } } } + +#undef LOCTEXT_NAMESPACE diff --git a/Source/FicsItNetworksLua/Private/FINLua/API/LuaEventAPI.cpp b/Source/FicsItNetworksLua/Private/FINLua/API/LuaEventAPI.cpp index 88f450556..a151c0467 100644 --- a/Source/FicsItNetworksLua/Private/FINLua/API/LuaEventAPI.cpp +++ b/Source/FicsItNetworksLua/Private/FINLua/API/LuaEventAPI.cpp @@ -277,7 +277,15 @@ namespace FINLua { IFINLuaEventSystem& eventSystem = luaFIN_getEventSystem(L); TOptional> data = eventSystem.PullSignal(); if (!data) { - return lua_yield(L, 0); + const int args = lua_gettop(L); + TOptional timeout; + if (args > 0) { + timeout = luaL_checknumber(L, 1); + } + if (!timeout || *timeout <= FPlatformTime::Seconds()) { + return 0; + } + return luaFIN_yield(L, 0, 0, luaPullContinue, timeout); } const auto& [sender, signal] = *data; @@ -299,9 +307,12 @@ namespace FINLua { * @return parameters any... Parameters The parameters passed to the signal. Not set when timeout got reached. */)", pull) { const int args = lua_gettop(L); - double timeout = 0.0; - if (args > 0) timeout = lua_tonumber(L, 1); - + if (args > 0) { + double timeout = luaL_checknumber(L, 1); + timeout += FPlatformTime::Seconds(); + lua_pop(L, args); + lua_pushnumber(L, timeout); + } return luaPullContinue(L, 0, 0); } diff --git a/Source/FicsItNetworksLua/Private/FINLua/FINLuaRuntime.cpp b/Source/FicsItNetworksLua/Private/FINLua/FINLuaRuntime.cpp index 6ded000f5..c55240259 100644 --- a/Source/FicsItNetworksLua/Private/FINLua/FINLuaRuntime.cpp +++ b/Source/FicsItNetworksLua/Private/FINLua/FINLuaRuntime.cpp @@ -5,6 +5,7 @@ #include "FicsItNetworksLuaModule.h" #include "FINLuaModule.h" #include "FINLuaRuntimePersistence.h" +#include "OnlineErrorDefinitions.h" #include "ScopeExit.h" #include "Union.h" @@ -112,7 +113,6 @@ TOptional FFINLuaRuntime::LoadState(FFINLuaRuntimePersistenceState& InS PersistenceState = &InState; try { - FINLua::luaFINDebug_dumpStack(LuaState); eris_unpersist(LuaState, -1, -2); // ..., data-str, uperm, data } catch(const FFINLuaPanic& e) { PersistenceState = nullptr; @@ -158,7 +158,6 @@ TUnion FFINLuaRuntime::SaveState() { lua_pushcclosure(LuaState, &luaPersist, 2); int stateCode = lua_pcall(LuaState, 0, 1, 0); // ..., data-str|error - FINLua::luaFINDebug_dumpStack(LuaState); PersistenceState = nullptr; @@ -192,10 +191,17 @@ TOptional> FFINLuaRuntime::Tick() { while (TickActions.Dequeue(func)) { func(); } - return {}; } else { - return {LuaTick()}; + if (Timeout) { + double now = FPlatformTime::Seconds(); + if (*Timeout <= now) { + return {LuaTick()}; + } + } else { + return {LuaTick()}; + } } + return {}; } TTuple FFINLuaRuntime::LuaTick() { @@ -211,11 +217,17 @@ TTuple FFINLuaRuntime::LuaTick() { OnPostLuaTick.Broadcast(status, results); - if (results > 0) { + if (status == LUA_YIELD) { + Timeout.Reset(); + if (results > 0) { + if (lua_type(LuaThread, -results) == LUA_TNUMBER) { + double timeout = lua_tonumber(LuaThread, -results); + Timeout = timeout; + } + } + lua_pop(LuaThread, results); - } - if (status == LUA_YIELD) { lua_gc(LuaState, LUA_GCCOLLECT, 0); } diff --git a/Source/FicsItNetworksLua/Private/FINLua/FINLuaThreadedRuntime.cpp b/Source/FicsItNetworksLua/Private/FINLua/FINLuaThreadedRuntime.cpp index 4b1e391bb..d08644fd3 100644 --- a/Source/FicsItNetworksLua/Private/FINLua/FINLuaThreadedRuntime.cpp +++ b/Source/FicsItNetworksLua/Private/FINLua/FINLuaThreadedRuntime.cpp @@ -21,13 +21,13 @@ FFINLuaThreadedRuntime::~FFINLuaThreadedRuntime() { FCoreUObjectDelegates::GetPreGarbageCollectDelegate().Remove(OnPreGarbageCollectionHandle); PauseAndWait(); } -UE_DISABLE_OPTIMIZATION_SHIP + void FFINLuaTickRunnable::DoWork() { Runtime->bIsPromotedTick = true; ON_SCOPE_EXIT { Runtime->bIsPromotedTick = false; }; - while (Runtime->ShouldRunInThread.Load() && Runtime->Runtime.TickActions.IsEmpty()) { + while (Runtime->ShouldRunInThread.Load() && Runtime->Runtime.TickActions.IsEmpty() && !Runtime->Runtime.Timeout.IsSet()) { TOptional> status = Runtime->Runtime.Tick(); if (Runtime->WaitForThread) { @@ -41,7 +41,6 @@ void FFINLuaTickRunnable::DoWork() { } } } -UE_ENABLE_OPTIMIZATION_SHIP void FFINLuaThreadedRuntime::HandleWaitForGame() { if (WaitForGame) { @@ -81,10 +80,10 @@ TOptional> FFINLuaThreadedRuntime::Run() { func(); } } else if (LuaTask.IsDone() && GetStatus() == FFINLuaRuntime::Running) { - if (ShouldRunInThread.Load() && Runtime.Hook_Tick.IsSet()) { - LuaTask.StartBackgroundTask(GThreadPool, EQueuedWorkPriority::Normal, EQueuedWorkFlags::DoNotRunInsideBusyWait, -1, TEXT("FINLuaThreadedRuntime")); - } else { - return Runtime.Tick(); + if (Runtime.Tick().IsSet()) { + if (ShouldRunInThread.Load() && Runtime.Hook_Tick.IsSet() && !Runtime.Timeout.IsSet()) { + LuaTask.StartBackgroundTask(GThreadPool, EQueuedWorkPriority::Normal, EQueuedWorkFlags::DoNotRunInsideBusyWait, -1, TEXT("FINLuaThreadedRuntime")); + } } } return {}; diff --git a/Source/FicsItNetworksLua/Private/FINLua/LuaBaseModule.cpp b/Source/FicsItNetworksLua/Private/FINLua/LuaBaseModule.cpp index 611053a2e..8f4213181 100644 --- a/Source/FicsItNetworksLua/Private/FINLua/LuaBaseModule.cpp +++ b/Source/FicsItNetworksLua/Private/FINLua/LuaBaseModule.cpp @@ -26,7 +26,7 @@ namespace FINLua { int luaYield(lua_State* L) { const int args = lua_gettop(L); - return luaFIN_yield(L, args, NULL, &luaYieldResume); + return luaFIN_yield(L, args, NULL, &luaYieldResume, {}); } int luaResume(lua_State* L); @@ -55,7 +55,6 @@ namespace FINLua { const int status = lua_resume(thread, L, args - 1, &argCount); if (status == LUA_OK || status == LUA_YIELD) { - luaFINDebug_dumpStack(thread); if (argCount == 0 && status == LUA_YIELD) { // A hook yielded the thread return lua_yieldk(L, 0, NULL, &luaResumeResume); diff --git a/Source/FicsItNetworksLua/Private/FINLua/LuaFuture.cpp b/Source/FicsItNetworksLua/Private/FINLua/LuaFuture.cpp index 82a9fb2a4..332d88999 100644 --- a/Source/FicsItNetworksLua/Private/FINLua/LuaFuture.cpp +++ b/Source/FicsItNetworksLua/Private/FINLua/LuaFuture.cpp @@ -94,7 +94,7 @@ namespace FINLua { return getInternal(L, 1); } - int pollInternal(lua_State* L, int idx, lua_State*& thread) { + int pollInternal(lua_State* L, int idx, lua_State*& thread, TOptional& timeout) { idx = lua_absindex(L, idx); luaL_checkudata(L, idx, _Name); lua_getiuservalue(L, idx, 1); @@ -129,6 +129,11 @@ namespace FINLua { lua_setiuservalue(L, idx, 2); break; } case LUA_YIELD: + if (results > 0) { + if (lua_type(L, -results) == LUA_TNUMBER) { + timeout = lua_tonumber(L, results); + } + } lua_pop(thread, results); break; default: // error @@ -141,8 +146,10 @@ namespace FINLua { * @LuaFunction bool poll() * @DisplayName Poll */)", poll) { + // TODO: Maybe return timeout + TOptional timeout; lua_State* thread; - int status = pollInternal(L, 1, thread); + int status = pollInternal(L, 1, thread, timeout); lua_pushboolean(L, status == LUA_OK); return 1; } @@ -214,20 +221,27 @@ namespace FINLua { int joinContinue(lua_State* L, int status, lua_KContext) { bool done = true; + TOptional finalTimeout; int num = lua_gettop(L); for (int i = 1; i <= num; ++i) { if (luaL_testudata(L, i, Future::_Name) == nullptr) continue; + TOptional timeout; lua_State* thread; - status = Future::pollInternal(L, i, thread); + status = Future::pollInternal(L, i, thread, timeout); if (status == LUA_OK) { lua_getiuservalue(L, i, 2); lua_replace(L, i); } else { done = false; + if (finalTimeout.IsSet()) { + finalTimeout = FMath::Min(*finalTimeout, *timeout); + } else { + finalTimeout = timeout; + } } } if (!done) { - return lua_yieldk(L, 0, NULL, joinContinue); + return luaFIN_yield(L, 0, NULL, joinContinue, finalTimeout); } return lua_gettop(L); } @@ -251,15 +265,14 @@ namespace FINLua { int luaSleepContinue(lua_State* L, int, lua_KContext) { double timeout = lua_tonumber(L, 1); double start = lua_tonumber(L, 2); - double millis = luaFIN_getKernel(L)->GetTimeSinceStart(); - if (millis - start < timeout*1000) { - return lua_yieldk(L, 0, NULL, luaSleepContinue); + double now = FPlatformTime::Seconds(); + if (now - start < timeout) { + return luaFIN_yield(L, 0, NULL, luaSleepContinue, start+timeout); } return 0; } int luaSleep(lua_State* L) { - double millis = luaFIN_getKernel(L)->GetTimeSinceStart(); - lua_pushnumber(L, millis); + lua_pushnumber(L, FPlatformTime::Seconds()); return luaSleepContinue(L, 0, NULL); } LuaModuleTableFunction(R"(/** @@ -469,8 +482,9 @@ namespace FINLua { } int luaFIN_await(lua_State* L, int index) { uint64 idx = lua_absindex(L, index); + TOptional timeout; lua_State* thread; - int status = FutureModule::Future::pollInternal(L, idx, thread); + int status = FutureModule::Future::pollInternal(L, idx, thread, timeout); if (thread == nullptr) { return luaL_error(L, "Tried to await on failed future"); } @@ -478,7 +492,7 @@ namespace FINLua { case LUA_OK: return FutureModule::Future::getInternal(L, idx); case LUA_YIELD: - return luaFIN_yield(L, 0, reinterpret_cast(reinterpret_cast(idx)), &awaitContinue); + return luaFIN_yield(L, 0, reinterpret_cast(reinterpret_cast(idx)), &awaitContinue, timeout); default: // error return -1; } @@ -507,8 +521,9 @@ namespace FINLua { int shift = 0; for (int i = 1; i <= len; ++i) { lua_geti(L, -1, i); + TOptional timeout; lua_State* thread; - int status = FutureModule::Future::pollInternal(L, -1, thread); + int status = FutureModule::Future::pollInternal(L, -1, thread, timeout); lua_pop(L, 1); if (status == LUA_OK) { shift += 1; diff --git a/Source/FicsItNetworksLua/Private/FINLua/LuaUtil.cpp b/Source/FicsItNetworksLua/Private/FINLua/LuaUtil.cpp index ae82ba634..2b746044c 100644 --- a/Source/FicsItNetworksLua/Private/FINLua/LuaUtil.cpp +++ b/Source/FicsItNetworksLua/Private/FINLua/LuaUtil.cpp @@ -343,9 +343,13 @@ namespace FINLua { return metaName; } - int luaFIN_yield(lua_State* L, int nresults, lua_KContext ctx, lua_KFunction kfunc) { - // insert a boolean to indicate a user executed yield - lua_pushboolean(L, true); + int luaFIN_yield(lua_State* L, int nresults, lua_KContext ctx, lua_KFunction kfunc, TOptional timeout) { + // insert timeout to indicate normal (non-hook) yield + if (timeout) { + lua_pushnumber(L, timeout.GetValue()); + } else { + lua_pushnil(L); + } lua_insert(L, -nresults - 1); return lua_yieldk(L, nresults+1, ctx, kfunc); diff --git a/Source/FicsItNetworksLua/Public/FINLua/FINLuaRuntime.h b/Source/FicsItNetworksLua/Public/FINLua/FINLuaRuntime.h index 14200623d..bde5bab8e 100644 --- a/Source/FicsItNetworksLua/Public/FINLua/FINLuaRuntime.h +++ b/Source/FicsItNetworksLua/Public/FINLua/FINLuaRuntime.h @@ -65,6 +65,7 @@ struct FFINLuaRuntime { TMap LoadedModules; TMap GlobalData; TMap GlobalPointers; + TOptional Timeout; FFINLuaRuntime(); ~FFINLuaRuntime(); diff --git a/Source/FicsItNetworksLua/Public/FINLua/LuaUtil.h b/Source/FicsItNetworksLua/Public/FINLua/LuaUtil.h index 6407196af..fcd27bd4b 100644 --- a/Source/FicsItNetworksLua/Public/FINLua/LuaUtil.h +++ b/Source/FicsItNetworksLua/Public/FINLua/LuaUtil.h @@ -94,7 +94,7 @@ namespace FINLua { /** * @brief Yields in a way the caller is continue execution and the yield does NOT get propagated. */ - int luaFIN_yield(lua_State* L, int nresults, lua_KContext ctx, lua_KFunction kfunc); + int luaFIN_yield(lua_State* L, int nresults, lua_KContext ctx, lua_KFunction kfunc, TOptional timeout); void luaFIN_pushFString(lua_State* L, const FString& str); FString luaFIN_checkFString(lua_State* L, int index); From 788185c461a6c6af8a90679b4105c368ac4de3bd Mon Sep 17 00:00:00 2001 From: Panakotta00 Date: Fri, 15 Nov 2024 01:11:24 +0100 Subject: [PATCH 18/33] fix: reflection: use proper FIRInstancedStruct Object reference collection --- Source/FicsItReflection/Private/FIRInstancedStruct.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/FicsItReflection/Private/FIRInstancedStruct.cpp b/Source/FicsItReflection/Private/FIRInstancedStruct.cpp index e3e170752..df489c93e 100644 --- a/Source/FicsItReflection/Private/FIRInstancedStruct.cpp +++ b/Source/FicsItReflection/Private/FIRInstancedStruct.cpp @@ -99,7 +99,7 @@ void FFIRInstancedStruct::AddStructReferencedObjects(FReferenceCollector& Collec UScriptStruct* ThisStruct = Struct; if (Struct) Collector.AddReferencedObject(ThisStruct); if (Struct && Data) { - if (Struct->GetCppStructOps()->HasAddStructReferencedObjects()) Struct->GetCppStructOps()->AddStructReferencedObjects()(Data, Collector); + Collector.AddPropertyReferencesWithStructARO(Struct, Data); } } From c20a51d0c1c938e4046e44f349afd0b179c1a90c Mon Sep 17 00:00:00 2001 From: Panakotta00 Date: Fri, 15 Nov 2024 03:46:23 +0100 Subject: [PATCH 19/33] fix: lua: fix problems with the new future timeouts & with attention ping --- .../Private/FINLua/API/LuaEventAPI.cpp | 30 ++++++++---- .../Private/FINLua/API/LuaWorldAPI.cpp | 12 +++-- .../Private/FINLua/FINLuaRuntime.cpp | 1 + .../Private/FINLua/LuaFuture.cpp | 47 +++++++++++++------ .../Private/FINLuaProcessor.cpp | 4 ++ .../Public/FINLua/LuaFuture.h | 2 +- 6 files changed, 66 insertions(+), 30 deletions(-) diff --git a/Source/FicsItNetworksLua/Private/FINLua/API/LuaEventAPI.cpp b/Source/FicsItNetworksLua/Private/FINLua/API/LuaEventAPI.cpp index a151c0467..d73f4e314 100644 --- a/Source/FicsItNetworksLua/Private/FINLua/API/LuaEventAPI.cpp +++ b/Source/FicsItNetworksLua/Private/FINLua/API/LuaEventAPI.cpp @@ -167,10 +167,9 @@ namespace FINLua { queue->Events.RemoveAt(0); return luaFIN_pushEventData(L, event.Sender, event.Data); } - IFINLuaEventSystem& eventSystem = luaFIN_getEventSystem(L); - double currentTime = eventSystem.TimeSinceStart(); + double currentTime = FPlatformTime::Seconds(); if (timeout > currentTime) { - return lua_yieldk(L, 0, NULL, luaPullContinue); + return luaFIN_yield(L, 0, NULL, luaPullContinue, timeout); } return 0; } @@ -179,9 +178,8 @@ namespace FINLua { * @DisplayName Pull */)", pull) { FEventQueue& queue = luaFIN_checkEventQueue(L, 1); - double timeout = luaL_checknumber(L, 2)*1000; - IFINLuaEventSystem& eventSystem = luaFIN_getEventSystem(L); - timeout += eventSystem.TimeSinceStart(); + double timeout = luaL_checknumber(L, 2); + timeout += FPlatformTime::Seconds(); lua_pop(L, 1); lua_pushnumber(L, timeout); return luaPullContinue(L, 0, NULL); @@ -197,7 +195,7 @@ namespace FINLua { return luaFIN_pushEventData(L, event.Sender, event.Data); } } - return lua_yieldk(L, 0, NULL, luaWaitForContinue); + return luaFIN_yield(L, 0, NULL, luaWaitForContinue, TNumericLimits::Max()); } int luaWaitFor(lua_State* L) { return luaWaitForContinue(L, 0, NULL); @@ -312,6 +310,8 @@ namespace FINLua { timeout += FPlatformTime::Seconds(); lua_pop(L, args); lua_pushnumber(L, timeout); + } else { + lua_pushnumber(L, TNumericLimits::Max()); } return luaPullContinue(L, 0, 0); } @@ -416,10 +416,18 @@ namespace FINLua { } int luaWaitForContinue(lua_State* L, int, lua_KContext) { + FFINLuaRuntime& runtime = luaFIN_getRuntime(L); + if (runtime.GetLuaThread() == L) { + IFINLuaEventSystem& eventSystem = luaFIN_getEventSystem(L); + TOptional> event = eventSystem.PullSignal(); + if (event) { + luaFIN_handleEvent(L, event->Key, event->Value); + } + } int key = luaL_checkinteger(L, 2); if (lua_geti(L, 1, key+1) == LUA_TNIL) { lua_pop(L, 1); - return lua_yieldk(L, 0, NULL, luaWaitForContinue); + return luaFIN_yield(L, 0, NULL, luaWaitForContinue, TNumericLimits::Max()); } lua_pushnil(L); lua_seti(L, 1, key+1); @@ -448,6 +456,7 @@ namespace FINLua { luaFIN_pushLuaFutureCFunction(L, luaWaitFor, 2); return 1; } + int luaLoopContinue(lua_State* L, int, lua_KContext) { while (true) { IFINLuaEventSystem& eventSystem = luaFIN_getEventSystem(L); @@ -456,9 +465,10 @@ namespace FINLua { const auto& [sender, signal] = *data; luaFIN_handleEvent(L, sender, signal); } - luaFIN_futureRun(L, 1); + TOptional timeout = TNumericLimits::Max(); + luaFIN_futureRun(L, 1, timeout); if (!data) { - return lua_yieldk(L, 0, 0, luaLoopContinue); + return luaFIN_yield(L, 0, 0, luaLoopContinue, timeout); } } } diff --git a/Source/FicsItNetworksLua/Private/FINLua/API/LuaWorldAPI.cpp b/Source/FicsItNetworksLua/Private/FINLua/API/LuaWorldAPI.cpp index 04fca785f..1c0990943 100644 --- a/Source/FicsItNetworksLua/Private/FINLua/API/LuaWorldAPI.cpp +++ b/Source/FicsItNetworksLua/Private/FINLua/API/LuaWorldAPI.cpp @@ -8,6 +8,8 @@ #include "FINLuaRuntime.h" #include "FINLuaThreadedRuntime.h" #include "LuaStruct.h" +#include "TimerManager.h" +#include "Async/Async.h" namespace FINLua { LuaModule(R"(/** @@ -74,10 +76,12 @@ namespace FINLua { AFGPlayerController* PlayerController = Cast(players->Get()); if (Player.IsSet() && PlayerController->GetPlayerState()->GetUserName() != *Player) continue; runtime.TickActions.Enqueue([PlayerController, Position]() { - UClass* Class = LoadObject(nullptr, TEXT("/Game/FactoryGame/Character/Player/BP_AttentionPingActor.BP_AttentionPingActor_C")); - AFGAttentionPingActor* PingActor = PlayerController->GetWorld()->SpawnActorDeferred(Class, FTransform(Position)); - PingActor->SetOwningPlayerState(PlayerController->GetPlayerState()); - PingActor->FinishSpawning(FTransform(Position)); + AsyncTask(ENamedThreads::GameThread, [PlayerController, Position]() { + UClass* Class = LoadObject(nullptr, TEXT("/Game/FactoryGame/Character/Player/BP_AttentionPingActor.BP_AttentionPingActor_C")); + AFGAttentionPingActor* PingActor = PlayerController->GetWorld()->SpawnActorDeferred(Class, FTransform(Position)); + PingActor->SetOwningPlayerState(PlayerController->GetPlayerState()); + PingActor->FinishSpawning(FTransform(Position)); + }); }); break; } diff --git a/Source/FicsItNetworksLua/Private/FINLua/FINLuaRuntime.cpp b/Source/FicsItNetworksLua/Private/FINLua/FINLuaRuntime.cpp index c55240259..d799f5176 100644 --- a/Source/FicsItNetworksLua/Private/FINLua/FINLuaRuntime.cpp +++ b/Source/FicsItNetworksLua/Private/FINLua/FINLuaRuntime.cpp @@ -67,6 +67,7 @@ void FFINLuaRuntime::Destroy() { lua_close(LuaState); } + Timeout.Reset(), LoadedModules.Empty(); GlobalData.Empty(); GlobalPointers.Empty(); diff --git a/Source/FicsItNetworksLua/Private/FINLua/LuaFuture.cpp b/Source/FicsItNetworksLua/Private/FINLua/LuaFuture.cpp index 332d88999..6a0fd884d 100644 --- a/Source/FicsItNetworksLua/Private/FINLua/LuaFuture.cpp +++ b/Source/FicsItNetworksLua/Private/FINLua/LuaFuture.cpp @@ -10,7 +10,7 @@ namespace FINLua { int lua_futureStruct(lua_State* L); int lua_futureStructContinue(lua_State* L, int, lua_KContext); int awaitContinue(lua_State* L, int, lua_KContext); - int luaFIN_futureRun(lua_State* L, int index); + int luaFIN_futureRun(lua_State* L, int index, TOptional& timeout); LuaModule(R"(/** * @LuaModule FutureModule @@ -130,8 +130,8 @@ namespace FINLua { break; } case LUA_YIELD: if (results > 0) { - if (lua_type(L, -results) == LUA_TNUMBER) { - timeout = lua_tonumber(L, results); + if (lua_type(thread, -results) == LUA_TNUMBER) { + timeout = lua_tonumber(thread, results); } } lua_pop(thread, results); @@ -143,7 +143,7 @@ namespace FINLua { return status; } LuaModuleTableFunction(R"(/** - * @LuaFunction bool poll() + * @LuaFunction bool,nil|number poll() * @DisplayName Poll */)", poll) { // TODO: Maybe return timeout @@ -151,7 +151,12 @@ namespace FINLua { lua_State* thread; int status = pollInternal(L, 1, thread, timeout); lua_pushboolean(L, status == LUA_OK); - return 1; + if (timeout) { + lua_pushnumber(L, *timeout); + } else { + lua_pushnil(L); + } + return 2; } LuaModuleTableFunction(R"(/** @@ -221,7 +226,7 @@ namespace FINLua { int joinContinue(lua_State* L, int status, lua_KContext) { bool done = true; - TOptional finalTimeout; + TOptional finalTimeout = TNumericLimits::Max(); int num = lua_gettop(L); for (int i = 1; i <= num; ++i) { if (luaL_testudata(L, i, Future::_Name) == nullptr) continue; @@ -233,10 +238,10 @@ namespace FINLua { lua_replace(L, i); } else { done = false; - if (finalTimeout.IsSet()) { + if (timeout.IsSet() && finalTimeout.IsSet()) { finalTimeout = FMath::Min(*finalTimeout, *timeout); } else { - finalTimeout = timeout; + finalTimeout.Reset(); } } } @@ -324,15 +329,22 @@ namespace FINLua { * * Runs the default task scheduler once. */)", run) { - int numTasksLeft = luaFIN_futureRun(L, lua_upvalueindex(2)); + TOptional timeout; + int numTasksLeft = luaFIN_futureRun(L, lua_upvalueindex(2), timeout); lua_pushinteger(L, numTasksLeft); - return 1; + if (timeout) { + lua_pushnumber(L, *timeout); + } else { + lua_pushnil(L); + } + return 2; } int luaLoopContinue(lua_State* L, int, lua_KContext) { - int numTasksLeft = luaFIN_futureRun(L, -1); + TOptional timeout = TNumericLimits::Max(); + int numTasksLeft = luaFIN_futureRun(L, -1, timeout); if (numTasksLeft > 0) { - return lua_yieldk(L, 0, NULL, &luaLoopContinue); + return luaFIN_yield(L, 0, NULL, &luaLoopContinue, timeout); } return 0; } @@ -509,7 +521,7 @@ namespace FINLua { lua_pop(L, 2); } - int luaFIN_futureRun(lua_State* L, int index) { + int luaFIN_futureRun(lua_State* L, int index, TOptional& timeout) { //lua_getglobal(L, "future"); int num = lua_gettop(L); if (lua_getfield(L, index, "tasks") != LUA_TTABLE) { @@ -521,10 +533,15 @@ namespace FINLua { int shift = 0; for (int i = 1; i <= len; ++i) { lua_geti(L, -1, i); - TOptional timeout; + TOptional timeoutResume; lua_State* thread; - int status = FutureModule::Future::pollInternal(L, -1, thread, timeout); + int status = FutureModule::Future::pollInternal(L, -1, thread, timeoutResume); lua_pop(L, 1); + if (timeoutResume.IsSet() && timeout.IsSet()) { + timeout = FMath::Min(*timeout, *timeoutResume); + } else { + timeout.Reset(); + } if (status == LUA_OK) { shift += 1; } else if (shift > 0) { diff --git a/Source/FicsItNetworksLua/Private/FINLuaProcessor.cpp b/Source/FicsItNetworksLua/Private/FINLuaProcessor.cpp index a081de3ce..141688e2f 100644 --- a/Source/FicsItNetworksLua/Private/FINLuaProcessor.cpp +++ b/Source/FicsItNetworksLua/Private/FINLuaProcessor.cpp @@ -142,6 +142,10 @@ void UFINLuaProcessor::SetKernel(UFINKernelSystem* InKernel) { Kernel = InKernel; } void UFINLuaProcessor::Tick(float InDelta) { + if (GetKernel()->GetNetwork()->GetSignalCount() > 0) { + Runtime.Runtime.Timeout.Reset(); + } + Runtime.Run(); switch (Runtime.GetStatus()) { diff --git a/Source/FicsItNetworksLua/Public/FINLua/LuaFuture.h b/Source/FicsItNetworksLua/Public/FINLua/LuaFuture.h index 7e2bcbc15..337a266c3 100644 --- a/Source/FicsItNetworksLua/Public/FINLua/LuaFuture.h +++ b/Source/FicsItNetworksLua/Public/FINLua/LuaFuture.h @@ -58,5 +58,5 @@ namespace FINLua { */ void luaFIN_addTask(lua_State* L, int index); - int luaFIN_futureRun(lua_State* L, int index); + int luaFIN_futureRun(lua_State* L, int index, TOptional& timeout); } From 68259c720e27b7dafb505d9421739bab5da14dc9 Mon Sep 17 00:00:00 2001 From: Roze Date: Sat, 16 Nov 2024 15:55:14 +0100 Subject: [PATCH 20/33] fix: Fixed bug causing crash when referencing unexported structs --- .../FicsItNetworks/Private/UI/FINReflectionUIContext.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Source/FicsItNetworks/Private/UI/FINReflectionUIContext.cpp b/Source/FicsItNetworks/Private/UI/FINReflectionUIContext.cpp index 06a864e8e..a4b37ccae 100644 --- a/Source/FicsItNetworks/Private/UI/FINReflectionUIContext.cpp +++ b/Source/FicsItNetworks/Private/UI/FINReflectionUIContext.cpp @@ -39,7 +39,13 @@ FString GetText(UFIRProperty* Prop) { return "Class"; case FIR_STRUCT: if (Cast(Prop)->Struct) { - return FString("Struct(") + FFicsItReflectionModule::Get().FindStruct(Cast(Prop)->Struct)->GetDisplayName().ToString() + ")"; + UFIRStructProperty* StructProperty = Cast(Prop); + UFIRStruct* FirStruct = FFicsItReflectionModule::Get().FindStruct(StructProperty->Struct); + if(IsValid(FirStruct)) { + return FString("Struct(") + FirStruct->GetDisplayName().ToString() + ")"; + }else { + return FString("InvalidStruct(") + StructProperty->Struct->GetName() + ")"; + } } return "Struct"; case FIR_TRACE: From 2d3b64c7a84fe7d92f106b3a3eba1845d62943c6 Mon Sep 17 00:00:00 2001 From: Panakotta00 Date: Fri, 15 Nov 2024 14:26:21 +0100 Subject: [PATCH 21/33] fix: lua: future poll timeout not working & add event poll to event queue functions --- .../Private/FINLua/API/LuaEventAPI.cpp | 34 +++++++++++++++---- .../Private/FINLua/LuaFuture.cpp | 3 +- 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/Source/FicsItNetworksLua/Private/FINLua/API/LuaEventAPI.cpp b/Source/FicsItNetworksLua/Private/FINLua/API/LuaEventAPI.cpp index d73f4e314..dedb820b2 100644 --- a/Source/FicsItNetworksLua/Private/FINLua/API/LuaEventAPI.cpp +++ b/Source/FicsItNetworksLua/Private/FINLua/API/LuaEventAPI.cpp @@ -160,6 +160,15 @@ namespace FINLua { } int luaPullContinue(lua_State* L, int, lua_KContext) { + FFINLuaRuntime& runtime = luaFIN_getRuntime(L); + if (runtime.GetLuaThread() == L) { + IFINLuaEventSystem& eventSystem = luaFIN_getEventSystem(L); + TOptional> event = eventSystem.PullSignal(); + if (event) { + luaFIN_handleEvent(L, event->Key, event->Value); + } + } + FEventQueue& queue = luaFIN_checkEventQueue(L, 1); double timeout = luaL_checknumber(L, 2); if (!queue->Events.IsEmpty()) { @@ -186,6 +195,14 @@ namespace FINLua { } int luaWaitForContinue(lua_State* L, int, lua_KContext) { + if (lua_toboolean(L, 3)) { + IFINLuaEventSystem& eventSystem = luaFIN_getEventSystem(L); + TOptional> event = eventSystem.PullSignal(); + if (event) { + luaFIN_handleEvent(L, event->Key, event->Value); + } + } + FEventQueue& queue = luaFIN_checkEventQueue(L, 1); TSharedRef filter = luaFIN_checkStruct(L, 2, false); while (!queue->Events.IsEmpty()) { @@ -206,11 +223,13 @@ namespace FINLua { * * Returns a Future that resolves when a signal got added to the queue that matches the given Event Filter. */)", waitFor) { + FFINLuaRuntime& runtime = luaFIN_getRuntime(L); FEventQueue& queue = luaFIN_checkEventQueue(L, 1); FFINEventFilterExpression filter = checkFilter(L, 2); lua_pushvalue(L, 1); luaFIN_pushStruct(L, filter); - luaFIN_pushLuaFutureCFunction(L, luaWaitFor, 2); + lua_pushboolean(L, runtime.GetLuaThread() == L); + luaFIN_pushLuaFutureCFunction(L, luaWaitFor, 3); return 1; } } @@ -416,8 +435,7 @@ namespace FINLua { } int luaWaitForContinue(lua_State* L, int, lua_KContext) { - FFINLuaRuntime& runtime = luaFIN_getRuntime(L); - if (runtime.GetLuaThread() == L) { + if (lua_toboolean(L, 3)) { IFINLuaEventSystem& eventSystem = luaFIN_getEventSystem(L); TOptional> event = eventSystem.PullSignal(); if (event) { @@ -431,10 +449,10 @@ namespace FINLua { } lua_pushnil(L); lua_seti(L, 1, key+1); - luaL_checktype(L, 3, LUA_TTABLE); - int len = luaL_len(L, 3); + luaL_checktype(L, 4, LUA_TTABLE); + int len = luaL_len(L, 4); for (int i = 1; i <= len; ++i) { - lua_geti(L, 3, i); + lua_geti(L, 4, i); } return len; } @@ -448,12 +466,14 @@ namespace FINLua { * Returns a Future that resolves when a signal got polled that matches the given Event Filter. */)", waitFor) { FFINEventFilterExpression filter = checkFilter(L, 1); + FFINLuaRuntime& runtime = luaFIN_getRuntime(L); TSharedPtr registry = luaFIN_getEventRegistry(L); int64 key = FFINLuaEventRegistry::FindNextKey(registry->OneShots); registry->OneShots.Add(key, filter); lua_getiuservalue(L, -1, 3); lua_pushinteger(L, key); - luaFIN_pushLuaFutureCFunction(L, luaWaitFor, 2); + lua_pushboolean(L, runtime.GetLuaThread() == L); + luaFIN_pushLuaFutureCFunction(L, luaWaitFor, 3); return 1; } diff --git a/Source/FicsItNetworksLua/Private/FINLua/LuaFuture.cpp b/Source/FicsItNetworksLua/Private/FINLua/LuaFuture.cpp index 6a0fd884d..6beaa7c71 100644 --- a/Source/FicsItNetworksLua/Private/FINLua/LuaFuture.cpp +++ b/Source/FicsItNetworksLua/Private/FINLua/LuaFuture.cpp @@ -130,8 +130,9 @@ namespace FINLua { break; } case LUA_YIELD: if (results > 0) { + luaFINDebug_dumpStack(L); if (lua_type(thread, -results) == LUA_TNUMBER) { - timeout = lua_tonumber(thread, results); + timeout = lua_tonumber(thread, -results); } } lua_pop(thread, results); From 79412d3a2f90cd2db513f7cd6196919a931bcbca Mon Sep 17 00:00:00 2001 From: Panakotta00 Date: Fri, 15 Nov 2024 14:27:19 +0100 Subject: [PATCH 22/33] fix: lua: remove findClass function --- .../Private/FINLua/LuaBaseModule.cpp | 42 ------------------- 1 file changed, 42 deletions(-) diff --git a/Source/FicsItNetworksLua/Private/FINLua/LuaBaseModule.cpp b/Source/FicsItNetworksLua/Private/FINLua/LuaBaseModule.cpp index 8f4213181..a789c682a 100644 --- a/Source/FicsItNetworksLua/Private/FINLua/LuaBaseModule.cpp +++ b/Source/FicsItNetworksLua/Private/FINLua/LuaBaseModule.cpp @@ -241,42 +241,6 @@ namespace FINLua { return 1; } - [[deprecated]] - int luaFindClass_DEPRECATED(lua_State* L) { - const int args = lua_gettop(L); - - luaFIN_warning(L, "Deprecated function call 'findClass', use 'classes' global library instead", false); - - for (int i = 1; i <= args; ++i) { - const bool isT = lua_istable(L, i); - - TArray ClassNames; - if (isT) { - const auto count = lua_rawlen(L, i); - for (int j = 1; j <= count; ++j) { - lua_geti(L, i, j); - if (!lua_isstring(L, -1)) return luaL_argerror(L, i, "array contains non-string"); - ClassNames.Add(lua_tostring(L, -1)); - lua_pop(L, 1); - } - lua_newtable(L); - } else { - if (!lua_isstring(L, i)) return luaL_argerror(L, i, "is not string"); - ClassNames.Add(lua_tostring(L, i)); - } - int j = 0; - for (const FString& ClassName : ClassNames) { - UFIRClass* Class = FFicsItReflectionModule::Get().FindClass(ClassName); - if (Class) luaFIN_pushClass(L, Class); - else lua_pushnil(L); - if (isT) lua_seti(L, -2, ++j); - UFILogLibrary::Log(FIL_Verbosity_Warning, FString::Printf(TEXT("Instead of 'findClass(\"%s\")' use 'classes.%s'"), *ClassName, *ClassName)); - } - } - - return args; - } - LuaModule(R"(/** * @LuaModule BaseModule * @DisplayName Base Module @@ -287,12 +251,6 @@ namespace FINLua { LuaModulePostSetup() { PersistenceNamespace("Base"); - #pragma warning( push ) - #pragma warning( disable : 4996 ) - lua_register(L, "findClass", luaFindClass_DEPRECATED); - PersistGlobal("findClass"); - #pragma warning( pop ) - luaopen_base(L); lua_pushnil(L); lua_setfield(L, -2, "collectgarbage"); From db25db9b6a9227a39b7d8fd2c9120b3ca1be8284 Mon Sep 17 00:00:00 2001 From: Panakotta00 Date: Fri, 15 Nov 2024 15:34:36 +0100 Subject: [PATCH 23/33] fix: lua: some of the new event pull stuff --- .../Private/FINLua/API/LuaEventAPI.cpp | 29 ++----------------- 1 file changed, 2 insertions(+), 27 deletions(-) diff --git a/Source/FicsItNetworksLua/Private/FINLua/API/LuaEventAPI.cpp b/Source/FicsItNetworksLua/Private/FINLua/API/LuaEventAPI.cpp index dedb820b2..14a7ae737 100644 --- a/Source/FicsItNetworksLua/Private/FINLua/API/LuaEventAPI.cpp +++ b/Source/FicsItNetworksLua/Private/FINLua/API/LuaEventAPI.cpp @@ -1,8 +1,10 @@ #include "LuaEventAPI.h" #include +#include #include "FicsItNetworksComputer.h" +#include "FicsItNetworksLuaModule.h" #include "FicsItReflection.h" #include "FINEventFilter.h" #include "FINLua/Reflection/LuaObject.h" @@ -160,15 +162,6 @@ namespace FINLua { } int luaPullContinue(lua_State* L, int, lua_KContext) { - FFINLuaRuntime& runtime = luaFIN_getRuntime(L); - if (runtime.GetLuaThread() == L) { - IFINLuaEventSystem& eventSystem = luaFIN_getEventSystem(L); - TOptional> event = eventSystem.PullSignal(); - if (event) { - luaFIN_handleEvent(L, event->Key, event->Value); - } - } - FEventQueue& queue = luaFIN_checkEventQueue(L, 1); double timeout = luaL_checknumber(L, 2); if (!queue->Events.IsEmpty()) { @@ -195,14 +188,6 @@ namespace FINLua { } int luaWaitForContinue(lua_State* L, int, lua_KContext) { - if (lua_toboolean(L, 3)) { - IFINLuaEventSystem& eventSystem = luaFIN_getEventSystem(L); - TOptional> event = eventSystem.PullSignal(); - if (event) { - luaFIN_handleEvent(L, event->Key, event->Value); - } - } - FEventQueue& queue = luaFIN_checkEventQueue(L, 1); TSharedRef filter = luaFIN_checkStruct(L, 2, false); while (!queue->Events.IsEmpty()) { @@ -228,7 +213,6 @@ namespace FINLua { FFINEventFilterExpression filter = checkFilter(L, 2); lua_pushvalue(L, 1); luaFIN_pushStruct(L, filter); - lua_pushboolean(L, runtime.GetLuaThread() == L); luaFIN_pushLuaFutureCFunction(L, luaWaitFor, 3); return 1; } @@ -435,13 +419,6 @@ namespace FINLua { } int luaWaitForContinue(lua_State* L, int, lua_KContext) { - if (lua_toboolean(L, 3)) { - IFINLuaEventSystem& eventSystem = luaFIN_getEventSystem(L); - TOptional> event = eventSystem.PullSignal(); - if (event) { - luaFIN_handleEvent(L, event->Key, event->Value); - } - } int key = luaL_checkinteger(L, 2); if (lua_geti(L, 1, key+1) == LUA_TNIL) { lua_pop(L, 1); @@ -466,13 +443,11 @@ namespace FINLua { * Returns a Future that resolves when a signal got polled that matches the given Event Filter. */)", waitFor) { FFINEventFilterExpression filter = checkFilter(L, 1); - FFINLuaRuntime& runtime = luaFIN_getRuntime(L); TSharedPtr registry = luaFIN_getEventRegistry(L); int64 key = FFINLuaEventRegistry::FindNextKey(registry->OneShots); registry->OneShots.Add(key, filter); lua_getiuservalue(L, -1, 3); lua_pushinteger(L, key); - lua_pushboolean(L, runtime.GetLuaThread() == L); luaFIN_pushLuaFutureCFunction(L, luaWaitFor, 3); return 1; } From 87c4f679dfbc8b730377a1df115c91790a3b7c6a Mon Sep 17 00:00:00 2001 From: Panakotta00 Date: Sat, 16 Nov 2024 02:10:43 +0100 Subject: [PATCH 24/33] feat: make network adapter max cables property defaults beeing used --- .../Private/FINNetworkAdapter.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/Source/FicsItNetworksCircuit/Private/FINNetworkAdapter.cpp b/Source/FicsItNetworksCircuit/Private/FINNetworkAdapter.cpp index 1fa4fef5d..1b307198d 100644 --- a/Source/FicsItNetworksCircuit/Private/FINNetworkAdapter.cpp +++ b/Source/FicsItNetworksCircuit/Private/FINNetworkAdapter.cpp @@ -80,8 +80,6 @@ bool AFINNetworkAdapter::FindConnection(AActor* Actor, FVector HitLocation, FTra auto Connector = Cast(FoundComponent); if(IsValid(Connector)) { OutMaxCables = Connector->MaxCables; - }else { - OutMaxCables = 1; } return true; } @@ -128,7 +126,7 @@ AFINNetworkAdapter::AFINNetworkAdapter() { ConnectorMesh = CreateDefaultSubobject(TEXT("StaticMesh")); ConnectorMesh->SetupAttachment(RootComponent); ConnectorMesh->SetCollisionEnabled(ECollisionEnabled::NoCollision); - + Connector->MaxCables = 1; } @@ -166,10 +164,10 @@ void AFINNetworkAdapter::BeginPlay() { FTransform ConnectorTransform; bool bMesh; - int MaxCables; - if (FindConnection(Parent, GetActorLocation(), ConnectorTransform, bMesh, MaxCables)) { + int maxCables = Connector->MaxCables; + if (FindConnection(Parent, GetActorLocation(), ConnectorTransform, bMesh, maxCables)) { SetActorTransform(ConnectorTransform); - Connector->MaxCables = MaxCables; + Connector->MaxCables = maxCables; ConnectorMesh->SetHiddenInGame(!bMesh, true); ConnectorMesh->SetInstanced(false); ConnectorMesh->SetInstanced(true); From 68c76d51b3fd734bda1bd193e5376de215685750 Mon Sep 17 00:00:00 2001 From: Panakotta00 Date: Sat, 16 Nov 2024 17:12:06 +0100 Subject: [PATCH 25/33] fix: lua: some event stuff issues --- .../Private/FINLua/API/LuaEventAPI.cpp | 10 +++++----- Source/FicsItNetworksLua/Private/FINLua/LuaFuture.cpp | 1 - 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/Source/FicsItNetworksLua/Private/FINLua/API/LuaEventAPI.cpp b/Source/FicsItNetworksLua/Private/FINLua/API/LuaEventAPI.cpp index 14a7ae737..7c98c81a5 100644 --- a/Source/FicsItNetworksLua/Private/FINLua/API/LuaEventAPI.cpp +++ b/Source/FicsItNetworksLua/Private/FINLua/API/LuaEventAPI.cpp @@ -213,7 +213,7 @@ namespace FINLua { FFINEventFilterExpression filter = checkFilter(L, 2); lua_pushvalue(L, 1); luaFIN_pushStruct(L, filter); - luaFIN_pushLuaFutureCFunction(L, luaWaitFor, 3); + luaFIN_pushLuaFutureCFunction(L, luaWaitFor, 2); return 1; } } @@ -426,10 +426,10 @@ namespace FINLua { } lua_pushnil(L); lua_seti(L, 1, key+1); - luaL_checktype(L, 4, LUA_TTABLE); - int len = luaL_len(L, 4); + luaL_checktype(L, 3, LUA_TTABLE); + int len = luaL_len(L, 3); for (int i = 1; i <= len; ++i) { - lua_geti(L, 4, i); + lua_geti(L, 3, i); } return len; } @@ -448,7 +448,7 @@ namespace FINLua { registry->OneShots.Add(key, filter); lua_getiuservalue(L, -1, 3); lua_pushinteger(L, key); - luaFIN_pushLuaFutureCFunction(L, luaWaitFor, 3); + luaFIN_pushLuaFutureCFunction(L, luaWaitFor, 2); return 1; } diff --git a/Source/FicsItNetworksLua/Private/FINLua/LuaFuture.cpp b/Source/FicsItNetworksLua/Private/FINLua/LuaFuture.cpp index 6beaa7c71..8b790b6ba 100644 --- a/Source/FicsItNetworksLua/Private/FINLua/LuaFuture.cpp +++ b/Source/FicsItNetworksLua/Private/FINLua/LuaFuture.cpp @@ -130,7 +130,6 @@ namespace FINLua { break; } case LUA_YIELD: if (results > 0) { - luaFINDebug_dumpStack(L); if (lua_type(thread, -results) == LUA_TNUMBER) { timeout = lua_tonumber(thread, -results); } From 09c514f7ee7264abe3f40b709d40e4642a392d4f Mon Sep 17 00:00:00 2001 From: Panakotta00 Date: Sat, 16 Nov 2024 17:58:21 +0100 Subject: [PATCH 26/33] feat: lua: add advanced hook yielding --- .../Private/FINLua/FINLuaRuntime.cpp | 36 ++++++++++++++++++- .../Private/FINLua/FINLuaThreadedRuntime.cpp | 11 +++++- .../Public/FINLua/FINLuaRuntime.h | 2 ++ .../Public/FINLua/FINLuaThreadedRuntime.h | 1 + 4 files changed, 48 insertions(+), 2 deletions(-) diff --git a/Source/FicsItNetworksLua/Private/FINLua/FINLuaRuntime.cpp b/Source/FicsItNetworksLua/Private/FINLua/FINLuaRuntime.cpp index d799f5176..b714772c3 100644 --- a/Source/FicsItNetworksLua/Private/FINLua/FINLuaRuntime.cpp +++ b/Source/FicsItNetworksLua/Private/FINLua/FINLuaRuntime.cpp @@ -182,8 +182,40 @@ FFINLuaRuntime& FINLua::luaFIN_getRuntime(lua_State* L) { return **(FFINLuaRuntime**)lua_getextraspace(L); } +void luaFIN_lastChanceTickHook(lua_State* L, lua_Debug*); + void luaFIN_tickHook(lua_State* L, lua_Debug*) { - lua_yield(L, 0); + FFINLuaRuntime& runtime = FINLua::luaFIN_getRuntime(L); + bool bShouldYield = true; + runtime.OnTickHook.Broadcast(bShouldYield); + if (!bShouldYield) return; + + if (lua_isyieldable(L)) { + lua_yield(L, 0); + } else { + if (!runtime.LastChance.IsSet()) { + runtime.LastChance = {{FPlatformTime::Seconds()+2, *runtime.Hook_Tick}}; + } + lua_sethook(L, luaFIN_lastChanceTickHook, LUA_MASKCOUNT, 1); + } +} + +void luaFIN_lastChanceTickHook(lua_State* L, lua_Debug*) { + FFINLuaRuntime& runtime = FINLua::luaFIN_getRuntime(L); + if (!runtime.LastChance.IsSet()) { + lua_sethook(L, luaFIN_tickHook, LUA_MASKCOUNT, runtime.Hook_Tick.Get(1)); + return; + } + if (lua_isyieldable(L)) { + runtime.LastChance.Reset(); + lua_yield(L, 0); + } else { + double now = FPlatformTime::Seconds(); + if (now >= runtime.LastChance->Key && --runtime.LastChance->Value <= 0) { + runtime.LastChance.Reset(); + luaL_error(L, "Timeout reached! Code took to long to leave un-yieldable C-Call Boundary."); + } + } } TOptional> FFINLuaRuntime::Tick() { @@ -218,6 +250,8 @@ TTuple FFINLuaRuntime::LuaTick() { OnPostLuaTick.Broadcast(status, results); + LastChance.Reset(); + if (status == LUA_YIELD) { Timeout.Reset(); if (results > 0) { diff --git a/Source/FicsItNetworksLua/Private/FINLua/FINLuaThreadedRuntime.cpp b/Source/FicsItNetworksLua/Private/FINLua/FINLuaThreadedRuntime.cpp index d08644fd3..2ab04e183 100644 --- a/Source/FicsItNetworksLua/Private/FINLua/FINLuaThreadedRuntime.cpp +++ b/Source/FicsItNetworksLua/Private/FINLua/FINLuaThreadedRuntime.cpp @@ -15,6 +15,11 @@ FFINLuaThreadedRuntime::FFINLuaThreadedRuntime() : LuaTask(FAsyncTaskbIsPromotedTick = false; }; - while (Runtime->ShouldRunInThread.Load() && Runtime->Runtime.TickActions.IsEmpty() && !Runtime->Runtime.Timeout.IsSet()) { + while (Runtime->ShouldThreadRun()) { TOptional> status = Runtime->Runtime.Tick(); if (Runtime->WaitForThread) { @@ -42,6 +47,10 @@ void FFINLuaTickRunnable::DoWork() { } } +bool FFINLuaThreadedRuntime::ShouldThreadRun() const { + return ShouldRunInThread.Load() && Runtime.TickActions.IsEmpty() && !Runtime.Timeout.IsSet() && !WaitForThread; +} + void FFINLuaThreadedRuntime::HandleWaitForGame() { if (WaitForGame) { TSharedPtr waitForGame = WaitForGame; diff --git a/Source/FicsItNetworksLua/Public/FINLua/FINLuaRuntime.h b/Source/FicsItNetworksLua/Public/FINLua/FINLuaRuntime.h index bde5bab8e..9c8a7f6d2 100644 --- a/Source/FicsItNetworksLua/Public/FINLua/FINLuaRuntime.h +++ b/Source/FicsItNetworksLua/Public/FINLua/FINLuaRuntime.h @@ -51,6 +51,7 @@ struct FFINLuaRuntime { TMulticastDelegate OnPostReset; TMulticastDelegate OnPreDestroy; TMulticastDelegate>&)> OnPreLuaTick; + TMulticastDelegate OnTickHook; TMulticastDelegate OnPostLuaTick; TMulticastDelegate PreLoadState; TMulticastDelegate PostLoadState; @@ -66,6 +67,7 @@ struct FFINLuaRuntime { TMap GlobalData; TMap GlobalPointers; TOptional Timeout; + TOptional> LastChance; FFINLuaRuntime(); ~FFINLuaRuntime(); diff --git a/Source/FicsItNetworksLua/Public/FINLua/FINLuaThreadedRuntime.h b/Source/FicsItNetworksLua/Public/FINLua/FINLuaThreadedRuntime.h index 01cf6cef7..0425a33ca 100644 --- a/Source/FicsItNetworksLua/Public/FINLua/FINLuaThreadedRuntime.h +++ b/Source/FicsItNetworksLua/Public/FINLua/FINLuaThreadedRuntime.h @@ -53,6 +53,7 @@ struct FFINLuaThreadedRuntime { // [Any Thread] void SetShouldBePromoted(bool bInShouldBePromoted) { ShouldRunInThread.Store(bInShouldBePromoted); } bool ShouldBePromoted() const { return ShouldRunInThread.Load(); } + bool ShouldThreadRun() const; // [Main Thead] void HandleWaitForGame(); From e32a71b5d753d408060b3f477465fb76f8f58c2a Mon Sep 17 00:00:00 2001 From: Panakotta00 Date: Sun, 17 Nov 2024 01:01:55 +0100 Subject: [PATCH 27/33] fix: lua function declaration syntax highlighting issue --- .../Private/UI/FINLuaSyntaxHighlighter.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/Source/FicsItNetworks/Private/UI/FINLuaSyntaxHighlighter.cpp b/Source/FicsItNetworks/Private/UI/FINLuaSyntaxHighlighter.cpp index 3afa7a514..42fa762c1 100644 --- a/Source/FicsItNetworks/Private/UI/FINLuaSyntaxHighlighter.cpp +++ b/Source/FicsItNetworks/Private/UI/FINLuaSyntaxHighlighter.cpp @@ -67,9 +67,17 @@ void FFINLuaSyntaxHighlighter::SetText(const FString& SourceString, FTextLayout& } case FIN_Lua_Token_Parenthesis: if (text == TEXT("(")) { - TSharedRef* prevRun = Algo::FindLastByPredicate(runs, [](const TSharedRef& run) { - return run->GetRunInfo().Name == TEXT("SyntaxHighlight.FINLua.Identifier"); - }); + TSharedRef* prevRun = nullptr; + for (int i = runs.Num(); i > 0; --i) { + TSharedRef& run = runs[i-1]; + if (run->GetRunInfo().Name == TEXT("SyntaxHighlight.FINLua.Identifier")) { + prevRun = &run; + break; + } + if (run->GetRunInfo().Name == TEXT("SyntaxHighlight.FINLua.Keyword")) { + break; + } + } if (prevRun) { TSharedRef& run = *prevRun; FTextBlockStyle style; From c17605085547364bff8d4de1784ba66e2337acaa Mon Sep 17 00:00:00 2001 From: Panakotta00 Date: Sun, 17 Nov 2024 01:25:14 +0100 Subject: [PATCH 28/33] fix: reflection: optimize factory connector hooks --- .../FicsItReflection/Private/FIRSubsystem.cpp | 19 +++++++++---------- .../Private/FicsItReflection.cpp | 9 +++------ Source/FicsItReflection/Public/FIRSubsystem.h | 4 ++-- 3 files changed, 14 insertions(+), 18 deletions(-) diff --git a/Source/FicsItReflection/Private/FIRSubsystem.cpp b/Source/FicsItReflection/Private/FIRSubsystem.cpp index af99b7212..59b8a5f06 100644 --- a/Source/FicsItReflection/Private/FIRSubsystem.cpp +++ b/Source/FicsItReflection/Private/FIRSubsystem.cpp @@ -95,19 +95,18 @@ void AFIRSubsystem::RemoveRailroadSwitchConnection(CallScope> AFIRSubsystem::GetFactoryConnectorSettings(UFGFactoryConnectionComponent* InConnector) { - FactoryConnectorSettingsMutex.Lock(); +TOptional, FFIRFactoryConnectorSettings&>> AFIRSubsystem::GetFactoryConnectorSettings(UFGFactoryConnectionComponent* InConnector) { + TSharedRef Lock = MakeShared(FactoryConnectorSettingsMutex, SLT_ReadOnly); FFIRFactoryConnectorSettings* Settings = FactoryConnectorSettings.Find(InConnector); if (Settings) { - return TOptional(TTuple(FactoryConnectorSettingsMutex, *Settings)); + return TOptional(TTuple, FFIRFactoryConnectorSettings&>(Lock, *Settings)); } else { - FactoryConnectorSettingsMutex.Unlock(); return {}; } } void AFIRSubsystem::SetFactoryConnectorAllowedItem(UFGFactoryConnectionComponent* InConnector, TSubclassOf InAllowedItem) { - FScopeLock ScopeLock(&FactoryConnectorSettingsMutex); + FRWScopeLock ScopeLock(FactoryConnectorSettingsMutex, SLT_Write); FFIRFactoryConnectorSettings* Settings = nullptr; if (InAllowedItem != nullptr) { Settings = &FactoryConnectorSettings.FindOrAdd(InConnector); @@ -121,7 +120,7 @@ void AFIRSubsystem::SetFactoryConnectorAllowedItem(UFGFactoryConnectionComponent } TSubclassOf AFIRSubsystem::GetFactoryConnectorAllowedItem(UFGFactoryConnectionComponent* InConnector) { - FScopeLock ScopeLock(&FactoryConnectorSettingsMutex); + FRWScopeLock ScopeLock(FactoryConnectorSettingsMutex, SLT_ReadOnly); FFIRFactoryConnectorSettings* Settings = FactoryConnectorSettings.Find(InConnector); if (Settings) { return Settings->AllowedItem; @@ -131,7 +130,7 @@ TSubclassOf AFIRSubsystem::GetFactoryConnectorAllowedItem(UFG } void AFIRSubsystem::SetFactoryConnectorBlocked(UFGFactoryConnectionComponent* InConnector, bool bInBlocked) { - FScopeLock ScopeLock(&FactoryConnectorSettingsMutex); + FRWScopeLock ScopeLock(FactoryConnectorSettingsMutex, SLT_Write); FFIRFactoryConnectorSettings* Settings = nullptr; if (bInBlocked) { Settings = &FactoryConnectorSettings.FindOrAdd(InConnector); @@ -145,13 +144,13 @@ void AFIRSubsystem::SetFactoryConnectorBlocked(UFGFactoryConnectionComponent* In } bool AFIRSubsystem::GetFactoryConnectorBlocked(UFGFactoryConnectionComponent* InConnector) { - FScopeLock ScopeLock(&FactoryConnectorSettingsMutex); + FRWScopeLock ScopeLock(FactoryConnectorSettingsMutex, SLT_ReadOnly); FFIRFactoryConnectorSettings* Settings = FactoryConnectorSettings.Find(InConnector); return Settings ? Settings->bBlocked : false; } int64 AFIRSubsystem::AddFactoryConnectorUnblockedTransfers(UFGFactoryConnectionComponent* InConnector, int64 InUnblockedTransfers) { - FScopeLock ScopeLock(&FactoryConnectorSettingsMutex); + FRWScopeLock ScopeLock(FactoryConnectorSettingsMutex, SLT_ReadOnly); FFIRFactoryConnectorSettings* Settings = FactoryConnectorSettings.Find(InConnector); if (Settings) { Settings->UnblockedTransfers = FMath::Max(0, Settings->UnblockedTransfers + InUnblockedTransfers); @@ -162,7 +161,7 @@ int64 AFIRSubsystem::AddFactoryConnectorUnblockedTransfers(UFGFactoryConnectionC } int64 AFIRSubsystem::GetFactoryConnectorUnblockedTransfers(UFGFactoryConnectionComponent* InConnector) { - FScopeLock ScopeLock(&FactoryConnectorSettingsMutex); + FRWScopeLock ScopeLock(FactoryConnectorSettingsMutex, SLT_ReadOnly); FFIRFactoryConnectorSettings* Settings = FactoryConnectorSettings.Find(InConnector); if (Settings) { return Settings->UnblockedTransfers; diff --git a/Source/FicsItReflection/Private/FicsItReflection.cpp b/Source/FicsItReflection/Private/FicsItReflection.cpp index 1395c5e15..59725dd93 100644 --- a/Source/FicsItReflection/Private/FicsItReflection.cpp +++ b/Source/FicsItReflection/Private/FicsItReflection.cpp @@ -45,7 +45,7 @@ void UFGFactoryConnectionComponent_PeekOutput_Hook(CallScope> OptionalSettings = reflectionSubsystem->GetFactoryConnectorSettings(self); + TOptional, FFIRFactoryConnectorSettings&>> OptionalSettings = reflectionSubsystem->GetFactoryConnectorSettings(self); if (OptionalSettings.IsSet()) { FFIRFactoryConnectorSettings& Settings = OptionalSettings.GetValue().Value; if ((Settings.bBlocked && Settings.UnblockedTransfers == 0) || (Settings.AllowedItem != nullptr && Settings.AllowedItem != type)) { @@ -53,7 +53,6 @@ void UFGFactoryConnectionComponent_PeekOutput_Hook(CallScope> OptionalSettings = AFIRSubsystem::GetReflectionSubsystem(self)->GetFactoryConnectorSettings(self); + TOptional, FFIRFactoryConnectorSettings&>> OptionalSettings = AFIRSubsystem::GetReflectionSubsystem(self)->GetFactoryConnectorSettings(self); if (OptionalSettings.IsSet()) { FFIRFactoryConnectorSettings& Settings = OptionalSettings.GetValue().Value; if ((Settings.bBlocked && Settings.UnblockedTransfers == 0) || (Settings.AllowedItem != nullptr && type != nullptr && Settings.AllowedItem != type)) { @@ -71,12 +70,11 @@ void UFGFactoryConnectionComponent_GrabOutput_Hook(CallScope)>& Scope, UFGFactoryConnectionComponent* self, FInventoryItem& out_item, TSubclassOf type) { - TOptional> OptionalSettings = AFIRSubsystem::GetReflectionSubsystem(self)->GetFactoryConnectorSettings(self); + TOptional, FFIRFactoryConnectorSettings&>> OptionalSettings = AFIRSubsystem::GetReflectionSubsystem(self)->GetFactoryConnectorSettings(self); if (OptionalSettings.IsSet()) { FFIRFactoryConnectorSettings& Settings = OptionalSettings.GetValue().Value; if ((Settings.bBlocked && Settings.UnblockedTransfers == 0) || (Settings.AllowedItem != nullptr && type != nullptr && Settings.AllowedItem != type)) { @@ -85,7 +83,6 @@ void UFGFactoryConnectionComponent_InternalGrabOutputInventory_Hook(CallScope& Scope, UFGRailroadTrackConnectionComponent* Switch, UFGRailroadTrackConnectionComponent* Connection); void RemoveRailroadSwitchConnection(CallScope& Scope, UFGRailroadTrackConnectionComponent* Switch, UFGRailroadTrackConnectionComponent* Connection); - TOptional> GetFactoryConnectorSettings(UFGFactoryConnectionComponent* InConnector); + TOptional, FFIRFactoryConnectorSettings&>> GetFactoryConnectorSettings(UFGFactoryConnectionComponent* InConnector); void SetFactoryConnectorAllowedItem(UFGFactoryConnectionComponent* InConnector, TSubclassOf InAllowedItem); TSubclassOf GetFactoryConnectorAllowedItem(UFGFactoryConnectionComponent* InConnector); void SetFactoryConnectorBlocked(UFGFactoryConnectionComponent* InConnector, bool bInBlocked); @@ -80,7 +80,7 @@ class FICSITREFLECTION_API AFIRSubsystem : public AModSubsystem, public IFGSaveI UPROPERTY(SaveGame) TMap ForcedRailroadSwitches; - FCriticalSection FactoryConnectorSettingsMutex; + FRWLock FactoryConnectorSettingsMutex; UPROPERTY(SaveGame) TMap FactoryConnectorSettings; }; \ No newline at end of file From d12561cd4c9895b0622769b452a2258991a8ae8b Mon Sep 17 00:00:00 2001 From: Panakotta00 Date: Sun, 17 Nov 2024 22:03:52 +0100 Subject: [PATCH 29/33] fix: some include cleanup --- .../FicsItNetworks/Private/Components/FINSizeablePanel.cpp | 2 +- Source/FicsItNetworks/Private/UI/FINLuaSyntaxHighlighter.cpp | 3 +-- Source/FicsItNetworksLua/Private/FINLua/API/LuaEventAPI.cpp | 5 +---- Source/FicsItNetworksLua/Private/FINLua/FINLuaRuntime.cpp | 2 -- Source/FicsItNetworksLua/Private/FINLua/LuaMiscModules.cpp | 1 - Source/FicsItNetworksLua/Private/FINLuaRCO.cpp | 3 --- Source/FicsItNetworksLua/Private/FINLuaReflecion.cpp | 2 +- Source/FicsItNetworksLua/Public/FINLua/LuaUtil.h | 1 - Source/FicsItNetworksLua/Public/FINLuaProcessor.h | 1 - 9 files changed, 4 insertions(+), 16 deletions(-) diff --git a/Source/FicsItNetworks/Private/Components/FINSizeablePanel.cpp b/Source/FicsItNetworks/Private/Components/FINSizeablePanel.cpp index 01c6e6642..5196c9ba7 100644 --- a/Source/FicsItNetworks/Private/Components/FINSizeablePanel.cpp +++ b/Source/FicsItNetworks/Private/Components/FINSizeablePanel.cpp @@ -65,7 +65,7 @@ void AFINSizeablePanel::EndPlay(const EEndPlayReason::Type endPlayReason) { int32 AFINSizeablePanel::GetDismantleRefundReturnsMultiplier() const { //return FMath::Abs(PanelWidth) * FMath::Abs(PanelHeight); - return FGenericPlatformMath::Max((FMath::Abs(PanelWidth) * FMath::Abs(PanelHeight)) / 10, 1); + return FMath::Max((FMath::Abs(PanelWidth) * FMath::Abs(PanelHeight)) / 10, 1); } bool AFINSizeablePanel::ShouldSave_Implementation() const { diff --git a/Source/FicsItNetworks/Private/UI/FINLuaSyntaxHighlighter.cpp b/Source/FicsItNetworks/Private/UI/FINLuaSyntaxHighlighter.cpp index 42fa762c1..fb782eb54 100644 --- a/Source/FicsItNetworks/Private/UI/FINLuaSyntaxHighlighter.cpp +++ b/Source/FicsItNetworks/Private/UI/FINLuaSyntaxHighlighter.cpp @@ -1,5 +1,4 @@ -#include "FindLast.h" -#include "FINLuaSyntax.h" +#include "FINLuaSyntax.h" #include "FINLuaCodeEditor.h" #include "Framework/Text/IRun.h" #include "Framework/Text/TextLayout.h" diff --git a/Source/FicsItNetworksLua/Private/FINLua/API/LuaEventAPI.cpp b/Source/FicsItNetworksLua/Private/FINLua/API/LuaEventAPI.cpp index 7c98c81a5..5ae29fffd 100644 --- a/Source/FicsItNetworksLua/Private/FINLua/API/LuaEventAPI.cpp +++ b/Source/FicsItNetworksLua/Private/FINLua/API/LuaEventAPI.cpp @@ -1,8 +1,5 @@ #include "LuaEventAPI.h" -#include -#include - #include "FicsItNetworksComputer.h" #include "FicsItNetworksLuaModule.h" #include "FicsItReflection.h" @@ -266,7 +263,7 @@ namespace FINLua { TArray Listening = eventSystem.Listening(); int i = 0; lua_newtable(L); - for (const FFIRTrace Obj : Listening) { + for (const FFIRTrace& Obj : Listening) { luaFIN_pushObject(L, Obj); lua_seti(L, -2, ++i); } diff --git a/Source/FicsItNetworksLua/Private/FINLua/FINLuaRuntime.cpp b/Source/FicsItNetworksLua/Private/FINLua/FINLuaRuntime.cpp index b714772c3..868500eb5 100644 --- a/Source/FicsItNetworksLua/Private/FINLua/FINLuaRuntime.cpp +++ b/Source/FicsItNetworksLua/Private/FINLua/FINLuaRuntime.cpp @@ -5,8 +5,6 @@ #include "FicsItNetworksLuaModule.h" #include "FINLuaModule.h" #include "FINLuaRuntimePersistence.h" -#include "OnlineErrorDefinitions.h" -#include "ScopeExit.h" #include "Union.h" void luaWarnF(void* ud, const char* msg, int tocont) { diff --git a/Source/FicsItNetworksLua/Private/FINLua/LuaMiscModules.cpp b/Source/FicsItNetworksLua/Private/FINLua/LuaMiscModules.cpp index 5e875df5a..2bf12aff6 100644 --- a/Source/FicsItNetworksLua/Private/FINLua/LuaMiscModules.cpp +++ b/Source/FicsItNetworksLua/Private/FINLua/LuaMiscModules.cpp @@ -5,7 +5,6 @@ #include "FINLuaThreadedRuntime.h" #include "FINNetworkUtils.h" #include "LuaFileSystemAPI.h" -#include "LuaObject.h" #include "LuaPersistence.h" namespace FINLua { diff --git a/Source/FicsItNetworksLua/Private/FINLuaRCO.cpp b/Source/FicsItNetworksLua/Private/FINLuaRCO.cpp index f3c459bae..09b664657 100644 --- a/Source/FicsItNetworksLua/Private/FINLuaRCO.cpp +++ b/Source/FicsItNetworksLua/Private/FINLuaRCO.cpp @@ -1,10 +1,7 @@ #include "FINLuaRCO.h" -#include "FGInventoryComponent.h" #include "FGPlayerController.h" #include "FINComputerEEPROMDesc.h" -#include "FINComputerRCO.h" -#include "FINItemStateEEPROMText.h" #include "Engine/World.h" #include "Net/UnrealNetwork.h" diff --git a/Source/FicsItNetworksLua/Private/FINLuaReflecion.cpp b/Source/FicsItNetworksLua/Private/FINLuaReflecion.cpp index b8ee023ad..ead54cede 100644 --- a/Source/FicsItNetworksLua/Private/FINLuaReflecion.cpp +++ b/Source/FicsItNetworksLua/Private/FINLuaReflecion.cpp @@ -1,6 +1,6 @@ #include "FicsItReflection.h" #include "FINEventFilter.h" -#include "FicsItReflection/Public/Reflection/Source/FIRSourceStaticMacros.h" +#include "Reflection/Source/FIRSourceStaticMacros.h" BeginStruct(FFINEventFilterExpression, "EventFilter", "Event Filter", "This struct contains filter settings so you can evaluate if a sent signal matches the filter or not.") BeginFuncVA(matches, "Matches", "Returns true if the given signal data matches this event filter.") { diff --git a/Source/FicsItNetworksLua/Public/FINLua/LuaUtil.h b/Source/FicsItNetworksLua/Public/FINLua/LuaUtil.h index fcd27bd4b..b459f8b7a 100644 --- a/Source/FicsItNetworksLua/Public/FINLua/LuaUtil.h +++ b/Source/FicsItNetworksLua/Public/FINLua/LuaUtil.h @@ -3,7 +3,6 @@ #include "FILLogScope.h" #include "FINLua.h" #include "FIRTypes.h" -#include "Serialization/CompactBinaryWriter.h" class UFIRProperty; class UFIRStruct; diff --git a/Source/FicsItNetworksLua/Public/FINLuaProcessor.h b/Source/FicsItNetworksLua/Public/FINLuaProcessor.h index b90d21e8e..633529ee3 100644 --- a/Source/FicsItNetworksLua/Public/FINLuaProcessor.h +++ b/Source/FicsItNetworksLua/Public/FINLuaProcessor.h @@ -3,7 +3,6 @@ #include "CoreMinimal.h" #include "AsyncWork.h" #include "FINLuaReferenceCollector.h" -#include "FINLuaRuntime.h" #include "FINLuaRuntimePersistence.h" #include "FINLuaThreadedRuntime.h" #include "Future.h" From 500dfdf967c2bdea42d7439d5a80a92281e31442 Mon Sep 17 00:00:00 2001 From: Panakotta00 Date: Sun, 17 Nov 2024 23:58:33 +0000 Subject: [PATCH 30/33] docs: Automatic Documentation Update --- docs/modules/ROOT/nav.adoc | 14 +- .../ROOT/pages/lua/api/BaseModule.adoc | 6 + .../{Component.adoc => ComponentModule.adoc} | 6 + .../ROOT/pages/lua/api/ComputerModule.adoc | 46 +++++ .../lua/api/{Debug.adoc => DebugModule.adoc} | 0 .../lua/api/{Event.adoc => EventModule.adoc} | 2 +- .../ROOT/pages/lua/api/FileSystem.adoc | 96 ---------- .../pages/lua/api/FullReflectionModule.adoc | 11 ++ .../ROOT/pages/lua/api/FutureModule.adoc | 8 +- .../api/{Computer.adoc => KernelModule.adoc} | 165 +++++++----------- .../modules/ROOT/pages/lua/api/LogModule.adoc | 34 ++++ .../pages/lua/api/ThreadedRuntimeModule.adoc | 35 ++++ .../ROOT/pages/lua/api/WorldModule.adoc | 75 ++++++++ 13 files changed, 291 insertions(+), 207 deletions(-) create mode 100644 docs/modules/ROOT/pages/lua/api/BaseModule.adoc rename docs/modules/ROOT/pages/lua/api/{Component.adoc => ComponentModule.adoc} (95%) create mode 100644 docs/modules/ROOT/pages/lua/api/ComputerModule.adoc rename docs/modules/ROOT/pages/lua/api/{Debug.adoc => DebugModule.adoc} (100%) rename docs/modules/ROOT/pages/lua/api/{Event.adoc => EventModule.adoc} (98%) create mode 100644 docs/modules/ROOT/pages/lua/api/FullReflectionModule.adoc rename docs/modules/ROOT/pages/lua/api/{Computer.adoc => KernelModule.adoc} (54%) create mode 100644 docs/modules/ROOT/pages/lua/api/LogModule.adoc create mode 100644 docs/modules/ROOT/pages/lua/api/ThreadedRuntimeModule.adoc create mode 100644 docs/modules/ROOT/pages/lua/api/WorldModule.adoc diff --git a/docs/modules/ROOT/nav.adoc b/docs/modules/ROOT/nav.adoc index 9f7339944..6986ac9e4 100644 --- a/docs/modules/ROOT/nav.adoc +++ b/docs/modules/ROOT/nav.adoc @@ -49,17 +49,23 @@ ** xref:lua/Events.adoc[Events] ** APIs // FINLuaDocumentationBegin *** // -*** xref:lua/api/Component.adoc[Component] -*** xref:lua/api/Computer.adoc[Computer] -*** xref:lua/api/Debug.adoc[Debug] -*** xref:lua/api/Event.adoc[Event] +*** xref:lua/api/BaseModule.adoc[BaseModule] +*** xref:lua/api/ComponentModule.adoc[ComponentModule] +*** xref:lua/api/ComputerModule.adoc[ComputerModule] +*** xref:lua/api/DebugModule.adoc[DebugModule] +*** xref:lua/api/EventModule.adoc[EventModule] *** xref:lua/api/FileSystem.adoc[FileSystem] +*** xref:lua/api/FullReflectionModule.adoc[FullReflectionModule] *** xref:lua/api/FutureModule.adoc[FutureModule] +*** xref:lua/api/KernelModule.adoc[KernelModule] +*** xref:lua/api/LogModule.adoc[LogModule] *** xref:lua/api/ModuleSystem.adoc[ModuleSystem] *** xref:lua/api/ReflectionSystemBaseModule.adoc[ReflectionSystemBaseModule] *** xref:lua/api/ReflectionSystemClassModule.adoc[ReflectionSystemClassModule] *** xref:lua/api/ReflectionSystemObjectModule.adoc[ReflectionSystemObjectModule] *** xref:lua/api/ReflectionSystemStructModule.adoc[ReflectionSystemStructModule] +*** xref:lua/api/ThreadedRuntimeModule.adoc[ThreadedRuntimeModule] +*** xref:lua/api/WorldModule.adoc[WorldModule] // FINLuaDocumentationEnd // ** xref:lua/examples/index.adoc[Examples] *** xref:lua/examples/multiThreading.adoc[Multi Threading] diff --git a/docs/modules/ROOT/pages/lua/api/BaseModule.adoc b/docs/modules/ROOT/pages/lua/api/BaseModule.adoc new file mode 100644 index 000000000..ed67b8b1e --- /dev/null +++ b/docs/modules/ROOT/pages/lua/api/BaseModule.adoc @@ -0,0 +1,6 @@ += Base Module +:table-caption!: + +This module provides based functionallity to the Lua runtime. +Inluding base Lua Libraries (table, math, coroutine, etc). + diff --git a/docs/modules/ROOT/pages/lua/api/Component.adoc b/docs/modules/ROOT/pages/lua/api/ComponentModule.adoc similarity index 95% rename from docs/modules/ROOT/pages/lua/api/Component.adoc rename to docs/modules/ROOT/pages/lua/api/ComponentModule.adoc index 29baaad59..c195d6d7f 100644 --- a/docs/modules/ROOT/pages/lua/api/Component.adoc +++ b/docs/modules/ROOT/pages/lua/api/ComponentModule.adoc @@ -3,6 +3,12 @@ The Component Module contains the component Library. +[cols="1,5a",separator="!"] +!=== +!Dependencies +! xref:/lua/api/FullReflectionModule.adoc[FullReflectionModule] +!=== + == Globals === **component** diff --git a/docs/modules/ROOT/pages/lua/api/ComputerModule.adoc b/docs/modules/ROOT/pages/lua/api/ComputerModule.adoc new file mode 100644 index 000000000..fd7da033f --- /dev/null +++ b/docs/modules/ROOT/pages/lua/api/ComputerModule.adoc @@ -0,0 +1,46 @@ += Computer Module +:table-caption!: + +The Computer Module provides the Computer Library. + +== Globals + +=== **computer** +The Computer Library provides functions for interaction with the computer and especially the Lua Runtime. + +=== __computer.__**magicTime** () -> (int, string, string) +Returns some kind of strange/mysterious time data from a unknown place (the real life). + +[%collapsible] +==== +.Return Values +[%header,cols="1,1,4a",separator="!"] +!=== +!Name !Type !Description + +! *Unix* `unix` +! int +! Unix Timestamp + +! *Culture Time* `cultureTime` +! string +! The time as text with the culture format used by the Host + +! *ISO 8601* `iso8601` +! string +! The time as a Date-Time-Stamp after ISO 8601 + +!=== +==== + +=== __computer.__**reset** () +Stops the current code execution immediately and queues the system to restart in the next tick. + +=== __computer.__**skip** () +This function can be used to skip the current lua tick prematurely. +Mostly for people who want to optimize their games runtime performance. + +=== __computer.__**stop** () +Stops the current code execution. + +Basically kills the PC runtime immediately. + diff --git a/docs/modules/ROOT/pages/lua/api/Debug.adoc b/docs/modules/ROOT/pages/lua/api/DebugModule.adoc similarity index 100% rename from docs/modules/ROOT/pages/lua/api/Debug.adoc rename to docs/modules/ROOT/pages/lua/api/DebugModule.adoc diff --git a/docs/modules/ROOT/pages/lua/api/Event.adoc b/docs/modules/ROOT/pages/lua/api/EventModule.adoc similarity index 98% rename from docs/modules/ROOT/pages/lua/api/Event.adoc rename to docs/modules/ROOT/pages/lua/api/EventModule.adoc index 0672006b3..8860d018a 100644 --- a/docs/modules/ROOT/pages/lua/api/Event.adoc +++ b/docs/modules/ROOT/pages/lua/api/EventModule.adoc @@ -93,7 +93,7 @@ a Task will be created using the function and the signals parameters will be pas === __event.__**waitFor** (xref:/reflection/structs/EventFilter.adoc[EventFilter]) -> xref:/reflection/structs/Future.adoc[Future] Returns a Future that resolves when a signal got polled that matches the given Event Filter. -=== __event.__**queue** (xref:/reflection/structs/EventFilter.adoc[EventFilter]) -> xref:/lua/api/Event.adoc#_eventqueue[EventQueue] +=== __event.__**queue** (xref:/reflection/structs/EventFilter.adoc[EventFilter]) -> xref:/lua/api/EventModule.adoc#_eventqueue[EventQueue] Creates a new event queue. When this variable closes or gets garbage collected, it will stop receiving signals. diff --git a/docs/modules/ROOT/pages/lua/api/FileSystem.adoc b/docs/modules/ROOT/pages/lua/api/FileSystem.adoc index d6ef6d8b5..392c8c6e5 100644 --- a/docs/modules/ROOT/pages/lua/api/FileSystem.adoc +++ b/docs/modules/ROOT/pages/lua/api/FileSystem.adoc @@ -75,34 +75,6 @@ Returns the result of the execute function or what ever it yielded === __filesystem.__**exists** (path: string) -> bool Returns true if the given path exists. -=== __filesystem.__**initFileSystem** (path: string) -> bool -Trys to mount the system DevDevice to the given location. -The DevDevice is special Device holding DeviceNodes for all filesystems added to the system. (like TmpFS and drives). It is unmountable as well as getting mounted a seccond time. - -[%collapsible] -==== -.Parameters -[%header,cols="1,1,4a",separator="!"] -!=== -!Name !Type !Description - -! *Path* `path` -! string -! path to the mountpoint were the dev device should get mounted to - -!=== -.Return Values -[%header,cols="1,1,4a",separator="!"] -!=== -!Name !Type !Description - -! *Success* `success` -! bool -! returns if it was able to mount the DevDevice - -!=== -==== - === __filesystem.__**isDir** (path: string) -> bool Returns true if the given path refers to directory. @@ -116,46 +88,6 @@ For each given string, returns a bool to tell if string is a valid node (file/fo Loads the file refered by the given path as a Lua function and returns it. Functions fails if path doesn¬タルt exist or path doesn¬タルt reger to a file. -=== __filesystem.__**makeFileSystem** (type: string, name: string) -> bool -Trys to create a new file system of the given type with the given name. -The created filesystem will be added to the system DevDevice. - -.Possible Types: -[%collapsible] -==== -* `tmpfs` -+ -A temporary filesystem only existing at runtime in the memory of your computer. All data will be lost when the system stops. -==== - -[%collapsible] -==== -.Parameters -[%header,cols="1,1,4a",separator="!"] -!=== -!Name !Type !Description - -! *Type* `type` -! string -! the type of the new filesystem - -! *Name* `name` -! string -! the name of the new filesystem you want to create - -!=== -.Return Values -[%header,cols="1,1,4a",separator="!"] -!=== -!Name !Type !Description - -! *Success* `success` -! bool -! returns true if it was able to create the new filesystem - -!=== -==== - === __filesystem.__**meta** (string...) -> string... Returns for each given string path, a table that defines contains some meta information about node the string references. @@ -348,34 +280,6 @@ Removes the filesystem object at the given path. !=== ==== -=== __filesystem.__**removeFileSystem** (name: string) -> bool -Tries to remove the filesystem with the given name from the system DevDevice. -All mounts of the device will run invalid. - -[%collapsible] -==== -.Parameters -[%header,cols="1,1,4a",separator="!"] -!=== -!Name !Type !Description - -! *Name* `name` -! string -! the name of the new filesystem you want to remove - -!=== -.Return Values -[%header,cols="1,1,4a",separator="!"] -!=== -!Name !Type !Description - -! *Success* `success` -! bool -! returns true if it was able to remove the new filesystem - -!=== -==== - === __filesystem.__**rename** (path: string, name: string) -> bool Renames the filesystem object at the given path to the given name. diff --git a/docs/modules/ROOT/pages/lua/api/FullReflectionModule.adoc b/docs/modules/ROOT/pages/lua/api/FullReflectionModule.adoc new file mode 100644 index 000000000..535cb2869 --- /dev/null +++ b/docs/modules/ROOT/pages/lua/api/FullReflectionModule.adoc @@ -0,0 +1,11 @@ += Reflection-System Base Module +:table-caption!: + +This Module is used as dependency to depend on the entire Reflection System related stuff. + +[cols="1,5a",separator="!"] +!=== +!Dependencies +! xref:/lua/api/ReflectionSystemObjectModule.adoc[ReflectionSystemObjectModule], xref:/lua/api/ReflectionSystemClassModule.adoc[ReflectionSystemClassModule], xref:/lua/api/ReflectionSystemStructModule.adoc[ReflectionSystemStructModule] +!=== + diff --git a/docs/modules/ROOT/pages/lua/api/FutureModule.adoc b/docs/modules/ROOT/pages/lua/api/FutureModule.adoc index 637bd990b..7e72b0887 100644 --- a/docs/modules/ROOT/pages/lua/api/FutureModule.adoc +++ b/docs/modules/ROOT/pages/lua/api/FutureModule.adoc @@ -3,6 +3,12 @@ This Module provides the Future type and all its necessary functionallity. +[cols="1,5a",separator="!"] +!=== +!Dependencies +! xref:/lua/api/KernelModule.adoc[KernelModule] +!=== + == Globals === **async** : @@ -79,7 +85,7 @@ Blocks the current thread/future until the given amount of time passed === __Future.__**get** () -=== __Future.__**poll** () -> bool +=== __Future.__**poll** () -> bool,nil|number === **FutureStruct** diff --git a/docs/modules/ROOT/pages/lua/api/Computer.adoc b/docs/modules/ROOT/pages/lua/api/KernelModule.adoc similarity index 54% rename from docs/modules/ROOT/pages/lua/api/Computer.adoc rename to docs/modules/ROOT/pages/lua/api/KernelModule.adoc index 835641bbc..c9dcbd732 100644 --- a/docs/modules/ROOT/pages/lua/api/Computer.adoc +++ b/docs/modules/ROOT/pages/lua/api/KernelModule.adoc @@ -1,7 +1,7 @@ -= Computer Module += Kernel Module :table-caption!: -The Computer Module provides the Computer Library. +This Module provides an interface for other Modules to interact with the Kernel. [cols="1,5a",separator="!"] !=== @@ -12,35 +12,11 @@ The Computer Module provides the Computer Library. == Globals === **computer** -The Computer Library provides functions for interaction with the computer and especially the Lua Runtime. -=== __computer.__**attentionPing** (position: xref:/reflection/structs/Vector.adoc[Vector], [username: string]) -Allows to send a World Marker/Attention Ping for all or the given user. - -[%collapsible] -==== -.Parameters -[%header,cols="1,1,4a",separator="!"] -!=== -!Name !Type !Description - -! *Position* `position` -! xref:/reflection/classes/Struct.adoc[Struct] -! The position in the world where the ping should occur - -! *Username* `username` -! string -! The username of the user you want to ping. - -!=== -==== === __computer.__**beep** (pitch: number) Lets the computer emit a simple beep sound with the given pitch. -=== __computer.__**demote** () -This function is used to allow switching back to the normal tick rate. - === __computer.__**getEEPROM** () -> string Returns the current eeprom contents. @@ -124,9 +100,11 @@ Have a look at https://docs.ficsit.app/ficsit-networks/latest/lua/examples/PCIDe !=== ==== -=== __computer.__**isPromoted** () -> bool -Returns true if the Lua runtime is currently promoted/elevated. -Which means its running in an seperate game thread allowing for fast bulk calculations. +=== __computer.__**media** : xref:/reflection/classes/FINMediaSubsystem.adoc[FINMediaSubsystem] +Field containing a reference to the Media Subsystem. + +=== __computer.__**millis** () -> int +Returns the amount of milliseconds passed since the system started. [%collapsible] ==== @@ -135,15 +113,25 @@ Which means its running in an seperate game thread allowing for fast bulk calcul !=== !Name !Type !Description -! *True if the currenty runtime is running in promoted/elevated tick state.* `isPromoted` -! bool +! *The amount of real milliseconds sinde the ingame-computer started.* `millis` +! int ! !=== ==== -=== __computer.__**log** (verbosity: int, message: string) -Allows you to print a log message to the computers log with the given log verbosity. +=== __computer.__**panic** (error: string) +Crashes the computer with the given error message. + +=== __computer.__**setEEPROM** (code: string) +Sets the code of the current eeprom. Doesn¬タルt cause a system reset. + +=== **filesystem** + + +=== __filesystem.__**initFileSystem** (path: string) -> bool +Trys to mount the system DevDevice to the given location. +The DevDevice is special Device holding DeviceNodes for all filesystems added to the system. (like TmpFS and drives). It is unmountable as well as getting mounted a seccond time. [%collapsible] ==== @@ -152,88 +140,66 @@ Allows you to print a log message to the computers log with the given log verbos !=== !Name !Type !Description -! *Verbosity* `verbosity` -! int -! The log-level/verbosity of the message you want to log. 0 = Debug, 1 = Info, 2 = Warning, 3 = Error & 4 = Fatal - -! *Message* `message` +! *Path* `path` ! string -! The log message you want to print +! path to the mountpoint were the dev device should get mounted to + +!=== +.Return Values +[%header,cols="1,1,4a",separator="!"] +!=== +!Name !Type !Description + +! *Success* `success` +! bool +! returns if it was able to mount the DevDevice !=== ==== -=== __computer.__**magicTime** () -> (int, string, string) -Returns some kind of strange/mysterious time data from a unknown place (the real life). +=== __filesystem.__**makeFileSystem** (type: string, name: string) -> bool +Trys to create a new file system of the given type with the given name. +The created filesystem will be added to the system DevDevice. +.Possible Types: [%collapsible] ==== -.Return Values +* `tmpfs` ++ +A temporary filesystem only existing at runtime in the memory of your computer. All data will be lost when the system stops. +==== + +[%collapsible] +==== +.Parameters [%header,cols="1,1,4a",separator="!"] !=== !Name !Type !Description -! *Unix* `unix` -! int -! Unix Timestamp - -! *Culture Time* `cultureTime` +! *Type* `type` ! string -! The time as text with the culture format used by the Host +! the type of the new filesystem -! *ISO 8601* `iso8601` +! *Name* `name` ! string -! The time as a Date-Time-Stamp after ISO 8601 +! the name of the new filesystem you want to create !=== -==== - -=== __computer.__**media** : xref:/reflection/classes/FINMediaSubsystem.adoc[FINMediaSubsystem] -Field containing a reference to the Media Subsystem. - -=== __computer.__**millis** () -> int -Returns the amount of milliseconds passed since the system started. - -[%collapsible] -==== .Return Values [%header,cols="1,1,4a",separator="!"] !=== !Name !Type !Description -! *The amount of real milliseconds sinde the ingame-computer started.* `millis` -! int -! +! *Success* `success` +! bool +! returns true if it was able to create the new filesystem !=== ==== -=== __computer.__**panic** (error: string) -Crashes the computer with the given error message. - -=== __computer.__**promote** () -This function is mainly used to allow switching to a higher tick runtime state. -Usually you use this when you want to make your code run faster when using functions that can run in asynchronous environment. - -=== __computer.__**reset** () -Stops the current code execution immediately and queues the system to restart in the next tick. - -=== __computer.__**setEEPROM** (code: string) -Sets the code of the current eeprom. Doesn¬タルt cause a system reset. - -=== __computer.__**skip** () -This function can be used to skip the current lua tick prematurely. -Mostly for people who want to optimize their games runtime performance. - -=== __computer.__**state** () -> int -DEPRECATED! Please use `isPromoted()` instead - -=== __computer.__**stop** () -Stops the current code execution. + -Basically kills the PC runtime immediately. - -=== __computer.__**textNotification** (text: string, username: string) -This function allows you to prompt a user with the given username, with a text message. +=== __filesystem.__**removeFileSystem** (name: string) -> bool +Tries to remove the filesystem with the given name from the system DevDevice. +All mounts of the device will run invalid. [%collapsible] ==== @@ -242,30 +208,19 @@ This function allows you to prompt a user with the given username, with a text m !=== !Name !Type !Description -! *Text* `text` -! string -! The Text you want to send as Notification to the user - -! *Username* `username` +! *Name* `name` ! string -! The username of the user you want to send the notification to +! the name of the new filesystem you want to remove !=== -==== - -=== __computer.__**time** () -> number -Returns the number of game seconds passed since the save got created. A game day consists of 24 game hours, a game hour consists of 60 game minutes, a game minute consists of 60 game seconds. - -[%collapsible] -==== .Return Values [%header,cols="1,1,4a",separator="!"] !=== !Name !Type !Description -! *The current number of game seconds passed since the creation of the save.* `time` -! number -! +! *Success* `success` +! bool +! returns true if it was able to remove the new filesystem !=== ==== diff --git a/docs/modules/ROOT/pages/lua/api/LogModule.adoc b/docs/modules/ROOT/pages/lua/api/LogModule.adoc new file mode 100644 index 000000000..a3c4cd788 --- /dev/null +++ b/docs/modules/ROOT/pages/lua/api/LogModule.adoc @@ -0,0 +1,34 @@ += Log Module +:table-caption!: + + + +== Globals + +=== **computer** +The Computer Library provides functions for interaction with the computer and especially the Lua Runtime. + +=== __computer.__**log** (verbosity: int, message: string) +Allows you to print a log message to the computers log with the given log verbosity. + +[%collapsible] +==== +.Parameters +[%header,cols="1,1,4a",separator="!"] +!=== +!Name !Type !Description + +! *Verbosity* `verbosity` +! int +! The log-level/verbosity of the message you want to log. 0 = Debug, 1 = Info, 2 = Warning, 3 = Error & 4 = Fatal + +! *Message* `message` +! string +! The log message you want to print + +!=== +==== + +=== **print** : function(string...) + + diff --git a/docs/modules/ROOT/pages/lua/api/ThreadedRuntimeModule.adoc b/docs/modules/ROOT/pages/lua/api/ThreadedRuntimeModule.adoc new file mode 100644 index 000000000..569f1d1a2 --- /dev/null +++ b/docs/modules/ROOT/pages/lua/api/ThreadedRuntimeModule.adoc @@ -0,0 +1,35 @@ += Threaded Runtime Module +:table-caption!: + +This Module provides an interface for other Modules to interact with the Kernel. + +== Globals + +=== **computer** +The Computer Library provides functions for interaction with the computer and especially the Lua Runtime. + +=== __computer.__**demote** () +This function is used to allow switching back to the normal tick rate. + +=== __computer.__**isPromoted** () -> bool +Returns true if the Lua runtime is currently promoted/elevated. +Which means its running in an seperate game thread allowing for fast bulk calculations. + +[%collapsible] +==== +.Return Values +[%header,cols="1,1,4a",separator="!"] +!=== +!Name !Type !Description + +! *True if the currenty runtime is running in promoted/elevated tick state.* `isPromoted` +! bool +! + +!=== +==== + +=== __computer.__**promote** () +This function is mainly used to allow switching to a higher tick runtime state. +Usually you use this when you want to make your code run faster when using functions that can run in asynchronous environment. + diff --git a/docs/modules/ROOT/pages/lua/api/WorldModule.adoc b/docs/modules/ROOT/pages/lua/api/WorldModule.adoc new file mode 100644 index 000000000..d43ec8620 --- /dev/null +++ b/docs/modules/ROOT/pages/lua/api/WorldModule.adoc @@ -0,0 +1,75 @@ += World Module +:table-caption!: + + + +[cols="1,5a",separator="!"] +!=== +!Dependencies +! xref:/lua/api/ReflectionSystemObjectModule.adoc[ReflectionSystemObjectModule] +!=== + +== Globals + +=== **computer** + + +=== __computer.__**attentionPing** (position: xref:/reflection/structs/Vector.adoc[Vector], [username: string]) +Allows to send a World Marker/Attention Ping for all or the given user. + +[%collapsible] +==== +.Parameters +[%header,cols="1,1,4a",separator="!"] +!=== +!Name !Type !Description + +! *Position* `position` +! xref:/reflection/classes/Struct.adoc[Struct] +! The position in the world where the ping should occur + +! *Username* `username` +! string +! The username of the user you want to ping. + +!=== +==== + +=== __computer.__**textNotification** (text: string, username: string) +This function allows you to prompt a user with the given username, with a text message. + +[%collapsible] +==== +.Parameters +[%header,cols="1,1,4a",separator="!"] +!=== +!Name !Type !Description + +! *Text* `text` +! string +! The Text you want to send as Notification to the user + +! *Username* `username` +! string +! The username of the user you want to send the notification to + +!=== +==== + +=== __computer.__**time** () -> number +Returns the number of game seconds passed since the save got created. A game day consists of 24 game hours, a game hour consists of 60 game minutes, a game minute consists of 60 game seconds. + +[%collapsible] +==== +.Return Values +[%header,cols="1,1,4a",separator="!"] +!=== +!Name !Type !Description + +! *The current number of game seconds passed since the creation of the save.* `time` +! number +! + +!=== +==== + From feb5737a622feb0ac5276c9c8b674da9b5e9c021 Mon Sep 17 00:00:00 2001 From: Panakotta00 Date: Mon, 18 Nov 2024 19:46:37 +0100 Subject: [PATCH 31/33] fix: lua: Add missing FileSystemModule --- .../FicsItNetworksLua/Private/FINLua/API/LuaFileSystemAPI.cpp | 4 ++-- Source/FicsItNetworksLua/Private/FINLuaProcessor.cpp | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Source/FicsItNetworksLua/Private/FINLua/API/LuaFileSystemAPI.cpp b/Source/FicsItNetworksLua/Private/FINLua/API/LuaFileSystemAPI.cpp index 7b312e302..a96217251 100644 --- a/Source/FicsItNetworksLua/Private/FINLua/API/LuaFileSystemAPI.cpp +++ b/Source/FicsItNetworksLua/Private/FINLua/API/LuaFileSystemAPI.cpp @@ -44,7 +44,7 @@ namespace FINLua { LuaModule(R"(/** - * @LuaModule FileSystem + * @LuaModule FileSystemModule * @DisplayName File-System Module * * FicsIt-Networks implements it’s own virtual filesystem for UNIX like experience using the FileSystem. @@ -52,7 +52,7 @@ namespace FINLua { * There is also a DriveNode which simply holds a reference to a drive so you can access a drive via the filesystem. You can use then the mount function to mount the Drive of a DriveNode to the given location in the filesystem tree. * Because you need at least one drive mounted to even be able to access any node, we provide the initFileSystem function which you can call only once in a system session. This functions will then mount the DevDevice to the given location. * The DevDevice is a sepcial Device which holds all the DeviceNodes representing Device attached to the computer session, like hard drives, tempfs and the serial I/O. - */)", FileSystem) { + */)", FileSystemModule) { LuaModuleLibrary(R"(/** * @LuaLibrary filesystem * @DisplayName File-System Library diff --git a/Source/FicsItNetworksLua/Private/FINLuaProcessor.cpp b/Source/FicsItNetworksLua/Private/FINLuaProcessor.cpp index 141688e2f..5b6583c39 100644 --- a/Source/FicsItNetworksLua/Private/FINLuaProcessor.cpp +++ b/Source/FicsItNetworksLua/Private/FINLuaProcessor.cpp @@ -43,6 +43,7 @@ UFINLuaProcessor::UFINLuaProcessor() { Runtime.Runtime.Modules.Add("WorldModule"); Runtime.Runtime.Modules.Add("EventModule"); Runtime.Runtime.Modules.Add("FutureModule"); + Runtime.Runtime.Modules.Add("FileSystemModule"); Runtime.Runtime.OnPreLuaTick.AddWeakLambda(this, [this](TArray>& TickStack) { TickStack.Add(MakeShared(GetKernel()->GetLog())); }); From c55f6efe3d1d1762986d0ce16d2cb28de50be695 Mon Sep 17 00:00:00 2001 From: Panakotta00 Date: Mon, 18 Nov 2024 19:50:48 +0100 Subject: [PATCH 32/33] chore: version bump --- FicsItNetworks.uplugin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FicsItNetworks.uplugin b/FicsItNetworks.uplugin index abf648402..130fdd90e 100644 --- a/FicsItNetworks.uplugin +++ b/FicsItNetworks.uplugin @@ -2,7 +2,7 @@ "FileVersion": 3, "Version": 0, "VersionName": "0.3", - "SemVersion": "0.3.28", + "SemVersion": "0.3.29", "FriendlyName": "FicsIt-Networks", "Description": "Adds a computer network and programmable computers to the Game.", "Category": "Modding", From 83b86fa6972a18026b7329cfca33874fbdba45cb Mon Sep 17 00:00:00 2001 From: Panakotta00 Date: Mon, 18 Nov 2024 20:35:33 +0000 Subject: [PATCH 33/33] docs: Automatic Documentation Update --- docs/modules/ROOT/nav.adoc | 2 +- .../pages/lua/api/{FileSystem.adoc => FileSystemModule.adoc} | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) rename docs/modules/ROOT/pages/lua/api/{FileSystem.adoc => FileSystemModule.adoc} (99%) diff --git a/docs/modules/ROOT/nav.adoc b/docs/modules/ROOT/nav.adoc index 6986ac9e4..49dd6bc0b 100644 --- a/docs/modules/ROOT/nav.adoc +++ b/docs/modules/ROOT/nav.adoc @@ -54,7 +54,7 @@ *** xref:lua/api/ComputerModule.adoc[ComputerModule] *** xref:lua/api/DebugModule.adoc[DebugModule] *** xref:lua/api/EventModule.adoc[EventModule] -*** xref:lua/api/FileSystem.adoc[FileSystem] +*** xref:lua/api/FileSystemModule.adoc[FileSystemModule] *** xref:lua/api/FullReflectionModule.adoc[FullReflectionModule] *** xref:lua/api/FutureModule.adoc[FutureModule] *** xref:lua/api/KernelModule.adoc[KernelModule] diff --git a/docs/modules/ROOT/pages/lua/api/FileSystem.adoc b/docs/modules/ROOT/pages/lua/api/FileSystemModule.adoc similarity index 99% rename from docs/modules/ROOT/pages/lua/api/FileSystem.adoc rename to docs/modules/ROOT/pages/lua/api/FileSystemModule.adoc index 392c8c6e5..cef3cbf67 100644 --- a/docs/modules/ROOT/pages/lua/api/FileSystem.adoc +++ b/docs/modules/ROOT/pages/lua/api/FileSystemModule.adoc @@ -167,7 +167,7 @@ Function fails if it is not able to move the object. !=== ==== -=== __filesystem.__**open** (path: string, mode: string) -> xref:/lua/api/FileSystem.adoc#_file[File] +=== __filesystem.__**open** (path: string, mode: string) -> xref:/lua/api/FileSystemModule.adoc#_file[File] Opens a file-stream and returns it as File-table. .Possible Modes @@ -215,7 +215,7 @@ Opens a file-stream and returns it as File-table. !Name !Type !Description ! *File* `file` -! xref:/lua/api/FileSystem.adoc#_file[File] +! xref:/lua/api/FileSystemModule.adoc#_file[File] ! The File table of the file stream. Nil if not able to open file in read only. !===

F_e1Xu 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 Q7j!LiEV~U)DTDC;2fhBNDgXcg diff --git a/Content/Buildings/ModularPanel/Panels/SizeablePanel/Build_SizeablePanel.uasset b/Content/Buildings/ModularPanel/Panels/SizeablePanel/Build_SizeablePanel.uasset index ed6d3e99b25e938532d32f6c0d012ede449e8085..b8be882d565b600deb715adf21b18d30dbd3abdf 100644 GIT binary patch literal 410049 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