From 72dec5ebc99e38738123a6a99a263dfe2920299d Mon Sep 17 00:00:00 2001 From: FliegendeWurst <2012gdwu+github@posteo.de> Date: Sun, 29 May 2022 15:05:23 +0200 Subject: [PATCH] Initial commit --- README.md | 43 +++++++++ dot_hypergraph_to_asymptote.py | 167 +++++++++++++++++++++++++++++++++ graph.dot | 13 +++ graph.png | Bin 0 -> 16412 bytes graph_dot.png | Bin 0 -> 53910 bytes shell.nix | 8 ++ 6 files changed, 231 insertions(+) create mode 100644 README.md create mode 100755 dot_hypergraph_to_asymptote.py create mode 100644 graph.dot create mode 100644 graph.png create mode 100644 graph_dot.png create mode 100644 shell.nix diff --git a/README.md b/README.md new file mode 100644 index 0000000..d0731c1 --- /dev/null +++ b/README.md @@ -0,0 +1,43 @@ +# Hypergraph drawing using Graphviz and Asymptote + +## Usage + +Requires Python 3, [pydot](https://pypi.org/project/pydot/) (tested with 1.4.2), [Asymptote](https://asymptote.sourceforge.io/) (tested with 2.67) and LaTeX (tested with TeX Live 2021). + +To render a hypergraph specified in `graph.dot`, execute the following: +```bash +cat graph.dot | dot -Tdot | python3 ./dot_hypergraph_to_asymptote.py /dev/stdin > graph.asy +asy -f png graph.asy +``` +You may adjust the font size, width/height of the output and more by editing the values at the beginning of the script. + +## Example + +| Original graph | Asymptote rendering | +| -------------- | ------------------- | +| ![dot rendering](./graph_dot.png) | ![asymptote rendering](./graph.png) | + +`graph.dot`: +``` +digraph { + edge [dir="back"]; + "Node 1" -> "Node 2" [label="Edge 1"] + "Node 1" -> "Node 3" [label="Edge 1"] + "Node 3" -> "Node 4" [label="Edge 2"] + "Node 3" -> "Node 5" [label="Edge 2"] + "Node 5" -> "Node 6" [label="Edge 3"] + "Node 4" -> "Node 6" [label="Edge 3"] + "Node 2" -> "Node 7" [label="Edge 4"] + "Node 6" -> "Node 7" [label="Edge 4"] + "Node 2" -> "Node 8" [label="Edge 5"] + "Node 7" -> "Node 8" [label="Edge 5"] +} +``` + +## Credits + +The generated code is based on https://tex.stackexchange.com/a/108099/185782 by g.kov. + +## License + +[CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/) diff --git a/dot_hypergraph_to_asymptote.py b/dot_hypergraph_to_asymptote.py new file mode 100755 index 0000000..beaf860 --- /dev/null +++ b/dot_hypergraph_to_asymptote.py @@ -0,0 +1,167 @@ +#! /usr/bin/env python3 + +import sys +import itertools +import pydot # tested with 1.4.2 + +if len(sys.argv) != 2: + print("Usage: dot_hypergraph_to_asymptote.py ") + sys.exit(1) + +# output size +width = None # 400 +height = 639 + +# size of node and edge labels +fontsize = "20pt" + +# specify minimum text width +# (useful if your labels contain wide unicode characters) +text_width_base = 35 # 40 +text_width_factor = 5.5 # 9 + +# draw edges reversed +reverse_edges = True + +# output \begin{asy} ... \end{asy} +output_latex = False + +graphs = pydot.graph_from_dot_file(sys.argv[1]) +graph = graphs[0] + +nodes = dict() +node_list = [] + +for node in graph.get_nodes(): + pos = node.get_pos() + if pos is None: + continue + pos = pos[1:-1] + nodes[node.get_name()] = tuple(map(float, pos.split(","))) + node_list.append(node.get_name()) + +edges = dict() + +for edge in graph.get_edges(): + label = edge.get_label() + if label is None: + continue + label = label.replace('"', "") + src = edge.get_source() + dest = edge.get_destination() + if label not in edges: + edges[label] = [(src, dest)] + else: + edges[label].append((src, dest)) + +hyperedges = [] + +for label in edges: + xmin = min(itertools.chain(*map(lambda x: [nodes[x[0]][0], nodes[x[1]][0]], edges[label]))) + xmax = max(itertools.chain(*map(lambda x: [nodes[x[0]][0], nodes[x[1]][0]], edges[label]))) + ymin = min(map(lambda x: nodes[x[0]][1], edges[label])) + ymax = max(map(lambda x: nodes[x[1]][1], edges[label])) + x = (xmax + xmin) / 2 + y = (ymax + ymin) / 2 + #print(label, xmin, xmax, ymin, ymax, x, y) + hyperedges.append(((x, y), label)) +#input("") + +if output_latex: + print("\\begin{asy}") + +# code based on https://tex.stackexchange.com/a/108099/185782 (g.kov) + +if width is None: + width = 0 +if height is None: + height = 0 +print("size(", width, ",", height, ");") +print("import flowchart;") +if fontsize is not None: + print("defaultpen(fontsize(", fontsize, "));") + +print("pair[]pv={") + +for node in node_list: + print(nodes[node], ",") + +print("};") + +print("string[]pv_labels={") + +for name in node_list: + if not name.startswith('"'): + name = '"' + name + if not name[-1] == '"': + name = name + '"' + print(name, ',') + +print("};") + +print("real[]pv_size={") + +for node in node_list: + print(text_width_base + len(node[1:-1])*text_width_factor, ',') + +print("};") + +print("pair[][] pe={") + +for x in hyperedges: + print("{", x[0], ",E},") + +print("};") + +print("string[] pe_labels={") + +for x in hyperedges: + print('"', x[1].replace("_", "\\_"), '",') + +print("};") + +print(""" +pen nodeFill=white; +pen nodeLine=darkblue+1.2pt+opacity(0.5); + +block[] v=new block[pv.length]; +block[] e=new block[pe.length]; + + +for(int i=0;i "Node 2" [label="Edge 1"] + "Node 1" -> "Node 3" [label="Edge 1"] + "Node 3" -> "Node 4" [label="Edge 2"] + "Node 3" -> "Node 5" [label="Edge 2"] + "Node 5" -> "Node 6" [label="Edge 3"] + "Node 4" -> "Node 6" [label="Edge 3"] + "Node 2" -> "Node 7" [label="Edge 4"] + "Node 6" -> "Node 7" [label="Edge 4"] + "Node 2" -> "Node 8" [label="Edge 5"] + "Node 7" -> "Node 8" [label="Edge 5"] +} \ No newline at end of file diff --git a/graph.png b/graph.png new file mode 100644 index 0000000000000000000000000000000000000000..6225259e98ab5aac35bc1d11330102d3a1d0c9c1 GIT binary patch literal 16412 zcma*Oc|4SF|28fOS+iwHh#F)YYqk`!q_OWi88P;KUyAH|V;x&$2_gGFl6A4if>vy^)6x%DVbX2&E2f^*F^3}bA(Mu8SST|oto8(8JBKInHPNjVB2w7fFkwfd5Sr--*c1XPgAq@T!CDR9N+d47%KE}dN35ySzTVfn;4BLFZYqYK2$56 ztMT555_tiJZou5Rb7#RNLl~mq(gUwGJe6Ukx|R@`JX`xl`4vq_gGpuVHkX0tNZW!S zzE2An#Q%Bn@;dKhl`!bK8McWpO|7V3b>G>hC2>)IG*8 zGHx8Z?53(H@}eI*3(*X6rL_X{^Sxu-%&4K(JJeEU4gV07V#NPuuhN3vFNdHnVr7CBxgAaPqll%F1ctw(ebBj-FRb^dUD};z=KJ9y z8MrGRY)`>Fy5R&?A~0f(LrCD_J@5y7N8*OCrZNcm+LRhZ*wo9goJn$Vv)YB|5; z5#LK);u>69{7Bu^>Cm%^_^G5M%a>0tz|xNmYkrfk%g%fb2qPqh8XIV6Sm=-+gj2Kq z{WYzl!;bTM1ewHBOzngVjtm)!JCqz`dI#q{{`P7~C}VnPZQsNhS@U~s&5>U8DTem^ zrolZ)zeR_;=Y4n1b=x{**gEBfFJ|(y(?6%C$`dt+>LY**4f~x&hKb^vX_@^TFyU}l znHdzh)88+Yyh{j`qD~#!3Je_8`hYL`=@Zh#nXZ?@s&;;CKwa-G7;;`iL)7+xpc)Il z{#>AeVD&2-X7HIgX$jOM9U_1{(roL9dkgCP;^4oSnM3z^djZtpaV0>mecjs=kF*9C zNg5mT@W1lk#n)ITdTvXA{7DdD%Rfm1>eZVh-H~7`_yW4ShSGHp*(v-EK4ybfn(tnE zikS%S{Y?NHxyaOh*~&xX-4}IyUF8@8(AU`YOW+>e_oaV|k-D&;4Vu2-rE&rE_ia&| zDUuSj{m~(t*NguIjq_i$7khu1#A>f&%muf2JKP!dqHUr*0hThg#djM93e`r7wQe*Ba3$Kl~iQ}MJ_NSwrNr2&~tR-$LPlU;87tNgIQ zVofHSm8k1MT+q@T^~qqB9{8k~^IXY#FY$`P{px@`yEz|PC4ABR(GpcTCnW5u@m9<% zWc26z*=i0_F?G7^tP%uM#82ppmIrg;Xw+egkE$cS1MGY$M*4Mp5OmRUb z3P|&5+j##QPIGzbR`?fW>ABM5HzPBhsFZ4yvxkw1!%p7cnjb@+gR4pY4Wf%ni z4tx6XX`aa}`RBNuFn4IZ8jtSDcCKCbPn|4$Zg8YNl%n9Wzs1q*EB-fF_oym{>*15pXd*CD@#BonQHmf&mMAN^boby*Q2{QRBFu$4* zCb1KHXMC(z36QrWj=z3Yp7arO<|eIjhZDfkFHhEsIjfw?up~$=eX76y;0Y)sDmC$k zo@g4?814YJ4UcS?$kuOkVZGTQ0~HN;OkZxDlpxfRIW+;*zL^^LL<#Uad`S?~`dsXU z0uH=2wAnCmXR;Agb=ej?s=xN?`^dqXyVv0IN1iH zDW=*l%DZh#+Mya1d4>C>6r;iJCx^U*4z*=cAsr`xR1@?|>85_7y?5mX%R4Ls)cy5W zo#^NG@w6AA#%jpRWaBxmueiW3fj!W~3FF;zD4)( z^AR9z#idq6H|N0dL!v(Sa0&kYu=+JRK^sg?==8+(o}OpR%t2XUz2uUz8yLl7WOv=0 zu*)G8H&WCO>tEA;hv4LBc*lQ=>vcor7uj2wbKE?BghjJ=9yoTIR-Ekyhdyc;tjoucK&4`x^F7cV zFEQnxhlelJypaRj*j|kv4!@oF@AKz1M}pU}noS8IkonKY%wqnfv=Yo&$WrZ_E-M1? z9-fC4Q#57T*Or&(fCVg_^k1Tj%QMv9r&1^{H!0K8)9?7XNEOwsQ98NpBa@qGYYY(9 z`m5>_Jpv+|oy8|bug4vgf{VRnWvw{;b!d-<*2?TG!jOeZGgrnv_Gin;Cbau)a6 zC0s?hLpzrXm|rS-(@PrDz3(RZM(_6Wpake!Mk1w=dx|KRbixs`#;S#T2(Nc-2dG!FcJbxa2cE z1z*hVzGXJZSY)e8zZOX&5lS51^>Ws!Z|fL8)V|tJlMn6pte{r$Dd{Wz-B6}DHh{1& z%7f`jveely*Cquo>D(idk>o7lt1%z`sbWx}X)p3nmBvW6x_t8ia^vBkK))peWHQ|# z9xG#6rYE_MFZZDqlyecem8GYz&V*b?$?k4Xz9eNYtBBe<1-}m+hiBAhYIq5ho9$b`2T z6Giz{x&1ZYwuQHd-FffQ$rvZ74Uc_M(qQeIqX<0G$}(C3m7Zv&sulkae53ha@GV#Q z*X^_GSr6nJ<0zke-*l7I)7SrHZdjp@t+KA2=XY=TZ9DAn{qRJz4-sQnN_i>!>|mf6 zuKbwde;PMJ5WK^t)$~kl;?LHKlZK(TVLaaU7awyr$nd^Lq8|9!KB%yK;Uq-wHhbvF z-0$E}@^wvX5m6i+i^*4IZp2ESLu%nkVjAHn~W3O{EtyJ zzr#tE-er+l?X9c2d-joXa|`eEgYW7aSr zK;C07Z8;*m$XnO2j|G?zYEZ35pYsN6Tg&M#e9K+ou3Fom<>QvPpA7U1SPPt+@vAl+ z0XBou%nwFqN$09*E`In&u+0mw)!l3l|Bi*l-eWQ{=e=5kWz!qm2QDq`iA9V& z^_U@(Hpd14s2V;)HfLToLxkMPK9aSx2bl|2yE@)0^t;eTD+S&I~TD_1h*IT++r{q!fc_jbviNaqthZ4;^UXBipQO^tc)@Ru^0`K##V zbni^WkVhB~#>v!FfbGD%EB2esEVyd`Hf@+|0|fwF=X~4^zdX>@6SL;w zfBgH)7yq`7wwhgg=j|IYU=@&a+Xp)s%%fl0-PjK|Rv)8yJw5h3Tye%d&V8E=pPzsR z7Z&fzg*=m%f?4dl4)ylLq=M-JdQd;tW@@S_A;H$Wpq$GJDOJmZXuL@u8k+t%v-mkc zA;uj(Zsie>S#k?BI%_8z!c}Xpcf-;&P<7vpl{K?HD4?S|M?Gf%vc4`@$*fw_Iu$@s zY`rIxLe}_pWSgX*{@+!VKZQM8{o=@jE4cbD<*R_KNcuD&@*Y{rxz zJ~yfh#W;U6xi91oQ2#+?Jw@14;jaMATM&L!?aP73ytEB>v8^32(R?!;kjFR@a!LLr z!o*K>QjD_u$~8yS)ezqHVrwSMuor8Tr`(;)ZtMf>`4bnZ?!z;o;0?#&uT8XMS7I>q zkMLYTDJ`%tKSlbjsxD}SN3D5%)_Z}OcNZ#u#cjlJktU5D380_Yi{jhWY&PP3arCCy0qpa%nP!YNqO9_o zuh8S#RmtVg4biQCslnGBedWjqY(JKDX;-$INdCvTN@xEu_vNPiadL5%1l9HyK%!I- z0)vPc#|ypKxpSg^_xCKXa@&cVPUtI4AN3n{{*GEY9tky`hg+u>@}%5n5%xDxmR{5- zNk5H0b2q*k4jV2)5LwUw-jgR`Y|ou2`Ote~J9Z<--yC zce;wwX4Iur0-5bUMyXW~G z-A1}!HGEUxSd?+LQ+}0F$iuJv!bcpI7ph?ed1a;*{w=Q$bAr~a{NxrfdwAydG1zy{ zZ<$>FsKXMy1#SbR0c4ap{mO`i? zS$BD9A*CegCn+@Dl7;9dTX8i)FSvBxJ_YZyg_`a4Ga$Gf?oF#!VE69OKC3fPyY~ukH*13Pwa5A(oc|C>6L@_+o>&`+ zC_yaf7L27SXq&`OAtaNx&jRKwD96Iie_&r$Jq01+#uRu670VH$}lcJ343BziHiSd6hKG5p^`R zb-k)l@}_9Zm!Y$0aj&t2R9;zJ*w5{$D$|=;7$u7xk|8tOtefO%U05M11M7^FXMMC7 z3go)h%vwl~$5>{PK*R^WtYU5?Cc=CtN@U9Z+7RbYwN^v8NXy%yGdFYsW`-6}$_;9Z z7k$|Gf`^LNU0)kMA{uU0m*Rh9)%youJ6@xH( zwy?h`;}8<#rG#{NOJHMmYypXn05;)d(>^UbM!#Yv`J1A9Vn6#tFu< z*igSsNz_=st>suMeJbM}mO}9GA_y+S(BjNyJ0t*)W(GNmG|y`eLJm)YhiZw#LDXv; zOCPIAh^%Xw9~DFD>#yaA_DScCoREAjT-Vp{P>lH>HZ`{h0=>J%fPq0NGG)iHPFF2Y zCyT_SvWLz-M1u&kc=oVP8NJZnz_I(>Ufa*IcM4)G3CnJz$kJXc#Z^oAA(M>`Dra~t z!M24N{(mB^-8_lDd=<(7>uJ89D+OO>fcWDD}8STjZQUK7f82dj_i_3dZ4kn{?c#*H^37lZQesX z>EkWQs?!g#H9!qR`pic&$ zFPW+&`jyNTp=Vo5yg3-JohLpk4+ga&+jX>=DyAK>B{@8_E1Y9j_;N7J`I0FjjlqLP zXR~$r<5DSSL2_5doG&w1+zb9aT_&C=0{7_S)+mav!iC}j?-d0MTK?G&Rnb@CG&`I+ z?EJ%}gwWnC_GB1I#()EuxZwV;U6wu?LAQw;BH)lt85vup$jaG`q2tqI*|^y9GF^Kx z+`0C#NN#lm3nDeg0+(FwAW1(9PC)wNw2*BPKFHhw0`&JLnWOn@&^2!-UNyD9vB1*t&|XzMGjdENQUCH*EL1>0rk1A2q7+T_^i+6xK=kl5V00%g}L_H zivb{_mdq(x4aQMo@}de?-OeFm?a{|L`2kXb;8i1+tA0Li&nkCrJX1WC9Uns%$J+Yi z`1#@y{f{#~)cS)vvV$YyUi%QcP+@i6pszvMHPTZqW6#k^b$YDuktWfZ@V5a-^+}V5 zngQoO&MJP)K4DS;hw}Z7fnBd0(M`^gbA69}h|NmR1am?kIN#4W466$!3?ydXKWEqp6Qe4=JxKJ6HRvGF&YS-H%o8lfJBQ_v;03M5ISWtwjt@F(i7O#cIt}IH4v{PSPq64VV3OiHoq#Rs4&t@T7l$gK#Ri@UrdJFps-h+6^HA09dSE zKK)=6>`}GO@e0D_ZVr2W&bpz=nK1tG#RPobtMDxV);A{~zLIl?7l|<+8VT^H1b))K zuUukcfJ|u?6siAs;S8YML;B?4e=$mI;PbwnFFAq`PAc7?JQ<2fv0;nqekRc+6;Aps%rRSGiWln;Yq>Y)0`vN3o=;942AfaYnGx=E0|CK# zjwdt<^p;yO1E5?YKG5R>>a$sIb)~Q6GL#b1(HB;4=@_}>1)X`LC{5AOtttjq% ziVR+4pli(cIft#83Ss6L$NQcp$RytAZ2rO(iioeMzk*SUoy&Cv{JfJB z2!V&5+*=xir!?ecrXI)&<(!d)-3JQNlM)0=OXj}lkMNR$f$ zp23t?STaj6MhP|4bP_^b!dZ_I@N7S)_@lC|fFsL3riV;K&kA{#Q`5FuMRiuJm0xLB zPn-Iyd?bVQIqW|z;zZJYvRU26x)sKu+Tv?e`R){8sWStaWc8{r48Y$Q zP^;#79P@#g)ztIcJMPHt2_4frI~F}~zyuo{X}p&Vt}KdXsh)dEuCE~D9*fXUKb@KJ z`{;s$%=;+|eY6+j-2ICB?$1`-z*Bmw>JmMYZs+o)KdRyup^s`{JNr~MCU;+YVRm=p zdewbcqZ}Gz3m*_7dawxbV?TWSvXL8AqGX{@U+jjz5pJHIo*_FT_@EsKjH7XJ=y|s_ z|HpU*s%P*Y1&Ym$cDCs#g5wXwrXc`d-t9-bnT2L^4FcsV3Lj^t|8;ZS%<17>#k}>F zsz;$wCl!D)mLPu1NUpb5#eGx5t5M7+iXF3wtA2Uwl8GgVh#_;()O`>Qx^^vTXQMlK zsZ_#EQsXz8y_z5}j}d+4`BL^5INO4Ra5_7(<{LG~r%!A<+jk%Ryw+<}MOrbehj9=w zs36g6KXOb!09sE)EUDAkwuFTFvC5-tgE#b;){=2-a74@5|S} z5eyLTsrdYigH(2O=)DypM!gT!XXUtsIa_Nb8v-|SK8DltZ)~%x%afHXMqQba-oAmY zy7F$1d-5FIOP+z%;RZK*!DTCv0ag%30_tt$CmU9>4fVdDKF&!OT>8+~>h86FU3ecB zAPys*2*>~H|8goIKES&Q)<;lHSle{y)WFq>*W2S1hF7tVP6;w8MEdNkQanaBcsmCu0;L`_;%GGNhcTvrR9_z;Y+#Xbwv6hwE}dM?sVM)9JGAzoMdHeM z7=_dUviDgOskx7@ulw-MKXm2mfRy{(N~h^8AVm85QQbGr%qtDJcZgvcl{}2R>aBvn zEOX;W4>=jkBJn>q8s4+or1qg&{yw8q1uCR2-{2+nDuar`qu*z8HvDK&ymLfTwr3-o zwIzg(uEGZ@)lg{GgLP@T*764SX1N<%oW+k)^o+Y_ZR%(;tJ~nu65hqJIN>P90+njP zVB$QwCUVSEd+PgWU}zO2m`#};8KY6r5oI?}kkV}dfF4g}&^r0#r_%miUw_+68eEgk z#WEf(yA3dH`Ly9%@x-?Rvq;sG`F41c3W$>YGt7`!)}}(duzM~QyYFq>TdM?RMfy%# zW55hf9U4p$QiG2yNBqr3V!YZGfE3bs+KrWATnj7CYUknYrx`H>c9)oI-Pl{%Fnwd~ z*cJcQJ{7N(oVZxsVjW?M)!<1qk840+Gp8Ms@{w6q-(R(g?nJ<9Zy^>8rCne91t#U? zUEu~QWQMCqgI*a&@6SkUXy0SOGQH=ik7II}t&tns2GJU&bbsDS=6L?%UYf8?;NcJrh44X9KMh7Lb> z(4kHumy3sNWH&ZYIBT=Myc`mb@l?+{I+z6$eA{Qwy)=yV(-t&BH3Ut;3lL|Qr zHKxy0)#x!*(c5RJ>LYjZk;!s!pF9ABZJ=Vn{J(1a=%<}>5Vt@<{V)Hu3Hf|0t^l>XmwCEg5Mug8hY}cE}@CIoY?+L>+9QI1{ z&-Etr77tgc|NPKou5fkz1C7A_?iD&mXWDMGR_jQ%qYi#Gg*g7)vi!5^g&y*@?3#E0 zDg7xvns*jo^LsSpfK|oJ2k%h$eTY6(WR2xSopOg33LAtT{m7PF0pVM__^HnGecTr< z`f)6XBrlCQhmZxHG|Z1}UDwfG(V`#0j@$FQ%^3RG;$cN*DuV2}nU7P-_S)Q{ewiV^%v=`ME zJLiY|-dOtblzs@VFnt)hhZMBg=VQ#{$4-laO{sUVgpwO`^ z5ITNNEZP22pL}Vuek_<2sc3oNBH3jxW{{d*g;RWDEQUV}$TCl*TG2w0bblEQ@N~43 z(<@3`4s$eLit2+(sa5+jX_%38iBtCX+ZRx*_%p^%tOQ+4bI4@vZPa8aW(a*z(^`eI zVRcnzO6ZGp?=k9_mU-}#1fu!wuo?o<2>KHnCJO8iFHLUb`N~th;;`Cdr7sq*9KWUT ztgs$7sZcB^9`@z4`^f8uZ?;a{m>{G5(8MQ6f}pVyggaV2rAtiUV=M0RQfKY9E^X%K z#DLs;Y?0)MaeJBUwydc7qe-7{vai~kw$Sg(x#GU~Gd2c;!10O+f=Q+7glyXyI3wP# zD$*)=-|Lp7HPE%JN0=mfegzH^ay!4R)@s<~=04R!^V+6qnfh(rdP}Q41vhku>YpN< zrPN3k!lV^l%_AVZZ9IJll!nQAr<0FA1m*^3>tlgBR7b*H}0 zx048%)Vy+XZ`>%hen9UTLncgpO+PmX9jX+d1&h;@H=GNg2y={WTHZ>0eXVVWPcKP6 z5?0cpHOpMUt6&M}*SVJRwEM_JS?-ID6#lynm)yd_VA(L;)H?qMuQT+G0F_Ae^kGlY zqIg~CDnBZfJPI$jvisBHy)9eC;FHJ#PgexjXxqzA->7K}|dC2r~$aCs`&yNggv5Gnz5 zpHbv5bV2;6dvU^nTe9Q+Gg!&4MQy1MV&~?Wy7}7S_%ikcz3%^NoRnK|AO}OAF7B+d zxvJ`0#TD3XpxOQZB~mH$XhQ55c51}a?5bFJtP4B?+vJC*P^-8Tbk&w9Yn$tE$u`qd z%+HN|D%;LpiM3_qw9pe$o4JE>;IDiKVw^yERNd1`H-7zOH=O;{_Pv>*1VHg5!psmM zqDp(N!|@=QS;=Lm;bv&nR&2(O6HwUDIF-DI&3{t0feFO_hR2okKc}OAO!sz6X{^II zGGD*O0drIOuic}7r;JgqXk zk{eQdca+?&GmK+QOrSjrfr_+_P7qfo@1$RxfKt$UNA}TofSufeezsd=JwNDZ8F%x| zu=4W)BbJl3fN5CWrpnUW+zbsSJJSPjTcfUl?& zzd(ccs)*l;war{^w^##sN3ib^a_we_-&{1vh6rQZ`7=&KK}bKfzB zvLuwOC3F2R_3e3}20Q1=b1Z%2%cnWOq&V$GZo85A6;P+SC+!e4R+7q`ie4#(Xd>Eb z5+2ut+UKJL(`EBu2qoWH-&v)_qTY*>e)b-JS^f$n#_ZFEiY5;(b z7Lr^_7vAqRIy*Y*ogaoxg2j;w56i>m#0gyQFOaC)YW?Ng+zA{s2vkXDxM$T?YjlU# zjVrj^Hp5rrs^7ckEr8vN?gk?1V_)AZpFrOY_N^1ShG*RjPnHf>{XKwDk}>Q@An-&` zdi`-}q51~wtp;1}(o47cJd`rWU4b=?4D5&##b}-lZ~tTI2pmc>6Mj&nN`N%HxInH^ z#a0GL3?LU1$AUn36S4T1tZWYA!-@Eim}$CzBrVP};E-d#E${)<}l$l`1J;%uE|Qxd>>A+|LG+_MBzHMce`AX(tJ z!+SAAfg$s0YsRf|8%5wRP~@%aNq4isuz=m6V&4xqA{H{AfPV$d-Q0ehfP$QxXx2aKFD6isC^jlLe?T#J)vnPENpyM(39t@IkxaT%7OD&iLKDz5a1kDS(~5 z^PQw7rA`O#1UhFg=kIe1DI^9^{ls8^II=VzDGdJV+ z{D=Z+NKAS9!turkg@?!93zmt@$jji8baA>;TL*AH0G|9njsj9m?4>3U2YelX8}rkW zffC+o1zqj*Jj}#d)_Y{hzT#m{3Vi1ZPcqvH?R%?bhf_^%7@@C0s$Z~Tl=emP9d;_YbM3^S7no=IHYKT`{I2k2?WL{*@0gkuzCzmA1n0NZFkrO{*!#@8)>TeJLg;2N4U;(O!aWn`(sqd07JqBF{%c&`QzZ}EQl{_5cEQJtegwKW^D2&+B* z*Sfduh7Pkzrv8h9?y>GQ1+fF_sdO`R=&%c(X{Kd=jGo8p>HLR^ioiyCX7jV94<7tm zGt)ToAFBNZ+KvJ;73JeU>&i-%Hp;X8vW(wj3mpgkm!HAlCI7pCuPqOE6hs-uK-iEdw zW}jp7fyTF2iRr?|&i+>d2P5cAD-JV1u>yefL4gK2; z-B3>27g4_!-6(-P^!8v9@Fo07#9r2K!!70yWrFq%V1D4K;nlnBdiu9+@LFHpHOqwI zC=V$B13fD3UCtRDXa%<=$QMMxN18mHM3_~V@0_-mm(!`2a0?8fj&5hcvU^nmJ}j)q zbj;%$zu=Ff%9zLJe{|RVEB^y$#xpVs_QP&$M6#E83Kl|s`2Jy;pJ|3eXW?~IaDQro zO=Pkjw|~w1&O;1`MI9jl2_q|FIXEkND4=y6v=1ZalEam7(`~ z9E@KFTLs5MjQDfU&lIsbWqM_LE5QnY=?j|vTgobGew`g_QQX;$$?c@Db zwW&;f+JZQ8UsLq)FmPl5Neh2*?0yO>e^(2sUPFn>$WHksB>8iM$t70--6<5Cz2iH$ zvApB4Z|LE@pkL!SPxP?S^)p4_kEU2vo%A6)`8l_3-kN^)g(UPCz^_{)B$@ntAGP?M z=*Am05h0m4%K{%tGm5NereX(;LI1be3#_O+BY=&W^p0gyh{K-Ox79(T;zRkIr znWOpFO2363+;s)gj1mIznX1+dDmD5mAj;oa8juHTR%;GMm>>~-t;fMDXM!-&Jmi}JCiT{8`)wlH z8E7JO30!0}zKy@=&sc&O4}*(!8BHGofWGhu$~+IR3)?<1#8%?@jL=6Q#8}_}C>(9O zFUkZ7KQywwlpWu&txMMUm+jP)kSs`o*!rBD(l9e5T&hT`tE9DNH7BbCIN)h)fT4ds z7;veH#~fg|zSbKIPN;tNvTM3S>E->4_WzE>8y<$hSP!`pzSiZ@(QJxPti;1_vcL-35xKLOc9n53_B!r6ySuRCxjdFvnm#_9kvtQN30 z@1TU$>!!Da`#v1fXlev9t_OXtAb&j9*sOen#Q)*dyI>`;Y~zjB0T_a_GNPd9S8lke*oM(P-l#Pk1BU5ajXVEyx)=RCPu zUYpA#hLcIa1jX(hKlF9pwtk<0`TwK0)ZB}-CVjT<0z#`U%n8bP9R$cBmrqf$1XZm=8(!HGLHlRb1TYGT#x6NnCyIIK9HT zcTl^Rhv})$jk$?gnIHiX0><>RTUYD44&v9d6eTO9kfY$m=h{v7?281%eQsm3aYkG`y>u6`s zdYk{2nYRR9LNWEpr7o#yZ}T3D)+^D6BQxxq!(jd%HXRn!F^=GA0A5Z}1NNk)`Ti(i z)^mv9!zcc{`kVNpa3#d`h3l@YtMV<--6=je@3{34wZsEBgX#<=*yE$|_zw86{mXd^ zW5ORk(TpVm`}$*`lmHg;tJ9F8>8fJMs^wkZnW>vgANg9WXY#^8olx8`}rm(eDd5fM5NCyT@Lw znFVnCW_mQy5r9+T`}SR%Hz4;Y&m$+wbZ3{3A0ATSai(`X2DTP(7SWbQ$K%Z0jh|LM057j@z z?+L)(&3Q?EnGwGhwhVs2=H40xu15m+3(6AVGay0BPENA4y!QA;;L*mEm7i8YH6Cp+ zQ=8lxx3Y=;Av^|Fru!GQCg+Rh^ikhUZO zYCANjr_vG7W(WBn2Q(bsA_lhm3#h_q1;YC-NMHcBW+f$<$TkDnj}DYi=OIb`Abx3s zA_5)4&NO*$5bO-Wmpb>_<4!_=TiRxy9zF0=5F9}om$W32h~Y!oyPvn&SM>;##AZR> zu@q7H=c)QqNd^LdAqn0AZRPI=RV$Cqr6ztyD7c{n6HsG){ShgfHGY9=^L6 z7`mlp!>27?n8v#sg6vpXT6SZqBK|jYo%(S=QzNwwvZW(GOgW?pe*&kr{snwZUGer6C@h}tJ91k@!vZCB*|zl3%iKiMHqkTF^s?f*A^FA zw0jwvw*>N(QdpVr$s%ZwDwM2jf9qcwMvPH9gJvWpak!s8D}IUk;mdii*ZQvE^O!&3 z^O&vj$2Ce&o(jl~HvDYr{z;2znstgSj`g~(9bjCa06bSljedVYt3;**y_lQ`eB~Rk zJ6U|C{PQB-}E2Y&x{LzS?!Hn@It3 sI1JHyBvPg==aZVDvAP#jhyRegWb7n=84$t@()|e@Drr2ZQm_j9KWdaJZU6uP literal 0 HcmV?d00001 diff --git a/graph_dot.png b/graph_dot.png new file mode 100644 index 0000000000000000000000000000000000000000..f16818e48d6c03e78fc776a716c2968e0a2e5fb4 GIT binary patch literal 53910 zcmbrm1yojTw>FBPbc1xGh%}PY4I(8X-H1q+NSCys z``_Q*C-ymKobfWoJLKV6>t1)vIj@*2LPJdv51R@b1qB7~o|2p<3d$8n6cki{Omz57 z6{;pN{14syzM>q;CGuZJ{ig&J6b6)ga?)BJ@7I32>pmR4#Mp92XN;1PB9haPzVe{_ z1uENhXWMHPTt8n<=vSN%4~neV*ya~jR8~H%D6HLa8!bk2s!(&{E`QNAFv}27fbxa- z)$VCavyR5=`1w~`p5p3s=`2ErJ}%T#G=1Vr#&i}@frK*Q#xt%)D2%~z@3Oa8f(gat zW>hg5y_7oLuHXgg7ls;gg&A@ws;S{CD=Ta0>grz9z(2=xF)}qUBjhwM-pMfqmX`8z zaB?yxDw|na=IoweG42zDxYM#GD&M$ui~06#tUGUUZ{NPXaQX4W2L?Vq5|^(u$H&K1 z_Bw2dGHi)i_Yzp1PL$uKp`{%xw|>ZPJA#XkkNFu3aUd9v^6%`g1{x&s5CnzWwr<`-$ ztM|>DH-r&#+gpQ*=1u6&pITymXB4@) zxk~r$Nk4c%gd)X3*3#B?t*EHT$=O-D_WAns!ooEnAtB7GsI+wAGU0+69y-kwE$fq2 zMAxr}y&gyq$% zSA_KRvBAMtZ``=Sz{^Vnj}<7B8IYTMd&*-D&%?{Bd2*6k+-ol&A%SGnl0?QPyqQ|c z(2zzgO)P@Xs*iz<4V#jZ60RuqNi7u_n!38Who@)L@bDu???UAqVi-!b-?@mnxp~(m zCl^;}b~ZCAD(XPCBEjCqZ)#41%J~{YnNC~&&Moa+t!k$kR3>I-=dEe!U-jPPi;IiP zLpeAndw~|*ImnI(h`7`VM!a~#dIAvg9AjMsm z8#QjL3KmPjKV|V)>L@M3U%qS}DKsc`{38K#-Q3cGCM_+EiH-dtHa2$ZAWuL(Q)9a4 zEnj$exRjjS)mI4#W>!{V)6=FZ$vjum($Wl*lrWEzn!?;&T<%objlU=<;ekDs{qU0- zg^&YHC@!UpMSb!1;UE9GZ-HoImG;!cBqW0kzTQ#vl5`|2Dgn{ac%utMLm8BI9wxQV z@$$6`oBL8l%`7Z};+YlAXImqFdKcu_jutU;aNvqQUz76llTe7J3Q?ClC#9pKGfYxY z3VQ4`<9oDa#$i-LO3rN@92-mUr1xFOOiNgjdKICi=d#})dHPAf0EMsY+Z5q z(-6J2x&0(rnN@#L$zD2P7Oj`K-52*wW1qc2MZ(B7-3puQ zq4>02ZujusDCabPR88S=oDv%w8#C>G!?}m^nvip-JIx*TeS0)@*n?~Zv(7liYPVIg zYeF4YQLlVddHVuxP+eX9?av?jNHWeB`h|-%{4%(&ruOT83=Q!-?j*c%^QKux4DIrt zM#<5e@kwLV&dhL^&_FZ{^T|qkI1+O;H)L>M8i%;U={-4E$0^l~>g-g4YdRSbdxp3! z_06nT{Rs^ULc2Iw<>t5f8NT`olb6Da&+gT`cP}r_Pg~$%!z%pLb>bU$TxMPj?3ja} zmL6|jF7i5uS}TGFN!OJ$hU-I{e>0ozY)TvtZHKewo=TV$VIC6rN6*;bAXI8MZycHM zZ13+UNa8Yj0m01F)HEdjCb7(l0(Y}0H#Y&SVn9R$7MukEFIm*Ia|~hQo{YM^+lC>y zA)^iQoxdzP&AI=mIXjT)i~5C=+{Aquncn;ejeSKm=rBtuHPr1qYPF$^jg%#1uA7l| z(D%aZ#s_j49e;doyOyYo*0_$zctSL_yVS3!uTK?2C!RMfS?_7? z&0nU?Xm;*>WV*ym(U)8KN%&}Cse0Irlgmgqut8fawQ^&2_JwR1{!D8GiEi1GXtha} zR*m7)tp?ayaNNQM1~m8`rwsG$w>i+w+uFZ7&3rQdQyy`293zvz{x^nlYRZZ7GW8Dz zKGSb>cS=V`$DVXaWKEkTFV9-;;RRE?@}i%DeWdWG!I$?*4+U*`yW(6Rd#SydRdT1g z*-Z7#>LV?TUK?5hbCPwu?^>fTuHj5CFNf#cPjWHBX7nmH4nvl>FI_VBtLxHA(StNf zA2R!nt}D?RG-araWw8upRA{X$1?*#DR>C#q4yX}h6dy-8r;kU%FvX84x|Ao$rpAMg zTSPLyYT?G;V=muG382p&%FN56b!(R|xb(oROQmY*(Z#)&FtU8dhpV!^(@pSsAy#{P zd$NSD$idop&?j}g*(xT+_qn4pv}9zV5VEqZ`qOIc$2zY)thD=f^al4(P_6l=J;8R~ z4?CN2Kb4KeSb_sq-m}qNkK~lFa%#~n>Fgi6V}CGOMmw_YP!uRH*+Y+Go79C2%pByz zzPMOcf3d`Usnh>$;%JEcFm=bIZj=*+{#+;e0X4Vmo21CFr4e(dndfzzf2bq-Yz`LN zCj?<8KWnkAO;*LOYGMvL7SOE@W@Ds?xaFx$Xd0iqt|(3KiAg-${90FrqpL_lH+LUx ztZU4?ox|!oFKlZDsg;R%mGgWS=?iOW z)_4-1XE{z=?|t)Fv>0oc9d#_iyK?1BT2;9=I^0D$*^F)+NI}{&DZV z%*tojOU}-`Dk>_%1yWZJtqrzqOVCJ#8as~k;yXXTPq?WbmzIy-|C364wrg`q)`s(1 z`tA7b8`LYaDvuZQoA@eTlGYMtb8T^zH z-?{Otep-F}_>q;3ZMFtiW>3E!-!WI~<=UE^L*%qjOQ%UQPj(^7p^$p}>yr7GbAQ@Z zO>Mtpu=gmaIWGw1GxqldzO%ZT!ZI=)Nu6C9OrV{N=DA?6NA&U~TdE(w1FFGoda-V2 zVcphmWB2LuI*xLZ{C>0EWoN&ijZ=te9lqk`QCnL(2bBQ2fm`rdff0EYC;t0EZ8Cr|YVi)!j!RcW_k@YqRw3-jPQeW7_-VolHwZm54G@s#zJ)@cF`S3xBjq>ThtKL;v;r_gAhU!g}rE7VqhAfx`hBv|9Kx(W!s13JR4!lN zzkT=a%l_)9Z6TgpS8+iVFU3}4Sp23t$Au-I@K3$9F+~RzyUR1X1S>7dq_I#vM?U%` zg&wWPt*x3E2MU+DYaMe0Z?lFRus1f$cK;lh$B;3x5bE(L7Mra_29b~T`$k_D2KL)c zNp^L;)37vtlJbPWqMD|%ix9X!=TwCk;X=7BO6mFJxm=v5U=6NTERy4G_T3G1@aZxv;TipBixC8_Q9L9CJ zRXD|%yi)rTb!A_^OmA$&3}!1@?5_+PCdsZau(D!)|Ng!D`8t&x)49lZWhLK-#T|85 zG9VM{es#GyQe+eY~Kyd%9jF>@trzQf#8$q#BNn`IRd}L`Fu2kc1@2d9Ga= zs%pnS4Tec_Hl~nwb<3X;X&35;6dBdJ7~wObXHF5Mync{B?6H*U?gXXH*>(s0@@O$V zq-+}`WlNlG$wEFzFJe&&M;|^lOSt1BL2ppy&=$uiiZZv6xO$0zlU;d~t;Dk|*z_wPel)bF{sOvIx4 zE_iwQsoi8Ho<&E@0#X*lOzqXBS2@kd(1>{uD#p+RhJ|6o(A;fyyEku=B4{sjda%B| zJjg63FaN-aB97cOEm@Ps}mKr%fD-dKB}d@ z{GM=Y?qq*;>)>FqhC>GT%~Yt+mL1g$tPvp{T}+CQWApFdv`|jVDJYH=w4r#^ zp-|FF7mgHDll@eL!W{#jMyfweeCF@p2$*=YA0Ji2qodn82Yoay1xAh-~>tGE6KiX(c60fE{1C)Qb)4y{=y#_xqQ)E~!1Xv^4t`a3xv5 zmdxvLqu0$km|qv2da6G%GE!Dom!i_~Pt5Drq)_LZE)QfPMJ3GlSFYkI*eKOL$9JG~ zN9xXBUtKXA92^!J&j6kExkUu?d*CtEb;DM8FYJu!eXu6|`04N{zX4DR z!XQx4&>$2O6RYM*Ak++jhf7S{7t7Adayr?whVUX?sEyQ*#>U1Aa2yHB?Z$~w0|QoH zQu*1^9`s7nMjM1x+(a|AL z;ocy|f_aL6_38zJJAIA_BO)S{l$4~*&6xlOWoqU!kYdklY#7gw$A9{CtEZ>O=9eI2 zus7+HKwMH%*wK;44HgzA35fitXwT@ z`1uE_qh@M^SJ;j+-MDd;Q@%;tbZ|HUGYuMP>8k(A@Ukzh^{ra`z|4>uY zX>&^a^RUflt;<^GFMy)-D{K(pi&X!^!`HdExSU*FvqSiTDG0G0@osZ)v}P;D#sP*_ zjHP1~5V#JoG_HFAemcK@zfEA0sC*5sJv5{VP*IwJ@HIw>E(aIE_?I~H2)XOcCTxk# zzkbm`aASr^k&%@pA|yod_V%WrrgrtDz+@DWnd!}hux183GFjM}34oyH+#w+Sxpe=F zK&aFYHvhx|IIzuBmQnJ3%)`#H-`f&KP-;8Mh4O8CuEVw>7S3T%|5Emc4_A@=;&-|( zr20k)Gq;1a?(P?t1?8>de*DY1j@WHDkW`!5P+0TaxdZqnRKKu2jNUK&EuYnki)5zO ztp^^i45FgctE0tXnz>iE)@nGQrYzj{6M43*;pbA;^G?8)$M4L8l@vSrr!r=4I$XcR zYv1NIa1fVOu%Vwldlr58BU3hvJndor@K}W{IiR3Om~@fhdziV6%fUG@*I`}s%AQ>R zNQN4apU(~)hiy4`I|T;^$JXB8ALPb-FtV~TzKgS6^%^oPM)Yv6DUnLQb1wjojaxpj zd%k@6VpGmd7pt>?N}r<{0RaNR%i$3bxsM8i<4z)*4Z>b4-)y+NIAts5G){5eR7(|U z>g@d7b>QOSGEnb*sNesTG5DuC>6A!0#ElOhKQ=rQ43Ce0P}os#BCwOAnX93p5fDLg zYiNB2la~Sh3@DH921vL>?m;(*p&JCc`2rNE$>DkhDyrI3kFWP3>+k#rlkt>%Fz4z`YMW2 z2sI@i^cyG|53h1%Yvwx5G>1^F>oCP5RL{3El4LPD0zmBW-PUAY3)X5ZUJV%7)^rmZ zNp+;Gl$4dVRN7A>i4#G*kjPkBSwEj*Fa-Y; z<+p1NjEcf7&@DwZsI+S$kUR_Mh^1#17pIK{@&_<8LU!4cUbaT2nS@*F z(}2y!%dF-ixf=%BI~anU!kbf=0o%6y{qf0pq3e2KMXBBR9iQ|4(eT*Vu1rb=%JLA(0~O)$w+|Qk0igLp`nuJ>-wn` z_b>`G99ht7jI2EHbV8M_Q{?^hCdQ+U-Qm- z=S~8Ps!SL@EwB`II*y-(qYkNXy11Y3cZJ1MFBZ{T*6UP;%`C*v8ZkD^ydkY)`#@IWn(Sok~3gr zpsS%hjtYF__nM|Mi=Fe7p$W>ItRo){md6W}3ncG($wcm*^E_ycm~7h~&~W zJY1!8aGvE2m077@MMs}aP?yNvQNRz~yp8X7eAmIvDDpnJc1H1VKKJN-C12T@-YZ2d z)F^&OGZ+xH&36}j-6rEd(~o@m)#NVGJnCproIJCRm$d!o*ms&CYntT*77xu3KjpQv zt7{7qfPm$s`TF&%z@NYqM(x8Aseut1aaxCIX**5-P$$gX+t`k@-Y0vvcXoI05;&q9 z?R0ZP0x9u1c8T7s-Rh(3p&!BO%`p#Gp~_7BbM=fO5&zNkdzWVi3g)-c?&M^h)r9*LFb@)C#L15KGi)6}3M(ZIeqtO1g5sI&A7k3yxJYlVKE3ga1 zA8lblF}1V|fx2U+gWkUtVu$fp`|Ut?22a1xh>UAb6mA>W6yCYe!QG_~N_VJi{uS== zc%jS5vYUdmI4!VZn>(gdXG%hpn^x$#TFBowu_a6jSZS7+&5@5hzGO}<(IL)?X(7q1{Kn3r{z)Ns?d5+s6lMzr%lF zpK5+O?|Z@F5oJZ$+#H!->bs~W*!<4K+51g5)1L|}p9VbYb4Bft%3*7Rant(}dxEGl>zA5YY9x*@tYRZorNiBtTS4{kQ^+FF) z)}H;#fT;vHLSrn_~>6)ecYg&TiY=&K{j0 zD~D^j)kC%j3a+EFb3`RcP@YWs7ZyGOEWESTci;BDg1O7>X%4URB?dY5;qE05NGeJyhkB^FY!z@jhU!PuEqE-qyvyuRN@gvXmX zr;_EHk)af555?QL>shNK%(AyeN>8Y!9P75xSyYk(Ja-o}fwMkw)VgUZPmU8ccE0Hy z<-?OvCE(FUzOAEW9HRR6jJU7uk%-xG-a21Dvxu6Wvv)jqD6S2*Uz4R=hn8`7k<5_# zZ?i?7YaKRQM3{q$5bL$+$(FS&$G=#1c6YZxMXYt2`agryt-LDVp>$ndd%jm3?Ednc zJf?rCRG#?-S8S>_PdvQW$@M_`?IFril~3^W&BFn!zo>h>h3AS4a@Fw&;uwMVk$h-RC$x@G-XzD{t zx$%unB@YEI4#j<*>|Q+3-g&hi(ylo&%oJL8$0?i%RwcxLJ4}#2>)`N9Fz3Z zr>uamTHS7QKhn~=>hA6ir2_`Fki&c>#W1bUr`)5m&qKSpR!%E1RMCHMrM$5n zWY{vcMi{v^jP$5C>vr*Lp8b7+Fn$H9Z)#}M`zB&mbFZ;-a>`BoIoj zL2*reBoprUpWlS!EqS(urj{;&(BOqt9qu0FDFo*MQPvwi_ zh=PD;s2WP2{naeG&loHg2IbSr?n+l4fO|mn6pd#)H~{CWxxxr{xFHM=b!?#r0OZV8 zO%W7H6;Z-ySG*=3^9Qk5X*47A-EVd)yd&kCe zGC*IgFj{!}IP{2S1I0bJK($Aq1oSZ*ziTZ3o@L-XB+dfNB4Yk@1`j1OGZTT5z|OX~ z-45m#hTmru=d+u%{rEw`$jF#1>du9YgYy-+SV*%022fG}OmMmCu1u#mHb_5zE~s5> z+>3mZ6~1YTna`d-RG`NPD~AEam@E+JqYH#XrWzir0gMGjK8X-$n!38MBgwfJYe;3N zaA6&w^Z+f;s}Y_Wwz%$>$5;T?g8^dyGufyiRrs%a`DeC043n}1U_@IxJI#>TdXRf! zBKK5+oZq~(3x(fHsHtZLGG&3f32%bg3=AclLK!GD5W=Mv#C2Wl3DnG;uc48_eHXWi zN`?AXB^3Au7o$)$q?)v!tZW0BjK_Y0A0^=bAhELb;3Rb~EadZt$S~d@zISX(9B~y` zZ76Jmwb()u6B8XI2^sfEV+SXm6xxDF3dj7h6S<2fTcVPh8X_A#zC)?0smYM=-D$QJ ziMy0Iwu#G*%~_;o2X`kZbYtozCJOt*?6h& z4@_4moe$RZ zfIedcjSDapa6GNRC=J4%r4qfhPaIP9CL|=p3>bfe1Ai8eZ-EPsGFIcp4qz_q*Dpg4 z4-bT-1OazzdwX!wxZ)$=T;z#~h=>pY7c|R?V_Yokrube$M8!a+w$$ONK5L}3mIo}zNFa-N_wts;E z#KggAfnyh!o*oO}Zsv!&WC(DIqdD>DFVT0)RYreYC7_px0$MZ+&>3K{4nTriTQjl+ z`V}u<)Z)YP1wYEyo@olgSa2s?8OTIKSVqGJpSPs{HhYb}~)$Jw>`e~R#OacN$(3g=6326$XQfDJNYbn;c3YE#3 z)cE*7U^tpaN6BH|F7>B(fMz2C87S5SG8<$*tf4JiwHaLx1eyu?bSVRQnzsK(0+YTJ>5CXg2fODz;r)8`oQ z2tumJEUm1vKYv!5n=#VT3PuQ)pPwI4+8f&WbX~N@`wC=&F z7_OZy8c8P64g7}WY8FxwTGDWXOPrWR>tcIya&j7xXPCFt-hTt$s(h5tS_7G7k{RE> zLpKWys_-FSKb@-k8p`Hr87cMUY7H&x5BG;zmRsKB2aH7(7MJIXFQP z`rp33MJc#}^H#mWI}!8Wn)2+Lh)`<@Y}9xbvSmat@I5_f1CoYcYdC*v&|_NJ&R~p^ zW#^%;umcvC#IST3jhUyAvv@A4LXqF{kld+`k0DeiNDTrtSYeesEIZhX6 zo;|6eIzf->(fe^FA}cKx0u)$d^aA6?731`x)pA8vu?71nW4H=aq?iOlbKP(}8ul4w z)Fl)aPCLo}zbecRQZByK$i-mj9GE+AsnGD#25Y zp&Z=g1pS3=)6MH1e;S3zQVYNLMn9@PSG^V9rv3Dh?@AB3%iOxdvV=x zl&o6x2aZ#>2}ysCBP`;l*ir;gP`Dm6s`hEY1o#$;r!Ki%EMGQHedY)s0|pOee^# zAocku*PdYaIg&5_Z82!u*h5{DJ3Wl?S|ZlEuL5s@coI9>HSHe`(r74{TdC9(dSB05hk{QS@U)`CsBTp7tZ0 zvnLeC_bHx~U!T5M{GLqw#?bj}vKq^d^Vl?Gyz_R^*%N{J@w*zkQKmmyseGI*_}^?b zVY@OE*KxATJa~}PQ0z=HrhGiD7t_+jgx+qvqk-Ul8~^Obft{E>JghJ8KO5QY>*^Zn z%rh7&`PUHgcWE2}l>Vyod?I z0Wjuma&pQ0_cVBq9#tfzmK1z`Eq>JRH1e9Dy{foc%sBB&Z2c0`6NO%kvd!3ArSFNa zb^Ck76yi8ru{3|=*s7{6uyd6^E4Iss4v5f?Hn+{9FY%Gb>b@t^*Fe9~OJjePn6)V3Jk`S#WWZsSS0MCSmR2#=manAxfh=@nxn>FbKRqAZxHqfJpVO%^oQ!G zXYo9HA+Wfsu1Bz!uH7emrYpmDNY>RVObTUZrP;9-Mzi3aNd3dSc`6bcm{8Mkr4WQa~H!(cMRgq5j8C_ojV&?e*5{}7mm zne!8tKxvrqG4!QP%63{930F5&d<5_=pZdNdGJgLd@;#Fs-2cB z`N$HRVYV7+{y~ZrPuoDj4Wr{00!h=c5;F>3^Q(x86TP1FbQFrD?Ty+^a{%#(feC;t zn#@e$wRa8fH&M2Zee8bMT$c^SZOV`iLWub2^^~V+fB?Wu$ZOd}%As3=@(&jUb<)!@ zIUIn1;Fe)XR2HZ)`M(q5qbp@s7Qudy%x_Jcm7QH`KPebRD+;=P_!WqxWDrRg@;MBv z34sx41+V1v%uFD&V$9P*PEEf5lNetJWC^P3@7kS5FJ8PLBqt98I5JmQHPsB7g!AQv zZ(-%VJito=i0KqybKCs)1ZNOW0a>{kk@1>Bgv^KpZCsW4SE&UCA~f$Vs#e$5T7V(} zNNT`qa{eu-SQcwzr6A%ffI$&JS{T%cX><9~uR?)A!Qrov`c%{9HA5|E_YIU>M19VE z_z8hUBKet_U;igz9`7oY6U!oXfmUS?5cM8#pwDiv5aMqI2oYx15<2rU_n}6LO4Du81(e zfB*hn27>2(YU=j!QaUpuV_-tf-Z)qzcwHA&5Zg0omSN!ijiHx}NlvDKJtf8Z;hurq z;c~MU)f)f^0QINA?}uDubO8kgASWRh+kgUNzIpSSgoFfz$TL=`RT2MdQFp%kPa6R) zlZGfD)M$jAP!Ml%N(wb%5+Npj0Z70VG|D1oq|kAwvQg|;ISRL*_!qV5|XP(cSSAk53ky%{(?gS&_Zzprf$D3D=#h^W=jg9P{D@YSI1N_*?2};DpW->wyW$(9Q=? zK)}siyb}h2K)=!sD^Tj2+xOut4OT?b{#E0KGg@rY0YbPF?7+uXRRPPJPd>B zkvN_wK{RUkCBSB&C1JP#as_6A9(;^e-3 zjwU0BieQmfQdMn(T@as~9R4pl0x>&4WhRqJ2wCd7ACV_e2|YapJ|{vo->PT?8I2pZcUszaRl#rl< zK?3OICg_9*ljcfFa=b+xVG8zZ*k@88$pdu;vNd?<;fD}ABu?qZLK#2Al@hmAZI$=J zL@=(KH~Sp~3p7}fZSd+9@qZZVFH;f{g7)^FeaOj?&N=x*8*guCH<0&;z546drvG%) z!)7$7AnQYH)h2$&3+$h?u|s5d+A}nBP3`TYL2#c1`SkO;+075ytaSo*5HES4$cBUe zl}r8;u!M*e2yQR~Aq-|s9=tn%)Zhm+?5-A_98Gwj?6v&Ey}u8^>5mfdU;PG+Yi72# zIAAb94qfj%fuQ<&aiDlt_wK@xfdk}xcC@|o&N!rhX%19YIOhcqYlDB1s%i}L0FMXY z*x4ww4{T}8z)Qj63ixe8EQ)de<4ex05H)?~APsgY#7qvk39)y8c*<6F9Xljh+*|OP z(9BiNp+O!lZJm``P*!PC2#JUuaI5VBGbbk}2Tm5PyJ?(+n8-2!TVmKTOtga=QibkZ zU!zH%1ML$4@V}MuZh&bzhTZEUAgM7p40%+KwDO0K*2?Lyy2R!9s0IU}DX=9pI(w4fxN5sR|8rT-!#UL1iHV3u$Un_S3iJ@_=d;XE9MoxX zkgKeh{VvZBcbpf%yFnx2Ljj60jn2L#07Hnxp&)MsSXs;horZXwAi{^haX~!(z#Gx% zD1+n65pSryo*hq5MFnWhLQYQ3HsBS6^Oj+~6prR%B^lzCzAf!$YUh_a{1(yG(=&rG z8Xg%L1ZUUlU@Zb-cveYC-0G`)Xwox<(!gj#1%tP9!ceiDet8B2*XL$eF}mU@)v{+! zPDtQyn%m~_*fPbXm#8}v0EY--C4;t&W_tg#D}YE5?xw}&p6tIa7WGD5CqX$!2Ha1i z*ljrd^x|Hma3X0Q9k@XFYlXGnUM+5H*xQHvhctEo$GNq;+hUdOt6k_h8~l?D7Uu8D zfmP@GHJ3BjY+PjLg?JN=vbHPq#>t#SC#9vu0LwWC zg1`~fQal#zxHXw*xx7?@gM|7kng4Qc(u=eOR65`)d~b_n7R1Xc}U#$cL;_8%xkLz)j)VaYaj=M-q& z;+k7sjRZ~-$t6gFe#45n z*p8Mu&s`^I_d!@7gzoaclo+*)_X=({Ktr5*aOSZ$^8d8P{Xe#bQ8b%X<;G zm#eRo#NiNKSvV}RdmjM446xJ~U-G!L)OF_+|8kt!AmTZ8_x^`#d$w(zm;GP6FZ^j& z*>E-qXm6r>uPM83OfT1jP>i19l|OxqZV`{gky07>C;aZ1$2OK$u}3jDosg*jHZ;qm z(GOWxex2mm5@~;{RhM6@qA(|{CPw4txPn%B8Fe*;_8|ct%g^We(6x^rxZozF)Ljgu z{M*cN%B*GZ-_0ES&h{Z+wx(Vin`d;W1(Kv6e9O?oXreF0?jX7IKx6A_DF#_ai{vVA zg`!SfqvZACcfUEwB8i~tf)h`LL(bI-rJ;c9C%Qoc^t05$Q|ID-IB!xc3DRIp`t|Gm zs%H7xe|Ll=J}K%L*J(%k>!lt6;X;xAl6*`8@sVuZJk9dD|p+!N~hw+?xz>O+s2A z0xK*8aO=7i?B(iF(Vx2`0XEzN4l!(&_r6OM56FJD~r=6i8V(CP<^pL~d-1cfCC9lXr0bJgf*7308v_HF@P& zq6fMhQT?Kn!}4CHzgwyjBECPEwTsDt-x!{L8gaS)9ed#M4)5#VWeTazM5~f?sE(i7 zdHBd=hdv0@;HF0w^17(`^W|+h6q^e-oI{whks8 znR$2!0TO(6yICkm&2DfP z_*+Pj+>L#lpZ!YD_#SWfOUdR2%8{T7TP{XOF~LxVfH;V=0acp}o74`IX#&Fjc3FpisD5!kL&S?UgDBW*RqmRQFVEU(WQX$`Y_j~flp)u{6Ge1YwPRd zU5V`7m$hpc(qhjel1B6`9?OBeiGL(E_x8UCwBbKfc{o#cI)68%+T>}(-lMY| z$ZD9_iuvouSH2&oml((u>gY!exn4_o! zu)%xR0d--yBuPk&=+d5B`KKu*b@k$l6=gry9^r&A%EWZ;KDj3iRAR2|N^Ob8b8lst zW`<3@Ns^PbCK_&_sk;oDwqb0=ybg0W);G9AoN)h&)$jEBTx}2PuF{9C7A>OLB{_fH zg&VB-^{MJFI0a^wmcqcTj3_%09g!vpkU(r2Wkojj$@c43Kl`{@8gVJ#bckvvme4iB zpND%|$g{GU3yfXd-bvSrLrD+jBN>Cd+45gSEY$J zhRaX~%8OBpjvZ&~zfLN(eCYmbsS!dd`G?N7-6JDp0I!gyN2DABXfkRa_UzXxJ%0N* zUKdDu$sr-~Axn8;#}7a9r}-|io3*%Ke=V64ewm0@PQ>#d|AC$A9@?8?RrxM z>fdJf-tYU>Xm{FbVRzgakd*fK|CsylHyd#uBM^-`a0+tK7~q*Sm$?lEU{M+v~PK){@1>; zpp1y5Jgv8H^}G8H_$4ht!!=CGOzJ3NL3|NMK7NHuFKnX&>D}!!c{fF7f%jTbv>oWS zX1n0X+w)nWd|#8TFeijIV65Kv+15P7Qk7z;G(Q4NsTROg9RbM&%s|%LeBu!)S@Det znHeKR!>Nm?9EXliWtDSYHdmDI<8CylnMa?OjTU>(lCs*qE{93L`-csrJw3E znR2~s(;`2A+g!Z5CHTQY=O2X#YJVrtp>Qd9P@pImv98LbcUPU`ZO2_PH>>#oFwxE~ z3gJG4g_BoZ_C}y84+TdtP|CpRQN5n5a?FN;0bq6;AVg^RZE?Hz0sZrm5e85i8o64} zHoHV-&BuaKz>6Udg&h>5h`0$tzq1i>?iHB)fzB0WFrG64Q7EUV*aA2SDo;i5S0imQ zP!t8}7Z%;%2D9s%)KpsN$i||krbZ|YK|vtVlmwup3k0q`C+8+u_p7<&i@`cx3>vGj z^Xye{BMd@L7rD&9V69sX$iF)k3S9+$5LCYb)YxjLc4Pn?pTuplSaZXmAw=qbdjWQ^ zNvGU2=BNo0l3)Ompe+-@gaa#sJZiPaHZn9exbc&o_kgfqW)2Efb4nx zTSffyd6gf?y3pr}2iHORvjJw#rn(z@nYd@6kxo_INcaw9r1TOML(dq32{>fh|WSr0EX2rsqha52&j zlASTSUtXgLkGlWk<#l!x6r`0Lz^+0J&39*cJREp7u%aU$kHW`L`tm?yCr>-VQx)B} z;X!5yr0SNIpw&CL;3@JmXz)RtOmMtV!3%x$+BIh*%^<0N--H@UaX|aHiOL~F%nGK! zA5-u@B^DrBiHdm}EKdG{ll~ zU`4q%YfBIpcq>>fcBHKcR-}e1^UZ_)TC%5ZIZqyVP{(|+&4hLx#I?LN(*nHLQVmCt zocN}G#&F_0`5Aj%m}9_wh>rwDI!NnT9_%$$0e&KI`d)+K1Lb!3GBT1esT+PC0PzE! zK^f!?4A4}NCgJ41+tOxcX2+}WridtBlmHFZU^%AS{;E(^kBw3Miqwgc@Iuwq zx)%0Sl$1?FL&RWyL(J&^@8{$OJ@2;!p|Ld?*#X_Zw_3h^q@afm&dPAdY9S zI&?n%va_i?e#r9gH(C^Ct|j?{X&ub^KXx`%p(6lnAOX;NmkCz1>D_%>h8HlE1993q zi}Uk{U;qV|l#dV64i*;|ry=p|DhgOg79?>YvLj7x1%-v(-jbTRq{t&H-2na2Gt=E@ z(XxK0xmo6)S68%xbud0PH5z;XVqSZggM)*}GlP@?_HPuFXexmhV19!3lIfL|m*5iy zQ%+gandIC%nM}k;0`G-zTI!<()=fJfDRuzxp#*&WdKa{Icnt&01xC5;C_cPMW8qKY z7vnOBWpYe|IQ6!f8oE>3U;{d~g#}X1`EpjPIpW>l+ba)75SVX-zNY~$1qe;Z0;niJ zX8gNv2bdwAYvb4M z6S3X5qK9eTF)7sGwHdNg|Ld$c6^$Iup6>@+VB-<=Q(NEo z^)(1EECUl0YJ7Y=bZP}=W-@y1ujH(7Bb>F1i%q3sAy|mHJ76O6_fvq60Qcb7_&8!N zo0^(JtU}QE^i5fz$V2D_><+|13ihB<+MFiHr-(TNc`pVuoB?lDQdt=aeQfaliI+eD zW&s6h*P&Gl;wsqnrgs*)h21x3U@3sW8>n(LLHK1vO#^0jk~igAh)f{zaus+<2Lb}% z9R+BkYl0}w4<>9U6Tl%c;hjn96((C zfCjU_(6f014Gj%ds@`iqYqQ}r1|-0-m`~2iIj_L&LAx<2ZEbB(aG%1vW`3m&I+cUE68{p`%p|Oulv<8o8f8 zXF!z`2aRBVS67jg4oNk7UAItQTKbCpM0o@RTI6nE*-*TB^QK*gO&s)q4gx`kiBiAa zPEATn+xz^3wrZw^1{mu>gCTC=0Tb;Fcq5Wmj;{;c3u3%HEV_j#cp;5|WQONefOSE@ zNLNqKV^Pf%O+!N!xadvTK3_^pGynLVMz1Tmb@laq1T~1Lg=hZn-+O@a%-~O5!Rd+2 zK30f~{+Gx1vL%nc&iFUP85uz1+9l{i^u9&v$JDj|;!)x-m+*=_F%?~~BdszSTj z{K|^5db&iRt2Yc&YT8h{e|%)9vGn7+hb zzT@Gh?ARf@^3xY7Ys!AU3FYbQ3B1@DaUU-XHN~*a>OTwVsL(_WCs@31(08RBj{ zlkt&AZ#bI85vbTQ2h{Ns+=466W)JF{z_{O}Tzc-k?PUC@G6uTf`N|Fa+})|6Far8l z&>9RWq_~gS3C8ygcxuc5h2jB41%+3Ym4cjx)f)EpuRFMyZ(YHRihDnW^XXI9L{)-` zu}tdvRQB!{7W|B!58q}0n|P2Atxr@$QiNv0*8g0ZxB?aEGDw!U$jOtuXqyBS@;CT~ zSy=_1a_DVI4M=UXFe$63+<>K~f}L~!6XR38ve+_}AGSJgUcW}*NJB%z5%eAmPmpEX zqZyD~BX+NkcK7$h&Cxgb!P7wUrtMA8g}83+&S$9|_cX%1(!bCbU=B`-qv;?5ColmB zRPJ4B7w85;eHa`TmhWcvQv0`6+5?FTEP9T{kS0gG;Ex}FyF7aa=lm9uI^fj+>mifQ zZM9dRoN400g^p(ap(zCBL9~YIHP83so%R6&lg+m{ipJ=ECc-!do8N~gj19g#>7{~R zYzsIIc?-2aZ-N&bUQGo$S=oe@yxqR9!rPY_A?!{|(e`80wpoMb<51}$u6%Z#BCTFU z6B3;|Y6g&FA#~&=n*O{E-ONb$C-4bSl4c$ppwRW43C>J^s?TKp8m|7yKQP%GkAD&! zkOmBj334guD>nA4*|8GMC1x#KBLqd49T3aqQRUL;rBV8XYcj#_kG>h zbzbLr9G~gnrtoXKzVuqY`;#@j<=-ya-{Y)FoufxJ?=1=b^8PEZ=u+(GU(DvL)?4fH z$*cS7Fx_iw8w1ZNG2QT~bzTKh3Wpw!e-hs`sAzF)=9+8FLGkYSsjme{(*CM;AjmjUIeGv6cJ1YOIM=!7D!MhJ}$krnE zRZzCtwzjgFvA?!_PU9(m%ne1h+W6=U_ zhhliEvH^}C&aD=@+%LluZNIdCy~G|HbFbm@o$G!aNs&SzhAS=WIZf;NG#f$+ckT~TuTL>%ihAdsOqo(lR`_6UWl+brIM5gH zqUCo|&6I^^h@r}@7?Gc&FUuQmWS;tXL{{yfXi0Zx2Lvt3r%r{zSc&%=jEfdTl3SgT z+EFwqcU$$PlK!pt*Pg|!KDKA&zIwe-(z*I+c3GKhduQjvl$4Y)A9A?DUYh~Ac24B#e42jn7~Ov=hr(~@$=WOhe#94xi~0U zG$428*ao)<{^q?5UlTvAE>!7aKbW1FA&tx71*gfvla%S1nbsH5PpYWU`}yV{dRA98 zTKU_f*5n2Q-xI6Fu@WuqX2sdF0f~(imJ8RXOvJOjOFO<^XO^=t3FUS8dsXhyUrzP& zjg*!Pbz=G7!dmuyNt*V_t-rg$gE2Ds4V9%=mG9k?Mc(_r7;|(OQS?M;Bzkr8&hD6``SXp6oxjXDRPyXX_=_Ca;2_XTf(1&AF(z z7C5~~e~8np%d_p4$N*DH*2tb%l{H8C*cH#KQpE)x`)ztfrqSN+RrpTR#;l&Pi#?6P z8rRw+{b!ssJvJu5&2#0`g|TBo-l3T%RK#A?Z|v&7(-!Q1EaE`uZknETDjHvT?h05` ziRo}(rP&>MhjO!!vWlfm&*$onepcCC(Fx1i=C%DW`a_kGeaHJ$hSvD__@j%1^Y7c2 z!dbQm`quqVJ~K990m>F$V6SU`l!>q_Ku>gh9&oG zhGg>N0De&(6-8PnhE3CjZ%r(!C}Y3KYdIMR%bz;zJE3TKe zy4~u-Xe;ZMJbUqquu8eA|C+t&d`}*>$>fA@Q~vG$_st*vZxSKJCk{X0Ee)TYN=}Qg z|FuJA4*xWrC(SLa&^%2Ik_~yF16BqWyT!z!u4`z~2E zbgpYg6S|3lG{H`lqoHnxxej~Aa0In=hxOa2&4z0EoRsMQs9$ z;i2L0Dy-GY^uN@#&GzL)Z&<#0WaTcp31yYfa}g*Ll8WsQ7w;=e z57Gr3Pt}+>^X%Qd{lV}jJ$mwld-UGHxB3u@qbh6bI`3=reX7)HU_QO+rHH?;(oUO! zvMq@8AzCzv&b^smGcq&Hi6pe*YH4qQc_1vMJQifB*g^ zloOnZ)sTuz+<2>wA4n|l2=9dWHw7;zk$l6PBWBkx4V3UHm*zj19R$cjAZ1XOl7!*< zNUks}y)=k8Z5pgyfx=^920`ybV%66uNv@*fJv}|ZNEKjJEb6jAD$rdp zocONHUyP`9XwIBD^VsMm8(9&3n(+#s+b%+yN5YN)RB>={R6$vY@Gh9LkK>-EW@a|H zb_nPh8%M&wy#vBXVnYoLJ&veqz(!)=kR}b97_<++V1x}6j1j1aHpI0MLox76ph%z) z%w)3l)6>(3p!Flyg$QD-2pZHX;LA*KeV|8_Aa$0A4-pw~fqA^Ot*x4fJ#p`za%DC# zGvm*LK|AU+ylHHtNNx#+UWvf%|9XuH>RnTFZK82rAX+&JqF%fc$RQhsc&G*!v>g-* zTbMXfj-Z6E{nsIEJDZ?nuEXsCj)VxmN}R^lW3g{zv^l`Q@y4=wA5(yzLN)OUA1KusaZorO#1fWVkl?H}Es< z6QYP)1U^EsV)UuAt&Le-T^*P&f{7`yshHZ@GC@B%{{4H-&iCkEK*>F^IszOJulXUI za5JBpHer|L6&Kf>M^G9y1qUbR19I?$f*WFRm$fr4et0W6IbYcMKVUSB);DMoQ3fnZ z0XAh|>;WWq3IYSH!RtU2aVV~#z-AAbFLkY$OJS!wec)OwBrJ1zMMY}D%O1;L`ysg`d5CHK7_gLOfluN(xr2-Xb>S*WX1 z7VTjj2HG5T?;c&?$f}-#6ztwO23w)G|8VT&#Z^#0Z9_R99Pl2I!$RP65@Fm@H5y$L zErbLGXC)DV!kX*@arhdBeXu{XgZA@+k1V)OmkPBC4-s6V`a4}+K@m>h1ot2b~~ z)Z(oJNk(`ZEJG7>b4n89c=Y*pz>xoZ;{N@P$k)4yNJ_l(RmkDq5v`m(&l7lD^E-_U z#bs;joKTyK(MWpx5bFE67L*$ZC34e%#^M80GBWCVt*2kdU!67;nZu!S8^-xQ@!qo4 zm4!+wKj4ai0Rd0Ag5N7Z!g>nF0Y$6cdG9*cM7BT~?JP$Gy+e# z!rs%OvLgv`6@R`YSREM)b*pu#d%3NRqdQ5|I#Mcs444RcXvtes-CtsBF?HB8k8jYqu!U{O=f_Bq8|9F zP9_BE4WmW(OiR?rJ_F*1d|mR=IS-G6c-O?uUfroZaqr81^cFGTL{q@a zRm3-`0uB#*{BC~ho|2Je;`pGb+B{{E^2PFYHkLmLwukCUSLWtx(>TPt5p)Nr0n!{Q zehvn`Jllg6=Mw_WFU630f&?Xs0MYwAxU)l`R(?a`EqOO|ZXXE%fDZjz|GQVO0%VR_ zQQ;aDu#vdSCRt6cTkpjYl+{%xMCw$;n5XzFB)-6Qvj(UgxOvavk4=oVDS&J_)jJP4 z)Gh7AEitvTd-suTP_^tb^#PFw>j}fmnPsI&Q=GhoSexYOU2@^G`;IWS&d=W2z$w98Miy#t$@oEuj3kNk$ zONyHfl*}kXqsc8M%gM~vHaEWO6Htn~M||aojvDA8@-d!q-JDwsuTC{7yn!LJV0WyA z$dv5!1f&F0f_P5KK4t@cJC*J@_lcq|G1D5Vt1ExTY?OwF24|`uitlZ~ZrPS~Mv%xG z$Ps(0Nm}%{0uIh=ssgoe93^iR$7@f6a{W$wkxhT}!YKzgJtvtk?C04 z`{K^FUnE%qRNsErAKj_NC$jnu;mJ|Bxm|4D2fq}y6(S|azn;T^BksF$l~9IhiVN$0rr`RD4MCxdu)iFc$xraG9VPMltV95BOOEY$P04FPvq~i>J%9Wu*ev*TEnL!eM z%m`{T#73CQs3f>Reusx*2E?!bxvu1By+`FybXosKRQ5#HSW}eyO<(KQDfqD1C(KlfseasG%D%hu*WcHoIWA@VEhUS2fg zpeAwiuyg@uP8vKa!LpPjtl_hK#(6VEula`58?@SUJ7gkC*<30QI}6gJsoo0#pJ4Ud znp53zOeTD*1ZCfu#gS*`zI-_)tf!{}&2$!myXRL-7>&989|+hzL&hffA!6`%D9~ss zFXpV-Jf)8S%m*nceloW0#|do-aLLwHle*r7b>+G5!M`u!<(0Mv9D7-Dx5#$CMbYii zcX?d2qBgz1?(8+94^e0rP>;L3SmeFMZkyqrl9wU|QWzTm*31;S&@Alvj=$Gu+v0;vHHXz+ea!c3ZK7P>9sjTd6qyMEjP8n= z9$&U_{$$)IfYqiCa1;g!r%`Q#Ctb!~OsG=l^(mh3P?_SY51lDD5$z08ZeYDHYcbN- zxO>C>Wx>WyiES#j8N+GYof&- za~3$QoPnqSA1^PCN0q7%P9X-$gF08ncOt@~qJk(r_0hM?ReI@~6gF@_c#vJGL0C4% zBvG-~hKFQ(!rf)J#&hXw*q(p=X8DtSqqZoAXy3|LQHknw3xA=MCp}WHM(@3k;Vb>n zt7}2s#=*yJS!$o+#gw~o^Tn8@>3v+k8^d-7JnZoOv*mU6xr1BBv1O;HrO9JS<;*Yi zTjy-)x4f0_`g)D} zOkd5dU$Fikh&Ekz(!q;w%EcbNqLSKbVuwjkVtpT zq@#f2&g@%97Ni^pz>>8!mUmQ@7e|nH2U~M7H%>Dkw_6C*v3S`3(#;dhfwcE64JXvr ze?23+M+@+E(Ak&uP8{AG933SZ^X(HZDQRcSz0R$F$`F&%end>oa5RXmf|5_r)Jd=xL2cvPT854L6v0LBDH-|r;_C0= z;1Z8H0faeyTjf8&TQPa*23=+B%F^m_x8Li<*YHJD_cVTUGmGM9i<|0@w({!vbvl3h zH}#0o{hH^?#9wok-Lk$Bn(x6=vUZ_zD{Z;!oWqNs7gL)ZT`bwV%bi&2T9)%@H8b;5 zSbN8NGGzjaWS1@i84^d3`rD0b)|2lR7Fqlk2ls^ zm^J%;oy@eXRY=xX(%990vrR_*Q2MBBM6r?b14GMoO$=J&vlV|n2^2pRU*hf*e{f7) zPi|6mt)>#^%N+qD$*fV2A0&ppw{M-YR*cH^Qwo~Q`KprZI~|5mJX+|4v(R^G>+9=} z{UYlY4Zsd@@o0+H^S;YdS@$}E9Vniy#BrCuWj7-TIdAN?dfAEeASUUrMuvM)qIt3_P6j)bsEC&}#~Zp1VoDops6VI)u22J5hy< zyC0nqJre(NWy4}-$#DKhC=ME5y-M%g5%-}{-621h8nqFT@2)+H`V$p`#EyHaih$mT zj-@zlqfURu>O31u<(!i9iFdAd}hZEviXk|MN$)Gg6GMcW>^$DCv{L>>sueBR2Q*m|MjC?Y1R=a!rsMN!)W#!8N!h zTInxZ_pt(qB+V}R(yelgq3?f`!{|nOKL>{=^}Xrg@@I=bZ5-LBqM@l7`liyi;nJEM zM@@Taxz!H#w=PEWsEA2B0^28Vs4X{13t>#_{6@TXDYnMhSx>D^;o8mLv)1E~x?w2@@u7IRE5$#lc zeNAKIjS1xz>(qSPGb5pHOo)n?N8<_;`8!wENKQZ+XgO%$@R5hOtUL1k?zfoqLe!zi zbsNUy0@rQt7*NSsk&^Z!ta>wuM>I#tgNo)(#quu$6gM;g_zZ{bzTk#Xx?NZQ{@kQ` zElE*C-)|wK@{DNFO%VW0Mh5_lYIfbG&PD!IugstlO^W>K(;I+IUBq7kpz$ZpUL-cw zA&;;-vNnq*&t307?m&=?BAKYvfHs)pu|0Zp`O^i3+{XJdZUp}-gARwti~+*VqXZW& zDH7?6B-Q7hJxoaIvr#hDLC*?>F405tA;a16yZ4o|)yt=Js&kEcT;cH}&qA$2RsWP0 zW;OwJJ9hp&Y@stWg+L~^^zZO7eHQa&SkqnD^G717yk z?&p{)4m9N;wn?Ic2D97~nFbtTEi_aFzQSh%oqOlXug-^;g5GZ8b@3P(iiGrV)NFm4 z9eGb3P}vd}Auz0edR=l2TprI4Q&UqDR)9EuGoJc0v=(p2$3lf#gQ6CuHELwhL9=7b ztXGyZWY=n$z_!=$1|%mV5QYP}X5b|<=wNh)+oh#Bu2VCa$*^S7p=6}bbAPS|poK%$ z-63b2l(K?5Ji$Z~4snXqOOMin5umv*p$x}^d~;vQG7X{6Bo%;cLle8y9zJ!L>U+Kc z634nnnrYp*X~)qr3gEesYTiH++G+B1(4k(CQMrxqJz|uG1SuFADJFb{1ui4Rv2JP0 z9dfs%p;qq`;t%EPd66{ksH1VA-N2M5@94a?k_k+Wis zzkd6li=m-_>R;TX%8yObModJ60s2XIXs0k_3gGPqJQfK*k%1NmrGZ2h;w!|;^v4~8 zlu{jysUMV+U=q-auY(^cKG0@)%QiMLPzo}p z28cb0^cHEUF)=YIB_$k?KT-J2&R$__~n#s}(4h+0W*>wiZ4ojiGR*Y4d^6j&@eGlkH^0tLef1MdPoI5{Y#Klm0E77{4( z+Yj6i;LVyvIxhQGUZ-6NQFw6ZO8#Ga{7mj6K86$We8_REs#G$70+;}|kg!9%+zN=B zSb`T97dfwfmX5^_A#!BGy)SB*nLV&7u%tkksP;S$2s8|&s{x|=!A*E6+TZ_Ju2NU5 zm5i|Ho;^DA_h0*vKwvU=Vi`}I0XqqW39b_Bk4U2d7P}+Bo&f5EE=43v4T#hTFji-; z=ksPBw34cm!M}p87|8PpXxsr$|7-RqxCG=`wM|VYbvW)PCdR+@r~sh_jP$4u2UO9} zEBm33;XQJM2R;S@N;^4ShuT{9@L^(_p{2@Qd>mU3u5t&2T>w3a(ixwR8g2~*UIe6v zYR;#=9_hx~$4$O-dsT)VwwBY{-jBY~sC^zxNlT+ds8IN}gDiMMYXMj0c)L6FvUP^K zfjA%>2Hs|znnOU*0nVZ?NXTx4w3NW1wNy-t1B3LP-4I&1jwTV!AFK52pMX;IY^u!2{_0B&GzZIC8~IepG9Xi1mjmA)CN`z z9|?JQ|KTUF|6cR=U(@G!kn=&?$TCtXiIy7N3Jy`U&*MGM1Z8DqhcF-pZ&-1N&SM_H zwV0@bh=VOqpb-EZv@EF;u)mP#95D%r3o;hZ$U{Xt!-wMo$0o8_{m5!wWkiTLp!o|j z4|@@>O1ufMAJwCR!i35VkdIe*FOhMHWa=XEp++`o@)fa@iC`pK1}_zPk#KB^!;}IO zlsP=2{n2avfFcn(2wz0_2W9?ihyx&rH~>1N!t&>Bg!k^P$K{d1GPvb_En~Hq;{q10 znk30UE?La?bT6=LyqyYQq{+A!X#akG`@lek3IP>^BCpz2LH!J$BrGGTfKzY9#j%4Y zC6yx>ywJ$VhoIeDBzmj>Ots;OT4JOjbl;e}7=y!48Qg@8()$v;wXLAp02v`rvG6kD zKb$cZNqG0}3o`o81Y%W$WMvZve3oqYNl5U6A6!{kA#5QwGMk1`iD-d60|3_xp*lnk zBp(QG&cmJ(Tyj_Me!AjuM(Vu`7sR(;+Dp)bS!8sOd0Bn zHa-b(eFB^~C?i5gqjf!oO%%lN2cS!rQH)-&wN)d8Dzv%6LPDl8Y?=O?I%SwSz~<+-w^u+HMA${4x#<~Z%-)O zs^A35#T+UyeT2>>6J2o9ai&z)$)M`MUO^aduzFdbHn>Wq=UF#xl80!Ymy3%FdD)x5 z#~1T`$bwLWs1LvS%MB^_ihC1`y$36L?-M z;#yK6fBWYq>;dk9FCt!nt%uuH390^Rd|Vkj`rFxBNh~{}H9(RsHhfg->U$7;V+oXi zefSEQ8!(|Hh>kRhBy@x~KBy@_=yxbY~;NGRSvrZb7W_et5Izny|gEWOW5 zvaa*WV%ehWs$76~<%0kLj-7h5-xJc8ZIZ(^DFP)N)r4AJp2~FfIsTryQvH{}3w{=> z+o?M2oYP;F3YV|1UgAPJXEw^J3FMmkO*n1@S#yeNqrf$e;zOB*ld{`l)&7;2QKR?wP58rz9bzj5(5LM4hRC(+a-7|oBsXK|1Y3}^zg677P z6l?kTGZ$*UWB8@v_Gul)Lr|Ih5St9B|)9pKPu!`!SF8$tdqmxjh+I zJa%N%|HyRv$aq8WoANWC(}FHW#xc#GC9snby*Zp-l0{n2Q34WCCmN3I+=$M;;G~I) zY0lgQalth1sn!i~w{|^ORjjitC=^U#u%vtW{@d1XTfairyBB(NpoMA0QqmD~H6z~8 zHRFFF)lCuguA4@RMn7#EJ7biF`dS0zvx?XX?<~~c*8IIq1^2Mp_Eciq}Fb2P#?8^#nebqR62h&D6uW-71x zpUUhPeVskQ6c@jpKFbqB-+VGmtkfu?tMxLk&)d?F7OzKc#=o(jRUsP-Nbx$!n_pKC zx>v7#g$_UgJsgVf2L&7!J_!!f?+03=4PRxxuRN;i__4*RK*edMFs5p%f3vz(k{B!k zlO(|%uA?mdXJZO^H zIuwNp%E~tuw|WU6Vw+fDX=z)}CgkRCh#gh$w{7&WxO^!pAo)&(zwxj7*0%OQ%V6W_ zRR?ynWT}sbaz$|-@<2pD+-;neH_vR4Y)O07&;ae9=X|!}yFOwVxRg-pyx8NReDRBT z{O9f4gD$C!ZjjZAXnZtrHG_A;&9m=hLV)Ya&-r`&uWzel4QWbDBu=UxT5CPK;cu|; zfwm69={iJWs`ba+-Uh%Nv{>BF_F!uuUT4L+QU+a*^$X!M_ICB zW?5>#o;q*MGXAnnP%|Roj`qD7nYZI9YWFR8(ioYNf>3r#L~tM0H=j6o=#Z7o-E-e3 zu>v{Q!#CD8L04<0jYdjD{JL|Ck(r5Qn0wQ%J)3b?GKJQ zSlFN!MiG_Lr}Dyh;<)v?owl?5wu;IhkA(55z1bae|GpYU$xG3MkTLZH$Wh3@j9*!+ z5#it9J2Mwly^&qfDUoB5uG@9LW>))Pa&|6JAh zBbitc1yxg+squ$6cJnufhnM4@)K{20{JkKc+()@mtC~HLAihwOGP$oebL*ea`L2RQPUmWwqOpU@$dUgs)CDJ z#LA2(7HN6bS5%A(?^3EMol|bB>e&SI2imHtONvrity9 zrO5dV*pX>57ITp==O~?G7gc?WQPc1-8(!+0ucL3@r^)y!l*A@fJ0oTd7aBt>^b-#2iRS7yrfCzF{H zl14^G6qs+8ouDne4hn>4E+I^pxxAHWWoQhhtE!Z3ZgB4LyJSOe&Ykk+?Xe^ab#Hkk zB^u}%;w{7Hv|2XXgI|J*U+SrL!?U_qTr^J}iSTS#cw1LSDWsvjTz+TW?g+r&vY$>_ z%blY;X)G5LzVQp2z>sA^^&3AL;kUu*Uy8MZo<8M_i!9u2BJ{;yJU(*tBGm(Z?oh#Q z@e*$N6EXK_jilMmH_9oFr@F29I-jg_x!Rk{AooIR?$%vTID4;|azyN&-pv-ah5`mH zEBo&m`d4{a9`yNDY@Ca6k6&h$40|9;`(G`<_hVoTSbL7NOKN@W z($gc%K0@pl#;+I1hgZ{n9F}=S6)r)2iH{+t=-92Zh81T<$H#gqJa%?%+;O z+4Cqj3LpQ`d!S%?z(AVi?+(v#sUK7JD#YcC>PK=m_jOYf9m4VOKWKOvxLAJmZglu< zqx$qxl+!SkS+;G?(b=yK{kg4*r+v?NTc@}S^7E4*Ld3f-M>u}do#S^$HHJEH5e|5X zEA8dQVQL?ATGNsT_^r8bTsqUNyhaJ8k(;RzW0PkpRMk&p#R-X31v*o8N_bw1jb2N4 zBr5q}vci3Vw&F)h+Wc{vE6YxWGjHWCTrzG}_Wx=AGxGNOuhOT}Y}s$^($haSdyVx) znY~SH1AlQwxjBIR9k!oPBbX&z6~)iR(}d zGDP#Ei}me!czLz7Iz!x=&KV@UQ0+Sz$HN}|cz42z+${4v``pPN1$WHCIG0{al9_>x z?d`V=+%xVyn*a41(lVl5?dWy5F2DfC$Jcd6%6(t{7$j^ySWxKIBz^-bDpd@EEe|(W@y#6^&OVSc@>Q~T zsm=XcUt73y;98a~XQRVf81>nI4V4-UB*&dTw$dxQx1V$OKtVwP)zP%u+FY{km?RXf z-=%D`?EOe<-No}g#~A*4YRK@}vRGk@4%@Kqs!uqJM4{)so!Hn^NYgm>TM&JLWanO`!{GY; zSO1P3A-cDmv>VboWskB?-xc#GHsd``oi(J@fNIyM(#L4jb`=;jbiV+wj7M#q;?+?* zgw%})B)7-SSy>&PrS<~`PiB(<_XP%+(ksX|B2kXUoy<6eIqWwwJ__-r&wy$*!D^0wQ|EC4<0If@qe1r; z3W(wOsZ+IX>kgmM(4aupAd~@!B~{^*-+WLFdKeR6k7P&&9Ovk(03BzIWCXv59h;V( zz6Pu`3Af)B%lTrH-<%4;6mbbP5XTXK+B$G61^NJl9)|*y`@OgbW9{vt-HD5kv$3@REwl=o)nWOwbgo0+pIwgM)=A!b4W#TEX1JzS{8eAVyX zt;eW|V9bj`n@3#xXrYXG0jL3-EO8iKOM+k__xdHpfD|xfsSt46l&M^&-z$gn_X#`+qC8wKdzS zPPQM6aK#mU!xn-*KmLesh5l5~XNht}d_F#rd@w~Lazp@FOY9r=H6VooV1n(K4G9rc z8U$`%qg<=f?It>(tbQENJT3K1LFE)4N9F7fh%K%8<27wYC zh0FKO2-m3rwG$^eQ8`Vvmk^=Td9wsis>d@)4;#NFhW%1W`&Tf$4AtdcpRmC`k>I zVv&|1@U1P4X3chhi;EaH_b6RKem`@;t^)_+AOc*C#sCa}I*>i5L*4GAG|B`>g81F* z!?(!8WzERMM4n|#V&WTD3H43xU%Bq&^8ymMheY3 zlsmtsH_3~-96+Yj2FKfs2ybl>r{3&w~^wB z6POZSGcdr7Ye1H3J>>1$A_av~h>rm9B1mQ_{ojlUBo`*8;AhCbB0$QGv7yMQEz=VNthlW6z;Pj7s>DZhO$>GIu>4 zk560Bive!M14=>MG9YWAMM$jsx&%*%#fgeGe|BdP;!5xq%W0r1rq@g{2 z>c0`lBq@W;V%b6p~YV1u8uXFFt0Qihtd_db50Kz4bSeT=MSP zb`hI_yctdkaG``np7DnplRA%Qs+nW2qitFj7xH=-o7QOZ!WI;!c(9CnD97sd<=nx z0lH^RP6M`#vrfbgw~T_~@ZrPGSXi$vJ;KgWsOm(ims9gn0x=&X36^AsqQeHFOQJ;x z7_F?ltDxN!mJSeX)K~_PmCN%+@A8qd>Y$CsFBo`I1*< z$Vgr1^%O@@-2-NX(0bR*AECvjvAI)JML?m*>^JbyIPr`Mj8CCwBdkw!bn5TFtjkb$ z650Z^!sb5a5Ct-S4T5s`$6B9WJas~_uCw#bwfM5M&R{nWAf1G?KxTVg3ygz8*NVph zKnDTK1?s%xz`{gq8S+}Ezr5W_0UhXd1zt@XJ#f!goghrn8R`p8`Ux^ZS>#32?G_=&TSI}0 z>dapqM0sCs9rgzFU01CFb!DvG62t|8ssbW2G9XauIgnT+2Ce5=eSI^?Op$S{`L*KY zTlblfb&ysvQMk{2VM5VT?RX-6hb2A;yaGvc-y1iIuwaBMr@k(>MLa2XP!Z3;IxMo= zO;K2W$YCKIDt=&vnIcuzRyglj&HJJI!a=o7Pl59mM#*C`TODM~n^#3yLY{apxyDYK z!z4BJvmzFE4>Q3H9KQ%<$$(bP;9wEiwM!#0QXN0$$uJiO$JqyZi5Ni!i(Hm-KL%yr zLB*?@RX)WFKLHp-5-fS2{(NwMr7zFvBw3-Em#`aPQC!hxw!F+~<32T5dA`kB_!i!1 z=$Uhzj|?K*{a!g4!3Z*Q2>vGFgs;b~NYdNjAFVGl?j(#`X>)YY!(-~3@dhXYg&!=X z$UC~7WLkkE$ZuaJtg-LvvRjBKL$op#K=Buc+_+wGT*pZZUC3bR>Fpc0@7n;VX)r%!jcY8p^c_yv+Ddyo4n&AQ6(CI9wp?b;O|? zJ9+z23w~9z;RdC>apuslNE$L*-r($iauTIJ1Qi1Xz2SdbeeJ0MV?;3Ul63T9zPG+65wv&oCJxSf@K6Lp5E@QIhmO>_f&Pw z8I&P~LRV0Oy^shMQJzEHV8FK|5PJ!PEfSmSR>z=P#r-3(a@b=|6{=G6n7+nR z8&0reW@ zwG$Q>9IKNN%Z_xm%hSV5WfR_Aozv6<#`gq4ZsJ%0DPDtu5s8KyYmlB@#x&I{ZKIWl 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

