From 418e7b7191abcd0009f15b8e0194c6249d2ff777 Mon Sep 17 00:00:00 2001 From: Andy McFadden Date: Fri, 21 Aug 2015 14:15:18 -0700 Subject: [PATCH] Initial checkin fdraw v0.3 --- AMPERFDRAW.S | 549 +++++++++++++++++++++++ FDRAW.CIRCLE.S | 752 +++++++++++++++++++++++++++++++ FDRAW.LINE.S | 588 ++++++++++++++++++++++++ FDRAW.S | 805 +++++++++++++++++++++++++++++++++ FDRAW.TABLES.S | 339 ++++++++++++++ README.md | 61 ++- docs/demos.md | 167 +++++++ docs/manual.md | 990 +++++++++++++++++++++++++++++++++++++++++ docs/personal-notes.md | 197 ++++++++ fdraw-disks.zip | Bin 0 -> 155984 bytes 10 files changed, 4446 insertions(+), 2 deletions(-) create mode 100644 AMPERFDRAW.S create mode 100644 FDRAW.CIRCLE.S create mode 100644 FDRAW.LINE.S create mode 100644 FDRAW.S create mode 100644 FDRAW.TABLES.S create mode 100644 docs/demos.md create mode 100644 docs/manual.md create mode 100644 docs/personal-notes.md create mode 100644 fdraw-disks.zip diff --git a/AMPERFDRAW.S b/AMPERFDRAW.S new file mode 100644 index 0000000..5a1096c --- /dev/null +++ b/AMPERFDRAW.S @@ -0,0 +1,549 @@ +******************************** +* * +* Amper-fdraw * +* By Andy McFadden * +* For fdraw version 0.3 * +* * +* Applesoft ampersand * +* interface for fdraw. * +* * +* Developed with Merlin-16 * +* * +******************************** + + lst off + org $1d60 + +* All of the handler entry points can fit on a single +* page, so it's possible to save a few bytes by +* dropping the high jump table and just hardcoding +* the first page into the jump. This requires that +* the ORG be at $xx00. + + PUT FDRAW.DEFS + +* Applesoft BASIC tokens. +tok_plot equ $8d +tok_hgr2 equ $90 +tok_hgr equ $91 +tok_hcolor equ $92 +tok_hplot equ $93 +tok_draw equ $94 +tok_xdraw equ $95 +tok_inverse equ $9e +tok_clear equ $bd +tok_new equ $bf +tok_to equ $c1 +tok_at equ $c5 +*tok_sgn equ $d2 +tok_scrn equ $d7 +tok_exp equ $dd +tok_cos equ $de +tok_sin equ $df + +* System locations. +PCL equ $3a ;used by monitor +PCH equ $3b ;used by monitor +A1L equ $3c ;used by monitor +A1H equ $3d ;used by monitor +LINNUM equ $50 ;50-51 +FACLO equ $a1 +CHRGET equ $b1 ;advance ptr, get next tok +CHRGOT equ $b7 ;get next tok (no advance) +TXTPTR equ $b8 +HPAG equ $e6 ;$20 or $40 + +AMPERV equ $3f5 + +TXTCLR equ $c050 +TXTSET equ $c051 +MIXCLR equ $c052 +MIXSET equ $c053 +LOWSCR equ $c054 +HISCR equ $c055 +LORES equ $c056 +HIRES equ $c057 + +ERROR equ $d412 ;error based on X reg +FRMNUM equ $dd67 +SynError equ $dec9 ;throw SYNTAX ERROR +CHKCOM equ $debe +IllQError equ $e199 ;throw ILLEGAL QUANTITY ERROR +GETADR equ $e752 +GETBYT equ $e6f8 ;gets byte, in X/FACLO +HFNS equ $f6b9 ;get hi-res x/y for hplot + +* Prepare the ampersand vector. +* +* Ideally we'd check to see if the existing vector is +* different from ours, and if so, jump to it when we +* get a token we don't recognize. Not convinced +* there's an actual use case for this. +init + lda #$4c ;JMP, in case it got + sta AMPERV ; trashed + lda #dispatch + sta AMPERV+2 + rts + +* Entry point from BASIC. The token is in A. +dispatch + ldx #:cmdend-:cmdtab-1 +]loop cmp :cmdtab,x + beq :match + dex + bpl ]loop + jmp SynError + +:match + lda :jmptabh,x +* lda #>h_new ;all on first page + pha + lda :jmptabl,x + pha + jmp CHRGET ;eat token, jump + + +:cmdtab dfb tok_new + dfb tok_hgr + dfb tok_hgr2 + dfb tok_scrn + dfb tok_hcolor + dfb tok_inverse + dfb tok_clear + dfb tok_hplot + dfb tok_xdraw + dfb tok_draw + dfb tok_exp + dfb tok_cos + dfb tok_sin + dfb tok_at + dfb tok_plot +:cmdend + +:jmptabl dfb h_new-1 + dfb >h_hgr-1 + dfb >h_hgr2-1 + dfb >h_scrn-1 + dfb >h_hcolor-1 + dfb >h_inverse-1 + dfb >h_clear-1 + dfb >h_hplot-1 + dfb >h_xdraw-1 + dfb >h_draw-1 + dfb >h_exp-1 + dfb >h_cos-1 + dfb >h_sin-1 + dfb >h_at-1 + dfb >h_plot-1 + + +******************************** +* &NEW - initialize +h_new + lda #$20 ;match Init result + sta g_cur_page + lda #$00 + sta g_hcolor + tax ;init "previous hplot" + tay ; coord to zero + jsr storeprv + ldx #139 ;279/2 + ldy #0 + lda #95 ;191/2 + jsr storeac + jmp f_Init + +******************************** +* &HGR - show page 1 with mixed text, and clear screen. +* Sets the color to zero. +h_hgr + ldx #$20 ;page 1 + lda #$00 ;$c054 + beq hgr_com + +******************************** +* &HGR2 - show page 2 with no text, and clear screen. +* Sets the color to zero. +h_hgr2 + ldx #$40 ;page 2 + lda #$01 ;$c055 + ;fall through to hgr_com + +* We go slightly out of our way to clear the screen +* before tripping the softswitches. This avoids +* flashing the previous hi-res page contents when +* entering from text mode. +* +* We also want to go nomix-page2 but page1-mix +* (note reverse order) to avoid flashing text pg 2. +hgr_com stx f_in_arg + stx g_cur_page + stx HPAG ;probably useful + pha + jsr f_SetPage + lda #$00 + sta f_in_arg + jsr f_SetColor + jsr f_Clear + lda g_hcolor ;restore color + sta f_in_arg + jsr f_SetColor + bit TXTCLR ;$c050 + bit HIRES ;$c057 + pla + beq :pg1 + bit MIXCLR ;$c052 + bit HISCR ;$c055 + rts +:pg1 bit LOWSCR ;$c054 + bit MIXSET ;$c053 + rts + +******************************** +* &SCRN({1,2}) - set the current hi-res page +h_scrn + jsr GETBYT + cpx #1 + beq :okay + cpx #2 + beq :okay + jmp IllQError +:okay jsr CHRGET ;eat ')' (we assume) + txa ;X/Y unaltered + asl + asl + asl + asl + asl ;multiply x32 + sta g_cur_page + sta f_in_arg + jmp f_SetPage + +******************************** +* &HCOLOR={0-7} - set the current color +h_hcolor + jsr GETBYT ;get color + cpx #8 + blt :okay + jmp IllQError +:okay stx f_in_arg + stx g_hcolor + jmp f_SetColor + +******************************** +* &INVERSE - flip pages +* +* If we're currently drawing on $20, we set the page +* to $40 and hit $c054 to show $20. And vice-versa. +* The goal is to make double-buffered animation easy. +h_inverse + lda g_cur_page + eor #$60 + sta g_cur_page + ldx #$00 + cmp #$40 ;about to start drawing on 2? + beq :showpg1 ;yes, show page 1 + inx ;no, show page 2 +:showpg1 ldy LOWSCR,x + sta f_in_arg + jmp f_SetPage + +******************************** +* &CLEAR - clear current page to current color. +h_clear + jmp f_Clear ;well, that was easy + +******************************** +* &XDRAW left,top,right,bottom - draw rectangle outline +h_xdraw + jsr getltrb + jmp f_DrawRect + +******************************** +* &DRAW left,top,right,bottom - draw filled rectangle +h_draw + jsr getltrb + jmp f_FillRect + +******************************** +* &EXP {0,1} - set line draw mode +h_exp + jsr GETBYT + cpx #2 + blt :okay + jmp IllQError +:okay stx f_in_arg + jmp f_SetLineMode + +******************************** +* &COS cx,cy,rad - draw outline circle +h_cos + jsr getcxcyr + jmp f_DrawCircle + +******************************** +* &SIN cx,cy,rad - draw filled circle +h_sin + jsr getcxcyr + jmp f_FillCircle + +******************************** +* &AT x,y - select center for array draw +h_at + jsr HFNS + jmp storeac + +******************************** +* &PLOT vertexAddr, indexAddr, indexCount [AT cx,cy] +* draw lines from arrays of vertices and indices +h_plot jmp array_draw + +******************************** +* &HPLOT x,y - draw a point +* &HPLOT TO x,y - draw a line from last point to x,y +* &HPLOT x0,y0 to x1,y1 - draw a line + lst on ;last token handler -- +h_hplot equ * ; must be on first page + lst off ; to omit high byte table + + jsr CHRGOT ;check next token + lst off + cmp #tok_to ;is this an "HPLOT TO"? + beq :leadingto + jsr getx1y1 ;get the first coord + jsr copy1to0 + jsr CHRGOT ;see if single point + cmp #tok_to + beq :hplot_to ;nope, draw line + jsr copy0toprev ;draw point, and save x/y + jmp f_DrawPoint ; for subsequent HPLOT TO + +:leadingto ;"HPLOT TO", restore the + lda g_prevxl ; previous coord to x0/y0 + sta f_in_x0l ;(can't rely on f_in_zzz + lda g_prevxh ; being there -- we might + sta f_in_x0h ; have drawn a rect) + lda g_prevy + sta f_in_y0 +:hplot_to + jsr CHRGET ;eat the TO + jsr getx1y1 ;get the coords + jsr f_DrawLine ;draw it + jsr copy1to0 ;shift 1->0 for next round + jsr CHRGOT + cmp #tok_to ;another TO? + beq :hplot_to ;yes, branch + jmp copy0toprev ;no, save prev and bail + +* Get coordinates and store in X1/Y1. +getx1y1 + jsr HFNS +store1 stx f_in_x1l ;store X/Y/A in coord1 + sty f_in_x1h + sta f_in_y1 + rts + +* Save x0/y0 as our "previous" coordinate. +copy0toprev + ldx f_in_x0l + ldy f_in_x0h + lda f_in_y0 +storeprv stx g_prevxl ;store X/Y/A in g_prev + sty g_prevxh + sta g_prevy + rts + +* Copy X1/Y1 into X0/Y0. +copy1to0 + ldx f_in_x1l + ldy f_in_x1h + lda f_in_y1 +store0 stx f_in_x0l ;store X/Y/A in coord 0 + sty f_in_x0h + sta f_in_y0 + rts + +* Store X/Y/A into array-center. +storeac stx g_ac_xl + sty g_ac_xh + sta g_ac_y + rts + +* Get left/top/right/bottom coordinates. +getltrb + jsr HFNS + jsr store0 ;save as X0/Y0 + jsr CHKCOM ;eat a comma + jsr HFNS + jsr store1 ;save as X1/Y1 + rts + +* Get center coordinates and radius. +getcxcyr + jsr HFNS ;get CX and CY + jsr store0 ;save as X0/Y0 + jsr CHKCOM ;eat a comma + jsr GETBYT ;convert to 0-255 + stx f_in_rad + rts + +* Array-draw handler. +* +* We know that fdraw doesn't use LINNUM or A1L/A1H, +* so it's safe to use them here. +array_draw +]vertices equ A1L ;2b +]indices equ LINNUM ;2b +]count equ PCL +]cur equ PCH + + jsr FRMNUM ;get vertex buffer address + jsr GETADR + lda LINNUM ;copy to A1L + sta ]vertices + lda LINNUM+1 + sta ]vertices+1 + jsr CHKCOM ;eat the comma + jsr FRMNUM ;get index buffer address + jsr GETADR ;leave it in LINNUM + jsr CHKCOM + jsr GETBYT ;get the count + cpx #128 ;range check (0-127) + blt :countok + jmp IllQError +:countok txa + beq :done ;nothing to do + asl ;double it + sta ]count ;stash it + lda #$00 + sta ]cur + +* Check for optional AT cx,cy. + jsr CHRGOT + cmp #tok_at + bne :noat + JSR CHRGET ;eat the AT + lda LINNUM ;the code that reads the + pha ; hi-res coordinates will + lda LINNUM+1 ; overwrite LINNUM, so + pha ; we have to save & restore + jsr h_at + pla + sta LINNUM+1 + pla + sta LINNUM +:noat + +]loop jsr getvertex + bcs :skip2 + jsr store0 + jsr getvertex + bcs :skip + jsr store1 + jsr f_DrawLine + dfb $2c ;BIT addr +:skip2 inc ]cur +:skip lda ]cur + cmp ]count + blt ]loop +:done rts + +* Get the Nth vertex, specified by ]cur, and load it +* into X/Y/A (xlo/xhi/y). Returns with carry set if +* the vertex is invalid. +* +* Increments ]cur by 1. +getvertex + ldy ]cur + inc ]cur + lda (]indices),y + bmi :badv ;must be 0-127 + jsr :calcvertex + + ldx g_out_x + ldy g_out_x+1 + beq :xok ;0-255, ok + cpy #1 + bne :badv ;512+ + cpx #280-256 + bge :badv ;280-511 +:xok + lda g_out_y+1 + bne :badv ;Y is neg or > 255 + lda g_out_y + cmp #192 + bcc :goodv +:badv + sec +:goodv rts + +* Get VX and VY, merging with AC, and store in +* 16-bit g_out_x and g_out_y. Range not checked +* here. On entry, A has vertex index. +:calcvertex + asl + tay + ldx #$00 ;hi byte of vertex + lda (]vertices),y ;x-coord + bpl :xpos + dex ;sign-extend hi byte +:xpos clc + adc g_ac_xl + sta g_out_x + txa + adc g_ac_xh + sta g_out_x+1 + + iny + ldx #$00 + lda (]vertices),y ;y-coord + bpl :ypos + dex ;sign-extend hi byte +:ypos clc + adc g_ac_y + sta g_out_y + bcc :nocarry + inx +:nocarry stx g_out_y+1 + rts + + + +******************************** +* Global variables + +g_cur_page ds 1 ;$20 or $40 +g_hcolor ds 1 +g_prevxl ds 1 +g_prevxh ds 1 +g_prevy ds 1 +g_ac_xl ds 1 ;Center-point coordinates +g_ac_xh ds 1 ; for array-based line +g_ac_y ds 1 ; draw (&AT, &PLOT). +g_out_x ds 2 ;16-bit coordinates for +g_out_y ds 2 ; array-based line draw + + + + lst on +end equ * + sav amperfdraw + lst off diff --git a/FDRAW.CIRCLE.S b/FDRAW.CIRCLE.S new file mode 100644 index 0000000..bfe84db --- /dev/null +++ b/FDRAW.CIRCLE.S @@ -0,0 +1,752 @@ +******************************** +* * +* Fast Apple II Graphics * +* By Andy McFadden * +* Version 0.3, Aug 2015 * +* * +* Circle rendering * +* (Included by FDRAW.S) * +* * +* Developed with Merlin-16 * +* * +******************************** + +* TODO: if USE_FAST is 0, replace the outline circle +* plot code with calls to DrawPoint (or maybe a +* common sub-function so we don't trash the input +* parameters). Saves a little space. + + +******************************** +* +* Draw a circle. The radius is in in_rad, and +* the center is at in_x0l+in_x0h,in_y0. +* +******************************** +DrawCircle + lda #$20 ;JSR + cmp _cp08 ;configured for outline? + beq :okay + jsr fixcplot +:okay + jmp calc_circle + + +******************************** +* +* Draw filled circle. +* +******************************** +FillCircle + lda #$2c ;BIT + cmp _cp08 ;configured for fill? + beq :okay + jsr fixcplot +:okay + jsr calc_circle + jmp FillRaster + + +* Calculate a circle, using Bresenham's algorithm. The +* results are placed into the rasterization buffers. +* +* in_rad must be from 0 to 255. The x/y center +* coordinates must be on the screen, but the circle +* can extend off the edge. +* +* The computed values are stored in the rasterization +* tables. For an outline circle, we also plot the +* points immediately. + + do USE_FAST ;***** +* local storage -- not used often enough to merit DP +circ_8bit ds 1 +circ_clip ds 1 + fin ;***** + +calc_circle +max_fast_rad equ 41 +]cxl equ zloc0 +]cxh equ zloc1 +]cy equ zloc2 +]dlo equ zloc3 +]dhi equ zloc4 +]xsav equ zloc5 +]ysav equ zloc6 +]min_x equ zloc7 ;min/max offsets from center +]max_x equ zloc8 ;(min is above center, max +]min_y equ zloc9 ; is below) +]max_y equ zloc10 +]hitmp equ zloc11 +* only used by hplot for outline circles +]hbasl equ zptr0 +]andmask equ zloc11 ;overlaps with ]hitmp +]savxreg equ zloc12 +]savyreg equ zloc13 + +* Special-case radius=0. It removes an annoying +* edge case (first y-- becomes 0xff, but 6502 cmp +* is unsigned). + lda in_rad + bne :notzero + ldy in_y0 + sty rast_top + sty rast_bottom + lda in_x0l + sta rastx0l,y + sta rastx1l,y + lda in_x0h + sta rastx0h,y + sta rastx1h,y + rts + +* Use different version of function for small +* circles, because we can do it all in 8 bits. +:notzero + do USE_FAST ;***** + ldy #$01 + cmp #max_fast_rad ;in_rad in Acc + blt :use_fast + dey +:use_fast sty circ_8bit + fin ;***** + + lda in_x0l ;copy center to DP for speed + sta ]cxl + lda in_x0h + sta ]cxh + lda in_y0 + sta ]cy + +* Compute min/max values, based on offset from center. +* These are compared against offset-from-center x/y. +* We need tight bounds on Y because we use it to +* compute the rast_render top/bottom. Getting tight +* bounds on X is not so important, but we still need +* it for the no-clip optimization. + ldx #$04 ;count edges needing clip + + lda #NUM_ROWS-1 ;191 + sec + sbc ]cy ;maxY = 191-cy + cmp in_rad + blt :ylimok + lda in_rad ;clamp to radius + dex +:ylimok sta ]max_y ;maxY = 191-cy + + lda ]cy ;minY = cy + cmp in_rad + blt :ylimok2 + lda in_rad ;clamp to radius + dex +:ylimok2 sta ]min_y + + lda ]cxh + beq :xlimlo +* Examples (note # bad, must use rad +* cx=24, 23-24=255 + carry clear --> ok, chk rad +* cx=255, 23-255=24 + carry clear --> ok, chk rad +:xlimlo + lda # 255) ? + cmp in_rad + blt :xlimok2 + lda in_rad ;clamp to radius + dex +:xlimok2 sta ]min_x + +:xlimdone + + do USE_FAST ;***** + stx circ_clip + fin ;***** + +* set top/bottom rows for rasterizer + lda ]cy + clc + adc ]max_y + sta rast_bottom + lda ]cy + sec + sbc ]min_y + sta rast_top + + DO 0 ;debug debug debug + LDA ]min_x ;save a copy where the + STA $0380 ; monitor won't trash it + LDA ]max_x + STA $0381 + LDA ]min_y + STA $0382 + LDA ]max_y + STA $0383 + FIN + +* Set initial conditions for Bresenham. + ldx #0 ;:x = 0 + stx ]xsav + ldy in_rad ;:y = rad + sty ]ysav + lda #1 ;:d = 1 - rad + sec + sbc ]ysav ;in_rad + sta ]dlo + bcs :hizero ;C==1 if in_rad<=1 + ldx #$ff ;C was 0, make neg +:hizero stx ]dhi + +* +* Outer loop -- plot 8 points, then update values. +* +circ_loop + + do USE_FAST ;***** + lda circ_clip + beq ncypy + jmp with_clip + +* Quick version, no clipping required +* row cy+y: cx-x and cx+x +ncypy + lda ]ysav + clc + adc ]cy + tay ;y-coord in Y-reg + + lda ]cxl + sec + sbc ]xsav + sta rastx0l,y + lda ]cxh + sbc #$00 + sta rastx0h,y +_cp00 jsr cplotl + + lda ]cxl + clc + adc ]xsav + sta rastx1l,y + lda ]cxh + adc #$00 + sta rastx1h,y +_cp01 jsr cplotrn + +* row cy-y: cx-x and cx+x +ncymy + lda ]cy + sec + sbc ]ysav + tay ;y-coord in Y-reg + + lda ]cxl + sec + sbc ]xsav + sta rastx0l,y + lda ]cxh + sbc #$00 + sta rastx0h,y +_cp02 jsr cplotl + + lda ]cxl + clc + adc ]xsav + sta rastx1l,y + lda ]cxh + adc #$00 + sta rastx1h,y +_cp03 jsr cplotrn + +* row cy+x: cx-y and cx+y +ncypx + lda ]xsav ;off bottom? + clc + adc ]cy + tay ;y-coord in Y-reg + + lda ]cxl + sec + sbc ]ysav + sta rastx0l,y + lda ]cxh + sbc #$00 + sta rastx0h,y +_cp04 jsr cplotl + + lda ]cxl + clc + adc ]ysav + sta rastx1l,y + lda ]cxh + adc #$00 + sta rastx1h,y +_cp05 jsr cplotrn + +* row cy-x: cx-y and cx+y +ncymx + lda ]cy + sec + sbc ]xsav + tay ;y-coord in Y-reg + + lda ]cxl + sec + sbc ]ysav + sta rastx0l,y + lda ]cxh + sbc #$00 + sta rastx0h,y +_cp06 jsr cplotl + + lda ]cxl + clc + adc ]ysav + sta rastx1l,y + lda ]cxh + adc #$00 + sta rastx1h,y +_cp07 jsr cplotrn + +* CLICK + jmp circ_plot_done + + fin ;***** (USE_FAST) + +* +* Same thing, but this time clipping edges. +* +with_clip + +* row cy+y: cx-x and cx+x +ccypy + lda ]ysav ;off bottom? + cmp ]max_y + beq :cypy_ok + bge cypy_skip ;completely off screen +:cypy_ok clc + adc ]cy + tay ;y-coord in Y-reg + + ldx ]xsav ;handle cx-x + cpx ]min_x + blt :cxmx_ok + beq :cxmx_ok + lda #0 ;clip at 0 + sta rastx0l,y + sta rastx0h,y + beq cxmx_done0 ;always + BREAK +:cxmx_ok lda ]cxl + sec + sbc ]xsav + sta rastx0l,y + lda ]cxh + sbc #$00 + sta rastx0h,y +_cp08 jsr cplotl +cxmx_done0 + + cpx ]max_x ;handle cx+x + blt :cxpx_ok + beq :cxpx_ok + lda #NUM_COLS-1 + sta rastx1h,y + bne cxpx_done0 ;always + BREAK +:cxpx_ok lda ]cxl + clc + adc ]xsav + sta rastx1l,y + lda ]cxh + adc #$00 + sta rastx1h,y +_cp09 jsr cplotr +cxpx_done0 +cypy_skip + +* row cy-y: cx-x and cx+x +ccymy + lda ]ysav ;off top? + cmp ]min_y + beq :cymy_ok + bge cymy_skip +:cymy_ok lda ]cy + sec + sbc ]ysav + tay ;y-coord in Y-reg + + ldx ]xsav ;handle cx-x + cpx ]min_x + blt :cxmx_ok + beq :cxmx_ok + lda #0 ;clip at 0 + sta rastx0l,y + sta rastx0h,y + beq cxmx_done1 ;always + BREAK +:cxmx_ok lda ]cxl + sec + sbc ]xsav + sta rastx0l,y + lda ]cxh + sbc #$00 + sta rastx0h,y +_cp10 jsr cplotl +cxmx_done1 + + cpx ]max_x ;handle cx+x + blt :cxpx_ok + beq :cxpx_ok + lda #NUM_COLS-1 + sta rastx1h,y + bne cxpx_done1 ;always + BREAK +:cxpx_ok lda ]cxl + clc + adc ]xsav + sta rastx1l,y + lda ]cxh + adc #$00 + sta rastx1h,y +_cp11 jsr cplotr +cxpx_done1 +cymy_skip + +* row cy+x: cx-y and cx+y +ccypx + lda ]xsav ;off bottom? + cmp ]max_y + beq :cypx_ok + bge cypx_skip +:cypx_ok clc + adc ]cy + tay ;y-coord in Y-reg + + ldx ]ysav ;handle cx-y + cpx ]min_x + blt :cxmy_ok + beq :cxmy_ok + lda #0 ;clip at 0 + sta rastx0l,y + sta rastx0h,y + beq cxmy_done2 ;always + BREAK +:cxmy_ok lda ]cxl + sec + sbc ]ysav + sta rastx0l,y + lda ]cxh + sbc #$00 + sta rastx0h,y +_cp12 jsr cplotl +cxmy_done2 + + cpx ]max_x ;handle cx+y + blt :cxpy_ok + beq :cxpy_ok + lda #NUM_COLS-1 + sta rastx1h,y + bne cxpy_done2 ;always + BREAK +:cxpy_ok lda ]cxl + clc + adc ]ysav + sta rastx1l,y + lda ]cxh + adc #$00 + sta rastx1h,y +_cp13 jsr cplotr +cxpy_done2 +cypx_skip + +* row cy-x: cx-y and cx+y +ccymx + lda ]xsav ;off top? + cmp ]min_y + beq :cymx_ok + bge cymx_skip +:cymx_ok lda ]cy + sec + sbc ]xsav + tay ;y-coord in Y-reg + + ldx ]ysav ;handle cx-y + cpx ]min_x + blt :cxmy_ok + beq :cxmy_ok + lda #0 ;clip at 0 + sta rastx0l,y + sta rastx0h,y + beq cxmy_done3 ;always + BREAK +:cxmy_ok lda ]cxl + sec + sbc ]ysav + sta rastx0l,y + lda ]cxh + sbc #$00 + sta rastx0h,y +_cp14 jsr cplotl +cxmy_done3 + + cpx ]max_x ;handle cx+y + blt :cxpy_ok + beq :cxpy_ok + lda #NUM_COLS-1 + sta rastx1h,y + bne cxpy_done3 ;always + BREAK +:cxpy_ok lda ]cxl + clc + adc ]ysav + sta rastx1l,y + lda ]cxh + adc #$00 + sta rastx1h,y +_cp15 jsr cplotr +cxpy_done3 +cymx_skip + +circ_plot_done +* Update X/Y/D. Up to about radius=41 we can maintain +* 'd' in an 8-bit register. + do USE_FAST ;***** + lda circ_8bit + beq circ_slow + +* +* Bresenham update, with 8-bit 'd'. +* + ldx ]xsav + lda ]dlo + bmi :dneg + txa ;:d = d + ((x-y)*4) +5 + sec + sbc ]ysav ;x <= y, may be neg or 0 + asl + asl + clc ;can't know carry + adc #5 + clc ;still don't want carry + adc ]dlo + sta ]dlo + dec ]ysav ;:y-- + jmp :loopbot +:dneg txa ;:d = d + (x*4) +3 + asl + asl ;x always pos, C=0 + DO 0 + BCC :TEST ;debug + BREAK ;debug +:TEST ;debug + FIN + adc #3 + adc ]dlo + sta ]dlo +:loopbot + inx ;:x++ + stx ]xsav + cpx ]ysav + beq :again + bge circ_done +:again jmp circ_loop + + fin ;***** + +* +* Bresenham update, with 16-bit 'd' +* +circ_slow + CLICK + ldx ]xsav + lda ]dhi + bmi :dneg + lda ]dlo + clc + adc #5 + sta ]dlo + bcc :noinc + inc ]dhi +:noinc + txa ;:d = d + ((x-y)*4) +5 + ldy #$00 + sty ]hitmp + sec + sbc ]ysav ;x <= y, may be neg or 0 + beq :xeqy ;if x==y, nothing to add + ldy #$ff + sty ]hitmp + asl + rol ]hitmp + asl + rol ]hitmp + clc + adc ]dlo + sta ]dlo + lda ]dhi + adc ]hitmp + sta ]dhi +:xeqy + dec ]ysav ;:y-- + jmp :loopbot + +:dneg lda ]dlo ;:d = d + (x*4) + 3 + clc + adc #3 + sta ]dlo + bcc :noinc2 + inc ]dhi +:noinc2 txa + ldy #0 ;x always positive + sty ]hitmp + asl + rol ]hitmp + asl + rol ]hitmp + clc ;not needed? + adc ]dlo + sta ]dlo + lda ]dhi + adc ]hitmp + sta ]dhi +:loopbot + inx ;:x++ + stx ]xsav + cpx ]ysav + beq :again + bge circ_done +:again jmp circ_loop + + +circ_done rts + + +* Plot a point for outline circle rendering. +* +* X and Y must be preserved. Y holds the current line +* number. +* +* Most DP locations are in use -- see the variable +* declarations at the start of the circle function. + +* cplotl is the entry point for the leftmost point. +cplotl + stx ]savxreg + sty ]savyreg + + lda ylooklo,y + sta ]hbasl + lda ylookhi,y +_pg_or2 ora #$20 + sta ]hbasl+1 + +* Convert the X coordinate into byte/bit. + ldx rastx0l,y ;x coord, lo + lda rastx0h,y ;>= 256? + beq :lotabl ;no, use the low table + ldy div7hi,x + lda mod7hi,x + bpl cplotcom ;always + BREAK ;debug +:lotabl ldy div7lo,x + lda mod7lo,x + jmp cplotcom + +* cplotr is the entry point for the rightmost point. +* We use rastx1 instead of rastx0. +cplotr + lda ylooklo,y + sta ]hbasl + lda ylookhi,y +_pg_or3 ora #$20 + sta ]hbasl+1 + +* If we just plotted the left point on the same line, +* we can skip the Y-lookup by jumping here. +cplotrn + stx ]savxreg + sty ]savyreg + + ldx rastx1l,y ;x coord, lo + lda rastx1h,y ;>= 256? + beq :lotabl ;no, use the low table + ldy div7hi,x + lda mod7hi,x + bpl cplotcom ;always + BREAK ;debug +:lotabl ldy div7lo,x + lda mod7lo,x + +* Plot the point. The byte offset (0-39) is in Y, +* the bit offset (0-6) is in A. +cplotcom + tax + lda colorline,y ;start with color pattern + eor (]hbasl),y ;flip all bits + and andmask,x ;clear other bits + eor (]hbasl),y ;restore ours, set theirs + sta (]hbasl),y + + ldx ]savxreg + ldy ]savyreg + rts + +* Reconfigure calc_circle to either JSR to cplotl/r, +* or just BIT the address (a 4-cycle no-op). The +* desired instruction is in A. +fixcplot + do USE_FAST ;***** + sta _cp00 + sta _cp01 + sta _cp02 + sta _cp03 + sta _cp04 + sta _cp05 + sta _cp06 + sta _cp07 + fin ;***** + sta _cp08 + sta _cp09 + sta _cp10 + sta _cp11 + sta _cp12 + sta _cp13 + sta _cp14 + sta _cp15 + rts diff --git a/FDRAW.LINE.S b/FDRAW.LINE.S new file mode 100644 index 0000000..db0df77 --- /dev/null +++ b/FDRAW.LINE.S @@ -0,0 +1,588 @@ +******************************** +* * +* Fast Apple II Graphics * +* By Andy McFadden * +* Version 0.3, Aug 2015 * +* * +* Point and line functions * +* (Included by FDRAW.S) * +* * +* Developed with Merlin-16 * +* * +******************************** + + +******************************** +* +* Draw a single point in the current color. +* +******************************** +DrawPoint +]hbasl equ zptr0 + + ldy in_y0 + lda ylooklo,y + sta ]hbasl + lda ylookhi,y + ora g_page + sta ]hbasl+1 + + ldx in_x0l ;x coord, lo + lda in_x0h ;>= 256? + beq :lotabl ;no, use the low table + ldy div7hi,x + lda mod7hi,x + bpl :plotit ;always + BREAK ;debug +:lotabl ldy div7lo,x + lda mod7lo,x + +* Plot the point. The byte offset (0-39) is in Y, +* the bit offset (0-6) is in A. +:plotit + tax + lda colorline,y ;start with color pattern + eor (]hbasl),y ;flip all bits + and andmask,x ;clear other bits + eor (]hbasl),y ;restore ours, set theirs + sta (]hbasl),y + rts + + +******************************** +* +* Draw a line between two points. +* +******************************** +DrawLine + +]hbasl equ zptr0 +]xposl equ zloc0 ;always left edge +]xposh equ zloc1 +]ypos equ zloc2 ;top or bottom +]deltaxl equ zloc3 +]deltaxh equ zloc4 +]deltay equ zloc5 +]count equ zloc6 +]counth equ zloc7 +]diff equ zloc8 +]diffh equ zloc9 +]andmask equ zloc10 +]wideflag equ zloc11 ;doesn't really need DP + +* We use a traditional Bresenham run-length approach. +* Run-slicing is possible, but the code is larger +* and the increased cost means it's only valuable +* for longer lines. An optimal solution would switch +* approaches based on line length. +* +* Start by identifying where x0 or x1 is on the +* left. To make life simpler we always work from +* left to right, flipping the coordinates if +* needed. +* +* We also need to figure out if the line is more +* than 255 pixels long -- which, because of +* inclusive coordinates, means abs(x0-x1) > 254. + lda in_x1l ;assume x0 on left + sec + sbc in_x0l + tax + beq checkvert ;low bytes even, check hi + lda in_x1h + sbc in_x0h + bcs lx0left + +* x1 is on the left, so the values are negative +* (hi byte in A, lo byte in X) +lx0right eor #$ff ;invert hi + sta ]deltaxh ;store + txa + eor #$ff ;invert lo + sta ]deltaxl + inc ]deltaxl ;add one for 2s complement + bne :noinchi ;rolled into high byte? + inc ]deltaxh ;yes +:noinchi lda in_x1l ;start with x1 + sta ]xposl + lda in_x1h + sta ]xposh + lda in_y1 + sta ]ypos + sec + sbc in_y0 ;compute deltay + jmp lncommon + +checkvert + lda in_x1h ;diff high bytes + sbc in_x0h ;(carry still set) + blt lx0right ;width=256, x0 right + bne lx0left ;width=256, x0 left + jmp vertline ;all zero, go vert + +* (branch back from below) +* This is a purely horizontal line. We farm the job +* out to the raster fill code for speed. (There's +* no problem with the line code handling it; its just +* more efficient to let the raster code do it.) +phorizontal + ldy ]ypos + sty rast_top + sty rast_bottom + lda ]xposl + sta rastx0l,y + clc + adc ]deltaxl ;easier to add delta back + sta rastx1l,y ; in than sort out which + lda ]xposh ; arg is left vs. right + sta rastx0h,y + adc ]deltaxh + sta rastx1h,y + jmp FillRaster + +* x0 is on the left, so the values are positive +lx0left stx ]deltaxl + sta ]deltaxh + lda in_x0l ;start with x0 + sta ]xposl + lda in_x0h + sta ]xposh + lda in_y0 ;and y0 + sta ]ypos + sec + sbc in_y1 ;compute deltay + +* Value of (starty - endy) is in A, flags still set. +lncommon + bcs :posy + eor #$ff ;negative, invert + adc #$01 + sta ]deltay + lda #$e8 ;INX + bne gotdy +:posy +_lmb beq phorizontal + sta ]deltay + lda #$ca ;DEX +gotdy sta _hmody + sta _vmody + sta _wmody + + do 0 ;***** for regression test + ldx #$01 + lda ]deltaxh + bne :iswide + lda ]deltaxl + cmp #$ff ;== 255? + beq :iswide + ldx #$00 ;notwide +:iswide stx $300 + lda ]xposl + sta $301 + lda ]xposh + sta $302 + lda ]ypos + sta $303 + ldx ]deltaxl + stx $304 + ldx ]deltaxh + stx $305 + ldx ]deltay + stx $306 + lda _hmody + and #$20 ;nonzero means inc, + sta $307 ; zero means dec + fin ;***** + +* At this point we have the initial X position in +* ]startxl/h, the initial Y position in ]starty, +* deltax in ]deltaxl, deltay in ]deltay, and we've +* tweaked the Y-update instructions to either INC or +* DEC depending on the direction of movement. +* +* The next step is to decide whether the line is +* horizontal-dominant or vertical-dominant, and +* branch to the appropriate handler. +* +* The core loops for horiz and vert take about +* 80 cycles when moving diagonally, and about +* 20 fewer when moving in the primary direction. +* The wide-horiz is a bit slower. + ldy #$01 ;set "wide" flag to 1 + lda ]deltaxl + ldx ]deltaxh + bne horzdom ;width >= 256 + cmp #$ff ;width == 255 + beq horzdom + dey ;not wide + cmp ]deltay + bge horzdom ; for diagonal lines + jmp vertdom + +* We could special-case pure-diagonal lines here +* (just BEQ a couple lines up). It does +* represent our worst case. I'm not convinced +* we'll see them often enough to make it worthwhile. + + +* horizontal-dominant +horzdom + sty ]wideflag + sta ]count ;:count = deltax + 1 + inc ]count + lsr ;:diff = deltax / 2 + sta ]diff + +* set Y to the byte offset in the line +* load the AND mask into ]andmask + ldx ]xposl + lda ]xposh ;>= 256? + beq :lotabl ;no, use the low table + ldy div7hi,x + lda mod7hi,x + bpl :gottab ;always +* BREAK ;debug +:lotabl ldy div7lo,x + lda mod7lo,x +:gottab + tax + lda andmask,x + sta ]andmask + +* Set initial value for line address. + ldx ]ypos + lda ylooklo,x + sta ]hbasl + lda ylookhi,x + ora g_page + sta ]hbasl+1 + + lda ]wideflag ;is this a "wide" line? + beq :notwide ;nope, stay local + jmp widedom + +:notwide lda colorline,y ;set initial color mask + sta _hlcolor+1 + jmp horzloop + +hrts rts + +* bottom of loop, essentially +hnoroll sta ]diff ;3 +hdecc dec ]count ;5 :count-- + beq hrts ;2 :while (count != 0) + ;= 7 or 10 + +* We keep the byte offset in the line in Y, and the +* line index in X, for the entire loop. +horzloop +_hlcolor lda #$00 ;2 start with color pattern +_lmdh eor (]hbasl),y ;5 flip all bits + and ]andmask ;3 clear other bits + eor (]hbasl),y ;5 restore ours, set theirs + sta (]hbasl),y ;6 = 21 + +* Move right. We shift the bit mask that determines +* the pixel. When we shift into bit 7, we know it's +* time to advance another byte. +* +* If this is a shallow line we would benefit from +* keeping the index in X and just doing a 4-cycle +* indexed load to get the mask. Not having the +* line number in X makes the line calc more +* expensive for steeper lines though. + lda ]andmask ;3 + asl ;2 shift, losing hi bit + eor #$80 ;2 set the hi bit + bne :noh8 ;3 cleared hi bit? +* We could BEQ away and branch back in, but this +* happens every 7 iterations, so on average it's +* a very small improvement. If we happen to branch +* across a page boundary the double-branch adds +* two more cycles and we lose. + iny ;2 advance to next byte + lda colorline,y ;4 update color mask + sta _hlcolor+1 ;4 + lda #$81 ;2 reset +:noh8 sta ]andmask ;3 = 13 + ((12-1)/7) = 14 + +* Update error diff. + lda ]diff ;3 + sec ;2 + sbc ]deltay ;3 :diff -= deltay + bcs hnoroll ;2+ :if (diff < 0) ... + ;= 11 level, 10 up/down + adc ]deltaxl ;3 : diff += deltax + sta ]diff ;3 +_hmody inx ;2 : ypos++ (or --) + lda ylooklo,x ;4 update hbasl after line + sta ]hbasl ;3 change + lda ylookhi,x ;4 +_pg_or4 ora #$20 ;2 + sta ]hbasl+1 ;3 + bne hdecc ;3 = +27 this path -> 37 + BREAK +* horizontal: 10+21+14+11=56 cycles/pixel +* diagonal: 7+21+14+37=79 cycles/pixel + + +* Vertical-dominant line. Could go up or down. +vertdom + ldx in_y0 + cpx ]ypos ;starting at y0? + bne :endy0 ;yup + ldx in_y1 ;nope +:endy0 stx _vchk+1 ;end condition + + lda ]deltay + lsr + sta ]diff ;:diff = deltay / 2 + +* set Y to the byte offset in the line +* load the AND mask into ]andmask + ldx ]xposl + lda ]xposh ;>= 256? + beq :lotabl ;no, use the low table + ldy div7hi,x + lda mod7hi,x + bpl :gottab ;always + BREAK ;debug +:lotabl ldy div7lo,x + lda mod7lo,x +:gottab + tax + lda andmask,x ;initial pixel mask + sta ]andmask + + lda colorline,y ;initial color mask + sta _vlcolor+1 + + ldx ]ypos + jmp vertloop + +* We keep the byte offset in the line in Y, and the +* line index in X, for the entire loop. + +* Bottom of loop, essentially. +vnoroll sta ]diff ;3 + +vertloop + lda ylooklo,x ;4 + sta ]hbasl ;3 + lda ylookhi,x ;4 +_pg_or5 ora #$20 ;2 + sta ]hbasl+1 ;3 = 16 + +_vlcolor lda #$00 ;2 start with color pattern +_lmdv eor (]hbasl),y ;5 flip all bits + and ]andmask ;3 clear other bits + eor (]hbasl),y ;5 restore ours, set theirs + sta (]hbasl),y ;6 = 21 + +_vchk cpx #$00 ;2 was this last line? + beq vrts ;2 yes, done +_vmody inx ;2 :ypos++ (or --) + +* Update error diff. + lda ]diff ;3 + sec ;2 + sbc ]deltaxl ;3 :diff -= deltax + bcs vnoroll ;2 :if (diff < 0) ... + ;= 10 vert, 9 move right + + adc ]deltay ;3 : diff += deltay + sta ]diff ;3 +* Move right. We shift the bit mask that determines +* the pixel. When we shift into bit 7, we know it's +* time to advance another byte. + lda ]andmask ;3 + asl ;2 shift, losing hi bit + eor #$80 ;2 set the hi bit + beq :is8 ;2+ goes to zero on 8th bit + sta ]andmask ;3 + bne vertloop ;3 = 21 + (18/7) = 24 + BREAK + +:is8 iny ;2 advance to next byte + lda colorline,y ;4 update color + sta _vlcolor+1 ;4 + lda #$81 ;2 reset + sta ]andmask ;3 + bne vertloop ;3 = 18 + BREAK +vrts rts +* vertical: 3 + 16 + 21 + 6 + 10 = 56 cycles +* diagonal: 16 + 21 + 6 + 9 + 24 = 76 cycles + + +* "Wide" horizontally-dominant loop. We have to +* maintain error-diff and deltax as 16-bit values. +* Most of the setup from the "narrow" version carried +* over, but we have to re-do the count and diff. +* +* Normally we set count to (deltax + 1) and decrement +* to zero, but it's actually easier to set it equal +* to deltax and check for -1. +widedom + lda ]deltaxh ;:count = deltax + sta ]counth + ldx ]deltaxl + stx ]count + stx ]diff + lsr ;:diff = deltax / 2 + ror ]diff + sta ]diffh + ldx ]ypos + + lda colorline,y ;set initial color mask + sta _wlcolor+1 + +* We keep the byte offset in the line in Y, and the +* line index in X, for the entire loop. +wideloop +_wlcolor lda #$00 ;2 start with color pattern +_lmdw eor (]hbasl),y ;5 flip all bits + and ]andmask ;3 clear other bits + eor (]hbasl),y ;5 restore ours, set theirs + sta (]hbasl),y ;6 = 21 + +* Move right. We shift the bit mask that determines +* the pixel. When we shift into bit 7, we know it's +* time to advance another byte. + lda ]andmask ;3 + asl ;2 shift, losing hi bit + eor #$80 ;2 set the hi bit + bne :not7 ;3 goes to zero on 8th bit + iny ; 2 advance to next byte + lda colorline,y ; 4 update color mask + sta _hlcolor+1 ; 4 + lda #$81 ; 2 reset +:not7 sta ]andmask ;3 = 13 usually, 25 every 7 + +* Update error diff, which is a positive number. If +* it goes negative ("if (diff < 0)") we act. + lda ]diff + sec + sbc ]deltay ;:diff -= deltay + bcs wnoroll ;didn't even roll low byte + dec ]diffh ;check hi byte + bpl wnoroll ;went 1->0, keep going + + adc ]deltaxl ;: diff += deltax + sta ]diff + lda ]diffh + adc ]deltaxh + sta ]diffh +_wmody inx ;: ypos++ (or --) + lda ylooklo,x ;update hbasl after line + sta ]hbasl ; change + lda ylookhi,x +_pg_or6 ora #$20 + sta ]hbasl+1 + bne wdecc + BREAK + +wnoroll sta ]diff + +wdecc dec ]count ;5 :count-- + lda ]count ;3 + cmp #$ff ;2 + bne wideloop ;3 :while (count > -1) + dec ]counth ;low rolled, decr high + beq wideloop ;went 1->0, keep going + rts + + +* Pure-vertical line. These are common in certain +* applications, and checking for it only adds two +* cycles to the general case. +vertline + ldx in_y0 + ldy in_y1 + cpx in_y1 ;y0 < y1? + blt :usey0 ;yes, go from y0 to y1 + txa ;swap X/A + tay + ldx in_y1 +:usey0 stx ]ypos + iny + sty _pvytest+1 + + ldx in_x0l ;xc lo + lda in_x0h ;>= 256? + beq :lotabl + ldy div7hi,x + lda mod7hi,x + bpl :gotit ;always +:lotabl ldy div7lo,x + lda mod7lo,x + +* Byte offset is in Y, mod-7 value is in A. +:gotit tax + lda andmask,x + sta _pvand+1 ;this doesn't change + + lda colorline,y + sta _pvcolor+1 ;nor does this + + ldx ]ypos ;top line + +* There's a trick where, when (linenum & 0x07) is +* nonzero, you just add 4 to hbasl+1 instead of +* re-doing the lookup. However, TXA+AND+BEQ +* followed by LDA+CLC+ADC+STA is 16 cycles, the same +* as our self-modified lookup, so it's not a win. +* (And if we used a second ylookhi and self-modded +* the table address, we could shave off another 2.) + +* Main pure-vertical loop +pverloop + lda ylooklo,x ;4 + sta ]hbasl ;3 + lda ylookhi,x ;4 +_pg_or7 ora #$20 ;2 + sta ]hbasl+1 ;3 (= 16) + +_pvcolor lda #$00 ;2 start with color pattern +_lmdpv eor (]hbasl),y ;5 flip all bits +_pvand and #$00 ;2 clear other bits + eor (]hbasl),y ;5 + sta (]hbasl),y ;6 (= 20) + + inx ;2 +_pvytest cpx #$00 ;2 done? + bne pverloop ;3 = 7 + rts +* 43 cycles/pixel + + +******************************** +* +* Set the line mode according to in_arg +* +* A slightly silly feature to get xdraw lines +* without really working for it. +* +******************************** +SetLineMode + lda in_arg + beq :standard + +* configure for xdraw + lda #$24 ;BIT dp + sta _lmb + sta _lmdh + sta _lmdv + sta _lmdw + sta _lmdpv + rts + +* configure for standard drawing +:standard lda #$f0 ;BEQ + sta _lmb + lda #$51 ;EOR (dp),y + sta _lmdh + sta _lmdv + sta _lmdw + sta _lmdpv + rts diff --git a/FDRAW.S b/FDRAW.S new file mode 100644 index 0000000..64a2096 --- /dev/null +++ b/FDRAW.S @@ -0,0 +1,805 @@ +******************************** +* * +* Fast Apple II Graphics * +* By Andy McFadden * +* Version 0.3, Aug 2015 * +* * +* Main source file * +* * +* Developed with Merlin-16 * +* * +******************************** + +* Set to 1 to build FDRAW.FAST, set to zero to +* build FDRAW.SMALL. +USE_FAST equ 1 + +* Set to 1 to turn on beeps/clicks for debugging. +NOISE_ON equ 0 + + + lst off + org $6000 + +* +* Macros. +* +spkr equ $c030 +bell equ $ff3a + +* If enabled, click the speaker (changes flags only). +CLICK mac + do NOISE_ON + bit spkr + fin + <<< +* If enabled, beep the speaker (scrambles regs). +BEEP mac + do NOISE_ON + jsr bell + fin + <<< +* If enabled, insert a BRK. +BREAK mac + do NOISE_ON + brk $99 + fin + <<< + +* In "fast" mode, we align tables on page boundaries so we +* don't take a 1-cycle hit when the indexing crosses a page. +* In "small" mode, we skip the alignment. +PG_ALIGN mac + do USE_FAST + ds \ + fin + <<< + +* +* Hi-res screen constants. +* +BYTES_PER_ROW = 40 +NUM_ROWS = 192 +NUM_COLS = 280 + +* +* Variable storage. We assign generic names to +* zero-page scratch locations, then assign variables +* with real names to these. +* +* 06-09 are unused (except by SWEET-16) +* 1a-1d are Applesoft hi-res scratch +* cc-cf are only used by INTBASIC +* eb-ef and ff appear totally unused by ROM routines +* +zptr0 equ $1a ;2b +zloc0 equ $06 +zloc1 equ $07 +zloc2 equ $08 +zloc3 equ $09 +zloc4 equ $1c +zloc5 equ $1d +zloc6 equ $cc +zloc7 equ $cd +zloc8 equ $ce +zloc9 equ $cf +zloc10 equ $eb +zloc11 equ $ec +zloc12 equ $ed +zloc13 equ $ee + + +******************************** +* +* Entry points for external programs. +* +******************************** +Entry + jmp Init ;initialize data tables + dfb 0,3 ;version number + +* +* Parameters passed from external programs. +* +in_arg ds 1 ;generic argument +in_x0l ds 1 ;X coordinate 0, low part +in_x0h ds 1 ;X coordinate 0, high part +in_y0 ds 1 ;Y coordinate 0 +in_x1l ds 1 +in_x1h ds 1 +in_y1 ds 1 +in_rad ds 1 ;radius for circles + + ds 3 ;pad to 16 bytes + + jmp SetColor + jmp SetPage + jmp Clear + jmp DrawPoint + jmp DrawLine + jmp DrawRect + jmp FillRect + jmp DrawCircle + jmp FillCircle + jmp SetLineMode + jmp noimpl ;reserved2 + jmp FillRaster + +* Raster fill values. Top, bottom, and pointers to tables +* for the benefit of external callers. +rast_top ds 1 +rast_bottom ds 1 + da rastx0l + da rastx0h + da rastx1l + da rastx1h + +noimpl rts + + +******************************** +* +* Global variables. +* +******************************** + +g_inited dfb 0 ;initialized? +g_color dfb 0 ;hi-res color (0-7) +g_page dfb $20 ;hi-res page ($20 or $40) + + +******************************** +* +* Initialize. +* +******************************** +Init + lda #$00 + sta in_arg + jsr SetColor ;set color to zero + jsr SetLineMode ;set normal lines + lda #$20 + sta in_arg + sta g_inited + jmp SetPage ;set hi-res page 1 + + +******************************** +* +* Set the color. +* +******************************** +SetColor + lda in_arg + cmp g_color ;same as the old color? + beq :done + + and #$07 ;safety first + sta g_color + +* Update the "colorline" table, which provides a quick color +* lookup for odd/even bytes. We could also have one table +* per color and self-mod the "LDA addr,y" instructions to +* point to the current one, but that uses a bunch of memory +* and is kind of ugly. Takes 16 + (12 * 40) = 496 cycles. + tax ;2 + lda xormask,x ;4 + sta :_xormsk+1 ;4 + + lda oddcolor,x ;4 + ldy #BYTES_PER_ROW-1 ;2 +]loop sta colorline,y ;5 +:_xormsk eor #$00 ;2 + dey ;2 + bpl ]loop ;3 + +:done rts + + +******************************** +* +* Set the page. +* +******************************** +SetPage + lda g_inited ;let's just check this + beq noinit ; (not called too often) + + lda in_arg + cmp #$20 + beq :good + cmp #$40 + beq :good + jmp bell +:good + sta g_page + + do 0 ;***** + cmp ylookhi + beq :tabok +* Check to see if the values currently in the Y-lookup table +* match our current page setting. If they don't, we need to +* adjust the code that does lookups. + +* This approach modifies the table itself, paying a large +* cost now so we don't have to pay it on every lookup. +* However, this costs 2+(16*192)=3074 cycles, while an +* "ORA imm" only adds two to each lookup, so we'd have +* to do a lot of drawing to make this worthwhile. +* (Note: assumes ylookhi is based at $2000 not $0000) + ldy #NUM_ROWS ;2 +]loop lda ylookhi-1,y ;4 + eor #$60 ;2 $20 <--> $40 + sta ylookhi-1,y ;5 + dey ;2 + bne ]loop ;3 + + else ;***** + +* This approach uses self-modifying code to update the +* relevant instructions. It's a bit messy to have it +* here, but it saves us from having to do it on +* every call. +* +* We could also have a second y-lookup table and +* use this to update the pointers. That would let +* us drop the "ORA imm" entirely, without the cost +* of the rewrite above, but eating up another 192 bytes. + sta _pg_or1+1 ;rastfill + sta _pg_or2+1 ;circle hplot + sta _pg_or3+1 ;circle hplot + sta _pg_or4+1 ;drawline + sta _pg_or5+1 ;drawline + sta _pg_or6+1 ;drawline + sta _pg_or7+1 ;drawline + + fin ;***** + +:tabok rts + +noinit ldy #$00 +]loop lda :initmsg,y + beq :done + jsr $fded ;cout + iny + bne ]loop +:done rts + +:initmsg asc "FDRAW NOT INITIALIZED",87,87,00 + + +******************************** +* +* Clear the screen to the current color. +* +******************************** +Clear + + do USE_FAST ;***** +* This performs a "visually linear" clear, erasing the screen +* from left to right and top to bottom. To reduce the amount +* of code required we erase in thirds (top/middle/bottom). +* +* Compare to a "venetian blind" clear, which is what you get +* if you erase memory linearly. +* +* The docs discuss different approaches. This version +* requires ((2 + 5*64 + 11) * 40 + 14) * 3 = 40002 cycles. +* If we didn't divide it into thirds to keep the top-down +* look, we'd need (5*64 + 9) * 120 = 39480 cycles, so +* we're spending 522 cycles to avoid the venetian look. + lda :clrloop+2 + cmp g_page + beq :pageok + +* We're on the wrong hi-res page. Flip to the other one. +* 4 + (20*64) = 1284 cycles to do the flip (+ a few more +* because we're probably crossing a page boundary). + BEEP + ldy #NUM_ROWS ;2 +]loop lda :clrloop-3+2,y ;4 + eor #$60 ;2 + sta :clrloop-3+2,y ;5 + dey ;2 + dey ;2 + dey ;2 + bne ]loop ;3 + +:pageok ldx g_color ;grab the current color + lda xormask,x + sta :_xormsk+1 + lda evencolor,x + + ldy #0 + jsr :clearthird + ldy #BYTES_PER_ROW + jsr :clearthird + ldy #BYTES_PER_ROW*2 +* fall through into :clearthird for final pass + +:clearthird + ldx #BYTES_PER_ROW-1 ;2 +:clrloop sta $2000,y ;5 (* 64) + sta $2400,y ;this could probably be + sta $2800,y ; done with LUP math + sta $2c00,y + sta $3000,y + sta $3400,y + sta $3800,y + sta $3c00,y + sta $2080,y + sta $2480,y + sta $2880,y + sta $2c80,y + sta $3080,y + sta $3480,y + sta $3880,y + sta $3c80,y + sta $2100,y + sta $2500,y + sta $2900,y + sta $2d00,y + sta $3100,y + sta $3500,y + sta $3900,y + sta $3d00,y + sta $2180,y + sta $2580,y + sta $2980,y + sta $2d80,y + sta $3180,y + sta $3580,y + sta $3980,y + sta $3d80,y + sta $2200,y + sta $2600,y + sta $2a00,y + sta $2e00,y + sta $3200,y + sta $3600,y + sta $3a00,y + sta $3e00,y + sta $2280,y + sta $2680,y + sta $2a80,y + sta $2e80,y + sta $3280,y + sta $3680,y + sta $3a80,y + sta $3e80,y + sta $2300,y + sta $2700,y + sta $2b00,y + sta $2f00,y + sta $3300,y + sta $3700,y + sta $3b00,y + sta $3f00,y + sta $2380,y + sta $2780,y + sta $2b80,y + sta $2f80,y + sta $3380,y + sta $3780,y + sta $3b80,y + sta $3f80,y +:_xormsk eor #$00 ;2 flip odd/even bits + iny ;2 + dex ;2 + bmi :done ;2 + jmp :clrloop ;3 +:done rts + + else ;***** not USE_FAST + +* This version was suggested by Marcus Heuser on +* comp.sys.apple2.programmer. It does a "venetian blind" +* clear, and takes (5 * 32 + 7) * 248 = 41416 cycles. +* It overwrites half of the screen holes. + lda :clrloop+5 + cmp g_page + beq :pageok + +* We're on the wrong hi-res page. Flip to the other one. +* 12 + (20*31) = 632 cycles to do the flip. We have to +* single out the first entry because it's $1f not $20. + BEEP + lda :clrloop+2 ;4 + eor #$20 ;2 $1f <-> $3f + sta :clrloop+2 ;4 + ldy #31*3 ;2 +]loop lda :clrloop+2,y ;4 + eor #$60 ;2 $20 <-> $40 + sta :clrloop+2,y ;5 + dey ;2 + dey ;2 + dey ;2 + bne ]loop ;3 + +:pageok ldx g_color + lda xormask,x + sta :_xormsk+1 + lda oddcolor,x + ldy #248 ;120 + 8 + 120 +:clrloop +]addr = $1fff + lup 32 ;begin a loop in assembler + sta ]addr,y ;5 +]addr = ]addr+$100 ;sta 20ff,21ff,... + --^ +:_xormsk eor #$00 ;2 + dey ;2 + bne :clrloop ;3 + rts + + fin ;***** not USE_FAST + + +******************************** +* +* Draw rectangle outline. +* +******************************** +DrawRect +* We could just issue 4 line draw calls here, maybe +* adjusting the vertical lines by 1 pixel up/down to +* avoid overdraw. But if the user wanted 4 lines, +* they could just draw 4 lines. Instead, we're going +* to draw a double line on each edge to ensure that +* the outline rectangle always has the correct color. +* +* Rather than draw two vertical lines, we draw a +* two-pixel-wide filled rectangle on each side. +* +* We don't want to double-up if the rect is only one +* pixel wide, so we have to check for that. +* +* If the rect is one pixel high, it's just a line. +* If it's two pixels high, we don't need to draw +* the left/right edges, just the top/bottom lines. +* If it's more than two tall, we don't need to draw +* the left/right edges on the top and bottom lines, +* so we save a few cycles by skipping those. + + lda in_y1 ;copy top/bottom to local + sta rast_bottom + dec rast_bottom ;move up one + sec + sbc in_y0 + beq :isline ;1 pixel high, just draw line + cmp #1 + beq :twolines ;2 pixels high, lines only + ldy in_y0 + iny ;start down a line + sty rast_top + + lda in_x0h ;check to see if left/right + cmp in_x1h ; coords are the same; if + bne :notline ; so, going +1/-1 at edge + lda in_x0l ; will overdraw. + cmp in_x1l + bne :notlin1 + +:isline jmp DrawLine ;just treat like line + +* Set up left edge. Top line is in Y. +:notline lda in_x0l +:notlin1 sta rastx0l,y + clc + adc #1 + sta rastx1l,y + lda in_x0h + ora #$80 ;"repeat" flag + sta rastx0h,y + and #$7f + adc #0 + sta rastx1h,y + jsr FillRaster + + ldy rast_top + lda in_x1l ;now set up right edge + sta rastx1l,y + sec + sbc #1 + sta rastx0l,y + lda in_x1h + sta rastx1h,y + sbc #0 + ora #$80 ;"repeat" flag + sta rastx0h,y + jsr FillRaster + +* Now the top/bottom lines. +:twolines + ldy in_y0 + jsr :drawline + ldy in_y1 + +:drawline + sty rast_top + sty rast_bottom + lda in_x0l ;copy left/right to the + sta rastx0l,y ; table entry for the + lda in_x0h ; appropriate line + sta rastx0h,y + lda in_x1l + sta rastx1l,y + lda in_x1h + sta rastx1h,y + jmp FillRaster + + +******************************** +* +* Draw filled rectangle. +* +******************************** +FillRect +* Just fill out the raster table and call the fill routine. +* We require y0=top, y1=bottom, x0=left, x1=right. + ldy in_y0 + sty rast_top + lda in_y1 + sta rast_bottom + + lda in_x0l + sta rastx0l,y + lda in_x0h + ora #$80 ;"repeat" flag + sta rastx0h,y + lda in_x1l + sta rastx1l,y + lda in_x1h + sta rastx1h,y + + jmp FillRaster + + +******************************** +* +* Fill an area defined by the raster tables. +* +******************************** +FillRaster + +* Render rasterized output. The left and right edges +* are stored in the rastx0/rastx1 tables, and the top +* and bottom-most pixels are in rast_top/rast_bottom. +* +* This can be used to render an arbitrary convex +* polygon after it has been rasterized. +* +* If the high bit of the high byte of X0 is set, we +* go into "repeat" mode, where we just repeat the +* previous line. This saves about 40 cycles of +* overhead per line when drawing rectangles, plus +* what we would have to spend to populate multiple +* lines of the raster table. It only increases the +* general per-line cost by 3 cycles. +* +* We could use the "repeat" flag to use this code to +* draw vertical lines, though that's mostly of value +* to an external caller who knows ahead of time that +* the line is vertical. The DrawLine code is pretty +* good with vertical lines, and adding additional +* setup time to every vertical-dominant line to +* decide if it should call here seems like a +* losing proposition. + +]hbasl equ zptr0 +]hbash equ zptr0+1 +]lftbyte equ zloc0 +]lftbit equ zloc1 +]rgtbyte equ zloc2 +]rgtbit equ zloc3 +]line equ zloc4 +]andmask equ zloc5 +]cur_line equ zloc6 +]repting equ zloc7 + + ldx g_color ;configure color XOR byte + lda xormask,x + do USE_FAST ;***** + cmp rast_unroll+3 ;already configured? + beq :goodmask + jsr fixrastxor +:goodmask + else + sta _xorcolor+1 + fin ;***** + + lda #$00 + sta ]repting + + ldy rast_top + +* Main rasterization loop. Y holds the line number. +rastloop + sty ]cur_line ;3 + ldx ylooklo,y ;4 + stx ]hbasl ;3 + lda ylookhi,y ;4 +_pg_or1 ora #$20 ;2 will be $20 or $40 + sta ]hbash ;3 = 19 cycles + do USE_FAST-1 ;***** i.e. not USE_FAST + stx _wrhires+1 + sta _wrhires+2 + fin ;***** + +* divide left edge by 7 + ldx rastx0l,y ;4 line num in Y + lda rastx0h,y ;4 + bpl :noflag ;2 + sta rastx0h+1,y ;4 propagate + lda ]repting ;3 first time through? + beq :firstre ;2 yup, finish calculations + lda ]rgtbyte ;3 need this in A + bpl :repeat ;3 always +:firstre lda rastx0h,y ;reload + sta ]repting ;any nonzero will do + and #$7f ;strip repeat flag +:noflag beq :lotabl + lda mod7hi,x + sta ]lftbit + lda div7hi,x + sta ]lftbyte + bpl :gotlft ;always + BREAK ;debug +:lotabl lda mod7lo,x + sta ]lftbit + lda div7lo,x + sta ]lftbyte +:gotlft + +* divide right edge by 7 + ldx rastx1l,y ;4 line num in Y + lda rastx1h,y ;4 + beq :lotabr ;3 + lda mod7hi,x + sta ]rgtbit + lda div7hi,x + sta ]rgtbyte + bpl :gotrgt ;always + BREAK ;debug +:lotabr lda mod7lo,x ;4 + sta ]rgtbit ;3 + lda div7lo,x ;4 + sta ]rgtbyte ;3 = 25 for X1 < 256 +:gotrgt + +:repeat + cmp ]lftbyte ;3 + bne :not1byte ;3 + +* The left and right edges are in the same byte. We +* need to set up the mask differently, so we deal with +* it as a special case. + ldy ]lftbit + lda leftmask,y ;create the AND mask + ldx ]rgtbit + and rightmask,x ;strip out bits on right + sta ]andmask + + ldy ]lftbyte + lda colorline,y ;get color bits + eor (]hbasl),y ;combine w/screen + and ]andmask ;remove not-ours + eor (]hbasl),y ;combine again + sta (]hbasl),y + jmp rastlinedone + +* This is the more general case. We special-case the +* left and right edges, then byte-stomp the middle. +* On entry, ]rgtbyte is in A +:not1byte + sec ;2 compute number of full + sbc ]lftbyte ;3 and partial bytes to + tax ;2 draw + inx ;2 + + ldy ]rgtbit ;3 + cpy #6 ;2 + beq :rgtnospcl ;3 + lda rightmask,y ;handle partial-byte right + sta ]andmask + ldy ]rgtbyte + lda colorline,y + eor (]hbasl),y + and ]andmask + eor (]hbasl),y + sta (]hbasl),y + dex ;adjust count +:rgtnospcl + + ldy ]lftbit ;3 check left for partial + beq :lftnospcl ;3 + lda leftmask,y ;handle partial-byte left + sta ]andmask + ldy ]lftbyte + lda colorline,y + eor (]hbasl),y + and ]andmask + eor (]hbasl),y + sta (]hbasl),y + dex ;adjust count + beq rastlinedone ;bail if all done + iny ;advance start position + bne :liny ;always + BREAK +:lftnospcl + + ldy ]lftbyte ;3 +:liny + + do USE_FAST ;***** "fast" loop +* Instead of looping, jump into an unrolled loop. +* Cost is 10 cycles per byte with an extra 14 cycles +* of overhead, so we start to win at 4 bytes. + lda rastunidx,x ;4 + sta :_rastun+1 ;4 + lda colorline,y ;4 get odd/even color val +:_rastun jmp rast_unroll ;3 + + else ;***** "slow" loop +* Inner loop of the renderer. This runs 0-40x. +* Cost is 14 cycles/byte. + lda colorline,y ;get appropriate odd/even val +_wrhires sta $2000,y ;5 replaced with line addr +_xorcolor eor #$00 ;2 replaced with $00/$7f + iny ;2 + dex ;2 + bne _wrhires ;3 + + fin ;***** + +rastlinedone + ldy ]cur_line ;3 more lines to go? + cpy rast_bottom ;4 + bge :done ;2 + iny ;2 + jmp rastloop ;3 must have line in Y + +:done rts + +fixrastxor + do USE_FAST ;***** +* Update the EOR statements in the unrolled rastfill code. +* Doing this with a loop takes ~600 cycles, doing it with +* unrolled stores takes 160. We only do this when we +* need to, so changing the color from green to blue won't +* cause this to run. +* +* Call with the XOR value in A. +]offset = 0 + lup BYTES_PER_ROW + sta rast_unroll+3+]offset +]offset = ]offset+5 + --^ + BEEP + rts + fin ;***** + + +* include the line functions + put FDRAW.LINE + +* include the circle functions + put FDRAW.CIRCLE + + lst on +CODE_END equ * ;end of code section + lst off + +* include the data tables + put FDRAW.TABLES + + lst on +DAT_END equ * ;end of data / BSS + lst off + +* Save the appropriate object file. + do USE_FAST + sav FDRAW.FAST + else + sav FDRAW.SMALL + fin diff --git a/FDRAW.TABLES.S b/FDRAW.TABLES.S new file mode 100644 index 0000000..d1d91f2 --- /dev/null +++ b/FDRAW.TABLES.S @@ -0,0 +1,339 @@ +******************************** +* * +* Fast Apple II Graphics * +* By Andy McFadden * +* Version 0.3, Aug 2015 * +* * +* Pre-computed data and * +* large internal buffers. * +* (Included by FDRAW.S) * +* * +* Developed with Merlin-16 * +* * +******************************** + +* Expected layout with alignment: +* +* P1 ylooklo, misc tables +* P2 ylookhi, colorline +* P3 rastx0l +* P4 rastx0h +* P5 rastx1l +* P6 rastx1h, div7hi, mod7hi +* P7 div7lo +* P8 mod7lo +* P9 rast_unroll, rastunidx +* +* Tables should be just under $900 bytes. + + PG_ALIGN + +* Hi-res Y lookup, low part (192 bytes). +ylooklo HEX 0000000000000000 + HEX 8080808080808080 + HEX 0000000000000000 + HEX 8080808080808080 + HEX 0000000000000000 + HEX 8080808080808080 + HEX 0000000000000000 + HEX 8080808080808080 + HEX 2828282828282828 + HEX a8a8a8a8a8a8a8a8 + HEX 2828282828282828 + HEX a8a8a8a8a8a8a8a8 + HEX 2828282828282828 + HEX a8a8a8a8a8a8a8a8 + HEX 2828282828282828 + HEX a8a8a8a8a8a8a8a8 + HEX 5050505050505050 + HEX d0d0d0d0d0d0d0d0 + HEX 5050505050505050 + HEX d0d0d0d0d0d0d0d0 + HEX 5050505050505050 + HEX d0d0d0d0d0d0d0d0 + HEX 5050505050505050 + HEX d0d0d0d0d0d0d0d0 + +* Color masks for odd/even bytes, colors 0-7. +evencolor dfb $00,$2a,$55,$7f,$80,$aa,$d5,$ff +oddcolor dfb $00,$55,$2a,$7f,$80,$d5,$aa,$ff + +* XOR mask for colors 0-7 - non-BW flip on odd/even. +xormask dfb $00,$7f,$7f,$00,$00,$7f,$7f,$00 + +* AND mask for the 7 pixel positions, high bit set +* for the color shift. +andmask dfb $81,$82,$84,$88,$90,$a0,$c0 + +* These are pixel AND masks, used with the modulo 7 +* result. Entry #2 in leftmask means we're touching +* the rightmost 5 pixels, and entry #2 in rightmask +* means we're touching the 3 leftmost pixels. +* +* The high bit is always set, because we want to +* keep the color's high bit. +leftmask dfb $ff,$fe,$fc,$f8,$f0,$e0,$c0 +rightmask dfb $81,$83,$87,$8f,$9f,$bf,$ff + + PG_ALIGN + +* Hi-res Y lookup, high part (192 bytes). +* OR with $20 or $40. +ylookhi HEX 0004080c1014181c + HEX 0004080c1014181c + HEX 0105090d1115191d + HEX 0105090d1115191d + HEX 02060a0e12161a1e + HEX 02060a0e12161a1e + HEX 03070b0f13171b1f + HEX 03070b0f13171b1f + HEX 0004080c1014181c + HEX 0004080c1014181c + HEX 0105090d1115191d + HEX 0105090d1115191d + HEX 02060a0e12161a1e + HEX 02060a0e12161a1e + HEX 03070b0f13171b1f + HEX 03070b0f13171b1f + HEX 0004080c1014181c + HEX 0004080c1014181c + HEX 0105090d1115191d + HEX 0105090d1115191d + HEX 02060a0e12161a1e + HEX 02060a0e12161a1e + HEX 03070b0f13171b1f + HEX 03070b0f13171b1f + +* Masks for current color (even/odd), e.g. 55 2a 55 2a ... +* Updated whenever the color changes. +colorline ds 40 + + PG_ALIGN +rastx0l ds NUM_ROWS + PG_ALIGN +rastx0h ds NUM_ROWS + ds 1 ;repeat mode can overstep + PG_ALIGN +rastx1l ds NUM_ROWS + PG_ALIGN +rastx1h ds NUM_ROWS + +* Lookup tables for dividing 0-279 by 7. The "hi" +* parts are 24 bytes each, so they fit inside +* the previous 192-byte entry. The "lo" parts +* each fill a page. +div7hi HEX 2424242525252525 + HEX 2525262626262626 + HEX 2627272727272727 +mod7hi HEX 0405060001020304 + HEX 0506000102030405 + HEX 0600010203040506 + + PG_ALIGN + +div7lo HEX 0000000000000001 + HEX 0101010101010202 + HEX 0202020202030303 + HEX 0303030304040404 + HEX 0404040505050505 + HEX 0505060606060606 + HEX 0607070707070707 + HEX 0808080808080809 + HEX 0909090909090a0a + HEX 0a0a0a0a0a0b0b0b + HEX 0b0b0b0b0c0c0c0c + HEX 0c0c0c0d0d0d0d0d + HEX 0d0d0e0e0e0e0e0e + HEX 0e0f0f0f0f0f0f0f + HEX 1010101010101011 + HEX 1111111111111212 + HEX 1212121212131313 + HEX 1313131314141414 + HEX 1414141515151515 + HEX 1515161616161616 + HEX 1617171717171717 + HEX 1818181818181819 + HEX 1919191919191a1a + HEX 1a1a1a1a1a1b1b1b + HEX 1b1b1b1b1c1c1c1c + HEX 1c1c1c1d1d1d1d1d + HEX 1d1d1e1e1e1e1e1e + HEX 1e1f1f1f1f1f1f1f + HEX 2020202020202021 + HEX 2121212121212222 + HEX 2222222222232323 + HEX 2323232324242424 +mod7lo HEX 0001020304050600 + HEX 0102030405060001 + HEX 0203040506000102 + HEX 0304050600010203 + HEX 0405060001020304 + HEX 0506000102030405 + HEX 0600010203040506 + HEX 0001020304050600 + HEX 0102030405060001 + HEX 0203040506000102 + HEX 0304050600010203 + HEX 0405060001020304 + HEX 0506000102030405 + HEX 0600010203040506 + HEX 0001020304050600 + HEX 0102030405060001 + HEX 0203040506000102 + HEX 0304050600010203 + HEX 0405060001020304 + HEX 0506000102030405 + HEX 0600010203040506 + HEX 0001020304050600 + HEX 0102030405060001 + HEX 0203040506000102 + HEX 0304050600010203 + HEX 0405060001020304 + HEX 0506000102030405 + HEX 0600010203040506 + HEX 0001020304050600 + HEX 0102030405060001 + HEX 0203040506000102 + HEX 0304050600010203 + + +* RastFill unrolled loop. At each step we store the current +* color value, XOR it to flip the bits if needed, and advance. +* The caller needs to set the appropriate initial value based +* on whether the address is odd or even. +* +* We can use a 3-cycle "EOR dp" or a 2-cycle "EOR imm". The +* former is one cycle slower, the latter requires us to +* self-mod 40 instructions when the color changes. +* +* This must be page-aligned so that we can take the value +* from the rastunidx table and self-mod a JMP without having +* to do a 16-bit add. We have just enough room for the +* unrolled loop (40*5+3) and x5 table (41) = 244 bytes, fits +* on a single page. + + do USE_FAST ;***** + ds \ +]hbasl equ zptr0 ;must match FillRaster +rast_unroll equ * + lst off + lup BYTES_PER_ROW + sta (]hbasl),y ;6 + eor #$00 ;2 + iny ;2 10 cycles, 5 bytes + --^ + jmp rastlinedone + +* Index into rast_unroll. If we need to output N bytes, +* we want to jump to (rast_unroll + (40 - N) * 5) (where +* 5 is the number of bytes per iteration). +rastunidx +]offset = BYTES_PER_ROW*5 + lup BYTES_PER_ROW+1 ;0-40 + dfb ]offset +]offset = ]offset-5 + --^ + + fin ;***** + + +******************************** +* +* Code used to generate tables above. If you want to +* decrease load size, use these functions to generate +* the data into empty memory, then discard the code. +* (Maybe use a negative DS and overlap with rastx0l?) +* +******************************** + DO 0 ;***** + +init_ylook +]hbasl equ zptr1 +]hbash equ zptr1+1 + +* Initialize Y-lookup table. We just call the bascalc +* function. + ldx #NUM_ROWS + ldy #NUM_ROWS-1 +]loop tya + jsr bascalc + lda hbasl + sta ylooklo,y + lda hbash + ora #$20 ;remove for $0000 base + sta ylookhi,y + dey + dex + bne ]loop + rts + +* Hi-res base address calculation. This is based on the +* HPOSN routine at $F411. +* +* Call with the line in A. The results are placed into +* zptr1. X and Y are not disturbed. +* +* The value is in the $0000-1fff range, so you must OR +* the desired hi-res page in. +* +bascalc + pha + and #$c0 + sta ]hbasl + lsr + lsr + ora ]hbasl + sta ]hbasl + pla + sta ]hbash + asl + asl + asl + rol ]hbash + asl + rol ]hbash + asl + ror ]hbasl + lda ]hbash + and #$1f + sta ]hbash + rts + +* +* Create divide-by-7 tables. +* +mkdivtab +]val equ zloc0 + + ldy #0 + sty ]val + ldx #0 +]loop lda ]val + sta div7lo,y + txa + sta mod7lo,y + inx + iny + beq :lodone + cpx #7 + bne ]loop + inc ]val + ldx #0 + beq ]loop ;always +:lodone ;safe to ignore ]va update +]loop lda ]val + sta div7hi,y + txa + sta mod7hi,y + iny + cpy #280-256 + beq :hidone + inx + cpx #7 + bne ]loop + inc ]val + ldx #0 + beq ]loop ;always +:hidone rts + + FIN ;***** diff --git a/README.md b/README.md index f70f48e..f356872 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,59 @@ -# fdraw -Fast Apple II graphics +fdraw +===== + +Fast graphics routines for the Apple II +By Andy McFadden +Version 0.3, August 2015 + +## Overview ## + +The fdraw library provides fast rendering of points, lines, rectangles, +and circles, as well as high-speed screen clears, for Apple II hi-res +graphics. It can be used from Applesoft or 6502 assembly language. + +Two disk images are available in the [fdraw-disks.zip](fdraw-disks) zip +archive. `fdrawdemo.do` is a 140K disk image with the demos that will +run on an Apple ][+ or later. `fdrawdev.po` is an 800K disk image with +the source code, demos, and a few extras. + +A video of the demos running in the AppleWin emulator +[https://www.youtube.com/watch?v=z2RFGVoaROE](is available). + +Learn more about how fdraw works in the +[docs/manual.md](library documentation). + +Learn about the demos in the [docs/demos.md](demo documentation). + +Learn more about what possessed me to write a graphics library for the +Apple II more than 20 years after the platform was discontinued in the +[docs/personal-notes.md](fadden's brain documentation). + +The main bits of source code are accessible from git for easy viewing, +but the "official" home is on `fdrawdev.po`. + +All code is copyright 2015 by Andy McFadden. All rights reserved. The +source code is available under the Apache 2 license (a very friendly +open-source license). + + +### Version History ### + +##### v0.1 March 13, 2006 + +No source code, just a demo with fast filled circles and screen clears. + +##### v0.2 March 20, 2006 + +Polished up the sources and published. This version implemented Clear, +FillRect, FillCircle, and FillRaster. + +##### v0.3 August 21, 2015 + +Added DrawPoint, DrawLine, DrawRect, DrawCircle, and SetLineMode. Various +size and performance improvements. + +Added Amperfdraw to make Applesoft BASIC programming easier. + +Added several more demos and tests. + +Added documentation. diff --git a/docs/demos.md b/docs/demos.md new file mode 100644 index 0000000..669562e --- /dev/null +++ b/docs/demos.md @@ -0,0 +1,167 @@ +fdraw Demo README +================= + +The fdraw distribution comes with a handful of demonstration programs. +Most of them are written in Applesoft BASIC, and use the amperfdraw +interface. This is a somewhat poor way to demonstrate animation +performance, as Applesoft adds a tremendous amount of overhead, but it +is the only way to show what you *can* do with Applesoft. + +The easiest way to run them is with the "DEMO" program, which scans the +DEMOS directory for BASIC programs and presents a list. You can also +just run them directly. + +* INTRO : Sort of a "hello, world" for fdraw. Mix of single- and + double-buffered animation. + +* CIRCULAR : Draws lots of circles. + +* RECTSPLAT : Draws lots of rectangles. + +* CUBIC : Draws a spinning wireframe 3D cube. (The 3D coordinates are + pre-computed -- fdraw doesn't do matrix transforms.) + +* TUNNEL : Animates circles to simulate driving through a tunnel. + +* LINEAR : Draws lots of lines. The wipes show speed differences for + horizontal and vertical special cases, while the circular spinner + shows HPLOT is not as fast as &HPLOT which is not as fast as &PLOT for + a set of lines at a variety of angles. + +* LINE.DIFF : Draws several lines with the ROM routines and fdraw + side-by-side to illustrate the difference in line style. + +* CLEARLY : Clears the screen 32 times, 4 sets in each of the 8 colors. + The first round is done with the Applesoft ROM routine ("CALL 62454"), + the second round uses the fdraw &CLEAR function. + +* HRFAN : A simple line-art demo, using "xdraw" DrawLine with lines in + different colors. Not a great demo, as the Applesoft code driving it + is rather slow, but it looks pretty good if you bump up the emulation + speed or switch to IIgs "fast" mode. (This deserves a conversion to + assembly language.) + +* BRIAN.THEME.ORI : The Brian's Theme demo from the DOS 3.3 System + Master. Unmodified except for integration with the demo menu + system, and with the bug on line 31112 fixed. + +* BRIAN.THEME.NEW : The Brian's Theme demo with '&' placed in front of + the various draw calls. There isn't a huge difference in speed, as + there's a lot of overhead from Applesoft, but its interesting to note + the change in the appearance of the lines. + +* WIGGLE : Sample program that shows direct use of rasterization tables. + +When the demos are launched from the menu, they will assume that fdraw +is already loaded and won't try to load it again. If you run the demo +program directly, it will try to load FDRAW.FAST and AMPERFDRAW from the +parent directory before doing any drawing. + + +## Extras ## + +The EXTRAS directory has some additional software that isn't "officially" +part of fdraw, but may be of use. + +NOTE: some of these assume fdraw and amperfdraw are already loaded, and +will hang if not. Run DEMO and hit before running these. + +* ARRAY.EXAMPLE : The &PLOT example from the documentation. + +* XDRAW.ANIM : A demonstration of line animation using "xdraw" mode and + a simple shape that is drawn twice by a single &PLOT call. One copy + is offset by 2 pixels, so each &PLOT call erases the previous copy and + draws a new copy 2 pixels to the right. The animation is shown twice, + once with "erase all, draw all", and once with the erase and draw calls + interleaved for every line. + +* LINEFONT : Program for creating draw-array tables for text phrases. Used + to create data files for the "intro" demo. See the "LINEFONT Details" + section for more information. + +* DAVIEWER: Views the contents of .DA files created by LINEFONT. + +* BENCHCLEAR : Calls the "clear" function 256 times from a small + assembly-language program. Handy for benchmarks, but slightly silly + since it's relatively easy to calculate the exact cycle cost. + + +## LINEFONT Details ## + +NOTE: this program is an unfinished rough cut ("pre alpha"), used for +preparing data for demos. + +The program includes a font definition, routines for displaying +characters, and code for generating and exporting pre-rendered strings. + +Character vertices are expressed as floating-point values. The baseline +is at zero, the peak ascent is at 1.0, the lowest descent is -1.0. The +leftmost pixel is at zero, the maximum value for the rightmost pixel is 1.0. +Characters don't have to fill out the entire cell -- proportionally-spaced +fonts are supported -- but they are expected to start at the left edge. + +So a capital 'M' might look like this: + + 0.0,0.0 -> 0.0,1.0 -> 0.5,0.7 -> 1.0,1.0 -> 1.0,0.0 + +There is currently no "user interface", unless the "user" can program in +Applesoft BASIC. To generate strings, add a series of statements that set +variables and call 20000 to add rendered strings to the set. The relevant +variables are: + + S$ - string to add + DW - desired width, in pixels, of a cell 1.0 units wide + DH - desired height, in pixels of a cell 2.0 units high (ascent + descent) + IS% - inter-character spacing, in pixels + SW% - width of the space character (usually same as DW) + MO% - monospace flag; if nonzero, all chars are treated as 1.0 units wide + +Remove the REM from the start of line 1010 to enable the character viewer. +At present only a couple of lower-case letters are defined. + + +#### LINEFONT Output #### + +The LINEFONT program outputs a binary blob that can be passed to +the &PLOT array-draw function. The file structure is: + ++0 byte - number of array sets in the list. ++1 2 bytes * N - table of offsets to individual array sets. One of + these per array set. The value is the offset from the start of the + file. + +(2N+1) array set #1: ++0 byte - number of vertices (0-127) ++1 byte - number of index pairs (0-127) ++2 2 bytes * V - vertices (values are signed X/Y) ++X 2 bytes * I - index pairs (values are 0-127) + +To display phrase #3, you would get the 16-bit value from the offset +table with PEEK(start + 1 + 3 * 2) + PEEK(start + 2 + 3 * 2) * 256. +You get the number of vertices from PEEK(start + offset), and the number +of index pairs from PEEK(start + offset + 1). Finally, call the array-draw +function with: + + VA = start + offset + 2 + IA = VA + num_vertices * 2 + &PLOT va, ia, num_index_pairs + +The 0,0 point in the blob is in the center of the phrase horizontally +(which allows a maximum width of 255 pixels), and at the font baseline +vertically (so most of the font will appear above the zero point, but +descenders will extend below). + + +#### Future Enhancements #### + +Right now the font definition is embedded in the program. This takes up +a lot of space -- before too long the BASIC program is going to intrude +on the hi-res page -- and is unnecessarily restrictive. The font should be +defined by a separate program, and BSAVEd into a line-font file that +LINEFONT can load. + +Generating strings should be menu-driven and interactive, rather than +requiring manual changes to the code to fiddle with sizes and spacing. +DAVIEWER should be folded into the generation program (though it's kind +of handy as a simple example of how to unpack and access content). + diff --git a/docs/manual.md b/docs/manual.md new file mode 100644 index 0000000..a188b36 --- /dev/null +++ b/docs/manual.md @@ -0,0 +1,990 @@ +fdraw Library Documentation +=========================== + +Fast graphics primitives for the Apple II +By Andy McFadden +Version 0.3, August 2015 + +## Overview ## + +The fdraw library provides fast rendering of points, lines, rectangles, +and circles, as well as high-speed screen clears, for Apple II hi-res +graphics. It can be used from Applesoft or assembly language. + +The Applesoft ROM routines were designed to be as compact as possible, +and were unable to use self-modifying code techniques, so their speed is +less than what the Apple II is capable of. The fdraw routines pick a +different point in the speed/space trade-off continuum, providing fast +speeds at a reasonable size. Not everyone agrees on what "reasonable" +means, so the fdraw code can be built in two modes, one that favors +speed, one that reduces size. + +**Contents:** + +- [Applesoft BASIC Ampersand API](#amperapi) +- [Raw API](#rawapi) +- [Building the Code](#building) +- [Apple II Hi-res in a Nutshell](#nutshell) +- [Notes on the Drawing Functions](#notes) +- [General Notes](#additional-notes) +- [Enhancement Ideas](#ideas) +- [My Quest for Lines](#history) + + +
+## Applesoft BASIC Ampersand API (Amperfdraw) ## + +The ampersand API acts as a bridge between Applesoft BASIC and fdraw. +It's more convenient and has less overhead than POKE and CALL, though +you are not prevented from using that approach if you prefer. It's +best to use one or the other though, not mix and match. + +All arguments are checked for validity. An appropriate Applesoft +error is thrown if invalid syntax or arguments are discovered. + +This is not intended to be compatible with, nor a replacement for, the +ampersand utilities in Beagle Graphics. + +* &NEW - calls the fdraw Init function (which sets the color to 0 and + selects hi-res page 1). You must do this once, at the start of + your program, after fdraw has been loaded. This also resets internal + amperfdraw state, setting the "HPLOT TO" origin to (0,0) and the "AT" + point to (139,95). +* &HGR - does what HGR does, only faster. Equivalent to executing + `&HCOLOR=0:&SCRN(1):&CLEAR:&HCOLOR=[prevcolor]`, and then setting the + display softswitches to display hi-res page 1 in mixed mode. Also sets + $e6 (HPAG) for convenience in case you want to mix & match with ROM + routines. +* &HGR2 - like &HGR, but for page 2. Like HGR2, this turns off + mixed-text mode. +* &SCRN({1,2}) - sets the hi-res page that will be used for drawing. Does + not change which page is displayed. (Use the softswitches, or call + &INVERSE.) +* &INVERSE - flips the render page to the other page, and hits the + display softswitches to show the page that was just rendered. Intended + for double-buffered animation. +* &HCOLOR={0-7} - sets color, using the same numbering scheme as Applesoft. + Does not affect the color used by the ROM routines. +* &CLEAR - clears screen to current color. +* &HPLOT [TO] x,y [TO x,y ...] - draws a point or a line. Works the same as + Applesoft, e.g. "&HPLOT TO" starts from the end of the previously + drawn line, and you can chain multiple "TO x,y" in a single statement. +* &EXP {0,1} - set line mode. 0 is normal, 1 is "xdraw". +* &XDRAW left,top,right,bottom - draws outline rectangle. +* &DRAW left,top,right,bottom - draws filled rectangle. +* &COS cx,cy,r - draws outline circle. +* &SIN cx,cy,r - draws filled circle. + +* &AT cx,cy - sets center offset for array-based rendering. Position must + be on the hi-res screen (0-279, 0-191). +* &PLOT vertexAddr, indexAddr, indexCount [AT cx,cy] - draws from the + specified byte-arrays. See the "Drawing Lines with Indexed Byte-Arrays" + section for the full explanation. + + +
+## Raw API ## + +The code is assembled at $6000 by default. The program's length includes +all data tables and work areas, and no memory outside of the program, +zero page, and the current hi-res page is modified. + +Input parameters and the function jump table are located near the start +of the program. The API description below describes the addresses in +relative terms. + +Input parameters are not checked for validity. They must be in the range +specified by the API, or undefined (but probably bad) behavior will result. +The values will not be modified by fdraw functions. + +All drawing operations use the current color. + +* +0 Init - call this when the library is first loaded. It must be + called before any other functions are used. It initializes the + color to zero and the page to $20. +* +3 (major version number, currently 0) +* +4 (minor version number, currently 3) +* +5 Input parameter area: + * +5 arg - used for misc functions, e.g. SetColor and SetPage + * +6 x0l - low part of the X0 coordinate (0-279) + * +7 x0h - high part of X0 + * +8 y0 - Y0 coordinate (0-191) + * +9 x1l - low part of X1 (0-279) + * +10 x1h - high part of X1 + * +11 y1 - Y1 coordinate (0-191) + * +12 rad - circle radius (0-255) +* +13 (reserved) +* +16 SetColor - set the color used for drawing (0-7) to the value in "arg". + The numbering is the same as the Applesoft hi-res colors. +* +19 SetPage - set the hi-res page used for drawing to the value in "arg", + which must be $20 or $40. Does not change the page that is displayed. + (Because a bad value can cause memory corruption, this value *is* + checked, and bad values rejected.) +* +22 Clear - erase the current hi-res page to the current color. +* +25 DrawPoint - plot a single point at x0,y0. +* +28 DrawLine - draw a line from x0,y0 to x1,y1 (inclusive). +* +31 DrawRect - draw a rectangle with corners at x0,y0 and x1,y1 (inclusive). + x0,y0 is the top-left, x1,y1 is the bottom-right. The left and + right edges will be drawn two bits wide to ensure that the edges + are visible (drawn at x0+1, x1-1). +* +34 FillRect - draw a filled rectangle with corners at x0,y0 and x1,y1 + (inclusive). +* +37 DrawCircle - draw a circle with center at x0,y0 and radius=rad. +* +40 FillCircle - draw a filled circle with center at x0,y0 and radius=rad. +* +43 SetLineMode - set the DrawLine mode to the value in "arg", which can + be 0 (normal) or 1 (xdraw). +* +46 (reserved) + +* +49 FillRaster - draw an arbitrary shape from the rasterization tables. + For each line from top to bottom, the left and right edges will + be read from rastx1/rastx2 and a raster drawn in the current color. +* +52 (byte) topmost line to rasterize (0-191) +* +53 (byte) bottom-most line to rasterize (0-191), inclusive +* +54 (2 bytes) address of rastx1l table +* +56 (2 bytes) address of rastx1h table +* +58 (2 bytes) address of rastx2l table +* +60 (2 bytes) address of rastx2h table + +The rasterization table addresses are read-only; changing them will have +no effect. + +fdraw uses a fair number of zero page locations. The exact set can be +determined by looking at FDRAW.S. The locations were chosen to not +interfere with DOS, ProDOS, Applesoft, or the Monitor. They may +interfere with Integer BASIC, SWEET16, or your own application code. +Remapping them to different locations is straightforward: just change +the assignment of zptr/zloc values near the top of FDRAW.S to use +different addresses. fdraw does not expect any zero page value to be +preserved across calls, so you're welcome to use those locations in your +own code, but understand that fdraw functions will overwrite them. + + +
+## Apple II Hi-res in a Nutshell ## + +This is a quick overview of the Apple II hi-res graphics architecture +for anyone not recently acquainted. + +The Apple II hi-res graphics screen is a quirky beast. The typical +API treats it as 280x192 with 6 colors (black, white, green, purple, +orange, blue), though the reality is more complicated than that. + +There are two hi-res screens, occupying 8K each, at $2000 and $4000. +You turn them on and flip between them by accessing softswitches in +memory-mapped I/O space. + +Each byte determines the color of seven adjacent pixels, so it takes +(280 / 7) = 40 bytes to store each line. The lines are organized into +groups of three (120 bytes), which are interleaved across thirds of +the screen. To speed the computation used to find the start of a +line in memory, the group is padded out to 128 bytes; this means +((192 / 3) * 8) = 512 of the 8192 bytes are part of invisible +"screen holes". The interleaving is responsible for the characteristic +"venetian blind" effect when clearing the screen. + +Now imagine 280 bits in a row. If two consecutive bits are on, you +get white. If they're both off, you get black. If they alternate +on and off, you get color. The color depends on the position of the bit; +for example, if even-numbered bits are on, you get purple, while +odd-numbered bits yield green. The high bit in each byte adjusts the +position of bits within that byte by half a pixel, changing purple and +green to blue and orange. + +This arrangement has some curious consequences. If you have green and +purple next to each other, there will be a color glitch where they meet. +The reason is obvious if you look at the bit patterns when odd/even meet: +`...010101101010...` or `...101010010101...`. The first pattern has two +adjacent 1 bits (white), the latter two adjacent 0 bits (black). Things +get even weirder if split occurs at a byte boundary and the high bit is +different, as the half-pixel shift can make the "glitch" pixel wider or +narrower by half a pixel. + +The Applesoft ROM routines draw lines that are 1 bit wide. If you execute +a command like `HGR : HCOLOR=1 : HPLOT 0,0 to 0,10`, you won't see +anything happen. That's because HCOLOR=1 sets the color to green, +which means it only draws on odd pixels, but the HPLOT command we gave +drew a vertical line on even pixels. It set 11 bits to zero, but since +the screen was already zeroed out there was no apparent effect. + +If you execute `HGR : HCOLOR=3 : HPLOT 1,0 to 1,10`, you would expect a +white line to appear. However, drawing in "white" just means that no +bit positions are excluded. So it drew a vertical column of pixels at +X=1, which appears as a green line. + +If (without clearing the screen after the previous command) you execute +"HCOLOR=4 : HPLOT 5,0 to 5,10`, something curious happens: the green line +turns orange. HCOLOR=4 is black with the high-bit set. So we drew a +line of black in column 5 (which we won't see, because that part of the +screen is already black), and set the high bit in that byte. The same +byte holds columns 0 through 6, so drawing in column 5 also affected +column 1. We can put it back to green with "HCOLOR=0 : HPLOT 5,0 to 5,10". + +It's important to keep the structure in mind while drawing to avoid +surprises. + +Note that the Applesoft ROM routines treat 0,0 as the top-left corner, +with positive coordinates moving right and down, and lines are drawn +with inclusive end coordinates. This is different from many modern +systems. fdraw follows the Applesoft conventions to avoid confusion. + +Handy table of graphics softswitches: + +name | addr | decimal | purpose +------ | ----- | ------- | ------------------ +TXTCLR | $c050 | -16304 | enable graphics +TXTSET | $c051 | -16303 | text-only +MIXCLR | $c052 | -16302 | disable mixed mode +MIXSET | $c053 | -16301 | enable mixed mode (4 lines of text) +LOWSCR | $c054 | -16300 | display page 1 +HISCR | $c055 | -16299 | display page 2 +LORES | $c056 | -16298 | show lo-res screen +HIRES | $c057 | -16297 | show hi-res screen + + +
+## Building the Code ## + +The main fdraw code is written for the Merlin assembler (specifically +Merlin-16 3.40, though other versions should work). It uses plain 6502 +code, and is expected to run on an Apple ][+. + +For convenience when editing the files on an Apple II, and to allow the +code to be compiled by Merlin-16 running under ProDOS 8, the code is +broken into four files. The main file, FDRAW.S, includes the other +three with PUT directives. FDRAW.S holds the API entry points and some +of the drawing code. FDRAW.LINE.S has the code for drawing points and +lines, while FDRAW.CIRCLE.S has the code for drawing circles. +FDRAW.TABLE.S holds the data tables, as well as empty space for work +areas. The empty space is included in the binary so you can determine +the full memory footprint by looking at the length of the file. + +Near the top of FDRAW.S is a constant, `USE_FAST`, which may be set +to 0 or 1. If set to 0, some code optimizations are disabled, +reducing the size of the code and data areas. Further, the page +alignment on data tables is disabled, reducing the internal fragmentation +of the data area. + +The USE_FAST setting also determines which file recevies the assembler +output: FDRAW.FAST or FDRAW.SMALL. To generate both, it is necessary to +assemble the file, change the constant, and then assemble the file again. + +Tests and demos are written in Applesoft BASIC, with a couple of +exceptions. + + +### Why So Big? ### + +The fdraw code weighs in at a hefty 5KB (or 4KB for the "small" build). +That doesn't sound like much in the age of multi-gigabyte mobile phones, +but it's a sizeable fraction of the space available on an Apple ][+. + +If you want to modify individual pixels quickly, you need two things: +a line base-address table, and a divide-by-7 table. Computing base +addresses and dividing by 7 aren't hugely expensive, but we're going +to be doing them often, so they need to be as fast as possible. + +The line address table has 192 entries, one for each line, 2 bytes per +entry. The divide-by-7 table has 280 entries, one for each horizontal +pixel position, with one byte for the dividend and one for the quotient. +(The quotient can be expressed as a numeric value from 0 to 6, or as +a byte with a specific bit set.) + +That's 944 bytes. For optimum performance, each table must fit on a +single page of memory. We can split the division table into two pieces, +one for 0-255 and one for 256-279, and put the smaller half on the same +page as the Y table, along with 16 bytes of padding. The final size is +256 + 256 + (192+24+24+pad) + 192 = 960. So you can write off 1K of +memory before you've written any code. + +(There's a clever way to reduce the size of the y-lookup table to 24 +entries, but it's slightly faster and much easier to use full tables.) + +For the FillRaster function, fdraw needs to record the left and right +X coordinates on each line (2 bytes each), so that's 192 * 4 = 768 bytes. +Again, for optimum performance, each table needs to be on its own page, +so for USE_FAST=1 that expands to 1024 bytes. + +Add to that another full page of unrolled rasterization code, and you've +got 2304 bytes of tables. + +The rest is code, most of which was written with a flagrant disregard +for size. Many common code fragments are repeated inline, rather than +called as a subroutine, because a subroutine call (JSR+RTS) costs 12 +cycles. Calling a common "plot a point" function from the line-drawing +code would increase the per-pixel cost by 15-20%. + + +
+## Notes on the Drawing Functions ## + +### Screen Clear ### + +The Clear function erases the current hi-res page to the current color. +It's several times faster than the version built into the ROM. + +#### Performance #### + +The fastest possible way to clear the screen to a specific color on a +6502 is to write to every visible location with an absolute store +instruction. Subtracting the screen holes, that's 7680 address * +4 cycles = 30720 cycles. The code to do that would be 23,040 bytes long, +making it impractical. + +A slower but more memory-efficient approach has one store statement for +each line, and iterates through 40 times (280 / 7 = 40). Factoring in the +loop overhead, that comes out to 40 * (192 * 5 + 9) = 38760 cycles. +192 sets of store instructions fills 576 bytes, which is much better +than 23K, but still quite a lot. + +We can reduce the size further by taking the lines 3 at a time, erasing +the first 120 bytes in each 128-byte group (the last 8 bytes are the +screen hole). We'd need to use 7680/120 = 64 store instructions, for a +total of 120 * (64 * 5 + 9) = 39480 cycles, with 192 bytes for the main +part of the erase loop. We're not quite 2% slower, but 384 bytes +smaller, which seems a fair trade-off. Because we're accessing memory +linearly we now have a "venetian blind" clear, which is something of an +Apple II trademark, but we can fix that by spending an additional 522 +cycles to erase the screen in thirds (top/middle/bottom). + +Any further changes that make the code smaller also increase the execution +time. When built with USE_FAST=0, the code will use a different loop +with 32 stores that write 248 bytes each, and takes 41416 cycles. It's +half the size, but nearly 2000 cycles slower, and overwrites half of the +screen holes. + +At the extreme end of space over speed is the Applesoft ROM routine -- HGR +or "CALL 62454" -- which only needs about 30 bytes for its main loop, but +takes (8192*33)+(12*64)+17 = 271121 cycles for black or white, or +(8192*40)+(12*64)+17 = 328465 cycles for green/purple/blue/orange -- +7-8x slower than our preferred implementation. + +The screen clear is wired to a specific hi-res page, so the SetPage +function must rewrite the store instructions when the page changes (or +we need to keep two full copies of the function around). For an +application that is constantly doing flip-erase, the overhead must be +factored into the efficiency of the approach -- for example, rewriting +stores with indexed LDA/EOR/STA in a loop will take 20 cycles per iteration, +1280 cycles for the full set of 64. The "slow" clear has half the +number of store instructions, so takes half the time to fix up after +a page flip. + + +### Raster Fill ### + +Drawing an outline of a rectangle or circle can be done efficiently by +drawing lines or plotting points. Drawing a filled shape is more +expensive if one point is plotted at a time, especially on the Apple II +where every byte affects 7 pixels. + +For filled shapes, fdraw populates a rasterization table. The table has +192 entries, each of which holds the left and right edges of the shape +on that line. The code fills in the pixels one line at a time, using +a simple byte store for the middle parts, and bit masks at the edges. + +External applications can use the raster renderer directly by filling +out the rasterization table and calling FillRaster. + +While the FillRaster function itself will not modify the contents of the +raster tables, other fdraw calls will, sometimes unexpectedly. For +example, drawing a horizontal line is performed with a single-line +fill call. Filled rectangles might populate the table in the way you'd +expect, or might use some internal shortcut that only fills out one line +and sets a "repeat" flag. Don't make assumptions about what will be in +the table after a call to one of the drawing functions. You *can* count +on whatever you wrote there yourself to be unmodified after calls to +FillRaster, SetColor, or SetPage, so you can do page-flipping and +color-cycling without having to repopulate the tables. + +#### Performance #### + +The fill code needs about 100 cycles to set up each line when drawing +a rectangle, more if the line doesn't start and end on byte boundaries. +The inner loop costs 10 cycles per byte. To clear the screen with the +raster fill code, it would take (192 * (100 + 40 * 10)) = 96000 cycles, +or nearly 2.5x the time required for the dedicated clear code. Which is +about what you'd expect, as the screen erase needs 4 cycles per byte, and +has lower per-line overhead. (This can be improved significantly; see +the notes in the "enhancements" section.) + +Non-rectangular shapes take slightly longer to set up, as the edges must +be recomputed for each line. + + +### Lines ### + +The goal is to provide a replacement for Applesoft's HPLOT function +that is faster and more consistent in appearance. Lines are drawn using +Bresenham's run-length algorithm. + +Internally, there are five separate functions. Horizontal and vertical +lines each get a special-case handler. There's another for mostly-vertical +lines, one for mostly-horizontal lines, and one for wide mostly-horizontal +lines (255 pixels or wider). The latter requires 16-bit math, and is +slightly slower. + +The Applesoft routine isn't quite the same as the standard Bresenham +algorithm, because it doesn't move diagonally. Consider a line from +(0,0) to (50,10) -- gently sloping down and to the right. The standard +algorithm would plot exactly 51 pixels, one in each horizontal position. +The "pen" always moves one pixel right, but sometimes also moves down. + +In Applesoft, the "pen" can move either right or down, but can't do +both at once. This results in lines that feel thin when near horizontal +or vertical, but become thicker as they approach 45 degrees. This +reduces performance, because Applesoft draws twice as many pixels for a +diagonal line as the basic algorithm. It can also be visually jarring +when animated, because lines get very thick when near diagonal. + +Different applications have used different styles; for example: + +- Stellar 7 and Elite for the Apple II use Bresenham-style lines. If + you look at near-diagonal lines on a color monitor you can see the + pixels alternating green and purple. +- A2-FS1 Flight Simulator appears to be using Bresenham lines but with + doubled bits, effectively treating the screen as having 140 pixels. This + gives solid white lines with a fairly consistent feel. +- GraFORTH doubles the bits, but treats the screen as 256 pixels wide + (not 280... it gives up 24 pixels to improve performance). White + lines are thick like Flight Simulator, but feel less jagged because + each step can move left or right by one bit rather than two. + +The SetLineMode function lets you choose between "draw" and "xdraw". The +former draws color pixels, setting and clearing bits as needed, while +the latter inverts whatever is currently on the screen. This can have +some unusual effects. Drawing the same line twice erases the line. +Drawing a green line over a purple line gives you a white line. Drawing +with colors 5 and 6 can produce odd results, because the high bit inverts +every time you touch a byte -- which means the ends of a horizontal line +will be a different color if the byte holds an even number of affected +pixels. It's best to draw with colors 0-3 when in xdraw mode. Clearing +the background to color 4, rather than 0, will cause drawing in colors +0-3 to actually be 4-7. + +#### Performance #### + +Mostly-horizontal lines step horizontally each iteration, and sometimes +step vertically. Mostly-vertical lines step vertically each iteration, +and sometimes step horizontally. Each part of the operation has a cost, +so the fastest lines are the ones drawn primarily in a single direction. +Diagonal lines are the worst case for performance. + +The current code requires just under 80 cycles per pixel for diagonal +movement, and about 56 for single-direction movement. There's another +150 cycles or so per line for the initial setup. + +Vertical lines cost about 43 cycles per pixel. Horizontal lines are +handled as a trivial FillRaster call, which at peak performance can write +7 pixels in 10 cycles. + +This is about as fast as you can get with the Bresenham run-length +algorithm and Applesoft-style color handling. It's possible to go faster +by switching to a different pixel style, or using a run-slice approach. + + +### Rectangles ### + +Filled rectangles are currently implemented by putting the left and +right edges into the rasterization table, and calling FillRaster. + +Outline rectangles could be drawn as four lines, but that doesn't look +very good in color unless you get the lines on the right columns. To +ensure that the edges are in the correct color, outline rectangles are +drawn as four separate items: a two-pixel-wide left edge, a two-pixel-wide +right edge, and horizontal lines at the top and bottom. FillRaster does +the actual work. + +#### Performance #### + +FillRaster is suboptimal for rectangles, because it works by rows rather +than by columns (see "Vertically-Challenged Rasterization" later in this +document). Rectangles could be drawn 2.5x faster with dedicated code, +but at a cost of hundreds of bytes of memory. + +The advantage of using FillRaster is that we need it for filled circles, +so adding support for rectangles was nearly free. And it's still pretty +fast. + + +### Circles ### + +Circles are computed with Bresenham's algorithm. The idea is to compute +one octant of the circle with this bit of magic: + +void drawOutline(int cx, int cy, int rad) { + int x, y, d; + + d = 1 - rad; + x = 0; + y = rad; + + while (x <= y) { + plot(cx, cy, x, y); + + if (d < 0) { + d = d + (x * 4) + 3; + } else { + d = d + ((x - y) * 4) + 5; + y--; + } + x++; + } +} + +Then each X/Y coordinate is plotted eight times: + + (cx+x, cy+y) (cx-x, cy+y) (cx+x, cy-y) (cx-x, cy-y) + (cx+y, cy+x) (cx-y, cy+x) (cx+y, cy-x) (cx-y, cy-x) + +For an outline circle, we plot every point. For a filled circle, we add +each point to a rasterization table. Near the top and bottom of the +circle there will be multiple updates to the same line, with each update +replacing the previous one (which works, as we are moving "outward"). + +The center point of the circle must be on screen, but it's not necessary +for the entire circle to fit. Coordinates outside screen space are clipped. + +#### Performance #### + +The implementation of Bresenham's algorithm is straightforward, and is +about as fast as it's going to get. There are actually two versions of +the core computation. If the radius is less than 41, we can keep all of +the variables in 8 bits. For circles with radius 41 and larger, we need +to use 16 bits, slowing each step slightly. + +There are also two versions of the octant plot. If the circle fits entirely +on-screen, we use a simple version. If it doesn't, we use a version that +clips values. For rasterization that means clamping X to the left or +right edge, and skipping updates that are off the screen in the Y dimension. +For an outline circle we simply don't plot any clipped points. + +The rendering of filled circles is very fast, though there is a possibility +of optimizing the center-fill of large circles. Outline circles were +added by inserting JSR PLOT at key points, and could perhaps be faster. + + +### Drawing Lines with Indexed Byte-Arrays ### + +The &PLOT command allows a BASIC program to execute a series of line-draw +commands with a single statement. Think of it like shape-table animation +with lines instead of plotted points. + +Suppose you want to draw a rectangle with an X through the middle. We'll +make it 11 units wide and 21 units high. To draw that in the middle of +the screen, we'd set CX=139 and CY=95, then draw lines offset from that +by +/- 5 in X and +/- 10 in Y: + + HPLOT CX-5,CY-10 TO CX-5,CY+10 : REM LEFT + HPLOT CX-5,CY-10 TO CX+5,CY-10 : REM TOP + HPLOT CX+5,CY-10 TO CX+5,CY+10 : REM RIGHT + HPLOT CX-5,CY+10 TO CX+5,CY+10 : REM BOTTOM + HPLOT CX-5,CY-10 to CX+5,CY+10 : SLASH + HPLOT CX+5,CY-10 to CX-5,CY+10 : BACKSLASH + +Six lines, each of which needs four coordinates. We'd need 24 bytes +to store that in an integer array. + +Suppose instead we identified the four vertices, and numbered them: + + #0 CX-5,CY-10 + #1 CX+5,CY-10 + #2 CX-5,CY+10 + #3 CX+5,CY+10 + +and then created a list of line segments using the vertex indices: + + HPLOT #0 TO #2 + HPLOT #0 to #1 + HPLOT #1 TO #3 + HPLOT #2 TO #3 + HPLOT #0 TO #3 + HPLOT #1 TO #2 + +This requires (4*2) + (6*2) = 20 bytes, for a small savings. The real +value in the approach is that it separates the description of the shape +from the placement of the points. For example, if you want to change +vertex #0 to (CX-7,CY-12), you don't have to make changes two three +separate HPLOT calls. (This is particularly useful when you have code +that scales and rotates the vertices.) + +For the current release of fdraw, the only built-in transform is +translation. Using "&AT cx,cy", you can place the center point anywhere +on the screen. This allows you to animate movement of the shape by +simply calling &AT to change the position, and &PLOT to draw. + +The &PLOT command takes three arguments: the address of a vertex array, +the address of an index array, and the number of line segments to draw. +These are referred to as "byte arrays" because they are arbitrary +locations in memory where you have BLOADed or POKEd your shape data, not +Applesoft arrays. The count can be from 0 to 127. You can optionally +add an AT to the end; if not present, the coordinates of the previous AT +are used. The initial value is the center of the screen (x=139 y=95). + +The vertex array uses two signed bytes per vertex (-128 to 127), one for +the X coordinate and one for the Y coordinate. + +The index array uses two bytes per line segment. Each byte is an index +into the vertex array, from 0 to 127. + +Here's an Applesoft program that implements the above example. (The DATA +statements use negative numbers for clarity; if you replace the negative +values with 256+value, e.g. -5 becomes 251, then you can avoid the IF +statement and just poke the value directly.) + + 100 TEXT : NORMAL : HOME + 200 & NEW : & HGR : VTAB 21 + 210 & HCOLOR= 3 + 500 REM ARRAY TEST + 510 AD = 768: REM $300 + 520 READ D: IF D = 1000 THEN 560 + 530 IF D < 0 THEN D = 256 + D + 540 POKE AD,D:AD = AD + 1: GOTO 520 + 560 & PLOT 768,776,6: & AT 50,50: & PLOT 768,776,6 + 570 POKE 768,256 - 10: POKE 769,256 - 20: & PLOT 768,776,6 AT 100,50 + 600 DATA -5,-10, 5,-10, -5,10, 5,10 + 610 DATA 0,2, 0,1, 1,3, 2,3, 0,3, 1,2, 1000 + +This draws the shape twice, once at the middle of the screen, once centered +at 50,50. It then adjusts the top-left coordinate, and draws the shape +centered at 100,50. Looking at the output, you can see that the top-left +corner of the third instance has moved, and all three lines from that +point have moved with it. + +If a vertex ends up off-screen, lines that use that vertex are omitted +(not clipped). If you tried to draw the example shape at (0,0), nothing +would happen, because every line has at least one point that would be +off-screen -- only point #3 is still visible, and all of the lines that +use that point extend off screen. + +You can specify a maximum of 128 vertices and 128 index pairs for a +single call. If none of the line segments share vertices, you'll need +two vertices per line, which means a cap of 64 lines. + +#### Performance #### + +There isn't a whole lot to it -- it just feeds the lines to DrawLine. +The key speed advantage is the removal of the Applesoft overhead. + + +
+## Enhancement Ideas ## + +Some ideas for future versions of fdraw. + +### fdraw ### + +Line clipping would make the array-draw function more useful for +animation projects. If we accepted signed 16-bit values as input to +the clip function, we could specify an AT point outside the screen bounds. +That could be extended to circles, which could have off-screen centers. + +A "game line" function or line mode that restricts coordinates to 0-255 +and ignores color might be worth an experiment. + +Triangle rasterization is possible, but perhaps a bit silly. + +We could handle ellipses, but they're more complicated than circles, and +are slower to compute -- you need a couple of multiplications during +setup, and the asymmetry means you have to compute a quadrant rather +than an octant. If the goal is fast animation rather than general-purpose +picture painting then there's little value in supporting ellipses. + +Some of the inner loops are almost certainly paying an extra cycle to +cross a page boundary. That's not easy to fix without adding absurd +amounts of padding. + +"USE_FAST" could be applied more aggressively to reduce the size. + +Having "fast" vs. "small" builds was mostly an experiment to see how +much of a difference in size and speed we'd get by dropping some of +the more expensive operations. Another way to reduce size would be to +make the build modular, so you could (say) omit circle drawing or only +include line drawing. Some trade-offs would have to be made, e.g. if +you only wanted line drawing then it makese sense to disable (or replace) +the horizontal-line optimization that calls FillRaster, as that requires +some sizeable tables that would otherwise be unused. + +### Amperfdraw ### + +The Amperfdraw API is somewhat minimal and could be improved. Taking a +cue from Beagle Graphics, the rect and circle calls should probably look +more like: + + &DRAW width,height [AT left,top] + &COS radius [AT left,top] + +The "&AT" coordinate, currently only used by &PLOT, should be more +widely used. Not only is it more convenient, it's also slightly faster, +since we don't have to parse the left/top coordinates each time. + +The existing code is (somewhat lazily) using the Applesoft routines to +parse coordinates, which includes the range check. We wouldn't be able +to use them for width/height, because we would need to take values in the +range (0-280, 0-192), where width/height of zero means "draw nothing". + +I deliberately used Applesoft tokens, rather than arbitrary words, to +make commands simpler to parse. Some of them don't fit that well. COS +and SIN are circle-related, but it's not obvious which is outline and +which is filled. DRAW and XDRAW don't really sound like rectangle-draw +calls, and would be much more appropriate if used to set the line draw +mode. Spending a few bytes & cycles to get better names might be +worthwhile. + +It's possible to store &PLOT arrays in actual BASIC integer arrays, +which might make them easier to code for. The fact that arrays are +DIM()ed once, cannot be resized, and cannot be discarded makes them +difficult to use for dynamic data. + +Currently &PLOT takes a list of vertices and a list of line segments. +We could also support "continuous line" mode, where it just plays +connect-the-dots (saves space, doesn't really affect speed). Being +able to embed color changes could be handy. + +&PLOT handles lines and vertices the way Applesoft does, with inclusive +coordinates. This results in overdraw when vertices are shared. This +is a (small) performance hit, and causes graphical glitches when connected +lines are drawn in "xdraw" mode. + + +
+# Additional Notes # + +Getting into the gory details here. + +## Setting a pixel ## + +Hi-res pixels are curious creatures. + +Pixel color values are determined by adjacent bits. The various drawing +routines only set one bit at a time, so "drawing" in green (hcolor=1) will +cause bits to be set in odd columns, cleared in even columns. We don't +touch adjacent bits, so drawing purple (hcolor=2) in column 0 and green +in column 1 will produce a white line, while drawing them with the columns +reversed will produce a black line. + +Making life more complicated is the use of the high bit in each byte, which +affects the color. If you draw a purple line in column 0, and a black1 +line with hcolor=4 in column 6, the purple line turns blue, because the +black1 line sets the high bit. + +To set a bit at an arbitrary X offset, we need to do the following: + +(1) Determine which byte to change (xc / 7) and which bit (xc mod 7). +(2) Determine the color mask for that byte. For green, it's 0x2a + (00101010) in even columns, 0x55 (01010101) in odd columns. +(3) Set or clear the target bit and the high bit, leaving the others + intact. + +One way to do this is illustrated below. Assume we're drawing a green +line at X=17. There's already a green dot at X=15, which gives us a +bit pattern of 00000010. (Bits are "backwards", i.e. the bit on the +right is the pixel on the left.) + + LDY byteoffset X=2 + LDX bitoffset X=3 + LDA bitmask,x A=0x88 (10001000) + STA +aN2a!_1)H4!001xo01N;C0A^%zVRvL@ZEr4QZ|uDb zd=pjPKRlPTP12U8rGfX%T7L9q+E05u>#g<`pGy=pv3{Pkgo26m77g31UB<<_K-) zWM8qBf5gf<3LI9?uN$m2uj!(ZQ|Nnda&V|FG*VY{Ru{TO=U%06GW7B~M=`&~L&PqN zw>hk<+0`YhZL3RH&x)>|9$j6;r#T*X%x1E5qP_ER_^-%U6iaq}ClG1rWExt|YY^ot zF)qJ3t=5&^Iomh8L`;t9bjN(&d>KY!YSA80blfsCMt^x=jqOh#l6ACLuP)8@~gwrE`8!fA8n*$N5b+VenG zKoY6L#{k&~Qky zNK5S_%S^>H&o7=eXU)RGy)o%Z;H@05U&C`UIxGkOdecIis2?M<;^Cx6r z<(Mpa6`?22_a~Buk5CoM<_y0FmXHSuEu3G3)uxV??1f2RrwILU5}OG-G<&$NA4QCu zSvY6zkMba{`Cz408X|M}?WujdB?B2T0J+`TuTO4wU^BV@fzr}K z+mB=qz@!%`ARCidY0mIL`aUz6HvdPmg|N~;q`{;k41J>wOzk5ZH?z2?sE>?=(Y!Q} z-Ik$}Wev|Vs6I^-7k*r6-;p$2mwDs!_?UDpkxUrL(evidojLbMuZX7*4DsA#;=2#? zROcb~yl>G_#MtT678K7Iw_wqN`wOwb$Hx#k1YsgJZR@9!F}Oex0~g#sZT|fa%==*- zlfaJa3F6-OL2blwSnjv?z;X{_8UHvZkue!e7R0O@J|ah*G-voQ(Ep*Id+hUn*JJb4 zm5wW#wjkkU$<@UF9RID4sk%P1W^Nol)-lufxTA2HmCz0wIkj-sQ|Axw`)Kxub(?N6 zvbLa(UvK5(R-W_{wr9^X3$J;G1m@{#>XV#?i?%sBzu)gUxM%w(yLWmH?Dg#4yZuuS z+Q0YHy)7PS@hvdZc}chUL*)^EtT(d>UGFB*#Z9-cz9Mr(p_d~}P}e!8b8_cok%nT>8DV_|ddC7t_3rmAaLluuxKGX&HJuAw z)UE{BDPo5=nN>CdohClfHFc`>%%l?0#+WO!34sp zWE&=}o!&5IZGjVA;IxsdFl~oclc?ifiNGHtsp5doCDe}+<1~@K>6a8?`Nis5ZQs*E zh%OO_Viki@v5G;fSjC`lPfdWht%is@BXM-WORSmHv}TI;)-{v6)=b6P=PAbw3zNA6 zcpDuCxs3_;-X5;MJC+fP|(EFxaC{cZr^0wIEas1*iD9wnLJ@(8;tdb z^NzIUxl)dF^CvE(T&38U6Go7qxS+!?=17YcDrsd)GyrJ+fQGet7AFo&YjPdFx z`B<@5D^@LMkHF##u_WCk<0s`VTxQ-k*B{F3pyhr{b{-Ql+h{Z3iIO~K zbe`>LGqm!=#({ELEocEM>|{oymmk%PNCv0AIqrCm9@K+^^pROuTiXQ;|XmpgO7iIJ8u z5ew-RlL$(qH82I`#=109gWh~>d76n!GmT3#MR#YIP){`u+qHAjOl7Hv_NB2r!D@Y( z<`jJ`)H5%QF)cA@x*#l6-5%Bpj?p!Su#2u?!or%-HJP|LBFr)eOukHR&1h)mJSJlq z&22D2JGarqy=%h5J7%bR&P+#_+C#^gP~1hvY;fV({SF%(!_J4i8Y4R znSwoHR>Gk>!ZqW=O-AO=V|HcY<;b+Hb~Fxg{VY8%jh1tb%Wn^Jw}-nt>47`KR!n|J z*bd9=a#p@H`t(bqU0ogm$f3b%UNt8_tVfhR+GO|+>Z;{zAsCfATAJocWKM#Ep-OQX9&<3W{?*QYlb&haJ-?6mBp z>zI>8R~E$|wk?V${!WDxAOg(Yk%pn2MIOPIcO=U<@dX_xQAYi+s~v*ek4GI9h_bLe zwKf|Kb)*64;{5==<`4*VmlBA70GE#OOj4Sy97ZzS1=uVp!qE|qNaF~tK%~WbQNMmf zn!cGxLrKkq7SR@wG{VNtQ4tI|b@`4oU#g`$$&o5jyYxmD^u?t?{|K{MVQ#w$=#hC@ zX@!);n-VgNc5j8qd(k^IWE|}ll5jCKboXfYN6EN2Iy8N>dmboVp!Kn8@fVz4FHm|; zr)P+8Q<7dzjy)*PLbt%x?sPr6Sy-r(^#T!zy@hDb5CPz71Hbf+32{1iEjFF}QFWJf z{1{8mWnIbg%Q}DHpxWRxe4n4{85Y>0s}WQ(1=6FRF$Ol?j!VQoS@Mob3z)qKa&Q^?305I<9~v&y{)Y;yg5{OGhQOPC@X`1#>(~s zu|2T^>SFY-YyWlwB50_|CX>H9-`(4No=o2J}TOIKV-323JnSw65JEB|lf|g;?=uhF*_C&L+co4*>z7rW~@1noiyB zatg`3r{-H-byhQ<;vWuKjZ>I`HEaL z$U`?|`<)_jr(1O0sjahOOUiKD~_BA+A>kwPqplhY4BM-cNh z(+`&s(+?Bdw-bF;kH%p+pFXE`rNoNlLfbtz3(sp~U!y5l8n0@RHexk#deG`v;rU3N z60eWP!F4+jPl$ssFpqO2Srw00Dsc?O)dEj)7mfiSjw?cWuAJN(S8N}QfH8!cuo;}z z);NMojR;9QAU=-~Qg%RiW`xuo5S<4JX*<;DY{02lG!~KX6t3)ujg@bO-jJbi4@7Xn zrqTB!G|hwtrIeJa1@3$c+*WVumPzi_amakUWT=OBzW~LHzUgva zOd}30hEze;Zk&bs`-<{2V9k(FP>?)XaPq{DK@@+BMTEq~sI@|LSsj0U5{x6f5Fg93 zKq|b56D_-mg+K=&>nGWXCc=NAj%6GF|MS<2t#aOL`N)jMIkqrh0E;ogSAv@(Ko zhlMx7R#U5osLTjQ8wxO@F#fKoUR-vReC0>04pD zUvP)5!rNhMg|)i=op9ZHxH=!UdBVJj(S>;uq^@DUIx6n+Bx#>%D5#lEIMJm|g=^+^ zb@^t>WEZpPny6*IIV#d7Ba6HEW|(Eij1mm84Powt63Ps7oyxKk%E^-_O%}HP1;s;! zvRc;`bVVac=z@{u=U7;e2I{-IEHFW};?f?;X$6GY+2pJ)Cef+77nDH%RqQyevQ(Eo`vyC(%)9lF9T_&GG+bd?k$iAYQeyzS)H5sk0aV#|9`iq#jw!zw2yw6H}A=5R) zmwb8p>k9X}QujRY($-DZWVeahKu%jXQIpeV6rNJ*o>o}g*uM?iLEDfvd17El8@N-= zkT&Lzr*M;@t@#ZF(ET4ziNg}t+#5>W>q>qS^U5hP6;};u({q1OK)_ZDYZP8r3>TP# zr$iZ>fWl&Gm4>TPjL!~k z8Mgj;CD^|$l+}hvXEk0XTUDu8p*GaNt+`UMyPoiyQ)&Ymg?mM*D6LeM-1x`+S%K5I z*A!;fDbXs_C_pU_z=D`4R4Ooldq^9wj>V8y2ehv#!Yg1?gNQFd^kVWL;)@#MiyJEF zeIK**0hZFk78Z|qGq~VuN`UwR4UVEqy{{>~e}StnQ5wDi&@=Xw>j+!&HE<-1z6W2(Kw}5>SgY43H<%UFb@Q>w48wO8sjJN~#&yCX8u!4{j4o?e3e}08?q& z%^63CwyJUkrPijGEB=6{9j+mLXmX-+#`GtdVBLw6 zn7!S5DwTX)XA%0YbC!+k1`-fgK7)n$wBpWb19Nm|w}rCXEIq671U(MLMJ0^NLj;I+ znP#qa2Z$r;If{D5zM>eipi}zOimV4lEIpN2g{}&b7vKs6 z<%vVgX=~08qok_mL8UMP(nO(HVJu_N@#=ii$Une(i8{Xml8<$`QUKo6f?_OeNYma% z97f-FMfcPyhBHR?1_K~_*F!M$a1eZ#6Y{8kJ0Z?u?(7z)smiOhra!N04Vpn^-`nAg zvoJ%OU~YG3wF!Cc?*47QBKLqc-z+!GVCafASdTy<1tvmgjqIKZ#Ufu8rYXk7R##(Z zvC;JrQ~s^E0Op)tbGPC&T!HbpVuh*c^pL<+7r0E#EUd?xLM2c{)RZWJ8A^>)0sQ+7 zWB<0&53$1!CVSYj+^^K4WZeB#d<{w?>ehwF)+q+Ew(>pf+*Uu9QEJ_LiXBAclErx- z4=jkDt|+vqvatI(kOjmStRF~}DF_GeDYcwmkqwq-iNmh*f(wU;wMxRKAkKEVMq>Ga z?gjxVP%^W-fDL3}Ij6$6JBkIW9kLF(T|QM$w}Wb3J6Nzfbkh&@nVd}#=yq-nL?f;g z8xSnbBGdd#mM>zN$G?@A!6t77fP+w%C$quoD2j3=3Y=$gvlYz7NMTev%qEO(=U!HX z5$z{W3fb*m!jk7AyY%QvN0O}JOTgu8I&G~dy!z0PcJ~AY=cS-lxmcD{y>tki^=@3p z3e#b$s8Aq0mO_vR-h8uwH6yO)D%2GLcD9P+F;6HRFU7}R33l;`Q!d1ue^DV4Ev^Srbl_Za@HDN`cJ=zHP(b#AF5T)56H!+QUf0^;IUD#C1q`-39PRm>goUEX1#xr$rU z4$Cgi=QQn*exAAR&TbE#zwTzB_KcURTC9X@ihB&E0mtI<+8NJD@g9y$Q;b&RcSP{D7 zNognm+@gu4160osGezeC*Sw<0DYhNQ`PrbjyOs2N6r|ycEv&D|>YHVS)%fj>S$0QJ zh1kJS?Ul4@I|sewmLfON9-`V`FKRNJ>#A^55SNa0A=N-Wf`RJq!Hm{h`b<_`>Ai~U zVq&G9{teb=+pe#*MyrdB=p62pVbdOm9SBBE48$@Y9rvVy!X8s9G7J39ND4Yzf%>HL zTPz*C7~bHbcmx(dlsF6)0%6h!vB)2ClsK$7M7NQxvH=HW*BKu6h%lcDA2{5eQsXvH z)V!cz_{Lm314h-PaGxt4vZ25%gSh1s-T+mgy3ZBn1*h*JoQ9&*6ht?W}I@pnfH^cI0EaT{K>FXdI+nCdF z;QGxIU?v4<3U&oljL`TxprwJf*3wg@#3HWO{LHyHHp^EPfmJw{B0R2eYjN<0;iFyX zdk`*|lo3nQQHt}4xxn@3;KLwNEY0H{0*3R;n&NmFwYF3q0NcRfwWVem?C&<%9?^GE z{x)pFcm(;8m`;4i+D()!S+azCL8-O35v^!iAhng5ajkxjB9B=!yQ^zWae!>ae$uQg zTN4IcXtxU)VGHZ$(jvlr5g`r$0GKdGg!?0&F}$Z{UP>TWsX-}D!`TXRhE9xab5Ui< z+{F~z)Q+mZDxucvdTxVap6U;Y*KvZ;a2*m1p5ZnsF4%iI#DV=b;L_(`iRrjRLoUR; z&;e&%n1wt8*l@WYv|&HX{vJr$qTU$PN@& z#XXE#%_}fVvoBh^JCE3i$MhbNQ;e=zli0#(qa=_`(x8UTaUP!ENX-t z3r4^?rpG8(GV?Fj#ar1DaV)sapTcMWj)wAJ_n*Sfh649<;ffOH+5#in)zy)Tj`5=a zSuX(ARe@iKC5dPBe!xk83cFW@jjXSbbB3#44p&x$w^h9o7A_n^X?CtMZ0D-r->czu z!le}M)Uj>(I!}hZW-mnd%ib$n2=|HWUFeeVd>8=E#bYj$@FFfG<( zumyhKBbp!?gOQ?9FBQmYbw8(s)+sevt+02>Mqi1;22-2K#j_oASeze1!gmQ~WMk=I znI#~5fU_mA&qEg4{FdVC=OLKmJ>tmT3UKTES`US<1^|vj=jC5aMkX z77!C8M&1%;elKjYYK~~YIbvojt2S71L%+XC9>Gbeu{>$z)6%h1d99A=0Rr+-2%AU; zf=S}jKo{Uuj#=7gwm`DAg>)2R##KN2G3^4c$_W3En?pGL<0+fD*IU9H@VF5CEWKhb zAGQg-(Bif7{eG-YIr#NPVi91TrU0rZAF@L;v@4_%LeKQ-KyHPP{VYp^t z7;4Vq1re?Kn$%XmZ?^kMFn0byh#H|M!d$ZwdNR!IQCNsGIznc^AD#@mp9n+DxiL<0 z{9bjW(|Z*3osq3bLX*->ie!^4s8lc$Yh8cg}4x0Ip9w9N~dP zkN_-jnKw9S{%gpS5|}KNWuCh#?q^nB6`Sj}C{ak28m@|;;4L=<*K!VIR*s@UkXF_I z(8s_EA1bI5cQoUUBkMj^?IAsTUO+>~o@0 zVTCIzGwdWl2LKS_PymJ8Wxhs zD;4^S`Z`Vl@+iQ^8&HH5zJ<-mFDC;TkOMyzzy<5kG!*z_TG#YgP_*I%dphh)kS;vl zmoAJ4oDTcl=yve6Qt&l^bXW>QAQgy_kR8B`JMfIDP|=qxe8Z|E0o@r0vj=qHN2HS|dz?^(>|t71B4S6d$d;{LZ5@v{W?cs}?6SDpw(A=&0kF0!8o+rdXb$fRQHK@p zQ#MzJhk(2-pRRi|>?N>6LK5o!PIyT{lflbZE1U!J=5Fv(D;fv*)Lf1d((D72gE1P| ztfB!?1=2FeC&hOCGInOrwik9_cZ1S|uJ9E1vC{jk!mwBNe5;84z-qu|umWfZ5>}XO zuF{N=^PZW?o*4?$aT)Nl-|iwSVkEw2CA_aZo84BE-6njXJe$*2lhX#KIi!tseFT{r z4Xd<$^bNpY*JOw%M&{PbVt>Fl>Y7(2Qbx!V<|S?|9M;KLG-VzFTHsPn0el7^<~$&w ziI-JO)1I%v6?mNKiMk_1yB5$&awU&9Y!lKY1lna}6XLck=apJqW2ndYtlgplQ=%QR z!2-+Q0P{0|C9t5oLD2j>@oOyB0tk1d0LfJeB3TPkge(&EU9%{}{?xA|9h61Q{4{rrr^%;J`?b;+ykP`SX277BSNS3PT3g_Z(4wqPB90PX4;M4H zf^aYb^Q21#B|iz6z$qdvo-rF`Rb)76kQ!nX ztOMkLb6PJI`lE7W9UwVmgk+}g4ly+6v^F^-lz72bdIjVnzOzZin43!0Sbvly?l%x= zU>v-Sc!|VzAMNU(!C36w!a9Zf2;WTRw!pp*29Mzf_o4E{7Df0-NrxCZRM?_ex=Co~ zDKUM|hl)W9BK#0{0CF65(ptfx0_m;bP|)(e!hL{!Mr*YsCfuylq_qZ&t=HdIYK$;* zg_%Sr6`2GZ>-@@Y9FAS`IxTnA~HJy--*3D6xO8}AXo()-~n(rPt1*s|X_6f|mu@%%C7}N^d^%7Y4 zzfnLg5ChX%-H?o<(}AQ`^_jV+)JTz${*(gh$64~=M7TAtf^Z8-M)Mmm2fnXJ;dB53 z6-qYRVNI;P4@I$9@eFk~rV%fwBd)bFt9r#us464D1As)Q1%LsD1o`=3Sf|bam%t&u z)opAACd-JLLAV`6Aft;3fa90}dlKwS>cbmF7z1I9L-B;k=m!BO_O=Q&LqT@}KOkr< zvYT3)Ukke+7(?#KBwY|~Ox<}ER8!(K;ROX}qlblhMZSZ@W;G5k0TP+}u8B88hWP?U zGl}UTcLe`AI;;(8AzYbPxij00tT;}c?v@{?gK3iRG&y}^pESbY0R1We`7u{yrvJHl z6}IDY1=0%dDDvz*?uIBlcPMUg(yfrbua-#AmbPN{M$S}f6dSioTLi%T7)E~;}bQ+mb3GW*Yo zGq7f8U=qsrFoVvEcc|Y~0M_-d1rRPgt*o`G_!|&u1wd1*x(r)!5AH_F$;{YZSB%B| zrX}3LihE+CPlw{uN=JsL5#!J%_y*D51IsYMC)-;WH6GT*=T2XrQSV;Irx_EYp6* z%IMBA^UvDN6b{{}07ssQfcnxu2VsHynTuz@JWoKt6-Qz#OOb!&A)+PdTIG#RRZPS6 z8abVL`J5};%G`a{Zflou9RYDkb1Ym_8G){)gWwZOU2tOtU=^#@@YU9N zw_(!3e`^i*o@ub%`mQp^qoAFC$1YZoUDz~?)i(^n#KP32zS*jBY@J_WQQU?tbmWjPvlV8n=2^?{kHFM-7v@ z*2M0l-fh4YIjtat1Yux6YtLIsf;PQLK?dFi1N~GvFJBW?d(*gRn-A}b;?V?WE4~uX zz}idXQ`~w*4VLIDNPB#xjuPKo$81bl22dQk75sq&Zg>+Yr4-9uHEPUH!U(RuL*vpwt>2pr6TF}dO@s7_ z#Q_Iw*-?b^tO|U^oCnMgyNB>vxaOu-a3e6>TljcQcB==1U(GuFT>%CTL#&C|1wMM; zH7Kg78L);E;cp;xDZ|+AVEs(2$U-fyP9dKj3Sz~B0-&xaEk>dS9hqP&1HXf+g>mTnxBGhpB_!*HhjFR$Sj;PKn=_;IxZ+xH*1 z@i-D3|L}=||1%HM4D;>xTE^dMxp&&Uc{kptJAI8Xne%QLd+WH{@^8Om{GE5*eUIhd z2^0VENdL8tuk!_agmWD>@8#?f{Ae&w5LP(6bUJ?E`)fvU9flUWo%?gx&iw`ctqt1; zb1wM6_(`Ac3d6-XsI*(IvP4PooRVpaW*5$%zi9NF;@LmGxA=eRp^X*E8t<2T8PHhbIWXd-J$s?TbD$0F^mxI05|8&0FU24#U;gtqkMUD|MuNn?%iwFZo&0xX|Idz?6SlQTrkKo3h}*t3#5ma;`_e_3 zkHzX;r(<7=U9oMD!f$tVSedu4*_oc}T^(b@h`XEuV%`JSRpt0es!!j|g8lI8Ou?5G zi_1wo31tYF+p_SJgMq%bjad+PllU=E#!sJp&{w@RiwkCPpJLK|JF>*N!e?2Kpp8LA z!pcQzUjE07JbnQ~gJP!?WLpCRq{^T$ZN19{TDFx&)~0zM5__`Tf1 zFthL)jN>K1Qg~V&6ZrWonpIy8yPf-a3eIwB2tR)4jwdzY_eplCL}}MSuJct1#@>}7c%NJ<0pPwyaPde_J%Xtw>vkkG_$3_oZ=1}&WK)514c`k#RGVQoMI9kUYh z-xbYrr9elXkT>*kY5I{%;22nV3ozM8^p$)B=Km7rPsj6Hx*rrtCpYR)<>*6w<(m#w z4msrU2MB|i_J=z5SpyH^l6`0digk&iXP>pYIPSN*iIyljxN)X)^;F+XZvH{JUva#) zVP^EcndWQ$5WU|qQBLzsEoqqPqM^<)$rEpY7RTg`g_RE+to)aQ(aIMOR=#$yvie}< zdj~g7se1Ha)hh?9ya%gx9c1S$YSGI>c#>PuA}ne#ukgzmO#1;@&y$R!MOe{-x>?^0 zoc@yAc(TR`tPe< z`$a-b7bX&kD$L)e$v>g-5LWxilYvk7G2I8F5e>Rvgrz|}YqZ*d0#?QPW^ODrmQgM; z%Hd2Rw{Z zzDIqBviKl6e^M>Q{OD|7NkCm5KOm|J^{3%7MC_}1aDU;1DC+h2@k1>&gh6e1l-MUd zxc^aNKP2~7^EHqEr?uq%8Z5EXY8^Dz;rjdcKT7St(H$Di*Ps@qZJLsp_oxx)*`5d1 z&SaT02i%KV*iBPB1hg^o0jvE;Wds6`$%%Sds}Da3SQ68kQ}X=w|G+B#mmXxkX(Tgj z=#U{R#*WS%jtlCmu)R;V0Ki?*V(BJb!kh@@|HQvTAYUCwJ4`gMkwuv0VpGDVJmc%z|R}7bG!-Ia2-t$ zZ^3TjrYPbak|NgA6tM~RnZHsb@g7MMbu>u`1WnXaG_jeaiT44cegNCghZI3=Aqnau znxH-=C@KIjbsNCdMw+661WAP`l9B+whG~-eoS>;@il+9EG_{weDS*S|A&MXmlLXmD z6XX{JMSe+9WIIWbM`(&XN|59+fWRk65FWTh6`H2ws`uxCRBRWK zo_n%|8MP1WC$y-Ad$>h-vIPu@8Nbg%S2Gp+oQBJ#54RXu?q6G)A8wItAois#!ow}x z?^-N9|JowoBc>F`dmnCbC6y_A9&Tw~+Tx;xr7ba?NYz@Hm-YpI-+}|z?^=v7Sm59A z1!xzA;B16p@T<{Na4_36g(WocxHc_r$Tk8vkHq6c7)T37n#She8IM~g70k5S;`8ob z_zU(oc7ieFAN8NYZ+z%{r_p$P zH#*ST-Vy(%>$H6S(zRAbIs_6pd6Geg#L=E4{kR8PoanONMd{Rch^&kS*+pGvVHpLb zU4_EJ7M33aNhMjiq=kE^1tRbY#}wwRL(CTkw0sxDYTt}zklvyetv>W}#6@<6Dk3IX zZ}OzTI-Tf>);C>F79MP2()O89#*J8>|2_1Ve*tYvOGKKH4|)nJ%UU)~VX9kPgZGrR z7|!!!_AF^Z6F^W_eVIXRM*ZrZY}pN}$iTJLdZy)o9foy9g(q5?A8J9L`KFh+vY6{F zVu&Y@gS&JVlNSXwQS8E>r?0bh@R2gmQP7$w_rJR^3Qe`Q%fvty4d4Q39 zlL0LIreM?zQ@AZjEHQlI!_U0ArR8k)`1>ASv~b}=4?gmbNXDsW*rJzrbmN*A7wh*}^90KtU?XSiVOD-rm!%|DhHS;fmge>vs9-C>)> z^!83m`Pq+={J%cyzZ*g(wY3>}I zul(%34I4Xxt_lXpakr2uIqty^n_6~$%saMOZH6> zQyQi$|GIJQ6qXs`5zBnbEhoyjZyLFtM&A=BmT)H;x!y+KQmE@}^euymZySA2_VhG5 zCizx$6OPHg<@jQP?+Lh=$kW_Q8<-b2@F{TiP2##6J10XpIN9j?z2(Ft?o^|1CD+w> zVlsES(Z~wwB*w*Mj^%$J;d(bM%mCX zVeKURB*Mhb$$MY~d3R5voRX+K&(`4!X5EHelXp$T)ct_O=G@@K?Vwc_gfP`twrQEs zm1OiyDNAuoaZ#O93zs75o2f=Q+e0)=iQYHGaJ*rP;aHTpzQI<%0RnG(qmg0X6>swp zMyNCL^x`Rrj?L|j=;Sw3QKx*gVT$Y#XZu#1c%perBcJ9f@U3u6?Ag-jnCw{Ld(trh z)cgAr6R;7iJTVb;1G47{3lJn^?ZXnomyVVA#hK%c0I6X4qSdz&+d&x(hS4{Q<;0VT zVOHQ_z&126gmLjo$4VGSINk{I9&5!C*85h1jOFAebjfaE?OaT9_cj93h)SXF8@bOU zem}E95<5Z7SKk$jtlc!|3sd2~BS0URk&hd(nhZirO6Um+Wg6EPO{fb>Sf}Y;?TwZn zgsJ&vsyyO`EWZI+c6c-mQ<}eMbhS2r*(mO3g73QaKpKUGdf7uIno@C7GH#;SpNY5~ zMBFOxGYajEjwx%V7A}Vwo{&wr=VGj#D4eJIZ%o*VC)1ZDsUy&xQ^6(=gRu*(pbHPN zdcx{S^=*w^H_T{q=foy-mTf-V=t}81+-O`5WD}hYQydeV7T=R+rZ}FAuAQQK<_ah{ zp+(l!VtaZL?8zt`X*{ul1r2OzWUSRTd7Xz4N+da(Ym+L!koeC*!1$qp63H%-MpdCB ze0J_wqwlxeQS2bCjo{&JjlLD!S6DM0jm*m)e5?9sUp=OP#$%0^6HmlaT!XvS+9%2g zTn`pdMmD!KihZPCK~#Vt98co>Mfj@G0bFxmGy?ILxDUx4Y4nwKCp)J2mcVkR`j&#| zgfAMKk2Sic^t3f{hheIoFB(A#`0+?A5gH^1&0>;ptWh0{sd;zPGUlpBOl59=7y81; zuJ`yfR&^#sIL31}Nm#y>vq-`dTe*8BG?XVD4cru|YN}LO zAhE&}seY_ONT{u}i&(=!MZ(}}OUq4%_$_z4_*Yhti4ePx`h@{}$ zbviTXI?r>qp6lS!m9r)0(0Y^vA38&A;Eio^YTaxJ;#}`+37ud=A8iw}KD zakHf^)ZJyyz+WnONYtOvcw9Hv+U+aW16Lcz%V|zo=aiFyG26;@btRH{)!N^~MQ@3O zQkj2Q&zxN^Ze>=iXRWY~Z6OUA%R>545*cenv|U^YS@%g;*4RSHFbsAd&Cc<1evCsK zedA+so^!p;Tw2c+N<4?gTZNfYdXZ$%`o`-tvDNY@JJ1i^IUWsySs)I}{SvfTv^h+g z1aksIb{LFqwn?BV1X^J`14z@kRleknuNlAT(z>zJr2OB5D{ajmB{O@9B{T@fv=}Yw zVK6XYe8m+@m?Aa-)aMvq8=$x5U*O2~V7F}&2WH;{X3sp-00>foFk^RpDbjqB1-t|H z<^e&d#n9IudN{~s1w)Snx&A>2CT7wvL?uh_fM8EnP`uP6Utp%a?=r+FSrbb_pX`|{ zc?ny~+syurwhM2=LTTH=x4;6{nqb-@seWKEG%)CnlTGL%lzEO7lt%85#8X_W#D52j z0ofN4cUWRUII-1eAePN+iJK{bgkS&&V}D$4Te04&fisrWBU^zG?8i+|F;4D>jUkCQ zz#>37Y*&+<3Swm(o5UWlQniyU%S&t=iBk9@j`6&cZ7?mf5I_!k`w6oG5iw|EFCxuY zLxlB>A3ICRe>5h^$;@xx7WYGdcw5}f3LwSDB*2<&2~mn^!ebI#)E|~Y1jQy6tu~w! zzLewv#^r}4e<)6xSH;qiR(MDPh)*{09N3(Zg~2Z*dd%fAgZy6H?GGU6^q7Qh1?kL{ znC1rY*Ef_RWCh(12ZjDY_ai~Z)S&MEJO?s>C^}b?r{wqd5}*pX6QF_D03PO@hrWo# z(Qv2)3Ez+=cU0ncVZv{nwr-6dD^yEjS#B;GrvEJg${N&a2;0BwsoMQvETu;ZK-?gOne^jHf&1y zBeBrs&wv<~4q{*o*JDnU3bm3j7{Y^F@=S8pu*hrT!+>S-`SW?PJzhE`y6L^&g#3D8!!1R+#Qnd z9`1I@cQ=?rojg|xki*^KvwmzBZf>?Bb(dFus znV-{>cjl6}5!4FxZGOW4x4-AGvvuc=g9mncKH1(9+wsE}rYg~oN8eA2BxoAyxBQ2{ zB$D{)kih$YhwJ~(j&Mnd)s?{$H3q4Mkt%93rJ4~^G}>iH-|}xbRytO2S0!OxSRRGH z>6n;{9>(8w+;*g#LUiwx+$IEZDi=1IG59-(+wm_a?7Sxz-IaLTew@Fn>L)MTL+>H@ ztD<4KC>vy4b$4zknE`8s=+6r{VNpj)PK+enor^|-2E0Q;zs+?M>Q8wL53SC1m*XPO zG4l1qpO*^7N4OE~ZlT?m=umR5`vTo$I3-ZIoJ?w^U%Q-O(8pH4BiYeh4s{UDunY_t1)5mX5 zR6tkZS^UX|xDrZOL2-~^Jweq!NqLHZ(rffgX8z>!+$1cc>X+lb!qb%blh`M667T0o z$~(d{HuNx6!Wn|0MU>S%oXZH>^Kf>WArFqFivzfRLH+W6K{yE+K{-V*1Y^H(WmQ|c zlWV=&(1L9^s{?-7&@U)!=n;s`u}Lnnf-!F5)h0Vs81X}}dM(Ut5=o~MhJa>geZOE= zS6Aqk#0aPR1<^TPfO1U|<%FqV%bvW+SoRy}6=kjF4Ca+jxFk%LxL-*CtB*I<&zHKos*-}j{gV7kef}?DP^}d%3`zWFu%X#a zvNbjq(Ngmg2??O*{`K3Wx`33}iIb~Xsq!(2x%{s9CS+&aUI~)<*TQ@hdb(1q%sek7 zXTnw~mLZd{$|c+^oPYtP`@2Q~N$!h{y*Q9ZvFqM&(IZETo};)g;a|Cod~ zY*vB|yDLym!O6L60)C2Ecu-QGO)*$loY4)cDwWnugv^iG{~=1*giA(t6C^(;K@f&a zfJ?YR2l6WgFoZhzEDM{MHnb=ROqo|TgQwp7!^9ZA#TzkvBh-nHJn~~w=^_a`msl(D z@77wsSE~9RFO5?X8ua1zOZ5S%>M;rA2GU|4`H)}5wMcvnx?v&GvX=St78h;X@;G%*LqMX2Iq2`S}7+nuYM?MZ{QDBi!akne71$<)8SvT zg*D-KrT#`=xTmIA0}iI)mPoD2=c`4 z{y~?%wsJtQHzvWK)0m&KJS*tBD4vD1JSy>f@Hm4KI4}!PGrmV7%fUU_K}7G#39`%P zNqC)kV@oB&2&@>K_`~49WukAA@R@}EWChd%O2NWN+@e|ffvCggsF5|8FKoA$)xLNU ziJJo>Yb*5n<;NSX`1XRP30)$p-Mx(=z)*VZS$Y6KK)=7hwqnvrK8_AD7dML;pbf|d z#1!V;gkmssB*W; z)Dx2Yc8>un!Bj|ZMqQ&6$v||~RzQpIi+A&jAXi9a54YUN9umU7$xDa+jdEuN@omF4 zjMK5YfW6Nl<*#a!Y%4Ie2Er_K$6+XasRX_Yc2OW_f{o>m2pJ@9p%luLxJ4543sKCd z(*%WuQqA3jut=)8hhTAK8kF6c64bj5kn1j#z}FW^j)@*37IEbW@x7}jHB5-bWy8J+ zC~emybjirVb*p@dr$KAK+5(E?7sCd)_@IP8*Nd87^|=o9r)F?2fH_JkK{S}Rn1sdm zFU+mH$Z;kO2`hT=LAolguF}~Ei94bq~_gIuq1cJ? z@&{yMO6!^5yYl`@$d#bWPu zo?pQ;BWE3S2v5tz%n>>Y~M;tPgkRH`8ElUf3k6>=o%ysR70AXL|Fpe4?ya<@q0Hev4gpEm8D`? zC-W5Qk0TE=yFZ@#KStQkVAu=isQQ3=B&95d<{NH`-$t)RREs-RupvQWu4 zLB&Y#HOzZ~Z?omZZ~dTspLoJvdqe-e-(uO?L8e$$Hzl-`t;PqRebaB7w@E1FbU-p9 zl7;1fhl5c%~yv3!mc(~38N5po+P?+y8io8(>KZ|B09c+djV?>Ok` zve%K2&w@vanarJaV%qAZtIJj|U$bn@k~L4@$fHW_`-C>WQ^mAAisOSStmQErBt&ZG zO1_`CFQF@Jf4i{cwln2*^^2ssh0+>v^=8)M`)yA^a!m5sd$viA$w`xpa^a@m`s`~a zK-3@`CO9)E$agkOSUkzUc0v@+lh;l#y1vHDYmM?vf?aaV6UrpVeazrPM&DayamQBQ z+wd8HCFb(ie&V0Nq-y2Bp=#vVs*8C_LPI^;%K1|0ldXni^D5__`I0|i3?BJNa zsE*;*G3Vd2?LW-?{;Yay0>e&iur_cm0Q1$)hNUqJ{WaxOG&WWq8)IZsEM2~9cT&*R zr6X7jHgK~sh?~=)SqIGnZZxat722VVj-}%tdZEm#5^rO7HN(F09UIGcX<`#x8VgXH zAq=DiV}r$9@K$}$ihm9BgdhIAgwg(-KIqm5yDExlbPlTQV*llOjI&++jJ>Hrr0oTC zP2*pj?R%@cpZZq!ti;IO$>t0%4c){eO@>S9YDc!8J~%ElI1aSq9bUCSf?c@yRv2f2 z#LagaF2(LwK{l_s6`(Sc4xsu$?EcyypT+5djMXoH6&oo(46_v2KIJWZDjPT!kZ-#6 z0ZBd!Do(rgAql19-^P%5P5MI^k_Wm2W*P>7b4f|x827^%1FB|A%o4v#lV2>(1c5_6 zIxP>v&3ECZAZ{8bnr}3Dsngn^tOW@nV-q@8rwc-{W}$@B9#vn!wr$y8Jw%N@7>&?! z3hs4I?uN0vgrE%qJU^me4l0Iji>PgSq*dRyIwL3bYJ;d9|H5fvxy0f9{S?W|t)gF<=)SPe6XF@GGg9 zEU_=axQE0zh{6F?ML=!P#!Z%hl$)gL;Wqhq0tv}-83iff@`1rvfuA>szpNV=1d!C^ z%-4Z4x{X1byB6|jwHQ(}W?(j!D&G|wAm1L-%C|z6QEOaIQi<-vA?;TCK2N!yr)+Jt zY7P#?L|?G;!uLG7wu1rrF5ByWjol_|K)H7`@h^Z4mp}prmVT?>SqUhO1mOe*2Ei$u zhKo&Dyjs`4!pcj;yFvDtiDdM>ZPQ;NyOMij)8rBuxl$YS^sm$fJq48@*(Z2WFD!+~ z?;4Lcu@YAvl+Cg}11N8N5>P&CmfY>iOw?~7ztLn*YP)BAmGNDazE@;D$zr5#i;}nME z4D?})qtc?MpxFr1yI?Dz^U1WWat4}SpEJv=CyeU%L!jbs`*aH!L!gJ-Ca$Y(tJ(bN z7SNV2|1Z#(d$-hV?%ncmFT{GcFjI+oO(%n;gnGLUH;=q+VCY;vcUNs2wd3?)$1$U4 zc@NzxQtZi{DBz&Q%h9gb+lHRy3z_j0?M&|pL5K8>m$WUrxUKQhwq^5<^@%e*x6kHk zE^fTI%`mTRY|lid^5#SQ6N0ewFr3%c{4Qz`jo)nnme5GHF4Lg~tltV2d7qIHxU}u+ zOJMCRFBl6;=0B6DM^Hxex8|`=8MexKGbm$H!Th_V&2VX(ybC`J016R|A=GCV;xN3N zys>%u>f2U*MlH0SJTSk&2$SbL`&o1SlP2^~r@3 z)wyadX?EM-64vr?CpPsw61B;dE};tUl|q!4dAC!j!k~i8Q(sM*R@j85`y|mU+AP+n z%^GG;RjE`SQhAyRPgOj5NPQE)@GLjn2NPCcR=AX$KDaQ0+n{bBqD>ZUNnU7#2Zy}_ z?l!Vhy_AT&Eb=s+r|CST|3!U23ESi_Egz=k!&v^PdKC%ta+sD6)AC^~pQTwt8b@#s zp7Pg^W_qedDsxI-Lw{pwIyv+E{KnFBV);J5u{51b{ysmiHJy}vpP$#7PNsdIpVt~x z?07$~H61~2ARi6-jinov5PxGS1AqT1n~WkElS}-8Xn4TyT^*ePRZbm^Kc1GWRGF`z zPR3M6LS;TrU$IOtNh2@O-&ix^Pcemzg{qwC#O(Ely>(I_mXG>i9DmCIdWVc`KX30QmU z$7ZL+bnSJQTzbV#(=MHN-9^7L5j(JNmVWU?H<(CV{hy@OG=-zTq{Y?S${ZX{pFkuU z_C)=`0O#{ZW|_z$VBT1)-XHNtxteG+Butxjjz3ycS5@W>)=sPT_@Tu&!yng3bu~II-sIKHM1Xbqsi&yHbd%1J)wVt_SD$t z_@&LOrHnt2e_w=HyV`F}`wwpB-0xbJ7yo6;+Mbmk&b+bsgD3B^dVACxJNBQyuBzil z{uzJzaAIM`#Pmj8Q-8x@ZAM^W=7JsRJsGW|TJGw4>KDz$Ju7#)H&{P-V!^#Vnc9bpkIZV_ z4)L{GTHPn>4rTazrf1w()bY_}fqU+NI`*HQsf9qFY1n_&Ww)-1{vJENY7|&TZ|>b9 z>lYip#Ipqt9hI*5PWo(3Z8VJ1fXx9lx&K6?CuH3EeJvZ?J9f11liOdH<@SBAyz$D8 z&Rrdyd!Ku`qjT3Qov-bMyw}?I?tOmezBl)EweNc2`5iB}?`@a&zTEz1*Q>j_UftRL z>WllHmv=w+%C6n7bv*yv)?K?-b+o_oe4BYHC>LIzSba{7f0k4m2u14CRYtu&H#2i| zo+ihTF-n`S)2pNBUwX|ie|hU2ci!{6CpK*F-1Fx9hyUJ=F9vtwOTl|zd36;bJ6=q_ zB=39e^*7#Zdg95aTBl@aH;zi*Wem*@Oqu`Vj_sd}4G`nAtD>JGDX%7H-080Ol4(;t z9W%&Gzw5F@OV0PFa6=R||EPA41by$o#H}uwXW)^uNs@yYM#D#{jv>0)9KG#{>*ue4>fLYT;ABy zc+2`V&Fh*Po<48w%=t6t|CSOkN1ygZ+UPV@nyNIvD56nid|~(^O`k?jifdFw-qL&n z(cqQy(@{LQ#!cip}Go)!1r_uKm)c<{eg zPBPD#Q;)B5|M5@G$DeqzaP2zsR8wDtoVODa8!CqDf~Rm4*-hW*v?Dk96ZJ^JbAqsrw#{i% zEWO3Xzc+7YHdWeK{HPO{b;f~aol%8bUNB(AE(0TPd4A_8xqJVpo{yP(ct5v)WAod8 zx}JLF(RBN6nbmz-SQs1Kx43)?LmE_4CTBC|0j^+r# zYOD~lElC}R|TYQ)=!?ao|Nm&lQxI= z601$vTpPn+wcQTtSPkIP6Nq!O#5ihW-e4f=57db!64l!$Jw2Tp$}OX27G>PZg>E#!KAVPHLZRDaWfguj}TJaqwYjp*a5!@*jr z<8ifOpw7yL#b{kPz=7!!7D=nV;XtELERp#Rq$R3{Sky#z=$9T?BFrbR>gOJ!RQG!% zE+XPf9PjHdIpiyrQD-Ga!M$*c|c6Q9i}Xx3x^sBP*M&EV8X_AkL5M3Z~_Px1Hfx^Yx5A>F|W)! zDup-%l{{IhYtEx{!)<%f0qZB`wZ^?xKf*MSM|G`vRbkm7Knb^_owqw)bdVjojy&oj z=`V}TD6y(A*{9o;2jBo$6;8ULns0Q6^Pn4m6VB_2h}>+E^M%FPfbU3@1N}VYIY;E| zgy?(oT1X}=M7h#MCTaKUXvb>9CA4SW7%XdOt$|pyhjc9@s9lwv@QQ(`7%mOgMY#xw zOEJJz`z48+Jq=RO7A6;I*JL-{BWw=T;v|Ccle@GVvY}3SpZP5_@8rASFIidMRatIH z+R9uOAwg?kwUOUz+p@heiZIr#R&6qSV7K1w@7C+uz1fs9kk!c#%KSq64rbbErhQQ6 zH`)W)EySQ(oR_EzMUrk8Db##Ax@iTV_P$soYPDNqV!&!oy4~b#&3|J?(y3&Xv%GSe zS*IDLh9P$PksQG991g3)Wp&udH5xr+ln>0{Z8YbXnlWG({VxrtZUL6JNp~EK0+ZXO zOPFVaxx`J8g3-tnE?CV4L5v||E3$B;OS40FETX^C?9_d4M60#0=@_CX^!xt?vCo-c z8AA1PC+~LH>;muw_Q(ssDcB>dbub!X?bB$5Qve1)AKeuKEDZYSaFZL=gP8R~_2=o$ zc5JhmGKl-tN7I`f{qe`tnW|=Ie|)3bsA_ig$DdPIsg?+98FzV4EssvXGOh_qTvae8 zMz}LM^esqYgd9-6HM;2@lBxO2XhoI*J!F4Zxeb^nP*RSaP&xh=xIj4{smLjP9myl7 zlhb>x#M+BGNhN1aoje6UtTWksM!|eC|KR*RO?!TSa0A(} zXWyO=_kY;4j~pZi4<6i8u&3Z)0r~3SL^82w;(o`TS^H=8%pxHY+H>2U+sI`-*m{~O z1I#7bx>lQ^GZ>)#Y<-R~H$VTh)5eS$n^!Py{Dg_)PCtF(NJAa=N*_(0CqGGZS(cC` zUoPo>r2By{A0>}|{pjawyElHm@#~FbGuhnzV)w4kcYXaL*+cepzt?@>^8;VMM?N8+ zeECWDx82`<`7Kx@Y29PUnC@|8+?V6J%eu?HEF(POyQ{maiJ$nt^mkv_J^Raxx_{Pv zWB1R9GAcGEU8Yvg#$+_+y1O9Vi_KV#!t);Slt#`QSnV3 zkaLhGeu#HVr`tj%Wq)w!SbG2{jGa-GRTN0XVdzzDX2J~xE2@Ghsf5i;tU;e=80684 z=()tOIIn3LYTtHd4A_~aV7ELEqBR+_LbagxK5jUy6tl5nHdf3=i&Cst+}0GrHrXzSxXmhr;a)*D>DHpgGWD&j%jE)OK`$$kexNu$Co5=d&?+u9 zoM07;hT&K7ECa6Ms|+Ko;su6bR&l~`lB@U=!!WCOWG?=hVR$a?KX*8;_^)#TT_$Bc z!7+zLJvuDr`26+q94|T)yq?-QWO`PDi%_m$j$!IcSisU1t0l3ltz3jM2y?tYBVG%$ z`ogRixE6ACmdqvSK2an#EfNPY@G94D-<4OARatK-O-tCcWRoQu)Feo}Eb-`ZdN1oe zE)fd*15r-0nan2Wh-9;vtR`p|A1qucXOeg&hfn3egT=&gBrE$b+`SAY2?ihoN_yk% ztTd!SqrAD&BD+YDK@Dw~c^fQIOvDE_DL3TORNexHIi|uxIhk&l2*aCexQa`JgHcaZ zXhA(HrHUw?SpZw-|2Zyb<|bGw|f7#{yQ7{GRemRvG5^gIA#m80XBPAV5dB zx)3@hEacCII|tH+5N!a!lrHXJ8}JlKrkAYeY^340_-ln_D$zW)>!h=b5Z9?A%3V3S}S_*j54<0lMb>bjLYDbcS!S z4A9+7XP$+)b-}`gfL@Aci*-)l6U>yVq+$S`~y?dhKuDEx1mDoX3J0TUuioqZUAc<-YFh_NX zWe+;4ad>kyJ*0*FY_Ny=)}bEi6`G^zttby+_WJ|pl$Dj4$OcWO$^+Q7*=-dft<5uDIL{^}ngnsrtPu!m#caa#&-e&fgWbJ_m57cDzaq!>aIwf&78690->P zL(YHs)bj{BECK$52f6;jl-0MZvm$G$JT8^AjtZX?&H&V*42aR3CgCeq>} zD~_#`Me3W5K^acKW$Fe%*-mwG_@%D#pBfBym^F zyE`m)(9}*yg=tHJekzV6A5Zm5s%76sj*e9D6utV@Q%*OGdU~GjB-PW!x*w#T-lh8| zIT;3U-CS*c#u749doo65TzecN^CB%XGH=ih*`ArN?RPRXX-~?@uv2>i^W-nu;mwmn zS~O2|x?#-|#)0fM!fPbeQ1h^2uxL74)2w1lh=et*@JMZAH}Ika$CtV}vQpEbib?W5 zGqa(~Z5AOOO+|UEITn^}MwHrjLy#ruyOX(xc2dbvu#w2SzYK?`h@hagM=4$6{M6W%3+@XDM|Nk&z#^EOC z4R-DSL=93dwJ`yr;b{6m6aj|Fc6H_e1i|>b$_HYo(l!V~Zrm{~?;I9M`_#rENcvbk zeh8AZnqpPceZwJXr1f#CUsh%=flUMkLw@$BVAj~PokfXr#DEw^%Y^D45j0X@kwqiq z?Ccpu%@w#5F3PSc3i)M68Sms>m3Ftw;X=V2^1sAa*g(I4mFOm`vcpBKCaw~eFRjW1 zIv5yfAk^_5E-``9SX(cKqkgX#vEn9T#7b=Wf-g%g@x zWqhz`P-le!R-8XpB2$YRcjg3t9AfcQtQ9h$V~~j5BkPT;iy9$mj}+^Gp~4e+!MKhl z?XHP+)Uc#CjT<2;4yEE9fB|?ShmFtDq}?^~jvAJ9#Mo8TAf$#$^f|8pYKLXBjuWxj zS;t|s=TSC$opuB-&?4xoGdn~?AZYeRJ~ z^TQsW-%nhcpH9GiRo)46I#MD#?8K|NYQn;>a`J=xTyx`u0p~q@vf2NV6PbFLdPew{ ze3mY#0A||tn)wr2$jut`L`~U!0{J$^i0R3QYb4C>^W@TsH=*_t-j8u&kF zCy=7|6bvs#A1FX6x~X6UDf)83FjDl}f|Hb@uCX6DoYqpi!&(YqrL~mDJKP+0tKE(F zQoEa6G-mIl+e>-Oc3UyT0J9x5D8=JVJcWfo0WN32<>Zku?;vnF{)=tKqHu|+!_mz@sFX0`KpFSYaJ`qS1RAPx!2LWluxvpULYPzs@wf;uTE z49d<1WhYOawgEw%3aFETLZfbmBM99T)SUu#Fi;2i6CC< zm33Rn7H%nBxs0-m&SYHv)hSRX1EqDtG*MhY;+NJ9DozwUFhxcoO-UT>GTkVKxGV-9qAcb|E>Od-kN; zVWjX624w|o0CAl#OI%i5J>^zhewc#O#||kDYdNvxRV$NA`NRJya}T;$mGkZ(t4)f5 z5mtjYDUMHZYON0BKqeB%IastrSZ(J)eq51rv?zhEh%l>}?gQ2WGYZGa-8pHdgn4$b zP6CE5a-t{V7sGg{n#o>&w5+VmLRRNwnw}CC0bbGVZ3Rk@mvW3I$x{M&6cWLJ6z75g z5oHse2t~9&D?Y>#Ig&HpG{DwfR>pf_gZ57Ha$BI|^jHm(x2)qH-pb zXaI>!D!VJGGyyaJ=G-Y$smyhkQwivHQE}vUP$BQe`fOG=Ksg;&7YIqG+v)-d<^*Z( zARBX?0PF((47Ix)Rwt@lZYz{2g|Yxq3XlL_3iY7M;HDC<)QuV<`CIM`0ET8!_PUwk z0sTUq0eXo-x17pR8epQ`T2Ajy@>MQ+UrO>)dLuA=p0}CI{+B8&UGR|dEt+$xCbuHz zk5fNfS&lThfjD#OC(kFB=KS}R+o3XwGm5fuD{F|g%DTY%Lpw))mosYW?X0_W09G~{ zHZ(R)HfV+ciVh;@=%?P!5JXXCW%y&rWSC`WW;mw=AnCbdrryp-LWyK$6l3ILv}FA( zS2}N08C!_nc$pE9V!YfK0vRqehESTrV~EM~8OH03p|~7}j5ub*8vz^ts0D z$?M7GM&sn;dySVGPn(=D2Sm{q;XEL>qEShtv$HfhTlCEG2hOpOKN`nRKE|Ky6vA@3 zo$NLiPi8O8I0R2XHi!H#xt*3Szd#Sxcmm3)8h9X|8OtWeR4f zTu#O0#(k97GTb^^1&i#BcgD$?+0SL)8$<7~HBL_;-5cX+gq}kBQFbzWSj@z-U(OyD zGdE`M%|_81iYcNu6c=K0XAJrSt=*md&hYg;k^TPg^}UdN0P9QIQ#CrUMkdUiWM6hq zc7wpQ1VW78uy_P~Q=!hiuUido}Co!ypA z$tindNx(XLj3&e6Ab>=m|YuIVl}*VhhJWyw;*4&7ix+;4bM zH@idzYX8x&Q@0=nBbp5ZBCi-;(=m0L(GccCC!m^5htzDSbob4Mw+#Dr4df%kA)PWK z{%-h!z1&5sJ1y&5UH_zD&e7d6J-lLf+Q>xxM)g`dZW~V5KdV0BF`cXRN7bwC4x!al z7l9Sbof(pXQLYrR7{O((yf*0Z)q4V7ku#A7eVQiao@IxdE6Jn!ObvZ45qD4;kLivB zy7R2wNI{O1-K8I|S!;JdZ@cxyniKZ6S3g&yIQx(4pV6%+`G!rp1h1<(W(+ka9D|7j zbzwF3mLJj`-fbg4*Il5-&JLgZE8V4lTHawJ59+QxF={(?4<3u!k^1$D?qRjEFa3Aj zYBj~EeMm2mz`6Q$v?R+;E$peiMq8!O zbWC+Sv{#LOKzS!M#Z*$~rFLuO(TNm)c}J_K)WLVh$Ol@d`T>%ro1tdI!e$YdCg2k$ zwhm1MGX^oaz7g9r^(v?>j;}8(8_DNt=Bnt*MAmaJaGGd)47ZaT$gecbs{SDlsq)xC z-$suPILJeq4y=xM+S&o1IO+j4KBLLbSPNNrU~`r~#8n0HkQi6xkCKC${0xeY6E;St zj5+4Am`JbYj10DnP{Y({Z^}@N>*MeLm#FgzI}&!DdL9|TUlY&c0cn32ybJZb`m=N(FjXCp_;?Tw>B~hVFv6o!oE%bro_^w!3ZSk2 z4UZz+Lyq9yl!I<}X(S-nNcO?MuT%TF=%*u2g}Ani&LLZ~=a9!YM59(iiGh zc!hiM9nqz-!1V0edNWsqmoMpeq%!8(x&;b2{qTG@~g;QI1RWS4rpDuvT(m<+fp z1Q_`Z1S6uz!3>TE>p)`+aDgD&?_f0Hr#fNMg24oZGc{#^;E~qHseaA7WTXxqUc+aPi3sgq1%`Agua-BM^9!tG%v}z5HZH=igZEErl)Q3@z@)7Hg5$gilH! z{OouF;d(_NEF3BjRtyjb?I$M?-aU~(=sk`=I7$V==_n97R1c(%faYrORWn{QvoOKD zEfEoHA9*ITH6mh?x07o%=N7V4!j|gqByZJ9`|-e0xTZmX@0UVpQrgrC7&GDTv*sx z3%WJv@1VPb-VQoDN!MPEseDJ%faK%b|JK3cz(J4plXF1?K-~iSxRu=|u+!i_2424c z-%yoZypnV+u=EvnOscReNlVm{3c4VqK8@u}fj^?guai-DzC2aIdi7jLw6k_nRlK2A z94#hKC?tuIV0BdS+To?Fp6}GHD&{{MA`QhD4AFF!(B>&7dd*1d<5a&I193E%;=B1u zzJpptXmoYf+enFK4S|Ulh!aV(fm&F6vW_2WVex30b=L8uUeiWkW`c$FpPD4Ku=r#> z0t{+_NAs<-o+pbmdkIWkXyFmfJM_bXLenub_G8Tf!YoiU@+Ikh;xscelg~awOB(`Azffw)O4((hO7|Fm5z~bex zn>I9(9l-srRL!bVTvlYGRvz7IqTd4N>iII86-5(BrZ`vYWgks8k$-648jX66KM)D| z!%TXC7%K~TB3Ak)dKGSFRMmNBiBe>;2^X-#X)#4;ttJ)$4QPVyz0ueH;=1ccnj@$3 zWg%rFd?Bz;;IxogC;B?Z#mD(N#ufDI82@9hN&1~>3qqc{hzOPlk1x+O(3p^bu}Pjd z@#y!bt>uBwCzRbSE+Ee4LY`<;3kOGP^B8aE=$Fkk*eo30N*{|6&ZPV5Xb+So(w{hYxudmx`9q-0=ERf{bNle}1 z1}BhiHpI;)`LbzTAqkKzBr07DWWDX4GjsLe4gIn0(u}e0otZPQ^O!mFxM$8S$u{Ks zbJ>RcM6wO(Q~lNDQ)GOmg~%1FV+u$7t2nm#Qlte(zNow@T1vRfblU>@nRZE^yK9KTc(OWhE zVN)J{daI(wSh)vx7F!xZ%Gjj5_vv5l?Rb>w}?l1~hZi-gY~**Hpf z@qrVkVw=sj%FVIi)7D_ED~D<1R}>!;wiBW&oeeiFG2A?&7$tMyriJ0A1#r`;NLv(c zJc_kT#LYE@I_0UBUYlCOFoWg^TKa5=AF@VSlHvf>rl_!|SVL}<*O6zSe9oWP>;^2? zSZ_9xD*0^$r}4nPd#z1qf}q}JWvBP{T1=)IGx>Y@{p1j$zzn(w9t{NCS!)`ZJ^ZSA zV_mhS(gsPPKF`Sy5~E~ask97|)LAO`03HAtIFpYxgmla8q(U;hq))&BKTQGi!_aKW z@0Y%%EbP@KAQ?GqmVIUthJl%_LlA|cmplz45KNIFwhrdgD%o|h`TrJB1!uuPv!&K# zZ6?(+C3)2Fnoe6XRnD!o=K6Z_x3Y9{q}0IkW>-&awo%G%pU5NMmSvM8We`~^aaToa z9(h{!IdVj+h0u~%5?XCVt0#G+PxeKK({t!bYh7zS?(|S?8SprzOzor6S6cPdQdC4R;gUn~Vl_a%*=(e}zf>D(tFK@5l2hklowii1 z*Qj+xctB7K>RygaI!2D`(FL(>z}YwP$z3Wco5QqTlI;Yx;oh#=BHNqazc(KzXYf+o z13wxfsETDT=`?z@4)v)fp?z<@DwnOPx(xwpP7;W)ul43149e%hNO-|y$Q4Cs0K9;*nkLy2%&YzQQ^Qu65=2d}ipHBt)?rbX1 zbMvS`Kb3s};)+;yKZe)>zS+@auD5|wS(s<|XA)kzmh^e~bS-IGS7Ti2hxqsZVISgu zZ^noCe=Mh2(ueq#xjw|dRr(PBwwWK|-;?wq{!ipf8ftzjpJ%9fPd@ul^N}2fn*WwB zFw|r)LkvsY|HJS9r;?lVMzf`=s>Zw>a)$13zpN%r+9bqSel?gGJQlpnjW*iMxCO{I z@=nN_0JI*M#awUM$1f0TFjmw6G;6KVW;5@tr~zT=lC=S3jj^_>(O8B1cSEu}(~^4c z!~$=Hxyn+@RDE3IHJmkWBEOa0n|81iFR;8Oi|?eSvYpgFb9di27lQcAEoX;UK;Fou zHy(EFAIJ)_Kb2&x-x#|qGE=pi6vTvF0!zD}$jFY>!S7a-Wm z{Un9x*!_<;AlSN$_1YVD&r+4o+#kU$aojGErijbN$t7dx>sHSgw+mJ$#_i^%O%d;% zZ;E(ujw#}kY>Ielp($eTY*WO^rA`qw(iAbVRJ=(w$5Qb&X{nghF0@r}*SuQ=2N&2X z=vZ*8;B3-X!SIr%h$(X!!;h^K=PT7IopUS{m*Yb5Y?!HvZ4`WcksAev7qd}tPWeDe z=VDgF!%N;NP^ykXE0ebhl9q{c6tQJu?TlsO_%^{`FL9gT(M4_(bS!3@-~&b4;xHpu zE_R<_&Q)Sf@+xtBm!M{zU4pw8+9h~aen074+%`e?BDV>K7Pn2HQp~kYuu%WF+}*dn z{hbHC`@Qck1h#CQy=%bZy+Xw>75x*UU>^vG_F#BC>W$dDMmJ;n|F)9cr=m*1r zpr1yE!{dR_5ap34>A0VcdqN`S;EQ<1sYj$oUv@g3Cn1F=E%VFNQ}ijR$< z{LgZ1-m!s73?0L*Dm3HW{ACO!p$*~oD8b|!U$A7JSM*6g31L& zJJMsoG6bZzVVB)o4`AaYK9CgHN!AUbXm?)VABfMzuii*%=Ivx;*10gy9 zWcNjXE|mjhn^B2G6jmVy5n~fp2k8atAiYknLp(UfZj1+co)|a@WsXkTUl<6BVtC}z zBtr`j^w*raCy*2%ON>5=!a2{{gVD(BKUnf06m`iH8H&*xGJ&KKkRuulg#7dc2^K^b z+4)ow4PO|UyyTroG=K{qXK4ua16Xu`H-}U9Qe?szWZ*}g*dt8ZyCT3^5D1ATJV{wk zN#mL=jVqWWj9iqvJU%8i%tv2xVK;#+G9_1r6u@W(AQV=+w*u_Z? zNW{3`bA=`dM#rLDc%jrTk!Qjvg-nLo4_=a}gaL_I_mo(mM=Z`YJ*6u-r3+I6$M%H+ zA`Op4C{~SL^+W=mfuKLy!BfV_F{5)}k*=wdD}_3fSdsVEi4G7TCX)K?D2TUr7<+6+ zZ_4{(%tdPJaID52*YMP~NF?yMgVVy}Dcr*e-T;hqwz|%t9qj3#q#aP9i5urXn8!~lprZWv4EF_;XtzgGyp)e z_%3m-%*1jAlWkV1e*1eCHqmqoiyy(UOw z5c9w6w0F5&PC=3!7IucIJ(C>XDa81I`(JelvAza{(cTq+-$5Gm4|1$U0z<JJ+&I)oD_+2V^)>VW`J1pUx6eq|h#6G+2Gs57UXZt5HJ zGYu2`tam&?!-F&s@&UHIP__>gpD3gFNZ5y6!U@DfbP}|X5!%=J4)ys5qXKF`5@wxF zA*R+yA<$T+GD+T3PC?@37%f;pGId=7<7GaJg=Q?^1UvAQ{iq8H$F5VfhX)z8F8YHW zF>n>}BMwLDcz7)6qr)Bu7(gtAK>Gz290mGxzR`2>{0AL97v7J*z40r7VemcRD`@0M zI0S7%%u51*2xIa|k3^VG7WmZf19*@hpFiS{9HE1e@CcC1$Hm4IjrvERSM_nSv7{Xo zviC!x!Lg863?NxNSNupYl=AR`?LI;0bqMf5U}y*^j}4&5K=ydS#}fd*n55@JzDfGF z_YEL6pk;av^Ey^U1h@+lI^B-*qY;PO={$o{POmyU+zjA9M}2@eA3Z-dMBPr;=~(Qk z1&Ww&ZuIBiuuov@91?)3m~;TIM?F{Vw4iTu zl(Y#iu5*;O3CGqs3~fT^I>(pV1n0WrD~0X3$5VtIxsahcw_|JWxx!rGx;C2CW+x7H zZed%0s(r;l2*_xoIc<*Zxq>Fwu_IT|=Gqm{-f~OfinVtxcrvG)w{1$Wq&s&Rmuf2N*`ww;MTLsBB zL$V#1>>nR}?D2!bKmG8DLr*S*s?XdqbTKnhy|(In$&^$p*`yjwm#j${9wG+SXu4#9 zG+|$qm{p&qa~q@No2s-7Zf7)MXG|-->R4#6R>~X0d$r_%>iUdC0gtQJX1K^9)#i=+ z$@8j$jqSzi5^_qVLldv~uQ=&XL;6*-*nZWZjb?QbS@MaJ+NON05j6U9%HJsyHqdq{ zWh(GB8S{G)q}VVM169gQm4t!sE7z%}TUx~z0DKEEfO#YWSUd(1L3yJpQRY)hG@a&B z+SA=8Yhy)?*~C`9Ex3kTV>UK{pS+?xk={XmseE~c9kmaYKTD5UjwM6N-t@$cBV<&0 zF`d~(%Taxto@`636@jxAp;bx1MT&`42yB=F7_$#Y$`q-xhlo|7lGSLZqhy~VM<$`< zJ_VJ{VSJW6px7cqBT>aN7x|ImRb{-nHuJ5G=33l?t7#=i6u(e*kTZ&ZpJ6HOb;bM2 zcvCMbexppP{eLMgD_K*ON>Mqr1&jbl?<97=pi#G0k}u1*^Lug&aNnm`(+AOoZz4>> zJW)e!{sjwOLl?U}4k%`k*Q9Y{Q(u)grSUKQlgWiU5IfBEMw>a0JSuNX!>>a%?4~>| zWUA$t+p!v)m*4pZ)!h2Rb{tSBjxrR66*a|i2E0Y+g$T5i#O4l59BuyeT)s@K zol|!%Jhz5xch$CS+qP}n_Nr~$tF~?1w)xcV_wN6&bCiROBx588Gc)tP?w|*U?dWo` z4R;!Q>#XY3*mXQdz#gz47{>CBrw9egG6}aLuqg(hSALNaMP+;Y+$?xwRq#jtr3>}k zU0TK+dplcDd7{m!coMGSni5=lbXoe0>Ryin{1yZ?PNKBw zgs$Rdi*zs^ zjE3Wk8QCE{BQ(JV0r6HR6)ly*^HHB(s-e5c_d$BglWa)Vyi-dlqsC>sq!%d@VWc!ReP7bi`qr z#xho#l&U4vyJgI3xA*UTmiC%hc(+*i>rG2O4u{1wby!2O?J(fAa%rFRFFViDcd7!W<*X7g_n?ed1iM{q=$cxH(UeJRlb#0TWoaBQhO>qT z3%Kz4mvPj`xia(awO!Sn`1CILGhF&J2;rAy?Q9!()V}wxXo7T>XKc#QwNWGZT|bE> zmsY*0dW3%`7}ovwYK^B_Q2q1`jX^lfV@<4@u+4^QTDb~8<})r390HuC#SK&3h;liL zIkP#Fp~vAic^r(7^JS-aW!AiZOqsVbR>GuR;I(bp*i`TSu^+YJlz7Y_4MVOXOahzJ zuyV#&k^*e?abZ~sQ@s-8#_8%E!w%-b@c4*cSN}x4hMW-TZ|l&j~Y!Lc3(of)BX-L zb754bVwc9#u;hLl0*kFSfd3qJ#sT!n9c4KoO}}!{?^Z|NIcZ-Cttwme@2;di@C!t~ zC|c=mrl1Jvn}7Rt8s+UJfzr+Nw&r`AQr22Czsy!Ad7)t^pi-FE^;JcC6H^n%l4T}I zs%((FD68n|{LbX>g%{|K->Z2nrXp~sIyo5Pm>#6n5lE?nMFoS^AN*GXj>%Ti4|H)} zlLS}8y#QH{aO90J?5*imo)Djs;;qe{NrLp`^wh!(RFk?A7D7!~X+S&F%y&gMJkf!8 zPyK7hFVmlvKFl3utR&*?pqZaYQSVWuw$U9L5`QdSMB+wpN#KVw-;v~4>C>@3h^D8s;Dk2zULM3w^cr%mm17Ojn~3oVwy4J#aTdP4t}Q{C5BR=D7U+^8N?}A+L)|_FYQJ zYEdJTBdO=(E%ExFk%{^;A!DNrUD!e!r(l)|Vy_IeER`EX ziKpf16exBG`&l6iXC|po#ORR{(ki)Eaipe34aJ6%pAbEZ*)a}Up9FG?i z=*dcnBdQO8Z)}v0q=;vvqETgNsy9T;D*u%yNik)jHU6nX8>dFJ z7HRf{hc|9AB7xkvG!bf-KY5BtWM=MMNriP3Ju^-X<Q*|WLIRJ{WAF>N3E5HMy@)j zofbGVz(*1oPeCPx1LFq9oPZ>3YA{6UD3I1}0Mj4W)pCrSHrDF{`_KQ6gNTMR@tye; z8Ao1*i0o=zlRnZ7sZY8Ai4DiV!VCLW%dIbT{fQ&Y>S9Sdj3ws=GyD@syMC4=np<&0W2ifPpj_JKJhIY!g_w9UlD!Hi8svdbR5&UhY`JT_7NEW;oUtpV@2~ubxY(RA z4HJw@)s&W>NKaQ}jk&e1JVuWXe4pwYYIan_2%hPR@oU3D`yoB4LL}#ymXWHH0*IGo z9X^TAM2PrU7tlXu;~cc$-%Z6tt>EbmWK`M6OauwFmeB_nO(KGnF-&G-Actvg96kK_ zx~ptU$(%LowEToI&l=*vMEjKA;v6ym73C$&LiR~O4HYu`K(TYDyB)F3TG2t$pLdA| zLzC%k50Y-eUp{XMYivmCh}ZhB_y1huXxCsG?J4v}EL3n^aH3ppzE53w2uR5Kc zN<LSDzcbJ%<;GZiGw!6NTY|!gx%yFWAs%GO(m9+cZNk1b~QFC1uKMl zaFQ6N!2mHy^bGq(U~@SA>+H9D+Mtwwora{9+h5Ebx~#RDgZ7F92aM8dz-puFfo`2%2Jv^erHmNGKdLUhkDP*t zSb^^0x8$7?czFa-P}7H6PEDGRs%KplbW*yAQB4LFy?y)1juy-$KHI3YnGM_w0hL|x zg_2zdcUZ8!bX1HUW`)C&q!q$b(mO!f&q$Qy(w<}!hAk~4YQMY`A$hqBIcXDDL5O8Q z>8Z$-MoyAm6A?$+WMVhrCxVoQo@BxnerzTZT4rD5g2gxpH4`AJys=WzBgr>3a%ivv z$qni5^9_=b*VI-t;|xXZ;!Qmc9gMR3Jrtsly3D3o#fjFGEss;N@ygFk> zX|SFBC=CwCrDR6H{SeeBGcbI|nrxJe3U`iE!)-*jj!=B@l`kRAAiPrKqM%=nDdkLf zlpiTH$c)h(+s%om>6BB=;!Aqe8Y#XPpT$6Xfw1LyvF9Nk`su`S?O38FsIrFJ!Wk3` zt1PSE!DsJNUcqeS2q}9AzkWdkj2%#XQ1NbOWeYRQNfP+bHISyD$*4!w-S2EaO%fsv z$AC8Djn}pt!+?66P*bCb9z{^%73<<6iJ5rPy=p6KM@a9A^HrdswZ?vE92S-V6qE6H zr_HFh4xv8dbw@W;PMncJ2@anzoVT)Qi4cRCOyLn89!@#MGE;!*HMaDI#UJ;6FQ#=OqZl$hJC;37=?wss3Ff&|jU=w+%kjeC}P- zyG=Rf*+%JvZIj+0nteow>+kNH^n6Gq$=+(GRw?wo2>v%=_ zjlguNpsBg0DA(sC2T)H#tAmPKJ3YkS!g7(a(pCFn_(vQO?aI$+GKr7L9K6zbS+S}H z-z}mhgvf^MY7|$=S?GZ(^&eQrt!-K5`PM*+Z}{Y6jAMtd_sSV@&-QFs|GIk3niA#T z0Kh*$*1^^Hxntn=Un2|m5fzJ8L4kPiok=Z=UzCR-n`c!>ou;> ze$bm&0-E}&(bE3ehH4BPVx!xk5afDzOwLqgENv@sIMyQ9P>4!f`}igu#FfYsQR7|d zJ&x&>Et6q7d+T~MFknR=2fPIl@xeMwK$1sAe;=@87>#GlyabA1AlaodT$%8$#_tX# z5?;*LyTxR6N^$fvY5pS-c@s{P|DK;hsgm#-kUERcPIEFb@sF${=D;6%)fl?5Jqws1 zXD|}f37Lm5Me#667=Dr-6a37nm+*5%ItMv{KB9UA%z<;KJuQAB1G}X%j=6rk5nnWH zbCDzrqsn51O%!`{^{6jzZgK65m3kFzj|LfS=L%O|$BjhA#%+1!s!(dAV>Dw$A03<| zQ4gN0dYPscbQolwfXK+aU1a6bI{3NrQ}2(>uu&=G{-$BqrO_G@d}2s~AZ;Q=BvtQ- zoc#mzxrW`yxYkRlTbh=8rG=eQq8O{OgsDPo5WlefVshkIY_6B)GfBD(Eh^Qc1GSW% zg6v6Zd&A&4_S5l^keP4ee_K(ggDnbVcbsQM@OsFSsI0f@TUt3{LJrFNgh(hGx(@-ZXcH1S^m`-=9&gECvrr*uCzyD4rrtWU=L z;B5@1E>qKQP4ZTJs_z3k%W0F{jN}v@s~KF1i1}9l29W(%A*Y8X0Xt(@SpQ$FRt@+b zF%2d7PwD>OCit?7Mcp0q&Iz+R;?SZ5OmC4j$L&=?J8)WeTCz`x)c2WLLSy$~Q+gcn z;Uo$e6MGDQ20R(MW#0>7c#w!N6b$5J6K01Wh%+K=ZhO*HQLBs)e$l_!tg_vf41R%<4{BI3fvW@x8%|EsC+PPhXH(O(w10Db&A>VL5AJUDRdUBFJp{X`CgnI?OT%NT=E zyunLiF2pwYnmIVdEe9N~^fy-#0o)Wziq#>Qr1VJbQhckYGaj8d39&9H?{kObxgbC6 zb?fhDJvWB>p)BH5vRC#{NZ5t4e#XPBgb;>o2Q$1r)kh1q0EuvPDyV>CU#jk8jqs54 z<6ku8W}{(UWnpM4?Ql{N5H4n6L{O1`J{=ba*|#C(dH$yx`Mi*L0zJ6L9LuGWsFPJL zY5)u6N>-B3EMB)SE;_k1uJ6q+EP#b`C+}5d&fiSH*{|nEU&7j%L`^GWy|9#-gt zJo}Yyt;A(Igle9P|4Qb}o z;tu(o-Xu$3Lt_x2!3PWDGGk#yeA~d#Z3eTs$u2x9Z8v;`XY4Y@2HRSyQ1gr?{)aT{?iZ1u&kkt zB-EN=gfoe>wTUKY5;Qk{&*+7OjJFEHMt|LYzw6nl}&Z4#h^2y%q0It&OcRpW3 zC;$@lZ+ubMxrG0;HFw_2>vfW9MN~gciHQjrIjR&7)EJ8I;oPO!kQ@km+q~BV7bywr zD0x#H!hW`*nG)E@n1Fv@=^6PQ1t~NF`J*?{yND@HXGufWr-c$AcTha~APVSx`5Io=e01x~O zcdrjy-CqbjU-3QN`zHa1C;6`rK0UtkQ?LIGczs~-dDrOvVqyp%BKe6dyHUXHeItG* zl6%4#@hbK^`7svuEm3<9=WN=IMIE_E2og@TgdWpWKP*Y$JRCkCC;!jZ02SG&-s2wH zkTn}R5E9+VFR?{rLLYa-M#C*A0P1R<-xG7yzBl7lQ63}d78*`W1qAs-_~|qJ38xr_ zv`wI=E+AMyj!Goyh-dpsA)1MZRbASc%(yybSURpuOx0&GF$@G1rU0d%Fi}Y_hjgs9vwXbF^>L;Q3p9oQ0X{ipHU0COIdvvcJ+NVs_XhbYE?Z;F40@i`bHk`RAKJa=m=3 zK~46$Q}}F2zm(5h2bsSFnYaEeZld3Yf9?0q(F4w)C+rH1#eEcX!3eJNC7S@Ycq_A6|`YYP2w`?Fs86$7j8ys!aQ--A*Ul17w2_ApGw7%3uq4I=}r7-ur*5tPJzAQ@6~x;RrwkyCju8_A^dk6GDE|$|N&9Se zRnrYK@>Mwg`ADvCTkW0`t@A{^+|48M@Pmt&(k=T~JC3AMY8siiZ`K9)Ka^aU*=)gc-@w&-_FF%64dK`y$~u-E{Bq zTSpdKHYG(F53F)F)V?j7z3JRm@mK8M8fyR?RZRWt9rB;VG zJJcTQrW-eiI^4VR;rc_CIc%ZFj$;NgsZ@6N)hTitdU1-R8hXLGwl18*H;3M!CgmOY zY5#>qz~|D;>~ZRg);dOR>S`qYUCQ(j`<2mJq>)&hx#es9tXdwE?S*#_6?DzA@q6x( z4j;3aeNP}Vr26MhUAFYFCN5kST_d0%abzeFARdzVfg;$4L|gTT{0M4AoiY!EF%A>D z&A=r@IQ1r5g3vmGX(EUz&A>g5F2!an1K7Rca^9R&8}zqoI)Bydy*0-#giDrLTHI<& z-Bz=_%_D6(mdXa~zbcMpA5hRezA#fF);Oiu78Q~v$O$6zj3vMOoO1)(UY!Z|Ivwg^ z31Vd}{s-*2J@Cq>-=u)_JofrfjQ#t*<`KlY>2A( zNF{e^Ey0pvS~aW5AP*oem9;lBbsWOZ6o3r0Y$m5q~m!H_wpg&VM`Dwh*M7b$Wux1Guz83Slsl%F*HHH-{mzu=9-!qQdSx)y1;Va7611qA$Ask*W%ZGn(5inB8*DRkkeE`F zKWO!8MfDlDk77cXbw*swmT64*snk%f)J9xPzmg&<^(;bo^Jsi}IzFKKIY5h!mfqZiJ2&Q7}-Q(+wbFFFX z(H^PBR;$3Lc+n7_+g)#o$uqpZgUi%pc`#?pb)yg1#lpsW<6Y;xH>zK_XzIPW{Cdxw zgV^=^?MYl{U}-=(V>s1V5qN)D>N41F`!!_6gbPbkXvBooR?JLAk-yG%l5uDt2_Shh=9Sz&%T$$2h` zBA2h1x+Y$X%_&?%h2WpN3(WSK3;LX~uQum9GZ$H_j2fX)Mb1GcFPc?#y5Nz+X6Mj=B61bw+h8tWj%{rE%uQSX`2|du;w8hi&6(riU2cBlRQp z;(kq=ZTo5#5b;7K(`t^WSY#4Q+Ajq3(LvU556se02obZf`y``EI-H$|BIZoAryk_D z$<6C6ob$a^L??#m)ndzSKfxjb;!{Cv3Xt7|y(kctEqn0fSduvb(Aw>9%Uz8*KXbg9|Y)v~{9L8hd> z2fh_Bf2<|={-Zr8fUAaHk$jA%JSW0Z+h<@{e+hIzD&Ae&TFtk(RrR)X2!*F`|5_Hz zd2jz}I`wtT3=W#=eW3fnt7rda8kgI)`?{>m*PSFfijBP5Kj67eQWGBxjMRu&uS9(q zQ2)4&#L|EQ0Ri3jxitO$!2Z|!|7(uL-=K;zpkS!~O$i0Gpo1pimuKU#F$fF<6bJ|O ze`}eWIvaVInz_?EI$Zbo7@~@`GV1T}Ntu(^O(gW+(|ef%5gqc2i@{3{lENVjsJXg% z=n4fB9-7>(?DhD>P8!Bsa9&^9HzK#)jn`jf#NnZlPI96UI*|)oBI83tND7n762_Aw z=m+K9sVWG1+}-YcuHC(U_d0CN>*={&E>}EOx>R;aOcFD|)G#QuVN%NqmAWUT+ODeIw z$bmQ7`tHP{(WuevHfHPfYQKpaxuw9v!l{wuvD*B`lKC;aA5Pqn5n$Nk+A?jsSpftz zJ{Zv`bR^uY2z8%wa}-*a*0vK<&pB?i%4(>qkK$F;?RwOQ@pxzOc(#84QLy3iJGLhV zqrY0Su+Uh$XHu+<%{h^+NO5#hUOdchxOn)qg zEzUe{WCD^ES*7FgnNoD{hL|j=Vd#W;`j$}`OVBM@k^0pw)=z8wU7tm;rhshmix7(z zFw7p^z~K7m#mVL^#lf!8ThCch!xNy*{BlbET5$~TU`Z5naWvFSdj`Vc^#ECNm5WUY zt;1r-zFjTpSzbxP+p*G+MCXE zMWffwdheqPD0(7E3sIu2rxrZGCxgU}R{L8XREGPvKAaY;wE@|QLG3(WbbA67H$x{s zN3wFaa++))gajhz7g!b`UXbsl6)mPQdm-Q7c#dX;tJ8hq(*trNP!B0^VpO0tAC4CU zah5IT+rydF1z2B!bw&r(5)=Et*D+!2B4ngR&)KD`vU5O?vrGTh=q9#&6+*3ZM+w1N zmgIjGhg5*c3V3lNa!P=Mu9{Bkr3&?rDk+^C6eqefo8({*h~or$we^da@gy%6Ag}_x zEGbcIPMWG*&j@Ll@!rqlA=NWR2~Qa-KAA3AqS5+4EDsa>orw>`1M9&zH-xE>B2mGF zRLQ{0v|6RksD^RJ?9a29A8p?{lISPj&AJ#gqhS%pJPgd_S18uZDB!ldJ|+krHW$A> z^^UeU|i}zs{ap_@-I^% zR;NKlGVo)e+qq5)hC8O(DffXl4o`7C-8MnwmmV6F?N<5VFL!+ zd1-q-X(dT~*4L3IkjncDpA9QP!NU2{^4&lZ#T8V1A7nJ*8~6R2Uy+;oEE}cO171TVWfHjrC}vblo3q;JP@>THIR#YRFOh~lh2g4NCT#jIkPa$d zsBv-O3ebB0sAQ1%F9u##0NDN9(Qo6CGmY@te$)X$Q#$vFUzK7qtXUM2Kt2xpjR1gF z7y`so;A^WoANObP@NLWG{R|NQr$(Lt2O~ehQj$4NS{{pUl+}Iv4H|_)ZnRA^C1_tIuSsYW;c7M5zDpW_VyGTY8_||5f|#k0LESQ ziJuSrXB(j&rTmbJrS^WL>{(T16OWgTXzVO&Ms7r7=1}zyz=-`?5B){EWI+*eP@hW3 zb0|E3M=!>GEVE&FonF?7ulTPB36HiDb1OqRkmQKPP|boe_a65cM>Y6-epzkF5^@W- zU8PX549D;j{jyz|TSpvcV9WkQRK}uBUZol(E#fSh7%C&whrcenwM5seaW|*62+zn@iGtOQSJ}cEAYKCe4dH z1_I?6QUo(}073>=kO-pCP-D>=jyAxn7Iz6x(=i7EQn+rjD(!l^WLvEeu}M%b$r76J z4V)Yjy8aC;jZHIr!!Z@4J0UoJ59#|5A7b+f>TIxaIRe`sghyw;*;hM+JabhD&#OljDFhmPVf6H;-geBid3 zL&<ze)b*Pj_nQ)acchE9WX~k8^ z(z}&stS$wao6(RquJX{8 z3kWa};Apv=OgU^khq9bWGzkjJ60a@WHPGwpI|b69lY+GA2eNJ-g5MsvEM|jm{&vfn zEX_nxDNJ|)YcZiFV}W>bSfb(+-I$1&6wCZ)=A9udL73)md;Bpxz9K)M44uySEaZvz zvG4w$s%J(wL_Xo`lC=}QR7p~p$`?(wpOv>pFToZ=#)kkEFkvL>P2`?!Lv zl*w(;Obg4Sx~&E;#;rd7>el9Jzw$qbY!^hwZ0&8q58I6a7bJvrQibI{QGcLo(sBt%a{3WNW+Rm5D(7i%HWiBfk|i+5%DEG1DWz9rD`1Ya|AjC1itZ+!sy* z#jsyeUs%)X>s2NW@|tmfcxlUJmc+~Wgf#ypKZ87g^Cw`g?t{{=3%(b)=?QB5WX9!N zUA)Vte{WlKHdcDLg;05g$yhaPmsFm)jR?n7Vw;)au6eo{GOiCzeEXe!YJ;=lV)>IcuvO7hraN?pT8VLYTHmTtKHOtm1_2WJ6J}2G~tkPuFi2nN?G;W4mF==;2L!Kh2U~) z^SFh|2ENwu08gJk$j<_zZ!R%}q0F8-V<4b7ZFo$mybN;iP~>`xr9DF$^xsaIs(b}& zMkbI+;_XOo1-V@-k5rTgCY^SWJUC~Nl-Z-j{-?4^F3RO4kjFO<%YNNgE*8;T?(X5c z{+zD^Aa|D=#XrE@E{SIXm!v0rEQ#d|X9#Zs)-4?mn#jt@2%;1~~t2hAQ(8 z{sgU?rT8-!YZfsa2p7BhbSlr!ssE*}HNG~ymw!{m#m3}6J!luc2#Tf2F&!Rml zS;Y*#U7^eF^@)-sFuXwD!GnJ`sDaf+xzx$aD~!lPS%d9!tfJD#ZEV7gdlHFaXGBa5 zyT3+($QG!NKQ6k4b(=00q)GX^6Q7U^4?ZE1{;7fpF--*D5<%jkv3>cu0r@Dd z>2bW4to^A}G5*n_jNfJ+@gr!+```v^1fnjPYE+*nK->wLYWK7y*mGNo5YEzEK$fk> zVx7s{(n8MsMWF($=P0NpdX-*3yTcvY!O=8u!*Pg_Kzp@8$((mHhV}G@19tF=<=6@s z`}k5GW?9nY40W23RKzS0IG{vH?W|X|cQny7I#-G{gm=>s^G5iM@c@@`jaUrW15(Z% zqK6+;OhGyWkwZSenrV@|2Htg{;Bp(hsXYl+1Dm)R1VHYB|EKgP0S5E_#i_u8SH+0A zZB>#f1UW07`{@OaDf1iHP`e1x3_sl`j#8_i!q3!W}GgqN>|FTTS94S;6+(iUGL9rPM?85c zqj~J{ghFcKobg@mN}Oj@$ScLTv&BT|92=W8JeWlrujlxag1Hz|xKQHTxv4noB{y@)Mu%ix5Yy zaa{{erZeakMngZjG?dZ}JTi4F_D~%to|7@ci9WH3CsU$yJKZcwSQLI>)tcUL-9UDC zW+BZgutm(w%WPFse`^Qb*9UYD|zKpyQp#3RXoI zpgdyM^>}xutGR=9J+zA}As)A4n;;94)R<+8ozd^TArT0w?q8a^rulB8?q7&jWON|9 zPK}G8WA}5Pytd9;cVEAjhy+a?BGKI{?l3^m4Ic2cxgp@G)egt97bXC;mF8_1v(|ea zBDZ86Z6|iS^!pufUUwnq*Wc}UBCP{4x~XAn;JM-9+e#h?_^!c9#60ig`4PWjUZ$29 zI4;pN8iyT-h0}dLDbZo~+ecHR;eoP<#KVrvwLNd{_da=Jr5i3u5Qx+U3VVuphVj~c z;<|g=pL4&d&W!F#Z%R6x)8gecg+HL(gR-Fn94Cmh?j8 z#ib|DTQ}fAkCGRZk^eIQM(F}#GcZy&(*t6190MxsJc?vd7w_SHU{0@ksu^}e$z!AS zGANO5UakFn9%H5@!}3F8A`w@H`|`T`SHKHa08CDXqh_sstFYdY&se5=@UCZdnfwnL zsrPs4h3PkIPlA1(u6m~bWe?8c(K=lpg*{$ zLN0oyYI3ftlYn6w9)c-~fX#hlPZY(()C(1k587Cfty5ey;454M8y?!clehL*pxZ0; zf~*g4YH?;K!?7V!xT*=Ly#cZ^lrS$iW)rXe3*LNj=!&jn+^ zbtH?nOImusGAs2rI38CBtcv+gSEZ1Un2>8ZwZ3|0!Z(ptde z`4eu@jJdIacTWe(kbRFzIV_bVS9?k*kYO?0sy5>0@BUWh`oPg%1Z7ZnXKmWpT}{uSiq?7c5V zVfRDU{PKZD6_s-c;&PH4#A>0tZ*L)DSg3;X*3mROST3^8JywUw8dydThIb4bTBJ<= zmKrEz%crGOF1W*X;g{@)hzK2UKe@MQge~vK#Z9!~_}?$n7y|^bPN!@B{a@p>M$(H} z=Rh-{*5ySKYT*2)e{cvPq3|#|6;KY8*X2?7WrO}@s)ZcQ^nu-uEtx=O|({TUW=s(%V%e2b~^UT?-T;) z^N|QTcjS4IJB2Byti|M3MryVwdComW5{VY}de|^_GnGYI>#TM2HJpuj>Wty1=9Nt5^`i?_{nr(A;QA^vS1ufn|qEq0=u+p$<-_0Bn`q zYM%UR2mW(-(AJIzfS$-6n_%~t;y4}@~TuO1wEn+6fYl2WQLa-?*2-Z zHq|A&0C=Jpv^z;-)HT(SMk#FzL84F4#n%7T_i2Qjp}ru%ECAHs$7-eWFjA1^VBu0z zN3FF9Ulo+3lXQ5CQ<33XF!WpxbfPShm6?N*SP__chr87 zsvaO$Mxqi`+dLT9MO_m|_LdDh>&(*!g9_C$tU|X)h*iKgPpub0X~>JHYX#l_)RQ27 zwC-}qP})V@4P=*rYxNkLNUuglY0adBeMpv2DcCm5LYIU;INwIR2$J5ar%1cy1%7ww zx*5t`8m^JUJ>ht6B9=#gaVY@dFeYHx&}3Hm01QEOiMT{;@Xv7kI)}|&(aY+q=7ZEd znV6C8`Vs8cJQNMpmd7Fy%fBIauK6g&<$(opMtjCtFiBV!S(bBY&R%tVSZn`*17mn% z@ChALE@NTPzZzJLfa;#`k-l`>Z@!?9mVy64@FxVUt@%a7?}7Wla9JbE0>vZpQ>YKwdZwRlz(lN`~9#AZjMEryC>>X!-!v z(_RD$9a%X7IGpe~`}+ALN~{;g+gjVg?Z2uuGw0h;o4Lp;uVFfBeNg8Ph@Zfn0-!=% z@LGyvCU%TE4c?=y=zOJ0W+i}lD5WwMW?CWWn~Gxj`oK(JbX(v;s`NsM4_OCAZ}V6D zE*B&ksG9aYoszy||39rLx?lAPqCcAG>A-bS-)-hz+;_yy;#@lBm=h%|LsrX`C?PEbJA$H91o#>9AB+9n2#eKbFzsBX zQ_(cqo&5nex)8K<;@;1q3IAl~`=8l-r{qE(C=jZzse*Q}xl3dWlEloD20v3dr` zsNBP7G%W;GO>gQ5qOE6nI|n2{|47syDGcZu9|^W#dl^-Iq{#c5P_(F2M9#{0#n7aq zZAJ625_5=)oW5>hua{GS7Z-4P7Y~}ZI9TJb`&5wm2TNwYXvIPx5aADe@ZXQWoK3if z9?8&LEhY;dBj-F!-n86WG4c-`P6m`c5>R~bq^F*6xS$2uFjQmqjJe5+oPDmP9&L+V zu(!R*hvPf+;Mw$?3LCKe8Xzo}XwI|bW7bj*Qb_ z_KFOcs^)StnhUD zdGm0OB=7|fKB!zl)9%X0c{{}^0fi-EiSMIHmC!TZ?&-*h2~uyuOmIeb;7X@RpP|MS z^VD#ksm9)Jx-2@Ss<93b9Is^Ux?{xiIyCoj)y`_elYL+`82Wti2zr!LLDCed4j!iV zWLYL>Ru_z4#Znx-VxLhYCO3ySk*4LQ0?=N#2;0)(f(#y%xHnAfb}|U>eoBjoh;4Ao z5}?n83E+c43_^nC%2_!v%UbCgDPmF>lO8}AS<^5&B~bYHBVr}TvT*Z=DO6@x0A#-ZNA$Fy3nNxVZx1dyI(< z-7U~5SUb{DDcHHr)(az-4aoaTQ&(rJNz|n@$i>#o0kXHQ669Ky)=l?<@t!Gx{qu9X zU@{EJw8lQ}Wi0QZvfW%3aIy z^=sxqdimE#DnW>X$FE)I)Fvtu`KWXHrR(cp1Hrb=7Cg3$^_kjj%MH`=o}kG+AfTI| z0B6*E_;;j##_ZKDgh3+sBbog~UvlxBHEp=Wo6X8`*L=xRg>;HEH1 z^nrxXvB9Xo$k1cRH#A)dCII@$L?I{*mFPRQKTmg%+K}Q&pB5VI4uq0K$NBR#yQ4lX z$%VUSCn&vju_p$grXCfteW@lR`+HAZEnm{nS&Twm`{W02#L+u!T5?KXZedlvu2@1x zUg|+n-P{qD28t0UX=r1tLhF|1+DBxYvS?RX)6KYK_fe_~FhT;$X&pra&F+*aXTq-> zlCRt%btK6#D)P6ENA;ZW`IacVkLd9ZAgO;Whc|rNIXfbYjox}l<@=L6iO7h2BkYoj zoi^PlD@#uLkA8(?L_PEq@PcI7k|G7!@9;y7&LFR znhMJu=P_rBoetuaKO_v{@6|xqb`+aXSEphb-N?=Y8& zU{IOdvFmh_zsof+2?;V-Hf?JpB`;1gQ%Bn80aMDGoPE$YE#oc3FY+#`|YYT*y2NOen zGEfL&2_X|NCmY_7vgVJQw+{Rt08>D$zuPKPlL^{QO;ux?)}!LFq#al-OP3?A-SL2X ziPfEHUAu@pnAN^QtPtE^s;Nw-EIE$M9LJJ;buUW#5qk)HAK8Yg8sBv2J+Ctb+!iF^ zZG)l>=MAd+RWwBGpo$PPpAZfy@_ak)8WiV7{3m!%aVk$#75rypa7a$Tfu5e!ENQ`o znqLDKYO;%S)!}A;KO77bMTSWk!F}FDkW-*EC)%8`w$F#QA5zFBj=YLL#zTTL~XSYA9?{%AZ#bZG_13;B$%`qi%D2 za{=de;C~I0DVdreLkG694#kCt-E37t5XR_0cqOkZeyO`Es)=mhlbDEX*~CMH^@6%N zGLCeg&}4qCctVq~L4kl%iXs6gO}724F!^Xx4ou&kGZH)4`Qmv4PPT-`f#VZ znYc51tM&W1hV&Z~@f=X;LXjZH5A&1;@h`f-5ZGfRd}NP8w8I`J>p?c#sBAi_2*;H8 zC}`(tF}}W0F=#=mjidvBM^v4yS3t|z!^-v}%Jv2Y&%dU%S|Y>ME5rm$ zO*f7xpu_%9KCFJ{1xXD7h$h7}k$CXatKU-$v(Czm1Y%@`bHvi(I0c4v{W^8hUYZ zb`r6rOX_5ZNyq_7)&|m@8a`X$TZAB8E1BdL;EW5EXj&rVUb5}KKz2p_4l8*GVasdf(42!x8dLrUuM4SsUkqfC zkn!$_Tw!^Fz|<<;PRPuKn0Pq})FWHRW65TJy}H?dSc%Y{?u^deKo||?=!$|BT!LKZ z8c%~>_sT?z>t#hur~vSK1t*;s88C4xDE|w}A+k|g|FlxSP66Eok5HBaiC=&snW=C@ zc{RBi(pI5Cc{QaO(pCsKCp6ogy91JBB`NeGAO$kVH%In|?i8lCNKwL!7CAyNt5Nqo zCkS*)fU00xB-**33?B;>BfEkfb~OjF7Fi>XNS6zaD5o^X4weftwnwq!Dc4KoNgqD% z{cw}FqDQ%jBrANEil)0qk@`&b{K%$}H6L6WsEm6>fOdXXabAHiu!|C@I@7x4`Ri7c zwR**pTSWb?V}&$8{HxHdM)ExhNs%}P9~%}i+&NZ|r&r7Ig6kY|F%Y+9lUI3`cCLVR z$7GMZg3TKoAbh|{yOPm|LYcm6kM7yX$_J;cbHJkMG9cK$~csAW&tv5Wsxxr@L zaA|fuP*QlKPP&2-LhKE3as{9mSJ894y!W`!ef(_$d19BVH80Krr_9f`*#F++*vK*R zrg0BX(}9M7^I1z=omdsQ4FKe zP!vsvX_~&+KJjYHW%uO=F5lKZt?l32{?L2Jk^0lGX{u$L*U zW)i9yp_&PJMSUO|vYi6PwumXiL0T&=&kr0HH9CV7&A#a)e*o!YtQB5{yw)Gb`WSHg zUIt)GfB2@5)>r6da-cO;)UogQ;17RI+fFm&{45Rqs!11d6sz(5MZYMYonJ>@F$&u* zF@lH52G`?b91l1a3SP#s$dL|YI__1iWr5>9c|2)^Tha*kq!B>L8(5C?&igwT+VLF> z-cJU;Ib`WJFswZ3sy(0qC6AF30*TI(F7RK0C!A4TD{T(O(xnX~IitIhLWawz)JI9t z`KI++$r#F4J1HV}13ERt<$SYh3HQ}$1dkTH$&tvJh zID?DQ&waQNW~F!1I`xfFE4D~EqOLPzJq@MW3}H>9ou3JT6IJkRBl}3B`vLQ2$9?#N zen|K2Kkxw&o)YT3y(Eg_3I64vy@Q& zeB;5#8s$V%TcpR0M{@wJ(=TjlJoHGT^o@H_w$q4jG>RS`NfveuAoS$<>=+$$_VTl( z9=K(FF#B1a0-x=&q-URR#M6)9i$^^$gU1?$=Nn5NZNzsT;g}+veXrwuTnGL6J&n*G!0-JL^y35YekC-GKBQ>$Cx%8l z5rzItQ|M!gLgfsF1kkDqnn9mX4EhxO?`PmHKc^ABi$e5n2GL(2nyvyD{3W>JuNa!% zizwPdQ}oy1o4pK0e~TFU5Y5o_6hj|o7#dtXb(}`j2?|lo45CgVn);5WsTPW+PBAof z8d204aPL8iqBAs7%m7U@gA~mSF*I`t zQOsqUVy?mpagCvvVZ<=kX@il%>NhPO;Ty8)9|E;6DDk)Gh@nRQc!;irT6(p ziRsPCu*-|Mb0()ADyM+MKXp22xSHM1Ylzr(a`}R?`ZSIjMiB;R(9o zW_M^bUx!*L4oo;QHxt>5;eNJlu^sFe%+|j1J`O<}mXBI}N@3KegtH^A+-1o?<-1o~1v)%VZs@)6D z`$f~EDCw`Ell)M5;Qs$w?Q9T{7%$v|B2|RGo%j9#hC|kz^XID$9Kl`3{5}n&>o7H_ zx0|dv00FbI69Jpn(@x6IrX4T1#qvmzJ7O)$3YX=SAW+g{I~M0{x!=8*U3E-O$O@NMF7`jTI6}SS9y!i^e|F_! zCj)hk1zfliS{(Q8$SC;Pv4W?M`3v4WR`A}jf}&#uA0OL!U*QwS3g0b&!|A*>H_N%&zg`HP>meU?m4u_}$ot&2Dp1^w04uMu;_cUS0w2g#fg*WV z;B9$KAS`PFc~X2Ul9}3RbPLirqca9N@<{$@gv!+KsRW9Fgb$=>_cW{8Gugnt&zK71OI7sGPd?4!EFSrQ9K1@a7$kr z$#-d0BW*j3W(v%3CX~q+Zl8@*?=iA_jqCvedSt&*Tp@g8lr{WJDO0F1vRetR6=T})lO3{K$$1WC`S`wr6IfHG#{sO!F@VFNgCHu zX>=f6HUt*Sae)k38_1M3u3tf>^D6MmcG^%=f3&87lNxGj15I2hTpJrXS3}LwV-58# z@{?B8`}fyKM|m^?SAEo9Uwx>CJ6y}v*EAhfzoHE6uRa<$T#w$WKMWPz(PpWJb3tz4 z;%Wm2YtUPPPY!c64Go7Ie)u&pdW$rELJ)GKU+v*z^#`C@pZnLp$3Z@=Gey3p!{lCV zr~V7r|LkZ21Gt$B;^&8flW4zd%!jJZ_df4c)t;vv&W{whMns?^S!NwAY+6|HKTU*xCWrZVOxPq#DsD9__?>0IO?hUdRpBly|lc3!uCUtID znlhu6<$CB<$QH7;qpFY#=NNJ9Aod#qsaIjMo?;@uMu@Tf=EQ9qJ9DIWZSxI8 z^ZJeA5WZ^|42&Oxe?H71J{e~lv0!u|&+9a3+$ToRxV6u$eaW38|16N=r1@mWv%tP7 z4$O~s+~$~y|JB&}OzpGM<+abqbKz#^GxE&ZXWY{Rv^2T)C4RItTCEIqK!aKNjzGR#7kEdm1e2ZwMt%yITe~553^=1Y@I`@n z(v?<9V&K*e(+JrfB~z)rViYg#d2SeI*4 z>8Tqw+9O8!CD$124xSz4u5(AL_kGFj51r$V_jSWJAxqWSCFQCNnP0gkR)o><& z;f#FOtbUgY>5*ypaU`{>*0AKkc5HPa8sDFkV;R;VIiB!pwb2=c|76G=7~W?91qY5s zyK)JPWtgz$;hW9E&yDO8M)p@m_F2`LJ$|d<7e;oSQTU~ieOh&7Pu^@G{9AwP=J6y+ zhv$QL<1=!NkuP`27ZJGIATpL=J1LvPNd1PX(m1F=uGlH$8ws^yi;cNtxj zk+kQiWUkv_x-74J|8Yl|=Wicu8OBm|!=Xmp+1HN`1^c_ZdMhe- zvt`2HK3JAJ+Q3yGXdqXXZRTo@9OEk4t0UKX^(wNxBUiSu`uO2}b=-*7wjh$8ejP<^yIa$oa#?Pt(-pmra(Tjaj_2m@`w zfluVNb3v6_sR2k(o1s-AwF4KrWLyeuJ)OZ|2kz>`A|HX+qau*|yLtzM{V;m>P*3kb zq-h6f6A19l=8nGL0N&q#+XmUMaIm)n_jTfrzV8IYjZj=8idF1QET3^-?GXtS?(A+m zhf5C}#*pCP{r>9uZ)ymlD`$i9AU-a%cMampp{}zbe7UQ;8(Pk`4Gjcw|M| z;-0=s!47DGySAY#xF^`t*MAka0WA?3MViR3l3<{@5BIcn^^QPQKwF?9SW%7%)*bsl zQ<*gw>KdrvS@!QK!hbnHGaCDb`p*V&TSrHKa9{xU3=Iqt+ICcll^9UAwF8kA02csx zw)K*xf#4txb)5?V6M-nXzi*HT8`|3XgKYo_jBKbr6zNIuh$?Muy;re3)Gzl91i$>d zn)hE0P_Dzr8ur(49*$5%57g`n z?1^YK?r4J!eZ5$|*o%W5U4wo7H~Ywagd*q_B)`{0xcGza zL^+7)&Ym6WkBm}ERHS>Lj{r8*93Ij0F2M0%tp`-8S6uW{0BZCa!&&xl9aXNyXZA0CIxM@Ea zeg`oE68?g9+-g#h?%pMS8fmH|O}lsP7e7@yj8s;tm3u08|Ddw;Kp*by8?>#)y}jxG zXqEU!$6x&9GkK>7QjWb<=(b|y@ka5&(TlJmz&hJCag zXZ`pSv#-^B+q-a9_gnF71k|%B7#k+^d(O^Xd!(Y4ga(RqYrf|iRWs1M-iNETR#*wVG$0HhrK~g#3k<`@xg2$IUx3kW zhoJ*S;taOmBV6{d7d<>?WzPr+hRA@TR^6I_6ghIghNQSBJxDn3VS7F7C69e1-J&3PQ^_(5I>+u&lY|`UPdiu5;z$8#)(~$8(ei z(E+a<6Zk}C_)qH0uLbPn0mrsh^06r`^=)g-E8@_$)-qXVS=Z`lb<&+}b{FP#AjHx# z-sd=5*(xU(VnX=26u&f}4v{Z2xHA#Ip$7~lKAOBjyg==cc^1E>R;H_!^VG_bs$8|| z5w*&3wzRS}jlqW#fX3*$w5x!eJfsOrG@loETYe<)fxJ5KzGTeLE@dg7$gn^2Ri^54 z*@t`qR-O>ZlfMo8r>L2B)(~hNGwo~|-8xhBmLNJL?Iz!5($mhaWb);YZ13E_+f#r= zb#fG*9w*+mv-6L(m0D0f7s~Sk1;er)E{3Z>N-*K|R_UtU6~iOPHU1mNFc(*OEr2C0 zHw@R~vbJ`(PP(vl*zO)?e-X=##Y@nfgmn*eN#TJd{MxtI{yocdYu_dZ_kA@o!NVsI_06r6o8Dr)t_kg@~>sfqA zyW^rSQKZ*1_~*mW$uVu`S^SBvvNez^YdhMd=xL|Y=*;B6R%I$ zc{WtpiWBr8GTLz2o)7w025tE=#9CTgV=SJOgnuzwU46BZp<;^9Uogcd{K!{omf0Wq z)ZO(|DZ1cCzQQTKIR+m%1>0f6&i1YC?sHN+P^nLgnReB{*ka=GTe08+gx`9fi`E7f zIO(nh4h6?0Kt+ur7iEUY)D2Gqa6C*0KNE{r#ik8sUWJP#Z8;2-w!%eM?a@g3sy$3v zRGmJJs;ja@S>WEH$j=o+NKx+;Jj&g@;>W_hcnEc(5 zQ$t;Y9EmJB5=TQ#%_(xzH5lxHn**nU-NC`&&D-iz9UV8zji(@8COo~0MtO6sVpB0N(iM=`jaEBt83S$=n!qn!); zE8Ck9?VKfF;*h&TqHBY-9qv}Rw$-*)c5G|y=y0D62Av&Mh?ei!)((D7?UObPCfqKY z4OffSwL5opo)s%O1d4Aevx3TlL#dN4=ahk;>I7V!ZI!Kd$8~-JyTZt)vo<3(8eO@C zHluhKyL&YIh>@q+HR{ue)kblKFcmw_3)8UU0&ddQc1x!EUl`#}etrbt8K{;LY=1Dg zL#B1-9U<_UU7W#{TN%o@E*rCKazfT#SsTzx``y>GuDiIcH%g^Fl_B|avcP4Dsg)sf zVwt}(6m=sH{C0kwGys=vtwmtD`LDN@;+GO&-5c+8fDpvur>|gREOBGg0J20 zb!k+Ak34SY=bg%>6E^MLtv(zTJ_ zs;qdMsdgyxY){hN%i*g8j--{IZTj-N7$QRFseM|+;3 zPfR9DFnKgo2TO1a(CGXzKhuQ@krp^2++~E=da`hj5n}7RjZz9kuPX?*#YEv3Mu?t& zX^elu7@+uUJH#8RyHV7zNE-<+7$Z++z`p}pl_SSyEe>d$v2wKQ zsX4CS&T+jy$MxLJz=L?IxEm0UR3NSNi47U}3#`KMUN+3I(d0*9u{mkZlfJY>@@vR( z`?KDXq97QT8CLJJ@(g}oA)$;E=eU#qJ<-x#P~?&{#=k-!4gLsQ$x^Kz0lBG%tUY9PaY3q?h&9YxiEvp`V?R4;)zlGefCHI4h# zU<47Df*>TRP^mzC65E@UU*|7)JxRHHGeVX@kqg_L(`GW~EhqKX0OUI!tduJt(|6>omGLmIrin{fCw=_i_ z(?j+%-z(`z#wHmB$;eubMA~MK@>d-(20oFlz=b@1J$S_EcMi0g#Du~l#>h(~M~rpS z5Fw~$iIL9`4Qisdo`O8DOilFc+!*K#s-9=KOfst<8|^FOKdC*?P<`SPso`*A&B5;j z-F?-Kf&C-Dyo)~h!t)7HFXGyEocsEcktk9PIUS#NC5?7{XMm(tyqx+ZB^t78os_0uSS&Jn2Ajpp`^c;CVuMQZMvoT=&g!EdykY zL%oOkdXEkT2TlY#dV>Q;Lqq)owf$X@UwEv5}cMpi- z$Qs3adLGOSui+6LHOAIp0tv=Z6GMC;s3>DvAOfN$(b-)vU^Hn> zo8((iNqQ#?p$Uxx3Ia2FKIE zr%s(Zud1%80(a^ru9A)P)jaMM>FdN_0luYah|melC^_H-uC0xLI7SMJop!4y z?OQMrn{Oi{0bya$WwmCg2YfzKbCf>E8Wn+AovAy`UxzR1g&yFdjaflzbO17L2bDm)WR z5aIN-#j-(FLDQ+As={Y{dxXUu8ev|?fe?NX{SeyXl;@|EYYqt$fFN9#G?2aF4YZN_{6uSwOvfwii@so^(Tn7DzRaVAn|%4_$4qf7ibAA> zbAZ>bmJz&PAq2x-eR9I4s;t7Z6$Heb0mIw9A@H#dd;Y3Q;|EHw^AZ)^I*fKRgD()N zNQss1Kt9?t`;QthW55(($YS0XZh9Sbx0I<$*N2&gc@O6jLF;@`@DdjdjF?YB^h|oG zGb8B&lya1<#;&QND9FFJub+$$7R`hK8tB4MIZOWGP`Q=8~JeK*rdQ4~6u4 z*zRgmJcK*ozL^T32ZAW_h9|@#Y3I`}q>a|6bt1nJVn!o~Nj|3A;Fl*czQlQNmw}vQ z3Lqx?F%Lij@trS(e8~OngmA07)3Pt5HxX=pVo$Hyb|C8$-s&y2r=qzn`g+ERnp3IcdJ{ z`mkmRq@ldo%l=(K@#AO8(9U0s?*BCZXDbjtZvPJ`3SW&v*#7~*FD&*ilKyub{yB8N zq{?4X=6{p*KjZ`Ui|GE@0>8An{{dw`eEd>~Us&uH)c9|U{EvA1%S!!HY~sf+D*1~E z{F&@u(l`I6z%Q!)7Zv(H>+64!Buewop??wk|3vKN!Qrt3801UVERT+LkAaV|64DjX zKRyobKiB`^wK#MM`l;c6uK!1`J?~|t?rVlCGxg&ik7bAHJ*lZEy>K7W$rD4DF79if ziwkY;vm=+!n;pGoS@>d|8r_g$&Y54$pQ7_lG###{hkLsE`WUrXEIcORC#6oa#~M%2 zHvo+i^5@K685J#iHeyZG*fd(1WQpfbUnQctk2UXW?iuPGxau6CZxj_4jjtHrle*7i z$x4?kSs5GotPFh|>w?kM?P2ATl@U=9fW&R=UVE!+=u+=+*U+(Mw=p1(h;qa)nWQrvkHitJ3BmKWvr*Tw|PSJnrCC7P)pavOFb%Nz~)1GtUN9vd|9MO zBVywLk&i#RGE?b~kHL_BIMqz2ew>TS9ZygFgifW84-SveEkj)whp!KH4bx*y0vvaJ zXRnBln!Pf7bwuoJebkERWznnM$>`X)IW7kNYxv@yho9?$Z*jr5TpYei9~~UJ)b-;f z_z2$rNAPjsvCpo6&WrGj6K_wf&_^wgSkvUf(S(>GPB)D7bkXR2$M6^q?;qh+0Y83^Gz@sxN#?rbD|K9?KBkWiT@-qHFMY3}KM-|Y=o&gaIB=tDXvBY9 zGh*XoK+2<|)<&#}^N4+8d(vymUVY_vNw4h?OSkoQ-5l2km6*FWCF#v$&Z9KT(ff;S zw(pf?rGCY{xjNkwYjsb!ND@EZ%b-6#($zmWocdSOkLVe{3QJI->hwLSG$@1Xn7Eq3 zn|(j+vQOwwJVkRbu2^bO>z-H|oj^8^!8Q+G9qha~@YC+z;{yJ1kHl`HfliG+?H z1Lg<&Zht#C(0h?~{u8iD1YRDoI@&!Znq0p!I!Yh@g#N@B=vw#1dKa2bssL}pCGP@OK3Zyo9F>mBLs`oZOh zmU8eWeZ1=iU~cMiEutB#V#2s&ljIt7#B^-La(!I%8X0;#e0_Liu)nG6JKym_%i?3> zqE|z)4XR~tyuRbrZEKR=KH|JodwE>2<;(TIiAZc77`)k1+teUm0tR!nGBzqYAueK# z%m3^#i6GT6BnOLZ~zjvgEzF{jYFL8C5`Fk;m zjgF669=lo}7wHu{_Qhq|8h^miI0(L~W$5CitH2;|dbaOzJRss&9ld;ZR5bXmxHaL+ zz=L{<4^NCe{e+l--fQ0@vK5x@|7S$8AaT!)fqMM-p#k9mTRV99Of@ey#`c5s{?H(V z1O9Iak5Ra8)j!ltl6-AlxlBE__W~ ze9X_4{ovDXti$qX<&qiMf#`fe zYD7v6OLh0ti?EMyw8xL6TUyUwGdR!jcUTQ)n$P-hrl--Hr;r&IiP|jb$ym&(AA9Vv zAUA3eXQ`%fHtW!;Rgq?I2FucLSp>H;%ZJOF&ehfRB=g@g|83e~+D_f!*xiSOnFMy| z*uok7hVhrKymTORMm>L>4V~eX+8#wOFXzlaud1G&!9V5t8R!%FJ>$OuMcDxTAbLyn z&or$dd*S?LVwnv|8zpoXNZe8%{GM~u}p z#J1Y0dxuDjTmK!#ky4H&I8z8aoijZHwDmBQp#^GJ12z9}NuHb`nJum=L_fJjhhfsK zjny^BYtfH`Yfsl6Zf&V`#R+5E0f|Ru(m%TRrW5FdVON==!jkVZ4xixLo1Dk$TE@;| z9Xmm|_+QA|f3E+Zu1Hpg6lD%ll(|R(=79tx8!Q;{_UG1T8lL8ODfz{2>(dQSal-HT zjSWek^F+oHuA)*Zar*MJD`gVrX+F>*gW_z`=Y>l+^7*m`lA}nD*E%WQ-x|QnS*^pl zgrRJ12FQm}1hyNkT%vey>yXnbxKZI8l1PS%v_3=4N;H z@hL>&d_>~YB8kDvIE{kX{5iRA4??Ix2p@!J&?v%`8yw5&+-*JuVH}fg!2~I>{d1Dq z%}6P4&UBt#$~h%U#v3hmz^LUM6~R#}IO;sd94EGOHeW(U+dLuXlS3%20n(s_0jF)a z1ye#pi7$4u-dvzgqa-{y;^qB;HV+*|eayYm?-nRFTq;d$l@3L5+R5F+o^ z=fuR_h=_{aKx6O&JJFV?i2PxTXX@|dCqgfF(}N2azHm~Q9ADqshl9)DO_RF zp#dKSiq8wtf+rv6pLtKH9$LdcLusmnCy9(~V(VVpOsK&utFOe+J9G@+$&VlkT6Y6a zG~XCdp~$`Fn?y;mQ_lNZu$%zijX7tU$D|vI0=I@>q_7*20v*3@50LUvAgW9WmC1rN zRR-(4;FX;2MIb^!ytLQWWB_Eg;|8{!qc(AjglgxQdc;Hzb`u8=g{L^6!yw{uWel@t zIbni!+bJ%;a#RxZuG5oOvI$&}hL_Yc6f|6G0OZ$Q5Yd#6gE@h~-eBuEPbbIEVsI*& zBN~cqzhT=rbm~z)>+8tg;9&h6+0Q$Oz#_&1#+0F;zfAp;W}{k{&{t$N`)5ngQ8IB`J+ysZKJ7L07(OEl$>*Z2OIrBLk(u5hBG za-t)9R019VzJtwW@7t+14qAAcV+Ii`F(8dP#TlSSovHjp5F_eY?t6)~AZaAGe=e#Y z60YaVpkU#%9JJj@30?!wa=e_;KqEl$3_bONI}!v_uC1S-c8fp&yeo{$nJ0Lp3#xQM z0qiGt>@HZv1-<*x>+mqJisRh@Co%N7tqf`~M2gBUL&~qNlq2PrCfjx-U%7GxstAtY zG!H>DWwrAJ9jIdt$k8Z6nfD^PBRGcQ=S8y1IZu#&rFEW4=1di4CPVqDwe$E%Pz$@7 z6TDnyflvq=K)s+tkSgCYom1!sw5FqW&YzW`H~`-b&*L_oi|4F_;G zgslIJxy0k5{%7*LurH`k4)_L~Mv4H80?ryTmI6VQzbeZL;d;tJydRi2^TT<`$(bM=G{&yt1b>jXU7!eG zgCd|UNLO*mHi;J0o3>52CQ}#e)|aUBcIyu6v>nW7yWP5-x@d=T9d_b<8f|5Nek>i8 zfXoZ_5azx7)^wUbI_Z2Nb4P(f&p3MZ0NxFUY(d3ZF$V z66&1Yn$oK=}E*1-m)4zuiuqf~xw@*!xe}(P3!~r|f1adkSUS zOVjd+t`^4sCNM=KLLC0kiol#>1eshNifgLd|&hl8Bdi+2tj|bdZqHy5~YQ zmy1F*9ki?{wBd~1e7fPR-PS}n{%&qG06z?Wx80_3SC%`J+(%LE60pEY~T!X(4;s zZdy!ZsS8pU6}H=ZiWYpd2ra{3+`X`#A2OiUxYvIM9EtAoV{zifss)qcGS7gBJF4>u`?d#Fza^H!u}Gd)3n|C zs%e2~k@fYi1yn!kwuRJyo!ImRgM~l=s?$z<@db3>K|6Xh?LY@dUa}iPL~)6`$GHK!ps43>C5IT2 zDJPdbfTXOBtGr`c=)tp+LgjxelDzme9IH2bl(+*TtPTa7V9|Fv%h8YO) zWa|zWbO@yO%0#G;UYTi!t-YQ<4-C*6BH1!K6i7DE*l}o$X1wDTb}w!O48rk#yWr+Z z95EE22V(aZM;9Mmh)R1w5i9hfCZ*ktqW5?!b7Y(`g=fPTrvrQ@pi5l0kG@QufodL zLl6XZF`d7@%frE@;1;jCx^u(jf_q)P<~r?15V`zv3m#dHS7iI*Xk+x`U>`?}o{n-V zga@25{!ylh(&Ow~c;WAHVsS3H+{#qD5&)F_J^ExSsZ}_;9jBmzSMb7Dae4)mv}ozY z#5-1c3cD3A+=gJ;H}RkvXN@3d@+k>!nN9~+ZopSj8b{@NJThn+F997luAB2S3cP@I6b8r$bc`vMkQkrX&JX zogp&Fn|M4o8F`ZNb3YLjlLMcI40i{mb`a0!vYrl=4W+Ycho`&4)5F2{8Z27STTchk zmH&jNBLs@{s?7>W7*IRvA)BEs(b*EbUh|y+LabPhAt;%HQBraT5tNUH4B<96{VYLB zuFNCK?Y3Je%ynm%alC@qdlz{}j9SZ42^^($P)3|x#8JQE*u@<6YYyb=lD%*Z*VB_B zcd&7suu-ks2uPKY@Su@1$H0Un2MUqSUBPzHg`0iYph`YJ(%xFTb`Lk#9HHl7QT3D2-=fjSk+Hw(#{ z$AFXi*@7I+VN60{woI64(*W-#I)HJE#1nW3R6d($3x(FG^DAS^DTSjluAFjnXm<($ z`ndw(LOcl}Hv16^%FJF)H{Ki7pyZ{D!mw50U^F2HAW}SvI1-4|OI9UsLFQTlmK)+( zC&$zx!`%*f)M5^bQj0hjX}@J9XjLx`DzR;%!x@&(Xlxq`COR@EI_lGPs&cI(Tk9aR z^O)I`__b1;F+r?%7oKuX5au|Q!YtN^=V`Y|a2NQr4D@SDfPD|oeh(+x^ISV|y@$JC z!A3-UMXTCd%Y~=XHMg8`qL4ANSs*Heiy^=urGxRMR1VY^7o7pZ1`v@j@(2^cxEsnZ zlnYa4#dE?C7zmG92^{YU4gEF8$UGB}NS61O2T1_|+*hp{!x0BKCS*X^wk6*z)9G!? zA(&6+L&Z)O49eDt@9NYl3`0>EOR%yh8dRvwXOm z+QNzWh;{iO>UGXwA=pU>flg21spE2oxkrT=(3(z^t#zPmPsmn5_Jr|lQF|dD@}y2r zbP^yALp$+Q-kt`TLl`tTb!M4!fms#;rGva9Sr3PEvTcS12ihX*HMhY`z@G)vCjU|G z$W}XgcIu`4FeD}0{I;o)oiTf92izUJasaH0lo<^%jGgZ5C7$lP(uKKK5#()=0+{Vw zz2=su2x#z9JDzZNJmKLmSf*vfigGs#@WgV|8i@93<*qecWlfnz5%g|);~Fj>MDAQ? z89%W;T{GfRiciX^c&_r}aw-m(RIr9?jO7YrIldn5A*2H0_+4tpE_Vlb7z10zIqwR; z2k)^GghNVxRO}oTl+OKvjPVRHL=wL)fgwAH*E)`R`Opuuo)YTSL%_rJTrvzyHP9c7 z5d?{mgDjFy6^0Pg?%QsXSvJBa2drD0z3_^?K5YjvqoAlbl}KtMj5!P@JRnYJ zn9hsJI)Rv4V2gn~(`ll#07fRn$X8_3DdP1ZacCl%UDG_*KoG1f6n+>Xnz$RrHv#05 z79iHOa7 zgNE4f+8vCS?POscR{)XNoqe{W#La!SYQk7hxSlIm$EDd)_ZdR0FZGvm5Jx2US8%4q z@e6B{Nri5T5yo5Jv@x&EjX-qz&Yml`TK-mR~k)AABSMma)C zE-M2-s3(_$4hWLL=-V4;0I#KHux+cs3)rTxKvNE9IZR8O-aJlwW_-cz`jTU+$n6{q zN>IP8Vrp!1WRa>N4eTv@kPBL*l0YNK=gQ!jIqZ3mb3KU`J%pDbFy^T3gms=U6?~%w z>zn8h+$*&Xl@W~{c>xmPPm5gb3Xoy*lL*r0G@EC$Ac-Pp*!7%?HH^Z=H&+w95U1Rs zTAPBwc|S%0LH^Q0+ihY=q1LeV6qtC60`ah?a2;2$o&&r(O<_4#P%#D{2`L$;xLv2Y z-~?_vD1I4onhIdpt_m)>a1&Qx;DU6*OubH+8l(~Cu`hBV{p+}Vb|crnp3CduC3Uuk zkn3dJ;lC(xo-UbU>p9RWuMk6qIC4cT3KM36McKe**Kuf?yb(%+qM{iY{&a^o-y(LQ z`C9`dGWC!UfM}YEAa%k7G>28kv1hpP{ufJ&17e#uD(D6fQes&dd2=5)TwmtikK_w+ zDGJonrnlTy&lEJ29BMTkM4F0deUB5oLfKn$$iR>2|sSM0Sm^CV#+gZ1~? z^C3LGV$Vb6_W^41(|w3z%yHg>spoO#YhWC(4+$Rz7F=)xXN|%z&zHgOp$-fad{CE8 zuhby@uJl2wO}t>Uc^AkWAUav|F_4?Ar!fOc^nmZ#J{+WHYd8bkAZTCDfhJ?lD)R&E z=!w)tMGL?l08c=$ziLh{;608mg2AW(o=*$67%51V%QPmTAAq!S=<{>i*bmj1M}br{ z7l#6P`Db2@VkmX6rphM2!i@5*qJASp2}L$H7Z!0;VUZNPh%@`D1hWkN&^R;5 z8%7zlTpVFQLS0WIhV$3Nv4?@tqPWKaf`nc_9UF^&%E9vldFS^)Xv6G-Xa+UFiZIVd z^hSII{aIMS!LR|w3J$KYlA|9%U&}!u99$$@!Sz>i`N^~f61B(*dl%TbDiFzxGLFy` z+vYRtk-UhrhmViX9=ax7(SD+Tz_WcF=(Slp3d<%qAR7#IJqM#zq^N?la0{2*SH|%H zvkr2?!!RnRPH?VC@;cXyF3(YIXqp@vWI*1GQA5<{F0}jL17>@YxfbFs1C{8mS zu?-FUT~xYY;BpIsr4>7og=r8Ywh!^aN%;jZ?+kdy+7GY5%T$2Lo_vj^-ynp7}Luw=^BW^BC8X17Qp#sXCpp5QWW*bxK78Crm$nmDj> z8Jkd#Wf(Z(`2)4bt*J)1)I2xTrQ)6+hyf;m5cVu4m@kv!tpFbDt^$8f^zOB_z)leHYNvd z|HKo-aBo2Zqr5HDO2lI*nLUV@lzr1au-Y{k$cM<>b0wF(-VyX}p7S9y&P)ZHu!%zx z_69Edc}GvV5r>J`74N-KJ0xl zLj?>*Y~?!`-w=bV+RF6~AS&qH1|!Zt{C&k}`hL`ortdMa;&abCcsZ(i$W^nj2C;cB zaJ_QC4#EI(sC%$rH5XYvUd~5V5a0SV&JDNOQ#sNji zhQ`&L*bWb9hpW@gf;d$=#?Rx(!9$J7NT!-N^k!wFOL*d(QXvKi@?euV>Ngy_nWGYa z`cA;5=ikemEr9(E=b6Z9g$G^wSoytz~AQH#8Dx#IANOqj{_;qO}s6B8LuL4kqRY zb0(ppMbVUKg-icz6vm3<`OrKlv`knEoKq9mN^DmN--EWNP$D`wk}a_XxuS&Wu9r$v zK!s4aFxJv^&9JT9g;SzM=YK)7G(T>ZMutot5HLm;G}7!3vBlL6T=>@I#5;(NQrlVU z>!Mdiq>oY&p!`UG%^rb7-hSv9p5t*W(1rMWtgc9CO#fT~)XvE9_fE;#qU2^~i=yj_ zf{sHc@@~+dPTVXf_=7e(`RqZk^T)Vsl>>&k8J>;|F9)r4O~5?iCC}?n3W0zxq~Ft#56Jty9C$a2$1rqpCQn8VNQe9|pnR8p3T|z|G!Wv0L}q>wEa@*Y|vxO&9DtaNuY`!Ph5S zThE<4DqhC-{`BWmQ`%qB-{1McBr4-W^GARE_>)in`)`?9yB`kRuwgAarYOhyg~x@H(JP~4BBB!3=;I>RMJ!tr5gr$@VogMB zTr^s}yE33(sMr10q@`xHK>OC_@Kr4eN8@)c{=hM|L-WHMZWDdoPCrUwMh zc_u7k^!~lOcfJ$66|%v}Qzq?iE-I})Qd8Z`SD)hf>gJZyEj7-@BhIG74M&`fEzY(k z$ZM-^YN|cn+}>PY-FURNrlGp2nr~{TZm(}`tZzMD-FmFKmOpX0rSU}Dk=nzK#uN0B z>XuqA@bR$lrDF@s(E75N*tJrb#>2x`p>Xq4`FP54wZFTEGVb}!ufFldJE=QA+LL$S zkn?2w#lGQcbm)~69eCB$(n@1k&9S<#`R2A$r`z}CF@+V6$(skzcYJG+EfZ4QCjO@5xuVn~hjw>Njek~g(QU$SB|C(*JNne}s5HfUHBv!d zffr@e7yi~3Anb0Oe;~Ls@4b%&g?g{%vu7&~!Sh#Y5nXS=6}etmEdSl~BV8{=eUu6~ zI;JYraPv@jc5Hp=9XjrFBpEbbu649G*?Et2&2_Z4VDDWrWt1GuUmdqbj$vcFEi1AA z{#UC${&S6Aq^5v0<&vLqq_CUZ^*JWo8`%Bhe^dV9S-3al-t%P}%Mh$W@^jdKdQEf~ zamvJHNF71b@+)60qtduSsRIT&SQS+{<}^Dn%(ag*U!zy3{P z(&m?vQ?|Ukb=xbiZvX9TukU!{cW=J+`?vq=4}W~;U1X%O|6KpqUF1o${`2Qb{p_V2 z9sOh5XTPK8QdDbWb1Tn--L5@CA3o7|)OoD6NjwjP!m=o;=Hg{q+%9wYdOyw5;+CP} zz9l1r^rgXpk=}vpU3U87z@YfkfU8}%QO33Fy(5JfJ=G{f+Ypq;5d2NT<6hNNv&^|i zKno_5>WT6F4ujvTVkcBlqd29kBHq70zPk&vi$Dt}(27#QY2)q8=w!aM1{aDWzoK48 zTi#KsDi-U|&*J5*q(d(QG=Lyqkg_WYY9%q*6wdzj&?=_hJdwx=I2tZYw#b9ADxDvZ zcNZ-JeS0QloT-;kZ_hMdK(h)IFAdgIG1ZU&sm7Uap&jxqs|W_e;<28dK9VrsoE1q3 z$~(kY;vokXdM1q(Gxt5>FsxH!Av3N^nXgBw8`2DU)n2J8Lsms=%hP6Ntwnoe++eWJ zOs_K%DRuV{BRxnBNw0S5#Fd?_4%(+OQqOTU1pCM#CpOAIMFn%6x`H`}(Dn<%&i#Ti zT{E(G7H51A5~#Pi@_C1{<{lEHb;j#8ngY$CU5^}UoO3ATPVgwML1z=9S1TdCUb@il zH{$$TfST8#jX2SoSO{6Md|q6&YMR;8XXI?Ey2|&sEF*5bw#$e^`79%c4p1zn)M!$t z4&#VL6=?4c1$sO_m4oIJ*7>F?Ylx}Ff@LVHO0W!7RR<~Hp8~7+fleJ$MPU+F%{6#% zd?>3@1%*++=Y%I$t5lRq1$649gyUe120F}w6_;SZecuw?S;c#lNc1WvZj-5$pGtZ< z?pK;SgWs=$Kj1fZYY#K(2HY-;B4~`?aE2N6M!eU7EY!?NemgP+)8sRwk3w3qHU$gG zr?JnNQFnL@xx-eBI!Rth*+-cxRK+N3N008{kv|E@vX4SzgMZJ($eG8f2hK4%%Ksem zB;|K*jQ&luS9!83OE?R~==tSyR9TJ-=nP2(!D|ZMR8@u9RON4~vJ?c$mzB#@Swol8 z`I`gRFSAorRA@2nTdq`PDLWvIexQ7cDyyUvz6MY1fC@?K=~1@o4zCP0RH44>U@A=W z3KaxeXDn{gx7+f!%DWF|OVEll5|>cYD(xK>)ABK_n^t(%8ERWuqhlpn=fD8Jn7uo# z0VDXQ*!$BOaDty@!H5ENM|!Hdj+JU7x2ZdHlNV549myio3f!~|^;dOP6<6-21oZsOkTS{eD6-%dw<$4S(OtjwoPE=+FdwwK(4w6X~JbM^R0YA!Kym|*B!_qJrCL% z46e;P#(xEhF`lNd@^1o!U|oPy!Yhx43DanWvER8#kf9ScEP*PcYlADJn<+qChE-=g zVE}VO`E8O6eP2L&Lp;1N8pF z12&2xezKL@K`7aIo2HNTbq&z9g=2fVfswjQQInbmzXd~e>f*NpaO1Cc_Vo_;^bUMm zKsyI66;jmH>b^c9C~jcqUu$rJZ{Se=sYk#p^2;6YMTPL7mRS9%^?P)f}&b}5-H*?^8S zq+*LR;);pKOF=m*GR~K}GC{3_ja9*minl9*Kd6E~+d@O(`O@85V^_%DPY&&Uh_g)1 zc)FN5ZaZXT^8nho1VD%_cGpH*&OZzP1^9w5lxqHJWVNqcD0N2gYW6)2ZG79tL{N*1 zgP$qY6$CFS*5x@#tzgN6;vug*Q%VF@L_JfAa7C76(%$XwI|OMue=CwWbB}nmgLtFF zGTKv_=~!jEovyi2ndMlOS8jJGiMLDY0(IAWZ2iglFsH_*6gSBs{%qeGTulDD9GQ1D zHIHMBoPelsR`QdG{T1jOu(@`0{MV97EI-?b-U#T_XctVBoMyMoV~!AE#q86Z-kUGm ztLFA9(Wu^?WAZ5#XTg{{$OT(vQ84wW+{5{%6>LDhX(cPmH!UURbx?F8+OUftN@=>~ zw$Me>HGPBN*=Y2Osow71uFF`!5zREnKRncRaReU4qQ|=iz8&eIo3D4G?V>TX$JqV- zNA>))v5N9}IV2dTkmnCrSDN&U%oN7to5Bs&Fm2KbQXYy6F=>6)7!s<0LhBgfVN2@gE!J;rC zs)UHVP5Tvvb0z%nqmZq;Hik6(Hd;Zf0oiE?Ef(BCfY4n^_UyMzWsXCOtxKJP zc?04oHO9g2p{}k9j1A#J`WJHf>@!^dA`THZwREh&_2I6|6#PrF~1O;8kB=55uNNpfZ^}bB~r*rXk{cz_l8nVGJG2 zt7*HJ-7&$@~e4 zUf@AsK7<{nW$ed?j3xiPm6JslY*7)bZj->dj#75?0=1~vAXD6;o2rjvFjQw@tj@w< zorTdl+}l|gufzZ2ER5J$7_zf4W@lm0&cdjjl_+H1lO|8uUshgmsH(b7xHdFAa{b25 zTX*l>AFZiAQsZoFIo)!^*@PwwPVv>vd~;E0;}ICBSGSxve&obqzOjXO9zJ@a@o>YD ze|db&@y4%zJe6P=GjnL4D80?8HY-xno!^<|X!;f{TE%cDE!=WahP|(&P)tj_R_xlG z7_7&-t&bH0506x{4JR7e_9o20euUU$J|y%+22DduXMxwrE0&4dVCK`Z%K76ROxBf* zhl&%bbaIFsLheA&5&WmB#u4dQm;@oBumHXNpT!AtsYeg7!5sC-p@BJvQ2rbgFM-cZ zTn=g(!M@E=u6?Z-sc9*gQsQw=+>AT^;9D+w(Sb=crXiXSLN1NzpfTm6C!iHsqbJh& zYX+BbW}-mN9j0(*H1F!w$yY6-#H~_6Q}J)r-LZz?(p5@n-y2pdF4+zBFmq2 zM50v}T8>@A1$?N%nOj64LPU&|Fa(P%=&TE104BEaWb=<%mI-qwW=v4XLSb) z=PFCgtzZSdUKTf32efsxygE__sOy=<@UaurlD~xOW$i+xeNpMUa+%_e*pw?qc2;#VIBl|GNuXlA@Jp$YQ6f+e)90yJ^*!P_; z=O{OhdWfS4&OrRB+^hnpk9=^OpCA_bU1%K zQdwTHQyePoOxFw;cO&=nm$T;&)0MP%(!@E4;2>Tb!H}oJ>Oi6a(QzYZ9sx&!^I}h$ED9IOYjNZw=yym5Sq-SoBzn$iG#}*MRUGwvY7%1Sw$1 znw)L5bo22OEi^h!lcF%7TX-Tr$lJ6+cxb0Ol95>CM6g3#hq+2?k-_)e6~q!0-DCy{ z+7wM5-(W~VTN#2M2`G=O_;p2A#i@!c`w9Dp6_1yns?ggt_Q;Bw<0q<@*EF?89jQHD z+Y-^*c>KiSXT`HV*EQ8b%@HRWAs&uEsWr{jZ4vy@bwE@cep$o`rFeR0WnRN^y?D&$8t1;~Q%%m6 zTJ+1mmfFKDwacB2ZPmw}M+m;UB@$H&ZUxd$G_@1sM}IDFJ8`_Vp_V|0f)YnsU5ARo zW9xAesQbEhc|&ajD(`HhTbm=A+Z$V|*NF#>HaMFbs#^|60;AKyK>G@`f*djZMq0Q5 z_0{t`L%PDi5W#3RPw;bw*;aw40RaqpH|sqdf`V%X(=sR@v5cQ%$PEXL0K1U`ABoEn zmqR+yU268CW$H(kJ+j>94erEv#kwqKxro{dQt^*LJjFalJyy(gP>&bW@^W=YmKp;s zD5$~(e}<~d!tnA#c>356K#5BS87Y*8ArLiwNsSy|nwhmt_ZC1VqR z=&O+>A)v9+?Zc~{i67?s$?a#YzKfO*3zw~a^}Nza z2)^%21fQu>hGS$JTrZqkILu2c7Y!4|Cxfl=XL502+lIX0lS<9Zw1S9sQ+v&HYhP}O zE;0AC;8%OBQU6g>1)ck|oG$p-UEjjX$`X8L#C{yg42p;Kq*eFzKb>Vz05~x8Fz);0SE0lgA-Jh7nD3&O=7T2gIFo77;cT|=Ffah z!ocPY;@U}T1Ny*)-z6p>T3=;6K@JaEo9vxWfa3fi>E8NH%&4lhk) zwVPR^cfe7Nd%%#+jUgJQXU^!U(Hx0Kn1+uit4%o;6^(s>hx)*8YZU+dpF zN5D5nSw~HOu--TQmjN*J2r~T<{!xQf!oO+ge&4dx_(rmzb-u*=KuQur1W)SVRWP=d z7^MW;ydihcdKOF|P*|heX~FQE`)FQ?u=-zRPb&3Bd3umhE~(LFVOU+A^?@vuS67$J zyQ73uV>%=Amq4qIbav{@b1jdPYtCB8V2e+%#S8dDB(!wuR%Dp{EN>WvPF=uDp`NSmSdN40;_5KyIg`s|Xl^)awO989F+6fs!7r@2P{YK&?h0o|~~LYlg(B zv-MWKi|b$H!DFNjW~RtZX9Ld&3Hg+?YWo9;_nC>N(e6>BJGrQ3r#9)n>Avk+@qHns z_AGxbXRv&_%m*3hm5v(glr+!Y_$-H@ElU$!=w;;knP#MP4)EKx|DjEv(8U_?Wq zpZ_5EI;RU>&Okx#e4bZnj|!Uw?dHinl~Cqk7}hNkMiTEOW+YOHI}?xBBW<+Cn;NVM zrW00wz&gQ{(5c((BNm?}+@O`|?Z+;dzY}n$uKdIWYFZnOnMZ1-6Os$ipFSFo?VD?+ zGoz!X7^1K(=eRJZN@4chyt7JW_5kmn+h!z)w_1%8tK{W#hp89Zs9(2%*fu1^Bl?pP zP+d?F?Vhfi*8cb~e=GHPmCWXK)%xMgof^3{W0g&Q)j;;NlB-+D@C&AR#LvWaJ;tvY zHD-!QTw_!tY^E6N3DX*pYtvVRZrPl$Io|B9O^S)Mu0cP&0*3X1f$1c2?+C#bj2PD;Sv-(=7#3BHwh>{OslZe0haBwg_B zFh=Chkf69{Sz z&IzPk?nGxPTYN(9SnGrd#EkP`wtQGxDR`8Bt`z>3g9{%ATXZ3J(t6VV$h>Ltg&O?8 z19UuYlM==KJ2iN>pE|F|S0_m)4)gN zs{D6?27C)VT7M@fLN=cyl{biqh%JQUw4h=*@cPzPqZ{~_+&1ee0`IoAyg z2nTG2_C+`vha5SbF1!Fyg8UqC+c?aGnVw5Km)2xiV$`6#Oi10Cx5dk(OpF=37a*Oc3MYu2zL3Tk_13bJo7H$aSk`^%}5uS7g3l9)4wV?5isR^NghlnNs zsxzLmAT}b8kS?goX{GT-4#o?_#dc^&4$ddsA*OTy!TN=Q%sGYs61Z}#_eK|e<6__S zF4y4#5DP)7i$|~C+f&~`*uEk@yXuOvjCeWvQGdE-Xw2%uAW(0F{?(iYmxES1zSR;a z>;iYV3!Dep*hHNDhUoo9e)lR^BoN0M;-mXu;n#k2zf%Y1$&mZ>Hf2{ZlMfE- zncS27Q_fv?gvTO5N-` zPimQ|R8)68VTy+iKGB*Ck<5o0HFLt00crqj0HG`8Wk<_&!$+YgNWZZkapZ+ap%Ua* zQ<>y%^3P0~(5cB!n*cOfS%@R*wAT2fK2u+9r>&BFvIUxJJ-{n+G5#-`4=_g45ZKcM ztHTsu>tU1S%5|^h;=Cug$~0P7_l18DlzP^s^oSHXjI993UmlP_-H;l_xkQ7?{xm=1$AP zV2d``f(KikPWv4=f|@zZWX!_jv=JBI-&in1z$9I#@f?wGHu37_NjX?IR^@H0v*KB_ z(sZUAQ=0I}S(ws^3#*|Ag(h`A5heQm?01wogPA#3t0Xo_W)hc;Op?`+{gBe?pB<{S zPRQN}=Bq6S+nJ?Nrdw;X1e^ms^|YQ8RJjR4Zn=P)YBSY&HAJ~lX>yc@DNX+62Bm2N z*?R_*`l)oNT9~cJ1trL;AS2Vx_5c|*1b~zi0I+jaRrLTy-{mgHjiN5o^Ts&Y2oU8S}Od#O&XdQT8(din%h3A0_H@#*6 zjSzzdGu}OFU^?`F0vYp*1a(@lpvxbb>*OO7czJgQ`Rgm7(PUh2VtnEotf=@}=Rz1) zF4c$W+w?8O7p>N{@&sN%n9h@NSHL=?Ow)HN!Ci~(MqVObtqwHH{A-OXoO$o`S_+-;sF^zofiik=tUA1LPP?f0`7|Gm$ z3U(T=fqDiA+m*}<5Z05&dvwzD^mOJMJ5U49BIQOElwoEB2%2w5*%f94;7}_b=3{$| zF@)FoVh7qBL~wUbH(#SM1A6RsK%8Fb^yH<<$p+_i8_p00E2JH*JnA6S=Z$wPk^nYl zX+Z6ET(gL6!h<$C*9mh1YBjTwHwy(^8wCaUKk}t3T4mz7N5;KkLZDd*@yA+gqbZ); za%KBTS8-1$j+`&!O&;w-0A?8@H6b7{GAalUD2+dW2ZC40KW|+N(L{m?Vgmyc4Ti+n z!;HcW>4+HEK*yOMv7S@$0h9(;$xL@wP-I(Q$Q=mo71jeYdwCU$DI?Cz+$cY3AYLBS zCP_`wkUIwG+=NHsA4%vWM2|ez_Jm%ys)i7*8XyRX@988^>WjiPr_S6DR=$SF%cNxr z07&O=%i_)FEk=ld8KW^EvnMfO>LMKI089(;bBjTz&VfggC$6pU>4Crm4Y?En={meS zqsNeGLKGw9C^WVW_S8(z%Zwzl+iIpKC&imDbtf1h^b&^-Q#XJqcpKtS1gX||St;H< zG5#n8Ex&I{HCTQ{E^ozV1k8N&G2Mdj6;mXuQr_AN4y1r~9f3=aT};Sn_S3~wI^quB7@F$PKWRstQADJ2J+xpa%MYu;1u~%GpTJR|JF?I zY9_BYk>0IjXEXV53%UDjBC@D$iKkfKj#Xw4;&08hW9PVH#K&hD#rU+0fN9Ox=1r%G z-1DY6f0^q?VGqYAoOF{mDe#$3Pk0^MJRc*x+E-Y>;|J(;ZU|eMZ6fjMsTgnc>TXI0 zdb_l_h48pXVxL)`cHZMvwbg>0!AQDo#dDU?-GsKCMK3eVcBtY(OzAUt(ig**s%XU> zErF>za7o!SzmiQ3TJT=Gq8A<&W$lWKlKybFdlw~b7^&!Z&+W;F+ZEbL17|Q|)@Z)? zKFPJ$NMZ|_&TBAbNa#0iO50oOgtykcrC8+Of?fR8k|Dv(XUHR3QTO;C9yBN=A5OY{ zMqMSiO&ao8cuTSW@jon870h};F{F|z25iC~h9qYMg}dP99QqR??3vCW6{T>$rEo57 zSIAYA8$M)v!A+2qiDavC6b}te-aW~-aH*<7`jEU3e^WiOkmzNZ!A@AU9OjV=?cXwn4Jgfw3e_v+>b z?6FfPulJ5%qx^AadTk0_fNGp z*ET^$#Oa0;ji{Hg=rerN7ZS|tRGafi*PsOZq^+^`6!r(cwGrK?w6#>%Gy_0S`|;l4 z5ge;)+lOQJwnEI&#y9m2v~)E|q%th$R9p3NDVEuK)OosDxP+}c4PUSgr+IXAGLG?W zNTdMEu2ZLax`w(W7}wg;bba8`iAF4mcYQnBjs2Q$sXg6-MV~%a+cMaB1;>8V*4*Au zA;q?wg1Z!Z^;C`=JKxGmun?T^+0g6 zv-xmeuK*?Lcjg|2JX&S21k!S5rYVk*6A!oiP^UKJjwP6OBVIdW^kkOQzGKFF15E+M zjJs&f&KHu&f0o>#vHcQZ8d1<}ysDd&6IT^zRyzq^k(spK6krgSWu)`p83K;z{GA{2 zZj^Tw^R7|h%;4qBsA;Z&1WEp06B9QD9MJ@`yALgJc9^A1hgLrtbU($*6sNx*vL)qF zjdb$SxO_;Fnl=Ho-asj%Cg*gVNn0N&o?!)Kf|k>pXbSr-Ig;4bEH3;Y#DyOeR?lBe zhBR7S|3PPAhV4?Kt0i%rWi)M$1+yyhihX${$ZK!PGwKnio!9jA92pj5RTQrXcuu2Y zsN6ZV!@Q)&q_{jMZH_RvLt%U3z(~3-sCHP8)E!x8CXT#gdoUGfp^aX|V`sX3`MhpF zK8IL(CTHD|_2!$&z!!8z6vba89PNqgLZCAJez&`r0lksWonW0v;@y+u;;odFFd-R7$&?Zps@V51=0zY>#ph1>}?R)IYuy-)hH*yOA%?TIs_ zo9un&tR4+uovQ~tjbl@`>@vDxp z7p&4M2*%N>G!|FZ`ty6NUX)jd1>+(1XYQj_QlvuZyAapD3(c9eW*zBvYtDj&8UkCh z4ofUy(oN?X-gJQ&?J}x7gQnQ*3o#mFa?rbPh_}z&vrf#NK!o2GFsR>V$Dk9KN()Yq zx5an1xtLY5VgRJl*a3uXT^OP~<%VCqMY<`rx=DnPzQD8iJDx$Oq+OWd(GrDJa4TD> zxYrebU6YS}di3G7wzV^#hU$vEAR2PZ*SNtLT2%+*o80qWf8aAilDte_5LbB@dx13Z zr(8_HP*Za|i?uv%?ar(9GHa7AL!9nwy)1Yw=pYa#ZB6n_>OI(@Xp3}z$kCsaU5f?Ri-fOCh9qi zxZ4UEX|k+1iGo5;j75k6VZ`$-P}SpCPfOdNu}$i;lhkLuJWryUuaDLI>3yJm z()}}%Z(SnsXq)ufB+XgOA}#q}?7abG2%KB0>W13U}k`rL3*qV0R$J`+9u8{IINe$IG#|QQ#n-H zBKcLD;lBR6Mg(;tkaAGp#N+7c`)-}|4b+Pi1R=cV1at)M2~pmo8V8K)gOx%cR^2$W z&~U*V#EifD);1=pCSqUPYmBITZCf;uLiurh5VWGkYi%voRrgp`dTmf~xo%um2zyJl zLdb;fc7LM`+5MQ1rC+a9cB-~Qk8$pT=F3)AsM6>!TUE&^{h9$s3&3p-4q`5Cie4qm z8Yt8+faXdgj0P5;Yd0gL^r-S6yg!c#`#Om2 zQSOBlH<#jYv}{N0D46}>u% z$7zR>rP>1b5lCyE;gV9~Xq#*J%v{0RZxu`q?{98<^6G&AlF~7@1P!J|`OHi<0lgR}_AW%fFp98khBn`zMTvbkr8(|J% zMpsAdGrz{Ts(V9KuT=L6RBQEHV4lE;mQCOAg(Av_qQlVY&=EQE-VwdxFhfo+utpd( zpafVWdbOzR3t;esXVtPE^Lo|=2wyP2&)Urz1>k(USz{Or2#+tD)6~cc8?4Oe7_Bri zZf#k9OA`n#4cd?||4SPs)!(#%CKm=w3YLlTRRehI0O7^AJ%FCM4=Jp#lnORFV=Iee zHcW4bHn`=}t{!x2xGTufKTg9t$Z%VSkA9p{bKZH$=BiPD)#LSPY~8G{kNc);dyn02 z^HgcvoqN6^+-}d%C*RM=Y-MHg%)dYwK?Ba=Omfkk3zhz1V^~ZID$npjW>gYzhYYodgsb zjbHu-=yo#D?F34<5UgW^nNIQoCNh`!_t#|^n zk)5d>pgKIrf4uXI>Oq-#is3MxcSbB03qv2QAd%(*Lw)QF_1k;iDBUA(wCIsT^#IHX z;@V`8WQIMUdq6CvhTy^nlvdpX3aE;xxqF}{Dw9t!W>9~G#0}vM^}7f^@U1+=gm5DB zDvk_|iV%&wJ0TfkJZt7`DORte_vH?AQXSe=9sK67dfh(Fu6-7trOSPO-2u(618$3z zr{r}zXyY znt>!WUhdQAHoC4_cZe^MpB^1c;b0|e4zXG49<<`Lv>+nzT@ME8@K0Aggp01-yi!x5|F|WPK>C zj!l!}Mu{sI|9_o=H=Qd29pu4*)svA9=A5Eksza}$ zy%@OLz$K*k2vuxSA?3y6=s5ZasSt@)kk^V$%8Mj|KwpA?O51Vd&#OFzLm0qbJNY9UW~LN#H6aAtE$TI9WAWVdzpw zoC>L3F@bG|GL&7q(@KXZ42NmnEqVR#>)w3lZ^i%h#)g5-Z=KwCy!pibW3QXv-+S=f zfzuoRdg|Shrq6d)?A*=APgNqnevZ1 z!dOYN4Mc-9*1hTGJa^)hj4|Wy4yk&@~W+ z?#=Jy`B(8@EbVi(1Mj!&R8kj7N89~|Rf|KmG}Lc-wI1m5{F};p#YQ#`Cc%Rxh)Qe# zi;O#$b&4Hvx1=pAj~-6R#7XudP!MBz1Q}S z;_U1PO*q7gBTN{bO?h%ZeL1sEhdDI8fK}W%ZFsBn;@PQZnBI-z%0I`S;hAy(H`;{& z2^37x*5IcsW=-if9A;9U06>QSjPfo7$-1UYl5AumU>x)sKwQ6G)$}=zwqTK|2uA0l zj%ejR64uwARo1hS`Wom${n0J!>KzV8E9plll5kBZZj1&0uAQ!xf^LCWj$1-}fdxN7 z;_nVBe*Px*7Xt4lRC_)kF zb!3U+C}Fx<^}zNClRDR*BGi7jd)&EqFFT~YdejzD+5`O;TfMSD8f+jMJ5j)c&}E4l zEkgy55se(U@_x-O&caot>FBo7Z$cvlVV)s)TL;V_fFb-jpedup^{|E#{RaXG8)Z^{ zBR)mIlL`0aIIYGD8LS$M7Z_!lmGEbd^Kxt#x=)FLI2*{_{C$e}@ompvk;?`EjOWt` zNR{?B(~&W&I;S2gA?&zJT;8s;s>Su}?U~f5w;go?iGWrN%g%Sbkey0y z+3i&T#-wpnapFFyjezD#m@6@}q#=MMNMf>-Lkz5o1dKeSjnkPWy$bm)CdmB3uS_~2 z@t+l`MfEAq0yV?XlMy!w_a;ckR!7t?5Ld7fB_&1}S>@ZpO^i<`B!nPL>HpwCQ}wS* ztiZgKF=^1Iw}mCmBG9LVc9Eimcss|PI~=A!s~gb$=r_t3t)%DlicIqxjHp=`b66rN zQWioBeoa?N%{pdrwa?1r>l*ieL@waSn4t|;{zkVIC)#x7oXh&JY@Ew_g(OmBP*o`7 zU(w&A;M)xkmRMtsUv zu@hc;pv)E}`Rmx-W@9cZ7|VH^25G7_=*yb@HG6C1FCCL-+T|Ay%bBm`V=l>m?N+rG zo3+B?e`;#!%FmqAqB4K?fZfoW(!Z%yI?`-_)xkew{wWpcT#^ucuf0|BwO%7q+IPvj zzY9WQRDc{Ik~?vytKhMMKNL7VxV;{z3`99lS;6*#w+h}UcwIlBI{D5>eV96j9!Ap# zMXQuW6I9<81Q!Uj_`~le0Uy1 zoZXV-lB2~A`KFV5rDPv)>fksR_)P|nD+rfsk8hW2xgwv1eI@zf*c4n-uZo-7P z0i?a3$G3Eb_IVHfox>1;I}byX1{_8CGvnna9e|gNy&n)WVf9^U{+(u=S1E>RS}l3A_{H*Ic4jLS5~G%$En)7!ier^bPzl-e z`>IkR6s<)Qn0b{gn{4Bl``VN+Sccj1`Xh3|1t@Exm-I5(K6~_bM$oCgKR6cBN1JbF zQnf+2`7nDD-$OS6|Kw70CkPut z*bigahM>hoZ0cSNMVHQxdu**aKaLH}%8g_0){NZ!U~uWXfJ=yO3{()BC1*s@`rfBt zAeC#N)TNcZZo|JhR;g@{c}o)Vl&XaKkAe)q%&i3_d!@RuHbbRu zoXu20rnhp8_BP_K1{qRd&;4dZlghPFw?#rEbl(Ale04!}>5(jT)OG{WiK zHMi8iiR<5-Tz|}3GpU{(|7J8{VpH`PJu|gFr8}CO=)mtC!B4y4rN9cyhc`M4w)@=` zxdT|#$)7(DN0@l|TT=dj2leiUlzot*nOncMe&?Ruo7dKF+`MOZ3Bzgy+n2wa)XMZJ zbiwSy#OW}E_{Rh(bXCk4T`-dXZDD|2ItLy!Th^9N1GY6KUOO#bJ0V^h!?~f11o>YL z+&H*_u|K7Hi@4KNbcQ-Y-wNH%oFp6Xm%ha@ZSqb#M3ZAKq1!8%27GHLB&oI&&wphw zcd`IaG(pP%TzTZFr=C(>)gk76;w^-k^q8x<;OED&bLnb_6rtvT?dw z%E!iBT`bls%iplS!G^qs99@SMK>n>Zn>Z^8X zG;~)Qv}P`F{B_O{q*}LMNjw)<=+tqN(5u9?b)6=Nc$K}qu027wBt|WXgnlw@aE4SE zH$Y!$Lf&2n0_N8Y_L4=_OrvRzG-@mS1szIfraoZW<{nH>Q z?IGK;%68&qM8Kj|-{Wu2u<_V=rmkc|)axP4Byn5=J3ch3G*|@7N-{UjooQvSNP617 zGhD>pGs;8M72vP}FZ;%hGJ=J~A4H%JQgt??*gJw1nt>K$ln~Fc$4V{{vbYmBoov7c zS;;11mwl$k8eo{+xH&jz=l!6al}LKzrK#EjR;S>ih8{3iCBm+g{riGw)USy5>) z69(&$-3H+Vnd(Y=0=rwW0t(o$^kw4}X|O#SuxVP_QtDBfRJo+a56Pd+`*T6HX)#_Q zYNvwCXORC&BzRfy>Bg*qfeEVTbzi7Y3w6iU$A!9M>XV=y%0)-Hm8c@@WrINXDKoy{ z)4kaKyku1MX`$+i>f=Jy@#>R8)iLNM`Jpr9asdnqx75qb5tEAu56s3 zpU*u0T-Urcg)2L=R-MmapjrI#GlZPb=}uCywCWlY*)DpLk^IhZizb)0hKC%chg#Zxe<65XreNJ)h3mq{t$PTs6H3>ePF%Mlczuyz{U^fp zcj5K1()Cvo*S{R~?%e2ipT6T=MaJfo%+0+yn_t3PzS+B_GgI^MlbVUoYbw`hDq1uT z+cgt|Kl)SHM}OK|c3*SZeQepT;PQ=kl>Z~K{QY_5o1QPP%lZ7D>l!)%rDjQ~U1E5A zG}}7b5Id$cXN+{?7$$nGWZhV0@hywXZ+RYIMu zML=2|CaPaq5?(*`WQ07pDC!NYm{{K^ouq6_oTO~Xm@40Ey{kU8_#t__A{Wc8c^C(; ztp7;5a=kWj6aWi#OFIs&q@xy2LF4#p=+7VSs$cy9xdlu} zZUI9Q`piih5i&M$c4%TkLdY$%k^~n&9UC@wR#Irfw$VYiY9iZ(vy>dLc+NG!HIl&7)_4~3ZeN!L!!9+q4y8VKZcf{n-l`&Cx#}BP6(bgYnI?* z(%3Ng4NaJx5Hx1?SV2Nk0+$Z>(ezLG^lb@2+qP|k^k9k~qzC))3+3t$4&9b~!*l^( zKS@Vu-8%aJRsI)V=>J#wUx<7a{-amne=4GJT=-Q!oSI7ize;{zg};Ge5=bR5gZZxw z7leXvnW*|gIZ<~q)FBPkz6}DdAR72{T|qx#!v*yPNAwu0nPByi;Bv$WV+7J*ZSbXI z?NZYhY=cOtLF%bwt7ka~wj~qT7%cwQJeLWxJ#T*4Fm^9dVu-HH-rCYI5yYC*a87>z zvGQQ%X?rlKTmD~m+mx_~{4Ctt?@yo^IGv;D6J@0GG48l>DL4QVm% z*uSJ*x``FEz^iSU;Vf||rg|1=S)gQF?Ki*-uHA@)xv}%n85kJ~dEl}2Pz6bqL%(~?TmnyU&B=>I_(ayb>iJ^-Xw`8m_ zco5{(wLh@>y*N z$)EVJt4yAtk)Pix|8qt0hBq3&_<2@r1~&TGQAUbT8;m=rXpZZ+)$NVnv27L${;i zn-7mxT&~!>_1M3hv*v;+UhaN+wt%3w1dEn6W8#S^tKsOt!0=S17;48#FOXr9$&Y_CE8w?97_iCP1;jnw{8u&=SL>lj zF@E8{afVL$c7Y3T_!!_+%8k+Zp$fV4!-9t)O?e5&e2gvHvPW8))|QIs(YRaWZ+^Go z5d|cq+_6-sdxRYUSTsMPBv)7A=CS>Zz&=)4AJZg}LOk8mVDF+^8Du3|{>a9{v8r)+ z|3`R4S*$^Nr}VdLMA{ijfp)h3 zR@H6z>Q*fRPI^%vjVm-;kkPDW?=TOrpqPT}>V|V!WE(GfRfuX4{#zOLX>@raCH$}#Q=Xi68h@@g zTT18dUt+jlE3sZOB*)B?NQ>vypqjQyHmDVuVY8td` zWW!cg)KJHUI+$~D=dLIK+ww`wgEbB3;%{wx{tkOKGp%_MGZ`o9VE~4l^FWRFyJNsC z*;oaufN)`EQLHnF@wPH zZuw{ve(s|pRn(Q@F$&zXRTrgNpc|ulNVhh{_K0dgw=`29p~`5^U_xN*alDp^XdYmN z#Qc9quXGftmc}$mL*(i;Sy<9!EA2*cgFG+Cu>oGPt&oNj_DNQ7>r zhQHU^7cl>2e@OW^eA~y@dib3NG<7Q^BHe=huapMKR4Ysi06N(I5ZRwo=(ms?VVa~< zj8cIxu#YiCDS$X5E2KhQzUpC}TY52WEwBeM)b((wplrd0 z754n;OXYuQ1Foy=}uc50sPut@A@hbhxI|r&u-i{*o?rW!E zhyE;c4p_LPSIh<%ELLPZx>1~Ijwl^L7)6>P1jm1TCHl{|eF!|_uy*9x#&hhG0BhEi zJ{t2VaH)(k=@J!Nwjw51I$Ej-6KED%y_hXg@QCu ze&0vBC0QUb6fo1||NU_*jxRIx6XJ%K(#ypw98hSyG0JQxjWF*j9UFJf{EZ>R+^C3F zR6twV@tZOpO;Myg`DppWz$~E|EQwZCm9HSksM#ozpNt+*w?ofd+@us_JgQe0uTZqM zI)KeyQs{D_`dnSESoi3R8F3*MJHI%maw}S;QN=5E2i0srHIBADr9I@+qcsW`ig*oz z#^}bWyg$m-1cRRy|;NGo1`&NBCj$>M!K5iRIP4=OL)hioRi^-h66#saGlx)(* zDk^dH?u`p7cXyR(ra%{!FjutdH*t-&vY6Fiu_5%$DK(m)H&M-o6)=LDJtg(1W+$oz z$c>v(?Iy;(VTC;YW6GwZ^u#BkMiYz^Kek5!)s2x)(Pu2ByDCwt34mvsZmbIRD`1`* z&g1ji=>Clh7VMQWw+U0qClFVODBA>8Gx3O|8z{sTU(gT>dGCiwK2H^;OH+*lRdFm( z&MG~&ZRMOuv95UnE0ztqR8W@*{DO|Mim4=bVY319Lmn!8o7qU27U8lekgolJpE}Qy8rB384~E?M+gPKRX=-s;1*NXVp^(w=nWCsD z!v&oopIm`4v(G^suy$?SSW;4Q%)JX~Mr`;kzE^`o%QYhS-N+t=;mcAkP>n8@;M$My z*m8VqD@b(>s%u)tNjZq&)_` z0Z-9ZBV+k808!-;DQ`&7{gxdMgsWN%a($2aZ)_cq@T9nNS&gdS>Xtt6O{{a zE?WjvOB(FoZ3mc*>~Bf`BXWr#$RT+=0{{ma_wGMHN;>a`zZ}>zt;IP|ng#*(^j4=L z7%g^LS&lJkIf5R(SR(16B5a&fj0_=qgeIuQrt}{h2Z}(EYTT9L@hP^k6{<(HsCWf+ z>fY%0I;Y-vA@XTgsWYSeik_VCj@}M(aC?wyyfQ~Mju2Z*Ju+_0G9WXQ{-A0>*f`xd zvAA$t;R5A3qKd5Ds1yTK`Px=uh$|esN{EyaVlD3(P==9T5h@%f;m{g~Lm2t7twfzE zVeZnc&ALTJK2{th!w>hDy|N(>-@&Nge=B#>n@G1-b^D-PRyHeAg!l^`o~w^FM3${B zDS-)(KmJIL7iYH_OWD&lNi7gEwZmNm;)u2Q_!b+PT zA+wg~P5pZ%Wl*;>KP2oJq(nlZ77yzX!UP^ zK<2OygEb9@qqKP(z3Ko{H5J4#+wX7`k5t}Dd=^v>*zT{y;~B#^;)6AJe}o}YH4;{D zhxBB_dZeNs2K`WvPvf@p9*e+Fh*EH>4B8~Od`K8aXeK_twMbDmNg~-f5LAzXH>2Q< zEzBkRB*p5G4|R(pfwPS!JT3y*Tk|Bz`Lam>p)j|V2FIP-U!~ynu_+(xO91^J@Cy9p z`M>pq3k%TevMsXzLgR(cqO=(1eC+Hv6eD~I?MjQ8Ha|6Q8p;-~L%XKUz~uV;tn6Ro zjI^B8WjHlE4W}+#oSs92GiT16b{{GdzCp9moAx=lnHj0MP{ymm_qddtCD{SlrlAs{ z2G#CC?+GiR4syHx@|n{Rxw!I|=l_!@LI{j9SqcxjP3Q=rq#)aMJ~m-a9Fht>A+>vC zrmXC&JZ?16qr$5pyQbx3X654f^7Pc4T%4Dgjx)3F&PmV3x$|?<)3focM4XqkFggy6G3j2zJSKP0LMB$5|P8`JyFwerh(( zUX+(LKOLvyw5*Jb^qlnU`RM>0CYmWQB+{10iR6N}q21cVM958Qj-8(>m*eEb*-5kG z2yLT9qNRdYvzUa&*|JyXGt$O6vUldo{w9r=%HE(*vUT(0v(O5W!e8c}MFv6bP@x>I zv3Jm3wN%xX+KNn5O-iBI5INP)=m5j@x z9Q;uFa^w}w$kry#hN>3BSmeU|Tu$O~-XiGgZ0N=%>D(lZ6wl7yZca#^l`=a%AyM_( z%_!uT=jZ&S$aWH1NKT2DqA}tJvW+NJ{F2=Svqzo^6DuI(v0m`gA6tiST#A-U;Y5^tkv9`|C0#dQq&nKsiWOsvPG+*2U;m zap48Oq%nw}x;8j-bjD?^0CH!2T~kQG@(n_DKTaFKM6<)V?!IR;yl` zIz2WmCoW!|Iz2vHK3!J(p)4(jNy}+TkX5JU9AdI_njkDizX!#k_8lpoBRwETdJdCL z!P7bLbOQbw=oT>656zn%cQ_$2rHKry8dMA;Iv{Mhan<|t=f^LfPY|H>?7lG`VWJ}_ ze?F5xza>9SR-Hfpusr=>{`^BZ=}k1&46*rX4E!j&BA|g$J z-WI3kfNY~u;ZsqVAT^DdB~6s3$P6iSU|>vXsd=e5H4n$kfssO|MBxIcoFVgeRAB2e-zP-zTTnq*4&=)a=qwA7_p>C4h{ z{9s$4(t#i(nSv!eSO|d4m`tM)>n=zV#jh!+s>aS?Z5ZFu*`nh3d z6olp>^mN43Q3!RQ5XqFgp|pRaXAH>yvc!AuO-huRV&){#WuV_8ARn>_$QGvNGYN@v z%(D_@#fvhg$3i$Rei`?ZNq^7^5bS9njHoO^YeA$JFUy}Enbejzv%C< zqRg=IDu#;GMonlie)%GI}J4nGTQ3hy%{1Wkf(JLf(LK4ZH=+8k5NsxjfP(m}3 zW9w8D5c0 zd}xFcrHPwFro8mrJhWJB7WtQR?}`tKhE_lKa7&-G^riRQa1j)c9=I0zKzveEy9a5- z?IIbwtn56p=3BTZXE{13-W?7KGjJYc7w-*!ZGPr-SvCA& z$a1D>Rzi{#-5&mBIEjJ(gn?BP1_tl2xRf^Snl?W(H3!4r=`FJor@?YE0|ZkV&Rdo> zKYf~P8(JEEAl#pUNllZzmc5i)-Rw+Fi-&je+mb+I01bFgL{Ekv4zGqJhSZ-ZMQg*4 zhs%L~$`g;Ns{Dd)BP_~l3wej&U%|FAs22{PoP+Hf}n4=v1Z zT1bNR;lA+d<%i|Vo1l>8=&SHP2p(FvylEi`_Jn^QPLRrPO-xGS(TZK(k`PD2|4bZ2 z@0JK*#4@fu3-itLd|4(RSZj}d=~F#YO=4=Rp$CBj6QJsnO|9 zxp~Xw>3HFy>_xeYQ|G6nx(H>&`dNwb#N1}OpT<3aS|bW>U7ws3KPNs(W=cf^5zpSb z9suGo{Fymx7WbPx2YzQJ#V5q$1U{I+C&MqA6!{X#lo*c_;~{ER{Oou}k*nQ0z+D)LA`1xe&5ffNp9@}-lJRWby=m&9o}6KEy=MCGj+rNQ#uAbCIQxGX;uFhGip)9QlvH zoPo&lT`_TJ{eR8kbS~%t*$cS^r8E&pmw!!=El%KHrKk{8gc~kEWkV}e^oMH=%j<;Q zAqFCpWlHo8NP8-yWCm*A)C#ZiDghTZ3Bv@2*+b#ILWzLO%Y_dK=Luey@y5|kAv40X zEHx){ksQxkl%Jl9@4)l3azNqBMIPbl5w&lF8ekm(#4T-{CCksvW3pQ3NP&Fw)3cfU z+?He*b&+dC?K@er+P_0GbStF9C$=OfqfAjRNobkPC(Yr~=Fr5IqF`a|JG0D??;Iqy z0D;X)ik~G#e-cGN!koZ_1Sw5sGPfHdP|CQ>k0$<5@$&;2QV=WjOy`B^{NXsq~n_)Ro;I>bjtQGo?X=7eh!QTQ2>m`D>7uSpCG zw~sQSTf&1?m&m=_yk5z(^mc z7x#jCF z{DH#!N)_5Wa`iPup~EA;fKn1be*%r?*GMp`dEyOpC0-Gv#qi4Cpb~h;C}!fd%?{Me zq$p_=p0pn1eKNr`6Fod?#-y7!``J;mCvmvWicjKj{mZBgP|hr_oGkS5s5kxPKqe{8 zHrQgSvqHgW$EZ!$ma~791In4r>4ytY$0*OF_5SKfUTE2%9*i!Hx;kli^H8Wne%pG` zR-xx9K}3xFf3x}Y%k%&Ii5Rs1p>czTzx032@RvKx@b}VBG5o1-WcaK6F~i^P>kWVQ z8yWsu60SG>g^3gbYWzyLq3sXF-Q0|q_QPhpl|O98OF=LHkQHz9k6ZC-Z)n9kDdMa& zH?`4xD#``~7vKg;KTYNMOW z+2}H;jZRK&bieyy8{L{A8{Nhqu+e=f{$JSWu899-8=d$X8{O?cWTQ*E&PJCu+(wr> z+(!5Ka2wr!47bs3{)slao#8)jqdOFSBO9GN{Ksu{ec^r^-9R|8(M|jj8{LfIHo65j zvC%ztBOBeb!)7gl|Nvkd*ON;-TL7+ zI%DL`Y;=J-`q9Xn>FDi|!*q1vPtwux59sLk4A;?fe}azwZw#=v4>!83efX=6 zW{cHob6p3}?Dk+T|0SEp>vX%Yp=Mhkz>hu@2bS%!dEIs&wh(N*7MFE6fYar(dF+-B z8@Br^s~HCHqYnXSvR$%uxmlYPUv~N&c~L2@{+?fcD2UsIj<=*T6Y-K zq-|YY*lou?hYdTRU0pU0wz+(sKFqqIRbJd-abdgDhoRdn*z0ti@3KKI)^grfg}rX< z^lkM5sMqUk@3LW^8Rh5I`^2v>BSz~#U7^zD)BiiK0eQ(BVXcnDAb3` zdV39q8fZE5^)XFz(~-s#HBI}QkE(}_=-$So=6!&8r_JT9QN!;!w#)6)K*5@_&#g4V zao%I%B6b@55q#Llg*)6`Zhw@CiyA6r=QbKch=Py!lt%Oh#B8TAP8Xq28y{z*aUESY z3tx0QhmOm}=W4gpu+Pl}J2+%4e6=0h)s-adJ@3L0fy=BMX5J2ui-WL!Mk8#!EFb2| z?{IthFoyvQIv=)^t~=W2_1U^{m%GE_gUJM)#_T)50c^8q>Uz9D!|i>z+wCIP#X@2W zpV)qVVx!TYv*SjI{+!n96AzdV9{l<%E`7T}Q@7nvz1^s8Zrpd^5Ep4Ns`s@V`Evg; zzORg$I*av^#RYSe^?9oBd7BTrY`s1*^c3=tAM!IzU0@=vaJey`Rj)pF@)&dM2oL$W zx`k={k_*^&XzI#L1`PAR>{FOojbAbQj~wS4VBfALIrkmlb9NZE8%V@aKY9>hRDWeY z834D+T)N1n0bUuUiQ=>^!M=wLc z?H1C%Fvm~AoI0;=KJwLI?^>-pJ|o`_*iQicgwe56Q|EJd+?O%^I{HaW%Y}aY=e|S! ze71I*+T7K3I3T0VxN|V0`M`nwUp5}Vhrez-c+7n46ki04SYs29q3tv11c=ys>X^Ti z?Vr=p@lxhe1zZ82tfix_ZfQQqx75C)eJ3}D4revt4!yN~lrhsuNobhy*jS6lM)}1M zOTT36pr7y}?AC0xS-QIV@MYUpEADXEIyxzHvjHRGn5C`P>Gctg#^u6JFJW^|@?{3# zpV;nkcVl;t$6H0&8)Wjjt9YhIxF){r08w?B@KS=Ph2uaFfvs-WRv(N)hx@$CdBp~- z?x5R;JKU~IPM|<5$K^aWV7tJXEgildOBaUO0gT$qi60+u#u~K~<_Yk8t3~s1*{3kO zTEAjwcTq5?|2*`B#_O|actWkiK99xgfC{)wUs#=9*5d1M1VVjcYrrmZ?v#XoSXSIZe$>+7Cq#-vvoffCEaX#1Mf$u6GcIit8*y z4!Qy)j#|SyEW>hjk$Pz)setD$bvBESYY{iRYN(LIQe(BZYj}pO9t?o&7#1)Mg$QR3 zNTWh!D9j6op$IA&0^lie4+g1p843;$0m~04$L$Tk!5M&pC7?W7IzKkhM7~F8@)xuV zVW9jWXx8wMDIiE%8JJ3&84$s@Ga!aGG%yRnB_K?j8W6rF2#pOa%T}$h)X=(j6Ev>(%rS-#GT0g9%^}||PKdhzo zfi0~cY^nO@N@OK2Ke+z{uEvDBI4xbkpVSVHzBx`~0#Qt-8#V(3a4~OB7td$TpX=!H zoa1H|2W&9-Q~b2oIo+x?ROCPC?!-pWi;RJcwZ6Mb`Zg`wSiwL5;d!aQT zo4x+!faQ|gX(e*l-UXt}4>?3hoHjtw26^hUk@XFc!;r&9R&XQ-l~$y8F!{y-rwjnj zmM&QAT(-CfuO|&~xnaDkNl_-;-or@@V>QG9I4F!h8_+(T-I!horzhDcdI7kRO4#$* z1bxf(571;UkfPId&f+<*rlG)DL&8+ytYbaycHq8!MDW{ty8KcJsM>xG#*ewdBpWJr z5Nsbe>A3JdPMVNR{`sh>gYF`;1oPAL$IEGV`ZTTI}>p1;W!**GC+0C9e zasa&ATgU0Vd>*3K`pJpt6a<_m@hb4(oZt!|YH}T?Bl9ZAPnaH1&cTX)W0mPUJ((q- zhEcNb@lXvefLhcJUN(~^bNZ-S)4>vE!#Bp=Y3bvmOv9oGa~V{E)ijcp5~w|F)o;ZW zp!r$6-kxq)V`zN6u#h@gdkXisEL}jCL@Bd)yKeLc*e!5aCkwRDyUlbxr@dy#D68{R z$WQ8|mVJj{QL($G7 z8Wxwcn=YoY&EoANtaeb@Mq;5x~ixt2spKu_T^8j`y{aq;VzrqSLJiFRrIrGRqbw{ z4@5yV?KQF<^I3@Ti%6_4r;G3eUd1LP52W7Z^R)XBYJ!9#kmILSfAiYy&aN(?lR+fZ zj&na)cQe5L^t$(-WN^Qs%IKflq-k88MEt28+*08>zGwOur}7{{9Dwq_A|?MM?Dicx ziaUC%I{KL7FpZ}E6697j?+=qilVM+_WXU4GT|Cso57ICP9y zzCqn+v|2sH2w)xdy3gGMGwT~bhqnDJWa3&*dfCeTu0DaEu7h4DDBvx;mLIHDOR9K`FJA(@CX13D9}*VXP~jhsy^fJ z%)BYwrKzI@aOMcV@w>WO?Fg{mR>GR2o7kq?ZP%IyczZgroVYQlgFeo%O$<|RE+Ny@gVyJ8b@GMYuHFY$Nmc*?q z=te+qZC~JIWJoe}7@=`*PrDa-m~eG}E7j_u_G#*d8efI|iYPSEFB3_vy`cXL>Gy+c z!(KyeU!dCCYXG>44hv^kBdZP=Ns@5o%9UZoIiR?98^3UX>Z+@W8qiHR^049voP)HF zG@5LT5YDU*EUGU69&j1#$)RBwv>m~yLDO$MoU}<^zphQXkT6ibvz@--Lkz>}aN2#? zSY2``L+h|HVR=Jk{rE87&a~&D8sdl)O<-wHImNl z^8+~oyV^Ktf;>v;k5B?A)^ve6Xj9MzAXlRfXcMPJ`Duo;ANYry8(sf^`i%~}lIkbM zYp~@KIBfkS=GWYKD&esupIha6hTG{nX{bGA;Bez+?+{|fVTc)rA!g(dGX!*^;RiYq z8v=XL;22J@gS|K`Ct1W2{$9<=sv0#fiTGZybe!w$^0$@*1{({3p|%q0AnHynbb2jS zcWQZcCxB)sf$)0Gknr={Z3wN?jYcomQ-1oU+YfYFSup*e;|+5g19FotABGt(hOZ@G z&2;ek-EQpGC2scfCNWpgSZ94ePX;O@e||q8mKGX9$HU)Kes;^bE`FLV2 z;2F2oO=JV%=TwBbVcdBm0k`6$5`*>yH!Q#xEM5m5+9>iHi^w=pu0+uxqQuRT^(ic4 z{c2*(4~P_^t+oRiyIgMa+IsZJb<(c!*zj@W`on7DC>HpM)yoNb)?p!nmNUczPRPrk zY7ZY{fOEqDU-meCeiA4C3H~xJ+cT6J}JY~9rON~$B( za_WG;hlp_Fnl#u}+RO?+m(hc!uW9dgYIe0-te1!hj8o9*wBfpPSBIsmgD;R1p6AcO z!toqmJRkVPZ@=q>c~nQ4Z51X{t%L33jC+KVxk|PhO`rHzzn>G(9guu}Fqy<{HyYKX zD8C{|>gfAqcrm9)f4FSt2?MUjl)DE2^ApLqlPs`1IyAe^yWQ4HYMK`a(bl2nVgd*B zI460IpQ^&$HqUu7_34N-?yDN6cmcR^M|C^d`{i0sQ~8R?a8eHBBAd-*+S9FO%KkAv zxys&FIBBk$nI64qFw4(w~rFzF*!0lz^?Q|EAUt0I2+$c-@>Pd`hB0oBy?R`bgi zvXi^3m!;d1wqD>;&hxHnP-Sh@@J5SL({xQoR|nK+?FiI8EJGtrIpa{WV^}hb3n8!o zL~n>y-!QEDZh}?c^;q=<*4oDptIJL23$?MS{UKh98l)OJ#y@El{biTC9eDF4i^oY8 zo{(+GGN`e7HO67SDTDTXlA<0|UIRmpz)+t*K>L_4Zy!~Ys=3v70B`2OXaT?6|MTyC z{||Kn{Wm`UV=!&|bjLGq{pZ{7ZoV1l&+_@@{-2wjE&ApDpI`3(`T5@e^UL}FfA91E zMpwkSg~>}=6;$#rLoekWH;m3yo;XV7?qK->0yGOqVk0QhI~Dl$n*-1b?OI zfbb2Jp1`Ch(D(!zp8)Yz;d>}Y%H&Y^915R9;I9fbC?|o*q3}5rK8L`M6jgF}x2MG& zB6qhN(FD<_sP;qX2vA~XidqnVPh4&uGe0*rD-Pv|jzCN1&yUTD&&`XYH)BC`{QTwQ zZ%$e)M4}SW83Y+}^GI#*l91d4f2A@C%6tQVS`%TJO7n2RgnJXwe~Ijf)&Utom(q*a zYfv+ZuAooI?ed?C&W9+G`P$p%&s=}Ie5Ckl$ne{NxT}ORau-v*o-X%4+gV<5vo*rc z`}sFr`0~#*Sz79JhPwbJR~#nD&YjM*$3k43tQZz0u@E-HbcB_F|8;5Z;H!M_mD)uh zS4#rgAeIQ|#GxrNSUN$0kW6k!qqY>X97!HDq$Hx_;t7H@K083mNVPB#01L<@BQ^U& zkXJ^khcF2x%H&*ti)-OBwkD!8;+cYVs8cK#3|`^38}*5o3dk*Nh9q*iS6H}008^a{ z+#3Fhz%(ln)*b1K@%-iU<>@FsyhKn8Txk|GGl%}5obY$Jh9xA)AO-53(=w+uOO`|5 z6XztFA%xb2e;^>KEeXjSKx{&?IV+Ar(Krr}k6nj82rm~9wk88!l_*OmY*q&BDIo=Y z9{!2I#NS>C+&VcBy>sCPK{2qDS(N*bzqzpdCOjx12?FzDXT`${3X9mqp*%+hNq}Wa zOIB+leQ!yjp?~q}uw?$Gs9&C+$@9hT`aKPedv6Bz%kwjRe!|Yh&5pI>6VCI*Ma^pK zcH@e{)AjlxfSaEG|Ivq5;c@zWkkMeOZe%^xCWB!I-SfU=s4-E1uUV_bXS3qQp7Ypb zFmCs!Zu_ZK+^iq?Bl#V44~lmRgkq1_x-32?aj>%Z9A13c-P2{|_OaV-fUnEhVXIMV z*dCvz)_=VHc78d9o>J@p^6D?OpyG3jCKG9CHxYczchlgF3MLESyvPo zrK1z_K)qz6nE2%R9X3dVi9@rOluGrjM1R> zvYj4(aGOEx>-BYX4MuFI5zyj*v)tXz-arTwi3o()rtWfIhSmn0<%V$z2yX`f5ARUJ zo#l2o1H+%G)fQtH7u?nX?+*UmshYj4hGjiO6 z5Hd&pCwbpWAR5nk8#!=habdduPY!yKmyP!WQPY!sn7G_=BUgnlJDeR3{=9hy{Qx!JppWT5`yB!aO6Pp!Ts2MekNdD> zE>bpEg-D&isUxlbIF3a_!z6fv z6EfbwvwA~gOtKACssV!IkNa>gB$UH(z}wVZP&4SndDGKa_ncP4KtMuuVPWD)BMpMFE{o zi=!uk)tuvt#@pTzfGnjO3SI^*+dy132C0tveGC>oERXRMT{0rWVs|Qiw4uz3}1j7c6!21JynSl(#Kau?oN`rjD%1Kl1gwZtwNyqO- ze|~_xhfyItnnZOCS`B|1jX0=PkxCuz9DP6AbwDENd=4gXN&rD~FQo4Wu^8U>gV6-uAK;4|8W5hN4E8O@N9YknP647v z1?j1~%j9Asz7lf6nusP!n4s2N9xna3$wCX|q-Ry{weXw}rOHfQN0+mM_f#X=4}UzR z)7IDSword3;$KI`hI2d}Vt>3#VSqR$h0#-c4vS|{*b{B1uHC|2oI=hz2MTun@c59Q z`3Z*;^gGgILK0jeJ%i~#bIqOK@ev0mn7NR{a?Mf8L1xRjPJU{rDl>uPzs3!UTsG2W z=>sj6)=@#7qKta=;IMGMPD3n+3lCD%P>>AfAZ$RIf2Puanm=l!2Bn%iPXuFTxum&F zS2Z={42*hE5jsK@ZCevp(<9jf?hu7bTaZiITSqH=fX zD)ozs-6g9ucW!>>sVr0?=~Yxes9^5|Ff(RHnCG$~a@l}7RiU2qxH`8;{Zf(okplI{ z1?syB)$0ot8np9M1sjIDziVN76m21JgDS+`f4rX7j-G z%>#FA9=LP!Kk@2kr8CCX#oOF5z-$OQezj|Hag^hZ z-2mpFc5Hq)@u_0sxUgG{+g=4}cpHE+hob<^DcB%>m{2SPb2hQ}hgC`&(B7A3W3+$@ zKv^=Dz(_GMe_Ar`4#2d!qxC@?@D~izo7Bx9(!!# z%X{oG3x&qEM*5N2bw#l~{!mQao?V-k zEQ{Z?)SIuF-I;R;+tap->#!@E&_h`P^^D3q@9xNtpBgu-ScRagNO#we%5{M zP-kbF&828JCT+Jthp21XX~&BFRhG?u*U=d4oqq1km-j#+7skBVwg(D$gi>7nN->he zu9$f>#&*PiFR<%stj%RI1nqIp!;K%}-SdXx0KpyuFncWYG&_g=-&p$~L*C!#zT0?z z(IJlY)$$nZ_C-AKzC0G1p(u{=e=l#3gMJKTVv!6-$tZ0u!4NEtvd33mcE|V|;CZ&h zR9JGnu;g!xN~6m8ia7Uzj-a3Wd275Y+W5o5=e+jLq0aU8?uwZ5*lCq&e5KevQo%K1 z{TrqFmwQ1Qe^3bZElDag-cx9^cei!=Z&VUs=m^%nd_*uj?dIDVM&&d1k@D_LPrU2B zBHrG8S*C?T;%+<2*#AhB1!5LpIw0B3631|HY@h`oMx$&-# zisJ3vv?zXseZ<|<&XQws+^22jarUkXesAaA?)5vm?L8GJCncX2-ntU;Z9NO`#EO*n z6vf$lCRb-3vZB1RBj`Ta*5$9ULG3{0dX={Q^PfKqb==Ff?>kU5ivU3#OMY2|`TeXY z%yPMYi3Ce^`4i&y;OOaJRJpX|w-1)wTUc_quw<;T|Neq00+3q7fKz%DGHWPf4n+jO>lCS^zqwGAh&4 zY3E(@%7T02$~#*}{PSGK#YNoViul2<{R{j;CBaf}e%QaLJO&yFUdm&K366SecMf*% z|CWD2<#(V`l~GV3H{dKTil;q^4V;he1e!fSGZ%C2{PL*AN0hX4CYqgJfM(}ZnxT@$ ze`!=J;>+XIE6e%C#q;g_eo#%%my+kaK*|3%r9l_&e|}$Bs+i)rNju4FQ?>wZK#{*- zRD``(txD5c*SJ%(1#8@?WVf(IVbr@jjMimZlir=2v8p2nf)nHcz&1HxR4)fC8q!E1lCI24*lX2=a6=(;h>%&P zL`+Icf_1q%(cPiZ7D&%+>`C@0e*iFz1cN7n=qve|awmY2F{*$)w&4RHWy;4Ba5I-e zQY3oxNg9ng;vKdmb<@rxmp|d$^U6q-ExP^66+gGn7VRWW z3qNo!Y;taDvfXNi@y+#@d@Trl|3%`by6IGN)4nO%%+35w(N@E{bw)k)sjebVb4EqI z%93L+Q-^7}W(ykYz>C48*IC5PW<9#FwB+bjHYTq-(lt{W?SLiWMtV_i5kC zTB@zjT1r0Uo>c71zz^6y=Wd@bsg`*>x}a0@b8$gu;Ae3`w~1#i=nDC1F6bWP!!GE4 z&CkgN-JASPT+p54XLdpNA&)NTe$U^+1>HgcUC=2*)?Q}r5t2&{mFO2Bs^x1Fsh2>L zxZIq$G0SMYUkr0p>&yaFv#J{(PpDcjp&5}>b{ zeAd-{D~xZhuk!Wh@Bc5%(En+t7fJK2dcC#=RH`n|m}g27bw+)biTJpeiIsuVwbmRO z$iPV|1~RoZbi^_0*IHIu^76^ud?_(8>{VJ5!`7&^*@&)d*JvbslVM$sWo34r#gexX zRQ_?Y#_P=+)$ zV>9_w7>q4|(H65##sT8n%F$TLJjTfOG*3`BRclCee=IY;+wT2N%CK;gmWi_6vX7w`|jW9XJ8s;T#re4dZ*D;UP z@ljPvXb{LC8)R*-r9DcW3_Yrl@1=Sl|0D_b^i}EP3I072p{ZWrKVpU@nhexZXi+P7 z(ckb%Oq*wfR7o43&Z5$2)btEcx%Tr9L{XB-DVbA9j`RDYrf8?TgjZQqa)@L|XIrVx zrusZxI3y9JqfR8zU4k#F1{)MsI9v24Sm}g5Q^$#XJ}f$5`C}}AW!~C*C4cTe6~?C) zF{W zWRG$z`Y+SL@?By3uPICYq^W-gBy+f4wsCV=FaHZS%X;}4j;)tp;-;;aOS$lRxrdw6 zdfCg}WWB7IWxXuW_3}NpS}#Aq&)~BCpZGbtY(LEZK`z^m@_!-^-E(OF6#P5rMY5jz zJbEKE$bl5CRforxxH3_B|05TpIH19(G>sJX7`ISyAQ_`FlclI%a7M*OXn|uaHFi}7 z_%9Bvb7*=^hD@NAvq5As%SR^hKIc-P=B-y{<>!OW$y;j?bMlRO7WyT(#IGP%4@fC9 z{XL|&LKT^oCkyx%#lLH%|AQ9s_*b)re;}cT(UX-M4h&{INXDuo8~N;ne1kh>g(g*# zwkkP2O}obA&NsZH$yAfAygmVj9vEyM0Ov|0n!PF7O2jR<*ltxmDMpGqhu|6t zZhHX#8a53>yDIhncHM{;_#@$YsN%$sMBQT53 ze6;8U?Sb~r1$YM?Lc@61KC7)J|H`#T;vTyx@&PU>>R8E^tYt|?_(2MYJ2-XNY2|#; zHRgQ1evMhwWf^s-h*Rcr_JDNn`kNtB=B>(LgK{3nb*Kn{k%W|)E_w<0LM z!QVFjbpWYh*|WirFJ=SH+;w8M!9p(cx6dzw?t1gg=peS-nwF>{pYh+Fk9Pa66b(HL z?8ozKU~ID(baUMQ**0zeM{l*5vdk;9_0R+9noQaR`bBsX2>;zTqk3SAHgPTVR=U#z zOAgUu*r*5e6LceJ(w>hP+UyZ=zbHS?Y&K*Y^(yiq-3r2Oq_wbi)8%c<-)y0r!7^;j zGHo!gP>~q^i*FCz#^d%72+0yYv^yly-J#q$?G8OO+wRb#((cf+(|3nnh}a!!oZIfu zhd0|D8k=Rdd!5d9?-V56M~@L^MiHO&dnY`Bqm^i|H#{B?YpSZnMzp=^pYV>0UGG!t zEVS#Q=Sv>ZaE2zlUisk4Nk|N*8gT-bePckSO7!~Bv`0#fInao%DhWe^R3qe+ zC{tu*!tagoNPN$D70{>lBkV|EJPZ}B7d(ULc~tBl81Mwpj?6jttE8l~rR{WSd3ANQ z%LTvEhOXhj0J?;_gw9ty9#2<% zGVcxG=(T<{`SMZ6SJXsu#B)QO@T2EoW;=L8q~1o4N@-3q3BY54ulnc-u3m3IY6BVP z1mgIp-Il+fiqn`FKsySt-`hWSmAWMk(+`A|qnbr-Xmqy=T)s>_}-E18{P zr|+6LI((5Hk{l4vd#R};(5I3{rG(YB_0rKQ@sR5T+>Ybz6x=-H1L7q#)2ywze##|M zXV6}B1}%9IyOmVTa7nEU8I?Ai2DV7;Q6Zi`CsCCo$yM#5S82m}KN?U{_nz_r;#9aB zn5$7w$iW%*C&{&1gDlj*^ij_xYHWHGVh^986sWUov>rtpO<)*6y#3HhRie*N?Lx6{ z_#j(&0&Hm5;~fk@lR!gL2nMKswFWA>V!vd8hgNl-K~M$_7ihN*D}sTEu>j2ni(VyG zHx7>muqIOcmoC>QBBhy%_hgZljb72eE33QYKoyEL8W^U=xxhQ$=nOI~*|K^D<7pQgKka+C>NOzMdsrJEisRaW4>zv$;UYJt}A8Zp*~wgcItYl zZcuv&9R^-hR{l|aE}~0Cw)Hsl`%xcjL$ps~$fsP+Q>6`OC|jsX8Mp!JMU)MEdV1fc zx6(tWYie8NPF>elQTDqsNY+2z@AX|moev@o$`W(9CbssSk&>2_w)Xax9&xrbpKEs3 z)Rs2X)QW?UNb;2W!K@JE?evssyT3>P4m|s(=I3E0OfhvI#tFyGT~W)Nh4zHT zI&;3aucx=Kw4?h%>1!QrV%uwSQ#XSYv4Vo+43Cb8DF1U}$8>%STpgsAR+J0pn2lwC zjkeGM`n}_q(d{M`jY{UbsJrJ}33}0#ntV|7F$bFxK|D>LDuQdiF|?l_@QtDEy!XbO zSP~kuP`uBBc(+6t7E7R0&{@Q?2)qu!JJ)}a&J?6J8~34UR0PgB!1?%`C?3XBu7pz#1`ksy?i&(>LT~-kU-wJ%G{-Gg`mo z@E#k&I}ClSpE~mC@q0#{{eC}`79k*dppxa|_9sF!j(Vx>50<@;Sx$`0uV?Vp=f5Gp zUx0TvT7b$CGW+EB_hfd4*>V^;?DJ7~R+EIRg9#U# zCy!6!H(QY5hGXJ_tt2zn=?ng^+H^fAwK^q>#w@X9wDfq#B> zQtgvSMMx{{nqe6`Sau34gT;lJ4LfEeFcOe~bu#cG^^(hcP)x&eMvxdpAN3(fV*~^b zweZsETnJo^(uVUC@%7M5PKMP)z|Qxz_RfG(E1}fR06QK5n#PhtDeyb8Hjw9v_rrT{ZO8$OJMA+*d;>?(~vGYSauS5(b4@5J0%B0t-VLz z?xVA?kZ7Tf>-A98$y#ZK@w%?=3l31AAKYVfwIkBgK5#G{y;Oy({y{e3LkL0%$xv66baL(B*p6R8NLGLy6Gbkls3)*pd!i-EjfQ!NZXYX48qB^dIhlk3( z0P#h9Bo|^*Frd3Um(5FpL})fhcqCxcbYlSV8It|J^lRF`-XyFc)@v|n^SNKrW=q)A zHDYm-Mn&BqRSWo9@vZ0z0fYqEE#ec!@0_`JVG$72^#A`xuXyj=nK?6O&YU@OX7wsbX-}qkS@ptOPd{zCCX8rn`>N2QlIM?b24sNSC zc*sh1va*}t=R^vv4sqN805KdmSYs&a?!Y2u^D+B*v`4}?B_ND3LpPGpjN-3KOV)fr zVK-B6)Hs>%KbYl#j5GGc&$7#l`hVv-r%grkyRs&%G0CK2h45Tq$HKr-t z6tn3x_lVg*@+U6W*)|a`$M8!192_)IkpPlvc{uZ=&%5r5%h!`bApnI=`F`qIJ$j?MKRhG{xJg*L_ z?d+Jg-*hTrYwgJdP0=FLZoo9;opSioEO#$o?pdy>RLZ@1oMet+fTP`Cv(DXPtGfqJ zG0i&GvX!;`(cJ@Iu)6{6NNAU$h%{3;$X5xlp3tVYYV7Q-ODwcwn<1rn1#2;iIWLQ{ zQv=xUwHt6s!<`bMKCz!UeIo0100}T|fh@Yw%ZHVJkOxR*k4-4{FLbM%t!yEzuBOzj zApc-fUQ?biuZsPq&_g}zkg}5rKMh(aZVMUeIt;}m*Wtk&zjh^;@i)^FM=z3EbX!VZ zvMA3=Es58!>(Wic9cnST5l(DrN>_GTJ=8}IF#mPH@k?E@a;n%8?5J{hSv?>Gk-Fzf z+}w33CGPIJ)F5jR7TJ_uGR$4KtHi@yR~76@91k#Ahm2LaWaBPf3IqXfw#b+q?CTIA z71&nhH-{M2A%uhw`)<*2$~vp9o+ZRxqg3k-F>WU-6g%^p(jC)_Sh6fTU6)=sVwtir zeN9&S3Nerj@W8QLBDJXGdy9yBab7(G;}FM&XL*G@Kd+qqrc`E3x0WkAizbRLCrJqJDFQ44(JG(+*+>$+3w`Wzhzi!{>&o%6+XN;*k_LasSPXIK3a+-Oj z_V2v0Lv%I_+*sz?C9#)*6UAb=*_isl7ULHG?6D57rY+WgHf^<@EzmG^2eMA>JZ1LN z?Wva=+}Hc*_JJ5VVoa_oFRd0AhKS`7Aff$WWubf1DNUt`)gAGN*8=9B2iaC^oWC&@ zu`Y6BTg9bq^6`*Z!I)T*eL#0oQ$#lHA^%zPhuW2X%^EDFf&suv4TvqK=&<8qqi4%7 za<c2%!pQ{FI9Dgm)k!o=LhU|SSs2!% zJ)1^D9d58UHV_~#a-4BXqnO)c^IueG<9=^55whq58~2e7=sho<04o67&m-l^M$dI0 z+o~PX&)Xe7{@LyGh7)##>igj94MW!{>Rz z>-Y+}o{&|5)_B0H69&gFC;$c|FmQ$3bdhjZ+>PzyxlZ>_uDXBH(X^E7~IY2YaG*c$-xe?W_`LY<+Q^pGk8L%$}k-6 zyZl#WL)HXcI_8s@JV|!?j=WMa+t!qBgiv7;j7!!8{Z}FXJiYh@Krr3mouBTXou|w5 zZ%jwb>qnx9g24)a`_1Vft{r=TY1mfB--91mT@kQq9+paz&Gia%y6>6yrdt~!sd9aK zL42z9WWF6{6qdl7?wICQv3=QXDC5yWm2EzJ4baE{$PY9HX8Qf~x z3T#%7w)bo>^r$4I64c-5mpyikaa8uW1Q_OY?BdV`K4d;P0bPqcma9uwpTtf86=0mM z%ivCXV||w+0Hi|=@Epj8gGHYH%d)$4T|j^l=C0M&c6Jg_6*`X=VzgHT0L_p{e4cM% z)Vo0uX5H(PUr(+NeqhbyHu;zxcI%PK^=+W)f$~0&@DIt^INs`VztI( z(6xc&*@3?o8U(AObPJwjl`&nlNY|LzCNE{9eNDA|7!%pVUV_GMEhcZ`D0U(5gaml9 zLC{nH{NMx-liiWk#=KCgUU4nECV|p=buRWn!m1V=4r?4EfILlQO=VQP8O!|V4cC=b zO)uRda;$-hnypvZubD58naF(4iJGiQS@*-sdP|tD$0Ayhv=(c|)Tn zoMz57mgsD{iN;9|DHB-396t7m(!%UKrmj9!;&(cjari^j_zMK=ROe45(OHsJ# z?=WhVYPTAbn1A06a{y>dXR=yxqMnvGd05l1Gs9Y~4>3DWl%kFyF7gyV-1P97hg(ZW zR$DtZy~R)cIDOZmfT^f!aFUWv(KBn0wA*2l#hvuVcEWxS1mE|)p~KG0Ai}(P0%-cp zyM&Qm3;sn_5-1Uw)^i%Q!V1wa-)}##%i#Q}_+1WVRbq)%{E5N#$)9cGxsPq8>AHz) ze`j;Nwzhn0`IDv9o65K9SxbTM#nqdZSQ4j-t)ZJ(OQKv{HM;aclN^#}Cny&`X$D#( zJ!xKJy&se^W<^czo8zlgg>|e4gfRy6l+RA7CAQouxz$cte6PL3(1br?mro5#=Y7RCXY-Q??;pG2$Q*mpq4*r@n089Wl(O^BVsgzHm+E=2yN?a(JS0G}l zt`v&>gMBo6SquCrHS3nztdF9etTZ-p#Wqj{#u{6>&uzfJI)6>@l3!F!O?7xcYia$W zDud%YzyX-S1DIig^(4$@>M5s<5}gke;;ojNL5KiX*jq0&HW-Me6Xn8+YpiDhv-yNN z{4~mhoq0R+V3;$H)!?+&RZFF`xyx~;sjCT|O{lr!uR8^RQlUYX)fu^GdH<+?dSpz`<89}J_p)#E(A9xxMuk@^}G#;h* z+LfN{M93lGbNHL;AxF`$O@|030~-N$8&S93ds3-c@te@eqA8ls#}qvBPOfh0acOz+ z|5?6p)u*c;SsgU>PanOq;l(){$|pZs@U!d}XJ==vpXn!=-8$#~T;_`zbG9tg?DkJ0_{89#_{NW14{rbDBYEYCge=AaO;ZZTSZ_tg`q-XZ2|}$FR~67|P8n zKDJ@hiq*E|Yiz8I7Bi}zDf!r@vJPLyt+KJZRv2vTPGzTh;&B+6z$EJV$3U5zh=NK4 zD~e$zmeWBYkJYp-wW$jZsdpVk9{Y(I?jVN|;CD6ZIkn7{{m5Z3yxe#pI$IZId{L(a z!8v?UfsHG$slT$8?6s}iV`JQ#VDQmjZrAc_q;oL*OWw1sgG`Wyb4P>0-ema4ff8Q8 z8H8P4x=vYZ*tch=LHH;G;6ApAN}03Qpvbi#M4C|Gr|1(UPXRm=^ zx#{|R;7jc3PKX;JzOIqH9kUQJoiP1e?L#Z%-gWm}xA^@h+W$yR;y0=vTvJx7U16$UW=nDg`?7+%Mnmggxc;AL!DBx~Jmny6E-W9z#PV z8T;{EvjQD*ibSQJg5e?Ib59@93lqL1fuf8FX8wcHcs#(Bm`EZ;b0$2S@(?|$g3fWm z!$_QH;e@3rg6A8uNc6@87k@W1tU-ypB7!RwDn!^Cq}VkhxEcxo)U_gZ!g}&6`eEr` zZt26)@_{}qtrR{iJ<<2W(lag}mX00pqxx3+U>tJq`Y~Sv+kb6%MeU!Z{>RJepUqMK zIY+%NNBu?)+JDWT1KAdl#pG3zr*XCa`bN&c_Ft_F(Ee-X0>e-AAvypl>M$bO3CxLqMu%1lOlc{ zeOS*<(X&(aY?z*n(z7Z(`-Gl6s3(BcBYHATPr~&iT2CI;lPC4;gL?KSdiD`LJ5A4q z>)B{M`>39M5=~jkJ=E7Uw_<13KMU;ul0|4|mb}{UhvnfnJ5=+`0EcRxqlao<7Y}l% z=3Q|=hiW#8Z}Cu#U3^=IYR-%QuNYY3_V_Iq^`Hk!ihMxC?c|0vP zm_O{vhlxSP_JBV%D?N?LWP*}s0dy*pp8P^=%8X!gQnrlYl?${ysLF^#odP{cR>!4Q z&c@Moz2HqWeBlv6Ho6yF>$fa&IZg?8P8gybwMs^gK;X|vke&vl%? z>=`sIV=zwnF<*DD1!&&%Gg(aSjFUVj-)U!@yoz?l$s)7{P4cLnak3bby)=w!PA@y- zkZAIl{ z+KVn<*llL|7q7UQnWpJpF6q3PY1@rpPBYV6cWJqwzXAzrqU|;_t)HXeJhYsbmXm2Y zKP@*-%T3gB0b1^1E%%6)lWVz1EvM3QPinatS}sw`C26@-EtdgBX}LLCZmyPFsO4VM za&Kt4Uu!v5%jvY-GA;MMmixVy(`&guX}Qm|+-faXqUFq5ZiANFqUE+}xt&^S-i7=dLS6&Ptf5VL{OE$)w{QJnmWzGs2Xb8OTZ6ihErLEbj)3mZp2+w6 z(Cu4?WplsJ=G=1n+P99)zR|vQ??!Dsx`5iZ#`bR&+E49UZ_0-Da?)(IBzs`{)-*>S z`_@8Pee7GW%yzYJ-47mE9-4kuznQJu>srhZ?ORju0qt8u>i+D(8_~zUwQF;RV&D4p zoBWA?m+zYPCozPdce z6ykhg%5&&Sq_2f*vIu1h6-dBl8iQL^aG_hla!bw+X6rhA?jW|VSA3H*G;`M_-{b%* zDsqjx(Tp^2h?*>-=AA*O?zttJlt3CKk{0z_;e5lNxqI?b+(z&b_Ho@BCKr z!}v$bFiy;F)lGzwyys(f50~ta%N8+hTAnh%g1X@0jNub{gCV~Fa*Cf!F zE+&EMZ_Omo^_!Ul8aKcp=}GjE^b>=b1WN7CBvAgXngrT>dnSRl{U9cRpcM~#uXbHy z%$||>yp=8~Dsk~Z9``oGVutQz(&fi4%n)3i@hr*k-om6(KlVYHJqel5!qVd<@13wf zTI_9Q1Uq4LHMGS05Yw~w8y!Oo-p7Ti(F(gtEw`%CPy{TrtZK9pL2TYO#+;l2Ya&>M z1qKBIB5HYXU`Qa;i-BM!lnGQTgcOA{1p>i=3`4wq8ki4xn98_}5FV&9E^`~7+Zl(U zOu%}yPa9wz<`WTMo*ADMk5;Rh8L?@xOe!wYfMe29$zwiG1n`E4UiL`{=w%8h+{GA> zDhc*ji2+`uMFj$p0ZC{t-cue5RHei}%bQ||PYt0)fp<#JU*hP4Wx>P-GMlfDuU-<$v!`j%1Z zLdBH0@O)Hti{pO=+J8WPhxK}5(o8g?Kyti>d&bVNh69R9RjD!>4OUR9#ilWnqoHi_ zD=%OAGXU<)3*OlO=rvyO5}!itgnSULqLx6=KnOJkqJD^!cujWM(0`k3@S5uRg+d-F zCtJPHRMRQ1LA(MyAi6`Z0BX@Kcm>E64eS-*9npYZ0sbf&$Sc4`(STk74u}Ty3UF35 zkXL}=;=W!1de0Kh8O8%<7|qhN`EAa1L(dwlTkD&~YklhZ^IbC`kg)W++4|!1v&C&1 z?&G;!$y{#7T<*wR&OVoO%jNFNm+^3686xV>tx9ig8$!oJHMdNP=3AZ z>LthN^0(f3_x(@5xla1O?%v%GLN0Y)y(W>$d%{y;MDuJG5A!FPqvN$y}*c)WD*U11t#Gk)K&|jU zq^K3s zajiiy@?C&=a5Xh$Nfvsq0D^?esh!YLWdv0FwfCxk8<17Ga9Co-LsrUBXv0#Kmg*}cDps7%O}xg96~A>!^+ zPNViEWNuI3qel8v2fVFvHkAbW91Q4bE)XKa=hO{Yt1|$J1iYy;F_cMrOFip_X$grl z6PS!?nSmtBr#av~Y9N{=OMI>dm{a0mZAZC=%7JHLIhc}3j6QCG=Aaj5rK@3q8PCMW zrY6RxP$Ok@Etr@F3U)Br=rcTUo$6g66RO1_KxI&n}e7E|8yvBU{3b3 z2%aGq41H(H1^eC^3c;5{CLd5JTupvo_xgzRSP@T6=0h>6r&9!H4&jxhLi=S#RCB!>{U#xwJ|7maxmdUwWK80D&LM9AD@bvpa>p3Otm~U znS3L1kgsCVN1Hq(3~y+;Fa)h1s=f$=(YQl|R;Uk(nmu|vBal{6yT_&sc}TPh?v)B^ zK^uTT{l5zFijXi&PzVWK#O>w5bc7%EbrLf= zg#r@7n%=+r|V5|`17B>XhV z2ro1BDiE3qSS0t43;K{Dk4mIo&Pp>SW4-uFs}g%v8y;4fNd8m8c=0v&s+Xp%luYr8 zvnEy@2uj=)9bDbZ3(Cim2m!5ak{CcMAwB7tOlC%6?95q7f+=d4A5abCF|taY@N%Kb zDM^A8!GDC2tCE!dQH+WJG{#F`6i}?{O`NDmNS!Rr5fFJsns;+V_->jlebW__Txq@w zCQGF&1WYP>V-gbubrnljdG*^(G0~8^PFf^jQYF3Gjmb>(D!?RXro=v*ID;WarNc!o zGO$VNE9$9zm~6bLUpgqll-N|+WKqA>E5c$Rd8%xxh_63FrV*hgxKYCEud@Jw*qQN6 z7?~}rkQDO$7!^T9_d?ljNgVHahFSrSCR*8kNm(5Eo$Rm#k?D;|A}N=hmZVVsnNB29 zc#klESqkt9eG}ZlAa3Xm1~kF%pq98wg{maZs@x70l4eP2b@ALuvY7`u5TEcl!3x^pE-W z(ezt=`)K-|zP&Vk>Bt*2{ijCWj;5b9vPaXOH*!Et|NW6e(e#T(_R;irjU1w;-#PN; znmz~=cn9qmf@tVn;x{>P>GQm0HcTWNIp)4e&ZqluvA5sY@%KBQ9wQ_^ zqsC2m!1?@t4u9{uqpSa)ieqy7`KfrIp9=5kSUxtzJ&vbo%rx!mcw z8fQC(x?g|e`(XR?gS`*7KR?*}t?l36>0s##ANx=c{RJ+VO!k`^=<xg-2)v4;n#1BPnPk1+5&tThVg)56fhcFfdo~=kn5vA0zm8vY&tyQAxA(t1(Z`bIR&F>d`_YqV?Z!k z2JIYt&E*8XP#uT9*c?VO(dn4~)ir6{w4yFh-!ZrHaeDBW0X|MwjNv~{pE0J-$LYyq zdOl8HGUk>(PXA=gO+HTlYE1thrD;qpZ>4jGj~k$Ky~pvL8!)a<=Z22!>D(8`-BRcNYTQjacjdVLJNLiG zVdrifH%RC18P`wec8$BmlLwLh^@C-}7<*fX6J8qoLmW=Hcm2z+d*lD^9{;y9xF7Yu zH@JT+*S-F~yRTi$=7z@l^JloSR(nTXeXF6h;j*Ej<-&$m``Sw!yww@b+8g+{vNQG$ z$io>r>V%}awuZBH=f20B=Q`>PCxv%(OLd^JgSu>KscYpu%TnKaymKesUhFz7sfi!BX}=tI)5 zx#b-1Vx^8L!pI_8{WqMUzVV-ivNn4MMjAG^*&U5*87S#8@7Iwte0SDiz_bSYS&r+@ zh=qS^Z?(5$DQhnqHlK58B28du<0(?M=2jYoXsuz6pl_~52lePi9b4L)ns{g$MX3Ve zV{55XPTp;c5ZTap36qYl72KhsOSF!bb^x;59qYJed;1j(an1@Unx7S;Z$vXTs=Y(- zLPZgD)OB<;wzqMHM##CEr<@7f@;9cbwZ*~IwYE|hn;dp+cYhi-e<`?R zz1o59A?@eesjpo0aMRe*evT)JYhLuhX{MyvW53YIw6~mT?pVhlodjQ&&AcmEtR1~g zqURsKZPf z3ppUQ&>H9v-otEF6VES{WzIEIgXw}JFZi>cZ$)=TZH-MWygx30z+OcUVTe#qU(sIt z4*l>n*fF(^`Kp9^okT}Vn5(e?y05MQu{pz2iMDhdv)A5%esF~%om|j%p8C|IMW3zv z9{ox>xd!<4Tk4Y&@-|*_pvP1656h2)p6-MGJl9G&0;z;fn9pGy%`HePzAHZ~-pKQe zfRHn-zO9iCmJP@SXY9OFOLPy5ZbUbBH1oMy+Mrh%b2o7z4|P_D#O3-99p)?MyrTi# zrwu%CFc&AV^TzeGbYQT?4vxphRp20MTbcD=GUv~ohhDq9mNEa0K_ADLnGMwSCSMot za=4+TsmVzp3{&!)Yy8##t%pGUw-DXf3gQ4uEyEm43A$RvC?LnT=M2ql_I7(~D@|`{ zVph{UTbNQ4vu+)fT-V?%;u4>Sp>;A}2&Fj1o3nCTGl*Kr+#vXMtm|mz3>7syw(a6LCox=`gq`t~OJ0sI1a5|t)bT1xi!vH2DG{m> z1Q{jR#b)$mwVGyN{=5|^%Ng21=0H~-Zfx&p0j@6r;oQ=OE`hP(>p1kLjPhFOSE08k zQbLVpJea+xQVM=np=p!BS%D6D460#xbq@UH-zgSEI=IMW>zOY6VD{4+&5uj;9zUSAMA;LnrKi!+&8UHqjf4rfPEt_6gcy#_@`&3#5?ht5ud`OCdVex1NDhX_@jUP3?`Et5&w@{ z-*KZL7sbW2maxc(UL!y*)H71Dk;3umu8`9t75$7HC)|^g4mUHR!;fL|f~2dT`sL); z5-)fDsAWu*aE7P5t=$aj)XFzGGP2*=@}&)Yb7{IOWRbM( zCRpx}G9G3Z;W>@rKlz|RY8Qdnq*LgD*T~*DMas!_X#_p;8ri$-NN3^q$r31}BJ74^ zVMHZM;SbBoZ;+u*4o{Wk^jB#((aQ4rt24$~=dWZNBrM6tLu7FY@o~?P<+2LN@)>GU zCfhA33rt8>&q`wg>w_}n!IgNgRM10Tfguo=DGv_Bk46I@C3UjHk}^nF&|HdMxfGBq zH1r9~Hs1R*6pAeScp(3yMIe)!mchTo1Xnf;ZFSA-C>LCog65vJ_803nFzf%ip?gJm zVJIuY3xlo*oof7GE5f29bZ-w9kS$m2Z5@b{%i<7M1XNFKuDgIb69Aw~?+$e9O?BK7 zs&C>NgV$QoLGt>qOHd`G`)N& ztz=skDMfLVIC1W>b3wU4nx+WaNu0>aVa2u_D-MwSeZ`vRn4@LAAV5|Jo}ytrGQh7>-1~SJ9+y6W#}E1RK2Na0JAl z0-MNrpxCVR4y4vO>8%rc0}y`}T)A7w&N7Fi z%Ug!50LU4~Y?+1z%Xf*C@GR(FQe``<2F@IZSB~PB7 z`WF(@(MxlTqsDUoeguSZWNE1<+=sJAo~}wyx)axqu+(+p*u*|;9eIw*oft3o2#I6I zs})i?U;|GbW7ZM)!apUx@YM0AJ~#E%C%y%Yqk5KE#Z#X~HuKb}6O#2=$@v*zC%^cW zFYv?3r>6eqiS)4v8WX%+>}y|tX6o;sc=GWFo&)z&cof4C4o5jW#^G@eKfvJ$4nN4@ zV;p{n!;>6-n8S~7_&A3jTI4<-LPKNzHTXBu)SWwbkQ2OS84L)g54WmDPB~tTPL}g(mG> z__|TuAJG)2)NSDEkVyz$0`W%mhFcypSt)M7EEXxT*RjX~%v%C^V&ts`17Ol%=XD?h z?7)!Uj`-K9LAXllg|vd)AhP7Z^n?LOI=1Tqqql<+9vRycZKT`s0xw1p0rp_A4w0=C z84f?#$V|4Q;aA`YoQP9_ealSXnlcM*as9M*ZkTu(?4Fqiz1Rv_0)#Bk3YJ3y2Jj_2 zcBI}uyT&XCS1AQa3Sws$U_Fr$$&dlUUmHz@0isTfOkjIQ4lo;eB_neW!{Fg8fJ-@B zv&-VQw=gkDW|)O8faGn6`N+`SC!lHG!VTHUhBzx`m5|v54p?Qt3Nz*y^9KZyhA+kT z4sg&;Y6n|=6l+p8_Rb$%9E;wBk}Ui=Lpkmy!Kdj$BZ@rd$`#b0T$McXM=>`xmzU7ctHZIlcYBh z*#v+kkTPDVo}GwFBF1;jVX{WzrcFW`)Dm!`u*AjyLXsYL2pif78w8vN5)sw)k-(H^ zQM#GHTW$g-2#^Md1;U30N26*CBMm+36i6Mk&_gn?GyJg$kaWYchNaMD;LuC1J>_~t zekGDuXPpU6fGz$6RD_aoyp%VQ%saZff#}=)M4FQGYC{^g9v1~9Yiw*5dH)^46y6%XbQRc$zS=^gSLqGb@+gr ze;$Mnc=%55kGZ$<55j}+ARHV(r2PdBzsTX2IP56{a(IZt!yG=u;lmt0!r>7PALa1q zqogTp`pJ}zAl#k~9JsTahy&#!hX;r{xuC&|!F_tjR0V35WCxV+ijh5tmWeqrjKS`xGViK=z_ z^vS6^V%W!l(%X`q`6Sg9KlTq3%=D+9p87ah{U^im^wU)KsmEV_m_VTl7lUWS?7vGT z`R8KyAH$F1$9PQt^!Wc&%jwzp5Ap{nl{;1`_drMZ-h@mgcl{`0K{rJGNJ(>1TXn)H zD+?|lg~%BhR1U;;l5X%DgG~9Qgxcx=4T~Vch2)p+IqWYg3K!C0_z4OqwNTVtkpvu9+Z<0LU~W~96l6`W|&TtZRO zVJ$JR*V({Frvu7uQ3-Caq*BB3fMs@<)DQkvfYLma6NB-dJ?#0rddNxCIVXYvH!f3iQyJj=c!h{ItSjnWZvj56dvQSn5ipX1P+z@U0}ST>URUz zi*c(R&oFy6aQZ{nb5VPL<Al{4%c$Qa>md;Kti8psLb4G&#e8rI^WYd8qh zP{r-*m#&{frsK_9mp87g-MWp+YO@aGiu$(WRh0M+4H?^w`XQ?9T~FLY$esZ^5i$oi zfbmG_d=Hs6NJFo!Y{_u*_=(S)eEQVy{r(?(@wq?z(wD#T{8#_zYcKrq*Z<@%_n?#S zyYSE+;h=Kwm(b`A0|zauVj^IRLkbk6N66*}(J&<(vt!_IfsQ3}z(L-!x4ndz=`@99 zmqdV^3-@Hzvju;(Iw$TBs1?Vxmh0_?w-4@5NdjyENEY>J>1%MCLS1C7H`0PHcJEGqy0VqOp z4U1qf@LV7I-_KAYcf*?A5NfN80P`$}QxEJdPc<53VIL+Q_8*3!ydWHI^$jb(H+bd#FJk51o@_z^H6sOkERG71dr(MA`U3YY~F%G#E(?u^O;8a(#$M|_** zPfcUp?T7he3m$uZ{@6CwM~S_iKX;7vto*!atPgOh=Lt)-RY*7seG(tlgb_k!e;qqp zco&U$5b>*W2j5}0T;E^R#E)#+fl;%I5%gk12jglw^ih9Qd(9?YmuxU zd5&-Q8|djGB=x+BZUiZ;Jk-Y|h=z6$gc&;$kgEXYp6&WEER+oJXww5!hpgrZy^e9A zEOyMM0=j}rF;T-H0U6hG=N5AA651-X6zFMPVPg-?q3+_w_Yp6~nC&rMUEGu2OgwU) z_G0v6(kC>+uFAJPoU8nh;}KbKLv%7ie_BAKWpbEdk%>n-VRf>$ zV#c&YeN|aNt3uAuh1zin=OW61inPqg9|>CdvgIYJSLklmUbabO{ciBcBF}S0595sb zyCI0nw$S*QIx!<6&je5D)y8xWpkot}3ABrNY4t5Itt_0mfNg-h_Ll7jbbh;NwAZ#GHRAH3*1EKSBjS)BOliAB6973$UFXaClvDe5MG}lgTa)T;m=-crYiZgg*0@x4&^+E-G}`cj{=?}X7z@p^hp_@-H9W7D86YbeJV!fhjB2yrDW5^hqgTQ@S&q* z|HX$zrMFlm`fJ5XYkaw+SnH18mldnq@%swX=V5@Z#&voa2EIFD#+tgOlAheI#nzu8 zk@A@p)1=c_3G%=>(D8Q@L?3bofR zzg;uOfN88-`phys+wkndbGK_iO=FocBNot^F(Vd$ z%+Qm!uixZDme`G=S%uLl}>HqVa548Cm%GU1DFej7Fej+WeWz=gijkj%XL_)Fevyq)MUW|a!a}k zNu5O{qFUGhP>EqbR7-|d4FEyD9HeokUTh+NjJj&-`@pkft5L*0SXo`=wg2+Ez^0vaAm9m+ro)O>@z-P0wmti;G0is1TVg<-SJ zOOTF0(7}ZiPk`W+q97srt|vq-ioI<=93~*HH5+te0g*FZZ9kmmN+CNPra;v$o(s28 zW68W3&1JJqv7;l;FnwPvqNFZ1m&(y#-i~pi4Y;-l*l7VKwam6)N+r#d+N){iVueI8 zkEn6I9IPCxi`X=qIsWR{!kA+!$2Lbp_q9zeOU(OD5;wg9gdR9PdP6lsrcP1qNI9ew;Vaus({B5m|5k}v;=1OO=1h9q_!lsIZ7%& zb##PbeT!{iRpi4!xErA(+lemddQa2?!93_>XTpcA9zk5ZLRL|;` zqu{k!i2}1`2|P^*l3IioMoDc+Y;H@v3yQ9Q`416YpER5gDsPFqMs?V*pn_b_2GAo2R$1`rC>HgRuH;~`lb5@LiVF+nVB_=U+5ck>1* zcVJqGRj^ZSlSu8mJR1ZQ?54huDp#;Di$Xxp`(mqazHx&Xf7BlFRpSO9C=KDITzmzv zEM1yKDjBgR#v!yK;vtl)AdQ-BoAaGBExw;>)RFdQ+twW3Hq>rw>ALF^;}W7fE*g#d zo-i(xZ7INi{qHUVT5Xk}G_X^^(UNt#q-&zgXp2eGT1b~q4WrtHJGU?2+PHD~Ch~J^ z?x>t`);9~8eDyE+4>y&vOgS=H2Pu<=VbmIp|6}7gwu#IuIcLJauF9oRq?FIQLznd6 z^y%}QFar@x!ZiU46fDF@06J^+XG=AxGYDeUP}kVM)}cOVH4KN!M*B{yScNO*Z`1M!uw6r!d&0Bc>_x z22q-+fj0=_j8=3241MC*u`7#|jw!3zH^_gAX-Iy-(xqF3>|(fOiCQFY6!B=F5TdxZ7 zhb)(col2aS)68bi5M2eCk4iT$X^nGMyvcn)(anbK&qO+4ZJ}Zprma+z9iP$mNd~O4 zSF_l1MYVzDa$@g@9}12{G4b@1!a&JH>a`o!Z(Re*HB8YW4A8jOsC;D>HbTR1Slw>UPmLyLso&yBd7wG_AEfnQ!l=Z7ws|xDiEX5 z?H#v`*4#PdG)Cu}iybu!Rh_rssej(G=IZdaVOi&`b{%%nyNbF^cGgmLWcYj=Yl1qR zQN`qn7V%v}#y<8AXJwVFg_(6^RErJx=RjCvh&yg5lTH=T*$`QxH&dQRw{Q4~B!1+g-EMA+;b>)grjI&Nofi zaPT(EjJUE!;}uw0z{L@s4%x#*rlw6rn(gyYOzCGKWO#mtZl@qe7UFA&eAjN>UaQTREp)e6gAjH*=wDmPJW;{ZOrQo z-E2*Em_^w2E43HB8LQnItDTO$RBN|%?N(8H92hw?8k3+g$ZM@ENrugP1dZnR6dJ9` z&^R+9Xk;218R5oAY9;T|)&FPjS)kjhj=aj(vK?Et!>>!M7ljbJ2xG~Ak+M;2ITleQ zA<1CFvS>@%1-geVhi(t0+dU*c0RmP^N*A`f?XHg(wlR(!OSba^hp;h=6FxBk3f+Ym z$DdefYzx~EtL2>T%)R&hB>9s7g#tP!@q2IP{^riy&)hpRc&C?*ThD(IMu}cHX*%X6 zP4vP^(>Vj9BqGhINE$VxOrJNSd;)6h{Y+TCt1?^%JKix?o21K3t5R zIz7}tU(j9~FB;+k5buZ6+v@CAdq6~=H-k@$;xPg>JUc`y%PdR9wI^M(3`~zsvs%zP ziEnfsYs1wGx|^L6+TwUY-S0FxO^uXqi-}4V5HtR?$E5vAR+Eblhz+Ip#bpXK%dL*6 zS{+feTCoaE$fEywC@}&f1MF>Sb~BM75<`YhW$-+pkcog?d_dx=*`}8P#q=WcEv)V& zre(`4&a|USrXA(ki{CF~lKMOuHTWlD)L>geMh$*J7&Q?YJ_|+-1`{%BFd%c%EHnSW z95a7{0d`tBz)nlN%G!1wBWW~-L8FNoG^%3I=qF;(C?!oO5ral&V$chpw1c4-2Ia-i z$e>Y~K~=4eL_b{yotX@g=u8ZH;j4>adklk$WRTfsmi5Fb?oRM1kJ7`U}jB}OYjvBR@u^9Qnqjv z#BQdhXSqXZxa5`>2Am>HO)?s8I5>z(4;G<;s#yl{@N5_GdebuMz!k_Joy{s?|W9KOdZKZbqm?e=1mvSE=w&n=d|aVb4&KLDilwBJ5<}QvIM#3s)kU2zlVbZDWj#C2zXuudA8{n>VFbDC&Y^=ns{iqB^ z8@S!({27cLjSPJNLw0yrnC|L|qB3lXT};M!IfG&mEIg82gu*e?3?JliB!>575>cpF z=PCY`)@Lpb2s##whSwJT>jZ#>itvuiUgEz}(vyKpiQrqQSA@%!2S2@#uJ+?k}#)_ANmURn9H z8IOPHtSnwwV7K(;X3}F==^8$MZVm8xoDqAHSwnLcm}GX)T!W-Igr?n=AQ})%j5Ne^ zNIIKV;<7XKBjaP};GEXw9fdOifd#jUP7Up$xB2OaBdtx4Pbn^%Be6oIMaice)|(P! zV0`q#<9ag=Zlb$cZe~#O3?>TblK*yeEo^JTJCwA69wDl+V-Fx?)n{T_h+P$&Ty0*l8b{jO* zuYh@MvKh$zNy|xN830QFh^`LS*BZzZNtcmElL@{Si%Enk*G*PWg@GJR$_7{w!!CEZ zYd!W2RX)K~R#IjZ1gqQau)*g|?rNXSgW(7B3}h;46=^gVSe__@RBn&W>lHjUT1lS^ zaGgH8v)Y!ImuI+^Bx`fXAr`{&_2Z{=Oa-~!h56)4tvgZctsa||Y|w6o%*_B5Ho0zu zva3B_mj`p+WUr`j*vLKF`^ZiJdu=|U3hD}FdtHudpWWpYHh8S=DtoyXl2+KrFSPZ< z+WUVw7_Pgd43fC*Y9M(3F^$ZUk%ZqqItr~4e+d=HBdvhpa zVQ!CE#`OAZZozB6*+#~-hoEWD0Fs>CLs%an)NOZefW8n6*VU^Omm>Hri^j#a^GweH~Eo+sW^eEj7LQFPKY8U$U>p#$$oLDvzrg2v8&3XmwQE zyyT(e2-)HVJQJXpnUjB`Q0Z}P0vxNeLa4dQMD`>v()_I8m={ng?H(_S#VM?JSj#sW z1t;agD!b1{`jao!gaiyF$}q&zM0#KaU2eC_3&_xRp!dhgM$O|jJzit}3s&R$7trf{ z%~3CnP;gO7v8Lrz&QViwL1|%buc@f0yTAlLlAW?nv(;;?A(bgU&6ZlMdr_h`){1TX zUdkPs8QNG&+gJ;2d_3hJ=hem+Qyx3dHol+ol;&}0nX$IVOIt}JFdVHt>Lt;X*2HaG zkh&k+SW8x=zM|RUwpM#>y(Va9e!gWZeS>ON*c{ecVoiNt(`+)M(9=p;p|Up#ZmSO} z<0OBR`p}OKK=$UcQuVk{WxpC2h}5M%OyLE^49?|iW`Kc z6qByh`-VgIO2J{Rc9vJ!Di{qbY@0yRY|d(7}OsT%{$da9ii z)j&?B)(>yDJU|9hZ#&aY&ZYX#gzQec&u(>~gjT!B!e!q%!(-Hvyk&Qt!A$ZkK&X=9 z(%jdN59b)ZYsh^KU(48Qg(0^)NH#9}!I{tubtAVg`zM-@$#S5CHWvPr8S}}V%N{-x zoNE~V9Dh$~hOiM{`O6RaU#))SMT^P6nq}!^0ZCo6+U|rNlhHojPZpD_mJ*#_pSg;x z)Ffr-m#5yUxwz8n&a1FWXiNSBrr4J?h^8ZCfVg$~MH#nha?0(V@@j|GBj(nsSwucq zOfvLYX*9Qs^x2SGuE$pH^ST{YA4l7*Sx6pR2x!^qywI!DZ`G_WuU>C2SJZ7gNhaUY zk>&cUS#HbqX5FotD}B{Yr_CXwjgp1r+yX#blfetUEE&*H@T8gnT2PZj{vj0#U8&=_ zU6KNIL$tgKdu1g@dlPbN#JXL>>Xxa`ghJO)mUq-jxjhJII~S5veO4yVZFwd%p~_Qf zbt;-b7Az(gErGhFrf{?jDD)aSRp!yDHP7X-e_RW6yGvZuQGygMi$Mc{{rFMMVp6gM z3SE-H=~e(}qF?P3%=a71Cj5Ie z{-Cy1T(v=UL%4xcM9hO!i5+-Ox9#EjELI(6wTMvMpFN`puh*h*6(Z_N#f{t^#l}rx z*@rr)Q?i{C_gP1&awKv$q=qo>hEZkW2houWY+PYn%?DcZ@h=D`gm zCne*`cc#`6-f2UX0(Dw)4s{Nv$C)-$+99H!gx&n&wWwg@E)=GiYf{lA0q*xjYnw^t z2$&uZc8E4|P+owAc^yH0Aljf&)ipJIM91aqhA-c!1BD}JKg13>$L$->QD;zMILFBd z`ecQN$asYLoE`n}>{K{HHPAfl$8a1QF|U`@J7;)|8Hr8uhKTWCpXuQS@(ohu<8yypkEzuJzG>^u5oSdT9_9W9yJmX=`XQ^*8 zZW4QLWSpKd0(nQcT9w{BRK)Y-K|G`aIlqfRL0G*24qZ1j6{WpC&b{x%){&X!QZE+x z2X#>W=<^FW1}(~H!Q(u1y_mLTaC|g8*3XX~i=V<%N*}Znr`1Ry_DO-%4$08# zh{73de~e$&&cJ&EA5QeC(Dp(`LlJZ>DSM^m8pYFn%>C1|3e6!^d7^nV)`pF(+=mlt zXA`OQ2DnuzH~eg-HwJ)-2kH30eL9OOW$aYy+emchOvkVBiGTtELloE1^#O#|s2M%} z_OQiazA4uda$7gp1d|aqH8r*hvNA0xHAwQ)8qyC~JsXS#milrRxjyZgbSeIm6t)TD zIaQ~1q;Ijq8n~1^kaj42z13^0>9rp-6=K{cBYnjb?5W32gFV^FBWXS9^_3pWR??KV zNJj%jsp3l&!kY0$o5x4~CoN4!!$qm0MHS~;AT>FicBw8waH=9mOv7oB#pwo`x>y}- zs)!}eNjK8u#c@T$64gpKc((Lnnn8&IMJj${`a0d8YgGGKce3(L5|P6LOj#*uCc1jdf zn3slF{3MuLWq($Rv!fA=K#jgn`3SF)Iy5AsG!VkAFmK>Fu?S*S={q+uf~Nh=qH0}y z55*c-v7knBuqEmXDDIrFL!u2mUx_;_>|kd-2gk;7rlEG|3e9bEkmZ4+X8-AaaYT_u zBxot~<;-V`37mYyv4TP-hLB)UbPopA4^NIL?Pw>(?D*gb*)fCl5q>1WE5{~71dD-% z#Jpo#Gckn5*=nYO;cP659`4X4iFMuJc!1lo?igayQaumGO7f+G|*m@zC7oP#BT5=%%8pOB;?rtNHY zOW1baopRgZ1GGIQX*1bw`IY5K;!V1nIIrk6R9d}0gXN$hr!p6w1eZt1@#b!_Ivjr~ z7_POT;_M((p7k2MhS%`Vy@qZ~=tU$0xi{%P!uQq|+?KC*xU8^QM%_W4!FdG;ozNC*JiRanmDluQFv{}U-jXshu3e{b z+j|T0OodPdb8%5Yk;Mle-1cK;@(1np8eT5ZCHpj6DmH(2t{LLX{rifm{|T@qaK}sV z@8yExd{W3G!Iszbc#fUSsmP`5SzZfoefWlKYDvCBvz7dLE_c5E#r))}0DI-feX3=R z^m)JhctCm#$~O;!^38*weDfeE-#iG)HxJOm9A2`RtA1bqKHFa%OhrZk{>v-EKd}2V zvH$YPH9G$a0Gsix0RJl_*Xi0;)Rh#&tJxBAkQ;OdSBM$#M7Qa>@skNZnaSO{<=J&5 zCB`CSp(V75Jf_ReR^Vfq`FX`9iZXZUaByh3od|y_v!9~j7p7#FsFx{`r`XDx6OZ^rd{ z1<7KwfiL8H89qHDn^=3JPzZIqKjSIL3AT{1&kWr_S~6Po2`Z9TP{7+mDI@)b@8o#K zetmo$q2G!SuNcU5G9yW-D>XwIMV63ld`OjAq8jUo5(F$OAHCh5}6u$>)tG#K~ZWxBVqyBn&mgtm6o#B){uYA zx+_seWLMS?4022NWpzWMGS<>s@|&#J42t^7GQ_A9&U(k7U=++?IxA;YU0FWM;AWy* zZeB%8m1XrCYFS-7r>y#Bkk#AOvijp0WOYZpto}+ZtDU;Uvihnnv8=wUQ_1Qdb#uz< zB{RtCm1bzt$cQzRTZv?6eBp}#Thy@yvsmK@VfJC2_0`mYsLT~Ds4asmr(w=X{45s^en6kgj*=>Hh|ra)FrAag|@t>m94<|2cl)z()?K z|22AHA36F$BuhAvElgyymrI4dY{zB(mfz_EOZ+Wo^?{}SmQj5m$q$u7yvzL(>ZqeH z8?xG=_17o+11Wxg>k|KNKu_}T_?^BUl8);Aty=%?WPeMFf5#Gk{Zc>V` zOB304EmZ33`Twgu|Ns5>@0n|h@TLBJ)$e~MxLcw61?G-gC3NFu4uzYvVRi`K*4i%2 zFYXl$)7aSi)|-uZ#vEpGxbO@KJ~MM_70)A*=&)43G8oPn?c}buthJ z!-xg#6+t6$pnVJ!ZHt5K=ZS*x`5h2J@%aVYc!t4vP>_Kpc$8QbEQBq4V`z$oUWy0r zWzgRK(?jt4DgON)?lpItH93j2<-u}e0tIvkAPGWk7eVTB_u-GC8T%+nm<34jE8nez<3tu z+$#bTuukWG2^gPpZ`;=zzc18JweGuWwsoIHz3%hRYu)#g+17pa>UH0)S=N33&)&6w zw^3c`YsU~tex1C~>3u@H-seoI z_uY_0@B2}_-nS-+-nTwZ?;D8M`*u&P_Z=Fq_nnN_`xHgzjVaG7{hLMO#+JIG__5`6 zX^$;uwS}()@~=f@n&?|m5+L^!4L2+k1g+e%H{{g zzvRB+M}S|c^)Bh8oWZiy8K$?@XnM5svUu-ahKh)^AR6%aI-9b9P1 zC&gPuA4cIv1_@I#EK*}FDU5sNc-$M#!@d7PaR1?W+?Sn)`!i|a{&EuB_a(snXad~N z#NnQo824Ezala-L-0#c)_u&i0{cuX$PsHM07R9}{E+~ke(Bb5^FQaj`FJZH+sEtX~ z0wrPr6CWXLID{+T>5$;}gUohZ1@8@8o_M`s`=RijR}phg%r)XhelQZ^-I&yhJ7RVn zUGI-+sOJMn6!EixtH965%l@e^$*4p4|2a$d-v0zQ+dm|`0q|0P--k}2XOffe9if{* zA3F73c*SmWVO;M+g*j%!O6WUEvFF7Z|PAbEV z7`8(7#*`bi9gSOBfAqbGE55`F;*Xs8@G!N#9tiIdN^26ea*g5Dn(@5acpk4h)8N$` zlJM$J6Y%N-33&DKI9`3RC?T)zFG|I$Q#0XJT?V{*!6Lfz~B*mh@Dll zcMo88RBa6agzaQ{>9ZY6#UV1c)Zc;YARodE#sF2%Ham?SjM-y#IW-YWIN~nd-T^p= z-d7uHfei3c+XC2qzx0(3yxXhOVi7Hxc5#!?%4vRZva=)e(EtZhU@|u>Y%d+P_ zVDtnn?x2n{_604Lp!OA`Ctz_065J=j-F5-EJ1FkUGR1u*#r-~t`!h*!e?1-C4<^7p zJ0(HIcOBE>%vAKWyJz>h$-E0z+;6p~CdA@-N>vrnzl$_bk^Vh=B`cW(*m z#NL?e9w8=t?3x@=tRj*pu4QH8|M0>Be1c2$@quAMx7k6TvSf{F zTF$`B<%X2GbYlWyD4 z$1E^*8B8X##FCqH_fH*y9>FR(yXn9Hqc~i%x(!Z_Zt>7*g@Hn6k8!@)=B$U;JgU|; zX;>%Cm6dO1vE<&|cW5^9<{E~vO*J4dmTb#?mp+~C>^2z99ZZ+a+U;bFcAMP+rNs0= zEIE?<(bV6}@8p1~Y4;5rE{^T9;Pc2^J)m4aoBQe1fz|RuUJDNw!1#iw^0E~^xVj|& zC%yci)E&U>KV7~uRh*0Y`0J7X4}<*Qf|7_Ap&Qsbk@$Z*J@NmiWa2+3PW-FW5dSxQ zIpW_tq4<9>eer)dZSntULh-K*i+}#hU;lU4#OwdY2p|^x`=ECK)YpPYhoKvJMiC(X zg*~{DmCNjOk&xmI0xvND@6+h^L#k8CrTI0y`w2&=4upgkcu%tUm`8QJm> zRS-AnVR$)5$!AkKC4Z;%WG|c9%5yWdJclP8&$aO!{LXCQIf(i_v=Ja@dYrg1*9?P;_?0`e2X;VV5LuK94Jt$7Am~xs^Z#QWdvf3p4k_Q7tx zhS^@T`Qw`BMr%$ghOqB~qC;mG%e%1hinl?7Tc0 zpbf_mY4|&Wu8nKcb9$bv$om?NpbMvv#q)zLxbX&u`$P&&0)#a|SW_E@HEZRd2em>A zjRTSr0?4oPN)+-;hfTy0NMryak3Zz$hdla#CrimYd5i*O8SVJOJKH7c{Qi`8r2=ZW zpbphyxM&)oy&uVMQf$)V$2CR%i@CT{+@xL28iBv!eE8c_!N2^=g8%u<;6IQ){AUuw z|3zK|{>$=T$X!ATfe8GlSdohS-{x)+Xg|s3zfLJbonKi0JXw%Gt=@06m_Z@wH9MSE zyTmb)y_*4j(B`_5a%{!Es4C5UsR9VAktg>{w>YJ4JC2k0?VQ zF7pDjJPd6AGXYgkylc{v9#s>>(TW2Hnt_`^<&9pofn?A&gPMtP z$u+8@QkfeoHywDE)2TlA(!Z{1wl;yB|7jz(Mm^NcPqjpFFF{5 zao6LDs%$#q65~c&I~06&go>KEW^rJLo^I?F6Gl!e#B93fD&!Ot!W*yRwKgsu9W;T^ zFQUUXJvS3*n+c!bR=yK>(jkx9v{9QBUDT8_VjqXE!7$_!L0>w);)fCUdUnd+)lgYr zJ@kW&hBOpZ)Psft3ZSk@^qUPtD5$O9Oe_Vn>hAcHi+H~jfvmX1OuqF zZf!_4ID4{|{BQ>KV8B3(X=>Grs)ph2CE&%2$ zCUOCA-9#<`ZcpR_;Nb~e0Bl!O!ZRJs?lJl`lIp@?U0K75zaS?v_YzQ{OxsHUpU_Ky zZ2~U=i&J?CSf{)Vzhb82CSW*CHvvb}a}$uKO6Dfu?p5BQR5WriACr9gi^RBzC{ab+ zLcDh)Rg|E0>w8c4^7f-*N#KM{4gT-HDmM-daW8FIEuI_ zO-B(ArsF8$rQ9E<_m(Fz_7stu_awY!VpkEhc}ZMF%#65-kW#sdxN$;P5vx+TirAde zRm4z?tB7M6xr)fjPvR;GFsLCJbBtjkIB*LAplZa*>=hknT$Wg?qB#t81P)8BZ z=Z_rs(+NR&meB%a!7+3W&DqoGaFRg&?&ITTY0u{W{&@T>ZL=oCQojxfCTW{BgfBQu zbIHs`Q%`L)+o_GFGl`AnZRyx(u1a8|xw#~jjpo)8*+%n7Nd`8WeBE;LBZFfxpJkd8&aWDlEIh-Gl>8|5ogvTwg!*wlrqpVSKxj`no@D)TCz8o1XYm)xW2o*n~b^^c4oPQjy zIU{G(Xh>OkhqOgYQHQiHcfgId>^|e(J;I0_040(3a*HH$G0hhK1JHJ~AoveJqYy*6 zLt091D*s!_=W_4SLU%dDy6iCSlObiSPKI^4Sq|RF&U9MmAxuw~e-~o+*6jgW-3=Mx znI@w#L>%6@=CBZfrHulY(E5X9fBDVQ5Dmo$RwF76_=p99G?_in!&)6Q$jyRU?=jn) zEcvW_xfD01b^wi=<>3f)3ywZ=Ma8|6B~96Kby=pe<<_#P$!P1LRJ8SKrnL2DENy*~ znzqWzQ_)s$IVaicLJ$(Pch-s9>@Ij*7u=_|*S)6IH^ZMOuV;3IEBBe+t|k8RNbdGf3M5eX!IVqtw_B=6G4oVR%zjCV-R8>XFv|wRhQet)CElng#s}J_NkG^0=SUx68@7L|MAVN zPua}&q|N-DM9sXsV&Z20Wku3v-dGWB=3NyNH}fAV;+pwfMH&OVnJ_^-a|E_gV@GS4B-uoy3l?{ByO zzW1i&`zI6g{mzsGc`zwKo=HTI#VPonPtN!4V|;&23cgkWRoQB_ZO_(0bi85Cv#R155q zU51OTu5!?igF5ZVASi_q7@MkRINTw3loBpBGp0-UPip*=;=b_0aCcMOzjq$)%O}G9 z#S6fFXB_T-OpSYXGTbYY;Lcs#xJM3#(2dp|!??Y=dzhOxyn%Qds(r2fD`xxJ`d7^H z&F){(;hWRHV(xmfZuRWd9f9HD&?g&I-lqNyzwzq(ea-#eXR3TH{oZG*d}6J3@m#%jortKQsD{gS2{cXq#`e?9SW)tdfL_WCKSqT9aDs`m2LzQ$^= zP`zHY?y9RaQ_8Nt$2+rnW9x@}^}~eRUACB>eSCGHixhRa1T?kM!70AIEN<)a>^CswC{TvMMpVJz6y>*zK?G$W`Df zaJ21JD<)V4e6=FeRluti7qkj^or3NH@mqy0XNWZ!m@cc$j6(#>g-+=%XW8~Hs6|(8 zh-F8XkoOe5Ih}^O5H(wfS#ZjB)v}y{g-7H=MSl+3D^F7{%8{HnH3p&Zl57`s2gyPh zi*x?a7fH%na?n5w$_~$LyDe5D(6=y?M$<&=Ak~Ue=smTBbIKCv{%Az-1LaS0e9~TF zx3mW$kDxIaE*b7M*sLZNtq7ZVa=Y@b9C;}#*{EETV~46kZ303-Ed|lqOSEGJAy^Zj zr+`4eIg+=OKhH6RBirl3lYJ(94|%rFM5Brr1uwPal=A7E0WVy0crPJ4<2)t#T)8Dj zt_pJ4CHyBh{!^xs9pu|tdd*6*^32K)9{XVJna9cFXCEKk^ugBAt!KBAZDiXAuYRz5 zbobd;$^WwVEWk}&*@Pqu9Qi8Irt3%N74?&rL7&%N)SbI-l+o^yLpPw-N3FgkeS5(=QeXdw7S@Qcwe zPylK`mA@KF3ob*;g3HnJ(dEISV9{t1QX_S6Q*aY9A=9WS_;|2x^vU3NgD(WXi_n4v z_oRu^7cCNtB@%ie#bjh;W=f?pSymRaI6HgElBG+REz8MSeD8`CE0?djclDaJYuWqQ z+`_zd`336=^YY~i#rpO4-!E4d6+N&)rPgYSm8=6f#vF;JMAI11JJy`=Bs^mt^wC%^ z>K*G%_!7P`9}1%2STJ!jadYe@5+Tu;D3P7W9?M3n(dvW}DHElMhZDxc!>9(;jMXF_ zPdq;MIHC0(ktj`|b|FnMKx>AK$y%I~y==+SWjWbPrqG$6SFrB>!u4{+`uhvzYjSp? zox?kOntFaQdFe=d_K)_IjGn|924X;A0Mpj+c_H4bpb!00tBXiG7 zJujhWMueVPxR9@%qS9%;ub3>^V!og5&CXfAV&$skt5>g@P0Y_2y55`%;tmgY_wi3O zMb7J~d7dMCk>byh%~Q<(9TmFrjf(gGAYAz6To8A7xXbx}rc4((|511h#{arH)8@@p#__ycj_q?Go@05{0QLXS&yZyOoDB%Adn0HGc65i(x7xLVDqC@vbAaeL--c^?Nxe9 zk(#gc=b)7RcRE_Sb~yuJY2u}8*D#OW<=pwdA6AN~3HvV{IRVeR9YEg_|2eAOR^a6w zN9nfNgs56)Rtr%TdP@8~w6&r@aHXZ&YT%=#8+EnSd{kSCUP!Jnv0E%PNQIxmQq!ry zbvn!Or?gjLb?MYjq~C(IqqBG-eHa#n&XS3Ao47*sGu?Y7BymaXU4*?ZY^kYYD{5@U zT6P_a$5xfG77dC&UDWh*v`{jzhTI=Euc@m{<B%7)=I*Qns%FX zP5%bPN{tdqlp0TIDSAk99T#|tg`zUPtc(%2>#J(4 zwd?WbTFnll1;3g56fEkJw9?qC7rY>)iYz9tNlw$-ECt>^`KNMqvAPTXJmqCwcxW?o zmVZcHg5F>*iVOz1N(rUvF1e{^qr#)Xzs1-eq+E^jHA4P)u0~1x7Luo+hjErx$WoIm zw2$c*)uZ1rL!zeLB|4iI-ai=yK)DcWdIK6?I$aUU$_R4bbDc}w!>4JvT`&eULk6T)%rB>5uX;3}ovs!Waj#lZC7N}3@UQ$KiBlxF%&|z0 zic%ZLLhD%cACmTz=4r~HIVr8fm?yOk+V7dRX$K@{Z);ks_tPCN_C`D{~H$r(>DZD5Igwc`jA+ zq+dxFRY>n-U378Mw?~qJ*T9UP90Hrf&m*_Brm{xIR@PJ(TKRVZ5=dWVG3qPrByFq& zrhfq)&BY09D$4gNF`|A|{34p_12XAf63VCb1*toV8ex*$rU$kw*Zs75TfQ9PooWTT zDBi`(DqW+&N{nKvYuE~XEo-*aY_{mP)v{zmHy32vD9EKfIxBW(Nh}e`u*lUp%P{|o5gRCyU1lkU!3u(EugRm;y{f@I3M`_}Rd`H_Ts9ZC#H2t!lE`3EdmY5h-i-i-vC8YV;B9Ub zFQIFd>=uIcBgqaC4?w<=K~o8l`pO;pYJ(8~K9f8l0Mu9n|DaHg?ca(Nxo8396ur;$ z{J5Xc+eE-S?={UeMDFNtx7&ZCEb6F8nBn#S#?juU2!W zvY^LXQq~T|mG~pA&i(9jKYZ#3?4LdP{8Q*@s#64TJ*u-9*kI*NDs|Wz7{okvRK%sjbxv3@TZYws1BQu6|i(b${@R9Y&qDF}>Q_Iuc*i@Q;)fw43eYKVN zZm{45fF3(F*aYm1-AELnThy9#GUf177eDXt^A^gX<>{%K5lkDHMS&)?ntm?lAS$N6 zpX1(av=XyGtbr3K^celuIWWEC3Ni(_)1a@$KHtdHK?I);%O_M%|0D-jP-8ao(~8ns zX|nKB4Q>?9L%*b7$@z&sUzhyDCbb5jT`>LDA~*e7jvH42T~K32r|G=}o)@6R4R3CH zDV~9UPw&sc4KP?0-Yar_J}hL^p!kE7BPsPprB;E`nZr4a*8HCCTo9b_;IA9!8X$Le zxZBx3MYUZFZ1^+uEowfC3_CT$BI8MlUu66xb(>xNPHIBQY@+6+WS*vGQ8EXp>6OeY z6jm~6dJZL%rKeFcAEoE1WWG#)B_;C}`fE}$f8}(~1#(A+yM6x0hI4C}k8@zcGFY*j zRD-n#)a`a+QTHHoj!a;Ns+w9O9CTxCJYeYX` z{&ZzkfmdFv>h#O4`3l7;GV`}p6)3FvZOPnDNTOZLvnyZ!=D^q26R>lR@)DFsU8Z^8 z8FSY!xYus;3mjsn2ksh7@Y16yBr;r7n~~zntyfZpLaN zteDI&c3}qCo!#^={H7n?Rctzrw$T5TO={Ul_8RdLs$jyc{h<5<95#3MKr(@@Tcr%eV zloU#I>=tYrkc%FncBSuD>1^IzxIoiW zOvT4SP`{F5L zbMj}VPWrV;WUZTvu5Q!n*Lk{?R~afIZRP+j8N+iI%=|``H*@dXtMr;1|GCLHf?LoIZV^;gi0O zOBmY0{eINpnu;?%8V$41kNq4s5^M5@0{&o(9gIZT0j_^^XebaKI?!;oyAyD9pCuTa z4Gj&BP%Q3<3=TFpBGDnozQax@vhiV#jg4@=AQxrd_7D5QLmZG2@(sm+z|f6%4m7l#?rb~dxa#va zI0hn)Bv}oP{y^M;D{OEK2Eq-F4?p~HN(H!elkvy=QQuW4jImK}CbM4+D5O5NEFq1GC_k z2Eqf}b$ER&ej_n>)JKpV5bBLx^@Tzy6~}@BzJ~|}SGjQfK!f+>rIyp3C(n+zCpnZL z5p#StsWE`o6KITL68%vQXz)kEvA8cBC!?YDx92+gE_pk8FZFg`a2$6WayFd(UoqB8;Z<&}Q5dY%Cs$V%k~u0uUIB;XWGT!dx`qXT!d$P$?Pwm<<|9 zkKwl)_Ybq7h~F0nF%jF3+ZIkfn-CDk;32}gQO*|{$Am#+xTB!ddAQNp%=)4nI~pF1 z0jIysUH5Y%akl>k+jpU(;~cR2I{@eMHM#}}9Fc0V$Y2~^N3uUKEdb>AH~I$&5FXDg z!3TIc&z@^->FaC*2(G`81BmbdI|x4`Fj%8NP#j*>jU)l^KyUXMHX0d?2g0}o4L3*P zQ76w_E}!F=yT9Qkv|Gq=9wsT5koth6+(POINgWhY%_Mb5z~m>X_l48|NgWnAnlJl6 zNbzMygcL_o%|dFBuU#O9<4JP~)Nni=mp~53BXSA!a2!aQIYlIXNgd&M^aeW;3BYJ0 zvWvSO=b~YFr6bYE5b!w}gL9%HXn^CdjyO8QAW@D5;C}%4;U>op_~Jf+En)Bv_B)*W z4?2z|gh?nodbOX6@`Kjvg9NrCVs9|%xjCYR$_azI1QDCR$0 zdfgckN-qLKMWO?NurJQB&iyd5uL1t305v=V)No*EcpU78Q-J#IBq)Nx#n;2fhsWbL zT;tKGZ-9UNHuZ27a~PCVd~E1p=HuCw)bBC3CM&74>Zoiks%O$9$=k&E!)@j0O=h8l zXsg=Wv{fyT^D!eMkIYcq#jKFLr_lnnK_*`^E42yc35jrS?-ug`eGo0d*M5z!O~^hZ zP;N$*8O^kNo8E@M_(DY~E^hc6wd!hESjUnDgp#eTK`&+;rHNCy?PkI4HMt6hoZi%I zR6S7ga7igUUJvgIZ&yYut*;b}7I)|iy!uM?YQ{;ruE1MTiuPrkris(^I_x>-T*i4C zUqoTkHDi~qin7M5EpGsTPxsWMkF?upwh_+_Fca~(ra72`9D`T`|Xp)4)#s4M6)DS@bZ zWXn{+!_Q^n?P6i6W@MA=vma;vN;OWBq~r=YufgWA>Fj*e?y>90Wpa?)Y17&HsJ+vU)=Ar> zsdvu7a(3d=Fg1{&*X#IhxAB#ky5P(1&@eL5o@-R$OagvXvDd?MRkx(Q$p7O#R%_rJIFvaoF z_Necg7t8R8PX0O3}$C8 zn&1Z9DOf=rBa)ouV|Zl{0(~Jg%EdtaI2RcKWik?vN3QNC(=?fMu&l>wLsF%{J%d%L zevs&cpp!)gC&a%W=5l~P&=3Xum*SBTUcizRkC@MJ4EP*46J~&v`0zyBm6GooZfFo1 z6^+Nf?6i3@6zTVcCX}HsHAyxM$wV?2Vr0+A4x$3tcVyF!%12~BkWD)(D`kHRPk&p6 zZ%F)(OjhXLYy>XH3_tZ&!dE^PpLk-ZGFh!vMzTY?!CGh3Z-v=If%eH(6q-$5 zZIQZIT~e+oEh*Mnyk#2HEz2+DKbmND`f9J-Y&un1tmrc747J|R<@#!cuD05H2}e*w zR#a&7_Q?&kT^9cPk{wdD)j|p_&)Qhn*e5rg+Nkitzjl1vHmg>va!FPfL-zd1muZwLYz|QTKkR)Aa9r1Q*hZpD5C9`v z@_5>$GrgsxSRX*f0w5_vvNIG#*&IWVB1(+d8IMDWkcfyP6cYMn(y7O4?Pi*tX;M$! zY1+<~RxJ>~0@z)ANWhc^BH0iwO)?S_Q;uc!VfQU|rNzGWegLeSxILeH@4IhzK>+$p zX%Q=%*uC$5&prQp?s@pn)`qSA2EU*Fg@UFA|JDY41)0AAUrN^M`^(QE>z0PiEe)-A`!0N@{?1o6`y1eY zt#?z|7JA-7b?LQx*t(f|YN1{?`>wz7b9cUi!@yvzG`b&W0`tLHwYu}%Dkpy#)gn92 zT9BzE#oq|bUXCH5t7lRJrZUkx92!3gHBdpP3a>`oDx|gdLWzKyuZ|2KT`3Yz>)}^~ zzE~a1S0J44zY0cc5KNRHYhi5aDOMGnMAMolE)8s5K`|4qlW}rjN{KWnIB01i1?n2H}-1oQ!y2GBn2(t=(nAI7>CR7|cd(+hiV8S1^*OV<#Qw&ffs@)&50r z0&GrD$%DZ55P0KQJ7E_}z#?<`f?6cCK>qnR**L0~*wYazL>%3pg5+ilu@gaL2Y&Vi9Yy!rdB23OogEgGA=Fyz8xnpRW1*XmW zhWt5irxPJCa(NzSPfZCc9?uPwj-cIM$Q5H`9kTgIyjZ*c zHk|BCF$1#)wmxUiIbbvN(O9Xxcpt28EHBQcODHbDKF^~x>=(V^i0Bi5*y4m3IX))H zVh5HRELe+Rv+9;h&BlXobUXG8=^N9LL6%{T=XsHk-~0QiEPIU1C5>;#tRutHKd) zA<`wedgO0LXk18uydMB3o-#ErA&w?fvIoFE=Y3fINuH|%h-Zsbf%T%qn9`7E4bPGcWCGwebE{cr;PPSCK#-XC(?WNcbHVqlzr#VjFiGrqfcB3%$%{yTZ+NUPd^~dWM09w3MA8B=1(<=Afo4a} zzcnRNb8|=7RRTl{lUzV2r?4$@?BDTp|qG>AbCwuVNF4Cn-LcO3=131~{Uq znJ_fV*=c*;0<1DwA7T|!8Zb53Kmb9$gbit9K~(mMq@9x-5T56uI4@B7N1p~%lF$X9 z)Apkaix2>*l09fu*tG@IjXA(6OCAb9CJGH;J-kt#`D;xZ*(##;0(A;(f||fqJM6!7 zF$V}J1#2!1kdMzPD&ojv6NhOtXD{S{;Rqn#dAUs6LTZDdVLlGj$qB$zDSdd?E@x*i zJGn6OWK_S=L@*yj@Bv#!BAEqLG#^H<^l$_pBGRVG@NplEF7;q+sR!ep2jr^N7{uI) zxw>Sggwd!GxtKhG59ac-10_@blM?i5B91&7_7$d|%9IR*H6@1XA!y}e!6S4iA$OcFX%G?h70ok7!X`4A1mhZ zZz5q6?R|B^18@n&orR3lA_rJLkeuw5!yd<>!oZAAi0JW=W5Zei zW#YK6qY*V30_nVyVr5c87DpLmons=F&LI)>N0eSo+5?jhegz$YSmJAR z20;BR$I>eVPG|TjH}JmhwbyakKf*>+IiLK$SD8YQ(UH{1F{Ce~g$vj+sBqHj&|D#*Y#6$1(Fq?3g)@`NM1z zHQPkZHj%J7=&1SQxcMV)PSk7@HQPkZHc_)pBy0{kYW_HG{)n3sHQPkZHc_)p)NB)p zn1ha)KP>ZyZBEo|6E)jJ%{Ec9O(bFtI%fW`%pbNnQL|0dY!fxxM9nsls5$7k`D4cX zkuWD}wuzc;qGp?@*(MS-2OT$m%$PqC=0wdlQL|0dY!l@+)huP^udY`D3?|ZnBrjuQ zer7Jk`V##@!%|Z+FgHU*GF5vrG4v6;(m~W2&cU$m85CDPULg`{Q z7=@+J*t4L@qMZ&Jaf;$HY>dXq@sRJblMWZ7I-tM(uZEEZp^AtMClUh@=yhOl5OyOJ z`uTExEm*usgp&STyQqx(mbV`$1Pm-JP;O%dOW_cz%PTTJ^pTcfBa;g!mCqM#Q1!4U za$%4)otKvQoK>1ZjgI|2%JKjzETm$}4~^_0EV8LZI}LX15URt{Nkr-^(k%81gzzTX z^-QwFMi#6LvKJmaKLAb0;bhE?CM2IDSIGcBvf=|$vz!HUayGz@7_4Xk;T6%gr^TRu z2wfI-e3lFpJCiTw*j2?NDF7NEwbBb#37Jb?n(sM$W|(>6EsMAS^pfF0(NW|D2>Hr* zLO9TZ6C&V*7SNbL`yJM7?4q1z9-e9^20OeEKFm&VRiR>5L60Vt;z%`QNYIGkk3&d5 zm3Ei0N0W~UtpX1*UEYr^JHQx@0p>uo0hW*`hE1p#*GqNtva5wswRgn|K%!1(L91sHfdC0Gkw`1_nOpH2Kj^R`u zCkWilvllKMu-ApW$zkOQUT|np$f`Y?!jy^l!F*GWL#hMJHHYGPAtSdJr(X)HGh%ni z80s?_D|0ftu;#hQAf8DM^T|`h83|=;&Ypw@k{JTOPnAZ^sH#OP}C$SBm zc#S7yr^9BaQ~@nSGkSpbS8tvkGYn894>~W{rH+bOYGm}RVA!*QaI#_^)M9w$3oD;@ zpEw88tIi5EVtcTcY-88|sGcAWm|jT}8v2)_OB2b6oDJT=dR`d}02kR|%u1RJxA4*k zd!w?s6#9?VG(3xUcV$T=sRH8iK#}F;yjBy+<;;q-1Rd(qCw_$VL-8m|Rn2jXiuRt9 zq9B!6_#$IO2U&ng7n~>!pD17$ODTLpMY1dopFo(ym+%RK`=Do&z5Az`ZzYR0_i{=V) zf=k25?SVHAaESY?!%j4fAu?7S)nL>WNSyF9B7c}q&Yn*>U=x#qBz@3)WM$1D&5S5l zFN_EEQI;h^d8L>E5;qh*uTBj$p#p@n=^_P-)5()951*7eN4{eGl6A7hG%}pIV!DvZ z(xI*t`-uuPVw0To#Z(5&Wh>7IvAA>$1x8PyoeR;t=6b6 z)LEK55QIjgx0GwgcsvGMf!ZkPdU-sihB?#GHLLT00%bvL01ZdH4+0IqOJKxBrsh2Q zyb|JSK#A{4Dd2hGNlVTy6iT$~j=WA&K1W1rFapV24S(?T64bmt#27q5q=6lI{HWT7 z;?7(ugE~7+gaKg3=m;S}2bxI&An{E?EKsTD@~oersgQQaJ&vLTzTudlf4-ZXvGRPK zg<|iyAn6u>sr+s_Q9#V*LX5}fqEtbbK&9NQw^D?Qj7m{xhH8)cJpvYSCXV*GE&?Mt zR?J=YR2zei>@1pxx@bHQ2ztEfK*x#HEE-@OFLUYqTSSZ%UVthGWTgBN2PtN9PCDHm z4Nh8VK;k&@2ktknB8PBOu`|{e5~)SvUrsJyJV8eob8{p9}xx80%pOyNfeN$G_mqCfJMhU&}oTiGhwKI3Cx^}sp?%JW?ifhk#)~-Y56bDr^P!RA|kce|aL`KPg zxD*yYgzsYkIWib9ytmBiG&{#$m9ZOEC4s&rwK%1ADf^o^EP0@zk@A~JgAnT=Gjz|? zF?dDBTj32gl#9>|p7V9lR z)TW865Jbjs)SK{-106Wh$3Q@oQYc`It7V5L;BZz4((+jedS`o?cOIpgIde0ldkx9( z37UzPazLHrrvZ3}oMP?@9RRDr`-nI@_c0p-#N1Jzci81Xnqi8i0C~2Q#zml{^8pFm z5SB=_tlIv{i-oxM5UA>Nau+Eu0}Ze98MaafghD%^xRger0NVS=@bLVmSWq$v^{GUW zVvE48H!x7})dMSskOs83Dpq69j6)|ly94Nmn)x^?;@S7$r#5N#mTtyHgS;FC>^Y{Ur5|? z?utVt%GYZWO10(U^Qx;|3hO`m)zZ{WG!9PASgACsu@=cD^l*?b(TdMonHU<5=u=c` ztK?c~u3|FPfD4c^Vy3f7Y*95xO5I&1rKwLH1R&C435Za1l+I<@hy&|^6-8ipq=^ME zQi%>bL|9v8XonHN$pB!BBWH=QigF21Y?LzF6l>EnrO&~-VYgY}e%DrQpgMNd>U zmvU5fCCeJYa47eTm$?_%LIKrKGZm@+R)lGaBl)zmU;rnBCMKSC>A*uYtm$Bum{G2n z$&2C8$nc^EG-~BTBsP}duBNL?Pa3DI)IeIa5k3NvEp5eA-U5>Ac)S+Snz!e`+glq7 zhsYONapn#9r3WNY<{A;Vjj9121xbbKjZGgX)uZadIcM=Zl<|7vX54K|BYO}w(tQeF2+9-q8y5*{07c|?u^I>n~2J=oy|Lxmt(pqvTnM39k| z0ug6boa78x^I`#yY@j8dY^z9Hz&{y3i0p)>j=i8wNKOC}S%ZOhokRk(mEegW7%zC5 zTNW#&J%Y+C?3XQ!mhv0M0pPK%JW0o$@n8%pI+<9y7`I(xEm6$GqzM3mGRS!@&Q6~@ zU0z#8*jBB7a{8^4XHTmv7MZ}w^QTTKHio<04xJH)A}i&aLT#zW%Gx8L^k|2DampmPsh&%B2xg9!>-_vT{ATk}CTDTubD zbt&Zm;baZVq;^@+M>!2pur9Ky!FG9MBslrz^hFWRN+UEqH>1DBlkV4f_v?cDH9IfQ zD9YxzIc@_(%5|G0MZf2`$yxVG~@H2dzoQQY|o zt)-C`(@2jRxmqK)Y2*$Xxwl5@+V}E}cij0(BM;U{!^0n%OCwLLk!RV+Q*Pw>H_~E! zV>h-!V_se(Eg1gL>KhppjSQDY22vwKtdYRy`^Al4hQm zv_<%Dt8d{(%t3wYO{>X4{pFjM$U*(UO`L;z&rKCMs5@_Rb5MWxrd8#j4&QWz9Msb{ zRnI|v{wB;poxN$99MqrsY*`NKwf(=g_aAI(GRv)8&MJjw=$1SM*v($HVwX!Y#~jC* z^!{M#;(++Ug|p``9vy@VPO)%#5o<((li{%th61^%=qRO>tW=VfDn{YMjezS~u`_XY ztFX(%n!`)G(k&rzK|`n#wX;qHf2Keu zYGPk1A^6dH3jXo? zPS$+O*Kz-aj{B+M{n+q+XxP%s4O?$-d#s7yH@tParERzI{V~5$?tb^ZSMz7S4p3W~ z&O8PL)&Z)^xsJ!rgL!(2O0mD`$C`YFn*Zo~yy-&6l;jIJ4=;{Jz~AUiUrj#}WSJhBGvR z|IBWGigb^6l~C2>)%v&k*R_3E}{4fHXkaH@hL>;~l_-@Fw64c^`0S z-U{rKb__t?*1q#X`%Zk5Py5dE9qp&!XOpkAA?qXKN!m_f-*vUW^x=lb?Zj*{_1^pG zxr~$jMJ`_`&Mz$f{XhKb|Gu*v=6o_f*KX!-{`4*L2`r!Y`l`tPO}Pf?B;9+opeyuF zv!kDafTb(_sM*66KNR-;u_p*$zKRY%x70;P&T}PCvR0oq13Tk9jTLc_e6S~@#&t{_ z2F=OSb828b!f-i`23NO1-D>?|8L+7C1}w6!fVpqE3l;1CI!5t~sQ@w=7d4r226SL7 zX3OO)OEg0_^2i&aM3G0BlqI!%)K$p{t@6ZRA!=d%Asm-LEn{A1IL;Z5zAzVF^!QPA zyG35JlabM?!kBtKH5ibSq7aWNhroOSPB_NLep#!4p}Li^GIV(vPxv?%2cr^XPy!y0 z(=A|mskVBsPR^#&Nla3em+9w|b_%0%%0n1dkuyx9Cz0WdU09&gO1#rX8J$;*lo(K4 zEjV{E>!tziTc-*b33Zl_@<+)ksa$n9iA7L`14 zx){r02I*3P+h`mbr4kAK`xyUrD;%#3{|&hGf8U>&w@i~J2Q*N*D|LI9&Nt`#rbq9M#t89j4a8gD4E}k zPOTKD=q5@ThH3oNy#y8C9_K*zIokp@OV$LOd5x@(?wkKdDK({fs#o+ggGUA)LTp4^-c~Y0F zTU*57yqj4Xrcg=>KxEFvku~WIl+J;r9nc$W4g-7!IF!4Jyt%Kz$=(=P@FkHiV2}*R zi=zOFbRnp>WD;0cA$bDiH(oH+IWkV?tUN&_0Hrh zOw&1I#h5~YEC4U@Z4D~?(-PStW{49>CztxAlPSpCCLD2-uyS*Ra_>1a(1fjLyZHI9jazkNH1JLdT8QM+?A6My)<}9goF(?kyZ-_ z??JvQJ;bcw`H&VWTvuOJy!! zO@>q$G z6*vr#4MUx$f)qE(t}QO9E~bZ)1D<;CnDu0>5}G%>J}Q(T7?7CmmX-L9 z--7)b=W<=ZS2eK$`A$e?0xiqhEbJ5+E7Rvr3Q8P(>hwwISLN=L%pji1aTp(^YeG5X9b5s$_s*^8WuROh*rO#fs63&-9iiwF28U%AhVfDAtVKd8PUgq z<~esBF^Yk8oGiavfkq;TknX|ndcte0P+jLNl{}9h1rP9M?N2 zY6T&0OS&D3S_Q@Azj^wv0VL2en^s}V#q3cx$yNX}US`RlDo{daFcUD8pKq5;zcxpA z`0ye%kgAP%0$5K>oakXDcJ2kas94@_hj%_! z=D7<_j^V9HdQs$$@!}mP1mQbz$y9p8lzp-~6#EGv(Vy$DJP zd0{xD9p`Bo{`Myb^gD}+^qLPyKwmjO^>EHXz7 z=>vw$qRXuOs@F0p7t~1i+%RAn_CBF+`)(|RK;RE*1t(eV@G$GsKFPOqA51Q7isk=U$5Ip%Vd-fb|T zl+U0%+CsNLEGxAD>1QCmR1l@%HzXya-4Dwz6|-);FbnR0d`M{^=3_~ERSaG*!Z$4N z)lX9&FOh2J*;|j6S0XL%*Il(+^`YGrG&}u@E13h(WeuJ?@MZjDNwsKRt3@8|PdhXn z&S3KKsV1oRF0FL|f>u+z0(x#0bY4c!OVaV^73mn+<5(b|z_W67Y5rQN#;O6`iBhsQ|j&N_T)nS5-Z2puaVxmKADmZ^$1gM z#pC#61S*f~%82VnenPgYE3DHcL$-1rr=OS^yyq;y3QYM#m0+O@L)h0^M)pXCyZroAk#;bl;X+bu~yz8J~c^EO7Eo{MX(d9j^+reQ<8aA zaQKQ2g#}k~ew^|VLB*!~!fIvF!qp;+KABusrd=9GxGl+biD`-zb4{@#!%ujar!Y)E zm`zpFugGtU8o>Ng(rB(K#*KF|S^9KRC8a}KIY9ZIXu0b6PV^q}$m}CWDIg_QFm-}} zd%~#2byW*;L8$`r6-$&o1WSa9;^5TTG7@QWEhEcXMwYdVENdBA)^eh32u%>ULCpqg2qgxPS-Xo&?Ms#EwD3lrI>AjF17vppHc$A^6HEs4dR~v;~69 z57q3HOm(f^tH zMTS1>FuR2+FbcLSELvb?ELd4_X=n<)eI<8xSKO^m0=?N57n%M-`?}c`G5d zqWcIu`{jI?#=V0TI4uKsPp06SKJqpJCQ1*DDzo6k3A8kraE5Z+u_iw;GZ7?8Qo$VD<-McyW0AC`a7L z(53-;Gbz6TCys9@f*qAaC{jB2V4#o9aV2xp{32@MzK8narK$d@bEo<-VH8G~;W;8- z@i}{Hs{iEKll@btPWHcjaf-CPF|8bsqrjS@S1;u$ro(;ba*DGWsy9-Ty^aAM7AnA~ zgY-@TJ*4Q|i!$rGZ$M@~L-eBhi<7GX$CEF1;AjCdykxKnzxAHH9Bgbw2FXiEd9Slx z;zfNo3qL=c_jdfs-rHVu-@+6WMy%Xs&Mxo3W!#j}ZrtSx%;sv=F-$WujBkjS$x#(m zd)&6Dmdb+{1vfV9#skv%H4?2j1zP6AHxQ&jOFA&V%>Zn+7=`3h+*FF+SdTTQL_UqS zJ21?A3Y|U)+bYnjviMMXQNMkN-bx@}Z!Ir+;FScI?XKwh49x5-boOIM#ZJn(FbB)a zbZdxVF=ysCuDgCY9pRJw`HkzYyLOYG;itYfdHtWZ{nxhd`TkjL?)srO+9;6$C+YHi zzV^4)4ZZ94-Cx_juA}`zOH*6q=7$~-yLax|d0+bunak*z+TH6Yb5A>`?P=$nJ?)&Z z2mWlwe|`VD_7B!|Y`@^&+}3gb1wUR>Zo*6AExx~~{lj%%yYIp@Wd-t$)m~UXvFWRi zJg}`p?DpT))PQ*mwsqXUM?ARwfo=ESzoTQ5?;mP^x*k)v?CjX}@Xkj#)xow$9=+?~ zZMzzqozKUxUB- z?l#Urb$i=!Tn}YvkXfi&@OJ&T>lW7!{W(8uYKDgo-g=?Q_r1F7YC`z!luY5(TeqGH z{7|qJ3#RMpsi66k%AbYhmobOd7dJO-#;jhSp$aXsMH}YS8v5?mCV1G;?BCMhZ}mf2 zE0nc<5zDqTbJ2I3{adL{3nqy1`?l48u7=YGwYOm&0F?$nWk#AZ5+k*J%Xgq&)KI!J zTsLpwQfq&u{*D@$;e)s0<#hPcdWsewsBf+5Z*GD$e6RjkT?9euJ6*q;{2V{8Um`z8 zqMq|}lS_eRXm@$WY-lb_>%Y%I&q@$e(J z`2Kd|rS~4b1?bBOs_ig;m8S3Re>Uq<{ zw`?MEzUzT)yB-BR z+G`F%rAM~y+R?bJy}g05oZ>goTps!wz~rkBJ^b(<-=EaHKSNmQar2ww0E7W;cfPbOVkD41EKZBH| zf8$f%KdJjwotqfNeL|=C84*3009z?o4L8U`y1|dXLjH2o6r96=IzXzEuS~j@C|-& z;he#jH>s9*@Vd#WM-eK9ZsK=R)f7}dB45G(utRB@2_FBdNtv)Ug0*Et%4wr{OIT+z z&%ST{WB0IWr=f}GV(>|!N47u$Ii~>+9aK&&miGxe``L|P0lfNJ$>gMxMyVP;@hJK(wCr&+$|7()}JC;e8nPY=#Z2Kadv4rF^@ZWLX#Mojo~=nhDaadnNF+) zuR2~4Z+b%X{(>p&K9Q~$DIMs@X;cCwTLJR^u2GPymZbxHg_Oe}qNWuFDmF)5c~Ck~ zi=rGJ+dnBCm>7izmz=z{!d!8+!nhuA-e%Ws{~MHkAd#VSQSUtDitt0D=md zVcnqRKOZ>(hNSlD*pGk*w(}n}zdkEh`K@xvyG4_Ac{`3wkIknW<(tK_MLjlaHD^*m zpYgI0KReH?@$TpA_2e&S^pj@PFejd^+V8sD5aHb%!ebQx^4%G1w(A53z5-BU4?0$_ z1PB<19rk?7)|OdNy)JBOAclFMzrXYSlc2yud%5--4_>kjT3}@P<~2XvyLdSE_g;uP zvd>&jMOwJmIEmd$;zq*4m!9+|F<|(asF*+eBloX?KVd$ZVGac?Yc4;KocgRmZ?j`H z(`k}+utrHMh*-w5B+M_KfEK+QHHV)`AhL+xw9f5l^!z&*5~@}fLvgVs+z7>95|_zI zWi!r6JtM$^V@Dn#+H4#@N4;uy-D0vS^b%xuA+09O4Pal z#{7tx6g=Jd(^)S!ZC5i_jdP{C7o0|!-<(QFzT}Hm;;l4Jl%%J)>_3rD=PsIgCp7%9 zJp)ZU=T=^fGIq*0Oj3BXVE5uRflJZEY_nyd=*Mp4wT-N-R3(g3Phbo(gEUT|3(wVJjKmE zpAvXz->mj6`N^Ac`(C`MfLVHV>hH_TIrjMvv-JzxGRHn?(aj&AT3Lk#HWiO!m*vKX z#haS;|0x|;>o?aNw=|*t&6YOrg7@dnIjmS2H()Mr(#R+k3Q4?q?M>hhO2WU{nsWq2 z1m>BtF}pu7YKa3Dok2&>EAPiJ0enyIf!Izq*WlJ`jFJdcPba(v0WqU-4p`T^>%sPw z)nr;`&Pi?t)5VoGg5#gX#<_j8ua@;p`&P)Zy(`{1xV{RYp@<99&|zvbJvV9}0p@|gQ?m3F-K z@|HtZ^V`shWpQkfW$xxJ=ay9KYgI|%M{wFF>PUIT~zMt_*1<>?!b1`O79ffXGI z-?pFyK_XfmukxSi9E&#IMA~dwPda$%X^p1T1&)w;1{CRWn=jMCmz6$nK$~*vHO89q z>fyDp!+eV!!MWKAuPmnc^<$F7x9Pp{_16gj<%N!*HWP)~+Ppl<;PcuA-G^NBPd90M z5vUHuv<^e&h73*w2k%uqU+S%cutXnV;?nkFXg@Ae1*p97+HAvx53s5*J$xl`BZM(H zcQN$n+!ZW4p9Cat!iBY{aw1{v{CSn*b-9C2+d*&9?orIJng2Y(p7ZcP)nWtI>w^(z zIpjF_-d6-$>M8n}T)^4nueXk8x1se?_Mr+v^BOJ_foBpKXR5i}NAwm@=TUba&=#!^ z_QS&nkqsP=`r5Ry8P{v|!w|2AH|9&QvCbQWC4WXmBAWGEW1XQtw*@$^0Z^^os| zysL0Ha=? z=5pfLMX?~#UC)A&i~+-}630-4Ut1Mq9I@T4+rsgYSsD4I<>}DxQ^xV@^yk?fp*-)7 z*QQ>Ln<*E<=|{u-6(8|p1sA}m0RhUWfg%+ zx-6+2*e!YLlm<3ZQqd_6SDy@=(`cT)ySWR!!H{$lPiEx-x+oOCH|cUUKih5@nH07j z+2isqSVbIytT>{DDS`tlow6WtaW^VI6@A9KA-s_IP+cz`AbknK#;mhdG`=5HP$&rx*X3Tgx~`TPw@e z&J-J2|Md|UgM*jcXQv;Ofn{*&;kM+cA1{-{Kw>MoC+|+4t6%0S6V&n@<%)9U(pin! z6AHDs+x_b8ppba^cl8uN(n!n?O8@%igpazacOqBuj)Jn1Z~ug1rF3OwW#m@llosDp zdS3dzFj=a-&RDl^gz)!kpg;qK2bbT$IOe8Yl5S3v;I2QH1Gh>q?(gdZcbx>;HK6=` zc9I^_j_p>(Y*%KJ={r@%a=oN@lTvYsb~Ak>(&eX7L!-Uy&*Q$pUwg~H9RQT}cv$a|I%^J1cw)j=ldfyPj`dqDfqtvU9Wc6kN z1Ck5udD?e24;P2tN(cr*rgar)9k$$tak(N2&u)>f*c^HnR6+bal?xH7AxFodu3m}{ z{Xrr5^n*~7EGs$eS4?3GM5(uS+-MI(nVWsaU?8>Sl7$0nGHWs} z|Il1kfl@dy6|-TqxG%RB^`@sXp2P}TL&3O9PSUtb+6LZJnuiNbz?Ke zzIU`TvVXzACj-MP56N-WFV)QRle0JMOtoszH)+4xir#FKI8M{=-Vg_TQFc`&>f#_U;FrQu%5z%Gl6H;xFqEyAS+E z1GM{l2*#jgx}NQLlHtBlbW%RzXy(^cQ3E6eQ8-gC!?rlI+fwWA(e$^Y6sYKx*;!lr zmb!tLCQOyK?c;GYvAokGkaJh8it_ZiIZ{<~OhAO7{F3$lJh_(xcC5gxBs ze~h9MRufal@PB184f_a8L@StxoCEI*}m> zhRd+!#w?p2Du1Ko4D35N=KbB|{tI?z9K0oSwt0aahRYsFqlI*FJ3BI;tzs`Nj1zt1 zdKX+`+c@bf46ybYIE8*VhWr`!Wukp?ccNDqD``~%Ib~KZpCBbuO#@cR-7>r2kcy+U zK_i(>pBM^#*NUbMx`D9C{i8e_lW$5ukG1u;)R_M{~+$;C$pSC|#wI0Z0~>;U2Q+QW8T=0Au!m zMI&TMUtu>2RY5%XUwb8ylo_%^lOzEeg|hOM`Zz4}MTQagZ^(LAE83;``%g?1xMRt! z`Qg5k#E?L@y}0_2JL!j!Y$*hq8-EKsU@V^h_7t$E>zS8-4bZFI6yfQX9(?~|+`m+Mn`g{$piu%~pN1GSoPEu4!wEK$^ORE9gGCb%-=agd;ic3v_n9zSNtSk7{u zF+d)(>PNck%cl|d7}Mk3dAj_r=EVJ{7bGonR(Va9Sd~V(f~o=|948ZUD<2c=U~2Eq zfpYj9bOqJ(sFP}ppyY;vsMEg5aQplKLyMRR9FRWu$Rvr1x=d`!)(;EYl5=d9jO zFop`XHC0;e^P)Dx{@#uImJ=ighb19fCK<})TK>Uky|4b(A4sR;eDlffpOwm_x!hq+ zIMhhTEOK^5uWz5@WI7cT$RMJap=d2`JhQzn%`JeerKdu4P{?2> z$cOQEJWPp^O8J*A;O_Ft)Ts88;gZ|NQgfY>ujVI?zbRVi8;-Km$Y2-@S=?au!<)?c zNXcqq{9$2V$s5?4P2^`xf5jbuN6Hm8x-}eFVJe2dSMT>0{*l>&MjbnJVO09A?{5?w z4&4oJXLyM5gD0jfEQ*_hYIPNSnk^c@nQ88OamfD$vOltXZJsbIJaMpkQKC7PGFnUz zXwXvnTHNR2PF$Fh&DXRVudh$T?0F&VOXI8ZMav9x{P^RhM6rGkCUhH3u8^-81B%wa z2&Rjs5w-3E|9FNko~j>+nLskz$3LKMSy? zZl56i^`4qP63BB{9j~+x_q>+fwA{%*u_?b_eKxgIRFHEtSw|F-1h!PvupUtp-nNgGf8&)d)A^FnOZxw{(R|+dSP=R+MD>y~Gb^GfTA0z8&)je%I27 zN^Fxg*(}2GOxRDBm3#ZzM(CF_$c9f5k z$BfVUO<*djq|xGVqJL8JeDFzum0-D1igxZBr(tnow%nB8YnzXq0f>C@jZF1E*IswS z1fiM(204>wvHb=C4lZaz36yOja{S(;Z`+$?K5IO>U-wK z_)8pcZ@X=oLnl+8)3RzLkb2MHvkY1c(~mCCI{!3oT2qdCx4zu0GbdnotTeK{p)}lefc!{T+XkM! zi8*rI!-9VT3hGPUx2PV1PN|o_D(JW+FdzY9eGjlCvjulv++uvC|4Ls!kvfTHA(fWC zD6gzS<=!iW-6_$~OH!RmFuV|C1Zt9u++OltGN(BOLxn5URhYu65mLV|m}5+Qm*;nfm{37mrO*FSth(2FxwVmg?Q%DNSK!n~hfM$PqZrTE{O4tM2bg zAzh|<8_e|PAw>rICrk0Qdobpq)bci&oN;lp#|3Hbs&VPGqQDGTwIy?N%Jgk1&yMOc zMSa67Q0V%S+Tg2z0Bme+YX63+$fpC)l*QB$kJP{EiP>?B*%>FBHP}=n6xN`xow4?= zU+9G35qwvN*HHvt4K7K)De2ci3JuyQs?z?GW*qub*pTaI@SwM@;1}pwa-+SkKQG5v zOg87rHW>^BUU$xZykvjRUJlc68rrff5A5Xd$o3L8ig~FS1^fPi683xtN?!+n+&d)J zHO7qgbF%vbDSOucJy-~z3gezJw>l*L7DfzJ zG6xFwYORIs#;?4TuZ;lh>IUXhzBlWnbyVdgKdrb_xJ8O{%W#^};7dJxG0pGqt(KBG zWdTU(;8`)pnh9SQvu5mcZTyOU*Y(0;sqWdLJ~5DtQcENSPF?d&liP9O2lRxPq-_(N zMk=E2l33AsnXs9Bz!S78dCz+Ln&ym-jc<+_)SxpBul7uC*1Q04b&~CcY(|3_KQ(4` zZ|t{=;|2m(l&K&bQka_Qi@63VDAqBykX&noja2j>h1sKf3HE4vM*8ou-2qebF&>EZ zqSU5^+fi>T8Li<{((KIEpm|=l4?Ca|J&`b&N1p4^rUms?J$+w3%Q^E69?6GmM!R+X zB<~Yh@$W?R@0 z;%%JR?;2V!>d@Sn)4fqYy$R$XitE%iJgK`8Wl@8sZjcU>g(Y>|V^xY^wj&haXY0(y zCoB%oSr?N;l}AUvg*p0VrawA>j#*V_q9uRs6IQN;rFJ@@Ohc4WrXE-o#6S5BGb!(N zdtdq8@ih`JF9JRXcM-VJF2(_i-M86$lfLjQBO z5XQJfP#oxv(+CM*sTeMBQLH4@|H=NW{UuW|kOjPwPRMS$7dx{PDoApX~*(iF?py+2HEN6AX!Bf1J9Cei` z$UF^du=vd*K3tg0ND(yUuOFw*iCS<@G-kc#Gvz4RB($ilKCkFhEe08G}YPTRX21k!(!86-oi!=-D z6o5m*KFlMrpfpukh8go|P)9D`OSw8oU(P~7JDp2pR*L>=EJvR6e zz?Oc_)uU98Y%l`ebNFy*w;O;J?y-)vaD1v1P^CsaoTU$ue!#FhUtl0}v)L%;bO`o-85M8@kVf|LLj}5#Bo+< zKGyeA96)o+4V6~syZ>4!ns|*o<>hi5AbL`sW$v-nQ?n*mLA;nb?X_NH)C)}07)mQY zBGnY%zSA4J*jQUCMqmClbqAeUCu~PrBMjs+p3GHKoUWcVo}b=V*Acs_-&j z%97UrSKhD#ZdqbMe%0ae^G}Ccf(D%@0~b^)1K922P=D zLGJKnr+Va!2r^$i&P2}3nTkvITx&*pX05E5tQA?UA^MDQ1V=`PW9^I`jTzWOeR%RZ zarnO?{H5nx{<&9a;I0@y=1at^VNy<7tv{KQv!)qFa_9tFw=$OhR^JkjRr+rQ?+&K+wT2y^t~5tFn6W zpu(9SmG<}v@8l+5Mp6NqvbH{9tE@OBo(WXt6PAmBRM;JH;cMiUK_?E>Rz+y@J4S=E(uPN zB}ogQ3k*xCLU{$1q;o$$NW~wrkv3NK0*$ zxNo9;_$elN*ckd9F1KaNP-Y2{`8B`0c#yMzVmC8Cnw}ts6e&I{+kNXK*fu<>g8csN zHUKHWOh9cn0{?aot^a^4su^^G`ctyvUHIY?3L3s$Mq{F1S-Xeps@;X3Zy7D@A{`Dd z(CZuT%#E5p2G%}PgrF66cDuD+j!uk>aYmNN-`*eIu9O$ib{qlJgevaTJIZUFW#6Og zx{-bjZz%i1E&jRGH4Ws1NHsc_Y}s};2opnnY}~vy-IPjhu}iieX7MuJ;d8ginN1y!D+WIH_JA*Q*q9jjohBO^%aRj!6>B_LYZ@jvoWp!h`N&y)7 zUrqgpB@ev)wu0#ePTbn*PXCx<)x~;#DXrRJ!;D8>5h(lQ%K~p!GmdNMz<$F))=~>% zxf~2M{tHp`sgNy9$SY0I(@pUltFp%qG#0rw%`A31>ZV*Um;J0%3X8Qwb(lC8u7ph5 zSPNmOfz(&DLkC5Dc6ZFzwY-E*rec<=rf1T0n(6AZF;Uu8A)keu%G{!~ASu;Z@a}kT z?eH9aXF~Sbk-Q%Zj5-PqC)6ExIK^=@jz>@V0YlbyMI9kD5+;sa2yJ+>lgD2Qd(zN* zh)IC`aMepci0Lm2KHROnc=By6Vwry;3n0UB_RRk;|8H90G%XI`wbofCt}|Sx24FeE z0=}V^TT^f$4ShO%#B_%3f1Bm*|B@W+yscq&_U=##JLvz39J08f7M$SPOHyp-}#p5wEZ6*X+}%{ literal 0 HcmV?d00001