From 0b4fb297f082cb5e89ec82afbe88c9865b263290 Mon Sep 17 00:00:00 2001 From: "Kirill Lipatov (Leency)" Date: Sun, 4 Nov 2018 00:20:00 +0000 Subject: [PATCH] life3: update UI, add to ISO git-svn-id: svn://kolibrios.org@7525 a494cfbc-eb01-0410-851d-a64ba20cac60 --- data/Tupfile.lua | 2 + programs/cmm/browser/download_manager.h | 9 +- programs/cmm/txtread/prepare_page.h | 10 +- programs/games/life3/trunk/Tupfile.lua | 1 + programs/games/life3/trunk/build_ru.bat | 6 +- programs/games/life3/trunk/life3.asm | 148 +++++++++++++----------- programs/games/life3/trunk/life3tb.png | Bin 0 -> 2183 bytes programs/games/life3/trunk/toolbar.png | Bin 3263 -> 0 bytes 8 files changed, 98 insertions(+), 78 deletions(-) create mode 100644 programs/games/life3/trunk/life3tb.png delete mode 100644 programs/games/life3/trunk/toolbar.png diff --git a/data/Tupfile.lua b/data/Tupfile.lua index bf12f99afc..fac582fab6 100644 --- a/data/Tupfile.lua +++ b/data/Tupfile.lua @@ -179,6 +179,7 @@ extra_files = { {"kolibrios/emul/", "common/emul/zsnes"}, {"kolibrios/demos/ak47.lif", "common/demos/ak47.lif"}, {"kolibrios/demos/life2", "common/demos/life2"}, + {"kolibrios/demos/life3tb.png", PROGS .. "/games/life3/trunk/life3tb.png"}, {"kolibrios/demos/relay.lif", "common/demos/relay.lif"}, {"kolibrios/demos/rpento.lif", "common/demos/rpento.lif"}, {"kolibrios/games/BabyPainter", "common/games/BabyPainter"}, @@ -512,6 +513,7 @@ tup.append_table(extra_files, { {"kolibrios/3D/voxel_utilites/VOX_TGL" , PROGS .. "/media/voxel_editor/utilites/vox_tgl"}, {"kolibrios/3D/textures1", PROGS .. "/develop/libraries/TinyGL/asm_fork/examples/textures1"}, {"kolibrios/demos/buddhabrot", PROGS .. "/demos/buddhabrot/trunk/buddhabrot"}, + {"kolibrios/demos/life3", PROGS .. "/games/life3/trunk/life3"}, {"kolibrios/demos/qjulia", PROGS .. "/demos/qjulia/trunk/qjulia"}, {"kolibrios/develop/utils/GenFiles", PROGS .. "/testing/genfiles/GenFiles"}, {"kolibrios/games/Almaz", PROGS .. "/games/almaz/almaz"}, diff --git a/programs/cmm/browser/download_manager.h b/programs/cmm/browser/download_manager.h index 88f557db94..2a8d903dba 100644 --- a/programs/cmm/browser/download_manager.h +++ b/programs/cmm/browser/download_manager.h @@ -78,10 +78,11 @@ void Downloader() default: if (!downloader.MonitorProgress()) break; - pb.max = downloader.httpd.content_length; - if (pb.value != downloader.httpd.content_received) + pb.max = downloader.httpd.content_length / 100; + EDI = downloader.httpd.content_received/100; + if (pb.value != EDI) { - pb.value = downloader.httpd.content_received; + pb.value = EDI; progressbar_draw stdcall(#pb); DrawDownloading(); } @@ -154,6 +155,7 @@ void StartDownloading() DL_Draw_Window(); } +/* struct TIME { dword old; @@ -180,6 +182,7 @@ void CalculateSpeed() } else time.old = time.cur; } +*/ void DrawDownloading() { diff --git a/programs/cmm/txtread/prepare_page.h b/programs/cmm/txtread/prepare_page.h index 909d1c1003..9c08b3bf41 100644 --- a/programs/cmm/txtread/prepare_page.h +++ b/programs/cmm/txtread/prepare_page.h @@ -3,13 +3,15 @@ enum { DRAW_BUF }; +#define DRAW_PADDING 12 + void Parcer(byte mode) { dword bufoff, buflen; byte ch; char line[4096]=0; int srch_pos; -dword stroka_y=5; +dword stroka_y=DRAW_PADDING-3; dword line_length=30; dword line_start=io.buffer_data; @@ -34,7 +36,7 @@ dword line_start=io.buffer_data; if (mode==DRAW_BUF) { EBX = bufoff-line_start; strlcpy(#line, line_start, EBX); - kfont.WriteIntoBuffer(8,stroka_y,list.w,kfont.size.height, bg_color, text_color, kfont.size.pt, #line); + kfont.WriteIntoBuffer(DRAW_PADDING,stroka_y,list.w,kfont.size.height, bg_color, text_color, kfont.size.pt, #line); stroka_y += list.item_h; line_start = bufoff; line_length = 30; @@ -42,7 +44,7 @@ dword line_start=io.buffer_data; } } if (mode==COUNT_BUF_HEIGHT) list.count+=2; - if (mode==DRAW_BUF) kfont.WriteIntoBuffer(8,stroka_y,list.w,kfont.size.height, bg_color, text_color, kfont.size.pt, line_start); + if (mode==DRAW_BUF) kfont.WriteIntoBuffer(DRAW_PADDING,stroka_y,list.w,kfont.size.height, bg_color, text_color, kfont.size.pt, line_start); } void PreparePage() @@ -52,7 +54,7 @@ void PreparePage() Parcer(COUNT_BUF_HEIGHT); //draw text in buffer - list.SetSizes(0, TOOLBAR_H, list.w, Form.cheight-TOOLBAR_H, kfont.size.pt+4); + list.SetSizes(0, TOOLBAR_H, list.w, Form.cheight-TOOLBAR_H, kfont.size.pt+6); if (list.count < list.visible) list.count = list.visible; kfont.size.height = list.count+1*list.item_h; kfont.raw_size = 0; diff --git a/programs/games/life3/trunk/Tupfile.lua b/programs/games/life3/trunk/Tupfile.lua index e329ca6237..77f33fcfc0 100644 --- a/programs/games/life3/trunk/Tupfile.lua +++ b/programs/games/life3/trunk/Tupfile.lua @@ -1,2 +1,3 @@ if tup.getconfig("NO_FASM") ~= "" then return end +tup.rule("echo lang fix " .. ((tup.getconfig("LANG") == "") and "en" or tup.getconfig("LANG")) .. " > lang.inc", {"lang.inc"}) tup.rule("life3.asm", "fasm %f %o " .. tup.getconfig("KPACK_CMD"), "life3") diff --git a/programs/games/life3/trunk/build_ru.bat b/programs/games/life3/trunk/build_ru.bat index b898c517ce..c4a9cee1ae 100644 --- a/programs/games/life3/trunk/build_ru.bat +++ b/programs/games/life3/trunk/build_ru.bat @@ -1,4 +1,4 @@ -if not exist bin mkdir bin -@fasm.exe -m 16384 life3.asm bin\life3.kex -@kpack bin\life3.kex +@echo lang fix en >lang.inc +@fasm.exe -m 16384 life3.asm life3.kex +@kpack life3.kex pause diff --git a/programs/games/life3/trunk/life3.asm b/programs/games/life3/trunk/life3.asm index b77045e165..f668e86219 100644 --- a/programs/games/life3/trunk/life3.asm +++ b/programs/games/life3/trunk/life3.asm @@ -9,13 +9,18 @@ include '../../../KOSfuncs.inc' include '../../../load_img.inc' include '../../../develop/libraries/box_lib/load_lib.mac' +include 'lang.inc' + @use_library_mem mem.Alloc,mem.Free,mem.ReAlloc,dll.Load -hed db 'Life 03.11.18',0 ;подпись окна +hed db 'Life 04.11.18',0 ;подпись окна run_file_70 FileInfoBlock image_data dd 0 ;указатель на временную память. для нужен преобразования изображения -IMAGE_TOOLBAR_ICON_SIZE equ 16*16*3 +ICONSIZE = 21 +TBTNSIZE = ICONSIZE-2 + +IMAGE_TOOLBAR_ICON_SIZE equ ICONSIZE*ICONSIZE*3 image_data_toolbar dd 0 @@ -51,9 +56,16 @@ tim dd 0 ; b_sort dd 0 ;граница для сортированных ячеек osob dd 0 ;число особей zoom db 3 ;масштаб поля -txt_zoom db 'Масштаб:',0 -txt_gen db 'Поколение:',0 -txt_osob db 'Особей:',0 + +if lang eq ru +txt_zoom db ' Масштаб:',0 +txt_gen db ' Поколение:',0 +txt_osob db ' Особей:',0 +else +txt_zoom db ' Zoom:',0 +txt_gen db 'Generation:',0 +txt_osob db 'Population:',0 +end if ;настройка массива с цветами ; col_pole - цвет поля @@ -815,7 +827,7 @@ start: mov [memCell],eax stdcall mem.Alloc,(COL_MEM+1)*4 mov [CellColors],eax - include_image_file 'toolbar.png', image_data_toolbar + include_image_file 'life3tb.png', image_data_toolbar ;настройка цветов ячеек stdcall pole_init_colors, 0xffffd0,0xff0000,0x0000ff @@ -966,10 +978,7 @@ align 4 draw_window: pushad mcall SF_REDRAW,SSF_BEGIN_DRAW - mov edx,[sc.work] - or edx,0x33000000 - mov edi,hed - mcall SF_CREATE_WINDOW,(20 shl 16)+485,(20 shl 16)+415 + mcall SF_CREATE_WINDOW,(50 shl 16)+485,(50 shl 16)+415,0x73000000,0,hed mcall SF_THREAD_INFO,procinfo,-1 mov eax,[procinfo.box.height] @@ -994,98 +1003,91 @@ pushad stdcall [buf2d_clear], buf_0, [buf_0.color] call pole_paint .end0: + + mov edx,[sc.work] + mov ebx, 0 shl 16 + add ebx, [buf_0.w] + mcall SF_DRAW_RECT,,<0,35> - mcall SF_DEFINE_BUTTON,(5 shl 16)+20,(5 shl 16)+20,3, [sc.work_button] + mcall SF_DEFINE_BUTTON,(6 shl 16)+TBTNSIZE,(6 shl 16)+TBTNSIZE,4+0x40000000, [sc.work_button] - mov ebx,(30 shl 16)+20 - mov edx,4 + mov ebx,(36 shl 16)+TBTNSIZE + mov edx,6+0x40000000 int 0x40 - mov ebx,(55 shl 16)+20 - mov edx,5 + mov ebx,(61 shl 16)+TBTNSIZE + mov edx,7+0x40000000 int 0x40 - mov ebx,(85 shl 16)+20 - mov edx,6 + mov ebx,(86 shl 16)+TBTNSIZE + mov edx,8+0x40000000 int 0x40 - mov ebx,(110 shl 16)+20 - mov edx,7 + mov ebx,(116 shl 16)+TBTNSIZE + mov edx,9+0x40000000 int 0x40 - mov ebx,(135 shl 16)+20 - mov edx,8 + mov ebx,(141 shl 16)+TBTNSIZE + mov edx,10+0x40000000 int 0x40 - mov ebx,(165 shl 16)+20 - mov edx,9 + mov ebx,(171 shl 16)+TBTNSIZE + mov edx,11+0x40000000 int 0x40 - mov ebx,(190 shl 16)+20 - mov edx,10 + mov ebx,(196 shl 16)+TBTNSIZE + mov edx,12+0x40000000 int 0x40 - mov ebx,(220 shl 16)+20 - mov edx,11 + mov ebx,(221 shl 16)+TBTNSIZE + mov edx,13+0x40000000 int 0x40 - mov ebx,(245 shl 16)+20 - mov edx,12 + mov ebx,(246 shl 16)+TBTNSIZE + mov edx,14+0x40000000 int 0x40 - mov ebx,(270 shl 16)+20 - mov edx,13 - int 0x40 - - mov ebx,(295 shl 16)+20 - mov edx,14 - int 0x40 - - mcall SF_PUT_IMAGE,[image_data_toolbar],(16 shl 16)+16,(32 shl 16)+7 + mcall SF_PUT_IMAGE,[image_data_toolbar],(ICONSIZE shl 16)+ICONSIZE,(5 shl 16)+5 add ebx,IMAGE_TOOLBAR_ICON_SIZE - mov edx,(87 shl 16)+7 ;run once + mov edx,(35 shl 16)+5 ;run once + int 0x40 + add ebx,IMAGE_TOOLBAR_ICON_SIZE + mov edx,(60 shl 16)+5 ;run auto + int 0x40 + add ebx,IMAGE_TOOLBAR_ICON_SIZE + mov edx,(85 shl 16)+5 ;stop int 0x40 add ebx,IMAGE_TOOLBAR_ICON_SIZE - mov edx,(112 shl 16)+7 ;run auto + mov edx,(115 shl 16)+5 ;- int 0x40 add ebx,IMAGE_TOOLBAR_ICON_SIZE - mov edx,(137 shl 16)+7 ;stop + mov edx,(140 shl 16)+5 ;+ int 0x40 add ebx,IMAGE_TOOLBAR_ICON_SIZE - mov edx,(167 shl 16)+7 ;- + mov edx,(170 shl 16)+5 ;move up int 0x40 add ebx,IMAGE_TOOLBAR_ICON_SIZE - mov edx,(192 shl 16)+7 ;+ - int 0x40 - - add ebx,IMAGE_TOOLBAR_ICON_SIZE - mov edx,(222 shl 16)+7 ;move up + mov edx,(195 shl 16)+5 ;move doun int 0x40 add ebx,IMAGE_TOOLBAR_ICON_SIZE - mov edx,(247 shl 16)+7 ;move doun + mov edx,(220 shl 16)+5 ;move left int 0x40 add ebx,IMAGE_TOOLBAR_ICON_SIZE - mov edx,(272 shl 16)+7 ;move left - int 0x40 - add ebx,IMAGE_TOOLBAR_ICON_SIZE - mov edx,(297 shl 16)+7 ;move up + mov edx,(245 shl 16)+5 ;move right int 0x40 + + ; add ebx,IMAGE_TOOLBAR_ICON_SIZE + ; mov edx,(270 shl 16)+5 + ; int 0x40 + ; add ebx,IMAGE_TOOLBAR_ICON_SIZE + ; mov edx,(295 shl 16)+5 + ; int 0x40 - call draw_pok - - stdcall [buf2d_draw], buf_0 - - mcall SF_REDRAW,SSF_END_DRAW -popad - ret - -align 4 -draw_pok: mov eax,SF_DRAW_TEXT - mov ebx,325*65536+5 + mov ebx,295*65536+5 mov ecx,[sc.work_text] or ecx,0x80000000 ;or (1 shl 30) mov edx,txt_zoom @@ -1097,22 +1099,32 @@ draw_pok: add bx,9 mov edx,txt_osob int 0x40 + + call draw_pok + stdcall [buf2d_draw], buf_0 + + mcall SF_REDRAW,SSF_END_DRAW +popad + ret + +align 4 +draw_pok: mov eax,SF_DRAW_NUMBER movzx ecx,byte[zoom] mov ebx,(2 shl 16) - mov edx,(325+6*9)*65536+5 - mov esi,[sc.work_button_text] + mov edx,(295+8*9)*65536+5 + mov esi,[sc.work_text] or esi,(1 shl 30) - mov edi,[sc.work_button] + mov edi,[sc.work] int 0x40 ;масштаб mov ebx,(5 shl 16) mov ecx,[tim] - add edx,(6*2)*65536+9 + add edx,9 int 0x40 ;время mov ebx,(5 shl 16) mov ecx,[osob] - add edx,(6*0)*65536+9 + add edx,9 int 0x40 ;популяция ret diff --git a/programs/games/life3/trunk/life3tb.png b/programs/games/life3/trunk/life3tb.png new file mode 100644 index 0000000000000000000000000000000000000000..26c8139b9d8d5e88792f6a1ec660b0ca0f5b98b4 GIT binary patch literal 2183 zcmV;22zd92P)A?pdbXgb(2`0UG4-0b&b1I?^L6l}0N(zeO!-LTDjmOSDk}=bR{AB%klAi3zuHBt4 z49rMBee~0l-uvn&J^MQ=D=SmXSmyx1ah#a}Tdh_I1pvj1<$k@{pu#+m60l zmIXq{$)L7v!?LXCx9hsFEDNsdCU#Z{n$AoB0f15(txG^DrRa9_=(p1wCLrlU6~MF- z&~8V^M&FBmw_AE<1EF4@C7L1^3IO0o(D)AGYPT8yvYF>YSDA+^WT*k69$j>wbcEmIya15LM0nUt>6yr8OjcjIZR)tWujFpSwlzrDuy^+8S3 zRN6Q%E;m!(_m!5*;wm4$ZQHp!6e_fnyu-6?JK^({pt21Gu&BcnLhJRq6k4y>!5E8{ z#lHioHchXLt8LNT9SMmJ6hUP`5hQ>?5P)-@>3!*C@1<9!;hb|g-D+Jpf)@4ts)Kjt zI+ejY%VG9iM=OjIlAe9nbrUxi@xzbbGN$7Sp#TbRA@kyd&d$&`H@;A3)A$%;_~6s? z_~6s?g(FubsL(He_j6qM(?^xzr4`@(KmQs4aN!Rh0RaB>$1hQCe1XiH!ojf=kwQ5QyQd$AV6cY zs|55+CsPMV$I}Stm3LLcYr}Uo@(1Z;3f204ZXq!%y<6yU&Uz_ymO7)*S@nOVGBQsb znsmAJ@IBK3hgSLl0N>fjY@dC6%sB`l(%?KPJ(QINR?)i~PgNgoRf6hz{yUOmL%%WO zOFt|qI+02zic*S4j~>A^O&Ep&!!XcjH1OcT0|Y^ki7&n9rE7O6=JV{?v+2c)7pM2{-=FU6>`W(e)|Itmo8lbr8N7jZ|G=4kd z54=og_xl))M%dcg!sW}CBdGMQuU4y}-Zrq=ck$c5{sw*5L$lUEr`?X? zMxznd*VnPNwFS@fqNB?|6Tl4@&X>Q(5BGn8Jq*EE_(oS`ObEf!(h~08y$b;OrFj|{ z{QW#=e+awNg-+_IX|=?_qiI_7i7Qb>8&*>aG>BfwUNR@@q`(A}a}K-Hg}1tUA|Q}z z)0WYM(LJ)3<2vfx_(IK%@0&Bev`)YA37uZ!OY8I+Up&LP@y(4dtGV&b-|;D^wcJN* zxj#E-Yq<~0)X{3xl)$A>0W@?1LstVALgPSocpmG7NWqM;=y_o-G!9HF4KAEAA_A<# zS#$2@5CboW)*T?6#qolEg}xVpEXfSJ%$qaLIjq>^N@s(j*{A~m-X1o=7v6I?o&0e@ z`sPdwB;nv2P7WHsJ;-b<;?f6OfutpeqoV{KWN&WbrUROrMLhGwB}@jJe=WqhTVRGxM8*YZ!U(skOiTcC%2 z!Wb{@VU-S_vFx0_6GK&12`Za?__aZ$Crb9d?=?RfsEgt=74 z1n%Y#+W|#DImR5IG~DrjUyty&f3RHdms+$Kl${PiuOEO?3U&xQKoVGKT4Ndv0Nbw^ z`d%@x5Sj*W41&@Og-ZKAAq14tMEjL_meR$qI&D-)dAe8?N1YpAs8erzO3d$06SSKg&IW}jf6{Wh$?IJDSS}6( zfM%l}6=*={1Fsmz8y?=e2SJeN#u<-_16k_Q6$P3ofAX$v=>*Jx(!{g71MsMX1Q59@ zOYb!ejeAqKM*$2`mz0U(tET0bKbbZqguv+l-5y1&5tiXE*%V)R&*cOasF29G)j-0R zjtz}lNZ1rd%T=W0rgfrFJCdG8U#R~Nt>-)TaTZk=5k>IYV5cc1r74ji2GCBnecSfmmd6-QIJw8nr?* zlv;G2#Dm1Ls;|<&gaE=)TvX1-`kx4C5kizq@N^7)Dtafz_dntB)xkfDaxDM=002ov JPDHLkV1jQEDc1l1 literal 0 HcmV?d00001 diff --git a/programs/games/life3/trunk/toolbar.png b/programs/games/life3/trunk/toolbar.png deleted file mode 100644 index 92cda518a0dc305500304afa8da108bc21dc6c2c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3263 zcmV;w3_$aVP)<{98FWQhbW?9;ba!ELWdKlNX>N2bPDNB8 zb~7$DE;u(kfL#Cp3_M9hK~!i%?OF+tl*JYP=AUC{=h$P0VFz~EWnq^?!V*Bhi>L`2 zR6-I$A|{GpP?QvE#VaPn6o^%(Djuj%{}MdowgC!C0AXCzdW-X9Kf^V@f;yc`WTF3?^6|S#j-~sCbiJ9 z&J7La7*uWMjfJELL5gABJ02KSx-WnHF(i^YNGSoD)hi!OT{CR}G=fg<%m9+-4r9#@ zClaDWB>^#!fJ7yckT7b-!!oo^N=iT?20@qNBWtN>{HGuwj9C*;M98u(Z_lM@eoqcPQvmb=Jz4u_wdquxCuv2Nw|4M zdm4ao(0Wb}4GB4RU{~bAZgwnM1G?2#nq7t^F{EjM^?cE+(Hl(e`TsU}EUC#3w1`$XCm6b;9_^=7rpKph` zsGRe`?O^%l1DH5@7yci zICri)WF<&;UpRtrgd(yif<-V!$4+TcH^hPGKWM?7Q~OaO!T@416cq_5D>J}cqDRO8 zw9@kRn+%BCO5iIkgWFurOL2`8&HI{gRdOEorJUDB!XFK@!Wi>AOr2}|wPO;~VcJsgf2xl6C6(Le!p&_CY6tu%6GXNFQ3 zfD~Bs-W#~>GAAl3YIB$^2r$$Xz|7G`46GfeDCsxAALNK|`O72n%__G1;!sw7769*j z*WtVXcw~4MhzyX~*>hf&*Ho)fKdZ{POg|68{$gxnlh#OZ-60X%|eZP8G`M{`8F^`8&W|qpx8bHr)%z3RgVndICv+t1}jEt zvbX$u!%HCsI^nM_{= zBj}7)*!Mq_8y7Zfp2jO=e%mt9*5mg1+ z3C5Cg5;uUe`*&mahb|1i|GmN)3L8b5_9~7O>)unx5%!!zJRCyxfb_{%uQ=!u*!#p( znEPoU#Y`~HeZB7hN+$b%e?Z~=EA;vla-U@bp5Fb9qi!(ep|?z=xoF@Kp5 zG59+d!`i>PyXv!oE)|juGHzQ5!>TI3^CcTqG?VJCmdkc-Y4+n z?&r`nYA2%fv1w?Rt}#-QCBQ(Z{AR5l!DI|W4R$X%s{9N-hzUjDH5zyypqG8uzi z<6zR7pwsD4q}9O_iJ~nU!trQ^BKB#_?!Snx_2to8(|Xi zi=oKDSm$V*I_p7uXAmuPr!vZ}z9H|EKTuM|7v8Zba`5KSMcCJI5IQ~G=202r{1&G4 zU(|a;`oz5t)fF~4$}Jc~r&tF%vJV|HkyJ&9(zTe6b}nJMKKxvEkVvIZ_EP+kO`TLZ z=#Qw;(baE-OyS4(P3LvEB1ruahEo~`uQxa$T}EU z@iQ#E_+|_~G67YZ%B)5Xg9RtT9xSMRF-N7UK2fxHAm$M;rfN7k=wMdOC#tSS7TU}f z%FL5`+|{s3buv|_@pl)jMJy)d?aWaB`~E;x1Qza?ffXV}02XN1oZi5#vk>I~un@nz z@dY$D?Bb?fh;mx2*zsqyjQRxhq5xkPg(zzlSWsoj14A27pV z)))3lu=$)Q_LcG#$)a?$ydC=far7Tx#lV5(7*gfnPFG$`EE{81$4u82aPndf+W2y2 zA--G~h+>o>N_PxFdf7oFU%|X}mLaihj3rboCt}1h6P8?LMn)EB*@uNY7O|L#%SvQ_ z*rFL^Du+?0hgDz19SKV=x{5zaHzCm&TEjseD-=zcWn(O%VmT2@YZlh8%sUY|)5tnB z$Gs>MOx%SPBE=TWah#OA-2W9K)ghScV$QP=eT|oMA=bO<3#vIYD^&t52ymd|)13S` z6R02nyJH)yEmO?Y<;9dwUWs1l@g~ElF_bCp8Td4AYFnB&jbX8og*O(VT=Zs4W{}|` zG`ja=fXRYVV-ZS>23U(|F@07n^c|o#fTFa6Z3%b6UR<2DkK!CKf4~wdmJ@XmODrW0+g0f=n|7&{#>d!4X)2Ov`FgQt`>AZ1$UJM3U# zuZs$<1-6T0Ne9atSm