R~_jqQdu!u`NY>{%3KZkqBCbM4s^a< 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

A7wD1 z2oRHZ%)gWW;ot_`v~1nekcmPQzAHfxC6z5r9~t-SU?WyC;2*=iAq3rm9-sn-G@rmJ z(54Bpu!JZco_*f(QqtclPi4(^q7NV=@G4j_fD1sJFM!#r96r9)FcRiy8_56pm=zB4Sacd5ybcrhK7GR!Wtu86!lBX~fEKFM&zD(%Z9K zD%gJAnX+=DK_*1mFyzU47ssqo;sgW>30gw1nfRE)uCkBq!*%zUAK$dV0AX|n@DvO-_KU|? zTjo{R6{I|S#=#XvE!Gq|UfyFP6Pl4BYHVssZz#x4b<8-erK4keX|9%#o>Jrg{N7j=# zP5cZ|V`UC<_VI~uk`LDs+S+Pga7tACu8v{B9tho9g6JnF;r@(g$$=f5>{WT3H{q*4 z@JKbwAgr!V-A0BNv-qcNb{3#sJ8rQ4r3!`M7im2mj+O`X)r z8AXqKhoo++iE(AvycdgUFqccJln9@4u{g;E+ZER`TK=Juecm1`8V`_!9<^VFcU|4$ z;$?oDBZhnKs>>x|0(@Yf*~H*q#PW@fo}<*7JQRsNT$FS8@inNY)E}mKP~n5%6Y((8 z;LDE9dX3Hg32kOqd41Y@d`c*QH7~_vR{*O3#D)L!r!HlswU}0gmcM+&%&o60=qA;S Q7X`mG59+98tC(N=4@@kGi~s-t literal 0 HcmV?d00001 diff --git a/shell.nix b/shell.nix new file mode 100644 index 0000000..0058ec0 --- /dev/null +++ b/shell.nix @@ -0,0 +1,8 @@ +with (import {}); +mkShell { + nativeBuildInputs = with pkgs; [ + (python3.withPackages (ps: with ps; [ pydot ])) + asymptote + texlive.combined.scheme-medium + ]; +}