From 0263e5fae0ba63e85125e67029f24b7375b67a21 Mon Sep 17 00:00:00 2001 From: Hane Date: Wed, 10 Sep 2025 22:07:54 +0200 Subject: [PATCH 1/2] 1-5 and part of 6 --- src/lines.txt | 5 + src/main.lua | 283 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 288 insertions(+) create mode 100644 src/lines.txt create mode 100644 src/main.lua diff --git a/src/lines.txt b/src/lines.txt new file mode 100644 index 0000000..7387381 --- /dev/null +++ b/src/lines.txt @@ -0,0 +1,5 @@ +linea1 +linea2 +linea3 +linea4 +linea5 diff --git a/src/main.lua b/src/main.lua new file mode 100644 index 0000000..7d7add0 --- /dev/null +++ b/src/main.lua @@ -0,0 +1,283 @@ +local dbg = require 'debugger' +-- Func asand type test +-- print("hello world") + +-- function factos (n) +-- -- dbg() +-- if n == 0 then +-- return 1 +-- else +-- return n * factos(n - 1) +-- end +-- end + +-- print("Enter a number: ") +-- a = io.read("*number") +-- print(factos(a)) +-- print(type(factos)) +-- print(type(false)) + +print("String test") +asciicore = "alo123\thola\n" +asciicore2 = "\97lo\9hola\49 \10" +io.write(asciicore); print(asciicore2); +paragraphcore = [[ +increible +la maravilla +interpretada ]] +print(paragraphcore) +print(10 .. 20) --string conversion, concat +print(10 + 20) --int sum, string conversion +print(10 == "10") + +print("Table test") +a = {} -- create a table and store its reference in `a' +k = "x" +a[k] = 10 -- new entry, with key="x" and value=10 +a[20] = "great" -- new entry, with key=20 and value="great" +print(a["x"]) --> 10 +k = 20 +print(a[k]) --> "great" +a["x"] = a["x"] + 1 -- increments entry "x" +print(a["x"]) --> 11 +print() + +print(a["z"]) +a["z"] = nil +print(a["z"]) +a = nil +print() + + print("Convention: tables in lua are usually indexed starting with 1, the stdlib follows this") +arr = {} +for i=0,9 do + arr[i] = i*2 +end +for i=0,9 do + print(arr[i]) +end +print() + print("Convention: using nil as table end. ipairs follows this") +arr[10] = nil +arr[11] = 34 +for i,number in ipairs(arr) do + print(number) +end +arr = nil +print() + + print("Array indexing doesn't perform any type conversion") +i = 10; j = "10"; k = "+10" +a = {} +a[i] = "one value" +a[j] = "another value" +a[k] = "yet another value" +print(a[i]) --> one value +print(a[j]) --> another value +print(a[k]) --> yet another value +print(a[tonumber(j)]) --> one value +print(a[tonumber(k)]) --> one value +a = nil +print() + +print("Logical operators test") +v = 3 +--x = 4 +x = false -- boolean, while a value, is evaluated as it should and replaced by the expression: +print(type(x)) +if not x then x = v end +print(tostring(x)) +print(type(x).."\n") + + +print(nil and false) +print(4 and false) +print(4 and 5) +if (4 and false) then + print("si") +else + print("no") +end +print() + +val = v and 7 or 14 +print(val) +v = false +val = v and 7 or 14 +print(val) +val = (v == false) and 7 or 14 +print(val) +val = (v ~= false) and 7 or 14 +print(val) +v = nil; print() + +print("Operator precedence") +x = 3 +print(x^3) + +print("Tables") +local math = require 'math' +tab = {math.sin(1), math.sin(2), math.cos(3)} +print(tab[1] .. " " .. tab[3]) + +print("Using table to implement linked list") +list = nil +for line in io.lines("lines.txt") do + list = {next=list, value=line} + print(tostring(list.next) .. " " .. list.value) +end + +l = list +while l do + print(l.value) + l = l.next +end +l = nil; list = nil; value = nil; +print() + +print("Mixing initializations and constructing tables within tables") +polyline = {color="blue", thickness=2, npoints=4, + {x=0, y=0}, + {x=-10, y=0}, + {x=-10, y=1}, + {x=0, y=1} +} + +print(polyline[1]) +print(polyline[1].x) +print(polyline.color) +print(polyline[2]) +print(polyline[2].x) +polyline = nil +print() + +print("Explicitly writing index as an expr") +opnames = {["+"] = "add", ["-"] = "sub", + ["*"] = "mul", ["/"] = "div"} + +i = 20; s = "-" +a = {[i+0] = s, [i+1] = s..s, [i+2] = s..s..s} + +print(opnames[s]) --> sub +print(a[22]) --> --- +a = nil; i = nil; opnames = nil; +print() + +print("Assignments") +x = 1; y = 2; +x, y, c = y, x --[[Variables are first evalueated and then swapped. Extra var is set to nil, extra value is discarded. + Always 1 value per var, no multi assignments]] +print(x .. " " .. y) +x = nil; y = nil + +print("Local variables: chunk, func or control block. On repl") +local a = 3; print(a) --Would print 3 +local a = 3 +print(a) --Would print nil on repl since we're not anymore at the scope where a was declared. Use do-end (equiv to { }, scope delimiters)! +local a = nil +print() + +print("Control structures: numeric for") +for i=1,4,2 do --initial value, max value, increment(optional = 1) + print(i) +end + +function f() + return 3 +end +print() + +for i=1,f() do + print(i) +end +print() +f = nil + +print("Control structures: generic for (foreach)") +a = {1, 2} +for i, v in ipairs(a) do print(i .. " " .. v) end +a = {x=1, y=2} +for i, v in pairs(a) do print(i .. " " .. v) end +for v in pairs(a) do print(v) end --only print keys +a = nil; print() + +print("Functions") + --No strict control of number of parameters passed to func (extra params = discarded, missing params = vars set to nil) +function f(x, y, z) + z = z or 1 + y = y or 1 + x = x or 1 + return x + y + z +end +print(f(2)) --4 +print(f(2,3)) --6 +print(f(2,3,4)) --9 +print(f(2,3,4,9)) --9 + + + + --Tables can be used as references for the content within, although with multiple retvals this should be seldomly used +function ft(a) + if (type(a) ~= "table") then + return + end + a[1] = 3 + return +end +a = {6} +ft(a); print(a[1]) +print() + + --Functions only return multiple values if they're the single or last expression: +function multireturn(a, b) + return a, b +end + +do +local a, b, c = multireturn(1, 2) +print(tostring(a) .. " " .. tostring(b) .. " " .. tostring(c)) +local a, b, c = 10, multireturn(1, 2) +print(tostring(a) .. " " .. tostring(b) .. " " .. tostring(c)) +local a, b, c = multireturn(1, 2), 10 +print(tostring(a) .. " " .. tostring(b) .. " " .. tostring(c)) --See how c is nil? We only kept the function's first retval +end +print() + + --Same thing happens when expr is part of another function call (args) +print(multireturn(1,2)) +print(10, multireturn(1,2)) +print(multireturn(1,2), 10) +print(multireturn(1,2) .. 10) +print(10 .. multireturn(1,2)) --And when it's a part of a expression, it always truncates extra retvals +print() + + --Variadic functions +function nsum(...) + local nsum = 0 + for i,v in ipairs(arg) do + nsum = nsum + v + end + print(nsum .. "\n") + --[[Equivalent to + for i = 1,arg.n do + nsum = nsum + arg[i] + end + print(nsum .. "\n") + ]] + + for i,v in pairs(arg) do + print(i .. " " .. v) + end + print() + return nsum +end + +print(nsum(2,3,4)) + +--TODO: Re-read chapter 5 + +print("Function anonimity demonstration") +foo = function (x) + return x, 2*x +end +print(foo(2)) From ee7d6302c57f5f9689a6dc88ba3646eb634080c5 Mon Sep 17 00:00:00 2001 From: Hane Date: Sat, 13 Sep 2025 19:02:57 +0200 Subject: [PATCH 2/2] part1! --- src/dlltest.cpp | 24 +++++ src/dlltest.dll | Bin 0 -> 63488 bytes src/dlltest.h | 24 +++++ src/dlltest32.dll | Bin 0 -> 56320 bytes src/main.lua | 248 +++++++++++++++++++++++++++++++++++++++++++++- 5 files changed, 295 insertions(+), 1 deletion(-) create mode 100644 src/dlltest.cpp create mode 100644 src/dlltest.dll create mode 100644 src/dlltest.h create mode 100644 src/dlltest32.dll diff --git a/src/dlltest.cpp b/src/dlltest.cpp new file mode 100644 index 0000000..7f96c18 --- /dev/null +++ b/src/dlltest.cpp @@ -0,0 +1,24 @@ +#include "dlltest.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +void testprint() +{ + printf("Hola, soy %s\n", "C"); + return; +} + +//clang -v -std=c11 -DCALCDLL_EXPORTS src/dlltest.c -shared -o src/dlltest.dll +//clang++ -v -std=c++11 -DCALCDLL_EXPORTS src/dlltest.cpp -shared -o src/dlltest.dll +CALCDLL_API BOOL __cdecl DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) +{ + return TRUE; +} + +#ifdef __cplusplus +} +#endif + diff --git a/src/dlltest.dll b/src/dlltest.dll new file mode 100644 index 0000000000000000000000000000000000000000..a88141e3649d15c6d613c6f7af3fda7290b9fb3e GIT binary patch literal 63488 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 CLWnK^ literal 0 HcmV?d00001 diff --git a/src/dlltest.h b/src/dlltest.h new file mode 100644 index 0000000..af1d15e --- /dev/null +++ b/src/dlltest.h @@ -0,0 +1,24 @@ +#ifndef TEST_H +#define TEST_H + +#define WIN32_LEAN_AND_MEAN +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef CALCDLL_EXPORTS + #define CALCDLL_API __declspec(dllexport) +#else + #define CALCDLL_API __declspec(dllimport) +#endif + +CALCDLL_API void __cdecl testprint(); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/dlltest32.dll b/src/dlltest32.dll new file mode 100644 index 0000000000000000000000000000000000000000..6d51989a563adf80d8d5402fce680475f970e637 GIT binary patch literal 56320 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

b9bJ48(9{GoBQ z6B`;wd%mG@D_YaLD*Euw9mx!-LtozGuX%Z*-6Aif3hv<-y=Om_tR_2L6x11LMHQ z!;U$bV={v#%=A z5D2-u0-O9A=eQ;}5l*kz7jlp5aJP4d-0jWoPG8#^{}gw~*SW?Y3bd_3))e=~fFHNz zKte5kcaJaFjVe3Pcxh8pr@yO+->ddK&x+!e`=S%kwk`Y^?}Y%w=cM?+uym- z-Ruhl{Y~!X_D)FTZrB*|ce&BHFH%diKs7pxO7tS@1ECgoBOZddJsZYtU`rs&`l;)u z7tk}3P@vT>__{m&XW_n|#(@G9>(I0Pot>glWYayq<8s*M9U07F8jW)&LOudzo%V4= z=`=>GQ#G76d&H}!#&R?9jD$Y8P81iO^MKbNoP*F545HJa{Jb1Mg6kNbXxxi%0dkuW zB$O!+2AB8(ZH!nuIs_`m}}94M?v*xDDYznDz|P z*Te8TNIyeR(J%T~k)|O`L?{T;<{(`VhW|Uu&Y0KR;q`hkgBz)@5v(VQtw$!I-p2N} z=D-@v9B-Qsb7Vc0()gk|>jO=G1HCik^@Y3_b_W{QdHov#AyI3ipoUS9{f*rrzqh@O zDBh5-A?T;p0&Rg%z!!u|(wp4iYDI8N;h%{W;kiWB)>gn{a33LI` zMQHAB(_9i`zJ~TrYOLHJ^oRUqoe-(f7px7tEXFF@Q0{axo9_=*`np0D_T<*y<61-jhkhjgh-b)Xm!2o56 zXOr+(o&InQO}>r6z?v3q487!$H(~g++CrP!e61QB+Jw4@+7;>y`rE=#TVrbn^K}HK zwsuWjA84D3{!I-#?y14tsku`NWjfKm|KpOa;&wo!1h<7j`I$bf3LdYmV$iiA*TV6ZKy>Ie~9}WDl zva;M=T|PI5?nD0P^RJ@;8c!?s^R)k?&#pA)xEG-kd&_DB7s56;`fQ}cI|b>zqp-gR z&ryUA5j^SGPa;&;*0JjHI<^Zi+0ut&nZuD4-FN=$XzgF8C(dwJq)jzU+H8@SRaGy? zK+`i1dhZE4ddC^WQ);vH$#WAq!T%y-Fire~JtY)_5nLeC|h zA9x<~yyp4BqvpDE$LCh$o}c@z+(&Z{=2qsNpVyezlXrFA-n@f(FXX+N_fDRapO~MY ze_j3~`H$yI1t|p?1qB6b3U(CiEV#DdaKT`KTxcn@7w##%tMHk^qlK>*{=V?fg=~7l z^bykwrx#CepWZY5vgvnEe{lMv(_fhW;q;;D)ia)%@#>8CXM8%NbY|1co|%u#e0}EI zGuf>8Sz~5Rp5>W!{;d1Xdh;x4cH-=jv&YWPon1V8{_JJ5pPK#N?2l%joGlfZimXN1 zMN^9Mie?tI7hPP`TXb8|okb57Jy!H&(b1w;iY&#B;t|Ce#f8PC#q*1o6rWq{EBD)v(a!ZWdH&7wiDzD3WnN9* z%DfBmn)24>bwD4R^S0+*o_AH=wRzvo+mrYGynT81=RK15c;2DBXY!8by^{Cqyx->y z=DnZyao%TnEZ>xG%}>sE9!;(8BgZq0;bp&rkp+Mtc2MKG8O`51Y4M**a*eNgB=KC zJQc|V>=sSg;GUC^fGo3CP%malkrZ1(f>tapQB+FEOt8kMGAf*)N>sDXWSt1647`7p zh`?--X0hnlBb5PhL@MJ{SyCcoLCpe59w~|Hz?PDV+9!;f4i+aDQm0Cw;2qDgz-E9v zl7vr4m;=xy8sJn7cEN%HKw64XU=<|4+4oMqSvn3NzY#yhtK;Tq306yj9Nl>Y4!`}SN{65PO4gB)!( zy@%5is8fvPkW?CxIyH?7k^rz?Lpi+^vE)*#(Gq#_TF(=xOn#1ZY7?Zlg0SAuCS!&4 zSZI1!d4e+I)KW#GNVJ*53P3q*I1?X+n|PI23sw!9;hNo>B1Q>O&6*WkqEjHwP%)`L zUe|g;R99A`t!UC?TSdLKg>w=npiiU=yRqjE!@!B*kL}rT6IZidH7XxBif@XYeP(_3 zS+uUki7U+Ew5Mt5%N&HEwNrJ58D&nDv?*!P`W#17J$}6Ce}Zw6TVp4AV(ie^G}YS; z`aac|;3s13H7V8@lMSPrVyGu-zhn~d9I`8F!Kntu*alCvwBg1>b3dx?equ*MQ+#PH5|5@RQEL01h4v!w4>%=`S%piQ+_+dtjF>>yjFBP>+Je3Jv<1z^rJ1N2^ zDie-BYQSfr4{VCj$4(s&N{%)Ir)lat)s{~;q*&V*<`g?o)W|@fcRV`2Q3p!SfClLA z+3f%ArZj^ycr(r9RBiVF;WbAU6&xMHEY-F@M&GZwB)EKGEy6$&G^?`eR+SjFDqGZc z>=COJHtZl5iERyyRC2_6(Q1k|NY2!7w^N7q3NdUPEW#*wHQ zhfOm|7+0B|Hm_O60LhjGd9ux-HtIi_<4ve00(!L><1B6rN~2I$--nf{4vMnYW$h3jtV@ zGyppY!jpAvVB28SIyrLe7c>%$Z>mwRBMj9WOJRwMwMJL0HI6c@r(!VDh+WJ-5-{3Y zM(mi4)+WKQn*O@eE2>npHnS{|F+yMCB7*}YJ~BAMP7_GIR!xM+d@^b{Rt2PM!$Bcd z=>LQ%eccXziT^P6GTzwBgxFqcMx^!fYj=*!$BKkDN^MRf14 z;!CKw{}s2t`kgRt?j86N605LT7TE9#+)g8{?hWz@Ne0iZ@0ByMO%m)1^>ZSL7=$(RSy>hM1 z0qvKQ_O0S>i1@1UZjb^#>JQ=ct`LpIGBMue)Ra10J0$;1JowoK{%WLXr;i>PEY?Ow zd`+10kBwxGRj5~!L$jYUTY)})@_gIO1-63Cwwa~2qEcJQJX?W$u8x%2%7HJn%`6vr zu%`-JL8)zKg{=rcjcsNb0VRM@3y4KwnM&}?sseDh@A49%Ftm;C&$YQ=D$u}OK`avn zU8?D1xPFQ|G$?2n>ckfihSfRol!Ir_SMW>$PYZbHd0In6w%GaP6BDCZ#5zAcd;2>4 zG=5Y+J<}tXfxcfV3yZXfu@-G3k8G7}gm8MM=hk`WiFt=PULjOMbCCK)eDvH8Nd#wj z=0`T7=hHJm!u5LT`QRDAAw#uLG<*hBjL9~a=8k1JJ$t}^IVKN1Po%!bjva;xV~0B6 zR!|3~Gs!nxJyiB6>N$XV=pHv*59SrD0CiyGSK1utEM@~@@l|Z%cjLXfU=06K!LUV` z33LMHrf}W6z)N#it2=fKF?#cC&Q{?JtI5`!h(TE=;x+?)zM!lSqYd{69*y$lHg*U0 zmMoJwa*)t?6Yc@N5OB1gxK#`1ZA0EAk-S(rD@42G!J*Pp8Wv}yPRAJL2t>+}Pa?Oa zwYLpR;?`1}}OKZB{`qr!S= z{?aJZXCp;e>2E<-ZQs?JBkD-oIQBuJGXL_+gIet|3W zj;iSy%9PB{BiT&!T&~d14k$F>A0tQ^7D}v=EAH1wsXQ(+;*RTZni}_k4yRj~`X~_P z5TdsbB&T`=NxYdlKw`+#xYC5`6Fvj76hu|oVI51ov*sd}tR;wLW}@%Zn$<*`4QU#5 zpyns3DS&Nb5Ty_yFUg*OG((+`;&)R8lj ztVw?2pOWNARw@3So;4LU90&3psv!qo^LPAN&+;TW9VRsS8)`lmHvsDGsKb6U@-3<} zDd}OVF*S*y#?&MSeVbp%Gy*l!*K7qc5;Z0rBgRolDi}v4Iko_!?>(z&VEhg$6G%E3 znJp3YUXaumWi=VFEfdj&M0j3KA${KGoCS)L`s;jAhnPACpgjvwwYoULaVc65{i#gA z3&}dNBtdnM$W(#4G{NFH3`8idD#7abtY9Hlz)Se)vp z(2<|USsV*>@$&eV}##NFYTrX$bB z?Q`Vo$S>pWb39l0B--J~P;K(*U-YrE*~&Gfy5$-+)-p3 znBpqUWaT~Z&?uRvo3fB_Rs9>1v@a0ZD9?kSPLfm{L0K9Zr!p6%3qh4K)oc*c&n6Bs zNrhZWIWY4$toPdKNUCcGk35H_%IL+&vs`4NYNgCI8nO-9nO)J0%*|1lseRNc@sGZg z$S;}5(51{!|XcMn*yXd$9e6zW+`L=4%PkXNWD4uDY4pTHJX&sfwV^nKcp ziMlsXHIK_#H7F!ZCC}K%u5cqi1W`0{8356UA3(H`A1CA6Lc~jr)EdWN+I#5B38-mW zEqe9^0bKynQ9uA^6F^yu0ZfrrTqcs*Pj&Kgh%f4B0KoEpg;w4|kjun~Nd-d1Wu)Q) zq24l5Z-G#48L75#Iv%w%c|FZ29a&1qbUY)05eg8Gq?uez6C5sp5}L1kt5}m5^3>gu zLX7Ev`HeGXBUwU4W(Xmi)Vh<}byACL25E|vBo_{wKU2Rykm?>Hu4k#moP}ueIf2sd z2fulR_Eh#3YE`9|K)13Y4CC!k`w|*X9Q9v8A`>tXfK>MjkR_+G9!WJ3MsP)~#;{1$ z$>3ppIf$m!h&B>q0`~(nE8Bt4S0AN3t3p4|a;=n`>B-t{xe9cyTCPE2R!zjQ2cUdT zoPK#B)x7~?{P{E>1kge5eE_Od--z}SjsWhUhOKv^pz=eB>PTFTh}rG~MRH5_gOq0V zfn+~I;28umc^it+{fAUXKSv=II;f>5V=WZj@R*sJD8QT4j5{t1{Zi zsnXl1#>$pp!qN{;c#+Eeh^A3>30$G?#^KEXaP9@wtjc%mnO3e?ktsg~!uiCV$QAkq zozeh=(_KqE=A(S6iAocw$~(-z0W&kdhgdRyj#y@L7P9^gRLRB_`WBw$79erVM$)md zkV%zhg2l@ABF6J5b|2DX=*RcLC%*wiY|hW%$~J0!E~p=aD7n->B7wx8A;H(XnLG(w z@(#EbFA$Z(98Ho;ze^!9C&MI=DW`yNIdMrU$#)*$mBNyHs5FY5faNI z6cNNs4pN<^QRIS}Q@=m73x&UyA4(s=I zt)RE2X@rHLR}+0}?gVgBAq^86B!n6>d-p>MA$vx%Slr^NU?Brk(OvX~YF zG+SN=Vlm6~BTD*Ir?0!pf7Jf`}_2MlVwN zE<~b63s>mNwaVilaFwNFwyW%@D2Cs7L9sIv8QXzkrAX=8^smr^tlytX%PlyeNpDNa zI%F?`a-=^>R)u~AD(r^U?Wn7SmP6=KxqsOx7O6YrvBz)yO?gW=lZM>%c|Epq}B< zGG4-^vEZQFV`dLQBV2WCK+-^pd4MZ7KrcyafFyS!!t+BW-Iqd%Q@Yc62^i@lD(z#= zy?~Dpe3$Bc5HLMUknXlPUjY0r!S`659|NZIq;#)?B|iz`_dt+$+IJ!`tEs;N#a2JpyN zflO3P8Lq#9fzB|BIfJ>9L7huTLWX6Os#r2yBSE3gC~?T1pd;}aaFzKwX3enTb~VhG zn1L^H=!h-D>GJ7_J;UYd(Gf>RhHC)GZ>hDU47ck69ZAl}avj#$Qt)m}8uclij@lNM z@dfqAoO~SE-C&ZhwC_e@mL2qXOxW#%T)7FuGujUOmM)gKLO;`$mJUqRk;m*Vu$rXN z9%6V94D<_DQHIHE^dibRf*ksxt7uLw%WR~ar?^7DU%5m%CyDxz^d_R@cM&ZE zQCc>}DlKu&1}Lm^OZ zP*Nq8Sb^wfDzO+%&39g_b1g8GSg1O0(CLfN)UzZg8DbKRRT6b7nN0a7V3KbXCi^6T zSG$iOkqWV`9sBPZL~LV!XMo>|!dZg^&y=Y8tiKXGOZqjzpA$S=qIR+*Y`UZw8c&=7 zPA2#)X+FAhMwXM1b+}X{WCS4{5-E_-(S#n>Dws&{Qv${zvXHRj(zq&0Ptd@OTSnl! zqUd=2d6QI^MXu5;O}HG6s+~B@67_4s&w$U<@;-wTn($lTi!^*cWaqTCevLetT~gw( z_*DTn{{>9s%*@3W#{2-{KLm^ULSPpHga06h7KevB0+^@+vjDJ(`U5GcE|(gro3sPv zmI{!e;>kAvts(T=@j%aH*{ew2hovb(?uW01hQ@`6^yn6}qILZzqU#?Mbw4?;Gsb;F z@T(sPaZ;~9@&*V>dg{n0kY*^3R96oGa)wG$Dsyeuk>pg>bu|#-Wl~Ztu3LeSpHxPs zT3vVRIj&TP>p>kEmFjdorXy*oE|yHCW%R*xe$o)yo|?qbl^mKa$@Bw=0c4qN(_RI> z0wB8$L1m-RaaFny1S@+T@$1;By^BY7xZKO9BjKv4ACyG^vEwkS*8ypv?4A4^BxY5m?2SaZF)SyI zmnv-o$;yr+Zp3coGo<T=c-X42*CBFr3>vk17nmCr;H zma__AM9x;q-pRd4!g6jQ%8d-~i9nwp2s!&eva|3I z(n=A!s@>|(2gFP@h|0huWhyHGn$JUIIU5A*dzT;y0jGVmlM2&g1C==V4n#~Ly~V{} zk62#I75X){gj<1F??jZ$EIyPsNr}x!uoc^caAhK8 z{T_(rJD@^}?;)Y9Ie9x*Jd{ZS$ajKDmqPL$t`rb86^JGqG4leTS|sG11(Ye&yfO!% zX(6JgP=#`lO;tA99|uT$$|ltK5)g5G*o#99Roww*L)G5`%0*01~cLq&_EQW zb9S3RMOh2H)h2-ob4t~p)k}4FTaC$!1XBi>L<5UN10JBFfkk97Bg%n_1~hafP|<)^ zHV9NSut;k_f4DEz;nim**VDE3h;3l%6X<;OfTi9We#$S^jV9{(B*jR0OTlx#n5ZuO z$-h*0Ch-JDT#HJs5FoL$QTii)sct$^Tgmj&^ymJ#EJefVQneWm*;&S)Nt-()m;M@n zRJV}ITs4}wh&T>4%DWU4m_Y?n_4fm$x+-G4PUz_lNN|-v$y`S~2K3tkCBw};3iNtH zuaASH%Y0iG_XaAP6m?rX&qU{$ePA`&#*krs7od2`sIndKhN|=+2v#%f7lusUGMDnxM?ATqauYLephdZfA#2vPzS zOrXn$iv&tlSQ8*aFQJJ)B=k(6HxOzgW)n-iAIYU4C{!`~cPy7G8-pXMD%}LCm2nrI zJ7Wtz0x7-YK=0VdB|v6?ou_f-Hj;ZTkYl4z>PPBQfWH7JH)io4BX!B=WtoaVHFfBSH_Kw$3gicrvpUOa`nHbvvK*$pKpv!=hAbyjN$3(#=O((v&Xy`&6Da(>gmjPKoIpt{edLZ-zka7iD{RNQigv>)j@94<< zET`!+9a)g&GBLCvs$Q6tVM^1HMOm3lDMjfZc%>^X=OZ!8X3~PX3giR8<&exDL~4;Q zludU4xR_e&#AD*Sb)-vHnVI;NorvBBS=woN1qoK&J)o?k-cFJ%%}DW(i5>@BNu=Gl z5Tg=50;0^2|BQs*s^Sy4@)!ojOgqr{*AXdyK$MY&tkDUHNUYp#9RfFXoR4Kz1vGj> z%d=Fg1+b{)3=1=l1ToP@4KjHuGNutzI#>3f`gnT&X(<7ft7dA&uD=F@2UkR$Obm`W zFgj|BPo~x!H9)C3KA9R!Y6ki=p;Kl9Wp@3|7^&_`qLzv(zNJ@DN>wD?3KTwt@iLM# z>6bwNozQYZS#mkSjZ(__l=_M0Olcsv^-t6UQ>Z&FAV@db^_Od;x_!j4=><#y#|c#U zra;LY9V0Oz-X-)R(Sb6c9}&8ls!M$ekp*o0QuBy*WIYFbq#J}0JAu6}S`lp!sPk^eqgHz@+JKVG$DMy=$`|Q<8x|Iplp;>`vD#ij*^ytB$8?g-gHF$$%HI7jmkjl3pnuf+D+)S;cNqr{> zxLEoVbfL11qS)OaS=q=8T#2LD1f=wS(7jNZoCo-f(Ez@crjTz?lYo@S7p3uKV56?f zo6|4?I&yKE%tJb|B~9fUb!2OriEq=9ZD|&Mg^pa37SFHKk?m<#zDGxT(`@{99odoQ z;CJdsUs^K1Pe(3IbMl9Dg%Hm%D$zqO@;+foy z94o1Cl4Ld`#pd&JknVSbbXU4eKJ#XR_oj=To_Zyalk&f%^FlB`gIxLMbjE9e{F;#6 z=_>yi2)%G1?@4zt6M2Irph!E-XCuM3j@H@V1C;-graq6;wj^Sx4T* zfUO528hQ@{)~6%yV~oD5BOhQ`?$pbCh>`f2j{G?-naT88Lx?(2m9CzT^q8CjXObCi z5UV$j1M&%3RBpP=r|C#uy29rI5v}K=XG?UXAlFEysEghMW?&ROq zk(uc(e!Gs$O3&c;=*U^=Zhk;VW~XQK=YR-h6s1q(@90Qz`ebez6V92FK83q<)R9H$)%`bw3jBva zk#;F!Y*zz+3%Gnux*P=j48c|D3Ymv|F$g~x3&5G7YzM4f4P>Hh%HW@Yjc$i!++Fe^ zAh#o1#@%ItDqAwR3O*qK?k>4gN9gV{DjV)Dxm(Y|-6hY_5!_w!vvmY_m%L6#aCgZA zK*T8E?vh`uBe=U11}<8qyGsjoPiV=a&9|R|RhgkIg4E{2fK8I=EWpna`Df-=kZ{#1 zcYriA3w^PTQM##vmmqQzA#sdqM(UK6F^S)%9CZx7+KxEdE+51A>!?TwK~@=^rj_L7502FB1g3A6 z0A5L8MjaTiYee6hfJ<9P=_RY%+<+#!&mi;}ELg7lfr|PosD9UbKt;v# zsA3nxj`jg6yI>upa^ZWP>`p@GQ&pp=`*&bn!}g1*RdH#%QJ7Sbd?f(VMe@%9kUo-M z10Zz5Qm&^8rcwpro=v5eo!=MaWsp8qG~pqRRMB`YHLmq{8i~cskAc~&j?iC-mFj*= zr5mV7x_q_uBI;km%hbQ~A+qRSljz?KKt)S_YDx5fDw#?>Xo*W(gly4+8305NIsk|s z^a2n)$e^)off#BqKJ7=Kim`kgfEdd+0f@2uD*!Q;I0}Ye&Xwx^7s=T{W8})g^}LX* zQ;e+8dKYz1NJT}?B&mAh($c{xq_O}YsjwT;-|Lm?QmC`rsp}(4k-tNrzoWiis<*I1 z^!*8-qLn@|wl4z}>b*>i?I2L0_)DoOAp^BBm1MXgF0BjMLWb1dbdDt2YNl_-V-&Udm}xe`b1A2h)Y|cw^tr+FZp5sq9?lmM8|j=jqyXa zw1c3EF@6Pr7~{VI5M%7YRcm;RKSUD;gvhld#sQjLBg>G#SD<3ZF9#|#@uZOXIiO-d z4vGPJ6X>nP{1iE!)CUMW)D)QzKacc=ni5;bBXMcnC?vGk06>h(_W_9BJPJVcW)xX$ zF@6Ya7ODJ2n_a4*{v?UM&`q`I%b7`fUzFz|`)KmSrba{;LlEgk6IsdS0QorfA5;%} z3kI%AkAq}o6S5iW!Nq0?(ht!R_P@Am1VVBucCMU9JLMuOw+sM3u(IUyO7+$P!viFkeorI}us0L1g+4GEI`@Ho%Vol*d@^ z0eBaIuEa+Geh;8RtTtUfsqPTb5=bEX9Q6K|0wvMxbnE|;KuJh@Gtf5#D#T^wAgb&J z7(QNH0Ua-{jKcvESBEV~>2$ULk z+yeAzLK6oGeF*4p2(?jJ6HEFtl3#$JP&?v_5Gvb=S)@vDf@)=pCg2@Xbo)G{CE-{1 zWgU>}E(Muhg#6e1>{ZB`{))~?lJvi9iIl(tFa&8@dq-$mFxb;NwUvIRdRk!m%<1%7 z)f$?gH!aZC80>EHvz(l1_^DG$bjsH)I<2FtX&rt|w-Gm>?VWzq;_bpOc89t(R^>r!vq{;} z)vSDOU8&04Y*Ie&0_F0pIe0LGmxKQzxVBqElu3C!A&+O7w)2D{Q;?@05!o+Tw{uC^ zgZ~7RdA{;Sd$XY4Wi1kgUg>()n^7fzBCvS)gvYqU zvrN!h;jW-g&$(n@@rIpJpRgf`-zfO2+0IdAav`1O4JM<(UhTkyQagm?EA z@$sv8$_{S3izk|Lc#5foTkhf}fDV(gsTsOREaH3`Ph71jk;RszUDx(M1)o`l9syLrB8ABT?8VQ)B5sLDeq!IbCmRyVi8 z7P-liEK8V?4$K4Ej(IVNR-C7FAWYYy>L z6Ta$$9-3iesb>LnoASAIgyT(CGYX|#!wZ!_=o=MQ5}%e8=!EXZRq_9*r#r6G{Sj;P zg@j|#x@~YJ)K^WvR{}b{uCJ}waHH%LZ-oEJ?SeNG9?amghWB=n(ZJAXzKP!TQ=Y|> zV{`mEZZ}~n6=5DvRj3 zkBT!XuighL_fyuPh=~5^sw?*n$6k2$!o7YtZvwRqkt#!l{ff=xL2X{1wEs+`=4BjwiB0 zG41aori%Zi&;&7#9Lz!=Er8J_1xU=CSs&Wi;qRh+ZQfuG;fLn|qfa!4=v_YLZH30~ z*Iao9-k7Ja!U$pj?50(4j7PWJY*K!9u>}s}HMto>wu_Hy=9xu&QV#cExJ`@2Fq%#E zJZ%m)FW@5-dl6hl5ub{AwaC=!H!0U%oWrM@l)uQ9MSRj!KCzf*&*ll!xLV8;4|4Nt zKTm--qGgOGv2x88G7sfLDa6O#38EX9$$TWH=owf@U@tUV6D*lLr3t2TwH)Gh<#TxY zku;}^OdgZcd+|P6O!^fIOwH7+e7d=rPcSK0D!cf^e6$sp!;_T_MJDC_%_w40zN-}R z(U!d?3CC)^2p{Kj)I3#dG6KVCcz6$%6*$H@Tw-|h+=70)tchI2J7=U|v!kw1#*p_CRaYsP2 zLzm8*F%XNpAqDhWMB`>L?Eve3%(Pa1rfHF~Z;K_QyezE*a5JP=evMYm&~i#MckhS3 z7xOW|tVk13N--5EPqJocJq|w9tX#i!CC^sk_raY~v2XEsB?TF>AEJD`g*p?joP9I5 z&OynWvGQ8R5@32x=9s{Jus@Xr{~@!A{_X>RY|y#!?@bh8@_4^Vu}csxMR=0!LXdU; zFhQcL*OyONl4B3#7!{G?W3h(*YFH^wbsGN%8{IGWH^X}TZftPLdC-3zbofG0FC2_v zb%Ga(x*PN$vP5gJ=4v7vS$dm+HnK{*rI@F!f-&raRa_1GTFK*c02b>YEg=b@Vy2o+ zYhc?P1Z6j8mZe&0*MGKjeEcfd^*(A3Q-Yc9hvyrC9k7J;C?4O8vE*YvL6y@E^ADV1 zgMh6Leq;160&uVAnUE_BzR_(+CEyHi(#I?7CH|#67jSkTcz(g-it()trz~R{)C%kS z(nSdh4YcD{l1?7le@cWGCGy>PmW~&EQR7~oU5q(R%dN#Ds?EkYsp7i=|M)F~zVKj- zqYDoZ&D_Il4RCBNLM@$5n$a+oLu7ikt4x-7TKp0WYzTVvaQjaH<|tKSGhT2rPr^vg z;VF01asZ1^u#+g?N89~5A==HQ#pj8l3I;6k9-fS^LZI~hSUyrs%2Bq6k0OtiqudKh znn`&Blw_rg76RhH>TvH?@PIQ1To_p5bD5ME8F};^o`Gu9>v;lR2D_e1cY|T{E@-%y z_RG7d!auQ4xcwGx$G0i4zFddRjnkxjM7tXW3kx5ygD0$k?-kpdR8s(^T?D&P95`vA z*KsiBw7cLyQ*f4gXUj^hT5_Qw)Hh7E@am%4%3-QiOqb!rkhD+OB@SI9(E*w|BTbb& zv6v_PkdLb7nY($yZmf4(_Mrjg6PBZl-zUez{K)WB@rx3t+lju7!Z^0V{=$ZLOzei} zcI5OD-_%i^x*7d4%fc20{~DtiQjEW0stT*3rw)os;wji9(y__hjCIn(Gm3>qQ=pJh zph~8DIGf9BpTrmjl#<^^UPZ$FQWMmmO?+d9+e{X$5GynzSrj#rMW(4dRoRB!R}uDB zhqr{N<^4d}6V&o=ak!4O++r}4=2%0yO={-nuH%+9=y{HE->D*qJt0Ksjfh~dQ-~n! zbey)An=I64843Tf(ap!r;Y652_6(Oqej*3EKAgVxpb^OWN2yut&2|Z|(D8pf$HS|a zNO0!Bn$Y9JJy@3pi$zWU7bSg_P%xkA7Md0|?ZV5lOI$L{6f)5(BB%Qu-BTIQOjCpS zU#hUr()OB-!2ukk)-PzGSv9>nHtoHLoC%*dBT2@o%ZSKhRgk?u% z;<7i67J3D-lrQvwn*Kld;NF|nBgib|yb0-nFx&`RqVG}>9VGEF@VX4VE(5P?7~Tv6 zZ-#+4L+339P>rDAteAA9Fmbk+O2bx0iZf0Ri!&h`$EWP}7fqYL&0h>yg+B zy_QR$?(b?Uw+utWQ*7;H;B)A-dr^*F=9kzqO3uaZ6g5-Qhk!w3-$HtO7=9G#F$Azs zGC}M(K9ZL0CTJ1@705+;Rv4yq4FU>mKyoR9%BX;`{TD?0HI%#|DzB$Rue?T7u2oWR ztfVGV34LAUZ3MI)u??b~5VYLgl$u1%)uWM|CBS8rlp&y$x)N!)!>XafDs}iU0><3X zMU}cZ2Z4%GT7du!QnFBhwJVVHXrSKJ#i)nsBU_@%s1kyW`I|&rk&*QQ4Iv1lp*)f; z#)1qS(ryDs)WFw->yTKjo)1uO^hxBBFeHesT%%CGLjIuM==%VMbVRSgz#;86a6~1b z(WE*suk?Jw6x)T?uN4x6=sYSuXCW>}fZ0%T4g$V?F6}-Kz-k205sMFzx)BVd?*hF| zBT=#+L6m+BzySmUE0JD`B|%Uzg)z2~nPZ?uW{!ataddbr$d-xfA|9j=XqiT$HRhDu zZ6IBZK!$`we6}GD(<0N^K#K@90eq7YV4H}=XDQVn!Cf+6(SKNW*P7U0Lk4JD*9 z)DW>3ofVVsf^fEB9u9)^EGqqCxL#B0O@r#5Z5QMBx>e7A>cAf)?y}M za#7NTpgCKD=$BRuvyO_LBZ}2fax(&KP;ZB=h|&slVgqQM2x8m_*nwbW7h?KlByCMk zlCpMR3d;8o;v&@Dg#H^sjMusqgnJQSA(YG%velB98wFTR$qgD+Z$1m?QbCFs^!-48 zhG3kk^tH<{jlBo>LoHvg1scJZ9uZI`Vvz<~WFKOnMXb<3bL$lvXxTcA^mrYDu?+() z(uRQ+X~RHs4^v;HjW?0`N3D&B>5qkJOh7=p5!!vgpZIcG#GCvy%BMHWo&!zW97H?} zMhicl7OV33D2?e(2_i(QA=(rKgQFU*8UrmdX-1&f7_BHJG!ZZpDWL_xP+P3iX#;0`I-E5L}8-VF5HS}rA8ZZ#nBc^UC%2sE7YpprTSg6VDWzA&tD z;&&pVyeE!oPz*RFH2v7pv@AT1KEJa7%59W>2D&pniBMz7%3Smz=)DQip`Z{b7^5BRuf$6 zdX}}D)(RRPgGZwGylCqj<6ePNF$3EUp!D(&4FD4HxdZV-2nKr?hV*Zzb5WruV+-me z>=;~;tr_vqXc-#NNk(y>3$vL}_CoYhA7H~y-UT(~3w_puS$w`8i3*(^TTmw{P-;Zf zW#H)%e34ayNTFELa-b^^^zooyQqx!>VpV{29)huhM5AJc@wg1=U4j&G%U?ozFqZ2{ zpnpZ68B3exmtks3Q|OOUynqE=qO;=-038RT^Kcnz2KqUHzfN#lD9Qb zH$2LvAL1~`O$WUnAec}~4=ngjzz+(Rh=kXLNu(soI*1U*I`KO|Vhcd0C92ePw0Aj@aSo+?O@w!egQyT(OZoFBy&7!6dbBQjb#DaIIxr%Du! z@X;@1(uv4mlf^*m5vc2w((i}Fu`a#qYk<<3&!mweU8iEFR8B)cI|mp)C6P~<7FoS1 zBTS1dYcNRMcZjkPJ_9Ynml)*(q;#`S6G6vLYE;AA{<6IilBd<#3<7NR6l&`^k0GgM}$ui{sTe(=%;8ZLnmnc;{y+EN-sm$ zY2aS~20DSzIfXX8`sW4Uw7Z@LTA6`PyWEwiSKl-1{Iva~_f2S5N`|I?1_97|tFOvB zotES?5NKJZeErh}n0U`XJG2t(A6kYVK%k|V^7Rk7-1!K)6W8f9pRPyHC$UcdXQkrZ z7+!I?up^mPzrcGND2(@%K4kZX4SAmCrh=yC#+e1vbMt3R3cn*t?}=(JbWUsN4g{N~ ziT8o%rP3%g6+Bw*RC*B4I>c*6^i-UAs~66zXI`%;JIw7fi5qqWQ{GpPUgew zNP&kEZ^jV=Br*4@?>SkvZj za*HOt-EH)mQ@|GtY(l0NZ>xqeycBChMW!Dwngx3N`dh4&hWxBzL!-YV1Pxc>&YUgv zZwRrDPJa(u;A?9N`a7ffW$k#KHqw5u9W9ivsH!QCa?A_*)^tVD8b6-bHAV5#rlwAR zR~M_UuUc5nmUg!`_&ck8oxWB-UY<3STiDjz-q{LS+uPXk%BrRFz14L!=uK%&P3bCc z?ZR^^ymhOpE4*Ijtyo!BQC+vNYN@xTqKsrIYsZ_o8$y~S<((c@-kFP#hmemj9bpEW z7i{;1YJEL^!QR;(TtRZyLLJ>*0<80`5otwdXM1N=b2DDrWdg4C2Vq|Aovhp!@`W=9 zjL>WRYoJDdXKAP37gd%R|GBH`Dp*;kXKBXu03$Ra_z)U8SVf?NN|b>sJSbg)P)lkK!O;9ox};sq zTUNESu3}{!GibAFIRvX<)u)qM!gdj(`}qrN>uS)K=s=*0jqB#(^%2r*KUBh=mXkoj}Z6S234$VPeoUT1YQw2iqIh`J2k>gcN<7egmu26uc2F$Hu zLzzY-CVwZo8dFp+qsvx@mt0^P^}b*?hSQ5NZ))ypT2Iy#HjYkYFAbG-cXr|(r8<8D zxab+r!leuAN^TjS?l)+SM@^6SLQ8+WP-Z3v_3w>!@2Z4+2fpkF@-+Ui@qa7pQWtcaDh-m=ol z%DJUwi(zhH+oV;~-35OjW^s7^t!l3Etrvc`qOIvPT7Q26l}3KO2(i#~Mv*U)r_JP`)MV~YrmZ{+tox>$$sr~f5R)$nTlH?Vl` zhJZo8!|dgV0XFO1fbFi9Z2G59WzD9dUjg_g{nN_&Iy$`c-n}rxf3|lwz5|of$iBYx z>wV;outOtD54GTo;Kx*M4>r;9BZMt)bS@Y+{tejPd3`avdKf(RQC`}18TRhlo}Ho6 zuvd$$9MPR|wb&oG__|uyQXC0j0jJx@l0a7@t8UrY6@XU=yCzm2zy`$^B)6o)dY0y@ zbaxltwbiwsPVi&l5IaDePPBbzU3+Dq&EF;tDP7^i3OuKQG17;wmUeu@P#lG{Lrqn) zvFw*P$Xd8Y+AlAtC@rt3VPQ9Z3bm`&-$=(H*6P~;koKru+L91yokon*4aXGSkhJ>N z1R8Tu3P~OdAE8-icUvgX>i249f(07A_V(m43?VHpSf6P(J1iHzOVjG@$z@#|TUoO> z=6wZQp1wb=)CLv1B4d+yQyhCrMop3hVXH`Tgj?^)^R_f~G8_cDD5Hta2V`Pid@~aF zeeKxcuJ7>$>FrTi86Aa5H`q*s5p0p+VEuFe4>Sk-O=QWM+5%+HWX>qixlX5h*JH0D zj^xw|YhZL{(e0-+sN01&$wblW@T{OiRC}8+JuI;})9D#?wh@(3ekJR!Dku*5BIRxe-&Q)87GG^!n-C z%35JDU979Kk>LvxthH+m!vJ@Hi>^0t8=Tqcr>p-0bJT!5+%uTZbEHLn2g5IkAEr{K9!T-TvqAgVy^9yBa2iJ&gh|1en;MTXyhsztUI4_BXSM0Fq7Dp(k zxfO@~|5se7cq4gQ?AL?7>0}8T1sRUmis?o&Pu#!`-&fMcKifCrKpg%)(KqO!b_hf{ zFV?|we?#{gF{EN`K4sF0-CG&1EU>K7F}Dt9TEBJ#F2fQ_`_1tFiLb+SakTBKB6|Ce&N8w610qGl1eQuB;vVujphotUcn^8hf+$HjPKSvmI8P1#md5 zmM$=b$ljW|N?al?tXqh~zgOQqmRHPOKA%;8MIK47wI#$5SEsnI?-tKmw2Z3tc(|~p zt_4bI((fXvSgpU+*MTiBZg%0+G+x6s{cw%4VTq@T&DQxhdg(B%?M8qxaWuvg5jd;p zU{XdbDh}o1{G|)T4R_xS!48H*M4iD#0sA`XG=hRy)#)%mpl^c?;$aq!%A!D5 zcPn5#c0mn94L1944SdPDmv#`k_*#FAlvCs6W_!L#p!w0~s=IBEdaWJfE z7M0Oyu&P;bE`&+>#py7tz*1}p+gfq1!2_-F?^>{R|MMf^TI6JgR8J=s3YOaU2O!raJTD+zlUWTUbqxue7a+TEGg9yMXcl zeu)W7#Kz&Sdj5BHXBT2s6~*x*eL@LB(H9m&L|Mo%#UKhjj5bpWqjS@%1O>;@xuX|# zyv>I?1Hn8*X!S5eltF|K1r-ECMG+ZTK?KnU^d(U+4^b37XhqmtzqR+;AM4yZsV_zY z!#VrE*Z$sTpS{=muXBU$xqoeaZ5fr%s(P+~s-_-t)?;3ss)q41vVx+%R&nf(UT{lL z*dzogRpKP9@Cp#c+q3N);T2$KRd)G)Z&zlic0WG3n=_?V1al2l?CeZ1V7Z)jLfB>e ztL7^02;39uY!%LqFYk(>@#ZdBQ12BIM1A)Z+b1@h2ibZz#+hB%#j+SJb;HKm5O16Q zfi3JCYFHI?T-$N&)b@yy`Q991X-f}nct^Jq)M7Q&C9Jin9`0C}^tQYg!%b}U2sXoj1(KDi^ANwIEP^_yksL4nvwYkWS0LV^F1MP%T0AYO^6RDW-?b&>>S?~ z^{F`jI=;#*^-1~Mgv_xdqcj+Cw@fm3AhRvjr&PwIxS6GP4alvw-QS9%nYd*nnJI4P zjEwMbW!$C5M2@;}$>#@LSCB)*co|yZtjk};(mgU$oHU47s=c?bZ~!cckjoJbXT<MYpT!NJ_7Q3sNsho67LbIkFZ-##eVk4jAKzt4Sg#L3Dt!>-?wF4l8F#j(3-?Qf$osL74`JUDWh9?zkeT$n zk2(uwA-_dPhiIzDkvSDxS`P0J1A6h8k$D=K$8n zQwCYabUSL0epz!4AGKX|&&wq`~shA3ilCu*Pan+KXe?jJ}n2#WT zfOK(Xpf#T*%((B2%u28DE0MciW zUXXr+tOZ$bkZmA`$u>R9BOt$--gpG0Zc;q~a>DfCDIhIL+a)F?B5H~GAW%!^Tm zn?inGu*;PGE68yp^Eb#!BXccJWLJD&cz!Z{b5*_qtVX8Sq}m9w!XPb>K3BsqduKqF z8=2=o`00@%ty-^v^cdtlklBb}j~y32#PV1lLB@9OYuy|XY5SL?I$>7GpFy^p74j0E zq*Df20b(tWwiSHf}a}_J&4)Mj%(5U!Ign+XrYXqjJ zh|9Pt41awWM|us>%A$L`F$znln-^^+Z~9;G=vTaFEUeog%^rx&dy7{lJ!!P_o>+C?7N71$)H-Zakgn z@fnw1tbh~UVs_6!Pq5F1Rye_-#uW~Fnk#CslAJPlo zG?tM~Duy%Fbc!j=5$`hUntRlg%c(57zB^Zmpdqz&D9GqdtJ+Zi2y4FgPc_D;{b0M| z5FQ+!m~^gPeLYgvuzYM4ZC~klA7xbEWj)yGu}aY{U)|Y|9}3gR2+G{^8cb9;dI$0O zJJ1~8@9jk;U)miTZSKN&7oyR)!c1WRq-u_^67K`9IUvPLq!e4TryW&!Gue|;9&C;@ z7A@LE<^`jdkF_|Mij$tw6MuzQMMGR%&b4w~QQK zaA_z$bcuXIS3Y384^r}h#DVe&1D8n4s8EUmNhz?LLI-M{nJ!l1&I|}drzn!u(a(_T z%y7)L3e`z#nQ@yGVOF(urOP%jowN+w86^g(@kPW?h4)Y;MYx9{CtWb68OE%1 zrSb~HvSW!f@mW?lhM>{T!Ej~O_fGI!JJY6nX*)0(emi9xRGeCY ze!M&@lb}+?>TyqwD_SrW*QV=k7fdlj0iV8W~qB4eJSzt>*vo F?;qh|0N(%r literal 0 HcmV?d00001 diff --git a/src/main.lua b/src/main.lua index 7d7add0..720cf17 100644 --- a/src/main.lua +++ b/src/main.lua @@ -280,4 +280,250 @@ print("Function anonimity demonstration") foo = function (x) return x, 2*x end -print(foo(2)) +print(foo(2)) ; foo = nil +print() + +print("Function as a first-class value and closures test") +function bruh (x) + local transform = x * 2 + print(transform) + return function () + transform = transform + 1 + return transform + end +end + +incrementFunc = bruh(2) +print(incrementFunc()) +print(incrementFunc()) +print(incrementFunc()) +incrementFunc, bruh = nil, nil +print() + +print("Local functions (packages!: this way, we get functions only visible on the current chunk)") +local a = function () return 3 end +local function a () return 3 end --equivalent, again + +function c () return a() end +print(c()) -- Since we're on the same chunk, this functions is still accesible + +-- But beware! A function is compiled before its assignment is done, so it will ignore its own assignment and look for the +-- definition scopes above until getting to globals! +-- the local function name () syntax sidesteps this limitation, but indirect recursion still forces you to forward declare +local c = nil +local a = nil + +print("Tail calls") +--Only this syntax performs a proper tail call: +--[[ function g(x) + return funcname(params) + end + + it works with anonymous functions too! +]] + +tablajemplo = { "a", "b", "c" } +tablajemplo[4] = 54 +print("Iterators with closures (complex state)") + +function return_ilist_values(list) + local i = 0 + local num = #list + print("List size: " .. num) + return function () + i = i + 1 + if i <= num then return list[i] end + end +end + +for value in return_ilist_values(tablajemplo) do + print(value) +end + +print("Iterators without closures") +--Also like a generic for's internal structure exploration +function direct_iter_func(list, i) + --print("hey"..i) + num = #list + i = i + 1 + if i <= num then return i, list[i] end +end + +local idx = 0 +for idx, value in direct_iter_func, tablajemplo, idx do + print(value) +end + +print("Stateless iterators") +-- Really your most common use case, imo. State (dataset) is given with each call instead of being hardcoded into the factory's +-- code + +function diypair(list) + return function (state, cvar) + cvar = cvar + 1 + if state[cvar] then return cvar, state[cvar] end + end, list, 0 +end + +for idx, value in diypair(tablajemplo) do + print(value) +end + +noenterotabla = {x = 2, b = 43, c = "si"} +for idx, value in next, noenterotabla do + print(idx .. " " .. value) +end +tablajemplo, noenterotabla = nil, nil + +-- loadstring loads code from a string and assigns it to a var! Can only see global variables! loadfile, same for files! dofile +-- is an autoexec for this function with an assert! Errors as 2nd param in both load*! +--[[ + f = loadstring("c = 'españa'; print(c); + function hola(letra) print(c .. ' a tope') end; hola(c)") --ret func as 1st, err as 2nd. Easier to use assert! + f() +]] + +-- print("_LOADED variable (shows which files have been already loaded by require") +-- print(_REQUIREDNAME) +-- print(_LOADED) + +print("Loading C dynamic libraries") +-- dll included! example compile command: +-- clang -v -std=c11 src/dlltest.h -shared -o src/test.dll +path = "F:\\carpincho\\cositas\\luar\\src\\dlltest32.dll" +local examplint = assert(package.loadlib(path, "testprint")) +examplint() + +print("Using protected calls to handle errors") +--error("error test") This will stop execution +print(pcall(function () error("error test") end)) --This will not! 1st retval is bool indicating success, 2nd is error msg +local status, err = pcall(function () error({code=6667}) end) +print(tostring(status) .. " " .. tostring(err.code)) +print("Still here!") +print() + +print("Error tracing") +--Custom error handler +local value = 3 +local status +local err +function fakebug() print("fake ass debugging") end +status, err = xpcall(function () + if type(value) ~= "string" then + error("no coinside", 1) + end +end, fakebug) + +print(tostring(status) .. " " .. tostring(err) .. "\n") + +--Changing error level indication: level 1 (default: where error is called)/ 2 (where the func that calls error is used) +status, err = pcall(function () + if type(value) ~= "string" then + error("no coinside", 2) + end +end) + +print(tostring(status) .. " " .. tostring(err).. "\n") + +status, err = pcall(function () + if type(value) ~= "string" then + error("no coinside", 1) + end +end) + +print(tostring(status) .. " " .. tostring(err).. "\n") +status, err = nil, nil + +print("Coroutines:") +function base(x) print("vaya" .. tostring(x)) coroutine.yield("yieldturn") print("adiós" .. tostring(x)) return x + 4 end +cor = coroutine.create(base) +cor2 = coroutine.create(base) +print(coroutine.status(cor) .. " " .. coroutine.status(cor2)) + +print(coroutine.resume(cor, 1)) +print(coroutine.resume(cor2, 3)) +print(coroutine.status(cor) .. " " .. coroutine.status(cor2)) + +print(coroutine.resume(cor,2)) --See that params are now ignored +print(coroutine.resume(cor2,4)) +print(coroutine.status(cor) .. " " .. coroutine.status(cor2)) +print() + +--Producer/consumer example +function producer(filename) + for line in io.lines("lines.txt") do + print("DEBUG " .. line) + coroutine.yield(line) + end +end + +function consumer(filename) + if type(filename) ~= "string" then return "Not a string" end + local line + local status + produtine = coroutine.create(producer) + repeat + --print(coroutine.resume(produtine)) + --line = false + status, line = coroutine.resume(produtine) + if (line) then + print(tostring(status) .. " " .. line) + end + until not line +end + + +print(consumer("lines.txt")) + +print("Coroutines as iterators") +for i=1,3 do + print(i) +end +print() + +function permgen (a, n) + --if n == 0 then + --printResult(a) + if n == 0 then + coroutine.yield(a) + else + for i=1,n do + + -- put i-th element as the last one + a[n], a[i] = a[i], a[n] + + -- generate all permutations of the other elements + permgen(a, n - 1) + + -- restore i-th element + a[n], a[i] = a[i], a[n] + + end + end +end + +function perm (a) + local n = table.getn(a) + local co = coroutine.create(function () permgen(a, n) end) + return function () -- iterator + local code, res = coroutine.resume(co) + return res + end +end + +function printResult (a) + for i,v in ipairs(a) do + io.write(v, " ") + end + io.write("\n") + end + +local i = 1 +for p in perm{"a", "b", "c", "d"} do + printResult(p) + print(i) + i = i + 1 + end +--table = {1, 2, 3} +--function all_permutations(list, n) +