From dee1a57da786f92375680cd463c8c65ec07b60da Mon Sep 17 00:00:00 2001 From: Leonetienne Date: Sat, 5 Jun 2021 12:16:50 +0200 Subject: [PATCH] Changed RegisterConstraint to a more streamlined approach --- Hazelnupp.vpp | Bin 818176 -> 823296 bytes Hazelnupp/Hazelnupp.cpp | 20 +++----------------- Hazelnupp/Hazelnupp.h | 6 ++++-- Hazelnupp/ParamConstraint.h | 19 ++++++++++--------- Hazelnupp/main.cpp | 8 +++----- 5 files changed, 20 insertions(+), 33 deletions(-) diff --git a/Hazelnupp.vpp b/Hazelnupp.vpp index 0652e275cf947623742c1c933392e4ee51b0f43b..60a5f6d6c26d6043ea0609cfc18b547e19b1a387 100644 GIT binary patch delta 16960 zcmbt+2Rzna`@j3XaW8xCl|uI3BO)R@qmVr!n+$`GNKYHgp!YuRW!}avRBB? z-v4v!`~05o^ZcIQf4u%)-Y@4q<2vVD=Q`K9u5+JD#HM7#BdJ7o+6@vC6h8?GGL(db zilOn&fA)q{t7d8-0dIYEcpr zW)kjOB@)S8mxrL)9W*VoCZI?;?tu7HCVc(FX%bdaQfk!nv= zV07fK?%-(<6R#;AOryxn(17G*W`3} zpDuF`%5Eg&Gw;`P)`m+j?R=@39UMeQak8JED^LwtfG#jy*!JW*vZVw`QL;pHp76Y46o3ONlkjRX$iy-&U$HtYzY3s4Xq6GeXN0pQ}V zataIzgTTXN&VZSSrg9bxk~AM_fF*^IbC@3}Xh0v!U(OFQktBfo_C)Rnfp%DEu@u7w zb4_3-P#7ddpogo6i$5fhf#HJYMllqy3=Ks)3MQ4o9H4NNfgZkI9!?&CA&|xc3PIZ7u!uA>!=Hx$Mb127S(LH)0b9z zX-;8^<9;6B(i4B|rhB4cCO1FVPrW_3^Vsy!ekUx z#T`XK_S6_!VhtfE@h0BpxUYl1!zGtM7k{2WA0B@fH;;hBw7UzBlaF^mpudBMcOZ|e zk3XL>lr)WE$0{huOGzmxO36UWN|@t^9~EWgBE;S$Wff#(_>?JeMBNr1 zF2eICb=6Gql&sW$X;}|9$gdmE4H!Lv;Fk~snqz}b~A<~clG@yn>6d&Y!9p9|* zf6D|)91r+W5%*Oirc}hs3o$5C2Vti`o)DiP{{R;+S0Wdkd@eb9c)ReJy7&co_`C2p zcsui$gPmdK;OY_>!pmdr6U5`>;LYRU72v}Y6yU-W2)J!bTnDXxviuJpf}8?<{CS}c z6owI!P{wgUqtCGC4w)_?BP}g=I3cLr7)J_yQ^tuwi(m1yP?!iF3-LtYs33b$oHFcY zj5|x*3P@3CLII}@&HCd!07DeOqRBzL(^xL3LJ_x3=kRaq&Eo($EMr)qM^reNo_mKrQG;s1jp{|8Rs{>TGyw*N^)h>QU1iWGyczr`EFGP1a4 zB((SuhybGku8p|l;!wjfnjgkU;x<9adr(p`hvJ76WpD+=6Iw!2QbvI&L)v}6i4q`Cwyx4aP?F=)wvK%V1&HX#R$UPf;rp`|!19|Q~Iq#^48bR4la z8F+FP&5nYWM1i!jE}@&tyD%sUl&qI8WD<&zf_MhdWH47Wb_{g%8g!Hyi^V}atLP?T zV?_uNgB5{kSaD0pR3XeADE=`6lURGLBQdSnSI*kqc>w^s3e;O-*fRU>h6b%{47757~I3eU94N`0+ z)u7oe(my7S@bxMw$bb~vPuyHYDpHD2X(pBl(jmj<{L}P<>{an8&;tp)4YAweatxM~ z2PQSZg45~@l=KS2|N1*=1ri>)jpIWgkjZ}J%n(Hj1`8i~fEhvMqhzocgb7TVNj%+5 zA-`e_E6n)_^Am*tM4n=HQM|-s3`xRDg4iHo{f8fto|c$~a4CD28bBDPr1@ z&?DME5^@%LtcaO_KS$%`kx=3l{4pr;8I~V9^9&0SO;QVQRX)fe5GaZI8+Z&%bqoI+ zEFKC&2Ql5jx0TyqfoXv}2a}y7nikhVgYz(%1~L5tq-|g_6=IqSq-|j`iGS3&3X_Qt z)9N7K5<)!3s=_p6m?b3Cj>H&%LnE^M3YL@M#i2;SpSQqGO82)1U&BKv6K(vb}CWvPWYXV6m05ixa30q2}i+u`lJi}5#+#z6w z16S}^A|WS;_Z_|#TDXs;gp2QEO@K@jcgJEXmK+jG#Fi85xI!J)7-`608=V7bBw?xG zPYeR3=|US0W~yX3}A^FELe&q4h$X=T)|R7oO9TZ#7;e-hBWL^NYxlG2`kNGKY+b! z1ZY}@VniSbUrbK@Ghhj2mpWj4cAh0)c78vWjiaD+D|Qw0t32 zCSXL7uVJ?VnahAoF^U2WWv^gaAwd+588Xya+ zvL9sj0rUd&0CWR%0dxX<1Ly!~184dgucL1UQh@8I(a074xN!(#zL6FzLY{2YDj)1|D1Awhc!UwEfz&?_r0Q>-g;4_hx zlK{kJ09i=l5`p?iJb)R1HNZK5^8hvgwg6WFCO~BY03iS#KnE-h$#F>15yNvR=H+SF zY6L0B15Sk?aVH0XHsKJhA4UddLExr=CSk{6Nfi|2rvn`${*n;!3naCCx_&L#Xfu@M8Y(Jkn@EnfEDoo+G@ z&|4IgbRIAEH?Ny$m>zoFF6BI+E&9%XcD%_PK;syQHXYCN?+y*Qv^*$_g?JUfHvJ#$ zd~zaN}@zR4Cf3qPd}dakZ3%VE0T=2VpnO{&+JDw9(a>so@K_kD> zbVM=<5bq5f(|;L^fW5$gKP*XviWG21VPyqe6X*cgmxmlmf=cI5M_^z`d<40`WITZ!RPo6$utMBXRLUUZ zet?s|hi{;Vk2myK8pj07t)jminql+CytYILSVRu`~Ee|s)V2Vi<4~{cv@Ig13!l-ug8&MAXZI$?qNd( zMFmM2=%XgSg6N(}%1bNCLbOP*=>f;dp#m-ZS%_x^eeaOL5Mc0SNL>eiK-Dv<#Go|OVHyop{kako4`mNVdyEI{Q$9s0ywX$?3zco9F# z@yBDndg-*7&folHUnM?Imk=m%5pPLKG=QNKycjMtSPdCPSzw%-;b;Hm_XWCp1pLj_ z;{l(*9RZX?h2s!0Czb^}cm=r-vmJs0eSoFn;pE^2+{6HvKpw{s9$kk}7ccK1Utqc{ zfcwgJ1cnka0Q@-fPtWo{_aKJ*f1nQeL}NLL9G8^=UV%JRkEame{F5eLAB3Oq4|I13 zu!jq8+gBTegGG7BU~opkKsk1!4wYjo z)bSfV`L{!j?$4q2kJ|~*_{YDy1xREYRGNX6dt-nrLmeKJl*EJb@J0jF?|_DX6V+G% z27PFs!N5KP^?*%w*yA^-VFS%i6f1GqV-*Vl6$@-SGNShFghu1A!Z0up+fj!~sSCO| z3v6q%IcyQA1}sQwVzq8?eWM^PBM0~bCDCI!Vby8ud!Q|V6^b`=2@K%5><()6K#ys0 z!|>W$EFJ|tlKgWP^g>A-82UpG0R|qzYd}>QLyIsdx5uMM2_yYUAFdl!&hB zS5|20<|F>K567=Nrg6u6lFMXzp}gkq@)1wCN+mG!Y!d3-1$QeN6@7`%1@@|(?|%7G zCj`Rbh4CdSCgUO>+fG%-y$HNuTe0J}Tv%LIM{D36;%NP{*Q=a;J--2Wi*!{V(Z`{AIU*XmAkQ=)ravdR4m!jM&*Q2bA z0(kva)!Q|rbaA;Y>2a6OtxCXZ7-bi^+ZF+qhU4;m3GIRI$kP-6@>h-7aSC z?30%If-h=NJ6}30J*wVCCEIw43osHAL&Z-!UA#s(N5y>GDy7!RO(nN? z(qWydE$T1v*C1h!+^Zz8)v57mQ$n(6l2s@tlEZ0}o9p{5VfVw;^dA#V5g;&zAf#{r7sC0uT7P?iSQeoA|lw+h;wZ^F>M}3O|3UmD%=Q zr9)5q3TXgtD7KJ*JL5n>$dE1W-r*jq-P+g3pLDyQ33s@?@8LEg4V<~R#8TCunsz;o zvxd&E$#v!i-_pJn(?^U}ApP~c|u?6U9wyWtUeL5>O*5)_76E6y%y~1?K@q@yN zk|QIcLE|DZ8K+NmX6ci8@2|himO67L#jf)x=hTbq`bjm~HH5YkN8e2(AK*#CeQQn~ zJaXx5@gxyz@B6fPZIX)q0R77%nVjo)9_fgqP}SS2IgR#vCz|hRPTizKiTi4}EeV_w z?gk)j6s^37_*8;rZc{@kTfdN)^qEg`rq{^y z{dY8^Sz@awsx0pjOq~#s#jguk)^B{8UNeYZ;M%@4@Me-a+9uKHsb1j1@5(@_prd@J zn$N$edNQZT0!40wYA^h*)}Id+wr@BnfB2lljdmf})m7T%#I2--9E2_FUZ45vK*q=+ zjLGZiq8VE8H!=Hg&l!`J+pUJI{ej=Id0m6qQ#alFEco$bbtHw5U+galhKVOwx1wS4H~0 z=3mI$q0h`R=qL6AEGwz*#)pzL4zJNzGWctK6%?(>w3xpZ#HpsSA$djNo3ugb*K5~r zhaaU&yRzi^%O-~ZA?M4z9ETFO4dqX-et2?qa`W{N*7x>Poj`uw8K%-&X;wGLhx z=-AjDzkgtW9qb?LDt*G5dGFX~*XM;7Zi?_}sLcOhJ4YWQdS%13MK3+!0BNi4G(6rf zbf3&O{TVNZbY;qN(Rp{jPn)V;dP8dgAJ4Z0IAoBgketuEJWu7L5x1yv>+|g<(cKSl zp1!Le#*A>y%KuASbol$(hfTsW-Q=wAH!|JcpO2-uzg{O2XsN=t9_~mu9`iiyb9+?E zyHZ!f-K|Hv#qNUoOLr1}r35!+J1MH(o;&YpboYs%;*~2`dNTN5l5-883O6{B8%tp@ zX{@cUPU&$F;THMcFGaN8^60(EBdw^*#~hNIQpy4ZTnWcID^Bt22hYUaN&~uZxWdci z%DGt&v1Z}LaF3Zzlcm`6xWrr%)90|j>zfCW8bYV-NBt)(Pqf;7A&I$x3`p8N8YfF1 zYZdePo3y7E2DBX^o1Xt>Hb#+yRf-lX@48o$Kj8-;LOlw9S zWpbP6YIF$UY27+8+f;)yOb(l>&)lp8YRuV2Kb?`LHz>h5CqClNNwlx<+bg%e`{f(* zz3HlW^YumZ1a$`ohb{Rd6k>VvyLo3UMqIe@eimUq@f}TU0=e=S*G}=bMZjl z#Zy&i(OcS>+H30HGMK(|Kk&Y?q&E|1e=Cp5OWT{ijY%tLoMz#hWg-&Iwc=*_eC~ zsUZkG+kdGvwN~e?kwBt47F-x)Zu!nW?)r+JWzPwMYLuZ(rQ5sYeR@%|0}iHup_KgA zUk4@2G4{gGM&`NZxmX|8l1QIc6Ke>rI@vcn&rJEWulA#w$L*>ugvV~$=P;RsYP|qX z%7-WRUp!iNWPWl35+&UFUU7Dm(Q;Vpm}~=8bmNV?+vsRDJ@VGu6z^OYU;Vl&D|27z z)^YlDN-Tj}>eQ_}Gd093kAd^~Lh_drk6WDep22@jBvpI)d}e!dcX9ew_N&^*A9}wW zn@#=@m=Y|onPvJ?K_vAR)2%Z`Mo~TYQz}w2E{Dv$&<(b&xfFDAoYp`7^|8Rtp&k{p z7_yhOggAa%Yz5Nk?!w9bt#6OA^qy^g4SMA&ESGw8m2gRkQ;q7Oa_Hk{33LT5507#` zx_s8EV_)UH>-o5jf#sWCiw%1!ALf$FDsQ!P32L!)ME6F<5R`jHGwrJkXQm%S#PtPl z)jh^UHBtUBep{;dXo{-l!8@{}7oOR2e*Dbfk+H|?e%W$ykYl`sRpR+1*Gs-pkI%pI zMkntMU<=x-2r*wLKBq^-7Hgw*RqvRX_b8C`v>bRJUtPVo9i6zvXkl5^s3vz~$w4|u z#;KSxIxC3H-dRkC!X`OTy zs`T3^gkn^<-7{Wov6YTRb1CT*tI<{+w|m~ZUryn2%5ZOB^vhm^V;mB53;mp5!&T56 z*U!CTCzj9TULyFZzW0{)fZ7;a#W;tZ;O*yu%E|-E^Qt|hc_!^e#jpH!JAGchSEjqr zdg92|d>0~$z)9_GtF0le;gN|LocC~cq^70fZkI{nt`%AL4yOLpTX+5_)gF20ui5i@ z?GtZRWNVky77Q%}hAh~+Sk)KPu8x3#(Vjr8m(U+AM@`y8v3Xv1iv^;~0#8bYcw zujZzyY=@-G&DYP3E-Lr`aJ(AlP3#!FcK(2DJuPcuy8@4t6& z>D%iPII+ ztdM#;q@JMIE~PH2QRlRe6(Jn~HoiJCndg5ZiCO zmv-!@-j@eX>V)+Xf7%M|E@PAC>K#e`K&+4qV=30%Fx@~BEoOioW@E)~|OWMN>y`qJjy~2?=#)JbQlDr@1 zAB*{>Ne)vU-xOomV!g5Ui(NdL7N_QU@TukF?eYH5UbawzK&Mrhfs_EpbFuRDs(_#` z3W#edq0A>D5|bip6+#^~mf?s5eb)50+6LyHnVrh2AjPo|gjtI0QXaF;*$CeJPpUTh z9c=MJgS(;;lXvoScX^d&=x6uV877Bc*12AFNSja^Z~yq(cyxj+y*cz!&r0RHV8{Br zW5-oHcz)_z5pu<-M^4GJieiN#y<7SG)L`968 zMKt?ctPZno5{5>9QE1*7u4yQ)I-=~SR1^^;=Q>Jd{EdL5uaMxfZ>erA@A$A?Ay|D7 z_GrA?PA_Ag_WSMC-bpB8*1e?R>Jz%pbRW+P8nSy+CKU32#%?XM8(irw(|If5E0&r( zJ@mHmTEP8yWtV%|$?{a}QN;mW%~m9DegXRLeqQBgbg{m7*^j;I)rpRGEtIuwO(0EG=y$xb{}oO=~VcE^;Xxl7jMDE@^Di z$M$DCMU=~Hg~1Hv;mddIElTt3Sbr#H-fAs_e#{3EG+(JlD@rUZpYz#l4mFE-)1-fI z_UkxvV$`X&6#<&z^1kNWQzkZhA(P>Zic&>0=g*I|a`uZR^VPv<(mutFR<}8_m>GG+ zd>uk}Oh8G%wdW@0wpNO5$-j&g6w17ChV1!VdQ9$_^D6BE^^OZl8NXko?Ahm(1!{RU z#J?guCwxi07-N(ciTk!J&rQ!hpqHb6Ptit}-PSvF{o!6l?sb-kq=j_{OS2vL9;?xy z2kVy3&JNie0OtP!1Jz-=7sg`qI9-; z#*i&t&Elww8!2;(REx$}f*<6hFF8LYB%O)LNgW~V8@QWqcy{b<#C(axb((T;^Vl~} z>)i^kAuk$cxH`KV`qPQ^MSFL|Xv{UT%{RB13SV4)dC&QHtxJ%DxK{huBe!ZxRE^@# zXp`>Hg)g(ka!`y1XKc>7^E-7$#HI!*QSefKyRvIKIY5Z_U)W8|(XKS;itp?b*Q8B* zankE*FCn<>H9Aal!7H|#ebUm>vij2Awu?1u81YM>p#u6*x~ylz5lu52-F3Dvc)lE@ zpI48rjrRIX?cw{ojY4a`@QO{~&tCt4yvZ?pFEM9N+q$do+IYtll9ZH$WWp%TcsR6_OuMDc)Z(@u`u-Jb7{>%qD+LW-M1e)zxxt%=oclCPp`2IAuR$f zDoUhp1~Dah(N`qu>>E1;XQ_%u4GjEXuAZ1Sf~{S>OU5|AS6on6=cK(7cJjJ^vXci- zk!?6ZBB1cxRbkd|EamLG>l&yyzu{-}Z@HIpj=7D`p1DU}+V2tJ_I0_2TgXqjPRi}( zRa=?qu?QAl2b!3cf=TtW+JT<*Rmtl;cZ($gbfcQHauY=FOS%l9cE25=O5)DuKh7cG zPA5fO@{lE!@iA@cXNpSyw;uFwaL%voJC96YX$dYnxO(QY1+MPcvnoGNyuf4fK8_WH zXnfMnv$XpyHmjT)uegamW7NZDr^n}0%n}uKyKL?J_V4UgPRHZH)G4bd%X8L-g#zED zjxsh*>S_r(2%h&fiO}(k`TCUm9h=2eT#VEf zo71-y>tDC7R=b|&*q7e@Nlu|M;j30fN>~dtA1U}TZFlt6X1tcyg9g{guEYq6uCwLA zR{fPjgf+Go;T$zD(m8TP!(&s}-yna`I;x&IyZ3&uRgIG~+&vUqn~$uHtp0l99{(B9 zf>%{fzUGH53aAs5cDDrM1eHD9i#+FCDOc`u-{e#_moqF$znSOp;qF&Kgrj$c$cqP` z%~ouA9}Oy1KW)(z=(Ua!MQ_nhTxk9<_ z!uI^>n}nkDh2W;>+pwhP&+Mlkq?E9mSx7d`-YBG&OZ-o23GlTi3CZV5Qnv=YWc9W* zR|eg z?;&3ze-;IY8?uN7Pa0I{ktCR^7j4nA*vQt>h!f5|xDs!hATnVr=xTnj7N5s)rF2X- zi~_-~bL84Hx9yPXPns9!;STLRoyL1FLaxYla;LYv>bY;B*dlLjf>>OZco!7H(Pa~T zT#kvd*ln1u%O{^oV@G}6tak2YQFWid#%aR@uNcOf(|Td!;p6)!adGREY;k5Hx6G<| zYyvY05A8|=s5Q9O+V?Ym^DBE{14DNE&)X>*y-xGB{OJ3xJ_e>w7lOas*z(0__0}C%dlmceN^-^1%Wp@ijxorp@@+R5Y7TvU*8hA? zh0V_W0KK?$8hyaic`D^+NDrHD3Ti|pmfcy?wB_M-smXy=rc&V+1wNz9n^dbVtlcEW zowe(PDT(HAS34{9B&XTt1^cjI>a|^Qb%Qvs+!?woA)Ve&v8VHr#a<1m(9P~i#C|&= zL2j8f{_dS^^lEXlZ@odvpONQ?F2wRHXW zvu2V^PlnJ>oXZWpeo9sH<8@S;%7p?KSwE@N^}dmQJ$%|MgL%K}*&Dq2`-ShFU+Nuh zlbxlmyK-W?LCT}@QM98p!SYzCwYc?)=>w5xwf@t(4VLfR($aHxljhE%rNuSIyh}l?ol^ zjx2|rbg-w7ZiSQNjJw^Ca6jR7sQ_PI|66L_DnTKO_PK|lW8ev!pUXonV_n&;(6WjK zNx_y8a!o7SlJZ?s;8!+H9Eo^woT7Fhg5c84bf)Lb2c-{>%kibb)#4{dZu3dhU6eE* z)pLAo;@wSuz3E-9RfUA~oeFI#2WJthCnG&ozFfPbQpGx9Eta+gl39gNTpr)jI$w|X z#x2Z%GwCrC?gtmnbZ^8tExZx*5_^}ubzhlseXg`nNS|Tg9CK^ruvF8l*`IGu33#&; zilnm&6XJA^ELr^3K8%!!{M)beqb#8%EKl{XloW}vJn8G%_EB4ZtLG&7@)^5yPLKVo zW5;`F!(eQ2aJAUYAstO|TItEgqA!oHduBYk6!1}ItNXFUyAB!0^B!6Z{pSu^8nd3M zgwi~W=XLygmzMUGX5n|`wMNDfvM~ZKOl$M@66GlSJNd!`_811~$;F+7@y6=>QDKv$ z>sOUkt2S=WIhF1`-bkyhKTwNLP>r%!^=(n}m#bQ9f**%`+gUiiG0GsuzVc=%r|Z-m zCRg=y)AJe8SEsgep3`k!mv;XCioPbVec|TL{cE*3ahd2)Z*ha(hrd2}EEZqBKnSfH zr1H>n8&lHXj$9Z-&3_g|oQmz)o1jpCK3W)7o zMU*4&0y)b_TZ+|H)!kCYma+s=?^(i&eD8s>55KJE>s%-5Ivcp_TJ|;;xu5R!N{tOG zhxvw}RCpLO+Dwuj%T8MBP4t{K8m#w-?|%IwGX7Jf_{X1v1Cebnb5&WMyN<<?i{ z1bP-ct86_v&senXDEfP>Vg9VoLX$vkn9qYE74^30GqyI?(VG={7ZbmCb)Ths6V%<= z7i81YUAS&bx3#bwRsCSGmLSrZplh@JfU;EMb@e*M8c+X4vC8DBXU|+G4ky>3@Oxyj zbx$DZXTzysVY{!gjEpm6Ox6Thg0AQBQ<{}CYT zshZ;+_G075EU(q2XIcE-voG>1@A?d`6|P^9{XM)gvt`yyIIz>J`x?=S#yG;}{Sit9fF0FQtU`!j~y)*h8 zaj1BH-tjL=eg%;_V|hjK3wGTM^IpZGG#BUO;zK@t{XQlV=-kw5VfCi0Z|Y=lb?%(V zB4qIj{l1Mjcv7DVLt#ecER4G=2{Ah z+e$hUXS(yiH)ufvT6V#55^B|-xJ_KiF}B*D+tKP}6^bh3md^YcxNc?HCR1?ntNvbq z3+d?5AK&VdIi$A7+JhAnlb4~fxJ&gRWUZ);o)8XlZm8{N0_B6B)E%O?E}-NukR3Gc z&30r|M4r=(p?X=1oQ+f;^pRq#H@$PlcPf+pdY=%_;DhX3iC@#YMcjn1@l`ufMga;j zO2-?95{~YkKQ}e#eb5@IkaNDGSY)wwPS|uN_=2?owTtfk-n*A$yM?d+&SFrMF*?{$ z*JpiFEu=2=KCSHA+rdoH&oW_w=O@Pn)8*uYl{-gH=9!qKk$0zDw6d=b_8uI`@WK>6 z57I5zul}w?qpnXmo`xvOA?)`czM%$eI=rv5wUY(PGY*;$YgMh-kCd!voD35WNY=Kg z(Rv=9wCC&SlQ;OLaFJxgw7!Pne0cqOpnIxVckHHU)99deGmY@Iu2-hwKjp=v^j!nA zm^ppV+e&@P&HOB3$+61E+pU;Hu9hmVSdaO84 zD*xym@$#qE?yg<5p;+3^!L5c{Ck%#s1E1tmns|BcUB<3A@&(LcFGxk+VR~qPGz=|j zdoI`924TnZQij8lV%_{+c;S(2s?VOJnS8w`-w&J;;d+`KMWT|@oh7ZD z_svL^gz5#RJxxVd{ea}kGyR*b6DPORAjlni0nrO>xMPL1Uypa&_;Od3_=T2fS~#{Y zH4T(Fz^h{KkvZC5zE7SJ^34_SSm3J=nBoqd9J!xGsEl2*>-3EO+G)CZy6x3~c34~6 z%de1&2bP;O%-*OKy5oTr!ftqnW_$00+e@g*11p7)gyuc40yq~qd1}CvlQ*J*L))`UCyd!gDnW}6(!{eykvkz@h z0^%bR(#-``6$r7c#j!XzrNJ7 z309HamWXY9aFH3w_Ng)iHrxA^z#UaaX%mel(Ux8J=f#>2*(mkJQ`r~}Ty-R@xH+45 zatF~6@FxCx8*VF!R%J@;lmo?a9HAvfWks6_4FcyPYUwgwPN>9PAhdO2#jRubX`)wj zf5m@%?^C*koZL20`c$i3oH=E+xaL+J+YlpvJH(o)Wc|L?E5h=aw$KxeBVvK9CNkG0##9+Lp{QWuC*QPjramJ|6cvh2b%?g9{ zFE#-J1}-y$-_w;vzuJ9)e2;2nW`8+1{Y5~aZS3pEMWfKV>|vRjM9ZCO{JgsTRV5ky zpRpHJob7{GzRw0|U68<7r18car7$VX(tazGERMOg_4e$09*;;GLZk4{Cc4{#JymBr zg1LGuid*iVVX5Zz)nSp3KwBNT)YCEh%EL9P$;Ex)Eb~Cp3(>IDnXIklo6MdLb;WnW z>fe;>>I$RZtR8n$Mg|2_l=;pzSDNTkgsEA{U!;sCR18me2YvPro4MM5xpBEO0)Mvd znN9Ys^3|ew{95YBFcM!Z3Ii0$QpjgP}PYHQ!(DvkReAH9Ant)BWwj?yY_&tpl! zFYV)qX@Tb%b%Wxqip&88TXM>84b&G?1BDM(h7;!#L&Jpei{-} zk3@cdGa4kBQ2Z^RHLSOJP)~T8cz;Y|dyB2UAv3c5K)7CfZ<8V-`~3wcs#I1&7P)V| zqJ7)VENO{syJJyeqNTkk~ zGSlVn>Rf&yPomu|3c zcs?RsZF88ipEHm z?`;#`^95Dl7koJ*dm8s~R2}LjSTzi!lJ#2vlcS`Nb#}9EaZ^q+q zypeFyED-wAyc{O@N<#Mj${jLMfvD{L#<%fk}8DdEZ2i`2GmPdScrWJv8DV@yBE zHDTCZchJOncNW2MJz|ym7$%|l&D!!l`xl-Xx=%4g>9J+?S|8}nj6{E z*Rt32@9)=0n_R=iFA)@#DDcx(XFe9UI{$hZiNl}Mp<>MUUQ&~^Dcx{dL*SjY=s(5l znyJxLZRGEWVmA|3Ub;OWRU}o*j;v7+7BCz!+TS=x%{k~`HBhTkzmMdO9G{9HOb&%~ zcIgggy^rhXr{6iP@%je)(@i1mSn^AJ>eM1qzsXl@ocWp{YcS2v^z>4xj-8vF; zN$PmZhf{}P5C8q~-+b~iDbwGAf)ERT#RDz=JsxO@7!L$qwlDt`0{aO!h(i4S6BmnG z`Bxu#^}qSZYyY#4{1)>9g;@U+uZ!6D6Tgew{P!5&b`U&_-umxx!6TS96k_|Y=wV;{ zBpS8-uVdNyD|C1F@8jP4Ycl(PpWy*aYEA)WNb>Le`2BaD*-;!pAP|4gAx2gqk^N8y z5~Kgd7*m2GGX?<=q|ns}@TeVx2sNWp?_r7Wo>6F+Ocw+vKnLs;AW(pTVjl$~IVg~% zkV!Mv83s{9xBf&I(f<|mN{q;Kbo2-Bz)@JJBME!&pCLmq2pQrBp|et$L&`YFF9pj0 zjU302!XQxS8=w<{p~HZNcn1&#N{q*Ghi{}{uYvbZb0|9Sh#N%({u_XS8+3vlqXZSA zu{2Qn7Md3Zk@TUc!(bvRMFj;JNonH4QBa$L_^x#HUqgxz#^nlN^hgx#-`R1c_D|^#ge3!?+6={Ii1(D8vznwjZxV4C!bDp;T^A#|DZGqDckMu#fKI2f-p^ XC?-*?QpBiag@1YHs~2Nmtxx!0m3oaE delta 21889 zcmc({bzBwe8aB)dSVf%tb6XcpPYN1xn?eWlSF;DM8X*;Yl(;uEJQ@`L?R+0 zKO!Pnbp*c{tTx{?5d};6fIh^*u7998Fu}t)Ng)R!B;-v|z@|WgpnlXV2O}3CBBCQ= z3CzP2okAkXLHjLKALIhR^C5T{L80cX<|Zs5d0Ej($zAc<1=SDUP&m|wU>pTZw*VhK zgCI#jLCy~TJ8?lfaWDvQ2nYyB2*eOb2s?2oi~L6J6yawE zdACqPh`=}wg8UB31V$n*Au1y(3_3kSQ-h=1C@pYE82=6G78s>9+3#&k(j$7*s}}I* z?>u1;I(88awE&6^CkI6gFs)#c5pDvEd4nbe+cMB-(9{x(1edij0-%sB4o8r=f!Tr` zbr2CK;tqL_W}#7pK0Kc5sM>HCC;~u6g%~s*OjN@P6BJx9D{$;@b>|?0b3`c86FAW5 z0~m&gC|i+&*rA)9z;*@GejL)M7>`Dvp{^3~hl1F$;>iir-WX;?@kuls35Sz_B2OXv zSw}1nNI{Ar&OGG6AD4;-MV>=D!at#D!OQ?#{u!6z%Hs4to(@*BS?i~cHqV0Xao{Q z1&ZiG0n%F0w+KdBm`-@qOC*wjltUk)VAP<~1bUD#qK9KW4nYHoXhOc#Ef_U|)@#hz zabZlLNFrn`tinRZB*<8-g+{Q#m_dE4qcz|Xkoax2&LoS_YJWAHZ z#>(dQeNb2o!wfEnpz#FpL0l^WCI>Egpy>(BqqrFafn)}~hakWwa4;ln?r0iJ5g3*+ zw20z0G%*D+Y?cT%3-ypBsDQ+L1d}MBDP2vBVF#bLVbPI&Zlz@7CV|M`PAxvahO3|& z5|i^EZUudA?8h^^xfqQ>vclvE$QjHof*9&rRX+mq-tXILWCWx=v|TKYL7?I4Zwbgd zzwgn4yexm;)~+BRO`+|hS*t@pE~C}q1T9*8F07ab15M7G|5vB#{=Yjl7?*<}F(g7n zzzv~Ps0BxTpv90}A2$ch!f-+Wr!Gp|(1Duvg&x)I^$*#b6cXsf;;X^Mlod#`Tby%m zpHR_KN(2wT*Ko<+9Hx@I_}ut{-lLhlxL+gAixtxeXP27fTAR*_-Q_Tx#+*7seFg@D z#XK$zVLo_PGXhI0+nPQHBV~faAB&Qn;Pe@xE2Gs|5x;KSXK2=jDooe01AIJH@G1?Y z;LC`W>tB_2E*8haUk@%1uJ35az4V>4RcwQi4sON3WCQr<8S9(78+HUH-0XCNe*iwQ z4tKh11h30Mg&bfJ`qv;0E0w=tN>>8-?QZC z@kwtACbwX`3689IUqo>LR6ZPb04gS-pAbC5vChY3nt>||=rmAT7efl3_l3@>uN-*J z<2{yOekXzhBoD)o5Eyyz9mmGoAS(!!^+(b(J}$-zWQ~N36h_ds;wbZFLYeQ_+Ztrt zMUDQM_-2p2?Lbxo$os!u7p7swX-6~h9_WY1oII-Gmp^l59X#V52AL6#Llzf8lN{y+ zvQ?m`Kqxb!j&deBqPQ9Z=YYd4K$a!wy2m<(<|hbGpqGv-;0=nTK&f3)6Vv!-LTx+V z;{&oLLRI@Cq5fuk2(qR^#y`?&*0Co5vgKiDK)$@??0?i}y-14UGEykMdx z4h3FW#Ly9Bm2riL;=QBxJOa(WV6PBl6(Gye$rk{!F8$VfbVmt;7*UMILT-T|>o3U6 zx_~w%SU$j(AIA*>BOc?K!Si0&T0(~~juBBzbL1Ngg+N2Tzc+LF*f#{E#AAYwM%o2Y z%zEVZ6l5KT-2PYvkR2Bv3c@PTbpO6+IC;G18A$1iVFPdL%F$cLMLh@2*zi(>Gs@WdW2aXjYZ>HJeVPPI7*xPgApoeIsk_f>hWgd`ZnyxU zL)J5cSIOHRa!YRLQEgEu3Nh5?&-JQi^Hy`fpS>-Uat59B1OjDQaRYBy_XR4hyckR$ z->O+qA$ay0otZ9G(N@vwQa&F>Xj~C4evYb3xAJCCJk-gpq9a$h#H81pj!~_A&%kCC zRjWA&^H!;g0y?Cvb{iTjV&xQ{MsGhHd-O6o=o3XXe{D|3?2CgcSW))Mw`;nu_jUVb z7{Z@_y%m-@vY)+vN|L#k?AdJeESJHT+nL>G9V`n(e=gN8n}M%6%$)sz`L1WZ+wFr? z^^!Hn7hVGQPE3nOaG#l7cu}oeyxHmHZ`9-3!-5J9lY0h4-+GYeZBw9~>!1F#{$MJx zReY=8+xbG7g4yX=$0w@>Z+=5X%T#~ z%3MLLD8ef8=HtNA2dM!}c#O*UP|I*Q z1W~Vvy{MTgmE=C9@^Q7%_B%swA%B98A(C(s(Qnjj$v8Xx&W4pupUYEJwUPaF&|9#F3|Qfc<7N zQQNy~@huf6XYizJx9u#2+f#a;0Hy=7rWd5o+R756RKK1wWYZm$jjy)wJ&B}ZI(S&s97Vu#lIRi zVA;az9|HB8b#lC??#r1GHA`+e%O?qFC38(m*UM7rzLZ|jN@5i^YfO0)lxe^cGi9;L z>A5!x7W!*NpC;#@iL84nq&mP5O7C%dc=~lwpWcOQqcPt$xOF{wLhh%Ti_*@M7K}x_ zJk=jGOi@v7hAF!^{;ZBYzi^|K|4Ub%5izdjb@Vpi3cqMjP~=#6KKcp!0+oh+o7Mwv zM1e;4BO)GSJuPu6LCWh*)VIzhaL>aD)qbBc4JU|~@{3R}d=^9bTAJJ~^4-kb&W~TT zAk}*+suk$&!Alyc{Y+{4q1PAvP~%?DiKxfop~edAhT??x&mW(c`LMK7m#C^M6UMk0 zf9e6uj7Nf#UZv3h=nUf_+bUb+lF06htV>_@j{PJ-BTHCJpcg0*!7xLWMOG=sB z0a+~Et*2Dn{H=?MV>@kNpWf=O$57tz8l!q>VtnSx4N#_bO7vVQhnv1`q2w!hjCaeA z?Hn!cw)yc@1KH2$WbKbhcfLN&`o2oaN9BF>+j2i}?^L0|c^VPurUM>Mx)<&IC8vSo zb!n&{+r1Epoz#g5yuKyR(?!pTrH$0so07V!2Ey(m&y=fx-x&+mSiw&Do&wh<}id;3Px^R$fGV+Fp zq4##|Jm4{^BN!ZxtETX5pMN3uO;^5Gw#EN>rp2oip}Ys16Sh^Oq>G95jQ5hC(+)RJ z7}b@a=5F=-_o)l7a7EuzoVmg=Zma#EWR8EP>$ zdI6SQq;7_w?iIck?itPYfkPs(kY5F^2DG8K>FvnS`&mNn7+&fcT}E z$XaZ7yCK(2HAc-YHP$%Kn`qje58q>ast4@!&R;lPAYqkVu4Frgj>!7-?T!68h7o77 z4;S&qcgmGpK;Q!_mz4V@_Uk=(JtKVJw zd>T0k8EO zs_SWs7XRW^_LWbs0_N&!ReAk4L+Y^Us?;sB-AYZBl0UU7Jd?CP`8oNlt0Jz?S%3AP z!!XUo+G55y;VAJ2|e!tDhC`6`kL{(d_i9+ZOpQ zRqIrKQ`$)q{N95~W8Rk4>z_EgM1MG2`2I4rT(Xe@(vAw4wCe~vuT^=kX zpHl+JSTAG~KWZCaIm7lY;9Kpr_-Rt?%eq#k9`O^D<}*Kf8csd5+juKdrIKdGeF!Um ze;*|g{_-k&QQ2v90?R8bPrAxnUwB#ODL|)l4CHckDF2qUeW8#;9@}9ZY`<8)=4&9S zG8HH2i4VK!OMTz1AaR|#+dnYz`ie6p*fbCi2-@{s|Hz^)KZb}drdg0To0*VRY*ngK z7gH9sSBQy!v{)BLBu&egS(Y9_$)MFjJ+!}=-`IxL6$kj5NO&!{%-y&%bYq$We{HK= zzSMI63*$D&L1$F(^)Bl`xzpSvyr{{ZPleYagHO#I*eD)cdwa8|Gr5k@FE}ee+>h-rFY7)^J#_KwOlI0mC=WzD`?d4s za!3yrdumV4%cxyiVpcPRJnS%5Kk#Ay6XDVR zwY4MetEs6Ol_`w=QlWnMHRm=}$Qa2mp*!|ct%`AAozB8#WhdQv8Tv~h0W?3e1ji=c z0s5tl{+45v9zk!vlC;w2p0~a{E(qV2v7t8lPPXMER-|h( zpmV3q@|aEQ;cfapz5^u_4(?;(x#*SnQk@m((~7`yEB%jfpd?SnBK=v zI`yxL-`0wr?!Em}pYR${_DQoXU$VV>6%Z*>TXk(Wz}TL8S#f{QfWNMH`TOo$pZCUd zdu|z=jm7g3R10%N=DtRkGdsvSsO3*+Fn?l`%ud-W-50WQc&^TWS%7IReR0>%IoNex z`|;k^ykf3d4Ey(&Iv<5*dhcpYUk)XeG*+=I=0$BMZ)vkz0Hte@W))+GR801rmnML2 z*7#4hdWK{(w({*~u6*hn`ypf{Q#PX!^*NMgNl!&IcR5@{OPYCq<7&hGZZC1lk)`tk zLi7Fc_hF2FsgD}NJeYrt_^TdS{Dt6xGs!(dFF8yV@@*3TdYt%N%lqT zsT7_89YW3A&npZU24m(dC=Z{UOSV(Buuc%ZVCyFmW4F+wqoA6)stv0rfRR^(d+g}jQ&)|U15&%?d!hAWJVK)bG$5ruS(ch`)m}% zXbpI;g}A<~0@)UXd40-Q@$%Q7naeUrDq5wf9>PYcry5dtdLwP9{K!vJ2&ufB*N^8C z^DP+_Y>WHoow7lmOL11CRo3l*ro|Mnt}Fjxer8#nGzR^>uydE)C+;kzNpe6Nlm}j1 zlj0K@zbZlepl-3!(d&WR!v_zgLblri<8y7zs?}R1Sv&)nm#;^mYlyvszc*H2s!v&8 z{gTpWnhGp}<~cQ|^q!-iC3J9II@L?fN#C19#c4`$(~|%F>Lh%;t0_z3<@&@&z&)ew zfSq~%UHQSsJwdCI8v{G?$#R$SKM>3fA{qn3F(awhiM@u`CqDBg=l628yppPDGYyO; zf6x43%<%Gish*loOdsf~&fC7T3L43Bf5{h@tYZB+g3qb#vKfI~v$aGpl6GsCO5Y>G^N0MNd+htR#!_rid`ebzZXKbsVpHiFe+iTdc;RZb``B{WA3ri-O$NA6Hye@XN z5&GirvCZcV*(PO7C){?fQS4&!Tf)AKPyOe1)8#j5O7*T+>CZ6OI?C{DKE6jS{-&a@ z>S|1M!hS`w*pH09u{3#2l>+lIen5j^mQFI>;3n#$7JZpu`B>tO>w#yj_0;8SB;Q;U z4l;2XTCuac!(+6{pZsEWF4=QpaB$P3`Sg>ls2R@Q!~1TzVPamAMYZgAX104f!(ElX zG=A;=+$~^x`f($zHZkB>5dS>%bJbVZeO?FD*=%R76Sle(1%f`UFC`pgRDL<2E7&+G=KaPIzqMqCJAgyaGW%7p88Ot~i_msCa z`<)#!y7u~SlkX9H=vwY4^PKgqVQS^PC~`5bFte$lv*Fe5r55@{4P_D@+gx(o%1!p= zK5q1`GOsejLB8+fvy!}@CgUDVPXlL$Wzz1C)yv4Ywu@L;r{9{ccX4nE2scTxf?sHk zW4cCdXUW6gA{3s|=|JEtWTg|-R~o62q0e5rb4SO#)Qh=vEdZ`NS;`F;Igd5dae z(;m_;CbP+wTwd7~vZx8(&;}ALE$e z0_A~71&Jk`MHtibXR9NRNk(qlgUybj%rHUcx|R`^5_XbYZ-I&`hj%Ubrp(UnCA~0> zsBiT13>&FuZwn4IUj9C3JMDJHTnHf{Wnhg}K5SZ$W#exUm2a6gpEu7161<+@aqNDW zSuzolbjQGDzj)hY?vl<%*E7eT$;;^#oA#eESIS&PTI;TJe<>d=APaXj-1zod?)*hF zvH9Ad9}QZ!V;$(lfpL|!tW_>P|BLZfip*?MZV3j6NTrwpb<3ih><8r1#ItV9O@@xS zXYDj@aeZiD1U2bZn;CC9xB;(kFe#1*Z7r2W*=oa^L@i{Vtc6Tb#WP#K=5lgfy%Hm= zGG7tHO68N8=IDjCe`}}_Z!B;Iet@*On~kE`y`D5$P-pdYS6(BxU-~61l0aP|J49!~ zF)-{>UhpD7{YGPo_{0s8ot{ek&9JSyrmzufnXGe$Ys@f7^8Wox(;9$(@uN$#XL~b) zbA(cZzse7>{xFMu>*oG~?qhuWSl-HhP!bokx(FJnRZ6V|tawr9k^z7$J=2@Vf@)cj@`B5 zjtcgMOG%=aH|qkYg=3^X$??Prgty&MkvsEJgDL}`=PZ+PbBXL3xz8AoR&Pr3I>Ks~ z$zg6+CZ50c!Y0u46Rf61ZpQ`7miugw}v0 zu2zNH%7_$As0i7w7P(P*mTRf1R%L6neI%IZ=TLD#h|JO^Ip^za`cETfOx7iyZ4w+N zmS)O!7NIZRrTQvkO2>8m?Mrr;u)SR)({E=ih1N|cDuQ}0^_{4UIcXCeHJu-b(C#TayZr?~Fo?8ffcMNTO zmx@lgDEu{yGpq^-^syG@FAUP-DnNeGCIGFgks5iM^sc%k%80LAGwSEl;QI4Gs*YmR#BBEUmDy66 z$W{Lv;Uv|f@m{ujEoO(XX2E%OuP;kK1!zl1iw+Y>ZE4CaXVMbn{B*wC)rGpO`sxOS zS=F3XbHk0k{NmwYeg#iV5o#-Lrou`VI{IMG>Ex+(BJwHjvzeaV*(b@hq=$_Kxij!M zS)#cep7(cr4vQv~p2v#Aj>yE6oBte}2t@s}Y$EXN zpJfvPr+=1B1TO!xY$EXRpJfw)?SGa{1g`(HY$DMACz}Y5YWw@yL}31(WfK9yKg%Wp zlm9H62z>l!*+f9;pJfw)_eHr@h|8^;P2!U|AI~g z{!TveFX%+z@8lEzf=&efPCoH3=tSV}FRFn(K(ehx!+|ARI?eQ&gfOp%4)~RKjka`6k1p$N*10fc|YY0cA^C*Nd2tOcy+Van0F+()m)BH&O!P6*r( zcp#jCzzcy7f&c_T2tp8qAwaLn!Nnm+K#+kT3qcNQ7!w382uF>%1Hl@C6@=RmEQtUj zxEZuz3c(nH4Fo#~_aJyd@P^<6;UR=079El|!5=|5S~mwm2!ap{Aq2ux2%!+3K?sBJ z9KtIIaS-AmBtb}qkOmifG`xP`IN6|Fp1bn-S9H?@1LfzF z4Y4ZMd_R4;NYBM^Bls16XmUyyYklrRYObtTS|bTetNszlukK_A6w~)=5vp)SWtxbE3a*21A?zC zo?G_WXEqJC4a<3i*Ie*B3ADwNO=6e*%vo1PX!5c?7->D>P|v<#(Gq#9bbYG`wblRf zLy?h-<;h<4k3)8+HLlbNkdE`-|9C)Rd*%&A5Yzd0 z!!De9L06>Unt1e(j1%JlR?uNL8qd&1{YFPW5Lfxih*OSRV44Y7tNK zDDz^(t0%1roqWcu(<}fPP&j*Ws*Jn*!T_$@zx4~;4t{C!1c$|zdZ&X|<%<#B8|zQG zy;z==4EhS8>9$$6_BQq^hTbPu@Kokis0xiNux}J|UZG%-l~{Ysp!^B9xk4)Xcs(e^ zNbU~#xiVb5_|=;?=UvY%p6R!}{@_vJrYc*C0&0o5s)NeXaU-+A*#)>Y+s~kGH`A;9 zQ`OW!Ph5ZDE7JKdM-_e;0`5An*EL@@Fk&eY+Fg`vYxe)Fom^6%{0i*k{CkV3P=%Qm8 zL=$-M0!;^#0+UcUPJ-|n3XXu8fpVKDQ*d+zg@TEJ+TS2SS?wlDviKzylCix14}n}J zA_+?a%l%y?m-jC!xq{zRas)&*7KZ*^DOZjgLcofC*T@zByGE|&KjmBmL@yT3gZTf~ z$w6ABE0FMx07v6sXjuP|Q0@Sc38%rGgu~lFN+}G~w4-J}_r_BZZY`q{kDJ{BMo3^@ zLXE~4f}>+tNOf6)U4xTKN{Wb!ONmO0K|R+BD)N#r5m*DTBgcodgEfWNa|8unY}N7a z39zOD%LJO@v25Td6Bb2KIEkf1Kr&4{l2}YwR9q4?7(ubYEWpPjC}Xswgs6zHgp~AA zcb+)P@*QBlGnO7~^M(rN_r`udj`^A&ppf!YNnm6dVJ&cS=f0NQr_> zAJC$N{U$5|0iJWl)*c1w0`t=#Q4_N*mYZ#f;;2A{6%-_Y<$~r0B!B&_lX?k?FkBTJM07wh zBES}_3*JTII*!U5ASehr*lHkFLcRAkk17ra(WB;x=8#z`2je{Z^DB~k-TEeksJ;-7JdHz?i*VM7DaS|N! z#h)ZFdE>_s#784D1=ff`16dsnDU^=p0l3V9r2rKk;^ja=KRlWcj>j6oF-PMs0*${Y zVe=6l10%i-9XSnBieY64=L7JyzlE9sDVNZUMXcCy1Z);`+CVXb3OAu(htU{uf^{?| z1_2)KVu%UIHOv@-MN&peMpQVjPF~~S_GXE^w4p|)-4ebI%o#q>HgyVii@zLbVp?}XXSqM0MA9Sii(?khi+5gN9zh#XBaMTwM>4?4YlaSjXNLc{M zcv*d+$pj+;DHGAMN7LaG0?NW*`zC@Oq#%JZ3uiEX2r?l+wwqX?KW9T6l;$RINCG?* ziUlr{VTr-{O$-gx#|ZfEXAeK5G=^l{|Mxj2jBY~^kSFm6P*@TI@iJQNSXo;L%S1Bb zk(mEHkL~gO2p9$u>Ea>PGZqr)Lf^!=|F_uI6b~tw@&B674e=8Q1nIvd{BEfB(s*Ph zoDq$LBPjk=-FwsmNFS_oR2bFo7Y;3`2Vm3$q#9%-Ag?#ZY5+z3jxY4zvRtq5_AEd>v4xV*gH9cJBGkmE_aW$&9p8yFwt zFYZq&t&^1dt5B%f*nh)LyT?QNidc{Dg&X~{1Z&=AeE>n?$}?}sn0CspI{8egEFHB? zvFBwGzhuLtw`J;^er}3oac_roK3TNCM`|;XNZ3^_m#%ihZTjoT85D{I;s)lVF_Lj-@s~ zn~S*XRtu0_^gZ;>dDGYv2sOKqSvX^HU<|XYU!7o9xlW@aQyqRjbl_U^Ion_Sg}v#^ z=1dDax7RmT2e?$@<*S?p#Xsn-ea~_&lbMmL1E-P*^~;GNek};4SU(b0+vQddo-4mv zeIJSMzRvWr**N85;_uaRK{3{ggyyYC>qjGPo2gR(#haG1(G1ZCi<;LZb%+&hXg$j)n}U_RCk!Sn_)AME+|FXhlxePA*G5awJdTbl zb8!R)M-9$x_G%eKB(UVgIS{Xub@GeTCFO{Z-1JTJwK+MI@j7Bqsm#Il5bL_V+cFjS-Xs7U{H z_UX3xwD3nsI+u1Bp^MYco`lk<=z{SZuXDwNz<_Ae$2@V73qQ}(^obeFED`UY%cwf> zYwvD$WvN5ysHcHbMQmee6swmAGkXA+p%9z7nOs!~MetXKFpafB))0rBeXE%SJ9?!Q^Y&FY^1`-$C522Wo&IXq8~l^`5=CN+i2;*1ARP;cNxI`14j`h+T`nlBYUa zLHp_5mO4exBJ`-1pL5Ii%C!ts(!PGVGc!QeVZcg6cH`spU|81LC6uos6I_-KH7h_) z6qIpg#!xMdpxCReW;#k6JmVPYkz~}im|-h*VrAx+CWcuy)P|$+<+pBU9gCFjj6n&s zwL~D==gi|&93|=2ozYbH$wx!8-In;JxBw?35|$xCZ|}Vyj4|Gh89Xm3LZ@zW#M%Sx z%?W~5ezy8^jJLd3;voB)#{1<#vp~1lm8QVPuo?@gi}o<&fPyR^i~MWGoQ6jOZ86Wj zr=Ivg;~XYHTS{7%T7Xv#r9Hzvt^4XFU&R$?x>vggYjsJnp6NX%iz%K$vjq*?PMrH! zb3Y7T+)qd_yjfs8yB=AVWc1*{Batz{@p<+iNp8X1o_p8zGx?@{fqg5BSbstE4h>~< zbgu4O*(>FqXeDLBgHBaa1^b(F2rrVm`P%*J9#2zix<{XqiK*$Yp{Tc!57%duk?4+5VYoisd!i`_7yJ_+Q)Jr&*K%aSN3Wod`4S zmugp;hDxwB<)@k&uruOk$(TSQGS=9eIgaIK-@oFlXq@I{$2WAG9V{y2qwb58TcW%k z--@p}(cGE$gK$^;)%0doQQ4#&<1c-`J@(HIw#1snEh6M(+ks(3mxqeNJoLT@xgq)A z=D0UqPRZE$7mh&;B&#n}R9-GH z$CF}*(FZQXE}z0KT&7PgfQ31v72Fne%Fm%MQS55zinD%`?v0=ANV=TvQn4rL!uN33 z)53d$+Rpvk_ConhEl!)IjlxIVO#^YHmtTFVfEqto(Wj@QGK|yH`8E>wOyL!>(pO=K zvGU0H0|)4Jei@JZZkO}o3*EgpG2f(6PkFz3!=94-+MXJ{#+ken_5+TnthRQKqelLG z}rZwF)5qk&RUvE}0bVz*=}b^+znjVdgBh z&Dih07S1Z7;=>nciK!p)^x*q!XJ4m@5yxkK0K$N)qP1&p%1xChCLxXzLGK#3cJS#NXh8@zqN{@VzXzN{bJ}Y_m?c%$+{_3_o|-s5`T9X zO1|79ai27_JRqXg)wt&qsql(9H4w*sErImcl~=ZscONy=4eU{&N#zt)K0Z&{7PY`S zH3QQw!<#Ry1_Cpb%6J^&WsdKa(!N`w2n zmnHDD$E0(d#g!FMRlKj!I-MOBO^`iBJ_O|A89nng3v;%}Yq<4&E2#`#PYh}r3)EtS zZeciBpFCBdSK~^(8}xJ?-nFA9+g5oy@%4CVi(Y2_J>7B{{;SU54Gcq4pz1l9&b!F! zy{o*X?cA134@N`{74uh9waR()iOCQpW8#b+-)crqyj8jH<1tRR(1P94;Lter+9V#p zYiN>y+|!>?6(2h_ZtE@`c&wkfWwDy>_Llf)yswsJnM#=iUt@oeC5<=!5?o7Hdm}~H z@mjp_%XH0Y6<1l>ikCuWZEEM&2EYB~lN4y--V%7pdlXtDrFLA}BkZa>x~V3NscKq}P}XVk8B%Nmw@>ZJ zIjFW;jZiw&SuliNaQEUT|9#bC-sgSude+H?o|7L=HgG%W&<6|BPoYoivv;Ql$;d)d z1!?-nse~P}xny=YOOBxi)GI2;Te>g6Ql#DV~(abfHb2<>TT+f1)?vIm?=yIeZthe@j7& zxyhqaaZ`~M>zcaG+qC|CoSm^g(MGFIG9R5v8BeBt&V-SW)qRx~77wfb!ZH#fANc*U zvvBzE1B7s}Fl)4h){S2syLP@)AE!p1dvlu|UO4o7`;LmF!@!n^1P9=ic5{;-&N7K9 z>>KWrHkfV;h!Y{gU;}F&e%0pZVrHUfm)IhMg4W0w%7RgNMOaa{gD3p=4oVriJi>6_ zGe=F~Y1D(6H@x{#j7447rr8VYEsXCs72}feJQ7KrZbw(aR?Beg6^U&|=SnKP+4-LUA&=_Giw9OE{5^|Lm!FA?xzqYHExe;T0$?S<|sa8@-z_(A&UpacVlnt2yb7Gp1tE{qHBSgn=hGBDCd}+*Pr#zdw!?M z#ib&bA-`^6{^rNJiOHXp$x-L-m~Bv6$&$=5NV^HU0HhsKg)^p&!f!qcr}zVn3k)}1 zguU@)ci%p(Gj+F2seEFAa_3FEYn$(HG}O79L3vh>IHON0XU6nI^g;;juW;J3u)sc+ z4I5Pppx2t;e_zBa!o6Y@VeQiPo!{T{hryJ4pZube2h!}l*OU))J1eCciyr*x#AvI>= z-(8ja9cOMZ?b^>F&>P!`H0FIMh|SNXP>Ww#XaEw2zdvn%-xx!G(9ja2q!;g0G5Fwg ze|+@z>AP?6f?*@fYkBXfcNutIj_bFx{~kv5tk2xm?T$f_TP+f zRch`5w&_kvR(NhfBBX#~n@`USS;c7MK0Oa?-??odQTqDMJ*6e@jPf)oIq&UNvjxqd z#ZIP&rS4qvp^tR;Zg>uK8gINbNnMrSzsEq6bcJ*=l)+GQ`>LY(VU_l|5LEbTRFuW1 z?08b4YjsW0o@DzG@&Xn%`L$AoKhH?DR7j-|0M7}T(}z*?FE-;P3fdm&QSJySnV*Wx z`gL2lA|A0iV~jcw4^+PKQ|yG_hOW)X{+zKqlC0~qOwk$|nY_+R-%~w|6JPW`kaJ}@ z7et!z(&fTBy&u`LB%&8~A;|syVQJ_euyGYez!j#PcJ7EQ>(R&dYu7y@x!!4-(Xy~u zw*{P=x2V)PzkBe-wV~0k*7bTin5GoTbL}Iw;mH1vFs^1EM!#otJbS-7o$s0-aQ8{2 zlpc=dqU0ZN9^9<;^=;1-{^Ieb$Hl@aPU+5%d1Pl47 zW$HZwi_^aZqxtN(EGQzqvhaDQj{3`EF0GjeEAQT4eTj>Nv|7N>2 zeGYlBHgXu5v;Vwhre;6u#j423hkmOE0FSAskUtM@1N2snn+r=y>@@+*+8C z_SpGcBEeBz{SCg1`kbpLny_>fap|3EKbX3OH^O^Ww9&oFDZd=jh;`gIM;!<5RxUnS zo|Rm>5G;5VdqNz@JXHlR@inKV_(Z&Q|S+l5eC7dmHVI)VdK^ zO--$L(_+|i$n>2BqivaZx5F=D^1&CVDNTXLy!uUpI6g~yW1VrR> zJb7ebS9@`eoVu2NWg)M$J4ybQ&`Af6(VtyT90V z&pVl>s+X4|h)L<~?!TMA=n>gqZm2CarIgxYsjl^|Zrd^P&-*uJ>c^kd`DyN1sD5;C zjOGGlX_Ta6FWK`61e+TGc2yrsxp_C4m8~s;dp}qx1iYcJJJ1k&NPG`g1s|cPWb?kT z^>~>y?(i}Dr>3plgF23tMW?N+I+ioTO=L^ul)HKh-V;6d3q z-F%tvthw~_<7}zekTmn&`o_0WLL8;QteO#bs{G9G@b`pJs(TLYr7ZF7+!BVbT3gx` zTcdH(YJPPsDhq~BB4!(_{o#bb=|tl-TGOm+={5jH!_N@L$?r~Yl(SX zh0XdA&Bi9L?X01%*NMQ@0e;P>3I&C<1xFaHa`#jJ{1}5_;rH`Yo(8(-)aTXhauT{W z>@IDbWjI(FsC{^NpxFOV;PgR7oj{90H7u*wJ0t|3Bk=92t)tPpc#d>Vk>^c=Jjz?k z+n>sf^p?M-7ZRWDQuB5ijJ;j2zb?zykyEV3mtIA+xz0LZ zD^wDh`R0vTvrP`rRnY&)$+Bi7zD#p&@DX`ck9U;aH@*%O|AzzH@a`yGHCqRx^}& parameterConstraints) +void Hazelnupp::RegisterConstraint(const std::string& key, const ParamConstraint& constraint) { - for (const ParamConstraint& pc : parameterConstraints) - { - // Does this constraint already exist? - const auto constraint = this->parameterConstraints.find(pc.key); - // If yes, replace it. - if (constraint != this->parameterConstraints.end()) - constraint->second = pc; - - // Else, create a new pair - else - this->parameterConstraints.insert(std::pair( - pc.key, - pc - )); - } - + // Magic syntax, wooo + (parameterConstraints[key] = constraint).key = key; return; } diff --git a/Hazelnupp/Hazelnupp.h b/Hazelnupp/Hazelnupp.h index bd957e0..3d4b073 100644 --- a/Hazelnupp/Hazelnupp.h +++ b/Hazelnupp/Hazelnupp.h @@ -46,8 +46,10 @@ namespace Hazelnp //! Will delete all abbreviations void ClearAbbreviations(); - //! Will register parameter constraints - void RegisterConstraints(const std::vector& constraints); + //! Will register a constraint for a parameter. + //! IMPORTANT: Any parameter can only have ONE constraint. Applying a new one will overwrite the old one! + //! Construct the ParamConstraint struct yourself to combine Require and TypeSafety! You can also use the ParamConstraint constructor! + void RegisterConstraint(const std::string& key, const ParamConstraint& constraint); //! Will return the constraint information for a specific parameter ParamConstraint GetConstraint(const std::string& parameter) const; diff --git a/Hazelnupp/ParamConstraint.h b/Hazelnupp/ParamConstraint.h index 4a10621..32a3981 100644 --- a/Hazelnupp/ParamConstraint.h +++ b/Hazelnupp/ParamConstraint.h @@ -13,10 +13,9 @@ namespace Hazelnp //! Constructs a require constraint. //! Think of the default value like of a list ofparameters. Like {"--width", "800"} - static ParamConstraint Require(const std::string& key, const std::vector& defaultValue = {}, bool required = true) + static ParamConstraint Require(const std::vector& defaultValue = {}, bool required = true) { ParamConstraint pc; - pc.key = key; pc.defaultValue = defaultValue; pc.required = required; @@ -24,10 +23,9 @@ namespace Hazelnp } //! Constructs a type-safety constraint - static ParamConstraint TypeSafety(const std::string& key, DATA_TYPE wantedType, bool constrainType = true) + static ParamConstraint TypeSafety(DATA_TYPE wantedType, bool constrainType = true) { ParamConstraint pc; - pc.key = key; pc.constrainType = constrainType; pc.wantedType = wantedType; @@ -35,9 +33,8 @@ namespace Hazelnp } //! Whole constructor - ParamConstraint(const std::string& key, bool constrainType, DATA_TYPE wantedType, const std::vector& defaultValue, bool required) + ParamConstraint(bool constrainType, DATA_TYPE wantedType, const std::vector& defaultValue, bool required) : - key{ key }, constrainType{ constrainType }, wantedType{ wantedType }, defaultValue{ defaultValue }, @@ -46,9 +43,6 @@ namespace Hazelnp return; } - //! The key of the parameter to constrain - std::string key; - //! Should this parameter be forced to be of a certain type? //! Remember to set `constrainTo` to the wanted type bool constrainType = false; @@ -64,5 +58,12 @@ namespace Hazelnp //! If set to true, and no default value set, //! an error will be produced if this parameter is not supplied by the user. bool required = false; + + private: + //! The parameter this constraint is for. + //! This value is automatically set by Hazelnupp. + std::string key; + + friend class Hazelnupp; }; } diff --git a/Hazelnupp/main.cpp b/Hazelnupp/main.cpp index 5e68c5d..719f0de 100644 --- a/Hazelnupp/main.cpp +++ b/Hazelnupp/main.cpp @@ -20,11 +20,9 @@ int main(int argc, char** argv) nupp.RegisterAbbreviation("-w", "--width"); nupp.RegisterAbbreviation("-h", "--height"); - nupp.RegisterConstraints({ - ParamConstraint::TypeSafety("--width", DATA_TYPE::FLOAT), - ParamConstraint("--name", true, DATA_TYPE::LIST, {"peter", "hannes"}, true), - ParamConstraint("--fruit", true, DATA_TYPE::STRING, {}, true) - }); + nupp.RegisterConstraint("--width", ParamConstraint::TypeSafety(DATA_TYPE::FLOAT)); + nupp.RegisterConstraint("--name", ParamConstraint(true, DATA_TYPE::LIST, {"peter", "hannes"}, true)); + nupp.RegisterConstraint("--fruit", ParamConstraint(true, DATA_TYPE::STRING, {}, true)); nupp.Parse(argc, argv);