From 981e31b5da3eef5dfa0e9114907e7dbb792f58bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=F0=9F=90=99PiperYxzzy?= Date: Sat, 5 Nov 2022 13:05:57 +0200 Subject: [PATCH] Larger changes, setting up card templates * Action card template now works, alongside Stance template * Modified data structures slightly to allow for a more concise notation --- cards/actions.json | 4 +- cards/stances.json | 52 ++++++++++----- cards/template/.gitignore | 2 + cards/template/cards.pdf | Bin 0 -> 31962 bytes cards/template/cards.tex | 129 ++++++++++++++++++++++++++++++++++++++ i18n/en.json | 3 - main.go | 12 ++-- 7 files changed, 176 insertions(+), 26 deletions(-) create mode 100644 cards/template/.gitignore create mode 100644 cards/template/cards.pdf create mode 100644 cards/template/cards.tex delete mode 100644 i18n/en.json diff --git a/cards/actions.json b/cards/actions.json index 43a9633..7a28bca 100644 --- a/cards/actions.json +++ b/cards/actions.json @@ -54,7 +54,9 @@ "en": "Cancel the effects of another player's Action." }, "Copies": 1, - "Instant": true + "Instant": { + "en": "At any point while a player is playing an Action." + } }, { "Name": { diff --git a/cards/stances.json b/cards/stances.json index 66beada..5997998 100644 --- a/cards/stances.json +++ b/cards/stances.json @@ -4,9 +4,11 @@ "en": "" }, "Description": { - "en": "If played against a Bargain, +3 points. If played against a Betrayal, -1 point." + "en": "" }, "Type": "Bargain", + "AgainstBetrayal": -1, + "AgainstBargain": 3, "Copies": 20 }, { @@ -17,6 +19,7 @@ "en": "If played against a Bargain, +2 points." }, "Type": "Betrayal", + "AgainstBargain": 2, "Copies": 20 }, { @@ -24,9 +27,11 @@ "en": "Symbiosis" }, "Description": { - "en": "If played against a Bargain, +3 points, and an additional +2 points to both players. If played against a Betrayal, -1 point." + "en": "If played against a Bargain both players gain an additional 2 points." }, "Type": "Bargain", + "AgainstBetrayal": -1, + "AgainstBargain": 3, "Copies": 1 }, { @@ -34,9 +39,10 @@ "en": "Excommunication" }, "Description": { - "en": "If played against a Bargain, +4 points. This card must be played face-up." + "en": "This card must be played face-up." }, "Type": "Betrayal", + "AgainstBargain": 4, "Copies": 1 }, { @@ -44,9 +50,11 @@ "en": "Quid Pro Quo" }, "Description": { - "en": "If played against a Bargain, +3 points. If played against a Betrayal, -1 point. At any time once played, this card can be flipped face-up to negate a player's Action." + "en": "At any time once played, this card can be flipped face-up to negate a player's Action." }, "Type": "Bargain", + "AgainstBetrayal": -1, + "AgainstBargain": 3, "Copies": 1 }, { @@ -54,9 +62,10 @@ "en": "Assassination" }, "Description": { - "en": "If played against a Bargain, +1 point, and the Bargaining player loses 3 points." + "en": "If played against a Bargain, the Bargaining player loses 2 additional points." }, "Type": "Betrayal", + "AgainstBargain": 1, "Copies": 1 }, { @@ -64,9 +73,11 @@ "en": "A Fair Deal" }, "Description": { - "en": "If played against a Bargain, +4 points. If played against a Betrayal, -1 point. This card must be played face-up." + "en": "This card must be played face-up." }, "Type": "Bargain", + "AgainstBetrayal": -1, + "AgainstBargain": 4, "Copies": 1 }, { @@ -74,9 +85,10 @@ "en": "Coup d'Etat" }, "Description": { - "en": "If played against a Bargain, +2 points. If played against the player with the most points, they lose 2 points." + "en": "If played against the player with the most points in the last round, they lose 2 additional points." }, "Type": "Betrayal", + "AgainstBargain": 2, "Copies": 1 }, { @@ -84,9 +96,11 @@ "en": "Contractual Obligations" }, "Description": { - "en": "If played against a Bargain, +1 points. If played against a Betrayal, +1 point, and the Betrayer loses 3 points." + "en": "If played against a Betrayal, the Betrayer loses 3 points." }, "Type": "Bargain", + "AgainstBetrayal": 1, + "AgainstBargain": 1, "Copies": 1 }, { @@ -94,9 +108,11 @@ "en": "A True Name, Spoken Softly" }, "Description": { - "en": "If played against a Bargain or a Betrayal, +1 point." + "en": "" }, "Type": "Betrayal", + "AgainstBetrayal": 1, + "AgainstBargain": 1, "Copies": 1 }, { @@ -104,9 +120,11 @@ "en": "Peacekeeping" }, "Description": { - "en": "If played against a Bargain, +3 points. If played against a Betrayal, -1 point, and you may take all Action and Final cards of the other player." + "en": "If played against a Betrayal, you may take all Action and Final cards of the other player." }, "Type": "Bargain", + "AgainstBetrayal": -1, + "AgainstBargain": 3, "Copies": 1 }, { @@ -114,9 +132,10 @@ "en": "“Peacekeeping”" }, "Description": { - "en": "If played against a Bargain, +2 points and take all the Action cards of the other player." + "en": "If played against a Bargain, take all the Action cards of the other player." }, "Type": "Betrayal", + "AgainstBargain": 2, "Copies": 1 }, { @@ -124,9 +143,11 @@ "en": "Cameraderie" }, "Description": { - "en": "If played against a Bargain, +4 points. If played against a Betrayal, -2 points." + "en": "" }, "Type": "Bargain", + "AgainstBetrayal": -2, + "AgainstBargain": 4, "Copies": 1 }, { @@ -134,9 +155,10 @@ "en": "Bitter Taste" }, "Description": { - "en": "If played against a Bargain, +2 points. The other player must also redraw all their Bargain cards at the beginning of the next round." + "en": "The other player must also redraw all their Bargain cards at the beginning of the next round." }, "Type": "Betrayal", + "AgainstBargain": 2, "Copies": 1 }, { @@ -144,9 +166,11 @@ "en": "Love-Tackle" }, "Description": { - "en": "If played against a Bargain, +3 points. If played against a Betrayal, -1 point. If a player reveals this card during the game, it is flipped face-up, and they must give you all their Action cards." + "en": "If a player reveals this card during the game, it is flipped face-up, and they must give you all their Action cards." }, "Type": "Bargain", + "AgainstBetrayal": -1, + "AgainstBargain": 3, "Copies": 1 }, { diff --git a/cards/template/.gitignore b/cards/template/.gitignore new file mode 100644 index 0000000..e53e7ee --- /dev/null +++ b/cards/template/.gitignore @@ -0,0 +1,2 @@ +cards.aux +cards.log \ No newline at end of file diff --git a/cards/template/cards.pdf b/cards/template/cards.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f8d11f8ddfe0549921737f2f14697b0a72ae6fce GIT binary patch literal 31962 zcmb5VQ?PK|wj{W1+qP}nwr$(CZQHi-ZQItjZCm|U-#!)9aZbd&wVvjTSP|=CX676@ zax78>5iwduI#wvs`Q?#yC^iBH0(&DXC>|atdKptYa~BH&7FH&L|9YV4#Vl=HOq~em z#cT{+OhrtM?M+Of`1qilU7Sn}ZJ|6ibCqQ6w-{i0Kh^ItaHblcB(msi5s&ubKbl(gz);#O6N&Ki@k9yU2qDfyTTp;x!f)VRfciupvtg_DVRHyW z6QSR@k4O=zj&W7>sUo$i4Gi>w@p2oKf&~w1)CgLIPD@>-?~$?!h@~xZo(mywjn@m+ z19hPHNx+!e&KEPT*rI@h5yc&qy zs3e8ae(C6bzx`Z)96md=|FHU8^T9Hk1==9kXN6@t?^`c`YQs6s`?P-_M^+AT&RO<~Gl+ymy zgd`=FbZ;j^sy@8zQeUlsJ0zvgo3nbGk!V`_Spk(1PX_&fyPD##t zIW%pLjhrTEfgwq^G|Pdq(;pqPRA1C8iZX3xwZ@X)GWX%$a@sxaxVDJS`zEr$qwSBM z_yHvt-c*J%wKMtuj`N?@|AGP|^S@()m4o?zjET}z+4v;}gs|IpRK6QLCJ!^4c;D^R zf*@d}LiRtE5y$gHgQ3{{xsAr;a$69J%Pjb_Z@I6Tk~l1C{uc9sF-AxRQYRjGei?&V zy1Tt+a2%rcewj=#T*AMn=O~C7#RlDEWDar3?B#3-f;I%^JQ|R3u$*9#C?=UbFt{@T zfP>NzmDqg8hJoXdrRWGjA$%^HU4l zbB$cL+UZvJb)cUbR8`okY%w55tvG0cDWcecs@)cDr(?~U?3QT)K?8!N^Fl zE7;^@90>F#aQd)f4O;tH&TmG1ykCA_J|65neA7y*mB^d)o@C|5=BoBL^nnPX*$Al= zRbb!53(-_pTuj##&2tur2@YaQc;2ZEZbHVkA_PlCP}_4r>8`AUP)$*8S)YAbs0LRM zKVVqN+Z$bY^JVj|cEAkcwl4L+)mqsGEBCStXt{M0HGHs)+n{A~Nfx#&#P3Z#Fo!Pn zcui+EG+YvT%NXSQGh}NOSj*2H^n+X!$aJ1nm5z?BRPrNu+&5dt3tJ_W;}@F~?k_u# z9xhoi%N9kMnp^4meAx{QYYk|s1@BNFL>EvtOgwIJ_Cc17xpVRG!KOcR?Cc%}>D7{5 zc6Ve3u-1y84u59UUx~hwT99IJhiH`+S@*Ib{JcbNEb`BgB$g7@Er3FHOiZBjt~s`HBV0c9Ui<;j1N{B|11vfI9hPhi4F4Cf z0lVp<*Wp)Jpg$V%-Ox1B#@z=tUPOMeBu?3Us@k+tZUswH%6VSI z$ZjMR70hrwD8ntDoS0|sm9-{4%{A9gf9{rQwMY;0rA18!w!&rw^rQ?EG@Ncj)HF&@ z-~4!}rOR3o<^&tmHsSHe)#5y{sL^v;NS|U-kVswvalCk5IpXa0q!xjulO|yGS6-~- zjMiT~-mLvhz1ewSooY~%N4jV{s3>|Vx@w@vPj>~U4Gwp)M9^HvC}l%Lp5a?R5+UZH z^HNw3Ytc(G0wKNZ>j_~f4=6rO7AehC6VEx43hD=M^G^+!CHQU+3s~PWrR7bH7(oDHXnn4J`xCcfi{ZYc6koaj`iCqv(LM@#jYhcgT z>8)CNxzOX(t-GO;qOYQxRBm(~>(#}>B$E^bbJ!$tf7)rhVj!QOfR1HuZh?m-Np4_J zZ$D8jIEV5&b_HdFT+RI}%RtY~(|@!8ly#TSt**Cl=G-WWR(jtKP_6w)6>xGgtLs@W zNF8tk(Iz0thbJfMaCUoz2fXA0tMrN|yIXgr>x->Tmv*H*fR{fC5AV(5_i7n$;s$?P zuf-{<2ZT?@$EDex7bESJq1egfe&JMOOk)O0s^V3)jJ*6EVtif0be) zB*`F`p)G$Ker5v#HmGg%-N*wsjF#hkAq_|^K-?CJenbIVa^6OqJN?qAA-2XHaiNQ2 zNE^ZOG|W9~PtICdsn5NQ<+jgZWlRq86Ng!ff7-MH6hiiVA0kbo0wJTd*zBHXufZ^p z3lhbkgpl%RKNN;&ZE4}MeUhnoz>0ePDXtJ$4sw=l3G|ceN7pyM4}V97yRt?FLe`6) zajCOz-&RtS;>qUco}qXPawA)J*^JpXg8&m8yKTzR;3IvNX=BN>GPJ(p>fzJ~XXvGJT4t!fBbeF1#UUI1ypHPL@Q zNUvT2y;EZ2Mp{2EgZ(Mil6o z>V+e-Hh;?@P_Uh^*d z?6Fn5brOXu=5=_MJLkg&ga=$%fl_l<-2CKQ6*;z9=yHmrOfk!M4=q2aSX0igC6_G=&k zYtG;D!6OP%-ZspZCKa?oh1pgO1S6|inF(-Iqb6$wJ}!2dZHrK|2}T?IQvf5|7p(`X z1M1!mNJ3cHpqC=A$P~>{;R@Mt8P3#%O3a7x{H5WlY;%-*S*cN4oCDWw>b@3g-HvRS zi&XqDq6AJSfL$O&$Z>2$(C{J8-|=vrbBk8dwSZNlEQ7(AF3q{?QTr)c!kXnsU{lbr z734-RVQ+v2q*bZ<4)-T+Q$uA3;1x*LB0Y)8H599^;NHFN- zg~BjJ!f_NvEcLAIUa*E(R@A8ixG+eJR#V*E+aWI9xuKK1Pg{ZG1!cQ+xGfJ)BMnUe zVz5slzNo{!W{@2;ky(b%sPv&AhzNjmR;<>7Z1Dl~DtQLdkjrq#yahG02p<#1LoI0d z?Q}km5JR3wTTU6m0n%8mQUjuZyV*{B!LR@v;0E~&km}+&144q!SruQ6w=vyRMg!6% z<>lfsSU8J_yFjclSEUU6q$=&o$e(V>=*#xcnWLZO&rOu+r?85f2kqGI^d|z@HN*&j zVxZLLDtVL+gqGXCQ**FLj511Dx)u@%-fz82^5pVqDPY)Q&CXfnsQm=UH5ygE#r1?j zl2@U%GsfP^n;Oq=NtC)UEP;uVGJ5#(8ck(g!p}aweOASzw>Nw0@b>Vcdz7%|lFg>3 zClZRuq3xZ3+5u^NfIy@(h30q=Nj% zcdoa|c{mJ7&A>pIw;Cx?JLqY#)8Lh**#w~ta$E{C_r@;4^+26z0gw|GG|Hx#RWU_o zxVFi6+LBQ>6N)CSK1RqRmej@0we-Adl(QA8k|3Fiq#!Pl4pAJt^G7g?HmU&j&=KYluj4JSC} z_i82#$qs~9vZpYmp!5=mtaT7Z5F$B{@TsiSh_y-)*O8j%QV_(R79*_(@+jV?E#%W# z1sMYpZRi!ao`sB2l-$pEwA3~Py{u^%dMjZ#w%{a1MyhE?ha@H&Ok__{%xdq#?hO;b z9Vvw>m__RpNiA5~;f3P5xe&Z1ODrY~g*R^UnPjYd}jCI4yekqEUeVc|0>t`N*2%gR>a3;v!LAY`K#(y9;6C@q(#0Tc)Z_WymJRqMNaJq>>x; z)D50VzU&;|Y5uM6-rno??%pSN8rqit7dRnX@h*tmBIZj1HGwJ=tA-`~0uAljxMId1 zh;3vtMfCv#E(Q%a8HgYN8Kv=5uDkEbrsp3iP#WCIfDD=e6Gq*27BUb78JVD&3Y1|> zIO4g_zeqp~>&84qF_>$A6*_~gfYOv@Z2?x02pux92r5Fl%2Osh99W>z;@3Z9LW>zQ zKYpJLP?E)x3_AIv3?|PatLP!87#P9RClvr<6*Gpgl?x&8iANFzfTmE+Fz`c&D|EsR zDDo8yh$8{GfP=^^h9qQgLW`k59lj{;A&`)jcUS#$60qjs-tNB1xCDzU&qnuxQH@Z@ z10OlW<{5+D69pVij9^qciU~PD-kdrG2iuCNaZ-C67y}JDP#ADG0Me!mSz&=-pg4m( zzy>HTsRF7h3~{dYP`#z*Fw;KQg;mDqt(4ot)=EE- z&}u~+75|XsK67SI>xO*aJyOHd*UsA9PBLgKy8Xsg^_V#*(RW@$OGxgy$aBmDdo`Bt>k{(iaf9irJF7V7YY8$A4B6b zGY&JmaDn%ID@2>dOK2Y!hHW~V7!5}e+9w!0{4pUX9qt>eZ^9l{-n64jSHsKN%C;Yh zdE!XE#b9sOx!|a~Q8Q!&M^DZ)M%zf2WiqY1qPRrY5jqR+**pJINdnRyX`Yei=~ZJY zd;J_i7%$4Kya`87>xf0qU!iut z&c;_n*6}E|Dqv`O8S@^$^~5{bbHU%?on>uPWs|+z9WB!W-`$=EsNPha#Z~nRT1JX? zjeJqI){opKjr_1js+JOk#^=IW!??a$eOb(I25u@Qiot%gu92UOtfi;jU~sxJw1n4O z-NW@r-tYLOq~WS(+4ahI>#?nGDP1G-U6ab|T6%*s9GzT!%chDYXwYgI%v?`qamX25 zbATJ)39P!MM3-VE%}=v5XQQgVE6va`33tT4iQJg3meZ0t!vHgH+pWabEB#nv5Df&bHbT#>;%Amh}0^E3`H|6@`_xOz2CnA!qH~ z$aQGo2|veaF-LD+ZO+SOl!I)w?e(;ElVkmb8;Ey$_Iy%}=kn_l(d&qm#(u4rHjtF! z!h#d@VT>PUp>}_i+3NKQ)1@5NPrquKo6{Vd3um zdfzhJk-cesjw6h0Xn$=0_qhmm>&IIgV9w02!~9(qS~1Bb_es_AJFX{B$H6ie%i*S9 zka^Wq&H8;tKt6vVKmB((Fs*FmnEv^-pDmW5DcgHbz`%HAF}I7ZuIW!vHF_O$Bio+m z){1a|P#{lG;@>>t%J}&JHcAp~CuOeKx}70K54y=w~LB z<5<~rzQxzn!C$jk$-IZGc)uo&h1O0EHbLjUxpIlcR23Iq-a|pW$Ly0*NK!aL>mjDE z@&>O?)K6FP@#UjFe*nyI^Q`|?ZT+M3tp8ijnF!d~|F`J>|8@RfR_MRid0!=K z1!Q#$Q;~Cw+P}?cBKBg6B1u>NUfa!$$`VtU%>!RQDgBW1eEG+klh84C;@N1vmDgYX^kC-5!?Tfgd(xj8OebD zW+7%S!qy;#$G8SrVm^rN3CB>y5CpDAj4>Jp`9%&yJUhe5@CaAhpYUC?(ZO%=@Q4=P zloApx;wS|4afc63KtUP~0+=RnM}P*-xwiw$$jnR|BbCVN1cD*+B3DR8v38JTpaJ2b z4O3v@p=jWaPwxepo5S@CR{nXE#~U&~Qu^?%)7HgHy06jVO-EiUd2ukP zHxDiN*4cu`pNzf6PUivlQkXZNn{_OCjh0X2$4{;@n6odsr5L(iDp#5$E;Epn*a>Hh z%zNaMD04Sk2_^T8xWV-!KsPmUqQ${;t(m;BP|-G%LS}Lxc3p_9_z+W*Bj{90)ci?~ z7D+SPS;?v;(Yv~-D!L%XFTw4U<&VDYuu4;-a+I#c{(LxJJ8!60O;dR|g(juKm{r`& znaFoH?<;|sc#hWJG=AqB!%`r0(Q~Y#C~WTUecr8xv_^kPZ$O4AeX-m7PW5>4FnntA z<=#W_&oRp(QY}!26X89G&^?!CcJFkaDI+dQ z_61+d(p6UIqqO-#I-!^gmPQ|4ZX8qdKs~z9oB(UX+CO8lC;=w&j<-M)~{g6%GEYwy_@Xsr$^e)fEWqE#x*KzM_gyb!2Iy{uH7`H^!PO(v3>aZ+-VbpN&WeJF@3# zzeCJi@~k$=xF;OD!Imzv822O6ZQW#LuR3BXlJflEx7iFzo3wk0t#;mjlZmnCJNWo_ z`H_`5H?Iv;j7%Gf@_DFDfUW&lx$m+O8ugp;P0>pke-QBl`xh{@ zf;+%}(Bpr1zl;QoY)owbDzKRd*cdsP|F!!+6`7skUoQE-SL9k%SB+)cbTAMQ7$K=j zz!K#y?ow?blZ=2sL$eG_taAiF%5yuA^OOW6$n%6G1uPK(NI@g+VH})B06S)5Xgof?AAe21 zaDc1cpMybDBLg@H0P>q*Tp;lx9Rdg%xWB(S7C?aj4RHtnC}80LDzGrLtSYim_r7?g2fEXwsAj74C zJc0e$&0AYX}1%VJWc3>JL0AT=wI|KcY`&SA__(BvcNazPaj|T%V zi5N6sAz_6L06MC|tg-zbM!13Nd##KNIoJUqe~AVq61HyBe%>4yIOx$Jgbe^RBFJCd zX}uu;V1^6!1?Y8baWJ4@KZS>3frUA~q5=5yO91|1;4f`bPQfAePhKR~|HZvrV$ zwlC$`9^{w#IR_drAaJN8UIakYkwZpS+yV&4L;P-|*npxyco2T3;M|12hfm=Ie=!kW zZ*va@69Iw}Av(|jU;>jM&xsp5k^pXgvnPXo`4WF&k$$y7e%i-Bf018rvA)x#zkYk? z{KHorf`^|2={i8)E@J`r@h}O10=&%ux&rp#W3#9Hr2)GJ_Vs?X7x#*33H%#X1&0Rx zUoDLTI}#~~aU7Z;prL+ELkw9A@(>ybVW6Er1Ogqldw$ku5DXx&;DiMnx_&Sz1@;3Q z?)H4j;usQ`|F#4C_3tErxZ68FEcp=DlMvpJ&=<|U_4m;E1;P5824H;=I^_5{r}mVv z?~ms-f|Bh!8;zBEt5G2$=-y zC?zRBqPAe#kFU~vbK&7|?MqSBvD!jFUjVdmlmB3&*)@IB!=%z+r*ZNSySB`BVf0LR ztECT4n^VmT`9Pa~PsuHBj&}@X9!;{Rm5^Y2U%QMOO_AR#xkD;M4Qcq;Iu|T9+9rDX zM`oC|$Rep1IS;_?wFlthbF5;^uiz*PBTFrci>IpU>l$}9WG30T&i%Xh)_W5^f=eCq zt;tA&(Kt44hVf|5+aW;)L3t zF-;3v|f?t{2>Ku`XLc3ar@-Vy_Kx`(5U-uS;n1}@sfr##aQbw`+WWx=;lejFp_IW#y+$6KbI%LMA7DUl$&oJc>VbaN_EJ*FWa1Ju_H^l%Mn zM1@ift}B)#c&T-_C6{^yGef^Hhts#RauXY}avMf@C|4y5H3uU~O6mGb<`Zde~$qc4Ezg;&p>r~atN7M)Pe;hSlHyH=6<+KSTy~RS# z>j(~u8x37IIrvH)jY;t{(kia$DzAlXpnRUJt{T(S54)=jHZ;m3jbR%$c{eNunVhf5 z-PjK6%p%4An2+TSJ_adyt~EAhW?ZA4$u81~d=?B{kr+L$Ei&#NN>`(YJ3jYeHl|7| zNX}pb;-^i8EJJyrSTDB25#f3Y=j#Yfb~2~6&ica4DgjNYERTw5kDY(X^si2 zUU{ZX&C440urGQtS;xh}db4=r#%3s^P&Qn3~vyQD-P2Mxi9;+TIx2IG*P7}Bn0dD zpR-CMeDH{Zm+xuqn}u>{(IdWiASKYrwOH=YoGX89@kYOHZZz8fh~!vG)KpRHpb26n zYm^tCt3@Q&OE9tDqKAcN-J?`Y&HNqLm&jjTSnu^bLVOdsq;dIPAW?O&`>F*Ly?fr! zG1H@4$)cQ~+>_CRbM7R2jx%3HPnuMGha!TU;yX2;W>XMnXttxurUA8-SiD$FYY&0l zdWQ9KUK`_%bK_P!f_@6UxebM962kXo@9d>kRlLaZwi3OL7$d|x-`72*T;T4eMtNzg zE3caZJmh_KdSpZ#Odfh|qXy_0KlHU@}|r zx4g3$U*OO- z2QG%Jr}K3PwxhqijAIQEE@eatb*N<*OW$Itnbt)QK^8uS=PBb%F6GV@ zQIXP2hrz>R(Z1HTIC#PTwDVCgA?$TrY9;yEd;et&IcRzBD;Mn>L}1u4XpMA_kKanZ zk4v3tcaE(RYEJ)f)ldaamhk++*DFi@7B_>(L9}=kx*Q6bGG+V18PrS80WS)2WW58PmEb$u6no#L)i+%5USRkpUdCbNOVLr4X-RUb@v8kXl z<4JqNe)E%P@pY3Z~UkmpmIJC+z)5U45MbiHhcF(*6oA?oZyu;S9k>e1?ufS(peo3dOp|Wtk#6o(vd+ zTRF(Y#7iB%7`ftp_BvP6W-mW85|z_+c|z@(TPNC4lInWr)bribIR)s^sZ^N#QVFMQ z?aHX)6?(5&$8FU-rU=+ZYUvnx#XX0W5nO0>t84Lgf=Ff&Os7V?z1hVmTG3EZQ{W#h zE+qN#VzjIk`lfKqJuLL^gZ`-I3f@(HI!fG|GHT;L}6ALs$^`ykIjEw zAkwUNW8?NOMwUqbwANfkW%clBEv?rqOInOi(39c`J|wjj8OiZbV0d$C+Y z+%kSt^81_Zi{bQ36fKxxZbZRpd1ECJQ+{Zmuo)_Jiw4F*>S!Ika#vj|9+2%)V(2ra z#^)PjXpP!qPCeK)@&AR(o1==gV)xfi_-Xr?!G&fj&QeA<9L#rgnuR@zOqA~L6Xbc# z=`Owl4NVnS^%aWh#fNYIv&-(>-j`)K$Aiv}RLKDA+t^&5P7+T)URxC0sJH12@jQKS znuMy7OIXm-O-wm{bqa5)oV}6xQ|F08f@KxT<;y1 zcDi2LP!%L)UE<_2*T&K#muLxAC3agu#AV!!vbnmg=n=tAGZ}IdK`+hl^r1-ej~JB) zFUk~A9-QG~lVVaFj9hT$hDEMkN&E(&zUUh22=L)_bgEp@1&EaiN{((7r*wWO5w+$n znv89n@iTqwwrS2*O7v8)bw?Q7*@99eTBPjr=S__G7|0Sv7q;J+d@P?-8VOmRdrlf= z&h*MQbrtDii62YGJ15tn@rMxZImo;)LBuubrw!YA6FM-ql$6%34*9 z0)wAF=>kErD2wwtnBu*?H--wWsH@o7ueH@-3k;Qs@i6R-g25hjazo3qnTH~#m!LQe zgV?2@7vgZOyqX~%U(Fj@?xfyC9OvzLpag8Zw>sHp@3>*#b>V@vReCLJy+4QdOf~6| zQ;Q}7YfoXWG`|rpqm2dXx$>aPrqzaWo@@Mm3QIV}vtgsqMQ-Zj(&s~;YRd+HOorH} znUV2~UX$GUoYRscX+Ga5lM`Q;YMX(@w9@!p*kIGG(hB>Sw3!b?ojMI~usVzG6~E;1 zXxg(_O;7gT1K$F1bs=j1%=4@5T>kB2PK}u6eSM7j)tnstFejRIsc-Eqe@5ihUWI|& znZDtJNjs%}QkVCc7-lVE_G=EF%0M;3JWPzkzHU>W4V#G*>}!S+kvnvOMiE=!62|CW zjO=j=!ZL27A6v$w-=C?zKbeo>m{lg*G0mP&X?m4s$9)Cc?#6B4Kkwt!(S0LjBO;_r zq-FQxz!kIT1gYZZUPs)880LAqx%5v?ki~FN(vR=8SS%>6Rec1Ac#c4Fvp|i}N^E)d zxOuuMa$ZP0tJLPkw?!9Ls#UF0$WnYV+t_|FTC@q)WERw(L$8N)@2Ra3e*)XWE18qG zll9bRM9a`t?$DvcbzA~rQ1XOZ@0c$s>~3m?Po*qC&qwR^_Q-?Y5-&tY>{mn7{(vuX zgD8vc-mg2AK=}Nagz|MvoXO;&uOIP(tQ1BLf`4zp$)ws`XV$*u(TFu(x zeXdg6Y~h8VJgT*wh*|NJO2qSfXoQo{V!k&S1&Xh|q?310D#FyPl4{#`)&|Y`eHD0MA3i^icc8YF!8w>0>~CvK0(UL2TUDDdWR{w{)H-yc+zJ(+aPy-SP?|0$B}!HT zkiyvo=vuJ7PA)CeV{^*-#Dqc(%QEizu>coTxS|@{xo=|d>g`5f*Z&?ei5C@l454@yocZ{nd;1m8Z@Oq75ES>}%v8PjGh z+EMvusKx)PYx!yi4MsI$6)++g@j}#9hUDh1CT(a@b>Arhoh96&i2g?;O}pOQEv;io zjn41$5TmnJY#KE^H_&Lj7j;LD|4`i1+i_MdC>2&r);`5f8iU7>;S{D${e0Z~U2NjT zxe2+#4+Rf+`@wq7qhOEs?t%=KrRt#5W+)ixVy)#PTi9UidTxsX)(>xXBp zCOwa>F3#g<=5~IYc+O(@v#A#i(3=i7qGiTc2t})?f)!SWo43fa@74hQ((#{4$agy> zTqLlI?bAe8cKTawwr*nmDY)oILOniKr)ZR(`AsEwVx=C;F|GPra0?(-qea zJYVeh?AMDbLv^zOH~PYwA-na5^j-}*e z*;frhWgpJ9L^7w-Vu-xh#a_Oy40lcrFY1(?Fl7a59b9CbOzH9^4#Sc`c6{VM%|!hO z5osuvQ@HlmrQLn(-Q=I}6QUOA5w}O0cS;0GmBvlsp&)us*NvweUWCXKIPhI~e~E&! zvX0FRf+D5%(Eg4U%&96^!Al`Bu&LdWMF#3=!1>*glqf;P?fc( z9y^jNOMdn^EQr@rmT?SU)S=HLBJ#iYk*e;4fqT3oYmg>iPCneEcbM$KZeNAc-N_Uk z3yoAu4|7vtc8lKqV12G%N-1)5J6>;v%{R?69dMys-I5qp#qE3M4pB}t8D>Q2%BajW<9$XYSFu> z#Y=DG_5z#y=DfOk1h1$}PyV42KF-A<{ZO$Ql*URMKRQ=x@6~s}M1#vCZfkQ2(}6s? zkoOlEn~=yNlg+q){G8;=yXU0M^Dy+BscXK^blG`2r89W?j-sfVzIzV=+pe>8PS_G> zk`_)2G9_5k0|k^dlc~2(Cd{c&2K62Rq#CI5M9zPt!RUdQW_ON#C(hBzp>cXJOv zS}SFrO9I%~?t<<L_1F}!wNuPPopDK9g= z%u8X6hA;-^oT*j)?rV7^J9Z=mdQ@?IVK>s%Z3;QrWN+*J+uiQHPPm}@MAZdoYmD1~f>jYX-{*; z%!8t3yXevEPBr7hpj{q9te4bTk-|F&0T+AzG^g01(c6<@{L!(0s`Y-8doD%e2o>rS zdmIzA0RW4?wKkNjvlblO5o|*Dh_gV>>J0Wp&<>%hL=7xtawb?OSczh|)K;z`OGRBP zf^kfg`rvSU+-0S-KeKkU*o8e~ zINdd^8JkbRuVu1?EuXsQvsTRjX_h;`N^^7o0BrH;{@ll!57xJ21*# zdqeF#ywuTLp4ACD6bSE~cr<3V>*>D@_?}xe%0&eat;#r=&d$RA*~c=aruEht-tw<0 zEnRWerf9z$l-au~QTRp&Xr=KlLb+ypx`Fu&FeBDdu8^k=!_0|`=VbVaEWn@EnH$Bp z-5ZL#PZMvLz$^3hKla4S)qinI%&*DdNn+fLW9C9U(YK})WH{*`D9ZHQHM9{;W8dBt zm4Mg^I^nLQCnhKUY?PNl<4yP`vZ_!>)A3r#q z(t!Ed?4rt^y+0g@PjVS23n$n^w*n=njNbH^WF)BhXjBH77O737f4t>uUOj_W{H~Ll)VSxuviIIEXMo^#_D&ik!l-6dOk7jz`e@w$ z@G)5vWu0h12AbmUH8xlDBg|2{5B@bw*RB}RA#z_K&<)#u`0@wvOr-h!4w@bkCPwBr>B|&|;rXNdWM^q)6bhuk*Wa8D$b{2P5=eO$OUYC1@doA@m*b$IJ>z&Itby_9p!1gGp z4g8Z={5Kq!TiZJ~EIT@O!b(4r0T73_24L>YHLZ@$uHkOu@5OBY1;`iw3hu5ngp-&k7{AYtPVEA<0`v^W6w7XQ(S-M;_DHf_$Y-F$ez zS=bLRWI-qK_%5`8onhpks=sF+cu02#{bNj1zjzbB&?vw42w(j|x4$vl{-$1|nZY)IZ1%ri*>|FiZx3zkf|=aUUhmn0 zGBh_gerL-qZH`XEJ)uKx|0-w(O#k)CgfBb%aU7EbvGb|D?i$C^@i4UVfF!|@V{UUsovN=1u`H{chg5K#p^UwLu^@fI) zhhi>H78Pe2MA&MXby?H;-OP8S`02xQKh2{%NCul7v~h+qj4^yxn^iY8U3M?Sg+Z%|(qbJt5B3#moRv6>a7g|pu;6=8Ee z%U+?ed4EunXRc&(9MNU37g^>MjcIC7IMIk7s3Vd+;3p|(L5aEMMn8~G@l^L;ih?X& zF{Qs7+a|zc6{DFhRX}yJ>od0UM@+y@n_q;IWlUK%-y4=xpIeDT%HKP!AVw}qL>Gug zu7Jg)k=sV2j$pWUd?XP8uD<;?VwF-@%*!>lT66!TyD8;G>3Z&|!)3MYV_lF=hdoAYm z_3;w?=P85gAdYHXBGN~1k~z5~0!y;}7kKntxZ3UtHNQ#tWraBj?v~E=K`ok4#c^z7 zHEOm`;?N8Eh-ZL7xLyh%->Hw!F9}QV3XY{?TmRD2NLP;uatd4jiV~>!=N>i(6k1ph z^!w&+?-L;(Jv&so6+85eA?XNh`DA$}lD-?6M8FP0+#bGTxb)UEBzs*8D|RC_*{Wn9 z;K*7|!o||n5&@l)%*&ff%XZJ|lv1`6i$alNWZH_i%zN+D8cx-bazX#j528|=N-8^W znDBvlr9=8WSGrA%_M5yx1Duy^`>LG32vq@QKbP_tN@wbS%R{+dRa4d*5_8xRPA))3 z2|2l~j2skBJgKVv7;0I|+x7XGPE~m&u5%p&Ido$L^VmFewif>Cr8`=y5%spkL=g3_ zKm}sh*l#`dzAq9aQfU~CE20kP5SP+}ssE|{R020l=Qiz}D)f4!vVBUjaK_}d6oUfu zq47ALF7Old8zXjhyLguW$&PTIQWN)QJN^t}FVW+$Mumn|%%=<_^`m3=p~C~Kf|k$KrL>aWqX@Z*1E?s^s@Gp{ zXb;iwe=5`-osoOM^vHOg@0JpU9!@PoeHd-RzlHZSTfjtaWdWuJ^ zsTKJfMi>|1O(w0UX+wGQ>tBsUhiY#sQn*wh^(}f*;x}bPG-1ntJy+N}xQO?!zJ&WnoHQ6OoqnGEsN@H>AwM74)#@;bVlb~DI zZriqP+vc>Mw(+!W_p~`}+qP}n=Ctje_I&f6vv;!yPy*%3SSneHM>CL_NT>ZX^ubZ%ey4fOxyfFN zq(6neHX-VaatY|yq36r4VsAEo;1et%2e<6xx$d6R;|MM6Jee3ZYH{gK^hbi@v!jAk#UTS!ybb%-K zeFbugN89Le%3v*zMWSoAj(dLnRw~EOvxkNctN+zWh@S1^3E5|Kt2&t`%O+YrjU_Hg zVd2qjqE%O4D^FHURjRJB(MN{FZ}VfzJQA!{7@PiiXGMRBoSt4$ddPesjC?4qOQ3RO zNNA=GR*lvZb2sY8vcwEo``_Wsggad$#J$-Ms2LgWIm_b9B*`^jm23PP4!hVW4y2mu zw=I?SilEW6R0(Wa7+o-fM&dZUdnyywe*)VR?UG}$wI9v z1SEn5avMqtZf~9w*ZxO>8vFy@VR}5vijH?`442~b4I0z@Y1Py)SN#SY`}G0bldG+fQ}xks_8>yQI|cHD*4M)WJmxzkU*@2L);p<`;jGpK+DrSsT+>zCcohJd$ zO>tDM9f4ZhP#U=;d6I=;xl${QMpY|@7$X4_tex`NesU7uARCZ#a zr4+5Jdko}*#riz$Nck@vQ>h8!t4}=i5U*HV*|CThw3|cYzS!7kP5;lJcqN9O6+i>f z%BU+4SZI&2645JbZ{t68p}{JkH7e*rGCJ+(UI3t@c--UHA4pK#e|X~id=+n`Muy~z zT9Qux5naZ^s1lfrF-K(hi_Y`ORJtkMrTpiSyv~E8WCrYD;30Nr!^EVtiD9x!BU=_b zjTR1WvoAv$E(Kf{CdqKK2o7CaFpv$IVfpaeZo55-*Be;L(=3DTRhF~&X5W|Eg6aOSsh{sz!*YTPrO=a}#t?WuV*b%~jg@g4w!iJsk+xYRxczSO1 zE{TU?m)mI-x-!Fties$w*Bw{RkJG!*+0D+f_G)2mbWd5y2OTCXs1}sjvtoeN+u_8a^WKp8Qp}6f()%h zOau>#a=#mh?}!EF(2b1sEGtuGCIa9e^JV z#06n99?@4nF{W27fcX(8v9Tju7%wfZmd=6G|O=#|1|xtbbVgDwANHvm{0+5DbaG1^Z= zcE2oZLu^*Bw`i?YKGl374%&fx^r(z` z*A&vLqriF<<7WTz>2mAtqI;O)?u$t!g1Q|IwHM?l9*iQknt5&A>PJK{U+N4_q{OA| zAp%4FBwDUl6na^w!pz?Qm_df?RpP0Yqy5Cv(e5o8BD&HC44-Ynb4`uvlLPzs?aNV^ ztxy1*{FJhoD6*uT>W(W4nPSZ!QGcYe&e|&DkvQJkc`H)B5E$L10dw0wy?B3!{;rXY zg^Z39h#J+4tzlSj1pWM(-YO3B0+lKz*ov5Actf^Y@6!^!#`>$_;7QH#rT|n}U2u_m z?w$VgQ>0lz6u$~)aP2TJq9k zmJGvbd0GDZC8V&2@1J#&!OuK9T=!m?UW?!TpTnHuJG2s|`8B1P#cb=YE6CqrD% zEuIriZ!w%KVv$@zXKA7Mxbh}_RGbh-!cRunzJEQzSv|HSS_*527B$L3Vxk9S6-<;5}1jnK<2GnlR4UZ>?VxTXf_6%z2 zO~9QS=(sVU3}}@8{&vn^G&FN&I#O*OyfPl|ROb3=m9kSJx$O=J{#()Cbhu1iKdvG3 z;_?Wl1CK{xZlI;j{9Vc@g7`72Bb{Eu_3?`!Ju`}t*lUooM*!20z~WK9SPev zpBy*al<-0%e|OPlZSxLMBd#^ki&yHqV5z56S4YN3!xCg3LkXGQM&6Vyis2asOFjFF zBaiJ%H^JR9sq!~SVh-fevM&n*mF~V(eJb+eqD<@z%cB-bq17Zo|7%;TVKHLCkDh)r z0`l{{(r-aUQWyJ;TE(3DQ8IEp8S(|h1XvJ* zqTe#9%)Qza7W!Lk1XrYe!Bka}X8wNk~m9DXv(r^z&f2$GFJ)`_VNWoc9MhmOXJ5Oc-sAW~Mo7!kxQk^V!z+!wa3dKS`Ct(+wiTLnKom6C zd*E_jsrJz|b=AvnL&!`%Ek?@F3%!YJP~%N4x>vOLt%!ZF~!C`ILM- znny!*@I?H9)8u}sb68E&r5iM|n?XwFep2ew0cPcj>G~Gm=&A-Xt4H_{t`t`^V4qBx zAjoap8HankEBXal4S}%1wbvki7!MXP>y))CYuj*MU@jH?ff5K7?J@ltxBJN-Z6K7* zz{P6p=!)EMk^P#L?ip8+YJNbQmCPsWz|L)_y*&6U00B-rSk=-4!xfwkD{;&!N?UbsWHfyXvbVY@&m$rB7vQUcNqQ5V^GVFB|c?-ZIG$N*+mT zOJ#MVq4Q~IZhOJ>0$sL3UjJTk%#=S|&mlh|)%3+0$~4VabQPl|hT_1AC8)x$^Vrh} z(UiufJ+?rNL`vsEcPuDvf|hfTp7yvpVYsh5QZZIbX95x0;YlKE zr7&Pdw}3aR_1s6nS92OX3_o)eG{J@&u6c1+eJLNDgVmKVGbvYCUSxO3)+si0r+Y7T z*sTnnxK=N4TLgg=vds9G)_V9H+Th#v3j zr(N7ypJ^(t?O*!EN1NVSqJatemyYj@c&Y-R4`;(iy*ulg^gy;JhYU_q{~ZROAkrU< zPl@S&#Otb}aG&Y&9VJ9!+cxMcPlnOBJ4T5|kja=#*0UHBxv2jjDjks`c(<^9$@ z>TS&TA<5(1N>Gq*sk!q)trAtojzuBKGgW?G)W>L_{-n3e9wf`QqnByG8HMMfEb8s1 zqKgSl=+0O2p;2seWgBcFkKuDAT$p=xlkA#Oj@(7iL1nM+(5)Wy02pY5Cr)wzLsJi6 zMOz!9xi+HnY)z2)KKf4ZTU-|x8ww4hdp3EvFKxIO^ z61uiFXP<9AwX4IqPvwiIOH%_|ZI1DZcFVue5;1gG6$hWLLSLAJRrg z5Y?ycKndUnDum^fw(K6tL6X9NqcEB>R9x$M+tp}mP{}U|LcE)vQO~mrBi#0ZwYJC< zrSIQ|g@hr1U$L4pTTa&=5=aJ`FU)8Bq==a?OSA(=UHNj>*iMjphTkgx64ebqpABQv z7ZPpb&3{(#5Q9z5+_mZ)8N|26;c5f#z;S3q3?jzkjN?{gqQu~oCrI9*g-XiFR?Ko) z&^%hIyYp$>rK(F_oSa5N!MKGAg|X{m#n%+%zVLJxcl9Os<4UG-u@K}q*^#L|U6t9} zK=T^Y6ZJIzuJf6oRA(@dh)fMUS9WPi@)~_^8i{2LbX=MZmU$L&KF_O1hDZaqeJ#fS{8r$d6tnb@&nR+P>QNdF=|YtbSWBvc@8reJ*;QloE*3UI$eX9Gih$V zf!|(vOXPHb1S4q^vgb4w^d$Cb|_uR{rMYV?Pc3|*CMn5;-&&(E}eS2by zy+e5%1ykJj?|e%a1`K&`XjG4)tVsL;2~-T3g zLcr_bdNR?k_W^BpQ_l>RI&53*h3=9d1(MF=Ja15(q_B|9Zdm>1=k1iLNvcf&c@e11d3JcFE(GM(N*^MMDFbFKl(8}--zx}K7HDC&01_;PPEW|GqvSfNXHb@a79@_gr2K| znj#91R0q+kg+?=lpe*vec*9l~h!i#{Ud3rbiqf$#=j@aFFm zvU1(jZsb4+8)nh6x5i68uaM~*L_}7r0Gy8fPZ)<pLTQn$@GB!wDfe zK0kLc>K6Os(@g4B6d+;_?wz z<5c^tpOa118~t{3=zq~!)>m|QR`}7|MqP&q-mV%89tRM!{Jz{{E)9ms8!NkRAZKu@ zq_~n<;-xZ?)TexacwX+2WDZ}){pkl5q5K+zQSpob5ba8abMui$|KGL~>c0{yaifB# zb~Pxp$nHibvDkyNwcQJ%#E65@p@<+Dnm;t;gvr-A}e{)KA z!Y)0*j&~`6MU2X6jMiX83->7*^}CKC^3ILW+S?^#T*fN5Cc~@ew2BRP@D{NrPFBrF>MhcX)=Ig+8|K=Sb z+iWwpqob*i$CvPygOuh;j61he<0<(WOfQ{y1-&}uTZ3k`tbo`6U$JyXaV;D9RQ?b> z3cKghJh4!tU#Rth&ADZvy^#ODr{9tiG~-D?wY3gGG6bsksSKLRfR6Qam(aY)gaM6( zCd*5u_X*2h9wByE+dTqVAmzx{UC@s#GDnJqJVCUxNilSV(yGpQ)7+q5du5qZ1GQz zfVi3A;s^4T&M%nmJg!Uxu@&=~p245s7Fle~s~Vl4KcQmUs>f8MC@0j<^FS^u%N)ym zY@8|bHE1x@A-<7bXKri)k6PAIX=5z!)|BMy$klV6vU`@QdQNAfo^|D`7y6r6LLUZw z%rMLiU~&S5<-L|bIUSvLDY6We#=e*=77*r8#HA+rS+;v&7ftX4M$e0^WRRQ#8s?^% zd0HR3zG8{-d{udQdTVy4w_Ka1km{^3I{!&w!VAC```RMBE&vwT{>8q*m05D+mQ^F+ zu0)nI@x^R%EO^IG)}i7xv7Z37^dz44YpRbWRb1#f=WpLqX5_te{fof0ANLUu{$A18q0k$_%u>u2A+HxN z61^4tn)ORQIg!?ctFw1pkFwro7~Yd%d7w=|wfWv?_O_I>SQ`bD-0{DV_PF&Za&WlL zIaee~Wq9zC`LLkQY4}V6k61bQLLAeBj;?uS+$EsomqVaR$`w}6TMtCK_cc-rN)O05 zaH_CKr*$9I5UQcA{u#ptg)S=(lU2B+#rB@``y8LXG5HO#-X(Jw_5L%-xiSb$rg-&Z z)Cg1aqZ4;xng1%%C1L89XlSy!NyL-%-lJOxN$b8Gy~=XIAKaNUN;?UYkaD8)^&8eP|w@M{cKx{xX4V zmeGT-=SHL6%WR9m6qQZJ@2*in+Uc6%OB_H)nQ86G2>08R<@n)ukRhlQ3e+5%^`p|W zAz&VC=*NGgIOt-mu{^S6R6~Ljy&qPp96)p5OJeez$`-N1BZ|;^ySUR(!{6yNtW@+$ z-t)gLc_dMU5&X{hahS5ifNfNrS%2zJk83d!rc;PT?rCZJEH-)rtDOorV?C&lrQ<(w z8x}AhcP7nz(LuQzjjxQuLE`hZyCj9^{fmVZYBMr#n2&^Ds>J|WaUy9O=ASO*-niEE za1u)0SK!|tfloWrsp29QIJ}rK!#b;)0y?#&hL@;1L9wr|Mm^YJ0R>8lpEcacKz*H$ zZl(wIhgR{BWXFyAW$hnC^mr2q9M5Nb%p~o9vx*b8Ao|qQQKYKJ#(qL-h!KvHl(R<& zyTEHyiNmJi!lf`#{i!j!g4(mOK0i_K#_U>Bja<-p#Yy^-MnDMwAyx5pR&(>2GpP}6 zMpE5QH;3?pr|7YlkXR2ha9djrwsYiw-`lW%#{YmJMHR0NVOBvwl2z<}uh_ARro)fw z_!7+MQ<$6;^&4>p!%WjeO^B1(yA;e>iR!cSjA2d*Xo&7H(WnUt*QuxPYNVg`b8Hzk zFOlCg$f`|ER9{(USR z+josW@#l&+W|h|=<;85KNGGMayLQmO+XAFMkjQ3@N(`8+{IW27KaADi z9ZZKTYH6bN@#Qp92~Sn&2?jQCXFoUlIydYng6f1d8*1+9FY{yDPdCV~enfhzGUPhp zP(l_)O7O8|W%|c#!T&wQv@VCD5JNxp7w`C762TP_4v-MR3Lnb7;WQ7CCW%;x+V$=6 z=mHmw782BiSz`j>iW=-x$&z<)IJQRMFo@wqXB~n2gt0KsuIQ_Sk+-Jv-?vc4f6rk_ zZ~~Y5`7ve$H*%_I5C8IR=p-aI^e~UN{KEN&?aI7BB~q}xC|0w-P-X48YEAddUq;#) zlU7vzsC$xAf6QWA5+A+xCC4($9DSj|r{CN#3<2g8C)vR?TC51u-VY%a;}ux-B&1`- zYM;#DwC+=tW3INHm7QH>YQ~Wv?K;CXz)8S>nCIet( z1{EAhv~|4;Zhol!+?|-*x{s-n;na#gK*5&I9L#+QW{j<+Rc+LDT{meyPcBikz|P{K zQ4l!a66vTWs+EmO8)u~OLlu=$lK)$WA17j})BHNs8;6VQ+5HX%aX3snI9L4r-ho+U zhbpTTqRch^9W9(|li>IL(~Q1i6U0MtJ7ln?PLb>0KNLjp$X~W5xfutIo^^}YU?PLj z4I_bW(2xO=9-5CFAa)s%&~=ol9sqMyhu43SM-S7UtoIwpG&{r^epR}o#@AtJy&ikM z2w|zwTxVa5ohw*1q(Sq9@0EWr8pHA!a3SN4_Cr(0Q|Q~k_&0I(;5z0pYB1@;8Uo1l z6>SH_M)dGR^Yhn}*q=hh*3aA&(8X;R7h)w5wlGl|4m;KKe8NQ39oV$ z)&&p$s$_^ph+mKkaSqkQCZgn~m6x1O?WFwnm#zj^C??XIBVIft`= zdK716m7uR?yhqYLL%CF{9s}(A2-=1c_$|;2hKv$ow{#c(E6%9WlzM`Vc{S2^tKhd*80Mc0KQML4b&IWb+!k`3-v!_KjQjRz=zZ^Zq$(}BQkeR zBU}@_S3&y1Apn0_ttT)H=jD}iYrao2qk4qfM|xQSY+;+&Xr)bM(I$V4r#l#R_uiy* zhH0?crQ-QYb3CpuriURQ1uEXj(>edWbESuy>X0dxH-zq$?9dEpXjT_bmL*-hqq53s z2dWIJuZzi85+k&MLDSCIdS`4|Vs6+bN>KJ@X0-L+%8Sq8<{q6Rq0P8|j^B0H1)P7; z%uD1jXSEFtvd4M8{)`tkFC!y<+aPH$orPT|XoRl|6{|gVK+d+Yt@U$qEf2pBPD+OL z84<#AMl9%5#e;DSu?{bulIFqL)KFxEt&AC#9OL`2kGb~qEueNz+>c7&YELSd^x4K7 z0U6S{ry9c!86bohpQv5?wFxo|(*Pi429(_3158M+v#bKH1V^2&R}Cx)6&N?%ZLEti z(o!DA_4G80@XYghM8HlCL|Oo`;k5@%hI-0HA3-6Mw|Xh0$Go2lc`@OoY%m;;zKD{h z?aT;db=T#9Aa4ss4so;|q6OAN!sw5$F}LKjYdl1nshQq_k@ zl(gZZ+h)d~*BPoSwwyC)A2`h8t}`6GH8eJ6;dHsPWPVYel-Z+&)8>MasFFv*)jTEg zt6h}zE-fuK^kfca)-NiU^^zM&gB7-3FQhq)#wLr;L5mCCoF>i*@LkX%{WF}v8!qP1 zFwR)5Gv6{9b@UJlCNZwV6E%zk;FM?MbCAZmIjQwsei?DmPTUnQF-()cW9_3OvcU86 zCiP?k*Q)z~5EbbD9~@zCapiqso*X`rxibPDfQ28R!vl}SPg{sDnJC7IO_sd}Rhn!R zHCT(HO`8n0YXf2rd$uOvhggigHITMKvwOa7Ln{7aT;EbW8p~$cf9V0w9PU@0;^-Y; z%kntrx6#q*JxeNB7AQOUCSniE@ zjVMC>Ik)a3fUxgI=n0JL5m*k2JDg&bS>N!&7elQ&jE_(-s094{my1^>#i`f_OC$OwweMuk7}rDaCm%=TUUZ# z6GcBs{%Cez0dw%cqN_;fJ7h?6=|m=Um8TyzrKi#rP;Yp%y*s1zOXwqTGXVM+BOS%{{U z?2k?w!Gv4LUJkLAqTv}4nvG2QFzHTl`ve8YHN}Yjs74_Ql_MJmIUi_O2LB7Pp-%Y6 z$|)}J##DMIreb*MN#T}O-o$UbVp*xHC#5xe86q`>H+F0Km@R?0FP8#x!^ih0rtspo z-MdnH=Ut*Ru9G0MD2p9GP51PmId#R~yTBA-r@Q(ipL3~7-BJDhNP8q~f{C`ivUHY_ z2m%%v)Dn4o`x!w(lVi{()2}B$O^Uu zqjl~Y=R51_0`2J4Uu%5%@)azF0#Gy)v|`F3mlGaD z2e!BsZ(gY-!X}c1^3r!<^&#=B{-iK&{&{)m?Dntp;M2ihd7d3PYr+<6v(qZmLMpZw zB$xL?d_wB$q*+p~x**Ezgtw0dz_h(*X!Ry;9f{}`iCEGlR+~45kIYfIqEr+FmE(z$ zK|h*!*F2x&&umgVBaNBbR;4gTkwBa!Zs++@6;hP!+TS=5v;`?-Zs24moyuSbkXiM` zrcFARMRKX)lNim&UPQ8)TwxbSc)A+8ma~31)<`?M_WBzRp#ufD^|-T>kGE;CeB%Rs zf2&pDo;!1`ovTRtp=k~iBNGznebYLRAuAFx&PrBe!2j(Kndk(Q#uVJGyiB!DH? zXzp|V;pJ6bb)lmx#h$V0>8yVht+;H8Lkj~RSJHSKYgu10j@rS|AP2!uvjBdd=4nT& zuNG6Sh&#Cz`)6109|)wW%^OX3YFE7!j#*6$lZ`U`CD@3bNtjj_U(6$SncjsaTyeR) znMloSLCNspYqIu;CLG0xQ0Vo8C^TZXoSA~Liwy!%%hc$)CX~cyGMz5ML57A~!uW6J zLb`?oq^%JEu?6Rz?N_`BFYC;H_RjYA$m=Dk%tVr^7vYYfds$B(EO^P06QlK9muEy2 z+Ws5x*r&SGZ3xvzFtn44l|t9)PbRZ?I}@G~ID%^}E|H5n)XPxnn!FU{JBB9pr>x&Nn zI0h5h#8w+T0Mi)@|KshtUQi-u?p%RhU?IA_4Vm&6ca%p$^(uDR_ksZV{UA=vJ!RC3FOg$|l0#;^rN_{t6YlY*7OoL+~E@70r(pMqGZ zn=8r&G_aJD30HQ&4DcPWaAZR;zF|+c;p)3xK2YS6>twm%l*$um*YxOtNnxC ze{0u>7G9EO5{ftNofLuMl&Pa)_N>+h&$Eg(_h*7~cxLLYnOhnmNDZi(lAncOEV+D%6U@<%Z5ZSMuJm6N7R zSsY25!{X|O;pRKSn-on}n_G73**O>*dE6X?l_tL|eLwVUXu{(NyM&VyAbXoaLMk7% z&wC>>CoF=@Jm*}mHR%t^K_Yg0b;iBIu1m@~Z(H_t2g^_1z2en;8(cDwar9K+ zB z_!Mtm=RMDD$%v_S`;GE!`m8>qmoERs4a@ zd|x&uQ_-loMW3BnZ!GdWS02~DdxiVXZ`hc=M{>)?)C90*_cF<w{W2K?*x=xhY?pg_G>|i+=wOErq2zaut2{`~!#b(zkhM@N z?S{kUSc%iOQFcB8Ia>n-q3R=^ELHVUj0Y8+;d?6Aczp|}$gCp={IuxBCO~n0KQ;mgk15eH zc($+<7nJke6=Vafs$kIpY;vrjB8KI5?P5dQ6FTwhw-q8K%d$@OFr(p+khD}PQ@0S= z5oGE$6eAe_7JOoEudS{_+_RLGaBdS|LOyxJcvfLcjJx_vv8Yc1_C}HC6S-GrA$0o-@HHM&}jV>y%hR;f{%_1GNiJJ zK=hn2_ z?dq}08WLxn+HXltOv3H6dqRSmn8(By~T zhcWy|;H~vAMUTvH-;`_1bQz)3zaYsDJ@x;m{+5I7f9P+OogK{FO#d-VX&lYW0YI&P z>{AXFCN@@DIA-yG5K~u&e^>r>|98{M!CvAY>Xd}$-xl$|g1fA&ES#+DENq-C^ek-D zEG*Rj>=Yf${%sC974MY_`qvOKf;rYru1m z0ghB#Y_lE31r;_p9K%Aa2r>DU+HM*Gc4j`zl}8*pik}KCS*!p#navz+1%W6Lu7@92 zHuxk5h^Fo~m{C}C77yU9LkIT&%e-FXQ!gW;L` z8UG%QeH2)*VP&Aluvj47-Y$AGxrpsTL8=gUJDC*C#weI54v+f8iq_gUm(R>u2&?0l zK_Y}#Xw1X>a1hG8fvLlP!QTGlLD^O7ClnJkWv7)b95W@v-SFz;L@R$@@sl!B6%cHD z=T9%w2EO=dO48Ne`LhqZc%PpnDZqiMug^JjbCiDgFLQ-Ebn*9XkltTY1gyg?N!DIt zO*g7=$Pu0??u5DRU1j5HsB~w@IS-QQrhIaxtJUt=fu2p1 zarl^PxhX*I(>*~ndGp?gBSvM>I5Z4@L*HR;*;F$w>+1ypD#{xsQp58)LClt6UhRWJ zg7unnSBBdEDDH*VkK2t?qoJz%P<&xM_KVB;Y5pvU;$tR*S+E%YX+i2yIU9CY!Y<0X z5*GZxE**)L1brsAYD_UI^O00PyUoW==h9`zmNuz*15SI;NwYP*t6|Ob1LTHkl!=wt?+7xMWJkE669GTme^m7afOIs^}c zycchWJz@IW)IaS4ieu|ZfR7$W)+^(BpJ5zq&o~~_I~^V^q;nmXABT)dO#TlWo~mTk zJYddZK0bPfSIr7#8+S%Rx!z$*(Tj7ttXFaSYwt0t1d0laLAx)+M!%N|KO3C)=I-K? zbFxmOwPuk6zIobVw8D^s57tR;WNk0nhhyhxJEV$YE(%p-p=V5$tG)5y_WBF^pydDV z&uHJiZfJ9LX){82!LS^n;J6I{a3dqTtfIR52b&d>BA&_D+oSmRr=i-x z+kaw&?UM%c9@S^Cf2i~F_k6ydIK!Xz$7w3*@N<)kQR4%v&KK~m=74cgOO#15YbqtEt)W-WX2h{e;6a6r*AV;`Nu+h zL8+xfWSHRfPoKw;E}piRmi2qx#bXbn)mB6v6=2fUK) z?elFMzk3QzOK2ZEWrCXXX0y;A zBx@@IST5QAoFyY+5YF{qr})WT>P zO%h%fOOSU)lN{!yco*Y(=aHV9Ote+sQN1DR{#9e?h}`$%qNA37|H1*_C!Rz94qo{N zm?^D%nw!z>#wxgjtJxE#zrurUed5?A6t{{W47vuR+N4T6AQsyi?CQ?W#JbdSsTQx! z?$o+mM5HaF)twba>;t(5H487qy;fQtD!(wCC@W_*Ao_GeJ<@**CdL&_T9@&Eqi-Q9 zUH$*Wp#KS2`rj+BmMYL3j#<{;4CqOs%R<7zq5p4N#L64^?+lJvlSG%5gpGvtU!SUj zgDVNge<-4=|1mdrAo*Vb?LQ3(5?uivZeB??7A`Js9#IxtA-tEcn7>16*G OELq_wDJ7Mp;Ql|%BH=aw literal 0 HcmV?d00001 diff --git a/cards/template/cards.tex b/cards/template/cards.tex new file mode 100644 index 0000000..acb690c --- /dev/null +++ b/cards/template/cards.tex @@ -0,0 +1,129 @@ +\documentclass{scrartcl} + +% Compiled with assistance from a wonderful guide by Brett Witty: https://www.brettwitty.net/how-to-design-cards-1.html; https://www.brettwitty.net/how-to-design-cards-2.html; https://www.brettwitty.net/how-to-design-cards-3.html + +\usepackage{pdflscape} +\usepackage{xcolor} +\usepackage{tikz} +\usetikzlibrary{positioning} + +\usepackage{pifont} +\usepackage{graphicx} +\usepackage{etoolbox} +\usepackage[utf8]{inputenc} + +\usepackage{multicol} +\usepackage[margin=8mm]{geometry} + +\usepackage{nopageno} +\usepackage{graphicx, txfonts} +\usepackage{anyfontsize} +\usepackage{ifthen} + +\RequirePackage[active,tightpage]{preview} +\PreviewEnvironment{tikzpicture} +\setlength{\PreviewBorder}{0.125in} + +% All cards +\newcommand{\cardmargin}{2mm} +\newcommand{\cardcorners}{4mm} +\newcommand{\cardwidth}{63mm} +\newcommand{\cardheight}{88mm} +\newcommand{\cardnameheight}{10mm} +\newcommand{\carddescriptionheight}{30mm} +\newcommand{\carddescriptionmargin}{4mm} + +\newcommand{\card}[1]{\textbf{#1}} +\newcommand{\act}{\textbf{Action}} +\newcommand{\stn}{\textbf{Stance}} +\newcommand{\fin}{\textbf{Final}} +\newcommand{\mis}{\textbf{Mission}} +\newcommand{\brg}{\bargainheartoutline} +\newcommand{\btr}{\betrayalheart} + +% Actions +\newcommand{\action}[4]{ % Name, Description, Instant?, Persistent? + \begin{tikzpicture} + + \draw[rounded corners = \cardcorners] (0,0) rectangle (\cardwidth - \cardmargin, \cardheight - \cardmargin); + + \node (name) at (0.5 * \cardwidth - 0.5 * \cardmargin, \carddescriptionheight + \cardnameheight) [text width = \cardwidth - 2 * \cardmargin, minimum height = \cardnameheight, align = center] {\LARGE #1}; + + \node (description) at (0.5 * \cardwidth - 0.5 * \cardmargin, 0.5 * \carddescriptionheight + \carddescriptionmargin) [draw = gray, fill = lightgray, thick, text width = \cardwidth - 3 * \carddescriptionmargin, minimum height = \carddescriptionheight, align = center] { + \ifstrempty{#3}{}{ + % Instant, add the instant icon + \small \textbf{Instant} \textit{#3}. + + }\ifstrempty{#4}{}{ + % Persistent, add the instant icon + \small \textbf{Persistent}. + + } + \small #2. + }; + + \end{tikzpicture} +} + +% Stances +\newcommand{\stancetypeheight}{10mm} + +\newcommand{\bargainheart}{\ensuremath\varheartsuit} +\newcommand{\bargainheartoutline}{\ensuremath\heartsuit} +\newcommand{\betrayalheart}{\rotatebox[origin=c]{180}{\ensuremath\varheartsuit}} + +\newcommand{\heart}[1]{ + \ifthenelse{\equal{#1}{BARGAIN}} + {\bargainheartoutline} + {\betrayalheart} +} + +\newcommand{\stance}[5]{ % Name, Description, Type, AgainstBargain, AgainstBetrayal + \begin{tikzpicture} + + \draw[rounded corners = \cardcorners] (0,0) rectangle (\cardwidth - \cardmargin, \cardheight - \cardmargin); + + \node (type) at (0.12 * \cardwidth, 0.88 * \cardheight) [align = center] {\fontsize{65}{80px} \heart{#3}}; + + \node (basevsbargain) at (0.75 * \cardwidth, 0.88 * \cardheight + 1.1mm) [rounded corners = \cardcorners, align = center] {\textcolor{white}{\fontsize{50px}{60px} \bargainheart{}}}; + \node (basevsbargainoutline) at (0.75 * \cardwidth, 0.88 * \cardheight + 1.1mm) [rounded corners = \cardcorners, align = center] {\fontsize{50px}{60px} \bargainheartoutline{}}; + \node (basevsbetrayal) at (0.86 * \cardwidth, 0.88 * \cardheight - 1.1mm) [rounded corners = \cardcorners, align = center] {\fontsize{50px}{60px} \betrayalheart{}}; + + \node (basevsbargaintext) at (0.75 * \cardwidth + 0.5mm, 0.88 * \cardheight + 1.5mm) [rounded corners = \cardcorners, align = center] {#4}; + \node (basevsbetrayaltext) at (0.86 * \cardwidth + 0.5mm, 0.88 * \cardheight - 1mm) [rounded corners = \cardcorners, align = center] {\textcolor{white}{#5}}; + + \ifstrempty{#2} + { + \node (name) at (0.5 * \cardwidth - 0.5 * \cardmargin, 0.5 * \cardnameheight) [text width = \cardwidth - 2 * \cardmargin, minimum height = \cardnameheight, align = center] {\LARGE #1}; + } + { + \node (name) at (0.5 * \cardwidth - 0.5 * \cardmargin, \carddescriptionheight + \cardnameheight) [text width = \cardwidth - 2 * \cardmargin, minimum height = \cardnameheight, align = center] {\LARGE #1}; + \node (description) at (0.5 * \cardwidth - 0.5 * \cardmargin, 0.5 * \carddescriptionheight + \carddescriptionmargin) [draw = gray, fill = lightgray, thick, text width = \cardwidth - 3 * \carddescriptionmargin, minimum height = \carddescriptionheight, align = center] {\small #2.}; + } + + \end{tikzpicture} +} + +%TODO Finals + +%TODO Missions + +%TODO images + +\begin{document} + +\thispagestyle{empty} + +% TODO autogenerate the below +% Actions +\action{DUPLICITY}{You may swap two of your played \stn{} cards}{}{} + +% Stances +\stance{BARGAIN}{}{BARGAIN}{3}{-1} +\stance{BETRAYAL}{}{BETRAYAL}{2}{0} +\stance{LOVE-TACKLE}{If a player reveals this card during the game, it is flipped face-up, and they must give you all their \act{} cards}{BARGAIN}{3}{-1} +\stance{“PEACEKEEPING”}{If played against a \brg{}, take all the Action cards of the other player.}{BETRAYAL}{2}{0} +\stance{BITTER TASTE}{The other player must also redraw all their \brg{} cards at the beginning of the next round}{BETRAYAL}{2}{0} + + +\end{document} \ No newline at end of file diff --git a/i18n/en.json b/i18n/en.json deleted file mode 100644 index 544b7b4..0000000 --- a/i18n/en.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - -} \ No newline at end of file diff --git a/main.go b/main.go index 2b951b4..0e6dd4e 100644 --- a/main.go +++ b/main.go @@ -13,7 +13,7 @@ type Card struct { type Action struct { Card - Instant bool + Instant map[string]string Persistent bool } @@ -24,11 +24,9 @@ type Mission struct { type Stance struct { Card - Type string - BetrayBetray int - BargainBargain int - BetrayBargain int - BargainBetray int + Type string + AgainstBetrayal int + AgainstBargain int } type Final struct { @@ -45,8 +43,6 @@ func main() { panic(err) } - - s, _ := os.Open("cards/stances.json") defer s.Close() dec = json.NewDecoder(s)