From 2e35e50ecc6bf27c3ab31e37e088e398ff5ffe4e Mon Sep 17 00:00:00 2001 From: timo Date: Wed, 15 Dec 2021 12:40:02 +0100 Subject: [PATCH] Readme update --- Readme.md | 26 +++++++++++++---- Tables.ipynb | 5 ++-- Visual_Feature_Engineering.ipynb | 26 ++++++++--------- datasets/coco_wrapper.py | 2 +- datasets/pascal_zeroshot.py | 6 ++-- experiment_setup.py | 3 +- models/clipseg.py | 46 ++++++++++++++++++++++++------- overview.png | Bin 0 -> 34634 bytes weights/rd16-uni.pth | 4 +-- 9 files changed, 81 insertions(+), 37 deletions(-) create mode 100755 overview.png mode change 100755 => 100644 weights/rd16-uni.pth diff --git a/Readme.md b/Readme.md index 9d4e7e4..0b61a23 100755 --- a/Readme.md +++ b/Readme.md @@ -1,10 +1,11 @@ # Image Segmentation Using Text and Image Prompts This repository contains the code used in the paper "Image Segmentation Using Text and Image Prompts". +drawing -### Dependencies -This code base depends on pytorch, torchvision and clip (`pip install git+https://github.com/openai/CLIP.git`). -Additional dependencies are hidden for double blind review. +The systems allows to create segmentation models without training based on: +- An arbitrary text query +- Or an image with a mask highlighting stuff or an object. ### Quick Start @@ -13,6 +14,11 @@ It can also be used interactively using [MyBinder](https://mybinder.org/v2/gh/ti (please note that the VM does not use a GPU, thus inference takes a few seconds). +### Dependencies +This code base depends on pytorch, torchvision and clip (`pip install git+https://github.com/openai/CLIP.git`). +Additional dependencies are hidden for double blind review. + + ### Datasets * `PhraseCut` and `PhraseCutPlus`: Referring expression dataset @@ -33,8 +39,8 @@ For some of the datasets third party dependencies are required. Run the followin `git clone https://github.com/juhongm999/hsnet.git` ### Weights -CLIPSeg-rd64, CLIPSeg-rd16 - +- [CLIPSeg-D64](https://github.com/timojl/clipseg/raw/master/weights/rd64-uni.pth) (4.1MB, without CLIP weights) +- [CLIPSeg-D16](https://github.com/timojl/clipseg/raw/master/weights/rd16-uni.pth) ### Training @@ -45,3 +51,13 @@ See the experiment folder for yaml definitions of the training configurations. T In order to use the dataset and model wrappers for PFENet, the PFENet repository needs to be cloned to the root folder. `git clone https://github.com/Jia-Research-Lab/PFENet.git ` +### Citation + +``` +@article{lueddecke21 + title={Image Segmentation Using Text and Image Prompts}, + author={Timo Lüddecke and Alexander Ecker}, + journal={...}, + year={2021} +} +``` diff --git a/Tables.ipynb b/Tables.ipynb index cef2a81..4799d46 100755 --- a/Tables.ipynb +++ b/Tables.ipynb @@ -327,8 +327,9 @@ "hash": "800ed241f7db2bd3aa6942aa3be6809cdb30ee6b0a9e773dfecfa9fef1f4c586" }, "kernelspec": { - "display_name": "Python 3.8.8 64-bit ('env2': conda)", - "name": "python3" + "display_name": "env2", + "language": "python", + "name": "env2" }, "language_info": { "codemirror_mode": { diff --git a/Visual_Feature_Engineering.ipynb b/Visual_Feature_Engineering.ipynb index f51de7f..23c108c 100755 --- a/Visual_Feature_Engineering.ipynb +++ b/Visual_Feature_Engineering.ipynb @@ -174,23 +174,23 @@ "outputs": [], "source": [ "preprocessing_functions = [\n", - " ['clip mask CLS L11', lambda x: {'x_inp': x[1].cuda(), 'mask': (11, 'cls_token', x[2].cuda())}],\n", - " ['clip mask CLS all', lambda x: {'x_inp': x[1].cuda(), 'mask': ('all', 'cls_token', x[2].cuda())}],\n", - " ['clip mask all all', lambda x: {'x_inp': x[1].cuda(), 'mask': ('all', 'all', x[2].cuda())}],\n", - " ['colorize object red', partial(img_preprocess, colorize=True)],\n", - " ['add red outline', partial(img_preprocess, outline=True)],\n", + "# ['clip mask CLS L11', lambda x: {'x_inp': x[1].cuda(), 'mask': (11, 'cls_token', x[2].cuda())}],\n", + "# ['clip mask CLS all', lambda x: {'x_inp': x[1].cuda(), 'mask': ('all', 'cls_token', x[2].cuda())}],\n", + "# ['clip mask all all', lambda x: {'x_inp': x[1].cuda(), 'mask': ('all', 'all', x[2].cuda())}],\n", + "# ['colorize object red', partial(img_preprocess, colorize=True)],\n", + "# ['add red outline', partial(img_preprocess, outline=True)],\n", " \n", - " ['BG brightness 50%', partial(img_preprocess, bg_fac=0.5)],\n", - " ['BG brightness 10%', partial(img_preprocess, bg_fac=0.1)],\n", - " ['BG brightness 0%', partial(img_preprocess, bg_fac=0.0)],\n", - " ['BG blur', partial(img_preprocess, blur=3)],\n", - " ['BG blur & intensity 10%', partial(img_preprocess, blur=3, bg_fac=0.1)],\n", + "# ['BG brightness 50%', partial(img_preprocess, bg_fac=0.5)],\n", + "# ['BG brightness 10%', partial(img_preprocess, bg_fac=0.1)],\n", + "# ['BG brightness 0%', partial(img_preprocess, bg_fac=0.0)],\n", + "# ['BG blur', partial(img_preprocess, blur=3)],\n", + "# ['BG blur & intensity 10%', partial(img_preprocess, blur=3, bg_fac=0.1)],\n", " \n", - " ['crop large context', partial(img_preprocess, center_context=0.5)],\n", - " ['crop small context', partial(img_preprocess, center_context=0.1)],\n", + "# ['crop large context', partial(img_preprocess, center_context=0.5)],\n", + "# ['crop small context', partial(img_preprocess, center_context=0.1)],\n", " ['crop & background blur', partial(img_preprocess, blur=3, center_context=0.5)],\n", " ['crop & intensity 10%', partial(img_preprocess, blur=3, bg_fac=0.1)],\n", - " ['crop & background blur & intensity 10%', partial(img_preprocess, blur=3, center_context=0.1, bg_fac=0.1)],\n", + "# ['crop & background blur & intensity 10%', partial(img_preprocess, blur=3, center_context=0.1, bg_fac=0.1)],\n", "]\n", "\n", "preprocessing_functions = preprocessing_functions\n", diff --git a/datasets/coco_wrapper.py b/datasets/coco_wrapper.py index 9b94e96..f88d98b 100755 --- a/datasets/coco_wrapper.py +++ b/datasets/coco_wrapper.py @@ -51,7 +51,7 @@ def build_img_metadata_classwise(self): transforms.Normalize(mean, std) ]) - self.coco = DatasetCOCO('/user/tluedde/datasets/COCO-20i/', fold, transform, split, 1, False) + self.coco = DatasetCOCO(expanduser('~/datasets/COCO-20i/'), fold, transform, split, 1, False) self.all_classes = [self.coco.class_ids] self.coco.base_path = join(expanduser('~/datasets/COCO-20i')) diff --git a/datasets/pascal_zeroshot.py b/datasets/pascal_zeroshot.py index d2d83be..f30e6a8 100755 --- a/datasets/pascal_zeroshot.py +++ b/datasets/pascal_zeroshot.py @@ -7,9 +7,9 @@ from general_utils import log from torchvision import transforms -PASCAL_VOC_CLASSES_ZS = [['cattle.n.01', 'motorcycle.n.01'], ['aeroplane.n.01', 'sofa.n.01'], - ['cat.n.01', 'television.n.03'], ['train.n.01', 'bottle.n.01'], - ['chair.n.01', 'pot_plant.n.01']] +# PASCAL_VOC_CLASSES_ZS = [['cattle.n.01', 'motorcycle.n.01'], ['aeroplane.n.01', 'sofa.n.01'], +# ['cat.n.01', 'television.n.03'], ['train.n.01', 'bottle.n.01'], +# ['chair.n.01', 'pot_plant.n.01']] class PascalZeroShot(object): diff --git a/experiment_setup.py b/experiment_setup.py index b871532..6bc5b0b 100755 --- a/experiment_setup.py +++ b/experiment_setup.py @@ -337,7 +337,7 @@ def score(config, train_checkpoint_id, train_config): metric_args['resize_to'] = config.resize_to if 'sigmoid' in config: - metric_args['sigmoid'] = config.sigmoid + metric_args['sigmoid'] = config.sigmoid if 'custom_threshold' in config: metric_args['custom_threshold'] = config.custom_threshold @@ -449,6 +449,7 @@ def score(config, train_checkpoint_id, train_config): only_visual = config.only_visual is not None and config.only_visual with_visual = config.with_visual is not None and config.with_visual + dataset = PhraseCut('test', image_size=train_config.image_size, mask=config.mask, diff --git a/models/clipseg.py b/models/clipseg.py index e47f90b..a4640b3 100755 --- a/models/clipseg.py +++ b/models/clipseg.py @@ -106,7 +106,7 @@ def forward_multihead_attention(x, b, with_aff=False, attn_mask=None): class CLIPDenseBase(nn.Module): - def __init__(self, version, reduce_cond, reduce_dim, prompt): + def __init__(self, version, reduce_cond, reduce_dim, prompt, n_tokens): super().__init__() import clip @@ -115,6 +115,9 @@ def __init__(self, version, reduce_cond, reduce_dim, prompt): self.clip_model, _ = clip.load(version, device='cpu', jit=False) self.model = self.clip_model.visual + # if not None, scale conv weights such that we obtain n_tokens. + self.n_tokens = n_tokens + for p in self.clip_model.parameters(): p.requires_grad_(False) @@ -150,8 +153,18 @@ def rescaled_pos_emb(self, new_size): def visual_forward(self, x_inp, extract_layers=(), skip=False, mask=None): + with torch.no_grad(): - x = self.model.conv1(x_inp) # shape = [*, width, grid, grid] + + inp_size = x_inp.shape[2:] + + if self.n_tokens is not None: + stride2 = x_inp.shape[2] // self.n_tokens + conv_weight2 = nnf.interpolate(self.model.conv1.weight, (stride2, stride2), mode='bilinear', align_corners=True) + x = nnf.conv2d(x_inp, conv_weight2, bias=self.model.conv1.bias, stride=stride2, dilation=self.model.conv1.dilation) + else: + x = self.model.conv1(x_inp) # shape = [*, width, grid, grid] + x = x.reshape(x.shape[0], x.shape[1], -1) # shape = [*, width, grid ** 2] x = x.permute(0, 2, 1) # shape = [*, grid ** 2, width] @@ -189,6 +202,10 @@ def visual_forward(self, x_inp, extract_layers=(), skip=False, mask=None): if i in extract_layers: affinities += [aff_per_head] + + #if self.n_tokens is not None: + # activations += [nnf.interpolate(x, inp_size, mode='bilinear', align_corners=True)] + #else: activations += [x] if len(extract_layers) > 0 and i == max(extract_layers) and skip: @@ -283,16 +300,16 @@ class CLIPDensePredT(CLIPDenseBase): def __init__(self, version='ViT-B/32', extract_layers=(3, 6, 9), cond_layer=0, reduce_dim=128, n_heads=4, prompt='fixed', extra_blocks=0, reduce_cond=None, fix_shift=False, learn_trans_conv_only=False, limit_to_clip_only=False, upsample=False, - add_calibration=False, rev_actionvations=False, process_cond=None, not_pretrained=False): + add_calibration=False, rev_activations=False, trans_conv=None, n_tokens=None): - super().__init__(version, reduce_cond, reduce_dim, prompt) + super().__init__(version, reduce_cond, reduce_dim, prompt, n_tokens) # device = 'cpu' self.extract_layers = extract_layers self.cond_layer = cond_layer self.limit_to_clip_only = limit_to_clip_only self.process_cond = None - self.rev_activations = None + self.rev_activations = rev_activations depth = len(extract_layers) @@ -314,7 +331,12 @@ def __init__(self, version='ViT-B/32', extract_layers=(3, 6, 9), cond_layer=0, r else: self.shift_vector = None - trans_conv_ks = {'ViT-B/32': (32, 32), 'ViT-B/16': (16, 16)}[version] + if trans_conv is None: + trans_conv_ks = {'ViT-B/32': (32, 32), 'ViT-B/16': (16, 16)}[version] + else: + # explicitly define transposed conv kernel size + trans_conv_ks = (trans_conv, trans_conv) + self.trans_conv = nn.ConvTranspose2d(reduce_dim, 1, trans_conv_ks, stride=trans_conv_ks) assert len(self.extract_layers) == depth @@ -382,8 +404,12 @@ def forward(self, inp_image, conditional=None, return_features=False, mask=None) size = int(math.sqrt(a.shape[2])) a = a.view(bs, a.shape[1], size, size) + a = self.trans_conv(a) + if self.n_tokens is not None: + a = nnf.interpolate(a, x_inp.shape[2:], mode='bilinear', align_corners=True) + if self.upsample_proj is not None: a = self.upsample_proj(a) a = nnf.interpolate(a, x_inp.shape[2:], mode='bilinear') @@ -399,13 +425,13 @@ class CLIPDensePredTMasked(CLIPDensePredT): def __init__(self, version='ViT-B/32', extract_layers=(3, 6, 9), cond_layer=0, reduce_dim=128, n_heads=4, prompt='fixed', extra_blocks=0, reduce_cond=None, fix_shift=False, learn_trans_conv_only=False, - refine=None, limit_to_clip_only=False, upsample=False, add_calibration=False, process_cond=None): + refine=None, limit_to_clip_only=False, upsample=False, add_calibration=False, n_tokens=None): super().__init__(version=version, extract_layers=extract_layers, cond_layer=cond_layer, reduce_dim=reduce_dim, n_heads=n_heads, prompt=prompt, extra_blocks=extra_blocks, reduce_cond=reduce_cond, fix_shift=fix_shift, learn_trans_conv_only=learn_trans_conv_only, limit_to_clip_only=limit_to_clip_only, upsample=upsample, add_calibration=add_calibration, - process_cond=process_cond) + n_tokens=n_tokens) def visual_forward_masked(self, img_s, seg_s): return super().visual_forward(img_s, mask=('all', 'cls_token', seg_s)) @@ -428,9 +454,9 @@ class CLIPDenseBaseline(CLIPDenseBase): def __init__(self, version='ViT-B/32', cond_layer=0, extract_layer=9, reduce_dim=128, reduce2_dim=None, prompt='fixed', - reduce_cond=None, limit_to_clip_only=False): + reduce_cond=None, limit_to_clip_only=False, n_tokens=None): - super().__init__(version, reduce_cond, reduce_dim, prompt) + super().__init__(version, reduce_cond, reduce_dim, prompt, n_tokens) device = 'cpu' # self.cond_layer = cond_layer diff --git a/overview.png b/overview.png new file mode 100755 index 0000000000000000000000000000000000000000..f8bacf5d241d9e42a838d0d5b401ed922a2612aa GIT binary patch literal 34634 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
    k8yvxu@6-z)Z@0%0end|fVOr*UER6uD-j z=cZI_0#1w>+7)yo%94RE7JM+A$0fLRnX^~rm{^OiAnH7%E9G>=#L?2Kiw9`|l7ND# zKWkZVxgZ7d`VTLq22f){>p>|v@6tI31Cz*e0GXqiGJ$jyqOupB0=gZLpBF9wZe?_0 zA}lM51`q{~D-4J-fZxIQw)M61RD0c97trxZxC#2ag#|RHyw*eKym-_F?njSti5Z5#h;yDKh_Lm%|){djtB|;8k9{Vo;W@ZVKYJyeL*n zc{N|o&nUYn9Q$3QM4k(<bPFOBmI|~aH=E~$G$rgCxCg$cS zJvskYvl?;7k#6gQ{3}uq*ufiLt2IRwA_m2%*H|+p=k(XY8#iNt>^8%idxoa31asC@ zBL^$Se*AElwTLw9iBVm2OM;Y^a+`i7*u=uPME<|sI8g~#WswKeJp5d!UHtm{?%Jxs&ED90AJl!MV(^Ano?JvR?mj3t)XaQYazvF>uMN`VPEi}J z(d;x6aot?#ODs{hVt+U1yfEkUebIe+ zZ-|;OkO|=Q{0X?14H?YFYO8bF5ET{R-(XDXYj`qnIq3UL!|f0?6XErx2;4d<#!o-n za)-2dP^UtUys!{<%gNc5lztp$ny{{w>Xq--U1YRpY^^i#0%ho&2b4y+S2Xf_zlFTl z50gryB~xLQT4_5EJUD11Gne@qq`0~|dE_*EV8Mz<|1HJdSfohRxXp>XJ>c=Fb`PX$ zhPD)lmhCp?RS)GqEM0M`H5Szpsnm4LQ+UYOcSVrvjW!)HfrNmHe`aC%Vk1WT>vzIY znmjYwRA68g>Z#M`$)JS*IrNyzS$V2Sd(x(|!1`It>}<7EuL3k_e8Z?a;j3z86Kz@B zJu;U(q+CP^V5;V&B`fWW;x^5&55iK&uj)?oOj$SoYk%A#3+4U(l@8mPhkI#qzM0-K z3%zEC83$fRuL@Jz&ui>$nK@B)J{l7k(x7_qAhm>-udhyO;AJt`2o_**z?w5UGap^h zA}aHi8Fai(SV2omIP$7f3swtQK;CEzi@l!(oZ0@^AA~ zVvO+*R0y8OH3^CketJM8&Dml3CN%s~aSnN;CE+kzU3HoihK{8+wq>viA;VkogCauJ zN2*EMO7CLiuJ7Nk4=TE*U-ago1MN3$-ahB#5 zt9OnJy5b&A&Kmus`19+ab<%Rg_4_wzgte^GM|1Icm1qMw!&wRb)dNku=Sn^}b%JHS zCF8_pbq~~M)#8tLRLm7}gI>g;Xw+rjm(*lTi9XM)nc`i|KtNPVj@*vly8iQO)T~W5E|og-W|aa1c4X3FXhEYW+w= z_2tx%aj~(Hoj0nmqPGI`bv!qC$j2OK5|&k>^QWqHuX_oK;vn4E=}<#7%vtWi1BPN> z$$qUU)nrKgPzpQH-RqFVL3l`Gs1k(I*Av;LSQHY6{QY~Q%8+mMp#M<*)_k>0!_UEY zhBW%5VvSgq(;J+R*W#o_L`5Sl3bm>;U!#OZ69{+PY38f*%y0dw`j~$7_(MC7u&&Fk zx_!~ZnFJ|y8H{pO34=<+TEQBvIkQ@S_2(40mM)Ea+w%#=G`yB@A2Z?p z>u*O~*hF^0v?Rs#Qd$`tjHn^%hWj<`T@QZV;~t_QvU|**eib-iuU?j!G`kuj&j5f) z$lKJ(l7Uk(@3F#Te7;F!*RO(yvoDygav3fP$Wzfwwdw;kwIYFZmF}!^?ejhj#msmo z0Qx_jjL42QU8P_5W&LZ@(3Tu5(PX6v1wMs5joqeIJHbd<`XGd8%%eM;H0eVfl6-u0 zG}w@pnxIygpp*{@Dcw7@%UNBYc{Pi*-&VWtB*Xjn83|(KYrl8*yl72DaOV5P9gy5T6SdzXgi&rSQsE;QL1-#wIf@>iRq{yNPZv9PcR4L79Y;RuG=-bbm6T)sXp?q!3K;YQ1;?ND?9Ret{R@$q^AauQk~K ztNi+-y^4y;o3*`*KpXp%)ePtsB4jb(kdcwOP{7Ddf_w48yh|hNL--&uF)>^|?@K$N zl5w{1aRJxCR>KQz3{v%NT2hW3NwRWOxI^A-W#C+%^0=gR4jssnOs$Y8bvGLOOu}wu1nF<>fXcSaB*Bg7j3@m4KaCq3 z#4stFE&I4Zl5YS8eJXXHKB)*`*==f*8ONCui=A>R{DOd$b-Yta`|2V2HRg}968|bdi&2;c^l=;)O#XFLo5!f|M zN7J%*fBnh`$t^m$4{3u6eq6<=Ye1yCDh!;Yv{kjI9Ah6lo<`?~W~!}Ic}<=euxHwk z+O^NUyLkOSSOC*(mZ25yueCEyHU20=3+eJY=PdBC3VJQzBG{9O$YTj*g=m9Pp8q5D zvttiCsDpVu`^{2+d+}{ke++D>c+cjWjEjTt*C>(dwdCX0nKypX_u5JBC3&AUf8~^6 z#fafGPY%?s50ylA+^leT3H<_Dd|K`phCc#9LcP6RqP6a`X}G$+&U*RyxVo zLuq3%I)ouOBrPKyuI#^?oGcr3wGX1blD0JV;;7x1WPLG<=1TC>*h8v0! z4nQ$DvoWKVBd+|xKBl{ZF)MaeC~(n|E~tV>iPX;itoE(>r$3xDafM|P>y{s!(+eM- zw2-XlQxd~&QuBNgLX{2PLL2CC~_E{#)v_`Y2x zvRjc=kf*(ZF=%2U6qq7^1qbmEE2G~1e*ToG`H&%E`r{k}$84TLFRFQ!xjNFhVV+^J z5#1)Aay%mo7#FlwZkz9p9=0g-+2P*X{?cx=+W58o*3LA|uHQEG<^BD`aPh^lP5pe6 zKUDCY%?8i>8B9^VM~`)%-)t6p@?$IHa=bTdRLbtA8ZvK`^#DmE6hP=lXKAbb!~O8(`yL2{c3Y37uHEgUzlMkdU~ghW)R6^58r zK8NG2Iq0@fIQp!E;pny`w1UKgM|a*sb_AsQ%xGOx{ws(4j_GS@8SJ%$3LjW`2domT z>_1;FoyhOjM)xl7>&2htWMO9b`vax(@oTJmQV45IE7QuRa94XHN|4=1|8Y%=hgNB= zEk7$BS}BHk1SsRJHrAP|+Omkw&cPI!M0nZ6bbs%nCq+ztY_BU5-QYh>V);Fc)ucIr7vA#_7^-$w0HzkoeiD-s2yq)MN%hnLx#PGq z`~y}Lo{^|WQ~2MfFWyT_aXpMy z`Qj0Hj{x&tnTtS>&D5#{HV)!1WIK?iw^w*tlun;<#?Y!n71NTKJ^jGm>%L9IFnR%# z&TMhzuxJ?6j!rYmgP+fKO1OVqBpo+nj{`>2|VnmUZudf;_kB$xO0NlMDybZw#!(ir9Az2ei7Oc%&%MU;_P_ddLE zCSyi5(~p=k9C>aWSEUWr>=^t}4&E0h_q|TE{)c>he)5XFdY#8~dMY)x_ze)@(L5^x z%-^_Gf+{vE9le+tig#KY=LObq1xxw8(_K^j)z+%ClDvrQPLt?S?sJ1e%Jd20-$u&5 zV~WzmX`K~cPLs+OIy1i8ymw70X#SvFLI;ByH|#ybS6fjS5{DxL8>6p^Mg+Jxb+3H* zM;~qzySER7!CgvUh4UMvp3=wrxe8&l!;}xE{fZ;uIAU&QJ5|2171~_N!O?v55W}Q6 zn+pfAf;lVJpkQ3pJIky8@|p2~oQwW}-UbD8w>zobRWOIwTXtv+9I1s#v#9fkU? z;Rptf>K5w zWk;C(>Q}!aAF)kyiF>u90hVz~Q37U*ZxN|ov&{Vrw){G`@k}WIjvC4qT_m#Wz))5B z$ciCuULPs`zDuoey3{^F!;K8FkrX#Wz zY21wNG-LUdmCG0|fbzLqyOPCOZBw(*P^UV-7;D0kY~C>afW1@fy6^i1k=I8yb8~#3 zZTzHb&#o&6(wS>6ptXFkgfD>6E;>$5-ADe;(*-sag(0TKF%3UUw*0viJuklh`ruIT)JVM{XJ+SKhs^ zf8go6zpg*IneNm$=-OAxSc_Y`KRdtKX65(Z)NaFPoBCPXHz7xkgxDEqheohRcDf?s zyFeP(QM{BMK|RJo8QztA;GHaysBHmm1wkco6a{V2DhFyjN>VlNN*%4W9%AOeNdboo zy>!?pZjO#>fI_m3DMZBMQmW7P5K`YvFnOh~7-WeJhBpTF6-+zw>(}C?_DJo%b!S8OWGFI=sf2E~wiVQB)k-NJ`3rk{MttG$ zFMlCb>kqS$fa9|h&+7cq1H~Yv8r*9fawwRYTgzNK{w7>B=sXKtR z8}jxkkWOHkn3(tg5C^i(Nbofi6DlnUAV7kG{~#}X-K za6+0#_|5Be_pf-OcSg#!SAc1@vYD2n+nkp+vF{UP@c^5N7_ayD`LdlrpmpyCYGKR^ za^A$dK6m9L(L)55((GTUb7`SKnm&=|!ps|ZxAi`zoeINn-5ulPdOk06DEO$qta*F)#AWT{? z8NTe^8KJYqJeNt|-9oVF!45`Pt*-UPeKOeb@HzOKJ$_<9!8JsWx*T#(LuGB~rJgnd z`|{-rMX7G}AWuF(va4;@={zTF&407oF|r;#8w)krN>1#bVrEoIY4My2{$r-Q41!In zE^r0GH*{l3|;pU)GqlN0~p`0r`(&dXAC_ca+; z)EM%@4iT+Y|9|~hi?^S`Wu%lc1$4b`{-@%8he;<_OLfcpDHsy_U~^4R7Dab%2*C@| zHkKn?pn{TuJWMDo4`WCVx!Fv920ZfX+uPl70s9QE?zrWCIbr}Qh$ah? z@Y=coECtoxJEpH7UtU_kpMq%p1O_pVET{r#^%amu+jDv~ZQmE$UvBQ9QE*I>U68nM zI4RCCc?q_zpWU0m4T}x9bl4~BgkWJ@1ZMV+=n1~=yVEV{_5~ANDg-tb1Kh1wfiC+F zke_QN_<;}AN8S!mvBGyEEF53&iFpEUcnKoCBvhGDhRl) z0!?b#0)UTheyQu*M5(eby0%wg*|E+OLW{dJ=@b2JlwVWt-a=DjyFw%IZ0 z^l!hT@7=dfe_(TaWMPU*GNNX+)bJGQSD%PrT)S|z6xiwDX42?FooYLrpTu65a+Ibl zhvn<;PW1WF4e$U!cFYY5ihhS3)_n?7S$e{19B~+{#J)GnyWyR074?!=JBF8c!HTu< z7l+XVYu0KtAUlRUs{6eo2vJW@k9F^*g5eaN{dUdsDH1alm3^NPz}PR!5>uf94A&`a zztFLOMc+-Xp`-KXX%i{O`=#XL2K(%b8rLO>S5QhNa>Tseuz9|e9wQUnEx2KTX$4dacn6YnhOD-!-C5dq zzlqn+I6c0V0cJMs6#&LvC^!-V9b`~>;BzUAjBR>;q zWdD%W_xVxML4YFiH!gyKj%9SLsxli2A?QO79&XKqK!(auNiPdpH^l+}nl#CyU}0OC3MS3wYf@{kI;K`N zc2slcO4Txb{t*zk5QJ{Tycr0>Y(YS@-kvyx$1E0rwaZX9XfU$RS{nEgbj$REAZLm1 zatIvV1V?ExI9vi=;KjH5&smJshM+RSIqg`-U7glY+wjsp2-q;DIWCAyDiqP6rxe<%l z+Di>&V8F@!QL58B#=Mn(zj>bQ+&W{q-gZFL6L64WDShiyo3FCtEHPJPf0(YDDmuET z|C9lnWLa#Bhhk?sEBEI04t-w7si~<~OSQJ@i?7z$Py$#L7?4!7JL_1PJkdLt7Z#%9 z=P^fLhbwsOeUAV+wOLE=FHXEZzw4eouybUqlmGZcF$CS20l*qq?SJgW2Pw(2x)5;c z2Hc|RAkeL3B?Bdi${?@-bXNrgra-=CtL1dh4?vJZSqVE`(52mg5tbVSw0Es#yKq&$#VMBMfC4BQ^K?D@^1BexB^fdA!-? zrdT@aG!tC3&367%^qXq@NtQzZcXvR8l1E5bUp;Idn?i_ZDqn{m zw=Qt|eOU+oqaWKto22=6Qye@bLwgJ(?O(sINaC00*>1cyy*O%bX5yi}@p*=_&eVB*P+EptJ0)TIGZyO6iE+@eX( zGPSi-kOtibl~c9{%6m`IJ?1j*k6igRGZOF&2nxgfABDa9`Um!5K{HOzM%KE})hoKI zM>uIw4(tgI>>1r9xen~5-RyNcRHE8-{YGV)Cl;))OTHMFx&Ph$+*QK z2zSDoJ=RhL*B}d2XXy81+kU*d45il@kv7#OMH&4L)wtU^-q%UXf0C7wJeN4JA9dK9 zt~AvuGp;Qvemd2nWVXXal|TF&%D0qe?J=VAyV|j5T^ds-#3-&mACQo4M!maRj$xt_ zeY3m5itCn>)4dO_2Ph>jtXZ+s$3xv|jZ%B--IZiYKVQw^-R9+eiY7~7idl;0qDq<# zdoINh5sDbD)UVDpPd13Kar%rL=e~>CG6w5K3!-V~9n53!CU^TIJhY-8uxkIrmmqJr z^c>-43e}yAKCqA)GS{T5$dfoTqsF}Oij!>lZ$i3uHI___U2S##@*Z*)!~auzr&Z|@ z@%-UBYsyk1{=m*0_TEuX^~5ob7meDKanbrz)E)?Bx zZ^cKe(SE{pbP1%&vsy?Y*6LQpA+p0ANn$`vWc)L7VGJ~J90mG;z-_+j{#1^WECd!I z@czJWsPW+V`9cB5ux~rf<&cYz-8Y}h-6$zS7WLMeKO%R?H`gFp4E*Beyr6f;o^Ugx z?lx2;YAOav{8(IqHV%{sJ1UA_@vPmtG{imvT_`$eBVg*g!Gum@AZ;c`H?IzNAHcm4 zkM~wBhF^*N>bc#a;q`AL?MT-hh948Hj}`yYSj^|=x6Y?=Kr-=c==dVU+e z8=_&y+5UPu_01ZgkXnwGEE2%Py#cse2-==t|BqFs#z-{J;i820o6AQ@>G=&ON~NlG ztI<RlDX zFLXPr-C6ZNg8}*UkqZ}IJzMB>(xyH`^szgokt;=l}?SLi}R>eW2p%Zp5C2vXg6jbeU>V z7~&!#=~Kk2Kk`X}79ZcqWXf$*BT8~y{v;&4IjTEHuUR2=`<(=8;{E(W3~8#F>G>VW zp!5-q?~k{J>b5$Fm#uEUBL^J0&69eD<)XOXh2T$|y-LLu%&&VS9uZHSVc9qbbWLD{ z!lCn5aei%2XQe9HCXXa2h5HXjq0%c#=;~FRecc_F`JNGH;?c3599?8Fx#UZ9nWtdd zPtCnFrOlxl6asOQ``~hv;!iI-KZP_)6 z1a3|9od82|K~fqTOrIg?QGs3j`r}5;>|OA8`%swYolN$IXkr@9>b1QUf2;cFY_sd6 zJK`?KynC=|QOxoio-^E?v%dmf9mjrmdL`dXW>Y^qh|zP~^S)g|1WuOJ-X>om?$)nF zZQ}fz9&CAn^4GWLBPQ{Tm9;M z?#OMM^e6T>|JJ7yAl>aJjS*Xm_(pdgmpjg0pjJ+;nhNuc7weth%xQOu{MtSjad4S)5UJ#S1MoDt}`&Ry(E9I^QQr+vn% zY{}?B$^an@0?!~+(|a^m-e?IcN0m{zP^zGkzs=^eYY_HAms>PD{h4a0K39XDoG$Io z4#R=HF6GUyHNFW@Hb_hhdSn${H{hazSg$b9Fiebo03XOhoP8C!aw*q?0L>Slgk|sQ zeg|*LukMY_%@EovO^97fC{t8i9umxOe6-xBK=W45(1_3P(CO;ctK+^I?qNf}yHmO4 zE0;AKHj(CM3734n_U#}KIEF;lBKmV%&^8je^Jmz=vX_Q2q^n3*PRT%-B2qgb*#Re; zKIdh40Y*UHX!w0b@b922%eI^1-y<;RPygv#$dGU)TAl&6S6_r+-?2#npTZH>n|Pb7 zRo8`+3;eqI{>hZWapJuu$bs$dY&I&%04gX43U&!M=DnvDGyL-bdqeu2UR)51VillW zYB_d!;yl65X;gy=a~e&5&VVl&4V4)ueSLL9=S4aPtFGQ&3J{pAFpB~&Z~xT~3rqYK z6H~eteKi{*XFnK*Ksfqy43SVywuBua!kDP25ucU@ng49f;~Vd*0&l0Qpf(V^H?Dr! zgm&Md*(^?JeTL(UwrzwcVtCV445ntBgfBn{on*&ZkitTcqI=V_THj#Ds9cI%w4pUe zOPcbzVNiiTQh6CF&PhS(U7&2At#=%)c4tbdtJkoRa%npCO>1qf2G?ENZVzRBR-_Jt z_i*KwenbP4bJETDP1h!xh1K-iYdEJxL}1m$LfPtE|NNW>MP-XxOhLjouIBF7RN@3b zHRnw`n!V46VO~-=`}vWzPJ}^yhE7Vl^-C4zUFhqSgL(+~cc`^A@!hz(+OCV|4rXL( zV0Vz&sm^?a<=ke%?0`!?e_K$gRO(!mIw(Z~%pBQCdg;bFu9tAnvb=UY!t2jDm{DX= za&55@rLQm?4O9z#f0&T=@2XQx&XQMB6MH*)UyZEcTS`u-DtU)==HJE~Q9!t`nKd!J(g{nJ4& zN#=$-ltaX&tZ-8ibY*Zb@yy#0k4wQ~4R&)#EAc!&hF3OJph z7dfC<0`T2zI=bf?yK+&Dac#UdT3W%agZL;I@Mn5|C>jQ^#h5fI&YHhq{GGQdu|AAE zZg2YXvbB0^$?Sd2nGd1fd?Tga6UULHuVkec9EY^jEt=0HULDm}l5G)6dV5l)Y)<|)P9 zVAl6ynqWnQlJ=JK1(xkJ!5Kne1Nj^i%ACL1eiE}MzNvPW!Eoz#seXsI|7Sku5M#`idDACwbvT$nq&GJ=Ii|a|+?yj0 zlP_ZgMP}=MptKje;@B7O;;45m61PtJxcf_`t0q^~SOZ?p9F z)(=|hst=C^wD7Lp@{1i1_7cQDzh)7MF}|jS^DS9>*l%I29=^cx+Q3`=iD~#kIm=k< z=U;Nk7Q?;2pc)wdof)Hd#wRou1xU*=%9nhV6@U8n1lKnA?fvvW`W$)d414vJN5Qw_ zY_A?C7>%(2SCDJ({jG=*IINfa_2&y+SfY9AGe=Ca3{F>;Qb^i6zZWR? zcf`Rm@vj82H(;;>E2x=*G0OB8k zV8=O1yi$Brhk&RlE);jl)1^Nb6!yz{L9xBdaM^!jmH)dv0IY-5Y;@P02NV#ZCf(UI z=Q>~D+AMa<_46-qr$(`(&ShEq>US=xy6~#=J0R}T6tWARpG*oqJ@mOOC;;n?+ST<- z-aEgu4bi;O9cC65d&zYoI`qe*b|fy1t^f5gn!3rt&My3@O7$AC-8}-@!3;UJ8}~Gj z8|1goFHv&QI|wG}c%UIY@I|JP*+rJL!T#ZKw$&Y~0<%T*-~<=lA)N_hNVt#69##It zBKaGKyW^K7)B%srrT1R)Z`@i-1IS}sZ|TWL2K4!s1sa5ClN*F$pT#qmT}4d|2!!GL z<9{^Hua|aF8*vLA-feX!&;gzY6pzzCj~^C^i=a;c(<3)iBs`K=L<9$b9m%%;G*n4P yjUKRjRdd^nqnPAl8+A=n0`<6r=MwLHD(UMMe0J$#1^ET|rzoc;TOn;8{J#K*+o{