From 9f809bad1e285c10133e08c213eba84b2f532727 Mon Sep 17 00:00:00 2001 From: Armin Date: Fri, 14 Aug 2026 12:38:03 +0000 Subject: [PATCH] Simplify scale figure with accessible colors --- validation/CASE_SELECTION.md | 15 +--- validation/EVIDENCE_MANIFEST.csv | 2 +- validation/README.md | 2 +- validation/figures/party_scale_examples.pdf | Bin 25345 -> 23593 bytes .../outputs/party_scale_example_plot_data.csv | 6 -- validation/plot_scale_examples.R | 75 +++++++----------- 6 files changed, 31 insertions(+), 69 deletions(-) diff --git a/validation/CASE_SELECTION.md b/validation/CASE_SELECTION.md index 9c5572e..85a141f 100644 --- a/validation/CASE_SELECTION.md +++ b/validation/CASE_SELECTION.md @@ -1,6 +1,6 @@ # Scale-example selection and interpretation -The scale examples are selected to make the two released dimensions substantively interpretable. They are illustrative reference cases rather than a representative sample or an independent validation of the posterior coordinates. Published party-history research supports the qualitative interpretation of the cases, not their exact estimated values. +The scale examples are selected to make the two released dimensions substantively interpretable without overloading the display. They are illustrative trajectories rather than a representative sample or an independent validation of the posterior coordinates. Published party-history research supports the qualitative interpretation of the cases, not their exact estimated values. ## Trajectory figure @@ -12,15 +12,4 @@ The connected paths show recognizable changes across countries and political tra All election-year posterior means in these windows form the connected paths. The labelled endpoints include 95% latent-position credible intervals. The manuscript uses published historical research to interpret the broad movements without treating the estimates as causal evidence. -## Two-dimensional landmarks - -The standalone anchors cover low, middle and high regions of both scales and include cross-pressured combinations: - -- German The Left: 2021 (PartyFacts 1545). -- German Christian Democratic Union: 2021 (PartyFacts 1375). -- Polish Law and Justice: 2019 (PartyFacts 1565). -- UK Conservative Party: 1979 (PartyFacts 1567). -- French National Front: 2022 (PartyFacts 433). -- US Republican Party: 2020 (PartyFacts 809). - -Every anchor must match the requested party-year exactly. Horizontal and vertical bars show 95% latent-position credible intervals. The machine-readable plotting table retains every path observation and anchor. +The figure deliberately omits standalone party-year anchors. Colour-blind-safe colours distinguish the three paths, while redundant line types and point shapes preserve legibility in monochrome reproduction. Horizontal and vertical bars show 95% latent-position credible intervals at each labelled endpoint. The machine-readable plotting table retains every path observation. diff --git a/validation/EVIDENCE_MANIFEST.csv b/validation/EVIDENCE_MANIFEST.csv index e383c09..d8ab387 100644 --- a/validation/EVIDENCE_MANIFEST.csv +++ b/validation/EVIDENCE_MANIFEST.csv @@ -1,6 +1,6 @@ id,topic,input,output,status 1,country coverage,release v0 election-year panel,metadata/country_coverage_v0.csv,complete -2,historical scale anchors and trajectories,release v0 election-year panel,validation/figures/party_scale_examples.pdf,complete +2,historical party trajectories,release v0 election-year panel,validation/figures/party_scale_examples.pdf,complete 4,research workflow,documented source and release workflow,validation/figures/research_workflow.pdf,complete 5,party-blocked validation,guarded blocked fit with 82 parties and completed post-estimation extraction,validation/outputs/blocked_validation_summary.csv,complete_with_convergence_limitation 6,predictive coverage,production posterior run run_2026-06-12_09-34-03,validation/outputs/ppc/posterior_predictive_by_dimension_item.csv,complete diff --git a/validation/README.md b/validation/README.md index 405afd7..9c1bbae 100644 --- a/validation/README.md +++ b/validation/README.md @@ -20,7 +20,7 @@ The validation fit retains the production warmup length and four-chain design bu ## Reproduction Entry Points -- `plot_scale_examples.R`: historically anchored party paths and scale-reference cases generated from the released election-year panel. +- `plot_scale_examples.R`: three historically interpretable party paths generated from the released election-year panel. - `run_postprocessing.R`: country coverage, scale examples, V-Party sensitivity and partially pooled source-support diagnostics. - `validate_uncertainty.jl`: production-chain predictive coverage, calibration and source/item/country/decade breakdowns. - `prepare_blocked_validation.jl`: deterministic party-blocked train/test construction. diff --git a/validation/figures/party_scale_examples.pdf b/validation/figures/party_scale_examples.pdf index 5bd702aa0a32e1c501374ab854734ba589c19c4d..18c9517ddc340bb574340e96c9c46f99b09f8e57 100644 GIT binary patch delta 12936 zcmZvCb8z5Iw`P)wZQHhOb7I@J^9v@nClebJ+qP|cl1yyw``y~DyZhelfBHF3_d(a` zuC6}SLBpWst)K}CfVN!x<}gb4o#r*SD|Y)15>YlcDE#5BRS3Qr5oV$O6fR%KqpT$I z*Q=kQJJ%QqPaM8=kZ`Y!R^??yb@hm*#1`E;qOFid}XJ5;jpauxM=bxKUg-}Nq(%u(4ljtlYu~DZh%HUv-SbyacCEL`* zORw88g91r>xKxW&Fr%oS#-pf(sLxNL)W-L1CeP1|FO1xO8p@NfGX(z`NFXcL&4nWB zuEp$wheL|OaNs*bsxipLZk(@;|qXGyd zh>fndXV9%vkC7d7vIkwJSDNt4DJfpJ`4wE!%GeS zdDtn4Kttsviv7KS7;hn=>AYzSnLvgGMI;(E4>;HzoyW<9#OOnXtPL`$tz%(E(&|DE z#;Y7))Ipll$}j69nRgb=Y_00c-pFbf#1$`0WOK+yaz7cbi(L|XtV8lxo>b4DgR%YyWR(CW|gqfx|j@m>|Gj%C|iWnRhVBFBLs3VgyTK3ca9 zTdFsKJSn)n-%CiYZ<8kcfR)P{K37SVrT)czK1dJ~<|(6As>LzJoyeVj^qq>=f@F8N zF}6Tww3Fob!Y&{3W^XN-h-#Fw%W;*?I{-VH#?Ey|?VT{U*PUYK;;h3aZdseiDdwT` zLoChiM}?8Ots@k&+w^{AJnAMU-K%bMWM9 zbTQemBj?0Lp6HD~c6l9_KVbS$<@%k|J}c6GdK$B7_H_P`iU+1&wm%WQNyKlI(Kcjf`VM)|HPMh{p+Vo$1-$ zjz!pODpD6AKR#B2%#4Y(P$cwau62IL8YqE zu05F3gF!_`Mm!XZ0qa_iQ%z>4yB^>h4dmO@wXiY!Rvxf={2HI8h0LP~bLv0s+x#5l zE>&WTk$kkP&?{48gY!cEWJ|R!=xWTE57nvgCLnJG<}P4PoHQSHH^|7?SOE}`-o@V& zwiqV3Huc4}mR$9n?NX{S%h>JfeEu;N8RB%3ztk1{9hO8+y{?tLfAgrYmT1GZ6lF<% zaN+jIRo^Lo|3?+JK~sIducU0!F6WO%>+`lsZcf-48w!vThO`-b81RGP3`HBz@XbV! z5Rl2AW)yHWx#oR!DAbrE%YaYwz-?P~;G#0S6*Z`d6s%38=opw9<+_egI>v}(klqk| z&VQ^Npu$SZ({A*Rwh_TlG?C?#fb5^u)e_<5pM$!3l{mlb*WKJ%B+l=xVf?x_p$lq~ zms2zX(-OpdG$nHzWB@0yf7y3F?CA++q`U?Tfz-SK6G;xFIspF-Xq9)N9W7R^?8%c| zuy9Z?9}T8ZBvSW9y$|iPt0>}~Uv|JS^CXIO6|~a9MOWuV74y$fm&Uqp{w5*b2qb~6 zSOll!&ZHGiHo~U)hkjZa|6y7IYQ`L~CBKVE1piPYFHCPk9aVk7G_@1eSK#o2eq>S6 zBjQNOJNC_j(UcW1hcT?7I-TvtR&j(OKC>wmdFKFK@YQPQr9IkD17Rpnq`GzmEexwr zv%LOOyS<(E%?Z#Ld-&`o$@qS&@m8qiB{c{x*pd%`lvzfD%0V?*@4;Z*taBnQ0ZU_4yQ1O9pm4~!0LfdaOyVBv-Jcu&~m#n$N1 zl7nYmaHu4__5Ai1NYL_!QF)emj-8qiO$Ec@t$PuQaxzra`)gm$T+> z9g6h5Ar62~{k){z&&6XD6L&O=^C}~cp|Hsq=VVZkGIKRZDY^3}%G#NjVk(4lqkZ0G z(Ubt3L`DO{Y`W8-XOk?dMisD`ixd=eop87W6j9K%Dw3yS{|sKYA7Uc+nflD)Ek0!G zz02CE=)_mnpw)ISI>VVXGroogwkLH6_au4lzuf>l&XJQulLRe40_m9D>@FQxS8gQ6 zGgo^%P?Q`Hr9V91TkK*>L1Q8Ur}24WM?sF%Yft?c>#fPYwYaQLL89P(BrfjACVnJB z7QZkZfG~S2dd=IQ*BO(?Ps^2no65yEv5GK&ujN+d&6xrN-^6ix4I6bgrsT8r@&`m#6j+VT&1^q$bJ+^Z4g9iHbj+ z4h8?wItwh8j^Fj_pnKHWH8D1bhiGk{f&(yKy=p{>dO;K>sEYTxj8*L;iWBM_M ztbK3SMCFo+JL*c_Le~`9ryaC$dM)U3oGWT(^TqoTUBsDF0-13nDxTalm0_bGyInZ4 z*nqw{M~%XWKj4(7EEcJLp&@%cZGT7+@p-fpkz5awLrR$A0+j>5Dnt4|wzE2FE&-&o zJfE$dO;1NpU`?vYca=zQy=%j^r{f?O$xEYS=TT_eZ-vF*HExbbdC)|0bd&3H5v5IjMkcVf$92ZsP499*kkHQYoV5mRfC0_sT#@<$cwE znUG`g zNi6PjC}b2awheNgNF}b*>`_ojdW#TG#sQP2BM}duH==#tWuZy>jk)?Nz#g3O{=R|7 zU8ycj+HUw|yjH|d*}TJx6~c@b6Ka=xAvP2 zHy~8V;r6^;sAt>@LD_GYe1*)(Ute=uO#2WOT@K%vv1hh0nrzE(FFx~KLGUlPocWT* zs5{CQWQ;iXbem73orvZbaIULY`qXh!dUCf-W)%1S#$g4D*vl2~`E>gw^|CRMN#t=B z?r%7z7aPIj)#B^z1+*V72wliI6v#r+N(CA-bbzAqbT-(X#1obG)iAZh z8^-fRE(E>4ix7%0oaE*b5&d|2jO4GjUP@Fo;E$&b+nV^>(f@G`yt}`$9=8>{}@HN-hE!t8ljR1^7{y94;&IPwee@wlEdwu#C(U{2f_1{K|yz zeT+>MV-DbPy6&Q92rM^mQ~3;6@*zoGt7H7QUCtqkr!_P&FKX2BbPt%;h%BtnSSK4A zTY(Yv1uJ-P)poW6QmRjlE*gh!z4dOPepM>5U07!H>^rbz_ApCOpr29>sQ2bQ+?m1T z&!UzqT1_BEkF*gq->e;KY4*75#i}_Q}gn_W!`z zS0yC9*Kkz+!K-z)-_h~C3)mpCQ-fTc2XPllO(!Z6&ha5uLi3z~Na2URc}%1raM!`y z%+7_w^xB(lArcyOfNfoZt{*XE9UeZV8rE^|x%&LZQRa}5oP|mN&c?#VlH7%=io(Ut z!^}#|WNJ*z%=llpfdtJ96!7-eLmydwgctKf(jUMkz?*XO(HVkRV~-+rKtY#KQ$tto z#V~`?HdomMA=|G87blG#FMy7~|%JkWgEZ=^tVGm^`mo%QF$Fq`V|!yi`%iv7^P- zrA!Zhdm+Ep)b!FBWjwr%F}lKJQ?U@S{kK@`&nB^+qp^?A?ghv3sMgutvVag7)1|10 z)VV~ug8i?joiE@3_*&N!I=K8)Qhoesr_ZU-tn=vDCVENnl$x88n<|vv!%@cu!wSO| z$yv_X_PbUCUUgFQnWi73E{c2zH?&X9qJmk0Mc?vu`5tLJvt5`&b*3zrCUSW$#G3Eb zc0DvMuka7J4_sF^V_wa?rvE!8tsh?Z~a^%sl<+Z5R3{#5;>%hc^ub*2ETuf^l$g=a&2CC)}V#wutf17EuS zU|0i-9a!cBp~b|S%_F&Qti6%$s>dV3ThK?ykaQfiSr{Z47CXU|1PV3GU(vNw5L(Hj zQ&bzttJz#yAVaqN`)@CGU`aW(%cjUC#wOS%hgJ(CU+1^1=3lkHsu*R6<>P8i6?_#I zOL(b$diK?9Ev%lbo?N-+f;)bR-nHH_-t{j!cM8XA$KjJoKMh%XEI&uz|G9#Xi6#+j zWMdcomp&H7mI{~97F8G77IV&q&X^x)A0!_z9~|6sfOcj5l4`YFt6y#hJyw zXDer(XP1PO0+T-Xr*j?Q3P>Y_$v*N#qYf~N27LBp7AxccUbn^{7EP;8Ex$kQ)3z&n z&vNfiJE?VE%<=~sCB=io=cJu6NsmQOsNMXEA&@hvf)*7|4lvx)@DX1NZ@1PeH0A zCiiphsk$@NQuDf7F6k){)TPT!p@G4UUv+tBK$e!SYtdfw<5H*OZ&ZRD6}eb`Yy%&O zx7z$iO=ZsKRl6k;ZvfQTmGJk-Orr-c2DG7g6obrS)8f9m$a-kEF=MpmA!gNl)zrl3 zhMEFp-!b3i6hu&Xw>`p@PTISXw=}+I;IC$(iZUJDH?fzl4t15gmOse&XEUS{Poj|r zz_mJ6ghEkWXe`0!{94uF=J#wvf3-I{2KhGvty-udRizHFEhcuYA)|#8FMJ^rm(HG2 z?)4=i)z)~-k&wXffqtM-P3T2N(@sIZRHeftA&?tNK;L`!?bp^uLo@#DmZb-I)y}Ve zCA~(oB<_B9o#ehA^;<{Fgk&eOhU3j;U}XF$Mu#MHfbVhx?wk&FBBiO1Z9>nB--w%Y zh|#P6cK|bpkDxbrS3~44eARTu%zmWIFX-+-!E~Jf2i~qt3SIH!U}}CzS4Ul;M8^PmFiVw;&{Zy(CI<$c~UeaNp#k;u0!rsF;6Ax8lT|)4mDKmh~n{Y|ahcjVC=L0Dr9U=3D$b zxD+}sb+P@IG&1TveJwb9d{3(T@oyGGOiO2$sqdcbcj}}vv%4)#Z;SF;rL)-+BdecT zS_5|)e3c$^rZ!Y>#lO&uOVb3@Fe_(Pv!_e#UpeiQxpx>DP5MxeDh?TRIc>Nu6gN7~ zt)_E6+WW7%zp5LR%RP*60QMYp%Rk29gv+PC0)Ku`WfNxqidUi+R@&)t+Et6ya_`Lh ztY{|NE$~lOB-;{jx!5QBTRhl67x#zuoBvbCZEM=)peK*kHwSrtZJ&9P8>jv5Q4o7! z8#DO=MjB4qt?&_tX9y@h;>0<>#g*6i+}-ml@(Q?ieYjaL5rZ|FBfy<@9Lb5JZ^}MJ z%2aMqmoPYjV_jtaZB((wcYmS}hWi&Yd=$;9#sdZ6!ERdX1EJ~D z?xoZ8k2F8W5Aw+v>VWefoje%b`)((NbdKAlX}PVPXM{)^1VqN;2a9xx?gb-ij8uM_ zv#1QqUW$!|nDt*)DU97=asp`v?uu}~eotkWDv^g0ER(=-mzN4u6d+ddSHria%vP=h zADr(PL&FCMK=biZ$irXHSLvZ(oTF5_kpe>olT#H*`}4R*V*p(!l7W@s5EoNdf$bx< zPcxC@6*8-98n>ll(E-TcGST$pJGbH>iW{zw)YWK7ZU@X2m6MpB!Cw&5h=rJfV2C~| z0s$gLwh|ZTe=pBlHl9yb=9<;tlOpo|oDbQ$-Bf37@)M#=R=K0W`)1^;T9{I3D7M}F zR$RAL;)Pz%Tm?|LGFrnV*x`pX@W46htUOKTwi5C8n+47I4nleE>lOB#4LYgL^3IhA z+O$bUy*-s+GiSZxjCmfD(^OYe!mbb$oC(X%KUjORq{yayn01LMF!CI#GMVRRW$=7t zvln-j5(&PC&yj&QW`&APYMiPA5I?8JPvB7wSz)NZxdCocCUJcvxjwrQmxSoYF(H9r zAm5bFsw(XdE&$R?1!TSuLPxeo1dil@kSZFEa5=sF9~vXRb=1E>6jNbtbNTj;bRi~x z=;D(DGamD(j;s`8H9*xjKK*(kVCO= z>UKhvlkCt(4hbpPJWS}d%(d*57r{NCJ8bD5r34HgS5}?7tNxt4$kugvsa`+J9dvN5 zzfHRYg}8k;BrZ_}Ws0b7$Y{ecrm1UB9m}T?>9pN#JK5*iz=5~Wr4&(`<@W~ba+|lV zFToge(|{YD7G8)<_FFhkxIR^RNQM?#-MfS5JpTn*nAk#$pff>>9B%6S|MgDXS>)C%HK z_HwGm1>Hnj5x!V_tRW$9WbTEo>w}Ly%xKHi)Ox+9xKTrz1Y0~|eA_h8`Gg1mjq)`6 z+|-%+WAUbyfpg&z?$;R(rtj{lkG_txMIQviGh2kOzbXA?Wa7x`9vOeGDAK9(1Mo*q zWoyvRpd~;KmZ+1YLkIjlcyy9*vYZ8ebl7MO+jM|%5q&-FSF`)Kt0sQG;M|C6G`lcT z#FBo(@vz}88R=Ir{_;Nd);$4m<>)d^_Ul?`p92Z>;1m3S?KJ}H_$wUbO|b_{!%ND& z_5?B$$IGP2n!2PH#bu)ab>SNA2LMXQVq&Rt-jpwOB!eeY^kc*pimi;^Lfgn}GHFO9 zTq%p5Pkz_}dUQTXoOYj^!KaMeV2)tOSco4pzE6-FL~@VC?A3f1y3iPgemHJ70xR0A zeOjQ{#Q>ymtT*%!8xSLG1i?)B zUAG#I?Wt_0=A^8x=Dvgp+E(i_7|Vj*JTF~uFIiKEz-6~^GI_! zqErc=+fx$`jF#?qbqp;Mib_qG#_AmJAC%xxNo&G2N#x(%P>55~pA`$gBsgod(G6+y z7@wPh!oc6@9)gDXinnXg1At=4dGW<`n!yVh#kHKt4qqSdO6o`<|I3R$v|bx9B(STd4XDN*0b zsA5E*OvwpiSUF<_YyuFYS;yBZehY~ch{tNvvy!*T%CNH*iGpzCBm!<;F(TnoIGMwQ z94qeTq|LpCliA#p+YLDExdRDh%M-@#;iBVd%}%R$V3PYF7f0X*W=#vlMl@dSDoKmb zxJ$5MT$rI?E=Etx7#Ew)WZ~ZY|GfPi1=&yuKYWYAr+ldA&`JrnfQwS>Xr7 zNF(1hGu9r^S(<$9VQbyd@P#Cr=SKG(lgle8DF^zrOr%Y5umM{UodapOHW<_E88?!+ zLd97LWGNB{Of}}J)D9#9EWCg+uWKZR`5+EzA`|oE!gFEE{+~S7vuZ z+=q?I6Pe@rLjgFHD)SC}kZV2UEEILb5BM=c3ShQD_=NA(fl%DhZv-!DoRaK!y|@h} zq$t)MeplR=D+F(hLVP{Sk;^-&a&Og6VQO47smg(MwM*q7Ne@Zwd00^$q!)q)Vf%zU zLP?nD_h(j6C!F_%!atGD1n<DP%7Sef5-TH$*?U` z*rOK26zL96kGgX4O4lEAK4V5B41z++N8Av=lRW?}@j#sJUOW`UVI1U(2*u^4Y;F~) z1Wz1ien1X46%KS!_R#8jSR{$dXOrX)FES!uxzwve2?&O82w@*cv_p?Wk5WM6oH=a` zjy~mQo!M8brbvezU+~?hEoUMjj=P85d0v*(qI?`(L^Ra7diE$@Dm6 zIDhIkWD8V@$zKhfiIejBnWwqsx_#^x%UM7*1b|T(fLb9ZpmF=xpOAJI4Z?0{dlT*8 z>*olXi2~8rDP0_76db&((<39Had*3frPyM(D^@3Gf$$q8<4q>NCz+L&~O zWFTWqD5$=;)4TLt zGdYq{kTP1HGt-W%&B#THMcKIcS#mF5tA;z@N~2Rb@DK94><2@liWt0{vI;00^p8G1 zfdDDu7-DT&n6bun;?~+8|BIzn&Jy(n7+{$u_;|}$Lx8H=JRpeucjzpUkcMi|6cUWk z`J(GFTv{+Ln_wk|TtGdc^cmE~SZ*w5+CqLHe$o}53vYYK2`h?LVk;z&TA9^{O$7PL zFuO`G^a&f+qoM~+h1l>CuP-tzWX-$nB+LI{Dgt#s7tGt{y+*M0(5o#)dHu765Qur( zV=`P5x$1C-V#-CS+eq`)2zk+#Q(`ZUn$?xvy>BU5kN+t!Vchr>%Ozy!xEO6#4K;s` z`GQoF_nHbO+Y!?Cr-95rWKe=_-@aBOnoDR1Uk0}7;fJc@j{q3`&)D|%JRWn0ckl(n zY3&0DuNTtH{KwCpAfo4N-#0k#eP9`DKGmY_@Lrb0-th$9;(i-XD!#?={jcl}px1qU zUHmAynQG3_elX$J?Rn7S0hfzGJzTBT!@VG}CgNDLrJm-h?A`usHzx7gcehADvFd$=m5|@#jUDeIm9~PFgBd)Oh>WF9B>Gb^V5}Jt!*pLwn zPh_eGEySiL^}2a4A-U@}+r-se$`00tEO<>hX@338kQ)q-!PRW9&4l&Ya?DvRY4Zk} z^Kb|mtd8GB9Xg|s&;^+u0HVJxG(El~mJu!q?Cd##Y$Yaij#(8Kq=5;~sD8bmqN!&> z0qB$ggdhVsqkA+gDW%LA1Ic_wwFij+Meg;<|e9^n^-_MGSu>aNiwO2%G^9jVw& zx5J71tVI7ZFvrMq$DNX_bC<*XwXe;~nQNkoKQi0{+Aal+X0x<80kjX>oN835c^=mW zP0V5HF2#5Bn-r*t9l-?R*_ls-PaEUj_0b~}n&f!pB82+c^XaV@DuV`-AEhq856N({1IJWLjXu^I|h&D~~l@fYoHl zZ4GygM7#Jxsx8|ug)pTPnJ)DW+KCo;v5 zny0u7zu4`2JGFmGbgJ>V)sfDT#gXSYzjMCP2J8#sZOr3yiN&}AOw zVzADfEpQLjPn#iI^(xCD&7o#qid%(So>-yh zuIH}dF5@n?RQ9U!p!J~lPZ_b}OlhfSD)m@ks_8iGSZpdhBcA2J7B0o9U#geQWgb^6xwG^_(J zBV564$Ke8!6RgiiPgTbxl=MF1zvyd6=aBvUbzB9l;Szr>O9r*GLGZ#uH#ueWCBiiz z3;WpU_>m=gtNJ%#qvDi`_>UDsdfUxLrGnq$S?2)hrWtSPlCeX9l&Ded^k{eq z9$;Iy{2dbtQDs1<_M4EK-=H0n^Xs9J+@wuih0ksmO?#Ur5cL@vUf$CMT0=S)rl{LW z;--+|;&E81jA{gl@QvbTZ0&DvZ{T^lYQgwW(rV}E)iGUSogiyuG4vF-Wo6+QA0Nd+ z3+#1Z2Y%5))e@*-wC-m4kZ;(Ku_{@6WFs zZistOxj2LFAq=K!n3JYOPpFfM*Q|D4OFkq|)13)0K~Q_g^YMEp2JNYX-V#)cb*#hvNn@Zwxl{#js*2Kk;{2N;R0e>!2j zU#r7nz*{Dgy-kL-D{R=I2_DeVQ#&C`pQz%UA=(oRCW(9I^hKW zy{t@Teh{iPG>9*WM|%q_jXa16Vu)UZmCH?;$XYGiP+6nU|IpteB|A4)zvPlrzn#I; zv$~qPl)NQa$Pl+<5fEZ@Pl@=hwJH^HNwmceW$iQIPbK{|=s7=n%irMcVB1-1jpioqb2TY& zn_W~EYPbBy-}~^sU9jp|BKkgUwF7E@&nqw!1{XY&Q{O)(uYiVk)=qG(^voKaoP#~4 z<=g-hlh=a#-F^ey4MxD5yQKHik|v4^W2hT#5i<0F)6Yg($7j^$0V#n`X}zCw0IRW+ zKjd3Z0HQHE`X8A~1vGQNynsR#wpM$r*;lgw{mIJ}yqhnE@P?28%N>$WrNvR!z;30|Ro<;W4-An=7PuWxqG8oee2EMZ-nGEPbKz@fFWq zi!BD9jl{oiPlvQfmvmEn<0~4WOtI22h*7 zaNO4MDfqQiJUYpfDjME00pF7S$E`E!C%-K=-Y$=UzSZwX8Ny1UN_8ficBK%-a*WmJ zLU?s=hLZ1|#@r&@#%_u>6(CndpZJfKeyqv!`|if)g~|QiGrPXT-x>~j`286Xi}k4> z5&B{Z-wBF&#!E}7;DF0!(%aZ*xSJKl*5ilHzpuqRnIY2S8x5+E0=wsZp$vv1)Ek!;X??|J2IV6OAq?ZaGg3)7$BLe)#fD306 zMxa#g5hG`I`+?_eiu_8#0rX8HJ8n7OR|D*3Xhom=ehH4;x&K&=ZlUKPx9SjT!-OMo z@zS2>4gB8sAhz1DbO)DuzpgAVb8Z6Wl@s~i|CK8#SOyDzS;iMfjb^eq-5xgj?)U_? z%)!o1T=%P*H(hgk26O4w(mr9n#LHsN1IP(OZ&lb6Qi7I?0Nuw!_j58sF0G4I&^=Lj zb`oUm{%DoOx|$x_8aX+1*mhDTr?gO#zd#FW8@M!HtMilgaBr>5q^d+|je7P!|7qWtWFtkB z;LJxa&*B|&)+ckJPFZfnE%K`W~zib7+T%O zmGf8sgebKhlnKE_=nLDG#PwE};6V59vA3iN$^jeuOL&bGgODEXB5o*(Zmn@rWcg;D^PF#bp8fTVc%C$VdgQPA7?Z~D+|hbQSUemDRdpa;_l+^k0-&< zS_zgSIK6N>7*h}iPkv=C#1CM^qff((+D>dns~o?Ao5qV5)^RIUyFWesC>1@j?XAV0 zPvf_^-b?=K=&07g(`;h>K=?THu=vQxNF{w76AcX`BTXbz93~13L(&>m4)vnbUsW@# zs%G2!=dPp2xiqQvt#gl}D|yub#?;RYScJ_UPK8fbw5o3MvahKAVR3-a7(z9;New|C zOa~TykQzVP-maD+p22>*|I`d+soD}_H)~oJ?qO9JJPp0qWx5e-TTZ_iMj*NH4U-BS z*PZ4UL%WXkeN?D3w3J8+`l9q>uc!TR-SQOT%6!iHk zzEKgI(H%G{cn0|?UwBBVgG9QU}=QPsR#W=TCHMc zR-LgvBrI0FRtf{Ypx7$bS>sib^zlz8|CTxvuPo~2YmfZtAt5yRW3> zEO~L<9XI}c3Osp~r*_|^9g!6xIQL9#>P*_^c9D@VTA1tfoVb8AhNDwhpxokxKQV9l z5j&0B1B+kEE6aHXv1dzo)h7f*42CW`3Ko_zzM`6*P6|T1l6}<5Y2L!b`3!7q!Rpj# z0p1sGwpyrqF^FF^G7i73S!olnq>Acm)|2T4U4P!b%qQG4x9kP=hs|5cO3vKC9_etX znzqOF;6weN5FMfK{p7@U^H{Lline_%D-+z)4oCqpkF65|buGnrN4CtsteN9(NjXFT@ z_-ka}UFfXXshtqPHW+&tQEdj|9WP^A3~Yw@T6EA(hT(Wu9@cTRVsaV{TqNwIzDGQu zp2Nrk{ZG5T79sqSx9qdC5s*T?mdL~1OmCq0KghVFEUc^~#NZIBtZEq=o05ngIKS6~ z#$ynDvzKhte%88iHqv~bL!%S8Iju_H#$7a#WjKwe@gMFoxOAVrl66dMU=Wb{Yj-HZ z#6+b;$L5ut;WVBxQVegCftHcLGWXAq9_zF+*4q!T#L@oh|CuZnmjBKc8xPC>$sr4C zavv{7a-2R6q>7@lrnXeW9uF4i|HjFCJUGc%e5=VehRDfrhLFi9{Dh#)$*lZR4Zi%^ z&ah++Q=Ftf3TK^m7O!$#+V#nV`XLg*B}cU8}q*v zSXtRQnEy48nT?Z;^nKubCXXEdtoxMsv?IdA@EBJ^5O_X@NgzLFNxEA>WDu2GDM zYtcy3$mrwji5RmcoaU$NBcwWug3f!mF~hzf6H%(C>T~<@v;ES?nvfz?T2Mt#fCeGbEDRT+F@X8?(% zu3ei&2;RyjGW@Xq__rD0_P2=%qj-spo&TO+c?CNS8V=SPp(Z=&B+#*LSe8llW__m^wu@=<&XtJ{KX)7DUhQcrPs? zkDZi^@Dk^vP2_yiK*y-0#Wp}{!ETi><4G{^y;4gA1b~YsPLlw1Pz0el17#zC2#*qk z_g`eLZ5!k=pY{AX#FUQ~G8i4w5VwE@(=O|f9@rbe@}8>aDH4=Z!_x`$l;oSR(uASe ziuhB!s!qd|bfnLSVZ7abN^o!Z>ig(!T+^f2mHSqDSNlszGY_3OfHV-TVQ-k>+M<|2GiR1A(kO#@Xq)WImdHwfAWLT^Pb6# z;V!?aoK*$UVqRl7(3a&0fqomqF~dTGRh|$#cNxeU1`-+4WG!o@`8bB{5#hj_6oYTH}1ZwYxmg>a?s6fep z@@m;BojicyDSzMovWRhlrBZ|-U5$n? z8?a7*x1aVyBUES599=XnWkAGe(h;YD?zYE5!fPDHG;!@t|z0SzxXUD z%LZ91vb!NgZV}z;qzFG&WU7Pt!hjiV3jpBEim~5%1yjtERzEFHJz^!0B#2IxeRgFV z+UZv&k&=`){AK;;B1gZx??4K%;EVnF?JB+7jU}$}RL4hfgw)7@BNDs4Hf{<@OVB(G zLN`G6R02J&K4upI*L*}8XN{XgN-H}*rd=>%KsEMfEOGZd3yd)$hgD@10RyU3C}0Cy zNDw?bDY^LWQNk>&ihuzPIW<{cnQKn;prLi<1fkRMeT$pG0U516E^|qO=}q-SvVI#X z>si9gzdjf%g9C)hV{nU5F(1S6Rb?|@)Q}qTp@KMP?LQ|rG}>!YQ*uh#onSNHFPIG< zV}7KAH-W~MT|=PYRRsUVTmrBWbuYLtF*foFSuugVR&AjE*=!!S0tISi0aSjbq7rKh z&tzA-gPJVc+xj*D&Q1&`dE_el^KR*zyJf_E9TYP!6(BeXV;K?P_|ALHAxt`Lh7pXT9qm6b|F&gGNI8BF5Ul!X7~3KbTy|=sKArb z6Y5-IfpJRXu%$XSBfN=wj!X2D%5iD8-QE^Az&gg&MmEtu@Yd`AbSa^|0y|O&dzFXd z{BUUz*J5`YN+1IO>WuODQ)O4c^z+W*+pTHA*^rqXWO2%Hdb0%31DbhG!;m_(Q2id| zzp&09%>@UO6I_iwLe206@#Kqk2e}vihl3m}xWfWxWCFlv&|6QX+#KN*qRz<^kfG5} zt4Y!nFv0_CTlIGwVVP{`$dpxWwx&;Ty}Fa&TL7@R(c?I@zkx@-8dW>yMkUq}naZ#- zrcZKP^9s?&DWfH&{9pI?^j}sw%P~%g9M`ll2#28^VQSqVmzbN<&}^{0NPYvx{Z^zn zWfSmEi5$ADHj%O_exP^>?|__i3C*kW;*Csnql&zPWT~IuJzmb@!B}3#=;r<8JI+~I#nHbn9%;Wld0qybq>_0wY zThrxJ)Bm~w5FJncZkKW5tXjtwAosGrlz4pjV>?4=_JNu9j1f77SRU*TGrd8kUNVAv zXf)6{TW6JDuO!XA0yg=s1u`&$;jGLMoA%Xl)mQ$r7|-q!w)a}pmDiWimiJ%eMh2E< z9POmU|K<-nyZr#YS&dhSd353dr7+u5`ajZ*0k$Gj>3@M#|HZM$b9mRwkfDVT@~!42 zbiPQdLBbk5Z3U-myy9O9@{kwpQm=cPce+XJXv-6u{;~hdI&~<{P}vR__&-vyslBEg zv%B0v1-0USqz_$5RCq%r#!1>LAh3jo$Jr7c~%Pu})3GWXjx~|7yl2(htGgm{tnSV79 z#LUHN`yZ3?=m{;@t%>X01U)gDa@FQGI2LFtPz*QLd5P`+yAlU=8#d4{agk==qp#py zx}dv@|5d!KwoI5g*MAxQwoW0feaZ9$0q8j!NTSz!33nv;?L*xoA}w{-ANnky`g!N7 z$;VEwR_P_2yDnKwu2!;ae6$V4iK<0ck{ z$CX>5s6KV5yT*?aJ=VW7wEGlZN(ATu9pLI)8=XXle`D*R)!N8!Rfv&agKE06{Sq0+ zI{veeTzr;sRDqqs=XKR_I!J@r|B-o{MwE4Iib}lsx6tUrXo|iYULlmjN@wmX9xnY? z>y8}#!_z8*e-{eC9VJI-u9eTw7GZRIUpc`8?~i};#SCu3-dl9>e{&;uaqenS;$B=Q zq3S63EEXpz@4tYI45;ZUp341OZ0^{j4w{5%DOb4%uG7ff5F0&m|It0ss2H91H}R^8 zjH}0s7?;0V_Y}4%Y-zxQ8@#iav|Zw*;ZBVKHc9!JO4-Nb5T)Nn5212X8V{n`Qnl4| ztgbssa7(Tw8nM+lh8LE*F>|cqb(aEIp#s8V^eum`hien7;VsqSQZ0vD>5YKVS*Es} z90a~X`53>@aDlP7B_(0;OF>bd6`hz$@3oEr3z5;}dUxu}o|SHRwIR&G4nXhRS>#s% zrFkdfta)k0 z#u)?|?H<~1)cKX;C$=Uhto9!Oz3;^UR!_V!VCzgc3*m5~&o2<;WQpK z<-~wQ4I#Dfzs$&kj|t*Hny^jhK+43rXy?}z+eA^_Fn1qwvobM!mCml>)5voGjGy|GX_c2!WK&jI?ly>3S2Vtu})KWDb^3 zK->RdkMw=zYpBZBrBcn_XK8;UnU|BwZB0B8i0Dy87#rA0^GHeimzFIi5XW*X31sdFla2lp=UO0SRL*(xALVug&|j06Jp~GD8>XJZ zJL3%dygHGJ;G6#cD(nQVYM@>9UlHpb41y}-L}^N>J;Y{^lqR4H1M*v&12n0)UT z7<^)?;GfgMMIc5tgT5yc`L_%D9#a-OF23CQ7EI!LgR-EyZ#Pr*9u()zKb7Js`mchT zuTQCeY^h2Ru~;w8T+;NBnoJOHLP=uee)lv<(M5$bJ{m4ae1Z9BSz9RdNtI)6 zLg6Z^fT_xm|K%j;ftr)rQh`&2?fnd$5OEZOQWce`rZjg5^P}Le$%74BxYVnZr6N-U z)?qB3L=+Q}WZS@{asyUyX8!TykE2mtQVUv%87tUSz`hQCVqvAn%|?oIya0KCPx=xL zjZpDX1Fdm|mD18X{u06A_{qVBu@sIdCG-cak+`K!|jn0mZ;db(Tw)fn64VwEAz2k8dk$Eu6Rr;a( zcYOK^)W_)*$V20}e#sRNEM{QWzQsZ!N@6=Pn zi&O)#=_S8H1_OO>kUH&kAb2!zNG3M1Swknmb;bVw5)d6}?#zfcQDQ$;fAclAXcgG0*1m4)SeXO>=P? zK*RMg_;Jn|rhFm2{h0ke=sgvHP`@L_-KnQ5##N(Q?zMF9nd~2;j*Er(_*Kl8SoTn7 z&W3Ti=&RwtE?$e+m%MWKjZluTp=Bj%raJ}E@Ga*yi2l>h>(Bln-%5KolY&_VO=!1n z@tA5b9e76kM_mNeWRn*hZtqPiAMTI{VEc_i7axAHuu9M8=Cb<_l+7cLBG`lszl;ke zgi@(VH7g#bZ`X3Io`!u^eL=ee3}q^=ihsJZRrOcb)I-k6zS-PO$q~xHT$PL2<&|XH zG<9~5UJf(U9pEh-t~#+8dT>7lDURiWO*u>=Ek990rBCQ}TO0Ake*FSn5H_QO?>9d6;}7Y80L_s`h- zK0Z(T&xW6J=q47h%!`-s3T38(1j69w$Xi&27e(g++s=B$Rj+G(0KW7(lI8p}^&4MT z{bw=O>CVIQ))&WaHlKhSlitTU)=m#0$(({L3jDRSOab%*%qtEfz2Q-EJa~;8+07*J zQLR7k#k+!+)K{F!q%_@7>iFLZrs*m8zCgM*N|U9+O?QE_WAnVLikCT_Q5tuQj$TUQ zSL^zeUr6$=@Ywz`faGe3HDa8qQl8BM{6k%s^}vj&mG5hrTDQz3Wu0{{N!m8>wFJig z9UieJ?@!~Muww*Q3=%y2BQZJdMI9N4u`(@QNLTmSy~{BTO+bB(9RmPT$#on{_vd?9 zBV`bC|0peA7$b_#$=T7wzy`_$)z;X~&=QK3fPvuOHvs_w z3mYdxLNSaoA{#3MCkFw&kpTe%-G6dD6s$W4z|&0~MeXT}ZhV5qDTUR6+1!%9MO?0?cd_0SpgLi!A)m&)e%3v51 zptVefEFoc2bkAhY%u&*eC=9Bsn-XqV7J&BU5rt%2*A@5{yFYv#2kd+`a!lk*5bmyd zl?spwwo!q?Bu!D?SF7IsZ0*0^UGnV$>9@AIAfuO-kdF)xm1)9Ze0L%rCp}I6+5l$O zu~1SGZ8<_(RH|dO(-7KPc;9~Ue0(hfzODu}u+*Nq)9Zd1pVnE_CDnBwK(*%ZNcd{| zYJQ4*jty*)Y>=#x^d6Ls(*BO>Q)E;_tPE8op_)UfK!H$BE9+zFzn7j@D+VZhE^wAd zdCGi{39ZlP%-cHCWC@haV4u=D|MW@wj9!|bK0%kk9|`~(2Q#ouupCJPj%e-_ z$`l`!Z^szNB*$9EC`|GkV{Vggy-Z>>0L;DC#Tum=bsE_kc^be~mHIc+n91za58KCR zR-?CiQ0~}9BeVLuRSZ|oj6SrwAFEW46keH~eQfm?*645XKI5Ogh9u%BOv1vk*y+)x z1?q{xO$FW!=oi8&C!m(XHM2PYsx+xGr3&}OZ;K2`ftH1qk(T+E(NsdH6`ECJsy50O zs!64ArBo`gPsO?`Xc zn_hhGN{;w5x>?yvDOr`C)U?V&%ET+k%S%elN_`fg7iRyU{&D#e^#}J4fXJn+O-ZMK zub8jM_LrVob2)xR`@-~M&0?pI%xmhy>HKj5Uz1Pfo6H|(AB1*BBAG(4qa`+}G_`CX9V#=|2ZupI+E`(!eJ%(H2)- zg@*NjqTeRe&J_`k;Y;|W^u0$~cGD34A)i^3HS6fURxScK-6`o!&=$? z$F@s^91MP<;aeU6q~YChBSOZcA+)B)XJxgRTjmJoUfCO+=>~=iH~n4^lo;;|X=na< z{Z5<=zTW*8#DoN4@4?wi!qmQx1`f>cJUB-mYrglp@NGV93o2MHln~INPIL3DUfpHe zKvKJX-A!CmtF?4l%#QK*-w6YVm-Cvigt$r)=z&8}%Z_J&X=~41@BUI$C76z*F0STc zu12L*1jhQgs9~@WBjxj8a=!W?|LdFnw`)m0#RR9L{6S^+;nt^J;uE*LkCLSX>5W@a zk_UOjYyCjnrR1MGwkzn&!BEpO(~$?v-5VXOI++8N)O4Tak@PhijU_TXEzPCY(?3Vf zRi4BPey0Qgw8Qa7@=clgoJ`M`cSDSvcN^7|yN|DQX{#zw;Z?56Jt}`6PaRats~QTG z(-D(;+MwX0X6a?p&~3M0?x;AX2r5hqwz5R@L1Bd$^vr%kF*WB@#(};>p zJs^^E&@<%z6_MmZ%+)m`+xo?F%L*@T0NNsO(0-i*(7pO8O?sqULwH1v-Yz0t5*t_WWKk|4e5*>*~0gMloeMqlJ~E4h-e) z(3dj-V0E)`TiHAw)wr63sRc?Q)2&l7yV{IS9=lnu>uM5Yw|E^KoO+tvT+(W}S>DyV zRZHifWTTWMXr~7KxgwT&&f<1Gy4t8EEs%iWMDsDc;WZge&%|BzUV5#mTZ(YHNH7FL zr&24l+h~z%cNJf%z6gPKy_`+*{g_-vEs|;kAdlz%tmKl1*LtXx+I}*C=Q+Q*oc;UA z1LFBQ)!Iq^XK<}8zIc4?a^?=Mkt@piY$opRsS#aCo}M?q;wSXl{?tB1+mG!%eN=Y_ z*`!sA9|M79?fXKFd1(&g$}SdRH>)5#k3Ia3wWvy%liWVSBSB$;ghrw+k~LmGp->K3 z0lZ3zG5MDCYWTBDk{-?pt%>l*l7%=D4GE@B z`uCh}H%B&fkMHGYRRft@0Z=#@HI?els%rH?6*q4~M)7F!^?g+59D{EH!U&9y&Pu^gKZ*L7!ZrKH1j)h&~OE>GO4 zw*+@e+65=PNz|dMcwGt+tX*_)5yVe8(aWUEPHEzGR@3H!POVkP2f&7tKrUmD;fDq{ zn|FT`m$4aWN*hmF4*oCP;J(=7K;Yd9N{RyiW?j)u*cRd#@Idi=Si6RHTTQVBz~ftX ze;Ko8Hfj?=ce>UQlGSv8n@MEm8OF!wFa_3FAhj7iJ*yIwM6MU3V91ZPOG01WK8p$n zXZ5d^D>&Nx0moHW=1VL+R8>G0@j?=L8gd9-caFJ`MDsow zJTr=ach_5xWzXVp?$iz{--@BM7Ba%`N5Y|@&8ww^-Nw*N=wM#{e(cK?B9=Lc&?F*7 zE!e3EZ%~*Q!sbo$pdh?8>>|A>7J)E>ga*fuk!v?ks?SD|!ypnHL7EE#nAyY*;e-(H zx(YP%dQ(Vcb_K-}f)yxZ2fEVMfBtSs**%Bx47g}XS&(@pZOU7~p>qpy)XX{`&hJ3t zP^26I{P8cTL193)wU7OTT^E+_pgac!9G!w01eHc37RE>)NN5@mCPnu~!ALDh*W88G**MBX|r1{WZTMw@izuk1h%dJTKZxMtU$WH`~YC+i=X`kyTe zuSSEtl`5odAEz&2yPEH6A;zQ5(;XZuE`qm_1h~H#Ddg!lXU20LC2}4pvNd}U(Ur ze)2&~_J_=~2p zq9D{}rW6YhvnZ*H?svnWkSfAm?R#Q85DEHJ?+N%6G|e}znm%?U7BRM=jx!$(nixAMxjOfZj1}Q9KupuT}l5 z$Q&8`yY?G*AhRw(Jo=~D{dtP447A`MEzZ;q6#*9KVCc_22SNW*tAWI8P#&z9zB>nk zNHW}GK%5N>CItfM=qks#cn>ZfIzFNZyy+VX~W?my{uB+3t@|3L<6qQCYA0^E0WM9&ej(-V~+rB48{om9U~<(h#I% z0s17kct$h3ibKUW;ptuuqu^RQF{bStT+dDZN5U9Li=Ld7=c*Dfb7F9B!Y2|q;U7Z* z_-Pl;ltSUDwuvOH0b;NLyG5d9ewiy-GOXNQ?-Jry!?_R-55r=81%SZ&T0!_jPs4@& z^^s9JUZiCk9e>YbL`hpe-}s;R3H>xD0P#!*{=K$WN(AFC0)E&t6nm6(&JJ6q%7R6Y z)(TP9<}^qPc0{F@vIS|LpG4-wZ=JnJjMA=T$z*5w6Kg>w!CayEdL&yyPMoIfnZm4Qh`{TqQ=Un-}? zwX^Vm!(NwV!c#D~rT8m2$J%t;t&Cda4#9<69bp(k&~%$1-2N<&;Dssiu=O-9^^`CKGR=j1b6BZ!wTGwmM~j z)JJiS)IeN^RI2UDQxA&fbbS-NI_t#Cp8rb4w@)aeVhO-db!43@)fRH5PQDTl- zW4nTyFqkexmRx`5CwPZAKa_hq;>)464SMF462VIu_uLwHxUzA8+sw<(&HhIqq62TB zKA%);9kUyKjDCmW9EBu2IIco&3gC9&xqQ;@1Rf7_R@&kFgI{$Bft5u11W0 zuBe^8-SwOPnmH4zS|nM*yMUwnOmpFQ6?E?jdjU9W+$3)SvX(3SQDUwt=Rq@7q3{WF zrrRO&JPHIR++-3QV$fE?1|)MBdF@eUbrG|&T1oK1pJXQ5)(5j3fVtpcDZbb#Q%oYj zB_zc1UI8Sdmj7vn;|(Mzx|ld^bD^}hND?zA2A9upZ0}iOoO4{rXdfvd>m&1M3MS{A z+30t(ozNIkh~njbWr*mAv9L)tliTXARc(#h${HE!H}&E;*yPqx)6wGb119pc80+u} z=_A?<;=6>0l&E9}K%F9!*DA{@!Rj#+w}#(@BAXJM))9RM%^7ihENt8j6Ei0DUF<40 zHAAs+>CJ(wpS3@YQj_4L9G{9VWli$(xYj|{ZTqdOM@fhHXGB*Q5&q0`E^Qb%-fD#3&$S|@`OR=28P%5LY7)<6kwVIt55SdffO;l&CJB4&r=7%}3 z*lWe>E31urfaQaUNWha2g`ChdU%F&cCmssaJ3eQ?0#R_Lk>jcQ?aUrrIV8N*O7 zK_RZ@+JVb7AosFpk0H-*Z94EsqF}PZ}dvKEiVUc;nXIgdtL|jj*BI3xMLE* zI*i}P6h3FeaszOa7|P2w1;p#~qUBmjr|ctFf-31|Tr?Po`^dD%!>}rbB(2+K0K3iw_<`c9{BQeG$W)L?5~@;R6M-^IcKu z0e>5s4xh_!Uzn4JNWkNJ0w+%^Hd(h9heG(R@wJaI!(orWyf7U3Tr4EN!uQrKF@G9j z0JKk2NRk_J@N45QOWM*e0*jN??B2?@QF(JsDt$67KQ8E0`Xr@CmL@itf#kUX?#kDg zG~;P(DF_Qxx>%K-Ryx@`aGYtEY-Ig03WnbNQcS+VT7&pZD7l|Lo!mbSTb6&dX#-YZ;RE#;&!M|jS(PXP++g* zop=4KQW1svk(vs18igL^i%qmR;8b89wb)9QJwr7OkI{y~$I>#Fuh`v^5mo*o*Ee^q z%=QoGL%65xQy%Xr4p+>U6#AUo3EeB_M>u8=jL|u!8d(^nsU-&QUHS|9ogHbF$XHBb zrqZuyrD&BlO0Y!e#M!a$hn9dth{NSEqC-BDqTArx>^kw6irc7Fa#P_6oJq3O){IG( zJJvgPXeMdqaW-n^3TAGbC1cmw%E8KE7`3h!`BvYj7Q;b!KRa~bQr7Ek?THc}J^sBd=w46dElS-pe=^@Fo-mu_YJp0q(wGs~k_YO-Y z90`)}!2ILwP{m%qmKh-Qlz`SdOtf}*whdU!u;&(8i=NGdP$3br8z=ydw{tV3&Q3I{ zL>p2i4mY4&>(#tS@_5P}U*Q?;8F(=uOZR0L9i@-yhELCY1l{hr&u3iwoAbQJ8Jng+ z-;6s%ZPxgN93?*IB%lxOcadLVKdkm;Tg~m#-3@gFT)2JKX&PWDloS0bu@*8bu3eUW zDaxjh2QG6DcO8h#Z!L6A!|(8V07*Sz3H)=CyRPh9PyZEr%?z&$@cQX%l24n(YG<=h z?tWOwQA2@r0Kpv)k1<mM&Y5F>5$IE_D!DEP0CK zkbbJhPNt)0n@45VQAtL>)TVHwP)dCxu_ z3vmJq204xKxlNgbEot~!5^8ePTzf50NS9BvePbd~hS7n(PGXRwIYIy!chM}iKLE7zo zqhA3yrU6nllXMz^l3@p8wmgZE+(H7$P8(Up^n9+$e1;FR3Tp)b)FrYp+yAK8SjB%$XY7lh}&VL*sl3uyg zm?I){b+~CkcFnc^nh--!KP*9jj<2q$tH7pDBR&zHX~p1E*rc1qlm#_8EgN&NMzhny zEBK_(7!}=);*grk^@7mzv%Ri+O?@?GEev#QND8i@ciuh_i<0#c$Uy{}>4!iaYJ`@^VFm&2xP1RBE7421xy^ky@8QT;BPi%xjKe1EROlrzZf{GFO#? z92gVsA~=}ss(JqL8@6fAKuz<5-Of*#lBT@E`WPQak1b{bTe4p1JJ=OOiTQ@1f?@(m zN_$I|{}qW7Q@cPiNu@ma?-YVG?6xvD7A{R~C5@WSD}ZI9kA1CA^(C1Ou+?5X4^Um1 z+fkd&uNBuqK|<-27|Nu+B0KVk-^ues!?QmN82gcZl^3_DVLE?45j65JRy5IAwP=QC zp~qZW$HDC3;i!4;m_Gyg4!%lck0H}%OHvaKhMo#Jiy)^eULB!ZJirB^PrY|vjA+P% zAWs@;^$mtFu^$)0548nJ3bE$u15g;0D{3q4*A=lPzFjH>1s558m(^JLJ_Iovf#=J3 zeHd|ejGrT24YyUmJl5Xbl}rMuWE>+D9%K$DE=_$OEN=kaF~9FN5QO>Rg$%)dSZjAe zjvyz!7DEfFnJ@)t^%nQd4~;(tjwF{NH&&4|V|ea21GJ8LcY3@b z==;1V@gcmYoKg#ZzPaWt_`tggDu)ycjxm|Oy`A30IZ_FcyqY=eOTCQb^7?vgk_ROs|^XZ1FAuclHmXcWYkt>0%l`z+u;N+Xe0T z8ce3AgbqJ9QAI;ug4a?-0l>1K2Gj$qz$X6@;aUKG$WcALf|l@07Q}3nU^=$~d`fFt z+&VP!U{Jn_$y;NIyvlZm3(Ho$`cvwZt$I5@P{@O7B1OTt5`*8$T7R(bZhQcq;PD-M z;0pz)9AqT6Usw!vt%=pMi$F%ePD`zU-bqGC8~ha20?Wiu@%AzcKz6{mxJ2SZVbx)GT(Cbb3_yftY;ofVqTITywo&?96OwwL)wdX37g%m zNV(RPhG*BQq-FO7z|zrdX)5M=J3H3xSdi!E78Z^mTnteA%5&A|n)4_83LJyK;&hRM zZV>*lq<;~Ls9rJd?hw@K)&;!qHJUMAZtb0FJ8>93VgBL71Q$+WhrZst&sX6=o+XO} z+1XB%TbFPq`Y_<(V0$-c3-LiRg8z_dhS*{TDFL76*&r4RAVLV5pQaCrtRS}M)aYuz zPkmJFIi)9inSO%Y?A$XBfZJ?B3#H`)2ny*X2*k5n%egRsaeXcd`qtvAB1>MZXxC~9 zbT?~z-HhL32a52(CEYW5a^7@J4!rTb4krYRLSy77xH6WCrOMLl;%6O9Pm@)*6%~Qo zyp{;*syLAY^nQ)wy9tSv>;XlOHL#d=$bNtEkkOEQ8(5}rKbs(sGfGK)DB>rq9UOTs zI%4Xy6BpdI?aH<9U;7~PPX+T|@!C6r^AtNKzl~!&RU99rS2L}V)%0Y^{~9b0EE;~U z3tXjC6LIchv((iWY0wiGh#MMOBR&>22GKfoM(aZay!ZGeb;0s|5S|iYfd>xl2r3s7 zzHBq=;Bf=e(GE>&B`!ya`guH=RcX`N=)^f);hk8YL{>+s8_k}yw{Gi|@?#IgFmLtl zhgM@uW3UX? z5}iZ<6uR*y?>wj}gZcV4>ZiBJ)Git(KbBH%yegV)*6Fhi>*kf%b1gS7OM|MEJ+v>t z$t?yX1GQifgG14n9tSiXgpKN!1hWHk0y>f(1b` zB>eN>XKg6)C51<^r#TgxpPk`ioesrQVB8i+cLyh~=T%+ichOLYi+Au-1h&buzQTkH zxFLHAZUiB!1SKqO3U1XZf8Q&fYJeotgNeq5Mi7LhPijNwDwGJiB>OOZB-e9{-){f` zGXl7z+;ti;d? zu2>B86!Q&uoN^xb-1z6zpo4?M@ki2>l&f_$-Rur}K@pM$3DYZ&e1-m`CkJ}-MxThM zs|$Ac=I!N+XGg2YCYr;Ly33rjnTZd8*T(_>^86p@fY&PuYZ@|wO8qfla(T(PptOI0 zUmxe@5}MY{%Ge`nq#U|pKb9&;^=c)Hd{C8kd;pvDW=goIxauFC)q_y9-m%S}s1I3UO&RXbpaxY35+4Ya( zI4HyiKngt$_wZW!h5c(GqBNtiMcko3rnrigyNf)hs8P4J68Es2yR4gby&uC3$unYx z=RW3#tfIQz(oH+L?+HnoT z75bf@efv>XuCEtZeQZ|X7-H%g-rnvaD(|!DV^qK5hou6e{1Vs@2Fj#K^oVDAn_yj& zaxVbdmft<9k#M=3O`2Pd+ilD_oA$?qpXP?_BA@Od>G{CrPJAe;j)pw(-6I{k4rgzk z+2Z?)LuiK#$;R4O?1c?S>OP@?6kNX&CK>R+IGI=yE*T^M37ygF3#Z&TzTn9 z)!M3_(k0}bHNv?tvQiqlc^ki+aoHDvFYhfE&b&z;D*d_b_#N)+XTtnGV`n1xiA!y7 zs?3W;+V}H-nq}tVsVAE^VKu7u%f*{g=1J|#@fIK4n!bcnZ`be|s1?(qeNja3{VM8AZ@{7+(IWc;U3 zh*L*TxK{rT_SZ5&n^hc?m7%_XRf7bKiIE}UOT&zYg^h`WfZ^YVz?J~&KY@XTlb!kh z(s3}bCd6x!09e>L{(AdAIxw;_urT}&9TN)^!~e8nU}fZF{2z9VEKH35)9$a1`R@_1 z|I-Hx`+q(Ff3^P~Qbrbbw*QHgk(HH+^M7>y`*RHcKRV|B*_Vl#lY!;`>dVRWm)QRo i4Bmed)8Auh|5s<0e-zDW$w0GkuyR0=l8VZULH$1sFFeQq diff --git a/validation/outputs/party_scale_example_plot_data.csv b/validation/outputs/party_scale_example_plot_data.csv index 40a0848..15e59d5 100644 --- a/validation/outputs/party_scale_example_plot_data.csv +++ b/validation/outputs/party_scale_example_plot_data.csv @@ -50,9 +50,3 @@ 432,"Democratic Party","US",2014,"US Democrats","trajectory",FALSE,"",0.462867505375,0.326761075,0.602355425,0.389843067375,0.309037225,0.471238225,"both_direct_or_nearby" 432,"Democratic Party","US",2016,"US Democrats","trajectory",FALSE,"",0.388854405625,0.2650008,0.511855575,0.371516706875,0.296737875,0.446610025,"both_direct_or_nearby" 432,"Democratic Party","US",2020,"US Democrats","trajectory",TRUE,"US Democrats 2020",0.299892256625,0.1963003,0.410606025,0.3345769065,0.263694925,0.405684575,"both_direct_or_nearby" -1545,"The Left","DE",2021,"Standalone anchors","anchor",TRUE,"The Left 2021",0.05463340125125,0.0205853625,0.104672875,0.2266517688,0.13204575,0.336095325,"both_direct_or_nearby" -1375,"Christian Democratic Union","DE",2021,"Standalone anchors","anchor",TRUE,"CDU 2021",0.57714137175,0.45681705,0.69505505,0.536185121875,0.433751725,0.636189175,"text_only_direct_or_nearby" -1565,"Law and Justice","PL",2019,"Standalone anchors","anchor",TRUE,"PiS 2019",0.230162367175,0.159245575,0.300962375,0.841737028125,0.78973335,0.891444425,"both_direct_or_nearby" -1567,"Conservative Party","GB",1979,"Standalone anchors","anchor",TRUE,"UK Conservatives 1979",0.863733304625,0.78370345,0.932120225,0.58421918175,0.47261405,0.691922375,"both_direct_or_nearby" -433,"National Front","FR",2022,"Standalone anchors","anchor",TRUE,"French National Front 2022",0.524320955125,0.398589175,0.645052275,0.829604491,0.73907015,0.911430725,"both_direct_or_nearby" -809,"Republican Party","US",2020,"Standalone anchors","anchor",TRUE,"US Republicans 2020",0.8507495345,0.77742365,0.917357075,0.721311676375,0.65728435,0.78442835,"both_direct_or_nearby" diff --git a/validation/plot_scale_examples.R b/validation/plot_scale_examples.R index 1e93e5b..968b1f9 100644 --- a/validation/plot_scale_examples.R +++ b/validation/plot_scale_examples.R @@ -49,31 +49,13 @@ trajectory_rows <- lapply(seq_len(nrow(trajectory_spec)), function(i) { }) trajectories <- do.call(rbind, trajectory_rows) -anchor_spec <- data.frame( - party_id = c(1545, 1375, 1565, 1567, 433, 809), - year = c(2021, 2021, 2019, 1979, 2022, 2020), - label = c( - "The Left 2021", "CDU 2021", "PiS 2019", - "UK Conservatives 1979", "French National Front 2022", - "US Republicans 2020" - ) -) - -anchors <- merge(anchor_spec, panel, by = c("party_id", "year"), all.x = TRUE, sort = FALSE) -if (anyNA(anchors$economic_lr) || anyNA(anchors$galtan)) { - stop("One or more declared scale anchors are absent from the release panel") -} -anchors$series <- "Standalone anchors" -anchors$display_role <- "anchor" -anchors$is_labelled <- TRUE - plot_columns <- c( "party_id", "party_name_english", "country", "year", "series", "display_role", "is_labelled", "label", "economic_lr", "economic_lr_q025", "economic_lr_q975", "galtan", "galtan_q025", "galtan_q975", "source_support_class" ) -plot_data <- rbind(trajectories[plot_columns], anchors[plot_columns]) +plot_data <- trajectories[plot_columns] write.csv( plot_data, file.path(output_dir, "party_scale_example_plot_data.csv"), @@ -86,21 +68,15 @@ label_positions <- data.frame( label = c( "Fidesz 1990", "Fidesz 2022", "Danish Social Democrats 2007", "Danish Social Democrats 2019", - "US Democrats 1944", "US Democrats 2020", - "The Left 2021", "CDU 2021", "PiS 2019", - "UK Conservatives 1979", "French National Front 2022", - "US Republicans 2020" + "US Democrats 1944", "US Democrats 2020" ), plot_label = c( "Fidesz\n1990", "Fidesz\n2022", "Danish Social Democrats\n2007", "Danish Social Democrats\n2019", - "US Democrats\n1944", "US Democrats\n2020", - "The Left\n2021", "CDU\n2021", "PiS\n2019", - "UK Conservatives\n1979", "French National Front\n2022", - "US Republicans\n2020" + "US Democrats\n1944", "US Democrats\n2020" ), - label_x = c(.84, .36, .12, .33, .73, .36, .11, .65, .14, .84, .58, .88), - label_y = c(.36, .93, .32, .49, .33, .27, .16, .48, .93, .51, .91, .78) + label_x = c(.84, .36, .12, .33, .73, .36), + label_y = c(.36, .93, .32, .49, .33, .27) ) labelled <- merge(labelled, label_positions, by = "label", all.x = TRUE, sort = FALSE) if (anyNA(labelled$label_x) || anyNA(labelled$label_y)) { @@ -113,39 +89,34 @@ trajectories$series <- factor(trajectories$series, levels = trajectory_levels) p <- ggplot() + geom_path( data = trajectories, - aes(x = economic_lr, y = galtan, group = series, linetype = series), - colour = "grey25", linewidth = .7, + aes(x = economic_lr, y = galtan, group = series, colour = series, linetype = series), + linewidth = .85, arrow = grid::arrow(type = "closed", length = grid::unit(.065, "inches")) ) + geom_point( data = trajectories, - aes(x = economic_lr, y = galtan), - colour = "grey35", size = 1.1 + aes(x = economic_lr, y = galtan, colour = series, shape = series), + size = 1.4 ) + geom_errorbar( data = labelled, - aes(x = economic_lr, ymin = galtan_q025, ymax = galtan_q975), - width = 0, colour = "grey45", alpha = .65 + aes(x = economic_lr, ymin = galtan_q025, ymax = galtan_q975, colour = series), + width = 0, alpha = .75 ) + geom_errorbar( data = labelled, - aes(y = galtan, xmin = economic_lr_q025, xmax = economic_lr_q975), - orientation = "y", width = 0, colour = "grey45", alpha = .65 + aes(y = galtan, xmin = economic_lr_q025, xmax = economic_lr_q975, colour = series), + orientation = "y", width = 0, alpha = .75 ) + geom_point( - data = anchors, - aes(x = economic_lr, y = galtan), - shape = 21, fill = "white", colour = "black", size = 2.5, stroke = .7 - ) + - geom_point( - data = labelled[labelled$display_role == "trajectory", ], - aes(x = economic_lr, y = galtan), - shape = 16, colour = "black", size = 2.1 + data = labelled, + aes(x = economic_lr, y = galtan, colour = series, shape = series), + size = 2.4 ) + geom_segment( data = labelled, - aes(x = economic_lr, y = galtan, xend = label_x, yend = label_y), - colour = "grey55", linewidth = .25 + aes(x = economic_lr, y = galtan, xend = label_x, yend = label_y, colour = series), + linewidth = .3, show.legend = FALSE ) + geom_text( data = labelled, @@ -155,12 +126,20 @@ p <- ggplot() + scale_linetype_manual( values = c("Fidesz" = "solid", "Danish Social Democrats" = "dashed", "US Democrats" = "dotdash") ) + + scale_colour_manual( + values = c("Fidesz" = "#D55E00", "Danish Social Democrats" = "#009E73", "US Democrats" = "#0072B2") + ) + + scale_shape_manual( + values = c("Fidesz" = 16, "Danish Social Democrats" = 17, "US Democrats" = 15) + ) + scale_x_continuous(limits = c(0, 1), breaks = c(0, .25, .5, .75, 1)) + scale_y_continuous(limits = c(0, 1), breaks = c(0, .25, .5, .75, 1)) + labs( x = "Economic: left (0) to right (1)", y = "Cultural: cosmopolitan (0) to traditionalist (1)", - linetype = "Election-year path" + colour = "Election-year path", + linetype = "Election-year path", + shape = "Election-year path" ) + theme_minimal(base_size = 9) + theme(