From 4f9296236a3cb46ccc1f9548ec6eba32eff8c906 Mon Sep 17 00:00:00 2001 From: zhurui <274461951@qq.com> Date: Thu, 4 Jul 2024 17:06:52 +0800 Subject: [PATCH] first commit --- LICENSE | 21 + README.md | 287 ++++ cog.yaml | 34 + cog_predict.py | 196 +++ criteria/__init__.py | 0 criteria/clip_loss.py | 17 + criteria/id_loss.py | 40 + global_torch/SingleChannel.py | 127 ++ global_torch/StyleCLIP.py | 246 ++++ global_torch/dnnlib/__init__.py | 9 + global_torch/dnnlib/util.py | 477 ++++++ global_torch/html/[6]_501_c.html | 99 ++ global_torch/html/real_.html | 223 +++ global_torch/legacy.py | 326 +++++ global_torch/manipulate.py | 383 +++++ global_torch/npy/ffhq/fs3.npy | Bin 0 -> 6193280 bytes global_torch/npy/human/fs3.npy | Bin 0 -> 5505152 bytes global_torch/torch_utils/__init__.py | 9 + global_torch/torch_utils/custom_ops.py | 126 ++ global_torch/torch_utils/misc.py | 262 ++++ global_torch/torch_utils/ops/__init__.py | 9 + global_torch/torch_utils/ops/bias_act.cpp | 99 ++ global_torch/torch_utils/ops/bias_act.cu | 173 +++ global_torch/torch_utils/ops/bias_act.h | 38 + global_torch/torch_utils/ops/bias_act.py | 212 +++ .../torch_utils/ops/conv2d_gradfix.py | 170 +++ .../torch_utils/ops/conv2d_resample.py | 156 ++ global_torch/torch_utils/ops/fma.py | 60 + global_torch/torch_utils/ops/fused_act.py | 34 + .../torch_utils/ops/grid_sample_gradfix.py | 83 ++ global_torch/torch_utils/ops/upfirdn2d.cpp | 103 ++ global_torch/torch_utils/ops/upfirdn2d.cu | 350 +++++ global_torch/torch_utils/ops/upfirdn2d.h | 59 + global_torch/torch_utils/ops/upfirdn2d.py | 384 +++++ global_torch/torch_utils/persistence.py | 251 ++++ global_torch/torch_utils/training_stats.py | 268 ++++ global_torch/training/__init__.py | 9 + global_torch/training/networks.py | 809 +++++++++++ global_torch/visualizer.py | 605 ++++++++ latents_test/example_celebs.pt | Bin 0 -> 221944 bytes licenses/LICENSE-CLIP | 21 + licenses/LICENSE-stylegan2-pytorch | 21 + models/__init__.py | 0 models/facial_recognition/__init__.py | 0 models/facial_recognition/helpers.py | 119 ++ models/facial_recognition/model_irse.py | 86 ++ models/stylegan2/__init__.py | 0 models/stylegan2/model.py | 715 +++++++++ models/stylegan2/op/__init__.py | 2 + .../op/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 265 bytes .../op/__pycache__/fused_act.cpython-310.pyc | Bin 0 -> 1330 bytes .../op/__pycache__/upfirdn2d.cpython-310.pyc | Bin 0 -> 1464 bytes models/stylegan2/op/fused_act.py | 40 + models/stylegan2/op/upfirdn2d.py | 60 + models/stylegan3/dnnlib/__init__.py | 9 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 219 bytes .../dnnlib/__pycache__/util.cpython-310.pyc | Bin 0 -> 13959 bytes models/stylegan3/dnnlib/util.py | 491 +++++++ models/stylegan3/model_3.py | 529 +++++++ models/stylegan3/run_optimization3.py | 267 ++++ models/stylegan3/show_pkl.py | 194 +++ models/stylegan3/test001_s3.py | 37 + models/stylegan3/torch_utils/__init__.py | 9 + models/stylegan3/torch_utils/custom_ops.py | 157 ++ models/stylegan3/torch_utils/misc.py | 267 ++++ models/stylegan3/torch_utils/ops/__init__.py | 9 + .../ops/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 161 bytes .../ops/__pycache__/bias_act.cpython-310.pyc | Bin 0 -> 8289 bytes .../conv2d_gradfix.cpython-310.pyc | Bin 0 -> 7314 bytes .../conv2d_resample.cpython-310.pyc | Bin 0 -> 4438 bytes .../filtered_lrelu.cpython-310.pyc | Bin 0 -> 10063 bytes .../ops/__pycache__/fma.cpython-310.pyc | Bin 0 -> 1709 bytes .../grid_sample_gradfix.cpython-310.pyc | Bin 0 -> 2575 bytes .../ops/__pycache__/upfirdn2d.cpython-310.pyc | Bin 0 -> 14161 bytes models/stylegan3/torch_utils/ops/bias_act.cpp | 99 ++ models/stylegan3/torch_utils/ops/bias_act.cu | 173 +++ models/stylegan3/torch_utils/ops/bias_act.h | 38 + models/stylegan3/torch_utils/ops/bias_act.py | 209 +++ .../torch_utils/ops/conv2d_gradfix.py | 203 +++ .../torch_utils/ops/conv2d_resample.py | 143 ++ .../torch_utils/ops/filtered_lrelu.cpp | 300 ++++ .../torch_utils/ops/filtered_lrelu.cu | 1284 +++++++++++++++++ .../torch_utils/ops/filtered_lrelu.h | 90 ++ .../torch_utils/ops/filtered_lrelu.py | 274 ++++ .../torch_utils/ops/filtered_lrelu_ns.cu | 27 + .../torch_utils/ops/filtered_lrelu_rd.cu | 27 + .../torch_utils/ops/filtered_lrelu_wr.cu | 27 + models/stylegan3/torch_utils/ops/fma.py | 60 + .../torch_utils/ops/grid_sample_gradfix.py | 86 ++ .../stylegan3/torch_utils/ops/upfirdn2d.cpp | 107 ++ models/stylegan3/torch_utils/ops/upfirdn2d.cu | 384 +++++ models/stylegan3/torch_utils/ops/upfirdn2d.h | 59 + models/stylegan3/torch_utils/ops/upfirdn2d.py | 389 +++++ models/stylegan3/torch_utils/persistence.py | 251 ++++ .../stylegan3/torch_utils/training_stats.py | 268 ++++ optimization/run_optimization.py | 181 +++ test001.py | 36 + test002.py | 27 + utils.py | 49 + 99 files changed, 14578 insertions(+) create mode 100644 LICENSE create mode 100644 README.md create mode 100644 cog.yaml create mode 100644 cog_predict.py create mode 100644 criteria/__init__.py create mode 100644 criteria/clip_loss.py create mode 100644 criteria/id_loss.py create mode 100644 global_torch/SingleChannel.py create mode 100644 global_torch/StyleCLIP.py create mode 100644 global_torch/dnnlib/__init__.py create mode 100644 global_torch/dnnlib/util.py create mode 100644 global_torch/html/[6]_501_c.html create mode 100644 global_torch/html/real_.html create mode 100644 global_torch/legacy.py create mode 100644 global_torch/manipulate.py create mode 100644 global_torch/npy/ffhq/fs3.npy create mode 100644 global_torch/npy/human/fs3.npy create mode 100644 global_torch/torch_utils/__init__.py create mode 100644 global_torch/torch_utils/custom_ops.py create mode 100644 global_torch/torch_utils/misc.py create mode 100644 global_torch/torch_utils/ops/__init__.py create mode 100644 global_torch/torch_utils/ops/bias_act.cpp create mode 100644 global_torch/torch_utils/ops/bias_act.cu create mode 100644 global_torch/torch_utils/ops/bias_act.h create mode 100644 global_torch/torch_utils/ops/bias_act.py create mode 100644 global_torch/torch_utils/ops/conv2d_gradfix.py create mode 100644 global_torch/torch_utils/ops/conv2d_resample.py create mode 100644 global_torch/torch_utils/ops/fma.py create mode 100644 global_torch/torch_utils/ops/fused_act.py create mode 100644 global_torch/torch_utils/ops/grid_sample_gradfix.py create mode 100644 global_torch/torch_utils/ops/upfirdn2d.cpp create mode 100644 global_torch/torch_utils/ops/upfirdn2d.cu create mode 100644 global_torch/torch_utils/ops/upfirdn2d.h create mode 100644 global_torch/torch_utils/ops/upfirdn2d.py create mode 100644 global_torch/torch_utils/persistence.py create mode 100644 global_torch/torch_utils/training_stats.py create mode 100644 global_torch/training/__init__.py create mode 100644 global_torch/training/networks.py create mode 100644 global_torch/visualizer.py create mode 100644 latents_test/example_celebs.pt create mode 100644 licenses/LICENSE-CLIP create mode 100644 licenses/LICENSE-stylegan2-pytorch create mode 100644 models/__init__.py create mode 100644 models/facial_recognition/__init__.py create mode 100644 models/facial_recognition/helpers.py create mode 100644 models/facial_recognition/model_irse.py create mode 100644 models/stylegan2/__init__.py create mode 100644 models/stylegan2/model.py create mode 100644 models/stylegan2/op/__init__.py create mode 100644 models/stylegan2/op/__pycache__/__init__.cpython-310.pyc create mode 100644 models/stylegan2/op/__pycache__/fused_act.cpython-310.pyc create mode 100644 models/stylegan2/op/__pycache__/upfirdn2d.cpython-310.pyc create mode 100644 models/stylegan2/op/fused_act.py create mode 100644 models/stylegan2/op/upfirdn2d.py create mode 100644 models/stylegan3/dnnlib/__init__.py create mode 100644 models/stylegan3/dnnlib/__pycache__/__init__.cpython-310.pyc create mode 100644 models/stylegan3/dnnlib/__pycache__/util.cpython-310.pyc create mode 100644 models/stylegan3/dnnlib/util.py create mode 100644 models/stylegan3/model_3.py create mode 100644 models/stylegan3/run_optimization3.py create mode 100644 models/stylegan3/show_pkl.py create mode 100644 models/stylegan3/test001_s3.py create mode 100644 models/stylegan3/torch_utils/__init__.py create mode 100644 models/stylegan3/torch_utils/custom_ops.py create mode 100644 models/stylegan3/torch_utils/misc.py create mode 100644 models/stylegan3/torch_utils/ops/__init__.py create mode 100644 models/stylegan3/torch_utils/ops/__pycache__/__init__.cpython-310.pyc create mode 100644 models/stylegan3/torch_utils/ops/__pycache__/bias_act.cpython-310.pyc create mode 100644 models/stylegan3/torch_utils/ops/__pycache__/conv2d_gradfix.cpython-310.pyc create mode 100644 models/stylegan3/torch_utils/ops/__pycache__/conv2d_resample.cpython-310.pyc create mode 100644 models/stylegan3/torch_utils/ops/__pycache__/filtered_lrelu.cpython-310.pyc create mode 100644 models/stylegan3/torch_utils/ops/__pycache__/fma.cpython-310.pyc create mode 100644 models/stylegan3/torch_utils/ops/__pycache__/grid_sample_gradfix.cpython-310.pyc create mode 100644 models/stylegan3/torch_utils/ops/__pycache__/upfirdn2d.cpython-310.pyc create mode 100644 models/stylegan3/torch_utils/ops/bias_act.cpp create mode 100644 models/stylegan3/torch_utils/ops/bias_act.cu create mode 100644 models/stylegan3/torch_utils/ops/bias_act.h create mode 100644 models/stylegan3/torch_utils/ops/bias_act.py create mode 100644 models/stylegan3/torch_utils/ops/conv2d_gradfix.py create mode 100644 models/stylegan3/torch_utils/ops/conv2d_resample.py create mode 100644 models/stylegan3/torch_utils/ops/filtered_lrelu.cpp create mode 100644 models/stylegan3/torch_utils/ops/filtered_lrelu.cu create mode 100644 models/stylegan3/torch_utils/ops/filtered_lrelu.h create mode 100644 models/stylegan3/torch_utils/ops/filtered_lrelu.py create mode 100644 models/stylegan3/torch_utils/ops/filtered_lrelu_ns.cu create mode 100644 models/stylegan3/torch_utils/ops/filtered_lrelu_rd.cu create mode 100644 models/stylegan3/torch_utils/ops/filtered_lrelu_wr.cu create mode 100644 models/stylegan3/torch_utils/ops/fma.py create mode 100644 models/stylegan3/torch_utils/ops/grid_sample_gradfix.py create mode 100644 models/stylegan3/torch_utils/ops/upfirdn2d.cpp create mode 100644 models/stylegan3/torch_utils/ops/upfirdn2d.cu create mode 100644 models/stylegan3/torch_utils/ops/upfirdn2d.h create mode 100644 models/stylegan3/torch_utils/ops/upfirdn2d.py create mode 100644 models/stylegan3/torch_utils/persistence.py create mode 100644 models/stylegan3/torch_utils/training_stats.py create mode 100644 optimization/run_optimization.py create mode 100644 test001.py create mode 100644 test002.py create mode 100644 utils.py diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..2130995 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 Or Patashnik, Zongze Wu + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..f04fbc6 --- /dev/null +++ b/README.md @@ -0,0 +1,287 @@ +# StyleCLIP: Text-Driven Manipulation of StyleGAN Imagery (ICCV 2021 Oral) + +[Run this model on Replicate](https://replicate.ai/orpatashnik/styleclip) + +Optimization: [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](http://colab.research.google.com/github/orpatashnik/StyleCLIP/blob/main/notebooks/optimization_playground.ipynb) +Mapper: [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/orpatashnik/StyleCLIP/blob/main/notebooks/mapper_playground.ipynb) + +Global directions Torch: [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/orpatashnik/StyleCLIP/blob/main/notebooks/StyleCLIP_global_torch.ipynb) +Global directions TF1: [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/orpatashnik/StyleCLIP/blob/main/notebooks/StyleCLIP_global.ipynb) + + +
+ + +Full Demo Video: ICCV Video + +
+ + + +![](img/teaser.png) + +> **StyleCLIP: Text-Driven Manipulation of StyleGAN Imagery**Name | +Step 01 | +
---|---|
0 |
+ + |
1 |
+ + |
2 |
+ + |
3 |
+ + |
4 |
+ + |
5 |
+ + |
6 |
+ + |
7 |
+ + |
8 |
+ + |
9 |
+ + |
Name | +original | +man | +person with T-shirt | +person with jeans | +person with jacket | +
---|---|---|---|---|---|
+ | + | + | + | + | + |
1 |
+ + | + | + | + | + |
2 |
+ + | + | + | + | + |
3 |
+ + | + | + | + | + |
4 |
+ + | + | + | + | + |
5 |
+ + | + | + | + | + |
6 |
+ + | + | + | + | + |
7 |
+ + | + | + | + | + |
8 |
+ + | + | + | + | + |
9 |
+ + | + | + | + | + |
10 |
+ + | + | + | + | + |
11 |
+ + | + | + | + | + |
12 |
+ + | + | + | + | + |
13 |
+ + | + | + | + | + |
14 |
+ + | + | + | + | + |
15 |
+ + | + | + | + | + |
16 |
+ + | + | + | + | + |
17 |
+ + | + | + | + | + |
18 |
+ + | + | + | + | + |
19 |
+ + | + | + | + | + |
TLf+Vx82I8N-Y~LA_LN8lB4bv5zGp^dfCEMQ|+xpFzM{LS2%N z@fk$91R0&CQ$dop4#bP+@#)cnnG521_{dRS9cd|ovh#CbJs{(&kk^Tb!Y7`?)EQ5a znReX_-?2?e&X-H4%9GeEr8)B%U+Dad2GXfH9_EcFLTAXE>^y+jbu8)cPkDS*xCZc= zqe)IOGfF{ac9*;ULQ{Uq6Z-6RJJ7T^(DhWZs{GZ+2)p$+lz4`nu@c0r$<&UAI9k9=OvH5Js- zz6d$h_m3mq_YeLAd!{V*>~_A=>IzMj#l>22TLKufomB$+jbZX@sUBT}L*P38Hyx!S z%}aeCj%tzqIPGlWcp)t+8$P3B$yeHT h(kJYWRhHhWs$5zcFZ~PBK|5uIuM%6A z-LKRQCBgR2O2Q7@BcE`6G HcE5R&ZW0b9~Fq1uJrB=jr_`y1g33nGW2XnfB!Rj-ZApR}4U?%a4 z(Mx|Byta6ZO~~IbEiukh2jO+t#-AE@hRebH{$Z|>$^M)qDA3pR<-~pvp|%vSsTB$b zlZV~4okt~?q^hm$YpF8ScllEMICxt<%sl4iaMR&0dIlT>-(we;+_ ?RE$ z8t;lS^bWy&6mAXxr`nqF$)3Y>4Bl4r2!nm=^tbZfTCa>D@$;m6KGUykt1tA#tF!0j zF=Ruz1vwH{&<~U8*haBxXeT+^A!=XguKC~fy^@Znvy!`|v6fh6U+iuG252&UG>`%h zptZ~j-w<+u;{e;)JAr;hG}CUnY8&hFmx)KUb~-?P!FyT5Dv>vd<>)J0&lo93(>wSf z)}e5EK})fXdnK0(vjPmWl3vL6^91oBMw;z!I2x}lF{nA7MjYg-;Bw#+sH8^+?n&!x z9kopIHkt*SO4nHzdW^Rvf0(a)9e-BZ#y7((`bECEf3h)(q7|q-isHCO@_ey5XOB7< zXeb}{4u&?qhuTr?q0JNKxcXY_uup63vFB>f)Uoh0g9j#YLttlWTwn>k!oSe;bPhF^ z6IaM1ASxH) |0NwPa%0vHP4jMFCftB}7*0anB0*OAVHJBID zuXs5lJ;th4NbYNHKXtU>^cb!we$w|<%78<;$L?xKF9yNVBn+-)YLQPlEl`>G07?;i zgVSBNuvFB+f0B~HUH%fCMN} &+w{p)g0jS!h_%v>Pz!^d*coWH^0zF5)AS-h@G}dZF_-jko#)1o&y;b>D^Q13 zse5F1C9>ArkW;!ZmkPW#>M>vOtNeEIGF2CABu&r=evy<9`nucjBZU{N&;DF)%dQlg z$nDro=z_e>I7_`Z27&+JGb)P-w+!R&(~CHWS3>R8x#TQQEe f4NNr_=a#_Aj&=>&bLxS3y4= zWt&KqVWxURs7Q^b_ezbd&q3=@MRQizjBPB=_k=Nhxl5p*T#9MW|Hkb@O#&m`SDB&W zCiIi-t5#2_58mp#J<++#Q!L^Up_v>XnI|u?O(3((v-NFc4{o=(0q0hw`zcH5ZzK!4 zvYYgA!EI; nADjvi3g{!z@`i ikE?1Tw3CBsx&rLP30Ro6Q!@rgpgI4W_l=Z*dEjE zwUgXqU!I|2GvrI&cXDcOg8#9>)Af0i?4s3?tANE|t?!7rs?C>gP>` ~y?= z^Npib#Yx^Dl1oR9+H%>5{_I3J! nH?OtUK9T3e$q%0*$0nq@nv;Gtx0u=I)| zsa&HAAD>%;A*DlcKk;(XoWlQU%h?0`enDg(n@-#{APNmjyzH;ahJpi%ii^uh0d);C z)3Q0Sfm)>f#OA1wiV-&XlWoKCXMu*CCD4{3ppIXpPQe 3Dc@&&aj{*Tg0SPZiOw=msu+G}0y z{iJKrPxN` dn;jonI7Fq^adpQyKxH`gP6)3BySnFrG3_=>gwQl za91B<_>FUF3$?2+QyNFc5aXE;p|B(=kazrt)nw{hpkn|NmrFf}L}mqwq8ItgY8lGq zz#fgDo0#sZ)q!j+Tr|i=#EalynhO5G=CVV{1rTyF|EKmM`aTM08ktjAHu}CR$7G@W zqZe>z>2kK~1zoV3q=1bgOX(wo?Ve8bi=_53zY$+yBQhSwgKO?;;A^l_a!-C(V7~N` z+~_#SWc&VAj-Z`zaNIk47<)>H(c ZaO;=S9k(f;Wv_{_A`{K9^l( zds?svxstNc#*9?TZ{Cv^M)%IFj9&XiEC#a^C*9Yi0#8+`HJC#1#5BWDTY|&fI)e#q zr{8AH6v_qX^Ii0bLKNjjk^I@jHl$B3s&)#^<|j)Q!-D<|%nVMDhlmx?GGD&EF4BT& zO?q7sRWd`vxIE*jl=qE>*)6>b8j@oiC!?^G2 z>5rlZ7+*nM>lL~O>Z{eE8yjWvdjl`*fo=2I)FNgaoPy6*#s|`jm7)!u0o#N$wFG`3 z4}1FNI|;Y6IM5m_XJ+~^cT`-sAX(#yjkL^ 7kJz5&Ep z-EHh5o?$mo19-4-5Z#S!t2ILtZ0n?f!J78P;Ir0}9wc|nKgib<7AGmh7rLym#R#&T zeE}T9?A4bltH3R-5&0dxWA<_*+#BiTpcmFSc>u#&cbjg^q42d@;7=f~%6nuA_6IgN znO{Z56N|8c+Ep|07}5i3AoNSX>W98sDQyX)jkDF+G|^H=uaSr; P_UG#kJ%< zf$1FYsLA|e-$niOOf<7pULn#~ds}0pv88D+yXZG6HgYFf7ff}H6`zArbfuyS@SbG^ zo$g)=qkKAd)p3Zi@j37WONHu!Y;)g#!ewgHY#O3ar4mD(E4M?2v4rZ2?WGShVKTH1 z1nuSFR0pG_W0f|8{}p_}#;Z)|EZvZrTKa-I%f1{ wy&PE`{epU^+lS#Y-KKSy_o63$u@=$Gsc*FB>NV sD-pDQR{U9C-H~DT!cjZ~0Z6Zq* zz%kSlav4$LR9&CUT*oy3-v*!f15C4sV5H+mQeSShJ}hOrkM{49@6&@|7vi)UtJUOR zu$d@KTB}DDFLsnMrn+v+z0{hBmv;%p)(c8e)>wOGQy+UEyo6(^B3m_2j5L~G&ekt3 zQgu2D_GcCZb9^<6V?imgp1R!8FtCSEiX6tD#_M7?`4?Qp+|F-9&WLO1c|(rG4^!94 zMbvd7TFw*BYklxojDQ`8-$4~>7#!qIw{C`y{Qvoe1XqIqDkfs3DH>2`L-UU9%p>bd zJ4_FL=~^e{rOH;vo}{VZy_%-{M-u279qArvW^xt>K4@=ph7uoL;}zM6j_nmQ0DX5| z)-vU4p>}K=Y)j}$ei!@|6~Uhr&&WNvwZa$sN1`rW1BJ1TK_kWMd#H2-y_4#L9pGBR zA|=b-(fN=$W0Vaw$yG%Qu{tFZohir&RFV(CF2S2BV&(>i$ydqgXq00z7wbzPA2ajd zJaRQ$5ORwcPNIIVugD-^U*mnRNDhlMCK#lFN{L;K5|f-Dp2%k8-C>QZ#w)`5Ad z^2}?rTO6)8!6V^Grocev*0++{9(aZBh$-5BvL3TNZ&t0G&@{b<>FJh|>o{+U^Mp$5 zG1S1 `i8UDu&VSB=Bw!f6WG8?dI##QY< z-=EZu=y_aoc*CINzH$%EZ+ptllo$J^<6$-g^}x`iGKFQdj?6H<6#L5A2%Dnh1-i(s z^_k>JW)58gTSlxzt+e`VQWRF>{2`L4h8o@#DN zJ8Yi$JgIzpY8O_TN@4FiUW(&fx0v}gZU(Z65B4`zM>>C$xk0_PTeNr|t^OoWNUu;` z;-~qI52MOx%RMu}-GmaC9lNDnqC3z}QFkZl>Suamm4r(CLn+UkwB#@i(P?Z !~0@d*SV*l?U<43dcPakJ@YOQ!2vk zr3#rPz9{p48W|ePtil%f8pk#@7Lb$bG`2j_a U^d@6XyJrs6$2BZg?$@M*I)`3soh#1k5y9AK%3!+Jkc3jTB8Y-R)Zs z*+vkUbV8lahx<#y@3Rd !Cy6hb+yUV|BGU-gXjfBwqEK $JppHiQP=1%}el`a>!Uf>{WjCZ?r$qW>RPE zV};Sauly#x0e+S2z`Essw9oLWzSwYMuaa9D+qwU->AqTWFCu|?V)t`Hv7hGWoP$-D zFYEK{qEP|G!Ffg1VQqAPdWrW#tm`U&s4z!l$uev ugiy^u?JKz>&iYFJ<|J4;V;kB| -rNV9ER5RG zR~=q;FuTxm#GjQoTU@L^K>v^(!C9l3?o_J!WJh;+T6V>t_2tM`N?TfyzS;fC=$ggS zG&Dh~YwAB+<%6IJc*qmVL-{vl3>^-WZT KgSscv@T&c5^+%!i|6N zl}cjGrvBPcXH(oWTz4T-L-*0(ag&@k3RRCAhxUesz{5$s+_%YD_|rfo*d6XsW;%9RW>V)&H}X^& z2S;EE{oUAa HQFRlnKk%)cP|viZDwkt=X6d !GRU-apda(MqIaV2*wMoNCAZ~t$EN&os B?}@)W9G0JEbOJA>1a1#qFPKlJ!7hQ9pcmDdU0HjH zLYb;gKX!uhm1&e&iW!a_B3Dx%iauGqR4K4h?ZEE}0vl(4nzaSX14s3X&RMP-VhJA& z5~6ZdH)PGHf3$C?_EuU~w8q|sipXDyTE^al>A_oMBX=AznrNrnnUNL-M!MGIp0aL} zrUs5GZ%k%I6_eigi}eE0mpvp$+SY)Nft4v)+zDwOIVfcvEmCy?&!Hr*B(4#s*m_JZ zY=J(4-oQi(!WUGj#8PSqY==vYaN%Fp;(H;TfelSfa~PSfJ_bw8TnS`5#9a _uH_T{LM6ci5kd zmpYZwy)aB~U|3B)+jVsg$Yz~Vk?W)!p^sqWiGj%;wVQIqp36PK%COx^DjV4#49tN2 zl;7!tOl`T)E{Ju3m7XS#&`x6KiAdUXrLw~$PB<60J22LtS!*pC#r>mwGFQ1TptP`% zZsYo2_8KrH*u?0?+CYicmKp16VZY-@B)XCe!C-BSalyrG8Q3!AfPID%i8|9ZzYY7q zuQARVq|q5BdwU9FNGCa3z97fIKd8F}i^%eP0beG*EOyn~A`vI<^6Ov<*nr&hIJ~o? zvHydh`o58mO&9oO|G#oi$3=s&jF1d|m9QZ84DA z=#%`wB(5yAW8gAx0rA@ZKr=dxy6qT{RSr82eh-XMPkDc1oS+su&(Bv3(W|D>4MKls zP0=kXlHMwQx~lX)`7v|YTVJo?ZmUnJJkqxVz2M3zfS>8eVIN|@6aSH`)kf$ZIX8&8 z^Qf+I)rqcRHT9b%CNz+^4Sr(}8TW~wQI#D%y=~&3qkox%U>>aC`{Hk3G_a&^Tw^es z8>yF~MLvr9Pw&RG+_(UZ^L-Tm0gbW6L soxFpY_P*@GBWhFIpC%(XoqtMS z0T0Ltv@7&5>7vrmx0_oWJP4*r|4TcLmIU|X1u$Qjvn8OtAfB5(?y~&6sIgoj)<%4z zKV)o))&2dzbU#fl_pwFs?0WfxW1{pwdP;tI`%Tc!I0Q7J3uRZ%iFaM)nM`toKi)Qj zXiSyBYt$pDKDC}2;8hEzn?&2L%pGH?rW?blLM)uw&u*r>S;Jv-o+_z`UMSBX!FpgB zuz~G_&-8WF@2Jo4E2fSckB;k2slExzO|_Nb=W_q>t7HF=x%`V{FKuw#Y?9^Mz%A^r zd5qSSj-UltUubVJZ}Qb13$xTko^*e{G&1nOd hXk_k@r$0m%2b+A^% zoxm!r46)vO3pRBJ$#Tq3vWagHtc(xD6kk5OPk*PB2a&SZ-U|F`chU3VCc3Qrg<8+a zXn?WCM`}M4?&7s54>)2pvYwTr9b+ux=!$SYI^wAn{GF(RWT}Yk0~7fp{K9hQOnq_~ zIg&YGa)5df)ttlqiBJ}J*fg{X3EoEBp9;^eun(rM%XnN<;xWT(Hla7X3gegtbTxjt z8l~;FSM^O|dJ4~(4JJvsBC11YCEU_CV3Q43u$6QWD+YyB2D3yx9y;#sLB|%})$iE< z#V?~1ERKipZ&bAQ3v`*Q%yxg!|JB;q(j}CwMua@J8E`Qbl$L>V err@gft3(=~O`hBWeTqqQY0aaw*Qm0P z>kkL_{UrY$t#k8)nafi5!9#K{<30I`Z%8d9nyDKCb-n+>o@$}_ZhMfTIo0xK Eb0 z=&)lucw$k>CBzukFNLvA>TB>Onui8@2dW6KMkec39HrI4=vLtsaw1=i*bum)T;oP5 z_26XYC45eN2%N$b$X?Vnl<4S5CYj%56YDu9UoEdMc2?$Z@ET|u3@^$wf ut_Z*{`LRiFIxAEF7uteR2ng-ALYw~X`v$=z)oY%)qr6B4Luf;9pf1qo8 zT_(f4l~$1(@mpLs&HjziuEoC9z6t7OCWI=;$>w|iB^bs(;OBcvi?8Io#P*?Zwx**i zBh# <9ap`_+zcvkv;$=9UPMmdGyHW2mMRze${f|rfEN*N^i?y1$RQ?aw+ z1EZ4v9!Tc~<2+r~)D4H59%7la2+z=c*p6y#W(ay11L<&jAuy6g`@T`hWH 1R4u;#Ql9{=e2_;{)tQF&a2v^9P;8rd-#z6t=$DkD z?d7X8VXlA+V*~2QVpru#>Nw-3GL}lstHG8w=J=ZW<{_WDm7EtCoVe6Ck+g`BYC8SF z(_G2&x4|pNSFDw4P4UM{rhA!vn!=ha_2E=4d9=~Uwwr0lmxh_1v_J!QPgss~YKf51 z!lYZ)i$-bk6<43_z^?#~;0Vyp^nI=J7pr()AFY1PiqaweCjLtQomsE(bOXbK)28G3 z43=TEB^xS1yp9?J#-nwi-E>m!2>zn%4;>|^imfb1(JJkR+?Cm3gLwxqRW2Xepw+o k%$STfcZjc`mtP> znnwn-c?z!A2%T1TSXAS_(!?l-5;Wah15!mh_eT)I9_m74h0!w53zg`Nh1yCBxf?rG z=w*x%`YSPxA4Lm=1x!5!Lod12xm%QYqLjTy{1;RPy;)zV$V6Ss+3cChNv*RevB!z= z@IP^o5v~ml#=$w#CGgD^ql|}N9Q*Bz-iX#g0}K&kQDt^7#`{k(M@(|sG;M0hW}-dQ zK4`#Ia(l+=ILM#3@>Dv#kZQpvqW$1V&Q@s#|0!i&@-MtydoI^^ PKoZ5GCCoj=WHS@=kpO{{es&MC)N~niPMEDy_BFaLS=Ad5+ zkHzi$Y}*b06< Qb}fm=?#AD zI;F<*CFU-ZsWMCpt+(sXl4%wQ{sV_%_iNRt!`?48OkKb )@G3K4U0Sw6xn90mr zRK%Pmx|*E4 EuG zMX38?DctVeBi1Y#M;E{j!noqq(tzM~GexymX=8s&)i*v$OSR^4myNY_DMuTVzOo%I z!CML6j9b R|IT*ACWbciJrqowz;uBblvhxVIjAQv*FLs32t!+>Gp5QO zLB|?{OlNGBq9gPn=Ck 0uE7K^-D~Nw9M!v?v|>lCrr1_5^@B%hI~-r zKl&UzYgB-B(M7BRK7QM+q=A}Ci}t?L&5R{oNm?AcLW@wha5IP(fy+uO#~{kh8&Z4x zao}tmpZpJ9Stpa0F_5Wl5=}-%Rn{v>mDT!=!;TqvDU&`oQ29k$Wj}4IN%!oXg&X7y zgxpQBFnk)3X~arS{vAC}N%Y6_!; 1uSHQ_VzDRnq-qtni;u*E zTl?@~auePu510Pka=^VlYMxYVzbq{Q*ZDq0Rh2N4o6v>HwwHxtO@3!ws2K P>Apn7_sBo}e!>@kTgS1tj8zN&4u-F5(=%Wa2bd7Vg%TD~(_m z{DqdUB}d-IJFp&9kJ-sa@ORV`3GJni2?S132p4q2oDtJ%KFLjl|nby)OGpjR1TkX&T zqR%9ZL6IauS25nqzjilM&b`dpT)OtfT@NkhO7nZDc+|@0p|&vhg2(VSY*Vq9_D268 zHWRz}YJfi48a6ht7ENP=MwbmeleZ9Gh-`<`SSB4KGW8mKJZew2HY&m!uqVwrJ%;%Y zVaqdx*uQXwNhlm3TY`T6bHZmlgW4V6SE|j_k}8l(6MDg|((hubV;=J_xdrOrJDrP% z)G_QxlY~Km_b?)5n{P6MspXk#XmP@XP-%+QI-!sL7G~2 a zMXf#c1>4G->?%qD&7y~Lj@os=h}f(C=P}iU(|j3PvGp~{hk!ZZueaszTH(epqn#FA zb2)4Y``YZD38 yc+T9lPMXB?E0)!cvJgR4KY+be4tfS^BZ{XncXcR@ zlKOdExD-q`8c5T`Yt}_tAJDk4sp&||FqOb7k^idMbYD6X6w9kkt@)*P#}m)E!K ==F`UVLk+B`4%=6(gC@aP^%tT)(v=GS2ij@h3g|a;#pi5g93gih zeww%t80z{};GCoQJf;d?URX~avtM?^;X8v9u)BeU{sqc%a5f=CSBJ}jPkpoL6lEg4 z81;_d?!5~p6I~!4Z6ohjpT)kEZqYS~?^FQpW$BDY{Kr5cVCAtwYG8CAT7P19!%pIP z-#F**