From 987aeda6fb1b30dc42ded05036ef471705f00034 Mon Sep 17 00:00:00 2001 From: Anna Bergamaschi Date: Thu, 22 Dec 2016 17:24:53 +0100 Subject: [PATCH] sorted out problem with CPU read out --- .../commonFiles/sls_detector_defs.h | 3 +- .../commonFiles/sls_detector_funcs.h | 2 - .../jctbDetectorServer/firmware_funcs.c | 675 +++++++------ .../jctbDetectorServer/firmware_funcs.h | 2 + .../jungfrauDetectorServerTest | Bin 139676 -> 131772 bytes .../jctbDetectorServer/mcb_funcs.c | 934 +++++++++--------- .../jctbDetectorServer/server_defs.h | 36 +- .../jctbDetectorServer/server_funcs.c | 176 ++-- .../multiSlsDetector/multiSlsDetector.cpp | 6 +- .../slsDetector/slsDetector.cpp | 133 +-- .../slsDetector/slsDetectorCommand.cpp | 10 +- .../slsDetector/slsDetectorUtils.cpp | 8 +- .../slsDetectorAnalysis/postProcessing.cpp | 7 + 13 files changed, 982 insertions(+), 1010 deletions(-) diff --git a/slsDetectorSoftware/commonFiles/sls_detector_defs.h b/slsDetectorSoftware/commonFiles/sls_detector_defs.h index e2f10656f..3657e2b6f 100755 --- a/slsDetectorSoftware/commonFiles/sls_detector_defs.h +++ b/slsDetectorSoftware/commonFiles/sls_detector_defs.h @@ -372,7 +372,8 @@ enum dacIndex { V_POWER_C = 102, /**new chiptest board */ V_POWER_D = 103, /**new chiptest board */ V_POWER_IO =104, /**new chiptest board */ - V_POWER_CHIP=105 /**new chiptest board */ + V_POWER_CHIP=105 ,/**new chiptest board */ + V_LIMIT=106 /**new chiptest board */ }; /** diff --git a/slsDetectorSoftware/commonFiles/sls_detector_funcs.h b/slsDetectorSoftware/commonFiles/sls_detector_funcs.h index c8e261617..4d8ba0cae 100644 --- a/slsDetectorSoftware/commonFiles/sls_detector_funcs.h +++ b/slsDetectorSoftware/commonFiles/sls_detector_funcs.h @@ -111,8 +111,6 @@ enum { F_POWER_CHIP, /**< power chip */ /* Always append functions hereafter!!! */ - - /* Always append functions before!!! */ TOO_MANY_FUNCTIONS_DEFINED=128 //you should get a compilation error if there are already so many functions defined. It conflicts with sls_receiver_funcs.h diff --git a/slsDetectorSoftware/jctbDetectorServer/firmware_funcs.c b/slsDetectorSoftware/jctbDetectorServer/firmware_funcs.c index 2dea73656..dcaa581be 100755 --- a/slsDetectorSoftware/jctbDetectorServer/firmware_funcs.c +++ b/slsDetectorSoftware/jctbDetectorServer/firmware_funcs.c @@ -120,23 +120,23 @@ int withGotthard = 0; * why is this used anywhere instead of macro*/ int nChans=NCHAN; int nChips=NCHIP; -int nDacs=NDAC; -int nAdcs=NADC; +//int nDacs;//=NDAC; +//int nAdcs=NADC; extern enum detectorType myDetectorType; /** for jungfrau reinitializing macro later in server_funcs.c in initDetector*/ -extern int N_CHAN; -extern int N_CHIP; -extern int N_DAC; -extern int N_ADC; -extern int N_CHANS; + extern int N_CHAN; + extern int N_CHIP; + extern int N_DAC; + extern int N_ADC; + extern int N_CHANS; int analogEnable=1; int digitalEnable=0; - +int vLimit=-100; @@ -1267,10 +1267,8 @@ u_int32_t testRAM(void) { int getNModBoard() { -if(myDetectorType == JUNGFRAU) - return 1; -else - return 32;//nModX; + + return 1; } int setNMod(int n) { @@ -1489,7 +1487,7 @@ int setROI(int nroi,ROI* arg,int *retvalsize, int *ret) { // ROI retval[MAX_ROIS]; int i, ich; - adcDisableMask=0xfffffffff; /*warning: integer constant is too large for ‘long’ type,warning: large integer implicitly truncated to unsigned type*/ + adcDisableMask=0xffffffff; printf("Setting ROI\n"); if (nroi>=0) { @@ -1691,10 +1689,10 @@ int initHighVoltage(int val, int imod){ u_int32_t offw,codata; u_int16_t valw, dacvalue; - int iru,i,ddx,csdx,cdx; - float alpha=0.55, fval=val; + int i,ddx,csdx,cdx;//iru, + float alpha=0.55;//, fval=val; - if (val>=0) { + if (val!=-1) { if (val<60) { dacvalue=0; @@ -1705,35 +1703,44 @@ int initHighVoltage(int val, int imod){ } else { dacvalue=1.+(200.-val)/alpha; val=200.-(dacvalue-1)*alpha; - } + } printf ("****************************** setting val %d, dacval %d\n",val, dacvalue); - offw=DAC_REG; + + if (val>=0) { + + offw=DAC_REG; - ddx=8; csdx=10; cdx=9; - codata=((dacvalue)&0xff); + ddx=8; csdx=10; cdx=9; + codata=((dacvalue)&0xff); - valw=0xffff; bus_w(offw,(valw)); // start point - valw=((valw&(~(0x1<>(7-i))&0x1)< 1 ) { sum += *addr++; count -= 2; @@ -1975,7 +1982,7 @@ volatile u_int32_t conf= bus_r(CONFIG_REG); usleep(10000); bus_w(CONFIG_REG,conf | GB10_NOT_CPU_BIT); printf("System status register is %08x\n",bus_r(SYSTEM_STATUS_REG)); - return; + return OK; } @@ -2158,7 +2165,7 @@ u_int32_t fifo_full(void) u_int16_t* fifo_read_event(int ns) { - int i=0, j, mask=1; + int i=0, mask=1;//j, volatile u_int16_t a; bus_w16(DUMMY_REG,0); if (ns==0) { @@ -2213,14 +2220,16 @@ u_int16_t* fifo_read_event(int ns) } } if (digitalEnable) { - printf("+"); + // printf("+"); bus_w16(DUMMY_REG,1<<9); // read strobe to digital fifo bus_w16(DUMMY_REG,0<<9); // read strobe to digital fifo *((u_int64_t*)now_ptr)=get64BitReg(FIFO_DIGITAL_DATA_LSB_REG,FIFO_DIGITAL_DATA_MSB_REG); + //bit17 is clkout + printf("%d",(*((u_int64_t*)now_ptr)>>17)&1); now_ptr+=8; - } + } // bus_w16(DUMMY_REG,0); // /* #ifdef TIMEDBG */ @@ -2544,16 +2553,16 @@ int writeADC(int addr, int val) { int prepareSlowADCSeq() { - u_int16_t vv=0x3c40; + // u_int16_t vv=0x3c40; u_int16_t codata=( 1<<13) | (7<<10) | (7<<7) | (1<<6) | (0<<3) | (2<<1) | 1; u_int32_t valw; - int i, obit, ibit; + int obit, ibit; int cnv_bit=16, sdi_bit=17, sck_bit=18; - int oval=0; + // int oval=0; printf("Codata is %04x\n",codata); @@ -2601,25 +2610,25 @@ int prepareSlowADCSeq() { bus_w(ADC_WRITE_REG,(valw)); usleep(20); - + return 0; } int prepareSlowADC(int ichan) { - u_int16_t vv=0x3c40; + // u_int16_t vv=0x3c40; // u_int16_t codata=( 1<<13) | (7<<10) | (7<<7) | (1<<6) | (0<<3) | (2<<1) | 1; u_int16_t codata=(1<<13) | (7<<10) | (ichan<<7) | (1<<6) | (0<<3) | (0<<1) | 1; //read single channel if (ichan<0) codata=( 1<<13) | (3<<10) | (7<7) | (1<<6) | (0<<3) | (0<<1) | 1; u_int32_t valw; - int i, obit, ibit; + int obit, ibit; int cnv_bit=16, sdi_bit=17, sck_bit=18; - int oval=0; + // int oval=0; printf("Codata is %04x\n",codata); @@ -2667,7 +2676,7 @@ int prepareSlowADC(int ichan) { bus_w(ADC_WRITE_REG,(valw)); usleep(20); - + return 0; } @@ -2677,13 +2686,13 @@ int prepareSlowADC(int ichan) { int readSlowADC(int ichan) { - u_int16_t vv=0x3c40; + // u_int16_t vv=0x3c40; // u_int16_t codata=( 1<<13) | (7<<10) | (ichan<<7) | (1<<6) | (0<<3) | (0<<1) | 1; //read single channel u_int32_t valw; - int i, obit, ibit; + int i, obit; - int cnv_bit=16, sdi_bit=17, sck_bit=18; + int cnv_bit=16, sck_bit=18; int oval=0; @@ -3114,57 +3123,57 @@ int setSynchronization(int s) { int readCounterBlock(int startACQ, short int CounterVals[]){ - //char *counterVals=NULL; - //counterVals=realloc(counterVals,dataBytes); +/* //char *counterVals=NULL; */ +/* //counterVals=realloc(counterVals,dataBytes); */ - u_int32_t val; - volatile u_int16_t *ptr; +/* u_int32_t val; */ +/* volatile u_int16_t *ptr; */ - u_int32_t address = COUNTER_MEMORY_REG; - ptr=(u_int16_t*)(CSP0BASE+address*2); +/* u_int32_t address = COUNTER_MEMORY_REG; */ +/* ptr=(u_int16_t*)(CSP0BASE+address*2); */ - if (runBusy()) { - if(stopStateMachine()==FAIL) - return FAIL; - //waiting for the last frame read to be done - while(runBusy()) usleep(500); -#ifdef VERBOSE - printf("State machine stopped\n"); -#endif - } +/* if (runBusy()) { */ +/* if(stopStateMachine()==FAIL) */ +/* return FAIL; */ +/* //waiting for the last frame read to be done */ +/* while(runBusy()) usleep(500); */ +/* #ifdef VERBOSE */ +/* printf("State machine stopped\n"); */ +/* #endif */ +/* } */ - val=bus_r(MULTI_PURPOSE_REG); -#ifdef VERBOSE - printf("Value of multipurpose reg:%d\n",bus_r(MULTI_PURPOSE_REG)); -#endif +/* val=bus_r(MULTI_PURPOSE_REG); */ +/* #ifdef VERBOSE */ +/* printf("Value of multipurpose reg:%d\n",bus_r(MULTI_PURPOSE_REG)); */ +/* #endif */ - memcpy(CounterVals,ptr,dataBytes); /*warning: passing argument 2 of ‘memcpy’ discards qualifiers from pointer target type*/ -#ifdef VERBOSE - int i; - printf("Copied counter memory block with size of %d bytes..\n",dataBytes); - for(i=0;i<6;i++) - printf("%d: %d\t",i,CounterVals[i]); -#endif +/* memcpy(CounterVals,ptr,dataBytes); /\*warning: passing argument 2 of ‘memcpy’ discards qualifiers from pointer target type*\/ */ +/* #ifdef VERBOSE */ +/* int i; */ +/* printf("Copied counter memory block with size of %d bytes..\n",dataBytes); */ +/* for(i=0;i<6;i++) */ +/* printf("%d: %d\t",i,CounterVals[i]); */ +/* #endif */ - bus_w(MULTI_PURPOSE_REG,(val&~RESET_COUNTER_BIT)); -#ifdef VERBOSE - printf("\nClearing bit 2 of multipurpose reg:%d\n",bus_r(MULTI_PURPOSE_REG)); -#endif +/* bus_w(MULTI_PURPOSE_REG,(val&~RESET_COUNTER_BIT)); */ +/* #ifdef VERBOSE */ +/* printf("\nClearing bit 2 of multipurpose reg:%d\n",bus_r(MULTI_PURPOSE_REG)); */ +/* #endif */ - if(startACQ==1){ - startStateMachine(); - if(runBusy()) - printf("State machine RUNNING\n"); - else - printf("State machine IDLE\n"); - } +/* if(startACQ==1){ */ +/* startStateMachine(); */ +/* if(runBusy()) */ +/* printf("State machine RUNNING\n"); */ +/* else */ +/* printf("State machine IDLE\n"); */ +/* } */ -/* if(sizeof(CounterVals)<=0){ - printf("ERROR:size of counterVals=%d\n",(int)sizeof(CounterVals)); - return FAIL; - }*/ +/* /\* if(sizeof(CounterVals)<=0){ */ +/* printf("ERROR:size of counterVals=%d\n",(int)sizeof(CounterVals)); */ +/* return FAIL; */ +/* }*\/ */ return OK; @@ -3174,67 +3183,67 @@ int readCounterBlock(int startACQ, short int CounterVals[]){ int resetCounterBlock(int startACQ){ + int ret = OK; - char *counterVals=NULL; - counterVals=realloc(counterVals,dataBytes); +/* char *counterVals=NULL; */ +/* counterVals=realloc(counterVals,dataBytes); */ - int ret = OK; - u_int32_t val; - volatile u_int16_t *ptr; +/* u_int32_t val; */ +/* volatile u_int16_t *ptr; */ - u_int32_t address = COUNTER_MEMORY_REG; - ptr=(u_int16_t*)(CSP0BASE+address*2); +/* u_int32_t address = COUNTER_MEMORY_REG; */ +/* ptr=(u_int16_t*)(CSP0BASE+address*2); */ - if (runBusy()) { - if(stopStateMachine()==FAIL) - return FAIL; - //waiting for the last frame read to be done - while(runBusy()) usleep(500); -#ifdef VERBOSE - printf("State machine stopped\n"); -#endif - } +/* if (runBusy()) { */ +/* if(stopStateMachine()==FAIL) */ +/* return FAIL; */ +/* //waiting for the last frame read to be done */ +/* while(runBusy()) usleep(500); */ +/* #ifdef VERBOSE */ +/* printf("State machine stopped\n"); */ +/* #endif */ +/* } */ - val=bus_r(MULTI_PURPOSE_REG); -#ifdef VERBOSE - printf("Value of multipurpose reg:%d\n",bus_r(MULTI_PURPOSE_REG)); -#endif +/* val=bus_r(MULTI_PURPOSE_REG); */ +/* #ifdef VERBOSE */ +/* printf("Value of multipurpose reg:%d\n",bus_r(MULTI_PURPOSE_REG)); */ +/* #endif */ - bus_w(MULTI_PURPOSE_REG,(val|RESET_COUNTER_BIT)); -#ifdef VERBOSE - printf("Setting bit 2 of multipurpose reg:%d\n",bus_r(MULTI_PURPOSE_REG)); -#endif +/* bus_w(MULTI_PURPOSE_REG,(val|RESET_COUNTER_BIT)); */ +/* #ifdef VERBOSE */ +/* printf("Setting bit 2 of multipurpose reg:%d\n",bus_r(MULTI_PURPOSE_REG)); */ +/* #endif */ - memcpy(counterVals,ptr,dataBytes);/*warning: passing argument 2 of ‘memcpy’ discards qualifiers from pointer target type*/ -#ifdef VERBOSE - int i; - printf("Copied counter memory block with size of %d bytes..\n",(int)sizeof(counterVals)); - for(i=0;i<6;i=i+2) - printf("%d: %d\t",i,*(counterVals+i)); -#endif +/* memcpy(counterVals,ptr,dataBytes);/\*warning: passing argument 2 of ‘memcpy’ discards qualifiers from pointer target type*\/ */ +/* #ifdef VERBOSE */ +/* int i; */ +/* printf("Copied counter memory block with size of %d bytes..\n",(int)sizeof(counterVals)); */ +/* for(i=0;i<6;i=i+2) */ +/* printf("%d: %d\t",i,*(counterVals+i)); */ +/* #endif */ - bus_w(MULTI_PURPOSE_REG,(val&~RESET_COUNTER_BIT)); -#ifdef VERBOSE - printf("\nClearing bit 2 of multipurpose reg:%d\n",bus_r(MULTI_PURPOSE_REG)); -#endif +/* bus_w(MULTI_PURPOSE_REG,(val&~RESET_COUNTER_BIT)); */ +/* #ifdef VERBOSE */ +/* printf("\nClearing bit 2 of multipurpose reg:%d\n",bus_r(MULTI_PURPOSE_REG)); */ +/* #endif */ - if(startACQ==1){ - startStateMachine(); - if(runBusy()) - printf("State machine RUNNING\n"); - else - printf("State machine IDLE\n"); - } +/* if(startACQ==1){ */ +/* startStateMachine(); */ +/* if(runBusy()) */ +/* printf("State machine RUNNING\n"); */ +/* else */ +/* printf("State machine IDLE\n"); */ +/* } */ - if(sizeof(counterVals)<=0){ - printf("ERROR:size of counterVals=%d\n",(int)sizeof(counterVals)); - ret = FAIL; - } +/* if(sizeof(counterVals)<=0){ */ +/* printf("ERROR:size of counterVals=%d\n",(int)sizeof(counterVals)); */ +/* ret = FAIL; */ +/* } */ return ret; @@ -3401,7 +3410,8 @@ uint64_t writePatternWord(int addr, uint64_t word) { return readPatternWord(addr); } uint64_t writePatternIOControl(uint64_t word) { - if (word!=0xffffffffffffffff) { /*warning: integer constant is too large for ‘long’ type*/ + uint64_t c=0xffffffffffffffffULL; + if (word!=c) { /*warning: integer constant is too large for ‘long’ type*/ // printf("%llx %llx %lld",get64BitReg(PATTERN_IOCTRL_REG_LSB,PATTERN_IOCTRL_REG_MSB),word); set64BitReg(word,PATTERN_IOCTRL_REG_LSB,PATTERN_IOCTRL_REG_MSB); // printf("************ write IOCTRL (%x)\n",PATTERN_IOCTRL_REG_MSB); @@ -3410,7 +3420,8 @@ uint64_t writePatternIOControl(uint64_t word) { } uint64_t writePatternClkControl(uint64_t word) { - if (word!=0xffffffffffffffff) set64BitReg(word,PATTERN_IOCLKCTRL_REG_LSB,PATTERN_IOCLKCTRL_REG_MSB);/*warning: integer constant is too large for ‘long’ type*/ + uint64_t c=0xffffffffffffffffULL; + if (word!=c) set64BitReg(word,PATTERN_IOCLKCTRL_REG_LSB,PATTERN_IOCLKCTRL_REG_MSB);/*warning: integer constant is too large for ‘long’ type*/ return get64BitReg(PATTERN_IOCLKCTRL_REG_LSB,PATTERN_IOCLKCTRL_REG_MSB); } @@ -3555,7 +3566,7 @@ void initDac(int dacnum) { printf("data bit=%d, clkbit=%d, csbit=%d",ddx,cdx,csdx); - codata=((((0x6)<<4)+((0xf))<<16)+((0x0<<4)&0xfff0)); /*warning: suggest parentheses around + or - inside shift*/ + codata=(((0x6)<<4)|((0xf)<<16)|((0x0<<4)&0xfff0)); valw=0xffff; bus_w(offw,(valw)); // start point valw=((valw&(~(0x1<=0) { printf("vpower\n"); - dacval=((vmax-val)*4095)/(vmax-vmin); - if (dacval<0) - dacval=0; - if (dacval>4095) - dacval=-100; - if (val==-100) - dacval=-100; + dacval=((vmax-val)*4095)/(vmax-vmin); + if (dacval<0) + dacval=0; + if (dacval>4095) + dacval=-100; + if (val==-100) + dacval=-100; + - } else { + } else if (dacindex>=0) { printf("vchip\n"); - dacval=((2700-val)*4095)/1000; - if (dacval<0) - dacval=0; - if (dacval>4095) - dacval=4095; + dacval=((2700-val)*4095)/1000; + if (dacval<0) + dacval=0; + if (dacval>4095) + dacval=4095; + + } else { + vLimit=val; + printf("vlimit %d\n",vLimit ); } + } if (pwrindex>=0 && val!=-1) { @@ -3746,12 +3767,16 @@ int setPower(int ind, int val) { retval1=retval; } else retval1=0; - } else { + } else if (dacindex>=0) { if (retval>=0) { retval1=2700-(retval*1000)/4095; - printf("Vchip id %d mV\n",vmax); + printf("Vchip is %d mV\n",vmax); } else retval1=-1; + } else { + printf("Get vlimit %d\n",vLimit); + retval=vLimit; + retval1=vLimit; } /* switch (ind) { */ @@ -3781,15 +3806,17 @@ int setPower(int ind, int val) { int powerChip(int arg) { //#ifndef CTB - u_int32_t preg=bus_r(POWER_ON_REG); - if (arg>=0) { - if (arg) - bus_w(POWER_ON_REG,preg|0xffff0000); - else - bus_w(POWER_ON_REG,preg&0x0000ffff); - preg=bus_r(POWER_ON_REG); + + u_int32_t preg=bus_r(POWER_ON_REG); + if (myDetectorType!=JUNGFRAUCTB) { + if (arg>=0) { + if (arg) + bus_w(POWER_ON_REG,preg|0xffff0000); + else + bus_w(POWER_ON_REG,preg&0x0000ffff); + preg=bus_r(POWER_ON_REG); + } } - printf("Power register is %08x\n",preg); if (preg&0xffff0000) return 1; @@ -3799,10 +3826,50 @@ int powerChip(int arg) { +int vLimitCompliant(int val_mV) { + int ret=0; + + if (vLimit>0) { + if (val_mV<=vLimit) ret=1; + } else ret=1; + + return ret; + + +} +int dacSPI(int codata) { + u_int32_t offw; + int valw, vv; + int i, ddx,cdx; + ddx=0; cdx=1; + offw=DAC_REG; + valw=bus_r(offw); + // codata=((cmd&0xf)<>(24-i)))&0x1); - - valw=(valw&(~(0x1<>(24-i))&0x1)<>(24-i))&0x1)); - - - valw=((valw&(~(0x1<=0) { + cmd=0x3; - - // printf("data bit=%d, clkbit=%d, csbit=%d",ddx,cdx,csdx); - - //modified to power down single channels - - // codata=((((0x2)<<4)+((dacch)&0xf))<<16)+((dacvalue<<4)&0xfff0); - codata=(0x3)<>(24-i)))&0x1); - valw=(valw&(~(0x1<>(24-i))&0x1)<>(24-i))&0x1)); + /* for (i=1;i<25;i++) { */ + /* // printf("%d",((codata>>(24-i)))&0x1); */ + /* valw=(valw&(~(0x1<>(24-i))&0x1)<>(24-i))&0x1)); */ - valw=((valw&(~(0x1<a$}MW$T`McDmnALJ(KSO;=lePL&YgP)(e3@de>`xXU+0|X zJm)#jdCv1=w!g1G_=G-X&iK3{hGD`HvKe-fjbYz8!LVPHG7QH^-%PXxdF=FizxujH zILI2SvlFH;i^2qE(SKZHg)aE&vS{cYt6*js3MY5G{9C(8!uEGMAQ+!xPK7ayA%)8m zTn7vYR$<=(2BFA2S#Z9?6?Vkm>V1PE>X2G@p!(DxW8HyFVdpy(WAT3uGf}wua3lgh zh_&b%H}NIxp#IiHtYBTlh}?6GVKCR|)|(@X>zu5<17{WT7BLjW=1u%TwwHY&iY{D~ zB{aRGLtw;9TN%Ry6e~qB1hIZoq-{j=WBy-FjqZvMxr!F2zJN>RsxyTu)T}~@zi(p< zgIXckhS~_?pEv1k7SukD+WO+q`Ug?}U@Qu~1pwh3WAk}Bn5@E4R7DUsZsJRI{iBSF zS;4rN5v#WGPF;*eCifn5!aPP?4^pW`iHjKu;=KW68%&JN>8W;Gg#zRth?_R?XLJd6 z2VglCn}pi-K3A3*FgJ0gE4#Z?Ckwu7H8V4XEy&-Z$#-lbAO`^iLA-C1T#jlE->wG= zJxF%C&$}6MB2(q|W-;Q}0bWn8aKsyh;B|An7kU2~05XkM!Dj~`9{^o``tn?2X_AQ% z2kSVKQh}>x#GeN=cp6aYH0zT7-*<=09WPk?di~E`wdGdcVHKEChJyIT(~QJqOVeY1 z_LL-;Oj$eTl%8pEjo8D8Uk%Y4qQED+0TmEL_tSbCBj#*p@b~jny%{V-4uW{*X_LU{ z8S#jeYDOx8C_HVcWeii%h76=+l#Zyq;$*~s0 zFqPoHoEpsM{~X@A{pQs6`tHW_d~J9S``T0vxQhX^xU{nwWuNvzN_-xlJ5%V)u)>%u zedPPGR$(1VAc*--M?yfV5UUE%@FZwp#0OHnQ@kGV+n_fda`!ZhGn{z6_~mx1P0$l!Ag_^c|@h7rJ1NyK$Y68 zL+s>VP>|(F^}?4hLim!2$Vm&<^J;J<+3XzOJBW->Q(LYKsrb;k)+!iL9YO3KtW4x+ z302TVS6hWNltvK!8(W-=;SnPvUQIO#`ONhEcmcXgTrxzCvB2<$z<0b|>gr-m*8M|> z1osfVxn-_Z@H3f3&=&xWAbz=#5%Xr`3KzkFi~FOia|Iv1eEYfTdaFJ^S1^Ku#ya9y zF=`-)D>o`6a@7-UdVLtji2Emkm`N>jFVAH}`->yxk6%W~|KAG4AIy;BQv>N^5NE{V zVf6PkR0dZj6QPqww1+&b208>WYok>-c7#F56dX%1(w8hnnRZ(-g6lDY>!GobTD2q@ zsaLjuO#8>6^W#im8=lNVMbBS@|M>FEI9KDUc zk7wv@mHFj@-_M8!aE->Dr5&aOhB?)qsdJHP$T!!{t8*rxbk92)J&kUrV>qX`c|D1y z2DifyVdRHJ#zY+RvcfShUl3`uJJApXvExRco5Wce%gia3p`jLSqJbe-;PP3hVJMXj z&?y}_UKu#?=rw)hnb=&Ei$bsp*#-uIYffR*v~5V+W*~7=O8Gi6cEQ)N%B3c)?gYMe zYS5%KbY_Hx&fFfg%x(@NiYw5hoQP(G6VX+gl&UTmuU#56DJQz3OjmBN3g>EfMzCM) zUiFrmw8h8>TZ|2wl$|{pVP{WHn{pdcZY$8FT&rEF*Q6!h4sCfm*W6Q+<{W^|8^ATkY0~1786hs2 zYrajBwhd|9kQS>+J9r1=^A0=L+*^}anZgK_DO__OO;ZwX4n>QHa?SlT1#NdSg6&SOxxXfj z8_o#aaIX1wOpA41KLPcjz^&Hjx0Fx0?4$@t!pmhr*;}_pPxkYy2H?!Q)^vCt*cAEMy>G8 zWG6;mw=_jwXAA|LqK07-VNS=S^D!o!kEIxwEO1wAW|9>)vPM#?h5<-RY9R~GxD?jn z(k$~#!2G&eg`&3`h5)DnMsG+CR!Kya#HCr7Aan=>HgA2bNdcIF+zbHB0>Hi1GLeR0 zZZ>kWk$VNXe}WmA2qNm7xn|P&;_W_<424qoHJu|&Um>YA4~hYzc)lm2oacWP74AFSfPi#E<1KdjNC z2bGPUcG6!xAZz(VFKze%7sX_*f68bGen zzq7y_>fg4>{q-6CKo^tUWv=oJMt>>-D33|mP@*x}9;-iE1^shyl_yry?~EbFNb4k( zX|4Nt!c){)POPFBEK#%=!i+|w=bO=C!z3H(Ouq&clchU8!0eO#Zr+Q>_-DGt&sGF1 z2d&RpmX6jheMTJ}hx^^Cv+jF_tTim*AXl*7#OKTnl5Ek)Q@Weyqhq?>wjOlctQQ{R zGh+q@d!ZC`lrGzVk<}G+%${edC0#N1mULX-#P5#j-FMB<29MwwZeqmmhjM0}nT5~@ z=sW@Ia%NKmzWKYc`qBnGb zFD9p3RWp_P&JbOfX9pYriVPh@Ll1(n>!0`@WwEN7cpqQTqdVWwJzV$V{lU*aJs^GR zd&KD2Vtgj>)*hX7&(6VTl8${aSnjqG>2r6FD0^9|*K;pAwrHr!a}WM^vU)vt;r~LU z=bKbbcA)RAn0hys_5WWyuuD@PBfh_`r>P1|ID$3vk#}f$5csP0dJLv=u%ZDygdlES zN6aB~M*Nr62?_En5ak}^aJ``&zzW=nbeK4Y(-IC0Bafm=@EByJ>eYLVulp?ztp zznPx;Y$GWV2Ubm0?odr?43UCpNWo3iQ72j@ik5YxV$zIW{=Hs3dqzSHAIhRRXkC&w z%jt@NcDeot_JbT;?n44%;qWMbIl}1UEb(8em9(NYRNry02 zNLe0+@DXbHTtoKg%pJ@cRmAcy(7Xj}`MO^HQxD(n z&GH6XoRZ{~db&ekU~NO;ZBpT}Yomg51<%FC*du|lwNUuu1I^I1LNPVZ2lHIY{44ph zy1<{s*c=$?jhc~MhgQ}tC)4xkKVrrGP>XX8zQ2tRjud-v0IT+9*&p=)RN!`bY!I4K zw`@m7!Xl|hJL;DUX!P+4J-iD|h&M^`h6<>CfG0VBQw84!^obI5D;DeFkFbJ0{E@xx z_tD9XZu1`29A)l`ZhpOj5fkBO!74v83@mg&0XyIYb-<(Gg(NcuU9>7hdc%#{%%R~y z>uI&7LPQtHzN%|oiw#Z|L~dNY_Bm2GSUivC8c+vl;u!FVK69~owZ)5nvEQJ(e) zyh)ER;`9nDoEGq1N+lR^&H}xeHQVy_g>pG7${~o^715?lw+T?{t#CkehG%Ah4A`IZn<-L&5h$@XzmDkIIeH84XF4gesJ_^6?qm1}` zImv|s1eu}50=*e5sdi=`sWW>TYtix;)I|_im)9yCVwZa4$@x{1OWcG42;#!>2uxyR zEYn}AnuHt#@quy&bYL{tSqp8I@u&{rE%!$uT558+I>yNYBx}uqd4SY4jgPLT1`w_{ zbjMO;tfI~$P0B<-Gn!n`-$zMP?N{VT+U$HV&%wXkyQgYHJqjD@(F&m1ge5B(99j7O zuFtLX+RF9(rQX?g2ioX(lzRJphdQx40MPO1VWb{&DAs6utWikyeN^c3bTl0TGmTf- z0_=8-c0rjr&|=c_G+RW%(%%NS+W?mqMbA3afh%(cGA65E-rc8PguJfioBAZjD4O~p z2srrY^Js-w$tRf7dMQrUN_`m2kVZ^vio2CBHT9mZOfGHdg~nUxh2D-1CNDa&0h*`^ z-Mbg$?zqbloUZt0Q-(rcQhZX7;|-v%L833K5|jNyb&`(V-1}D6^FXW(Fkd8sC^0Y-+E5Np^XdbJZMnP|mEUa#x|VuENbuDdPGD zY5F5~u|DJ2?8Lv_{@ocGrIJmg33W^qXioN%Mp&0s3F z<_D*#e$`n6|BIlpi-Bfpi+#@gkTO5$8-I=2Ti*; z6pmZ*B?|vbD(sU$`Y;7(L0VACB9%HKl~Pn6SKV+xX%ScL#kV3*YHGdJg>;2ujrhj? zPZ<92yZTR?UbF)4(-n+(a&=XmGTBxgAO$-{v-WIDY#g@`n}4n5r`>KgE}UBBIbR2l zfiz@Qso`I`JvgQsZ|~l}(|U!IjHqAVD6s&4McsOZ9oW37-~gQ zy+5n6;TF9=xsqf<;S$M1b|tL`y9-g-y( zWM!&R_0kvx5a5(+;W+Nd2o71bxM8ilGN8$bl#eMG(Fq?nXG zsY+4lK8m_WCB3w+LQCt7cC@xXT2py(Ww;6M7Bg8EdN>@__M8IzQ<9P@s?eB1{G@?> z6mm)jCI#6TUIu4j*y{aVJS4r@9St3IM;LY%kzfYRTyruoN3HbxIyCI44Sfx$zjVOm8zE;Ms8ElN&g(!kJ zt&DdL?q$DMxLW>n9~YY;!o=Oh>M5yWdNOsG8- zx#a@mP_QwNVIA-ox^x9!YL1D@K@>s!eg(hD+}*wfQ3Ubx6-0ku(9(pIrpE|dyCD5N zLg>$4jlJO2jQI8nqMr^^Y(WZwxO)ZB-+-}&#gEX0)TY%0sd0rW^H*16yJqzTq@G_9 z6{)WAQ-%bGVBwI_c2%54hbV^Oh#kcq<5903o9imr)`RXjpp1DO%b3R%iD1NKD>6|J zL)r_)2VuzUuH+#uEfy@@1JLc>!s-K__e_j9-%NUxF-*hcSP#VYUf6`i!EY=AkHOJ( z>>Uo~kr!WH$>k-JNc;avNs^^R5QHEOZbitoZo#_MdNZAZ$fRQsw2ZT&3WC^ug;Ip< zF!`87m+Cqvda@fS9~;Wq9w$}EuDBm$hx4DO_Oz><0=xTh#dK0e85E_DV*v!nzdfp? z!8!eCKlF%PiwoiJc9h=!crQ#cciYwS<&UZZpVqlbT_fs(*SBk!UD2&Ivsa?kGAe%4 z&_S9WPYdbsfxolI*FGBByLaAzFeQkvu=)zNP8ji?fpt#5xX%wum>-$eEx1(iqP5<~ zH`o~Q@ETRibm?}hrOF#?_)TfO#w+Yq=e%dvki}C48ETJFA?IVXK0+x^qH(II_YF3j zKbvL>>iyQTefE+2OoF={YvcJgeN--2F8RIV*5I7L8pZGJmDZhm5}lqsp7B_&eF4d+ zmttcAu@(I&&k~5)`crI3AU28e?4D$dZKXZOz>;H+p9D+drS`-Hik^@vb_>L!rC2Ap zDXTmu-D+(gYWpB;)l#cD4IdUhqH;i9=*qn6XiQV8Gvdrgpd`^g1Tp3j)s>wX;{#){ z=b-9+>#)=yLeU!P#yyWyH^L`?Zx)q&H}wKaW9g45J;0^u4GYDV9`qS3{eC11DiTEm%zWU&6zVy`#U+bi=ZYKGp(m19;O)vAY zpsNpSZ#_2Sm645fQltF2;X_P%c&re_=;cZ`W(sk37#Q|XY;cjR=B*ZWO{Wf)_g2%S zsfq+n-~|T-EylZ{8ywj6rBW*3)*~c&c{}o>iJJ#CNGp<#L4nH@EFi*Sr}g9d4y)DH z^Np6^1QapC8dL>EC|+bgfZ`KYt8K68aw|Vk>S})7h?GQS=qv{eq(xX zdpNcSz38r37@+%rf1h3HHY^*Lz2$b&u`ubhMwZ~U>kw3fxzjQ)1c%coE5<;6ZoLDY z?11}csS*7_8=A6cxS|^+T(^ z#zDu|sPX+uK6!M4CG&i*U;*W9aGBClMtl|NdhC7$ z>+{i=7#ihq+XupyDP))9>`S?FZU&oTrOMFfE5`JX3vH{dv(FQS11KlzSp@#b7>h~i z3bheu%HX+2BM?MmDIaH5HwD!~pQBJE3L%KUEpB~q;>HC`!!2~p@Y256fWVGLm_9O^ z+pC%McB65-%P}4FFD-!ncwz-1Is|{IRX76V2;#NHF6qek`6yZJJHjC>IbDKBl?K5n z-r%_djBD^{fgcC({|9CL}ZT^d_p6v7d zPbf9i6aW(_wI^6=4&P^NkJPGk2avGjPC@gY>ll=GOsI6VKp7XxcxhU}my8`B9Dw=? zR?t_xj;dW(Bnua>O>Ts~*f05|N*X{8PwBu3bzEWSg*EmTP7UR1hcRB4XcQiDv^P6d;X(5?z8N z>RZ7$9w@=Wz>`k^&=M%6f}tRCi?|U@2mRQALjr=RU&J5GPE4L&5hhHpIFG4t=^ipU zx}zCCJv^f6fIq#-gW?VpM-YXF`KWPuqcOq6@tw#= z5MKp|I)HE^Z6DGQ#O)9BTgK&?k0N?h0#SMch`*w^5BUhJK*GMY6I-J3l%?)CoFiP#WkdP5KlQo7$TaI+^E!44YVF##V;@#bSXzX;iV53C= zta14zP8_CaKHEfdkV}mqrg80Ia47*?stt_kr2+Na_Au-ywOHvCvQlp}OX#E`QE?M9 z&46PgWq)XgGyRNM%E#vRRcOo3RcGoJ(AKh+jE6UuskB{>yj2fAw~VmWk&EN2CanuH)VK~Bd)?PyXya1VKs4Wy=uel@YzJN#`u!J4xaq{)2Misy zAOg!$5{02D1P&LNV9UtHBfmEX07CB8z)aghb zORDwU1-eGDpjt1Xrp+hP>0~Kv47ivY(Hl2k0Ei_g9oF;>$WtX`*lRqxnJWuZH}h@bX3yv1cShTSCDP>rZ_y+p3XSOu?N(A zFU9nxg249vT~b_iq3}RJn;GiTpPw^z;hUe;nrC%S1rer!uoK~junGpyi6C~IM~0_L#y9P5Amhuz z!h{Y3sV!=;+8c|Fzbj9dd>-a%Uor|2Osik7Q=~8=!C>4#$u#|A*d}_ z^pJ`o0VtH^Ge5d0B`8ShLBzKg@oS2@&sTa*U5q#vk-w%2r{$bDLZ&DvnnrFscj&sA znt&)pJ>)`{binR9sk{gHYeli?%2;O%bb!$1p#y|2$VTe}g#U6kh8)fL>OsEn?i7VL z>+a5;b0ggmpj*3ExpCTq)JfCcO|>+rUh-g1X#fa=_~dD((Rt`<1To`5Qvce~AfGs< zW7CT6Wx{=uR@X>j<+OCWzAj48*WqN7KAdySE%p4_#MvTkI*gIdOK2K!U{Q+wA0R>y z-zcsDPvCBIPcS=hOV4B@FHEGZ3(9|A%Gt`AeQ*zB^|rXmV|j%US1c}TKJO=UzrkIB z^p{H=AXA0+#DLdF~8uR6#H^4 zqL+Ux-^A-u{e`>5mRW>bf!2y?nMkL+iVwRw$gSIj_7VbMq#X$P8>x-BZP-|kQx(Ay zU8+aEf~&|+VDIyZ2F=dr++xcsx!{h(As!bWI|#eL2n2CjF>jilV{gJW$0l5JlyN5r z4hFXMLU;@r7~ap8V%OdQ8I>_YMsX(`*S>M|7xipD*93FpL-P4V;&;2bG&zzJz$(-M z4T5-RZfd*_eb5~i^WAgl5_mjz{X4^Mo&rrX3vQ2{|bJ+~JsFdcjJq@{6G ze1kh_3Jw%tZP`@M$IM8K2z-v7VVo|1sthAfaRU_4VH^!ASxg$%VR#OR83{4`RuZNr zU_uaIz*(06%;8dLopKdv2x2wTPS4@roYBjE^hpr(q~c(=3TDI+#5?ECF1Js_PIrf%|Z-8G|ioiSTSM4bEh#`pQ=ENbk6EOtw)SPaJ?M4hi6z0$gnSF>M zh+og4d#?u(LlFNyr)6%P>rNAt^gO*e9-Vp=oqDw1fllSnmGO&aHG=U*vmzOa#0vjK zVr5B*u5NUt17oEQkE6dlR@{Y&Yg7wH_nX z40W8e%u~MKI&<&yI^9DyzViOWLB*Bmg31xKP@1!E!;V+k6Hy4!)t1`!M_6kkltGI# zr{JWU_SX(Qz<+&ze=8ha(mmg!5WJ(%Tb&o&xUk z&X%FL@TXFA)dK{%t(6R-&LK=uk12HH9Mezh9sUlQ8 z3IsdQ))V+f5NF*>>IiHOoXcV17K49F1CQS~KOsT}&7YWGseCS2kf?laS&$Ud1TEh5 z4mG0@kP*b|Gx>%E2@!Gz-?AWMbm!ug@I?2)G?E9+ork#%hr&1DFvte7Mj~w$SQ3WK z(dJr^YuRuB;``oAe(4{c*X^IrcUqXBdu2YKx-ePy%zXa-g=wbc^U0nP+$LcvF8TY# zudkCzux`MX^9ER3Gx@y>&APn#eA7ZpcQZV1<~n)QM^~GKDi+JCEI#$&#F!!=E84Ib zQc2{vfppIde!;`NI+X!Z*@nGtN_ueyzxm<*c5Twy8GGDGn3(-yl>a^qlv7~EsduJ2 zq1#XqL0mdRNiA?P9isxyQMp`!(+h8~Y=S5$jjbGIFzl-YlX2^m=dDAjsC_-Wkk2cwL)5UAY`IOce7+ z9M||G%!=uJr^UIwwOsGQw_vln{(6fu6Fot_!9Th<%`Uf{cC?41^AzOcG|0yVkpF$2 zOb`o#MqX1mTjwl*!c=*m2nrCy;^`d9t-P+})j4T|s@Qz8=<@?gJ7g$Sx1Ub?={tiD zh%gu&N*x$vfuRz{SgDOtJI~(3mzMT7D$#%5qqosGQd;=do253^&b*8Bq3_DF*8(zH zoHQQp;aV`>xC+d~0A~K9GBe{)A_VCwj4dNJsni(R84=uNCn@y_Ooj<>+1T*l12Y_= zr__M|?Zz6hQk6kW-$0cC486D^SK)UpjqA_?d@W?$;o$Y>OK*=T1wEyI93hj= zZ&_xF*ooAgf8-A=o0F_<5Lb=H=%bAur_ZfV&CRZvnXsq}26&+6_~p6XkE7=C8`{Ue zx;#;V->|&DT_%XS36_}W0Xnl203vga_|egLV=D2b6ZW7&OVcG;zxd^KOB-mwTo0+V7yca7F*rP?4C|2JY6p=3ieC7c$;x z9oj~3hmsdU-6Pi$+dve`Q>9Bu_BytfJ$_tSpMYS$wV>=OYdiz_M-a~z()<*&5y!gl zj?52*{F+tiW(%U0jkM$qzl)|ahGUE5We44QAT^tV5;+^syGhMnDCAGA8fM>s*_*{< z0jvEZnjeREy%A{YW@dI1wxja)jo7TAH>0G@ znq@Qiy^mRdTu-ALFiB^;c}7d>t&@*x31 zd~GUDGj76Z#!cA#z_*hA!c^J_=?-ov3LWp7NsL~N(gZ>7>i{bk{B&(vS$hC%`Xzr=t*2IJ))yPX+Uq))R~Aq+;qpb9V}UYa zek6ue6H=N2DPQNCgn2DQfgCY%Bggebt5ose1B^*~rGOjJUA~Om3{4B`Y>OJYbVHk&4xQQ!mw`?_JzmOy*F8=w#S`_vgV8a#@S_ia!qA;hT$WIi_~M1 zq*RkokGi9g4(r%HK^9=f7B9@Vmgi&7Yb*^iB5KJ*t#B_IC6nk6(~=mO4zJmG0$bK} z(cgk+7B`Kcj-O${iY!oHg`F~%5x0yl+p`K~twLNCBg~7dB0axhQW<3OLr_?mU+S^K zOIrZWTcOh;c;y^5zwR6{#ovl4HRo1J zJf037BZwd8uB=sb?D}(EOjPrQbGAG!yvNVUC1^HY5%})x7c0+cG#Y>JAN!bQo%5mk z;&bHvk>_Vx{*gB>4hlW4j$gI0(OwG7rBx&g(Yab9fld`&cBNwyo-Aqn@6I-Q+|CwE z=a2h+p39(el9Yb%tVtM$FSpY#{`G8nZN-N=2W!)tb0lr?#@WkGlQ2Ol`P$h7!Q7)>*V7hF2GSA4{2bc3?PMYX=KICs z5CY0`Seu|qu!buID2In|u(*)9lq1z!4xk9)g8}l^gS>Cg$mG3skIIR^^WRq8eOm;< zm<MVe$yTT z=JQxN`A<@6u3*JLwvsJvSZyqr&4?rNiNtt;Vg2IJGYYwb&QJs9;Z0X%9wwu}g129D zAuN)>RKwE|aJ3dzb6fQ_bi5#(v((xd!%(>SsD+*2WVu;!H3!=@TeYzZi@B{IXL++& zeP?bZxKW>#YvZCA9fwCJ^u+|XU@T+!dsj^z+~!f_*k^a^^QBGY;zL=~9yr{7!T>KO zrFIz#yCxPE=)15~-z6?sje+*-aEs(8rTu^TDG0DSDYXnxPS2hJNWcD)#LtI1R2qdX zz3RK*!g_2|#fPiP+fT#ST6D&h&OAdqqnoC z@JIQ?Gz)~lf=ASHg$#UUKpYNPl{b&*9ap*v{COeW@umG84rRDHK5@&s2>G}T|K=8( z@)@%=P5GR%bwk{(AoCZuT5nyT;Mo+rjLiXqvCc_4jBbMZ++}F5&uxNnd83$RgW-#gtfpCro|fAY6uWjk1jCQ zB}U;7ftOiLrg8XYtT8rY^DkRL%D+@I&OVSXn9zeAM&u)id$K3tQjsk3OHO0h>q+x0 zJT0fJIZcmjVP4mB#Qt9tv4ntL zdsZ&=>CG3AzYF;Y;+L>e>vb3#;%|7UI8X+xR!TF5JD}f`Sa85iMiFJe8{v+Szolgb z4&2s*kM*17r3Z1*Io3zVMy#piElKjJ@lepLLfA5@c7Z+7AxsL-<8_`WaPX@C3& z?Mxg6qv3-wWEVOxtSdoS6(%S$wy{kOdJx3sEY+BGLbw!qoIf~WJPj_Sw@%d5tx{?t zQoWv`rd5D6A7(dO7-eRym}c!ow8x@Y*4m0IrHcB(NSiNUIa4Dtrzz;>OZhERRa7=G zL|^QMhMW%-{wXFkVid{uU0{V`e`|3}_`yyz|8r_6%^4EtPm!ul-%+q!>zo$6SPrlm z@*AC~HX>YRy7wRzJ!TV)?=iE6_v$rc{$mB5t`}ZJCbe&T`_I=`O#oK-Dr|rOI{7)^w)bdVY_4DA49t2jqBRjU^M>%h^y>z-W>W!dw zpN_)UM0{;IO;6~}z}GVxoFBxF58|Zj%)bvOf54fNHeEsz34nJ=NQmuIBqa1TF$9Uy zEWTH5|2RgoS1E7pWd&Qq&#E=!?Z&5Td-R%ddLkGlKjr?QiM1W_%s~Snj7jRAv{MGV%75$_kz5c@CsFwQXl4N1XFs%!<}lExSQH$xr%=xi-Z^-} zjUr(R;a3#c;ulZ<0EH(>M5AYYNP{A!{IB>|cHaIwVeS1vmM#toq_7QGJNT}z{9ag( z{V+qKiw=0xySz$2b1>(K?mzJ5uMD)4qvx_KsABMA19VGF>qcmT*WzV=I6nwBg0j zQUnJ=72;0*@z;hXPyW#_R$ttJ@!%Ji{K6Otv5+i)Z>0q|5X2Fqg1YSM*HV-EjUbn% zWd|cRShOz9cCc7!e<<5L85Y^jJNUF+sk*c?e910zYU~-VnA{cmEjU)S1!rVNMdEZR zAxT3Df_NmuDon@s^et0iDqhRrKiTC<>TOX_^$bBZWsr<2+}shUCJf?t{CQCS{lm+e zulpZsy6$(njrsc2XJ(p&BmdH;ZkQQeUFe)36mMydz+d`vg6{4NzSrxi+~v8sfG#<*z5}aFf2+Q10N!jWPq1`iJ_Z5@fht17!eWWoK$HhUmcgt*$ z-9E#HziWmoRIePaWzd@g$)tzZ9pw>3-$?8r;Tu7GeI)0Ohg5vs?ME|SX!MJ(|D<;K z_L02de=PR!tyq$5rP=<#NLWf(Z=ZMPNDjENMw9doN5mwIsa$yVq|}E4slVk~1rBu) z#QR3#p|Jc&XS+>ed$Lh+4UQVbbZPqLF;u?u2yT=}_XB02!O$xMYIF{qntxXl)SDneX|s-3fMj zsOd6(^yBi}M$dWpGHLPD4#!Vu<HJ^c zFxk!Dufk>r)@NW5f;cC=5xqAOsT?1gb9efc-Ce8G-{?|}JgkOq1eu*qis82J8_+2w zfLDS}!SF*p4oCaiaSgchif{hPZo;@6C6> zm2%{>(?Y>V0qGY&d-OXkQvV44%{Qm(w|z$x{m*xNr@yR<8gq)Shx)|_PVt-nl40Hm zmTcVmC0>Yy!U;m3qXZVgcx%#s$`~=q+ z-SKbvO4lHr_glWsmC>&DTiDq=>$=Te^=)X~%5RlrLm8A|7+#_svFEb$lqBSiT?2|$r*l@NF|Kr|7`v@$;w)-8PJF&IlFvO!`5h@~xtB1!68>5t} z`oefg@x0%M-b!`g${?L{caU<#Z+vj7!AtR7AT zrW;#8{%~X2K&flzp746gq_6u=klrjoVFdB9;aEH4d-b!`VDs|feAQb<`@j>Wz`7kL z55jeFrSy?f6x%T(oNo0Bw0zb_$FGU>D-9XK7x*ro!-2cRBul z!#ZJ2I}E9)=`aj7%J8FtEbStj{H==x_TVLpca=D077oXjOroBImoCSCW+1QAKoO>V#<#-;{hi@mE zI)-z)U7bA{Fb!Ou5t1zQG4gS5_p<**!oD#|h8GTz4zHoJMAgG$A&f4MG1%qQ%`wPF z5G#f$ozLOzU-g@|^%R{=J6bYlCVWG_C&e2`mRYQkJOoB#9lzr3uJ&Hvw1-`NC`&Hg zHNek)sD<5oV6@hp2Su5~d~U~N{3aUSGo<~CFsvFvH!2jHOQnbDXu!%&7TIXL7Nw7j zz+G4$>e64#M06q(wi|XiA|-=OUT@NVE13ponT^T zH(T8);QtZUr-@(IH)RjeTe=(y(Mc{0Cs7_Phrg8H^_*SZ``^%HuAK zGa=sScIG$0gegPo9dHAI7)(tqPE-D&Ecv?u&6=v9KGj)5tO|skB!c505uOTn1y*$q zx22erk8!fz%-QsXPQ066=OhPgIdYe}(~Flv0T?Hf+Ygb2sAKn`0VBp2kZ z@QYu4rEV{)b7S3CG&i<;?JH#heD*699JR75)GGZ7fM4tbzo8e@A&8HsDQtGS%Ofwu zLhB&sXw4x={a@1Pz^-46M)@YBHc6>F(^R-bW&*}HbreCqa6Je)T`UNI#y+ZySXo%_^D*N{(Ke_kR_Qrlibq2M`i;iE( zgg^Bgk$>PfRTxR|l-*)Zu6va&YV;^+5lF+LrG|;bAF^c=()jHMlJfq3JO&^{ zX~cbbqrCojq^Z%J18YG^dGEOL)o`33>9=96vJJlqIaEnMa-8Qpz3s9qo!0i)caZk9 z6hA>Kw4R(Rdw}FzDyg?^gT0;*%-7bI^KlLY6QzQx;&{b}-nB+)u*ZN91abS&mbpF; zwtg3#^^4ojX?H8~Py|8z{ZB4LT-|j8;7sBcV$kP@NEiw%O&J= zWgOC8Pe15f<;`RT;Z#7B;Sf1et{uOB2(@p;CMjf7{tZOhJIg>(84bB9FzVu!mUO8W zf-S5lh{6`C+=MRJi&I{9Z><@OL1 zrL_u_96-5QExBo^W!F?|%>`XSS-X#^@5nIFF=(hs6;@=Hrsa&Aot!kyfyL{1miS}&`QNp$clkhP^l2g1b z3V}9sw9S8*Mp2;#4p@$rKu@#$|=JFo1na8m znTOKqjTJvXAZ1+6L(8ez7Oh1&%OlPKi@!D4Q4(mvHp zp*?;Mumz4f`gL5A6UEY?8M;z`DpoEx9x$-T#Il0U+>#Hco#exzlhd6sQ3mkdg?q#* z;$1f&emRKv`QM57Nr7KoZhx~od^RIrK zZb-ssl2p{2!k_tgqrDgj#n01vb$LoI<}I4Lr{>vF^>oAU9b@Wfq|;o=9LM6YB-x#cJk!w`S`f(NmP#u6k=4`2 zv6^nEn;wNhfYW}FbcI09fUg!if&`GPemc~rq!S9|TOM=)gB?54J>kb`kQ{Du8ejKa zhTR1AAc#LF!!d$y1o4Mt8n-wn?y=OCL+plht@6}48-k!^;ZxAuYDQOxxsewxnHP4c zZQkF_jGObq1zvbVctI!>B55US6|&Jl1aU>OV%$g3;K@O9&I|n2?_=%1G> z(-DDQMi<^c?uzbHj9Ytca517Qz;6>3`^Dc{XdO-mX}s{i{S<52K_2-6+%=X*zj_Fn zykiHj9YCs9?e#92)rPv5%POEH^xs-YhRAajP{Pt-JLxWscA6ajxib4Z!3XCHZdA?q zy!9lj&i8{*UQsLZguM^-_DS_jL0I)jtC!Nc2Vs%lMlvPT3i?|ByYiVr*a-kTAp!G! z)|xOC)=8At5=OhLKDg3x5fAl!FIC!3lw6k@kc zlP9xOCW`V3gIutJ4C{8J{XxuWg;r?=RY<=Du#_OMA^y`pi- z`4$HZd%yV2b@~6b>*N-$1ZQRLlala@7ym{sF$&X7Sk+L3SsD2@bBoNE>T zp;d+NTgCr%RQ4cx-I4GB^Fc|K(bXTNe%sfIh*I7yTEMZ@3toaUm4JNj8v}E;bMb>St$mkYAMs6!IB2YT!MYzCT!a`GiQ@)e88sPvDuyG8O9k6aK`HMG@AQ zbb|FIe%MbNl+O=;>Yt~mkwyTfA+H7euaDb8Ux-rLRvh^ly@+-@Ug9lhhH(l&MHk`e z*zWviXCnCL&ur|KdeJKEMA@A$ji{x&s$8PXUGp!z_2*s%pZpp+ocn()XB#eJ2D4R2 z+Vt43a+()ujh<<^{75=>>Mvfjl=+QjwoI570Y&-x&v8i#L6+J>R&44PsP4Bz)<*Xs z!~=!T{){KAUt)!0FY!@ld&MdB$bxal$`hDUm$#lxv+G}mJN#u@-7M@YQ&I6B`G4g_ z`Twvhq3x-xw+cz9mGrXQzYfG@1453M)zkbzqfDFnFiK^hRz{%KgK{lA;}sB-`|9;J z8NlkxvI1)53bHXQ0R&%7|fJH%O z(zf3rD|YDu9Mt*t^UKdA1}CD>T=GI6vSKSP$luoWl@hEp!})M{oUXBC3I#9Y#nG3& z!TSJzNsv{t+9vwN##faouf5WJy?xgH4zS7b@)aj_%A*M+G=6d27Z|blKPT}2z~A|G zz6|?=7i6aVA<$<%FJE?23LSl-#qL1p&{7=pl}k^>>H{4VaQdf%H_XGXL1xWqmLMZrNANj@7ujKyA7()H` z`BzvyN|)DYIK+M9LQj@@RzaY4finnVRlMG2#V_3^lB%WiZ*)&VK}ua%8th>7@5%Gl z;P`2sN&Ra>|7Hqa^qBW$KKFuYx}v9SApg&?PLR?GdxhanJTc{53Woyr3Z~!+4UNjYI znY|~rD!}YBC~zjg?5ZHMQ*l<|MhUBqRoHB*#frF=H~x}s&%L0Hjg$Q;b&dWi*VHH1V=63_-hRR=C3JgG;xX|i8Mzz(Wrw! zbufVH)AvK;@3)G3-gls%RAlXMKvvhHK^DVbZ{co0*Z_nL0fgg$KpP+3Dn6_g!ix7> zx9;%e5QO?GHzI5T!lnSiLx*t?KofVjitjlb+QMsxTO&MrMT@XF;WpVwaDg!{jVf2z ztL^;^Ak+4K8sgggl*5X|89VA?J{SlOAV_Vguoz4uzsV7KEW4m>&mW5L#8XfRlFzS+VauBj6*smWvJeFNRq9B9Xg?4hcr|T*Ha=i(ZcIS zyB2`c8_Jn&h->q!yt44(>`%wXV|{M@WS=Lr8FtjrHgg5y+GZ~HDneuII2g)dW4j%= zTD5~edwo!v3!eyL&sf>sCQE#{Nj?jE9(T4IJW23$(8<_+XB3NvFYuf7`_IzM_=&G3 zPRI6-kewC$K7Z1nm(R%M9}JdPjx@+hO1chgR$y(7V$JrM60C=P@}N_V7+T4A(PY@R zKhodApXl$H^K|3w=z#NXasi(4QS5^OGSY59F1t^Z8MOg0UWlDwwmsw*SD&Xw-Un+K zFNUkel1yKt##*Yeg|XcOKdfD|I*g6$VhFVAOWfm@K@%79{_%5LH2)8EQ?XCu#PNZO z7u!tjjSi_tC)Dq#sbX1UL<7DXcGSGdvb}r1_LH^)7D%ms5ocpm0(1+0)^p&j6OkH|4R=f*LZboggpkYCHTeL&$ZPg>V_Mev^QYZjyo+|7yiKipUzRIlqJdA z<>)>sUYgY4mIu{)Kgu04#77-6PwJ5Sq>Cg0R~Vgvxn+k8I`pI5$ftf(_;IU7)_fSo znzL7*k(<^inKiX-Hi=hOBZ_%nO%l{q?WOc^HpObjksq^k5Ge44BkJKCZDve@Tq$WR zmLIsj*dtePV$;hh9j=hSYF-UzO*esZ3Q&j_p-`S}3ra*gHX$MaaZo$9m-0QO9mH2o z-@l+8yNQk1`KKsh=bvh>N3e&L?+@Fv(*xi86ZPzuIwj+36kDZyZ|=YrD}}ChU4*MI`6|0gE4ceGOH>=0l#KG5G{u9#s17l? zwpB_ujv?4^^SwKVnJDDF8;MY39mZNxsD^@R9Bkon=D#=@5m)ETD{y%I0M|UPy}6T_ zB8HDXFJ z;B&8Sa6jkH)$8N3%oBlWR%ZukS!~ecfpSpy(r`A;eq=v>m1lpJ(6Il)K}I;TA1_|- z*CED;lRKIOoEH{ncV3)2ZgC!3J`SgR4ESHn5Twr6+IQ@4oPkS%M&uAx&$t%2CxBL> zw}(0RAaP6Pk;?r!%naOmmnpyn!f1XfPhg9gNRth#N}+R2u7ypE*izR~*iu)s+`^_$ z+qo0#shx+V9TMi`HxUeTrX7wG*JUD=4!_8`xXMz8=_A4_l*u{xAIK38MdS*zAZ@ei z@<8U@)du{n2_M0ldhgu1XfL{7f{!ct5d+^GXE==^DVMIv8o{RP{?oZ;%?LKBs13Oa zWj~X&)tsY`83$(HAB`V4jq}fKZyJaDUNK0S%vj73hRB!+kbG76YOai6i*$#%nu2sT zPWKj9vnZX-(QV>t>e5-O?qROxN;VRer2cUWAMQF&M1VM-6Pr3E-N{@n>E4w zi);9vI=s8(;c5nDup1(d?KcR=_Sd|d!4B$DmdFTYiRL|JJLp0gUV-9ju4k~x5hqaQ z#QvH=qu7_S!#e8?m->t~XgH_5%%`M$c=tv#Xhs zFk6J}-*Y)(`+*vZmE9bX^a^C-m6`@C`(#7|n$@tgW>zN6lt7Q~RhevmJNHVYz`de3 zGfd8NtUe74;82TuB|3Yexzff)wu{4qnmN9C`iO}_ILd~<62JHI;>d+49eJ$>E)4+I z#hpg%%Y>s|IO?sRdDl$*q`=M`+yrXc8JWsWtDZS^tG;L=p!z(7t(}SLGlma)l+^Ue zVh46NztTZ4zw!t32gT!soLBIqQ(6T6@1K*!8d+T>SF?I7n=tyn2}e6T?sqpBTGh4~ zoEXa{&HQgLemO``iU7seCKN@J?Sv-#B}7Tq+@H;wd&}@?q&nvHfNmq*r;f~;-PvqH zltwg;t-II@By3$IjG!8d>w%ICdI)XHCEHY+v06QTubpv-P@8I}gx- z3nrC?g4lVW#x#+&L`?U#7p8k_?w`oUC2#cVgpFQOv&_j0F-G&x?M%4n&YbGP3^1pg z!=k!!lZEWv9T94FPGrr7A0m@dGlim8@Y?t*HH{P5RqU{udvn>_btk*-Uzf|qvH!2M zvjNMpyc_=i#7n$EL?T8=gm;K!M0AUc5D^I#2@%ndfXER;BZo>xM8>$u%y^7BH1uMQ z7$GyJJVfLKksOh8#Ecj+N5mK^k(nWRIA7!OwfA=+w$`&f@9`dQ$MNrXeViZvuk*al z`@Ao1ZPN*8`mgow!U<(N~)HPx@hD<Jw2mKpId%Mq@ARj-ETe@fi0{q_i~aJkf8kfA2CUn; zBIPNjq;cC)mMhQX_#`fl|D{nqse?3vo7EjRI;#77+)e04tUp`R;RP&m$_8fe>*fyXodUX{4(S zXE)Q8zjNUFt?*?x83|lWSc>^a+#{HACt1?u<_v3;Hy-iEWAT4e$})qc-3-0y5tU+F zN{!MM-6LMr*(@8;JK~kaCU9iWDs{lIu_^paW0OL7@3l#9T&2ve6%?-+>%hjt=&*|O zsuq2Cl?o27ZZRG~_Gha3x8m99a=Q7F{7rB2{=Sp(-i>fyB*Nil?M^S|Ixl^7g7WY# zp{0_RYx|5+H(PDw`0fDb0N;QpR5TfCmM19Bl|?w9sL8a`>9u7$7mxjjLkU+(npVAL z+W9;`*z^}i9Kn_1rm;U7N_TqA#=MGFD_U|{B386Gy|xs4CL@M@W447qs@&Zs;tUPg$v>9isi!^4BYE6uMUN^!o4*X}j!DYRIWePx%*M`h=`o6h4eJ*Z8MXJ1 z)%CM+9lsfuq=9>f!zY*Q!l_?2`0lP#7EK2!EzEO5B?W2?n7DWh)Elg7Fw zf<=OnW;c^8x6xQ38ndFYi1MUtH(gRo>lRwV*YM)mCH>@MDpp<8?@Up1yoxT)3P`N*XMO$4{}sMG zIKfT#f31|a&z$+&6606g;=b0iQdj~OH{6!~M!P(&BHTj%KI@I(I6t##rLFyaE{f%otL2+>v;VGdcwBkf{Bl^|@wf`I zu@37e9#;XXq2cSt)qFMCyL*HetsE%%NByB6sk>J+eICr8^&1!Lx}UM!2sZ~94^Mvf z?(=OcMvnX;{N~wzo%+KH2Yw!!FV;>iSz$X?;&p0HHs8FjbA0n?NPp)?>XbUEzmlq! z*tiYoovA9wlzY&LRc7u%-SG((^Mj&;rZYtcmstvv|Nq^I0(^Qkqe_Yn> zf2@XWUpOddUO1@V_%R<23pp-4sHdc}+8V#UIbB8EI&Mu@i`032(i*k?)}_sB)b^ms zUugm1wc(cF&wl=m@Odlr-+$gB%HMw63R$ay?aP{^i9Z!K7Jqqb)p6Uhrm^G5C)M>^ z$59!Cv$Nra3^iAMcNuc*DaAkEiOSsv8%CdE&1KtzFMAH^Za+~wZ2LIwJE+(EM0s$` z%T@>Vj-M#+$dQAuykmD}-h_wnwGct zQ=yt^0b7!TKRfl!?oYq@Cd%PnmNXWYG?p5@E|bsj7FxH|G<0&TZrMDtUX|J``BLA$ zK^5G(=Co0TIt5cPxMm`sm*;UbuSQSVsLZzWX<~kjzGb7j#w2J=UdE^_82>=}{ZVO* zNMmFgWA59@%OMgs+?sV{$^usLHzz{I=Xg7*jsI%AuGl#-W7`=^L0Z5M%r8D+(!b79 zcPC_Bni}ws!xwkleB{d5XHw&lYjhz@WK3;LYqvVT_N3Em|NQYMZR|t+A=azsCeC7w zGybtF>uKd`owZ;h#{D3`YI)_`NywObj0x3v%o~%B@o~=hFlU&`KWzMMPsVg=OfJT( zVoa%Pe=I7(r*Olj1EpHbO1w_RwceMTKuHvXUM+0Uv38=KGdlh3M1n*)E-U2>Ga zsj8FJ+?lFQJvv7nb}VahvmB}SvdjvwW4JXqKBs(?%`f`(pj;Je^K`$yEmwt5=t%u& zJwG=!R!Hy2RU16coZ?qfEK4n>g#~P?`uBb{{=@nFn>`=uiO;K$*ouZFtnT@hk%oyG zlQ?p>JRTq!lQX@{_5r5M7nAoU$MM1GPCfziPTj{gsh8{c{nk!1f5Uw*+Y*|`G|PW2 zy^qCa1>1oY4Gja&vyh*;^P@@T|5fK|G3K~$&W&~%bKx?J-LiWFjH|{k_kVNll79CK zYMSfWE<>lAzn~I4K^$ydc%$pDdfW@j-_p!ds+mPtT7YtJ^e~yD&$Mu*W$cPAXNNdD z)H0EyMvfX=^x7Acw;I$>y`bjW{AZu;n8&(iPv6b;OI+T!AD8}VABi;ic3vybQ(L|} zPx=0owa%12J@%){-T&qi<>n@hk+AGReWxyK(y^G^j>TN>*Z2HXMbTFH_(qX_{-oP2{hQ zN%MTa{cmQvd1ksj)rF%)4=sGw{M0jM<9L07*bHjRYZ?Nc_004r)l= z!zai!8|I1B{R`R5wXNgV%V6>N@qTy#2@Cyaxx%&Uh%MLM5nsd!@j?O{zSPyPH0QI+ zMGE8iap)EJ7|C4OP+q3CD64&v$e!=XK;q47T`+U}-u3Zo-!FUX+>LU9h|l-hx^@5G zkRJm1f2;8SRetk->xM>jf-*bf0AQQ>sKq;#kf|f0-g6h!w5r8WYfU2BAap=!uF|cTEoDb zDqY#kOmB$zjT%;ZRk6CW;kkqAr#ALEV*||?Rr=-sROLTP_;JQlS;nXuA3;kPPyZ+* zvi&WQ5~LidM(U9Qq#23Z_}rRJ=1ps!eCnBO4va=D!MXNw^Z$(5T+x45tMc5&M)3XP z|D|u-u*T@k7_IZ(Qt#UM*q;yy`JOm)?v8jNzDU3c-LqbKHXN^4RZ7pUSD_6VhuHJf z57nz_4euRRznWkT9To8(mtojGE?w}}xp8b)bdtt{dmuzau$Q8a$7x)h=u}J^ztf zU{*|eWxVlN(nx!V%Mm5Fjt%POX11sLQnU?XgM)`3unjbG$+^NDRWHhOUGtJ6b(Yk}t&1B=ieXv2vEy>-lWK4bof1`VK zDc=cxUx~iFOWixc`|qN^U>pQ~E&7{XYUYH}{}TP9E_K(0yz8Q0;)<Z0{6E^$V=@F-R0y^32YfmX(n-NES*D2*=bNmN-(X z=Yx0XVcncxbJNqhsWU=G{{x5K@#9M-~mNJn;bWOo|& z!V7R1-eBLzMiYBy=n8$HFARZUCJtgbSg9YHY*S%%5K)>6&k_}$O+sgiT9Bow&^A$_ zB=|ikqV7r6)bw;w(>KA*uz;^B^F*1q!!lT*sk>W5-Q5OH!#+)UZ4l)}dtSR>sitPo z?hNXCyNdGmhJG+WQ~p**QT`qrctc;94Y$DUuo&JD^?bolZhT86U{IlCc<5C4{U+QHL-PPwdDz8U>t0M$6yESf`gF19SdXJ zgoSZF%J~f@jw&XOYK_k&!V94=1*XC*n9ZM>J9Ki;t%(x@+lhhg#K3f7U^;t>ID5f9 zIG~9O1Ji|p>B2yFVW7MEvuX~|k@H0t;sYDnubB{kvt)zHMwg@v znDa%lzWhJ!K^BRb2SMm;qhDwnPEbhVdkU2d=yw9A`3K#M;73bh_fOQLz*lJ6Il`g zF=R=ORg6^rk{pgSceTGzq}c04xo3W+Ci~ zXZGTma!uyuh|Jxr$viBdhvf?j@W56qCbUZkZPX16wZULQV||#|EZu^|+pu^C7Vpwz z86H@M2V!lo+!l_)8+f1>5Av)P}ol3GgwHW`v0Is<03NE`wvf&bEJaT)w$n6>MIxZAkNd*@wxMHCz7P>@o z9*s+}{0=OCWCMzAA_@ISLJJ|{X%)}Y%B`C78i=Rd@YFP}PviPD6q<%Y?hdTR-Lb^o z1DatnT&>BSj_h7ILn_=!g*#E~P87Sd19oZR;UnVV3%T#XeGeAV9w{&bX2R`o2Rs4W zA+Gko({~A@L4&T)9a@RyUBuFphCFG=GX};%Lg7g$reooBEHsm3W|GXC2EA$UoxA7T9oPN1&L3BbUj@8Q@(D?Zh4*9O{cZ51CjNn}OoL$*jDcA&8}5R8;9=MV zDerHTCkg#YLVwzOKp6iIxO3pC$pedE6ikC_AzAwXS^Gc*tb&B#0YdOVH|&A9^Z{J@ z01a7C%z~#Zc*=qS77Uo3Dl$7AqR4C%ncW1BF=_}w03itQhXIWLIq^&|i43DX45Ph} z4g%>QD34Fl1x!4yOg!#f59WF(=Q*5jhKFDyM3En&NDv_lB4j~a4>GQw=6Wx~(t}}X zhIsTrJo+FZe2@?ZM>Bz0V>zHgFcpHi5zLLbvlzdAupVOZ+%9+;61%y?ZdoqFGml}3 zLa`_`uZ3}bT$9jPk%N~P0bb)RVUxo+4aJYym7KI~FI08i@P;_Ca$ii?~ z0JlOEScn1(SHm<|&iG$g$w4g_>LD60MB|0mMHY!Bi&nw}xC!RKZE!oJ+#<>?qTFK2 zE%t{2kcJo2@M08RjKYh1U>`Fd3NJz7C41mrSOe>r2}>CNQKd|Uc}$4~%!F>tgdWU< z-pquvaJ3Vzc7Y_-GLkB`7?+o5vYdvN)6jB4x4co4xOP5oc4)FMZi8D{O`>ka7Mf<2`NNwU!-$pJb+T%UyNlgOgKPXzU@GAQog`K?cc| zL9%7gKt{eMJ3>WvghM>F15ahpUIy(w)hhDT2~E~v;JPT72ANlWQYG?}YK{FUwwe+c z|CwZGCfS*J2sXlA*ssZYa$!BWupUd+W663dtj9y^*TD^t99T~dY@pr->aFkR{4D3f zxu(fRi^#@6NXHxLc;ha(hx=E#KdQ;oz9LUs{W-wWr?GTX9eX5)GaZG(8=B|Pxb3D~a5R$s>dRxH?xrd!c;E3V&)>tA*kdD&Bw zZP_B*a^Ydvq)8#kR!FjKCyBO`M6XisRq7R?U=a%bEJNgHnVe%#5eEH?ko=60>_{Lt zk|E`GP;N&Btb$h<|2xq5=ffgDXV?|nv-#<$$xbZXiG{mYitJ8+*V&a5P4=X~REQ;e zuw>6k*r|y=Dx%-eq!h(VQM@zv_CM1JX`NtxBcK1!e_ zue*x8?hfhjbvmr_7pV%+q#9RNLv=#lOZgzs57aZiOc_*-r@e zW6+zp{7qc`W-Vk`zKJK^#1n5`fWx#KMY}PCta>X4geK{6V99Cd`6Guvn8CIe}E*P2P4AdD{hUhWQW=yp0Fyy1C!O zIUao*kG>ra7r||CyC(J2tEXOl5DbBPVL9W!zKMflbi9dMX0Gg=Op!%Dasra{Ubrd$IvUjs8=!yr7*??+It zk$R1ItkH_ge%CMZyR(|KM2fUT!z`E$aajv4doNMsy%b3Dyhrl1ri!$t!|iZ~Chyyb zyl)FPz)i3h_G{9{c^l_#grJQOd{8Iy!6DcIyEHj^mf?DIh=Z#lM@KbjwrA(m5qd%| z7yyG%@DK_%q5vUyj}Wxs@-|%l!8IDXPB|=Z#`1UR@Lf85Hx9-_I)0aq-#q|pX(x|% z3gCWt00ZftZA=b)vD6=yz*2~&Eol0OE|EW+hS%v(=-3|yz-SmtL)&R+2P}nU)N`bs zGxUIF7z{&EoDjc9h+9|Uu>?*2SS<3#64=7{|Ko8@J|tN_Bw0GC*h$4sKWKp|FcoIP zEJ%l)bl6z|t2Fu3h{&I=XwpT;U3A<{huw7emkyD?bZPRjy~xLo&=>kc`uUiCK2C+{ z(2C|CqxmNpBA;Z!LRbWc-~~)KBX!0JKw9-*49kmjxR$|qCo(dPKKr;TBWIRm>P7{LP=ZO4%Go;+_DR%0K!J}a&_&X8ku+U5L{8aga*7J4sBkI*Mr!i6vm$>RBKEGt-W}G#L$DKe z6Jvj3901ecT8IZe!vmjrKr?KECm|mC3=f^}W&EA*=U`Oi{0%G^!GbGvM1j9iV2GFw z5z~{QSP%~LU;!+JWsI6!Mok{9hBfdwY=c+eHOetsPVRtR@HE#^{6iG~Fa@S^{R-p% zBn3Y#;zBX(fqi(y9glcIhRsI|o34I5a~2Z2E@Ics{ci3Lv|#yhEW+iV;qvnrFl3l| zd#P6ro8U3n4m;o|yut9bXZSi&f0*$VxbpIh3T*e7Q<%Pf&%#{yakrSN-p8M+?I-5Heq!-p`D;ml>~Ilb&pmo?JKx&ojfhGr@VHNGOVgqevl&6mdO{>+y{L zPe`IqNTS|Ek=_*80lPHm!xMdYqJKLx-ww_Xaoz|=AW8aHT=-X9_*XjoD;@U7Q!bI@ zbs~9PU<{0dTi`Z$5_S@jJVH_ci(oP1{|qiWgUilpytZwE#P%$)Jx5NQBPY($@HrYD zbQ2l$fU98|G4&#*J}?7jQg18u3SkK>g;lVc`h?&dAvj0K&Q-!%SWi2pv|}yfpqhgk z*a(|xkmUK4nfOeqkHJ}=hfi&2p;ZfG)$ z0>db9(TzVQ@zCUJLi9Cz(pnT>qpomn~mtwa|&EN}+8D20LvMD}eB}|4Tkna^{#fX{}rzsy-Q9kUt z-*-aPeeG}%p4XILhFFy!-xK)7iSmnwp^%3BlHqFT1YMvPWLw^k?R~#3G{7$WePNt8 zbKU~kruSo;J}_ETV63Kss24=NXm?T3W=$<~5Vgz+7DB#f;N!gFAPTNR zK|b#*KJTklRqy~j23sNDN31%lsYEN^bR?#8fC7mqz&~QH5=*ee5lfskm9}40S}h!g zmo?>iO_b+#O-<*EkLkA14+ilKiZ9=w1Z!&E4N;-?ocnXm_YR?y3w7i?fb($9Q8<)# z??KUfP}F)4UsT*v#?IytJDV3E!|P6lmu(qe(C?=K|cmUQik)Y7WDD-hZ zWDNJZGk-AQ^oGK4xC!R4qGGgs!f5G>Vg87N^xId>`0wlGpq~kZ;n&~HL?KKR8VrIV z467!F)iF&jFw8D6%r0cZTzG?FX2Wp9Q(xezFY@6QhFd(tEfEgF^O}4~dtcJtm+i2F zVd=uKbc2kxVJpLJxP*gJT<(j@{c-t9T%Lf-PvY`UT%C=pbNT9ohsX>bBHp;z8y9;s z-o1-){RUjW32udjgkUuxNP}50n^2?@igcI*Hxm*<8c9f_*YW(1-oU5Z<9y0(BLq}9 zLWLuY|09h5CSuh@teSSgJ%q%WkhnrTa}>{X&~OJ0cW}Rh`yF-g5XABhEI&>C)6_pr zXigKF9xU&{@*e8*c;I6!{uqmUO~lLr;*nlF(pw0Nh~Wuh*iOho z2w51U<32k6s}s)v7ect75FUWT@G>FHB!pQ^#dz>69y~{g&Jm(P+8d<3Pj~VB|C9zU z;F1ftcfjdk7WDb%f+PG5`k&RXd^TU~!7;+i`t+FYKpX4DrU0nRsj_ z2H!)7?;*t2StQLYlIDmf4S3OjD-F0qT-byQC)%K~EewJoa0A=~55QV1p<{PC_9(!B zt&r;;TxX^eW;%J)mW@k$zVpF=sTknW##c8d*#~rIAJCKWpLdo`q#;dq;fY;%qGUC% z^rS&TQ9>wo!`-lvij7n}PJ_p3@OU(gh52v`Y=tM_HF%x%e*~WoB3ag#v#hU#9k7dK zJqmw-!tG9Y##sM%jFPQ4$kOv<=|ytDlN|6O=D7F^T>QlaI85y8iTz<>jcdQewZn8g zOvev}VMzoA?7#qAT5=J^M^K#WyScubWZPW?OJFH`Mke-*95g9F(E=-)zKDxo#KkX~ zp*IcL(~u(-9H`&~3CV6kvO5aKz#3Qw```fc2A0}l>1;ZhO-Hkw&qCa<}PyygKh!1@{%yw=DCvUqnO4F<#W@FFDJca!aUFHXD7M9ujYKazlZt23aWS4K!4oBPP(la0)^U9U=U7^T zr6sknp6$GFw(}NYKpFrXk53A&7_1P#t?h472(Z zupM?mG=3+GJ)vxf>)ye0>q11ovw41Zp9;9D;>odw8r79cZt zZD0m3Hq5Ajb-Zt2Wu+3yN+pTsdJ@m|8b;$}G)`v8mE1d z%Yy|hG*HNkl}#|72*wk9xut@eA?*j_iMcF9=CV+kOZ#*A{IBMgaX?3NFTfE^g*Xd; z8A631Dn!6!maN zX2DsACwx)BcRv~~-zIAL4o$_yi;BY~D`;>9tJnmVQjglOB=clR=B24r7g4EZO+C>q z>WKkO&DkPq4)xOTP}(6)tv?}ZeY+m2Y`px#SR;nDiVEXeSUc}5QI~JbRJaGEjqpeq z4GB;9O1((g+-YSrYm8?8Oh6{OKyrK{IX*ED7Qn->iP27~*`_d~lk?u>{7mM^-FHy^NiE89V+7eDRtL*TQuS?py|U9;tnm)E;Fp{??iOOjq_b zDfn9o{+4Ovw@f34eR<^gLq_{yM*9&4;SmO56W5!#ek@qzSSZsDgKaj0Z8i$eM&a2g zG#iCn3;5E0E8Gru@a0|!U-FgmOD&<|Q*B20n3upbX@;z>}PgN21ySfoig$yiP@mgAaoJX21`<#hZjJo76& zQ*m6RqD_-GvP9mv;dyvblYQjQK5}PY z0#AZ{$sF)V*;fteU>_YkO;SEhQkIj|_z|z|uD&VKl6P zb##Owl^9Z)12@xN2R4XVHV_JC{N?kr-|v)#Ppdmz6Gp+m*G`Sve7&n&7bA| zv)s?g7Rkw_JTZNmm~Pt6w}(3@??!nKh~>{<`7j%-yr6dG*C$cl~_`V zCHu_egg4v)cQJk!F@B>++CwC5Bg+XdRueuj94>+=(ug9BSK%l#=P_o^R){B$;K`;C zW>9jWi6m~alEqDQ)I>*3r(rJ~g*W)Xg@s44@F=l5O015qgBu_*KT6Dx9)Pv1Z5>(L zIztrs07cp_u*MyRH`v&gwP!!PA-I(!ZMzUW}b@P&<|Q* z0!-%psA}Gis)2*>JlAcxZqN9i9nC>37cyZMq`+(n1i15}lqaNt02&BLgKObdNX`Uw z!yb5@_o#&TsYup2BE9p^5QtV*HzYp+Do_L^hhpMiW_T zB1=uFkl|z61alxAn&{B92kwPfV!{$r6Fde_!cN!^&q6vh(V-n3+R>pMhS*_k3hhcWfjDNdz9BhF3a0}c8_rU$|0Hh;3I+@v@2cDLuDT<{1NL~p zJ^%*6NEi*1;cB=6Zh~9jHi$v?RxGkVz(FlM23uhlJPn871vm3(H|GtcR`e1U$|7pWMsh@&t>^b}kT02V&{q3|*lw^oJQR z6XGEUJmk;@Px9s`uAhSI(MudPm;zH_5iEv>VG|sISJ(}py{WV}wGJMFeLVlC4)98- zEw3Nj!|iYfY=q4aS3BYA+Y)(GGzB)p7I+bk@aCv1Z;rY{TIeg2 zFwB9QHF5J6ahnC1%iWmD-6~)eY=<41Oe5CQi1jo)F%3^l8-RoCpM;6HM?fnYx})J; z6ugUqcO8O_upge)#B&jEghs($*ssZS6q$}9(+|K}b_=n{j78=c7za_zjAD1kvSGWD zUBvzDA|7BD(VbmHPl#bNFwEPD&k-(+fA3=)v~pn(p63IF7au5mU=)nu_2gh)PY#8r zVJ{yrYWRRr2Z!Nhwy0d#NpgcBFbr0~YCeD@@Bt(lQvP1b-%I^_sekV%yul0Kvv>p5 zkMZxjl7j>;pt&!a`{EH_JaV7#N~#98!R?TwyN{&1?*^}?+VE;B4fy%NwQwCQfu#`F z`{8=OEASextOoGPY7oTo`?37~J#a5pXsP7I8L7(B;{ z#dC1k99%Z%IBesUQxph9fxsPb7d#0&;SjvQE2iB4A@_e61Vi8kNcR7*6qfNSYBsN; z=E8n>mRC>l)Ps2HK|K8+o_=r_+ye={^+96);B{U>6<$S+fRQj0X2BX*$1A9GFqaPI zHo;>M7th7TA)dT^?*)rsG30&-_vhjAc|nj+&Lfnek-Ul;4QVHoc0%z;C?1*b%=n-0 z$^ovPkE`d?@q9X-zaJie6r4}NuoPZZO@(+W3{QpO`Y>F-fQ}Z>(Slr<2P@%zNJzs8 zX}B-+hpCX*M;s7|sD-_-pAVzP`hRgUo8t~_jythw2A3GbwM%gAl67zcq~j%YyyPq# z;uX>a-XNu36qZL}dDLOp1h2wT-YgB_&C)PPC>|yh50}GA*bmRL3C}2tW|S>uCrFku z4wq74DHWD(hWYRU9Oji&4_-+%LtGex3uCsy?XU;-@rtU6S5zG!^_Nk9SsAQ=ZSW)< zg*SMG6%WSZ!Pr7r1nc2p#((T(4zBX9>LT7%je;cIa*{4Ck#}2Dc&8NwSD@eu8eBnx zD?>$AhQnj96*3xDG8!JS;hk4o=nM(zBY`j&u7&GhF)V>y@H8*$`}4AX0OLO%i{r64 zp6rh&`&VgfA)8=6+`_}DkB8F$4;w6)f(28tbSjqKmccV1lc~Frsk@n}I*X|~o2eNO z-GPVPQP>@Yr#CTE9%CjXL|%l*CyI$IhIs_T?lX3R{T!JnoMA8QXFk}^#BhLdjzSg` z3K(JhUSasTGyFUmEhO24B-vaPoQs0;_Nvf+Phb_rr4~OApa$q|-u!C6dA=Z0|Wi+vjC3g0N%#l#x z^5urh&*IV{Jm!MO+%#E@WvdBUQavy29_Ad6uEwL2=y(zxJ6z=PJ%UG3)H(%Cr*dN| zH*WL8r4|?oqj4=AyU?*~EUsONYtwOU2Cl_J?s#Z=DXuNUwI#T=6xaITT3@E{^Gx9v zaWNg;M@N2y$d3@+zZK6G;@Q1;wj9r%VEhNPGxH5H^PR`Fn{jPEu8qO9akv(j&NE!< zfGeFK*Tc9T)&!5?+O@cL9j;u2E2HpaC!XwP7&6SF7-kQjz>~DUGy_j&;>m10nTsbq z@uU~*XZ$atU@Q|&EECNmEx7VH$%y9hXr6GI&8S|!&ma_!5(+kKg$-Lt#$(BNEZGfu za39Y+if10hBah;dL_(BEh!PnEiHw3oVx35+Z3(q4p$_xH03Q^$CZqXkUZ}oKjD%Rx z;A$F7V8%*d#!A=)_rO|MPY0QFkcA@cDAECk-~|++gJe2L&Vt#n67Gi>#2@pC!zeMo zLCnJ$MT=OH;aNvKYn|#!?A^(M4R8}nt|*pVG2{R)x(yfIRsgrMgvw(HRX|P@k`qPb z1P!^;&>acnL^3NLEOx`o=qK2|EYeg>}h!6QC+#HR$3WV3MLEL`Z@OOo}IWT_-sIwa=z5lTN4 z^FuMe1F)8)BX{m6cka)Dn<4GrPx}@^VDVx6TZ%X+CL6Il0Lud!VKYgI0&`FxkPZXs zFsO{jX$4722p%K^4|4xO?$0HJa|z+xi*SUbrNeo27?w+n^GMP}k~9U9T`jei93w#DWYam<$)_1AU%J&A~bzVml zUQ5h|xv&J5LR{O5Yu_iv?-S$q@!0!#?EPGr2am%xh^OAiQ*GRD<9-|W+qmDh1#W{i zuntpDEK0Wu0&83nD>Z>9eGF<2hQ9uEp#LZM6K$|Z8;5;4C- z%r9lZY*-4*82^_VIcVkrid^c^)Q|Wg=0_= za!u-G8hn`sU#7vAY4Bwl+;$!rFsZ^scm+9WQm?om9*7&)VIlPj>2%vgt~DY(9Csq! zh;iJ93?d`QHRL*F1Os2uI4~g&h!bK)ypdUmA7ViQkzgbg2}e-u6%>0V28l!Bkwhc~ zL5Ww=kqjgg$wIP`TqF-EK(-=)7@^#&lzWwOuTt*SOoTRGrTnXuf0gpDCL%_iR3shAK&(CduMZhO z29fh7rPHA9jm$z&MyDa2j&wTNdkASmP9mL1H$oeG8l*Rj=fKHzPE2qF3gU#&`MyO+6oL}_0udD0mx{zAiAV|(jKm-)xi1`v zL%fl6Bo8S>Dv%PS6e&ZpkOHKb`0vZ+AQ#z+6d@T%rb#tXxQW6|RBoz5xYtyS&`={v zHKIf#3N+GrVF%0YTG(Jd}rqS{@eA4N#>jXcg3gl^ZH* zMZ}gt0bw;oL{xNBL~RJV0a-+4B`B_}vYN}qQWP<;tXmMs?|tsg&Amwr>wZ74*YA&M z@64PzbLPyPnbEwS0>KT^ zcIy+rt*L+2V5%M2d*aq*ZN#n1{^cGaeu%FRmkq49i53G#;b`+4zqK7F9zN6_!L*KR zYQu5KIsAC>FmLLF>r`t2K=AR zjTN^nOGIG(4c55ob*#+Lzc2TMLFAs`q=r|xa$7o3`ZEzWk?RlG+`~*iqTDgwx zG;|ko0GjhefoT3J4uO+ia&gI{0cHUhf>gdP(J`d)(a?X)0Z-LlzN*<}wDY-qZN6wn zNjo4OMJ4@XDw&4T2-2i=Mu!!p52LiPG`f5x%2%cXXa*3(^PD5-ZEv=TD^L_c%3H_E z=%0nT;2`TW+-wb^3u;+pCCVhQp~bop892uUT7AV_W3DR5Ns z+1HGy!U&RGp3@#q8q3vqdUBPEp~xLhLhyNb=0o1(Y>;WPiEaUi+(1;f_S_s| zX_lFjPRH?PwE$nsNk!RyuOEfpjC0HX|8l+C(@V65jK-h4=;6M--X{8h4?$YAmXn!m zJ@#nG&?FB`uA(j1bS>BH9#YRqH{}|WlfWlo*i)Q{AkA89bfBkSPbmLLZ~ zTD{gRaz;+-E2lb;iXc6`)>_9UPeL2!A!XiEL+Z}EIB5y04S20)(POaiMMgXIF2+WY z(PDBqi#X|2F5x!}jO4S|<2$uGo7>KqW)fLl{8hpaxjgD#4VIANiUQ44S;0<{4 z#ZH_-yrsaH_))q|+zto?=|5`{F+hBX`NA~x2MwIGE7v#C+W39QdhGiUpPXbGg8$u; zGffmXCiA9#U~%)IBm}F2XEyN&FdTVmh=8IU*IFW(HaYVGGA}%pk33Fh)5Xnd;W2W4 zUNtA?RgXn}a82h(Sq^zbN@Z@?KrBiBcVkuG)q%YSrW9$mEyK&O; zfo8FYn^x3Igp83w1C*EnsLqAIk%JyNqsuutfT|juYqT`av56rrzXYQcs1c;ikqR+K z9Y$jto|BGDFBB~Yk`PjA3&k9Kbj`f9p!rb|`2Ayo$((&gPj~0r9X<%mdE615Wwdif`)y;!mMC4Bx{J7#(X-qIr%G z^xDMz7{vRZ%od%YHPeS4|1M;0{AcK!vLQcw7aDTxpCLmYw_#f#&fI1nXELthHXvZk zje#^V6&Z7%n{GxqWA5_loog|2ij1Yk+`^G-BB?30aTry;X+eyrR&s^fpvPeBX^KVG zrB!5|A@a6X8xVq?pxa<+57eh$PzUVY4rAhb=@qjaMTy|nodax+ZutL)u{H;F<>aw0 zM=#OFagu$k*|7*IgmbevY0OxkBLxW~$C||v7zg>{O}84v4cVMDVt^6o41l>A zeg6k}jC4eA4n{0-xCJw;VRK~c*f{BW-3aLu{#Hg+4_%IFfXQ)g4kvANGz)X+qwuC? z`Txe@%6~^V-g%f3zZCv|66p|vH`3n?Jdn8{x z25udzeh@GxU$TkK-*X80;#s7gtri0!awUpiyS7 zGVGE~Q!N|kj{Po9LCN8Z3|Q}M;=&Fb z0?&ewP(g1HLOH}46HlfWqI431P22~FeI5A598OEi=*Wo~9ck#RPzyT&Pp2BUmI6gW zr6dK?SV-aPH6Tl8EXSSgx)etj2rxzD0n?S=rr~j#IMHdU zc}Ghzb>~D=cfT$rE1eUw(gj|ZRMvwN%X-*#DZZYN!ae!M&brp-^@eEd%{O+{rJc=$ zs*=e!nsjOLy};;Rd}9}V8sOpqm!_r(U@4X`1irDGnuxU0Y{<}TzA;0W7C>46X;vUj)B-*~+)Z5h&* zA+28|O|Xe;Z{ZO5#v3AuHnBXPL*N_x>(VSEQ1J-9(V|N$L0SpY2I$g~M?>`-%{S)i z(rjZn(KeQE9H>jnD#QR33i-x7T_QgYQe_<9I7pXvXgoMGo^QNSm$q{PC+?iUH$JCJ ztDK0%aU$PXqe~lB1ZAj*Zyc;kv)Mt6oo^h9G|c}bd0uCfU=Ek?jW_849g{J!Ci9KA za*D(uc@rO&H<|#n@xf8FIa-fvs z>2FZ#$MvL_Ctk81OT5G-+p(A{5*I3HveAUaT!gkD$}v7$5J9Le2++%3pGkKCu%XN#F2qQO;YA>sb`wL!0fg;M$|++2jjST5`Xl6_C_Mv=1h z%-qpzR+$<=M&RkA$e6f(4Acyje&*t?lr3#j12(?6mDS;z3?j3|D0<%1q;a%Yp)`O$pmq>-zPjv8+da}c=Z-RMGVM?yOr2^EpF zqIeUP?|@xd4e`Mq9uLOk1m1+CHfAbZWa$;=!K%J~Z%vpl`QfzczD5gpW%qkq@?|j# zb-Fszs4_IFY%HwmH!f)+Le4QwE!Ee-%o=!05fdo&%C2j#wQNqGnM558xlM^}LI z70cs5`I&WEk6!4b^l0mp|8pI?F~uy{Ej8X7(1Yq6Q6`=?4clQ$OaI6>w20? zPBqcy^YT60ua>&Ug{>)veV@LDHYO9&i!A7(8)c1X1t@ie`%Uf3sy>(Rw}q^I=U$P1 z+ltn2T|N}8pN7`&3isRWK3D3u5!j^r&~F_20lJtp#NwAnlOJTMJwFf_d||5U!dR~Z zRpCDA++v!gvkyA=i*(8%kacMJa!jprYpGMLbtE6!T#>9}Ygty89_@P!^m|3`V2mPx zP3m%$;a+xkmz(A^Er%MioRhlL5bdOE5|qYRBaJ5HPz#jGR%Ys3V6CHhzAQ7+f=B}Z zEld4}S-aGJ5x&MhV-Vw?`4nYJ&;Uc219xOzX;j^U&8pk$^ptxa@C@jflk$KkrN|~u zdj@uxXGnuBt}W)|j+gu0+8Qna;z?N^x&fKb%OU6+*-f`h7?V3giFRLM6h86Xzs)X> zCRM79oiJ|Q-i;n@~D=Cb>`rnSY$l^$m)X;&rC*VA_+F+1+~ ze9B|)uHEA*=Y>C$*{QAxamVkYs0`cYLHZPCn|TobNA#m9*XNyq|7UaE-l_Ee7N7Sv z{7*)Dky(>q)33P_cW+ul4Ef#65U|4OS2<34ePuUu4Y^z8)%v{2=B40C z9=Zxas#r-}qUuceuLupgy~KeY1DnxsfaW;dnI;E%*X{~00H zJkti@V}J$S1M1_j5x)vb#GYqqbT`YRI~R>orP{1;S{7J^&AL6HTa5rM&%W;LFQ#54 z>JqyjjN1Rq8({gR=d~GQ1kTGd>csQZX)Z7c=16qpv1bmVIre8+Ubnu&Y_!l9ZsGoG zeR40h56_+p0KOmtU-xWM)M`MoTHpV#_X@P=|Cf8UY?P`<)~b2zAKf|$DX<07T25A0 zZT@AffSR#_)W`*B>aM$*U9<817;3tFQ|~}iYrGDOiE=d8=^6SbG>|7=5&aD^dOIwDWgxC>#ct1+=;xrvQg5&%S-PO7YgVAQ zEi~{AiEY5f8d-aa=bd6GL|O=!yj{2G8IwtD3F^A4$gLV34`OHPV=JCF`#iM{V^SV; zC=O;sJ2v}!5{-#%OwDub-bt9NYtb?UY1|4s%n9wo5U}$sG+GQ6N0G5uf!hQ)1Zl7U zh7g)iCl!s)GYO3P+XT1w4pe9J=6kAV8H`qw{68sy&-XYHPc)4(o5c;Ge2>AN)zQZH zH&gX)phb|9QGG8Mp5l2srf?!pdHaxuAYFQuXS^53lg6 zr_8Tzrh1Su3~&gN_nCT+S==Ke?z2(rIq9zpT;4hWi~#_G^yV`OX1B)$9f1DUK)|J- zHT9kX(f({4!bhI3qvkmS8LC*I{RvGIMH5vwhBx=giRbR%mw)VuIH8J%U>AF?J-hVjrOjV8JGBs zHUU=y;p%61gPq;MPDN#F2R2ftTvg)sb};V(`%D)Mc24Sb3+cK}w3tLA$+tvk##@1R zEAY}@;mGn>&V-dcS8w+39(@v&ohCE)%uZE>ogW1FpM4RnxQ?+qdggUk?Znl_HdwBS zm#U$cZSC1(nyRfT(<*va1+FlwN|(3CFb}%@n8-DrI?pzcd#1#xN%-F8VJdy4=Bx;P z$3WjPnZD{(%w1NLP6nz_*^T_NHuc6HY#wVX{a98K1M?`rI*6ashS2Sjz(!^tJ&d16K-j-vPDlp=M@Im)lacieJ!SKGito28)~3q(FE6x zt#A4cgR)4rC{+xOPB&U0XY4NOBdLU`U4S*5sSL#l25jOA*Ep$wIXw{zJZxg!VG~nK z2>Nm5Sw)+RRz{K_A6fN|8A=;h$-3udh7wyv15ITx4X)*@X!AuR;crw&YGdj!v~1Fb zcm!?42ubK2<)mRKMuF0*%MG~qWfUq;E;q0?$xte{E;p`fWvIfz;ghrfbzreiv%0q; z3}&um%~>}lmCwL%lnpq{dR^ZHW&E+y>vHdjHa)iMZnR*BVV9?*l)6f78cs=9sSV&H z<0_RgoD{bT<48GiZc32Np8@><#I&hi83*&g;b&K6r)8@%TNB+ML22I=-roMDThObT z&zLPct3(B_j-YuF;IjZuO6n$n2O-vzTeS{7p+me>k9cP`4RQ{HJRf^qb-!EutfIct zau>vC(pEXLs%cZKD_s{>(UKg9_ATh za=y3)ZQHW)sOMi;8dd#v$uc)ao@TgVo3A&kOVR%8HSz-}8<0icrz`X%w_I|fIwfXf zI&@jQ8CK^3q{0|s@Y9-g0r)S-Qt!nTI-QF>mD5utXKPMYgqx=445I0|-RPRq{{uOP z9w&0Tv_g&r_$|+oq|ein(z_$rzBz3?_#H7vK=2pQ}!LV3#T(Pn@79(NSAu#CH-lWjg_ZAZ@5J!=&&AlzjN9 zz)~7yKlN`f@HLnUH4vFqWb9dsg|!qZr8QKuuS&6Y`MoPp3cdtkjQaqAAeC2=1t|#9nWfYwKW1bq+R}{FW=5s^R%tVZ zUyW6B^%R=!_q6SG$1WNfuM zs&S&dG#}**2o3VyIzLU#LtM6PSkuDTg~P?QJG_4}bJCwN#DZwh6s)uHs5t&GG}Y3` zH+G0TtW^A0Jk+)eaGSYsh<1$%iOP|@Qi=wk6$Bwj55*92v1_Dktf!#-`+|-uGBh~6wza8d)%GnXl8VsT*(H3oF zUlVC3%g!@L)`r-joaek9ZevSfJ%Zm%QX#)oHdb4n$1(ErsG}%tl`+az7!h}j!mUJ!JCblthT2K9B5j76dafPL`WlX}wteZ#im#XC+=2M|V-}_L$5(-z zdmX-J$X}WGx7^x_ zFjY-GZtrmq89PRZd!BED5N8RxQ!H&P}ok^vyScWySsuWml5z|x|pvzv^0qAF+)Y!15 z^Oa0f6;CpsH78RYeNLcozED8Nc~2^IZvnRuq}`7(e#kUO0{|LcIO8T;tYURv@t7a} zP=48HUv2z2U9T+19!R@ohG=Y$6$(|4v3)~uUV(EuA5_tFEZ_T3|GpPgDT}Sg7_T7*U8|O0IyubdJik@ulA@4-n~*gT&>2$ApUA? zX4{9&i%5MpYH+WiP20`O$o_}XncS8PyHf7W>IoU8YyId)3ICdJP@>N=cGvLUs$g3= zyhntQ$!iT_@>)76ZhoBkhWAxrP7cqDED{>CKYSd=VQX<5wicc$i>WqZ;$W=B>ICDG zyJ4oNE`_cDoJInKo20ImuDBX<(n+Knaq1r_&r%?U!foh@(UdPv1A)`ls$MDZZG2Rn z+w8-e`({LMlpURd-XxsinozGPu<90TD{aU{8!FHS1nCa6fzG#S?@9tauahz>Q!&KV zuF_iH6(u*IB!ZMLmsCk<-Jt0A+NMU(#7?Tm7GDFyI!y0vjEO1yHr;~eLyLW=V%}mq zNcwCkk+=(XS(|tml_N+a7PF4Fw1^giy#;LTe(&|*o!_fRbrPsfqQK3I$@GseIhMXS z=&7G$Guf8RmjFjY~Duqnt|TQSoa24_J^hHQURP`Ti8nSF;aZqZ1L=+snhetJQT=V zhl>%H)=ba06k`>BTA(~~7^}H6U$i3Miu@*|Q10Szu30SQ3M~e^hT%vU;_e8<3tZtJ zWe^ofAPh1s0A`>Xy|0h0XuC{Y#3z-(v*rJ$99Hnq62XRX<`Ly9+8yiQV+atlSH}G{hg*%u& z!u%u0TLOp%WEAhUK=B^H<6p$Ic#)G{dxYj@ zZ-I@!wf8U{iTsPA2P^y|w9MVYbJCNU9Fz>;g`TDebxooSdl7^C#Wx^x+c?=9w`NaM z7}BNI3NlZ-bL$_jf2TfJ-xe*lqcMlBfohj&ZG1OGi0Ei(Au3!bS6J{!l6mN{cR|@& zq^*_HtdFQ-iRFxns3gUs3i((gICB?fuzjPJMMl{^P`2+yGLU3J6&{^7rsXK>BG4!k zA+pttA#O}aruJ9T$<8fdAC5K&0g#9wO@CM~qXMXtQty435EK8hb!tLu2Q@yg#>-f- zI_BZ_5UbP|vwG61XoUw*7;k&M>CQ3cMs=y%Fvb#Lz*!J;_Ql;`K-m%&7?U=;B?E3- zLikh`ljM&zMN+LT6wDaK;=_m9n*E@1Pd2j^rm_3R!s|*l@iXUGZRJf~kJWiSt@&pk z)8z1_#49oT`^Wyz^d-YFq%ch2ZgxxIH7adoh1S*vkt-sNazJp-`ftF$z94vMc%Njs zBEcyjn7WG2tMzPcX)eWr+WLCh69iW-Ou$Z&dj6>#LWiqW&`ZKg(5Z2~&HC~BnX#qI z7qg7di424>XvmoLN6`>hB`Y7F7HOfT4m?w-s$rS`h3>FI1KRUj_#gecKp6;Aauk(L zGcT(-^Pg=eH%dEhV^HF`<_QNReT`|1)fItPBsbOGRl3 z<2T^?#0J*gKGM9ipVM3G?F3K0derxo93!_E<+Q)3A6sJYt`4r3?DJBa*2jrW>-A1t z-UnEZNhWhmKgF7_Y|;j!;sEBEZYMuw(!$JSRE!`w9{wiE_>Ijf#+4sM0#+4|kL#Pm{Kfs%l=#~$qZB5=ZhY*SJk(-?LD>dp1o*P^?m6Y&*WnVH=!nCpp8O~YZYQ>cIA{T8 z1nFP*vHnxK-_hq$-civQg!L3#qD3`c>#Lmf!J>-B(;-r-{T|v({IJ*w611Y9-Pb(F z@12iz_B!OAT+AiUf}oCv2|XSrbT0WSz`AkE%^hHyr{oB3Y#QAGSeNmkI#u)3>gWc$2=5~&%u9+we-FGK{QbL~y9;y7^wjuSWdb%%+s z-)DWb5PXn%!P=Q^?ZusFGJ>?>J~nge7{LtE%mKCT-lCI(V*4;OJ&uDls2u0xPK-aL zMyMgUNnQZ>I0TrO-Q-ZBxaJXO$IYiPO`C08>_jyPQoH+dd(k*ggSxtYK3yG$%Nl%v zIcYV;`e8qJV+Gwo4xj*nbi;k!QGn}kRX6exNb2SHWKGORb#N69F#EJjP)wgKIp`Zv zRiXlFJfs=t_e{0yhU3fIikN2u~A1Zm;?8HhO$Ly+drFF~vvF$C$Z z`4bSUKny|plyn$T1Zmt{wgk}&h$2Ws=Q02v-DQc( zU%>9Wt03vhK2pc6{4iy~H@4rhcfDrj}Kfj5CpgAa%Wq)`A5XSqqVZASK_$F3jyNY{O}z z9SekABncM&s#OXv11N%Y@=kdnL17nC5G3hN6_#e_R-__Grn}VCE_942V@;`rGiA|I zyG`5!s68&as~vxrS>)uC&#IgD8mm-LED-iWu^h$9K@3138lK=}d4!??RM2!M9_7F{ zg0%5Y<}d4>pwz;GWxdr;)7{nT=jOXJ)ldK3S*d17ZSz+|@mU~2kVf9glJDuApk%PT zdxqUS`MyOkqyl|bW~w$Hg=vqcRX^(*X;ndws*3(?|Cuq z&4sM+-rjNR7P9;9&5nC~A$#%OytuN3%ztlcQb`?7Trq%eD`ltdwZz#LGV?rZS{V#m zWe1drmQrgLYYccwVm!NVUgoeeU@xm%<#EX?i3hd(XHJ8w22VQ#J=I0|Q))c7c;bT|U@a6`ev&agLz9`F51vUbo9b-m`1wkYbPmhc71_mmwbaA#-0H z>7mO}y+yA6vr9doR1n2l?xT_1otO0K_s@ZkC{U?o-@0TL`D<}pwxGdf>_AKUNz{NK zb)RDvC(*@yH1NSSDOQP-AT613gmJ4A`->4BrDi`l%T_>>%e{ z*V&AxaU2jNTnCKKJmAbDy-hm8+CO-0!ZOskY$LNixJsqO|DZXc0jUie*{=`I zR#Wd-&_n&KT2PpF5&$P#kjjoO$W)<{7xonta)`&!rEpydZZ>EuwO5&z)U*z8M2t-( z4XPs!WunvR=4MFx;*zx$Jalg;7M^GI3%m4)t`CMxqrOIV^mmaNTTCT?z!eC+>(b!g zN9X|PjMQNmdl;MJE@iY*ESgWO;i0~{|DCz9R5SkJjM>rrXq9iE=5pK*T>Kr>t$a9^ zy1A`1sTJx{g|!z)w*vaVQu)xu%vP{O^HA+V8fzWYvDSvBV&x<1Abw}_BNq%N?iEf% zkn(OPB{B;!1gYQcY{#OZ$>R|n{|fCr3vXYwIIZJM#Am*8+C#$7dOOQpe52sM6PM_5 z9lbI%r17y3bYg&1yn@}#E7;8d)1KP{-fXcMrv0Oy0t-F70jXOG1CliPb|oDzvjBGM zD|DN@?c5+7ERl{UolXOulalUI^J!c6@4J*e$}e3A24@&uMK=n&UkSegB_CpV=CD(X ztx0%4OGJF!EyrCEr76(<4Mg#J9kCYItG zL3$0}YPvXsP6%es2}JyG@lu(5$Eya=2vW_Au*`@Jlq9p#FcWZy1H7PubMRuIqO3-!R@!@OhhE z%@h2vy$8J&b*CY!PP287U7ghY?*QT<>FmFm@3ALSw@j|(aX+BiBs9~CEZh>Xi;LTQsP{ZzC_h{PWomFYg*DfwYWuzMM{ai zQ6-8{;;VsLj z#KC?Kbrk&C^Xj6y9Z(!@n9h1Q(+ZoA)D%v-dOEotHY24uoRT`-EY5{?5p-A7dFo!A zHM=MzEx80mv;{q%OqRKn7Ddm?WY&3U-@NhY zf${QJLcqvy$UQfKnV0lU?bxEKL2^|ERZ&$vIuSQM zClj;G;;cv;yF03Y-+K|Rdz1A%r;(7LP<&eynj?6sDsM8&tLmM)wMB_9ONc8snxjg* zjuM8+G~DxQEb?1H^mfNN=rX3w9D>Jn9vvK*#&%X!X52K{Wa))=pYBwHUWjwFvCz@q zc%ax+!b%>`%t&t)AO`@;O4#bh`}fEJ(wxo86|E`L-~fqu$!5_*4xNf9>qKClV7B9PFhhD%DT( zle5*US=CSGTzdhGy0BR2m}ys%Xr|Pqb3#%gyZfoDkPF>YCnrgF*1_gGtIrGQ_)dBk9y=7{DemzB*0l#L;B1iOIKc;@|d@ zRK(&nlBA_GxofwIx_`_vCW0Zdg)%U!qQ1~vf%gMG=J-S-9L>mXX%_bZ$IVE`HQq_e zyyhIe#Jg=vA(?6>(1fCe^R?UbbAHoknJ@ufB6`Yh8OcdKClT6;W5H1KT&%<+Xd!_q6g_7n~i!S|VxwhM53+O9&>6d6`z3|H-nbGsWXauR_NFA(&|9k1B5AyOO= z`;G%+U-Nz+aZt*hD_=QKEsmNBx_D>`+~Wfn)vkYi8nh~#GBIlqu(JGDpvqOo%J&{GW? ztM)ppDmMBG^6e%Wz;Y_+*;TOCQ3l{_R1|(4(g<;SicU{E&e8O%?#L&z#0DsUM$4>1 zmGF*8=gc9=e2Q4ofaW4dkKd-eR+UIXwG1zWc4Fd+ZmIF7=us20R2&8%g4E|W*74c0 zJKaBPHNAmvswoGC5q(WBA)RV+|E#a6%WX8evS@9EI!W52(iNKa7|)>`ACgwHZ=X#U zp8PpH8Ud~5RQ^ngx|U9sgR>wIL0Vg^zod|gahZxoH56*;_DDzyoz!SQ7yj-g=5rzG zj4tOSzCnc`jgrZSxlcCvyDXu<(h;P=#dN%j=chox-61Ic@MGMpPPL37Q!)WT9Khd&s_!Ii|oL2 zT?Hd&t*7;lhD9|-B5k~{JxQ9#P#$omkks*HMPqZQzd0m{ctI>PoVq|xt@xoiM7NAG z(cC?t3_+@y6q1fzvOnqhfVt+=bb%cMBnN`aP-4Y1wuKlh@_?zu zbD?3=Z*eXEym5^meHYJL>u?KrAgqwo!j6z$mjl;waA5SjK6d7Q{`pS|d<6z$Cw>vQ zv9F-e!6$KXJf4RzmJ(k32rl`{F1j)>iL2u{DB!tL`B1ZTR{^yrB;E6qa%kfBoWuIE zCLQK$w81V5<1EuOaN*@?VJ^glq}w7~nD|o!ZEaR=1#q31^#|bF`0p%sw_D4z>8hu< z?|_{DiY^Sf(?R-^V1!8Z2Xs+7EPbaT123GTOj0SxNHZ`x8k#PYEX>K@l@gDQ)& z5|yZZ=mGnIOrn}vr_fJ(0L$yp_g=^O=|r_sHt~g9g~4=bgr55tiF^d9e&RUX{87gA z^(Qc|jU-z7o={S(C+PVq3M8K}huB$x`c}MdTa>zJqtdbeO=iG(OH;lLXe!{6*6Ia4#-y?Gv2@&_XbAh1lG7VchEva7rt@c zMaMc1OfbXjM(XXZ0y9=oG6B4N+~@I)h)#Q+O;~rWVJUlP-SA$sk0&|;VI^37M?hb` zn0>i!kTCeTeyQyUt-v;{qVXhlGJm~=^j{~o4Aq$7H6W4Hrl_@(=_VFLSL|-T+lsJ z-ykQ>z|`ulmh)XRwW?B&yCD$W5TAELUVnxajF?7ay&c%1?hTw?K`ZiGBhkDhhUTE0 zx?rX{Ks!P{syu?$jw3ms9%h(AylQYcaaRNJod3?bkqYMo*$SX8UY2vhQW+p#$GVEf%dzg>Mm_5^&izrwadbv>Z)%aUOa6+rM`;Ip`{lkF(MMK9et|}Q@MVi3 zh4pe>)xGVBvB**$Kflv#aP0EV2JVn_u89@9EUjRnCw#+9c*&J*`k=`O?KlPHdSDFu zBXca7!tmcFDCMO6@~^myqM5QVV&* zlWs}<5jdW#@f!zobXSd7c<8vsuEXhfMQY)NaHstKYN)f{YNZ*Cb) zEo&*{YpI7?w&o8&xA-#E+!s}i$}tvvIgNd>(LB2405C@}D+x>qNzWf267K(i_vt96 zCCd3vupzHp`#W*naa7`q>lgT%N=)Q_|-PBKL z2l0K*O+1zDt5FU-0dGj!eU`3ehom0=Ho}xemlFm-rllUO-9QN*2T*gdc)rA5F)c#y2?% z(%8{76@03ggbJAmLP^8WDxqg}u&m&DF@n8(6J~{*@WEN72`=wV;U>(SiiM&$(uN;I z`RaisrI6^|Cu&vksEXRNzesCOgQ&J=GTL*4(w<0jPK?qw=jbROp5b$an{x~{qN|gv z+hG5=3GK~5d%qZkM<4KwAnhL&lK%b^@9hQl_x;)8&G%Y2(jibt^8BRyMg>Xyr%tjr zHWg-1IuVlo^{?fS93kmT&`@lG6(2SyJCGqrkB?GCJnQjlZr1$;WUD5ZlOfFgS;k5#;y8#nSNw)Is@?)5+MrDP3p040JnbyOmpeyNfbNI{S~f_gW;-EU3; zlSYqX9XGqP%JS8!=H%mB#< zt?Z81a``X6f521asllFvTG;eGbG?=!{Nwvw1-MlDCZ0NfbAjh6Ia_cHQ9HkG)KY9vt~K&&WHHYhAQL2n|%y%l-oTMv5ZiSn;UDwzIJqT-(T zy-lnHL}gnPuO7*gUms>#wzZA8Y-_V?NS)HYHWs4lrIF0>dhem!iD=^D!(==O;*Ayt$LZ>9NP6@*JGFJ#z+-5@v8`X=Ni4d2pgxM_!M5{$&ROJ=&y0S>nbEJI8fw)) zp**vm?_V94@lRIyR$qgWz4F#AaZN|qvA6oi`H!&Fw}-{mA7L5qn+4YqIzrLPu00a& z=CCP+el6>qt4SX2%a06!k$#c9(OrfI@thcIO3q_PRG5k*D#X)Atl`{cN64^gd<%=i zTV&X5%%^*c?a02sPQQIs&g3J?S;gE)iP>@q3rbkz5_|F$h$%-{-k)z4wp~X%ycJ2t zV!!tw)N}kc1l}++YqmBt3GpU z9pzvkJ^Sy*7rk-P&AbI)Jib!RE_~5zs-4U=_%h=wX|lNipR{jji+4O~P#6d>k;szm zLgffjr~KwQPVabg4F+|#3C3uoBS>xXaa!ZbFE-#s-0EV{1GTO=4m=rq9kaVL)5vDL zA>{O$v6^m05d`TQ8>?}r#`Piy)6JnyPV8Tt$wN(4+>pK)!&i?+>Wvc z(oZ%xaN>L4TeaZFF&i`2n}n&~mc#bG0lS%naY~`ms6sGv;Xtt**A0qHP8rf@EJPau zKoodOF@C%Y#1|01@D@pUPI}8$?pcceW9&SyGBzK@FD-&8!_V#I1@#QT+`N)voaHNBlHXv4KXNI1Z%sC-ICVx}Wcoy6GAZ9~# zkyF;t2%d+{Nq+=PP@1iEoWmp-^LT21KUf3Q?K^o>RQzyOKD0gy8Fe;9RdoD@AoR!D z1VN|4YAT%uYw*AR!yUFAL0`wU@(TE}*MK~?mkz$wx^8Q|vcvx%<3!8KcEMbeUtFU* z`BtHHm9w7jbrr5moGU`yE)Z9ruCA11mpbRB=Dzw5m7}EX5-&Brshb8rUN&xUIlQwy zRalwlcy2141F2=2z?b?3oVZ#Y&4q>%yVs79)gI4UpPM_$>zh;TshU#kz0K3U^fu(E z9TwY3kkzo=;CC*-vqX4UUxV3il6Spsq@4Ctz|QA{*{sHsZ*O*)i*QI|*K=3UpTfs> zW$*tBcfp%Dlvg`Y>%XX>AViIY9}lZzA)4KMWH%JeT%On1>hM@gX)!QOFj{zrvA71m zGyuPEykNc*OfU8fEiDEgO%rOOI!G`Y>H3xvGYLWZaX4)cY7j$^q~RoqUoqv2o8C4c ztb%|Kx?K*s0!CU}mz!JmIZnR7ewt75SR&BF@=T+3NFDU$;LO8^!yPGvy^^Bm5rNzZ zke1BTBPlr?&5bVd3{5tNq_*(xKY~UeNK1z+JgtX1zBKVnx=n0CPLnM7-We{CUwBAb z4;Og#WQAIgi0zcmfjp}*%H+2Tl z1{de|*ULIb!eJ8Qp$mo*TI>~XgbQEOa(4l=UU-|->pOqakUk!U6BXsC1`@n22d~ipowz6`SV8$hq}prwFe;3N8ALg> zp`8jf$bxek%K@9*xIBF49dOFu+Rs$t=@9+zRH_K*HNn6f2QdiL}#LC(ZJrjk{iB;1~f8m&m^eqLfdepQThzHw9!nknNDO6;yPj zqvVz&w-mXha_%&IO_MvSP@IYHnc;5*Lg_9&XZpa_sx(5wI2stIeT7Gmr^zU_Y&v*V z*r-0>oeNN<8nSZ*yvAN?OFGxm556ibtg6?H!p4@BD|{g=YI9U9V}PZ#QUcMev@N<=EEnSJ)t5m*7}U{V zY^{yqCaR-jj2>ow4Exlfw$I%DNAk-b`Wt z@g#BoakKadM-!*)&+y0oGmUOP(*4Jy(<*U+u2R0ur@=Xq=8Q?(hqC)(%I-nh9;CtE zb~17}fc+BNIWB1)CO(2RYA9>kxkcECD1!9!5c;)*gkD46s&$>;TH`V#(p$GG@OMKJ z9d+LSn6Y84!^XBw$&GizmEMil^yIQl$en~-drYoRF8dGU@>I5d=v#Jz!hgT(JnQt~ zfVgM-vw{zMcYn0M6VHPp`<2>P0Ps%jJL;f(XUT^*8-($wZoHd3#JEE+Ng)Oe46$=x z>SJdR(;$EPQqO0NrwS*@kFCK)XER0|Dr54aM@r=$Q8}$~uZ@7!M34GIRJ0I8ER>0O zKPu*qBI0$#ssULoLv92~T1CH~qy&W~=JTcMSg{beHvsnr8Tb6CdhbF_Vf^xQw7MEA%Q4?rxOiM;Gc#fq5xpSg{thzvzG@i1zD!bW}mC2c9_ z_smba1zZJ_6My|87(R@G9-R0uC>~mYrZ4nd7r)RC1Z~3o&!iDyLKJ1&zfdXT>N%0C zCu-lg0%04X2zwrcX~W_75hjq(xLhA;94JFYsURs;CTSL8THbV28?H#B|I_#t)8V0LC8 z07Z#B>pH_ZjZ)GBRvbf+tvoHz4nMs}mqSyq$yGe6R2<|{)s(Kl#RZsaPmfm7m$pDZ zBZ7X)??hif=+jvLzb4IAYp*~HjA+4PxeZgqfVYp_hE(&Ax-)Vs#*0=9wUBQ5juO>& zbZ)gBjp-`n0Fk};*No&WbbJ;%9*+;)$aeqLnxrIfQu81dzt@`3fc%DfRjcRTphj3**uH9Lu%mJ?{7m#?r!;eAAJiYJ~`r(GvKKLpa%InfN%SR zpqK7(wB_lJ)6Ey!nyqz<@MXY_UNv?2MHtsylx2<;hZd`&$)*}+tS+Wz?tEb*lpnwaN=}WoSey1bxrZOG+h>Lbz%A? zj*iY3BFb*(Tzy+(i&9(rqpenG9DQ4DYlG|ZZEbc@TTwRL)RbBpl5}}bpk0%GTcp?q zsFjLb>o%v235GyL+q+_H^5t&Y@=#d@U?C)?f(=3N|0eqPrws9bNn(fYC2V+ek+fZC_HRQOaPGbJQ3iT8uaF&MH;B81S_1;(v^t?M`W2Z zN;;kY7{QqUh#{kv#rt`06&GJi)u?dFdY}#6NwChAdxb)?&*SvkV27>o-Uu>UPNMQF zOd_W|iE1KqsM%Gu*II>J_*1NPHoWyvQ8xyE8|v)%+gt}9wkbTT!O}!h(G9ckJ|W$S zD7ldN5&bZ|95Hg^3?jBYy}@-3x0d2zmU7DPy;WlytUPdWp&oa$>ggWv=3HuZNpBpL z$SU6LbgpRb>#^WYSW_-q(&j= zAXlbU-WIttQBooO(tbT*|JiT4TxF5Een1I@GXk;VJ47{Vzur$R(<(cFT&=QwQI+l5 z&;QrT{v4@{>e>=jSDg@3*}AC8Rz+3z%zop4t!zPr}xW zn3i|?GxHT1A}CYk`zQp5qYxbYEP6bAf?Ta7yAjjIiubdIa6>c#>Z5SK5rz8|AqM&S zDCDc7kU#qwb%_!K!7WNa^vs%}A4b@O6sEB#E+x8?Sz>ZW{VgD|prZ5|Ic zTzk{Woy6LX{?2HpZ*u|2a>%>2au882OB3s74wNPPxw=`?c$5uzi`SxQT)Px$RTvN*;D8A z@J0Fd6sR%ejX~>s4HovQy|S7K^^?98Ez>Q3D_W-DlOyi1`Wf_0n-BnPA*rmn)eb5Y@ZV?VeelTxikrxC&WkB!75%;w4&BR19i# z`^Jt%9}Aj*KctIQ8^>U^Z_T1ciW3x+L@NrkW{=xtLoW21Dtl+Nozyo?>436|n6jji zIZo9JN%teYG2c!!9`4U0LhZw8Utww{=DHGJ2)}h4KFvMN`%@c6ERPmi^uqUH=pv^RBtn_m#8n`ZpQ3mW*FV0Pj!9s1MW$W>&q zSS_Im+dLn6a;H3sSIc&Jo9poF?=4a*>RP5n#upamf%|9y(@BesIIp^HpSsMnTq@G# z0tM!jSvH)%E8ZUGCXlb(JDxpwuC`0bQIGmUh;D|Us!Jb7W(Z>cK`cB&5DR{+%@A4t zYeKfRqKk-WtJOCjtK_9X72gT7qn5Y-V|5h#o?T+A^F_drD%b7IoROW`WhTt;m@jlX z?2Ou&Q4QM0%o*7grPMO>&Yb(qs|wqLH#xg7}M&s zpk*<~1gj4wOu5I=`h=;qW4<^d^Q8e7#Ep2ggXW7vRyk&QoR}dJ7Gz^79oM_U^F=zM z%$M-1C1G=paL!GeEBb9opVxS%2(z++QBS|c&9T~iAM+#(o z&`_uaVz=18SMn(e40U8TNIpM|w3<>AZN9>bi1mKFh9Z2@N7xFkAxJ-G!-Epv2-5Lv zGUVd%4k&=+FE*e{4U|KFWb7z5N_8Avd8N|Y7tJEK!Xnba@C(G3<sSjROel!q4dL&yt=1d|R>mei`+Qzninl79Sco%KNalEX~l5$AaB-m8}5!iNG zb`D;d-NmfIbb;$?^EUi=%eFI7exHwK2QdkPAVEDlCNucHbhS^YpSqjeSfRS;`bi*X zH0207&W@jaFNKa3R97D#X46mD3Xps1^s}nLSbLd(9MM#>s5TfnW00x3t#*W8U?(4r zuYaLMmDJ6!hnajqH+&|f$XfYK=&!UI(b|#o4oukZP};A1l=cNBD+M_Oy>iLol zu3qjO>jFvX;0u#Nbk{WsrtjiSm{2 zoa+VZm+yhw5TZ5jknDLJv2Z40m3!E+{r!_SA$yaY{l`75$KTSD8<5Z-CrsSKY=27= zG>G9b^aL<0$ioo_qWIl0bxEVDvUJobFH|a6h^5_idCHNULKNjCN4T&bWb7v{+$+V! zRI9dv3Y`5YwtqBajmT5_CjevtnWaZQQu}&c`1ntQ|NJ9n``k3~w_g-P{@DWhQ`EmKXL<$>OcB$OzCR?t;5zvO84(kR7#Yd^& z$K9$Dq{NRRu52Qd_%|`}FJj<7jfwBxjkmPJ+K__50|;ftD)D*&35sH+B)lFIuZt7g4TC+wguxZ>S4f0J~+o(we0}vlH>1;rODM_ydUR;qTtnD`sRn0C85(4XJ6A zpo`lP*9{tJ%q~T&yJQPbJ=*050sb%nLv|6_&X`L2$KdF@%UVZvf{^skF1nt@Ui$LJ zgkxa&vF+@eFDI&>{SW2j=}Fn)(^tJDhNW-%Y@+#H4uP#aWD!Q|!p?<2QHgkEI6ek-%frM2pd0i|!nlE0uA(Qf~{tm*GJ@+v}A7UAcl(%6!(6IkKb zE4mN+3F8B>XWt!CcOKm3GZpR*J;{P!cekeoqo+aOLnS-yC)#6H$%mv*o>kI5MOwf+ z#jM0;ob;ik+;1et^PyUV1?BX^8Cfbp*1BCVT;)S14?@zP{mQFIDFf*qT*reUY0MXN^WE>AjorAvSFYx9BHF=fqm3?MsJ=5y@duCSJS z7h^yj17{GVnqG9IQ)|v7QOm)MPH&s2l~Na$M>-h&yXuH7GJj$-sec{l-+b``dhEh` z?EDe)G*wPHK>q8nAaThZ;eBp<-+=HS{7&F~4%4>ceeUShTBDy%hgKy0+Rury^n3IR z--j36`|QDg7UZ~q#`XSrmsNgepZeI`OX=gYe^vVUi}3&KeJt?Lkx5;fls-;B!TNvK zTR43(ntva7mF)Va=&ry1UrPF`P0{eLdLj8h&f)iIW!P@U9pBFt?r*mc_v=3=flJ&c zvDz8dQF(wSq%m;t3hFQ zO@!IG=GK^9o365XW&Omqe+)i-4jp!6zXKg8wy#IRKFvxBV?vxjYIfX3FKa3>Kk`nVw`e$GQ@Q>uD2 zY6nX`Ha=lzL!7v?fz=#MWp^CS(W03X)saYRgbR&oMpez>s-D0jNBa0mIH#bDbgALIY4r@{2gU6yOY&h1kLNh8f zhbw#(73kv&V&eD4RQP^FYzr%Y&{tU6`)Wl=aDy>!ohVn?tMC0^-;eJ7Q;6&H8{b#w zlBq*n>RP0Uv#$jCSlJ278~sd{Auhkjx{ z9>GzFCplV7Oh{=+geyw0hSG_Nftrea)afL^osymx<5_HkH6DC2AU^)=$Ia3@{LE(GKY;ocw z=CSmk#|Xd1=w=K-34JpMAg*ubb?<2-@P>5U)oqLR?enmgPV~<^iBANnTe_lelO{eG z_m}8i_-_&^k6EyEQ0zlV)p%C@XfYb_E(%_m53>Cy`z9!sUsn2KR{z%}1^WI7G~II1 zd)MKp*rH-$JASkXn;Hq#{Gc-BG!=&SF+MaHZ@q~0cji(0d&_BhnrU(NX&9hF(#asj z7Gx`x_C)21@kCuu{lKw4eYC}K7dB6)sfo8k7sihqYO0b#UqG)b@u$)f6p6}mPGxld z|5|(dxT>mr@qex3_ISi2A|VnH9SMmD>4=0#govm}h=@o?41-v8gm9J)Q1UEDD;r5MXiYVDoZufEn|;r8IjmlC%wsl)5e4>sQJNq^}a ziNo|hEe@-PkV<~g+Euxk*{6!x9e;F+VRff&9CimFTU&8w@vCh zDy=#@DtDHDQ+sDI`+Dr{#dn*pH|g$dKKO0HoyFjR(8=!S99dE)IOj+QvdZPH=<1Ab;T;sJgnVNT~gb4QzH=dap% zlluWR#9408_gvsh&kJguv&^#eH|RSN)1uCShVjVr3<&uoLH?P^yj*?gmW?-m^l_C- zXOQ42!zGiI`5m57Gz?UXF)yRm!3J?DcKCNA|C=92y*gU^>s;FV)!OTg%eK3l)64Y6 zNp>%p7pz=hp3_;kj9@IwT}?QaN!BKtlg5cK7RH$Q_-UD1d!O|1&Oi#Wp{(>oK~X*_eiiceJdt5=3II@b72%<-m9 z-nY6m!Dg-ZytUz2K9A4njWBumYyJt}j~Vagu$lFg{B6a|caE** z&!tUN+uh_=z0Db8r_C8P{Q>D^TR)4_{w(u5>&qr?k0R^VO;pPtkREym$~c@++aHi6 zA@58u7zgfqEXv(5&u(-g7Y@g{kT~AAWDH9GT``!)m^bheU&(~r6~`{$x)os7nQpBf z!{h4(=0WmW+gC6_t#Oz3y1WT$i@P-Go||xV$X&Kb`^@*Q9 zWz*SmR_*bSJM_tzl3bB&07-X*wIdN%u%6zs}1^vok5fhs+w}>yR~D}C_VQ3$@~fib(yOic=i&+ zaX}pSA8||L_`9W5p}QsjkM*{R*&erKw;_5Vwemg-|Bp6l#|z`h$tmg?PdUv#t!i9n zTGi9$50dA1=2h`q?ml{W)OMP5kUHOqs;8H93H*1tF`B<*vJ8h7{CpPVdr9}We^=Iv%q}sYKGJO5ZRPGgr?a3+B5Hw;+#tKvagWFcbOm-teIAicQeR3yORLlvU+E<~)mMBO zFB{cPUwM~2sUG*0Q{}tEYr6k(R0n*?$s)(24l`wf4BFNB!(hFuF-h>`v~e+iYnG>{ zjdT#{XAbHdDZ}3gZPW&J{A!#{?zLR7LewLE(lhwyYMIP1K2pou@~5@V`k7i)*ICjx z;)i-3?&fzuX)#HBzE(S$pIqbr$wWI%YEKVGTIa9SEgrl5<+0=K?r1se)Z3b>`)5fH z{{plwXw+WzxV^-4`w4c7s9`+fu|3#qwOISTBriF^J9Yb#_%)13w{0`}OJ_?#;~%56 zwzXekvynblcRBe)Eni`<8uJey*lgdtRMYYBa5=2LbOS&Bv)2Nx3{D%PMozA8jTT*j zil*yZWasC60X9mQ%+fg8ju!)NiA2T3-=DFQ+KJdgky~A@H{HE$ygQznmHhIu*hIZm zV&WtmWFGVRS}!YKE}VaG+=$cWnNuRK4J(DqP>mneqLbVyr-^pjFwo?)xGJU?X)k3UJ4BqZ$$~51#{k|xDq`}JB&R{UvIVN{J6&(HQ z*n1rK1*et28au&m$-z0CK?+K_tP|V$evCDT&_!Hb& zadzbFq>U0f)<#ANzTjp1oheSmS#8`nO>a1TA!>UtT8=R%iIMY~R$iM}X_JxfDV6JI zg{an#$#{J;M>JnhGai!_x;MU7T>_<9xA|)|I#3?4?mx>V@mYR3`>a4z<7{cNZ=-zM za0@yot;G)3J1(ffv!$P<`+}B1R-N4!hTlrzHz>7yAIV~Vp2J346YLiv*f?^u2~A9X z!A8YN%fhJP*(7gWYkzueI2ZXaiuxNb48ExyJJQxMmZx~zdV6?>qPYPvrX?lJ*_mqD z?rnbT%^Pc%7)IH>l@QG5^v7;l(@E=bSp8YUcAK4xw$B^>jon7JG@f0y)3E)875qw{ zHI8G;>9fPXm6U9=Q)gO6b8Q#azo{8(v-5GxABSk}&|LAj*$_24Wz)&N38PJKCq!)@ zpOz%%nbq|{(%St0rR1@(L-(QA4D_0z9tmPcdKr5q>Z%GmhV!- z=16DV-><5vbEJ#z%d6_PInqaWi?h!MG zEasoqsiO{U9;oH`zpAr`n=7behXp@|*9}))49GD86&>o@+epK#rOmRFPOzG1nZl^46t{YpQ9UjF5rq+Iez@ zrTr^+@7Pi=E{(1Z1TFT9aZtT>7V*-ctsMtS{-ng9!CX|Ky+o+3%gB}rhus-r4yw-7 zQbC5DDJm^`r{x`ocVgcm*Lav0dq`6y&}p4{^FLgvxkW#0vS$3qyk2wVqRzSn%f{mg ze(LSaO7VlIin%Z-zU`%Cyv}?ZS&6qt=GL5>4lNq?%hH`=6US?wNtrK${kHYH|K2as z(`1O!TRp@WKi+JQM}EatbENw_?z@9RXE=>EFG;lLJmNe~d#Q6C`>$SAyXH$@-PxAu<^yInc%r}Ef-r6*Y=gD7g zUefp8he0E2i_U$x#K_+>1#M#Yr~_N!?kKsm<*p(Uu)>BuU%x`5*Nu+G287S)a$682$NGi>TAai?|S)1 zyMA+VVW&E0Y-ipDllejOH&xmr%9qYFf11 zrgvc3;Y8sw>BJ&GY;;0(StecQd!G39yJI^&PY9v=qv7?5Tsll=>f(9A3Yi$P+`O=J zE(gv%p<}9VczqO?3Sq2SArnKEcylSh-tZG@{xa#O`{5Jie5!y*#YeFz6GE8z-yVLmKYMY%uz3fdI zKK&kMx^ii>JLk=j0Ytl{v&^7(aAi!JXWVM1GbxGlFmyCB$=hQ7^_{WnDMljg>R!90 zGcx{b*Y(;}y*6eg|JZKEe{D?CMk8&!UMVJVVWIi3c=-5{5lyROWHi%`9Z^P&d{R0% zo#w8AHh|jDM_>F$%8z(n&3jUsB453vUFqNCN?(YgQU=}K=5Pm98-(v1Io9c)jThpc z^0~&E$^3z=n|E=XcHh9-NgMT&FRA@ca&=t9*jjW(&5xH^x~IN8s{4hkle*jQO-ht*Quo!T z>edx9LU-a*wRMH`r_g(ch7R$Et%eJ!E=e-oX~wx(X0w?I$J|`*o#%e?&Fwz`%YFFM z>cJ%GAJNvZfXh2wXIsPQlrbzhnt$OfQpTmZn5?`FX)nj^iHqdQ`5x|o@U7P;y2R@h z`~}rBCVuqtK_=OX)7|F3KmHI`8*L3tb{dZQJjIpVgi8%$O#f41&(JoW!@|{HCd*0Y zIZfJ6G0!u8Hrdqq{q4V$I8wl;Nz-fOccT4938S7Xh=ewEZ?g0<4>E%rWJZ|eEsfSr z22)t)4Yu4E-lAu%kF~xFqgm=_ssDniTPaCve68ee*efFZRRj?^G?fO?oE<$cWzBG zYaY%8{ctXP`Kfwkl?^m?o6mBQdM>*&H1 z`MJ~;eWIFEWuR{TCu&A29-eaaH>vW4QTm>^48Tc=C^yR8EGj`_}?k7xdS>(ZYe z)8@rC>N{`ANkqYE$xxr%Y3mO{-R{Nn4rhXgbEvvU7~D)gwYU zAZ~~c5{yJ5X~>p;AsZf1cWjg!efRqcQH|6iO-LJZ8R>Px3?$4=-bPwupH4n_ER~=wi@IV(vDn1nvu)M;L%TVpcw4l6|CemaRLftLskRAOLL5f6KF_h)Linyb>X9!uD~@wh)?}F0 zt}-o5&sv$e^0_Qi)XLTVQ`a*N94#-9tK?CK9gGj2OS4wc_nuktRLYw4m8Pg=5fKX` z7SNY}x_x0t_&g!hXJ3%~F!(OUEp>mPEVlPL#4qI_!ALj~gSZ}2H>wQ5dsX@3(V0c^ zeVtqSUxX<6C&^}gBeEIUh7|rqb^NV#o;hDrBRU0*Q`Rz&(530orgbTd6ec!lgGv0v&J5eite3tZU2Kc5S_t)xNh`IcQX18&x8%6tB}Ws=+>yiYOED}putvRH$4{Q(mx8)n z2etLM^cbDvEJc_4yZ7Z})l?-7y2Sfbk1FY*3vyLss-&CF?jdz!6*of)9#Ts*8a&nN zD(T{~-&2bG;f53%GQKwIP2I0GpPCSb)1J>XRrkJh(S>@cZtqjydb1kE`sl2er6|c72XAtw z)+vIY5)xK+&;`0dALs|?!!Q^N<6$aHhx_0G#UiX|*oua&Dq%H50V@=+YJg3!3tol; za7Yp37!Sr-Lucp$y`e9pp>Z@cjxlUp0!)XQa1-1N3*jDk0G7jQSj*p!7}vzYd3YIK zfkW`7!fU8_%NAmh5sQqz&>x1u2$%qqU?$9lo8eZt2bREccnH?Qlkhxjg;(G;c#}Da z1=o$YWx*c0K@aE;17QS=f=O@{(;KPCC!BXlJry?ygt68XHLl^8(q+gYgepE1Pm5{Tt zU=G}*$hiqZ&P{_fIClfAgH5m%b|^9=LdcL9m<&@DxoE49i+Ga1s2m=F18_)@5gtND zc*AstQYyo3Pjm2Eh5K3i})*G}Z71 zA+adLrkRBr>zkxChq51~^0r zbcBN2%^?YJ8!W_QD6$kqmU7(ERd@!4EXy?)ZpBqauo|AkRis*+HS~c2cqj`GkpuBG z5KqikcHkjGw1(|#a_~$ro{5B)VK1H_$)0t9^I;g=0`nD_iGi6Im=l6$*q+lN?vgnq z-AkUhhNO6jP`tEHjjWYrdi{E)@;Pc>t$ftd#}L=Ah|%p^#(41hD)^i!l80N=%(&4ty;qqYz z>{f(jd_N0=im;Am5*@3Ei93XtSf~hF#u(d7Mch>;#9jLoVV5X`U9uu3F~&?{jG4rk zHHk56@*yE6A5nxu4HIv!K^$X*aEw#LJ!xE%XTVdiK@rXz=ge_af`yneUlFbt>S|_? zd@w_Z2eTC6K|>xi^pLX<4>9;Xln1vc!iNKVIKYQ;K9uuKW?q$|2tUgCQErwWk7fcC z@hGG4qm06jGFCmxSQU7XYp4oE%&x-|^$?E);gPxfxGp-Nh)^Aqe?5a_D1%=pgWtkU zLM+^@h_F=tcTc(5A}_9()h(}g{!i^;uss!tJj)9~GTML2~B;baNrFNSAxs@tH5`!j{O zKU)zGC_+47zyqi8K%*i&aiJ$JoK`5rv^|RON@8}pN)gj@g_xeFh#6Qq1516*(5~OD3%9cc@PZ-(OxK{cPOLx!df9L3r}J(u?ZtK;q$RL42z?%I7Sf> zcpw4~M4W`D@IW;lsKo;%c%TdqG~$6~EFZw~Aw^8E6Jmk`Boq?}#e{rVfJYqgh!YHk z^C3xTLsCvm;j&~R*=>tvwrF6|cJDR(r`P6HyUuV68 z^=?JD;d(b*{~#fIkdV1mvrecyINpQfJ^JAwxx{`?_IvJvMf879c6hR58kS7Ml4&)t zjwHinUbxJQ7oMw{KOhslYGUF*To|=vY)3LzYmDeQP zA&PjTi1$Xg3D&`ScpVPVI~?d8PKtOWPKZYmAoV{|O#h!5B*e@RHng&#oq{)@V4(45 zpb3QQAujYq5nmLUNyugrvYBk3scqlG_7c`RSnq~-bS574BZPj0aF#U#lr5zEEXvPf z`z&pHFSPX0PqEk^i~S4X9!Tu`iCshh-7W~C&|(w{$fF-`QN&{;-(w_S0G0<}c|a-L z%l3n8uYkDvFCv1Y}84n1hC5TuCr86*O!Ywc#o`Maq1-8Kf zIHZUEjg(%|jHX$DGV8H94|A+T7;x#kkwcu)!DuSe19F5Ck z6%k2AkyOMCO+@A>V#zikmh4bOR0L1FqhJb5Q^e8+F4CJQS46pDMZ{Qf{cWv?gdA?* z<+8q?^@DH_-cZC7hlF_I2(+AMp;ZyFx!eiNgY@%Q`uXy3A(ltNM3@YzcsUg>-vO1N}ec2n&^LsE4N^7NlUo8bydTB-Q+TOjfGER;nNH(PkSgLErmOaX^MCTi=V;bXGqRxNX}>0!yH%w z%jo~lw6V|uvE&&nN#}rc4oLTc-jEzfCkNJY;93q$FJpZltb_Gz?`Qjw^k*~%$CVrV9YK9?oLbL$n670E@nC0Y?1IB)|8Zt#JAkcKwU(1ty* z1X95UD%daphZON5+5aNh|6(wl4-;S#JOImKGi-s~utyO&gf@rJ<`BvpLYZ?KHY(yJ zJZ5mlg3VLh&m? zk%uCAD3ZrM-^(XVmEukpmMcfdkL{71eJ z|52cbt=GAiHlT=nC+;+x6!9C9>^CIYHZf>$jueb`;#cmHxkdn<5I)v=B{IJfPwM6-!ktRk2XT!XgwXLV?$@^mQzK zJr$sC zT;m0<>x$S{CB(iOHr#-M^;56`UV+yXaiCU+11DK02lnBy|J)+Pf95MBl+hqCMWceSGc%ge0B=&zG_J1gWW$+lRf*A4#3@OKh<#@21^5v8-w}E!h41E;w z$8AFVafc$_p}luP=>PBJv9N^={cunbhcbjXlm)Ty5EdS4h3$%X*H4Id17I%9gLvj$ zJagEMyHOsjlLPOP1Mil?y|4lvhIs5| z13WRnjDlGH5tcXjqL@Fdg(p#HEB(I(1wKK6Pf+0EVKh62LP01LqKI}q4_d5HAQT0{ z6;Y$(0gN8vi5fgnL-`uY*Yv@DMf}-Xh(FsZqP9bb+HMrFLJ@123{&7XxC0Kt8+hK1 z{$J;S#V%Ov2E$<_+z2u^93XM=?}J0B*%Bv=j)!Ben75lxOf z|8j=7vI$o>voJ_9*pQue5Er)K!qyE!v~GlG+=|8**?*D!7fGs%B-KT7 z;vzZGL99E7btn5f+22*bGuB;-_&iOB&of{S%!LPG1+0QKuobq`|3B|zprTZH&BUlCVP=qd_bBWBl#*)2n7 zrigFw$TxW8ZzSR0NW#DEf<=n>Hd}~qEgM+C!f&x~AWMjW^^gJs6c{2WhRBJ(+Y0e_ zdsquk!T~s>h#NILt*V1~;07MJiN!au_+~yVAiD`o9igeqfLW03b=vlga1-P>OC1M( zU_-Xr!Syf)?uQ2%aM*s5?I%5)RFa7YhD`f`2K6dlhkt15RycNYs(pHl6a}N~rg8ncN#Ta-77JwdlHx2$(d3Q-o{(P9L@#KngY_stE}SD5&SA+pENOPb zwH_#hBIi-$f*lGuzz`S;v*3D&!WU4uMaQ_J$HUHe*abx~>~n6Ci_eQ$D5c+<==ZJ= z%fG<#fjlhOLU-f9zjNS?Ml5Njd*#r*a#0`y1+q{8&z;9}t=sU#4#t60#({LYH4S`= z=l=5^{3$=yn%&wSm*%BflK5-XDj8}+3&)BH;Ce0DBg7tR=^PYe-{P2 z+F%C9wCO^#ISn<+=vIf@PIcYc0I)IOZI=s{s9{-x5GkQegl`^^v94uj=REf z*A#J??U&hpxfk}4Tj}IhCai#mp@oLOpke-?FFzrSi?4Zza(~F4$=Rw*fS73_okjM2G_(Rq;m{T2PY7mIqa=xQBj!+NsZhb;GlrEo82J3`S%D8Ak=#McK| zCztxjrEjqK8!Y}?D`&lSMPQS-Zh(aPx;Fp6p2I>e8>sj?75{B71@|kWKT(MOWLOMK zVG}%$#ZFjk!u6+deIsmx9T3k9;FJ2RoMyA(F<8Zc%^cVQyI~LPhl5mrs|RuQAfXw=jKP~!prfK5*b7O*??}QS1N9h5 zUNgz-12bS2S?^BPdqP6;Jt6s?Uh=)=2n!teJqO<0Px2guSah>Pkur=o(Rtc7s$a-a zJhhW4tfwi``ihX&*A#hok&t&6E7FuFq-l#H^~Z$NS1EE#u8?E$U_0dDo7E8^ttu5c zE?mfQJj)u#`Z(67@8==ebe_Wb@xanA6Y?<2uK@CV(eD84hCK9otXRm$N)`Di4^AIV zRpcCdA?G+k9-__hgETyc$9{84;arpREU zkij<40rGfo;T|CumMHRZ4t$&g6Hf}6cv_K9(a=*^m`uaTG@Q&6+~izEu4H|swvJ-S zD7L~;$Q8~o8piT8?=VmEjwv#=NyyamihLSFp2m=;w^&%nXWnIq-v*xHu);F<^Yoky&3YQ107czk7 zlmR`EB)pe#;9kaod+DC{(mhAhD@M~R^sMVyH?iNu{warf&Tx$W?-C+}OQ<4T=-)2% z@2PP-SV-UjLLd(if_cCI-68LriU-N&1txB>x+>yvS0NsE=N=B({0iCpYiDlVxNxV0 z-cm$wIbOxpZwNY8Kx-WV@9%%8OhFDa~if~083y1OJd++y!eXo;%X5CRxuoc zHyN-R8L*lesJs}cyy^d6r?QX^^I-v`p|5GEk8asVxBRA<5v&xV*f%J49T#55h5ZHw zBqNN3(Qq@|s)$<{bPI!S(VcG{gmti9ks?A!5e4b4f)I-aXrUX(z4Yt-iqw(CIzLE~ z>7wcPWbr7ncvLb>f%NN9^y^V{%TYbVwu{(aCbq%Ec0RFXC^s>bPbna_yA*Lhp}C*X zxMuUHbpxR#lv4@iR1}_y!fxK2|J{69z@=`u)ZK+xyFnl5N6cM`xjXcSfy5rm7hw70 zxbAUpMZDS|#H&r*C9~r$nFFytMa&x%QDsBS?O-!(f!E;xIZ#6m)Imb_J|U~l=KNoc zX4Q<<)g{E_}Yn_F~L|E4>!P#5JkU6(QgRNH;!;C z+y=WK?OwMel1#~*^>E4Ga7jNg>L*71Xxfja|5L}wr=F7yt{%kI-%;UrR5(NhLsW3< z2+75`Ago9xYnTbMAw#iXD3;dbmMuBOdknhyun_JchYaM9k(Xpf`Lf{81`ZsB3-!2K zkE^HZND@7{LAP|HTRzawL+L?s!GT96&|X>L+^(W+fYJ^=c@7C zXL#~6JlR3+bdWpROPl%x>L+KWI?(^!VrYPvx<`?8F*HCjK1ebi$HL=SSmj5>0dN!C zOar*~eOy~j`D)7RS5aXq$=FIVwsYJyj=RpI7Rtv^{t1%u36jzV&)MKP`*5BiNAiH8 zod*f6H@h}nYg9o?=w1s;>`6TfHlDHhAXakCVTtX6C%E;QAWUG#>#bux1 zvNm_J)Dysd8dmXXY!-KGbkTU>TMl~rSSjS6#dOXmM2fDC40Lz2mHn;=gx@KYy8i{xZkE%<(VZ5Mq;{K4QI-SQp}vLOfEq3Z}v$SPXB_|5XaAo>XXN zL>pp6yU8AkqiUd3Ja8t$f>=>Pj%S=b7<5#wxPynzP}gdm>~C_`^Jw3M@OND;a8f?RsR%htHi7G^@a<0fBR=?`gW6Af*`L!0o>PDZeuj9|NQ z5ihF zH0VWx-ilm=Cl=uedZdhCh>f732s{zN)GcBQ?1GnJFXZ{ZTulF590Zdf=lR70@CL61 zGE0q2qe3iLgawP36D~Rg@yw!|RNzJhcq}3nZh-qB`xi5mFJ^slJ7n@2siz*!4Ux<% zA~7T~3+C{$9OHv!DH<;g;H|k(-n`7=&C6WK$s-0=#%zN$JR6N?6N**dLay>x?I7K)f__>@_pIlvw~e#j4xVrn z^Ms?6kx^k}G{7Jj0#Vc(MIG4gz;*{~Xsd{jSRq2S#Cs{Ar%y_UBG5{56BV8OLT>@l8dzBGw`Vg<-5R%tY86nddcyRen zT)s092Ez?-BSUXILvJF?g?Vr*+y)uIEUzgMiwC)o5i^w$^BKxNLwS0G zpf`wTs$dOlfK7^6n<~WGbhsDphZT?^eC=sYLTejYXn}2t$ROD=NVYtZEpHF3gwy|7Oan+<%~VT5>gGoIai1XeQSUuVc4 zAhZ@5E~4Q#He&fESPg3xQHqO8adBxgY*9oRt}ny&Wq6_tPn7k;K}Eb7EX14hA-VA; zx$)+Hco5dWIz{ZI;k`7xHyXymGPn<-@Lm+Qyk*1r*pBlu4ZKAInPg`s+4)8fiu9sD z77DCa#P98e_`M^ngY_toi2~V>5R@IEK?fRif*A59hP;U<-oz8n-lRSq^%|iKq@7Hy zoj@2&|IbWfVHNLWB=Sy1GQ>q$xaj$OA)YT#L^k`g*}u+Dh;;!}NKBt4rq7Wp&yg$7 z;gRR?2zrVv1#X4g;3?PuJ76~)gg2;{5I=7Z-JvJ_|M^fB$jawY;CU2yz7+0-$6ys~ zgw5~@yoN$Flubj~Cg=)%p+96t_6E2O?tm5WFgyuQK@`nK(d+>@gh6;@oduVy3uhq` zCc_j+zh6hcUsnuEAue8ri`SiojS$za!?o+^|Lf@g>s^Id?@q{e5VAtp1kV$?1VWcY z$WZwADE#|!c!-cue;M_cp_ru%&EE7RR%S>AZ&JZtXOhDO=EDL=LwjlH)%6TKIrMLG zUWyll<&JRg1W(27!ONe8EmHizu&?Ig*_J( zj?fN^Xg4-GsFYcc%YitR}=f{Yw$Wxy{&obZOd$!3ja!lf31eKum!epQM-kU z+I+Yl(ko8a!jsJZ@x;e?qCJ8B-%dmAnJ}A6B^2mDfsP0m1*y1$iaQR%3M?Wws>qG1 z9!T$a{|J^;QegoV?t%@liR+1Ut|u}f3VebBZADy96hjPY!;mWKtD?U5Ew)r(&q6Qk zL-P%2z7b7{*=b^SIt8XdlJ7LhcgC4Hp9>6x!CZzDg7bu+YCRR^P!9&Yj{#MMtnY!x zU=`al*v z!PBsj?aT`vVMa8QsoG3tI5Ybo<(5}4=R3?)j;R~dZ^`F<@>wP>&u)MlnFFFo9512D zjBE-pWyL)^D>;J%#`WNNlBkQq`0Go&a*#;_ivt)FMTm3117p}{BS3;9HtA{Q}n zS;WMJ_Xs8L5y}V@i$Jl(_ChXpgv@{z$0>3dlh7CenJX^iB~%%6m<^R|*w2Q8tW#kO z6)wBX`ZYz)Xb^HnlOlQ7OY*Lld=ZOY#G)6OtiBiwBVn{6xSSVU&Wlm2U@F`OcW|{! zF3lmA=ETE9PTSp_wtHY7wDdE9aAX4E%!V{JWI(c&d&6QnBiM9CFmG%2+d?z+f$aBY zzjr(A;w5yBpTY4n+@J>xh2fB-n?cgesDX8mabw11K1i_Qg9K}cVyR=%Y-~0gHo&cL z8)V=a%fK_X93FyHFqR6&HbF9OEEbH#g0TZ|h>xfYd_-l0C}M>oR-VudNm474)G882 ztG(5-l<{`lb-sie;7cVvUo2TcjxutT(F=ORU^pMfz&Mx+)8R(A3GRS}a34GXD`7Qk zfK3oHjhJafJ0seS$K3IlJKh;uTv+gC!57YlVK5FR@WBRtGvK%Jxvb~GLbwOwhVi&z zJbiRLebidVJNJ4R4kLNj9`h!U02A`y7T5v1x$R-YZ4W!>4+9~mD2ol}QX49?p~8ti zeDL816JavM{}b`Qtu^oD+rj`C1XsaS*akazS3ih%^+R9=%z}Gh3BVdla!pk;w;ym|PAC^kf3;#CbhLQD+o&M$!Aou=~ic`$}LLY=BMNcTMNMYbNZ1m%0Cn z%ctP-DY$$J?YP(q;bPDISaRroa_D|bI}2Tka79B`G<0o-EnIbM;;Lga#FD94GW9aN z!c~Zos}LJ_gL`m-dvUn>0bK2l>)mm^`yqG)w!k)cldBUQS1BnljhFu&dHLTNQr?5| z77r@$paPF-SPMxik3POQvFD2uM~LPRq4`5OFc;RrdcGP6<70scm=6mep7X?Wo*eJV z@zXr`c)$x1^J(#rP)#FL(+JfxLN$%vFl~tWmKT4ao@F)W2tJe`WYs~Cl9U?XgXSKu{98^LI!Kwsz&_rm@3{}~jV zK|voIz6!8|SnPwvKDf*Wm-%dg`49zsP~ed$J_?9|1#lNU0Lvl!AJO&?!JB*x;LXPX zzAzpp@-cuP9|HuyGPn=oshQeK|9-gI4_Euez&J?k{fNC^4Xoqq0J3!!**eP%eP9O6 z;^P1s@TUR)jc^mh#s0Y1zYAXGW1mPqe~O0ef0X@?;_^p__(*_I1`x`}tmyxbS+hVz zk5SQMxa6_@@H}kgYXMvxh^qr>IFN<|Q(-!!Tp;CUoA`Rb72>JccxpDTpN;Eh)6i@h z3JMS+CqQa$uuMQMQ?kwF5=?zQi4NFhLQ;?7{OA$*4;SD~A^5AnQFZzFUGz+n8D1>|9 zbvVEWU0A#fi=PC9tP8c*0@kqs8v_Hs_>W9TOK z_QZa2KSTB)LouGZ8&5f5s1t^oHZnqPqW|AdjP55!4;UHAY#3m$>>(`kY+@ie&p=Va zKvBjxkjglaPCrMX=_oYgFx~bT-Ljo-*+p+5$^1w%e-!jb!2ms3Zbh=PKal-_18|7s zB$;QE%t0s;6iNS|L(Jw7Gaf~YIgKQtJxS!Uotx=y3UBTpqm-PaeQ?EqJbt&n7S|0mI_5x!bjYbv&A2!KH?+xN;k= z%)pgdkcO>k*d`yB7U0qfTzVLyh%JiPJK|brT#JV$;~|G0&U(GL)&tji;o5jyo5;x} z7SG0WuDHTE;~Jhlh-WMCEcJO(-?SY1|Fm3O8;Wbgacu&wO~SP(Gy{cv_T$=vxHb^i z2IE>ATx-Wbf=eIOT-u0Bn{g@IXS03wMz{&rqDT;m%r)RiBc9xaCyVeTy=4z%=U>CfMD=8R3!Nm+Tiy3I5^Kj)BT#4q((EN!#+@UJr6B$AgODN*1 zaA^%BgmI0q4R)~Ko&BB=kHq4USV9y_h+^plvGjuF_VoYd#M+QW2-aiKWh}aa=FVvD zLX2vNQ5~eh1S)*Om4+Fxo``{QFcW4|p_vMOXm}e9?|=tjxgwsl7vf3kf6@o~!BsF7 zV$hQqWNpD^*0{{N4%RbQD`BoyM(nZB1`BPj!vUsZST+&MZ1IdOp1Dh5YGq)?M8BUz zzqdD%6E@@o^-QK7hgNc;ooxl1k)o)#%Pie%VuENj2xIt zQlfwl3OquCkI>-EL{6j0Bq<^ABLsfz_hY|5A@nDN{uPj%d6WhpZ6-+rNYWsZ)QKeJ zroRXx%Y(@BIW#bb2IdpH`NS@CGg-S8w!<#6mn>dL7Kc$TjB?>L5KaT(X)uH2^&ok@ zU^d(U`(QuG>_swrLllWXk%(*XI>}u~a$EMW(8a=KvYZ2>IWQX6N8|csxNaG)i$T*E z6G_-h686C%c$3egaCHi(}7=H8i}2c2fzF zC6ySZMsVR3#XYxN?z!dh2rQUKVDl-6MQgBVhc)+CY+(Szb$?3cHb)Aty1VeIyBjOEI^|ZXmlbRM#5@X3)^8AmiS>w03_S%;^97c0G@=Wc+EM8*PKIOB20#a@Pjru z2ygKEb0n`nN5c%51*>2U)L!~K*@24~sXp|Cp)j1+9#G^X6!|C(X5f)+cw`4W2CHBr zY=%9sm-{btuQPP7Gd9o;k6=&>2DMO63-z>g!OPqLGI9gR1`_*E2)*T#02YGS5DjA? z7JPyQ7jgYXTz`?Iyhu{EabOz5hZsSSyex6hxg!S+= zO~mq56nWebfk> zVGkr!AN9jQ?r3oXNU?ASNJ(TN86JV$_))lXq;Tg*;TD(DtH{v?Ax9e_59vm`^GuCr zZP^Bcd^Hw{M-q`_Bn3%BG7NGze^Y3;58{UeAVEk75{giEcQ_Jhke1!iEKt#ID%wp& zyStGdq!;N!`jJ88hCvq6XrVw9#0IfL91tTvK19VT$E#GXW*{h{u19D{r6HAeRN7H# zM@>PpkQ{?Wss$|ULW+>RNHMY>DMbz{2j{uuHPWv zNHfS11Ir!I9Wf)GY=>`f+#57nB9PNaFXg%|{MUnMD}BfyJFu?Ah}a-@hy&t;m=IUQ z2k}D!kRT)k2}Qz@NF*9Tu@V$3Nko#76eJDFKr|)RBRPmAm;dsREl566fb2qwkYc11 z*^BH)4k8uEVdNN6h14K*NIlYsG$SoY8`6PvBRxnT(vJ)xH}Hf&6ypDefdwOCgV-Ss zh!bK$ToHG~6Y)X(kN_kI2|+@UNF*AGMdFb}BpFFTG7PeeGG*Zi<;o~mM!7P|mE|HK z#J`LK$~d5m1Ip46?Vv1VJ(7d;B7I0dGKkzT$a2b;Q(-w3mQ!Il6_!)aJI9dINF&mW zv>t#EkeLK?vGc`XM2RClY{!BPdXri{v3F zUYUWcM~aaGWEWC|WFcFSG$aSfM-q`zx|!~g&Q diff --git a/slsDetectorSoftware/jctbDetectorServer/mcb_funcs.c b/slsDetectorSoftware/jctbDetectorServer/mcb_funcs.c index edf99652a..b67b8fef4 100755 --- a/slsDetectorSoftware/jctbDetectorServer/mcb_funcs.c +++ b/slsDetectorSoftware/jctbDetectorServer/mcb_funcs.c @@ -50,8 +50,8 @@ extern int N_CHANS; extern int nChans; extern int nChips; -extern int nDacs; -extern int nAdcs; +int nDacs; +int nAdcs; int initDetector() { @@ -64,18 +64,11 @@ int initDetector() { printf("Board is for %d modules\n",n); #endif - if(myDetectorType == JUNGFRAU){ - N_CHAN=JUNGFRAU_NCHAN; - N_CHIP=JUNGFRAU_NCHIP; - N_DAC=JUNGFRAU_NDAC; - N_ADC=JUNGFRAU_NADC; - N_CHANS=JUNGFRAU_NCHANS; - - nChans=N_CHAN; - nChips=N_CHIP; - nDacs=N_DAC; - nAdcs=N_ADC; - } + + // nChans=N_CHAN; + // nChips=N_CHIP; + nDacs=N_DAC; + // nAdcs=N_ADC; detectorModules=malloc(n*sizeof(sls_detector_module)); detectorDacs=malloc(n*N_DAC*sizeof(int)); @@ -84,8 +77,8 @@ int initDetector() { detectorChans=NULL; detectorAdcs=NULL; if(myDetectorType != JUNGFRAU){ - detectorChips=malloc(n*N_CHIP*sizeof(int)); - detectorChans=malloc(n*N_CHIP*N_CHAN*sizeof(int)); + detectorChips=malloc(n*N_CHIP*sizeof(int)); + detectorChans=malloc(n*N_CHIP*N_CHAN*sizeof(int)); } #ifdef VERBOSE @@ -101,7 +94,7 @@ int initDetector() { for (imod=0; imoddacs=detectorDacs+imod*N_DAC; - (detectorModules+imod)->adcs=detectorAdcs+imod*N_ADC; + (detectorModules+imod)->adcs=detectorAdcs+imod*N_ADC; if(myDetectorType != JUNGFRAU){ (detectorModules+imod)->chipregs=detectorChips+imod*N_CHIP; (detectorModules+imod)->chanregs=detectorChans+imod*N_CHIP*N_CHAN; @@ -935,284 +928,285 @@ int setSettings(int i, int imod) { /* Initialization*/ int initChannelbyNumber(sls_detector_channel myChan) {printf("in init channel by number\n"); - int reg=myChan.reg; - int ft=reg & TRIM_DR; - int cae=(reg>>(NTRIMBITS))&1; - int ae=(reg>>(NTRIMBITS+1))&1; - int coe=(reg>>(NTRIMBITS+2))&1; - int ocoe=(reg>>(NTRIMBITS+3))&1; - int counts=(reg>>(NTRIMBITS+4)); -#ifdef VERBOSE - printf("Initializing channel %d chip %d module %d reg %x\n",myChan.chan,myChan.chip,myChan.module, reg); - printf("trim %d, cae %d, ae %d, coe %d, ocoe %d, counts %d\n",ft, cae, ae, coe, ocoe, counts); -#endif +/* int reg=myChan.reg; */ +/* int ft=reg & TRIM_DR; */ +/* int cae=(reg>>(NTRIMBITS))&1; */ +/* int ae=(reg>>(NTRIMBITS+1))&1; */ +/* int coe=(reg>>(NTRIMBITS+2))&1; */ +/* int ocoe=(reg>>(NTRIMBITS+3))&1; */ +/* int counts=(reg>>(NTRIMBITS+4)); */ +/* #ifdef VERBOSE */ +/* printf("Initializing channel %d chip %d module %d reg %x\n",myChan.chan,myChan.chip,myChan.module, reg); */ +/* printf("trim %d, cae %d, ae %d, coe %d, ocoe %d, counts %d\n",ft, cae, ae, coe, ocoe, counts); */ +/* #endif */ - if (myChan.chip<0) - setCSregister(myChan.module); - else - selChip(myChan.chip,myChan.module); +/* if (myChan.chip<0) */ +/* setCSregister(myChan.module); */ +/* else */ +/* selChip(myChan.chip,myChan.module); */ - if (myChan.chan<0) - setSSregister(myChan.module); - else - selChannel(myChan.chan,myChan.module); +/* if (myChan.chan<0) */ +/* setSSregister(myChan.module); */ +/* else */ +/* selChannel(myChan.chan,myChan.module); */ - initChannel(ft,cae,ae, coe, ocoe, counts,myChan.module); +/* initChannel(ft,cae,ae, coe, ocoe, counts,myChan.module); */ - setDynamicRange(dynamicRange); +/* setDynamicRange(dynamicRange); */ - setCSregister(ALLMOD); - clearSSregister(ALLMOD); - putout("0000000000000000",ALLMOD); +/* setCSregister(ALLMOD); */ +/* clearSSregister(ALLMOD); */ +/* putout("0000000000000000",ALLMOD); */ return myChan.reg; } int getChannelbyNumber(sls_detector_channel* myChan) { - int imod, ichip, ichan; - imod=myChan->module; - ichip=myChan->chip; - ichan=myChan->chan; + /* int imod, ichip, ichan; */ + /* imod=myChan->module; */ + /* ichip=myChan->chip; */ + /* ichan=myChan->chan; */ - if (detectorChans) { - if (imod=0) { - if (ichip<(detectorModules+imod)->nchip && ichan<(detectorModules+imod)->nchan/(detectorModules+imod)->nchip) - myChan->reg=detectorChans[imod*N_CHAN*N_CHIP+ichip*N_CHAN+ichan]; - return OK; - } - } + /* if (detectorChans) { */ + /* if (imod=0) { */ + /* if (ichip<(detectorModules+imod)->nchip && ichan<(detectorModules+imod)->nchan/(detectorModules+imod)->nchip) */ + /* myChan->reg=detectorChans[imod*N_CHAN*N_CHIP+ichip*N_CHAN+ichan]; */ + /* return OK; */ + /* } */ + /* } */ return FAIL; } int getTrimbit(int imod, int ichip, int ichan) { - if (detectorChans) { - if (imod=0) - if (ichip<(detectorModules+imod)->nchip && ichan<(detectorModules+imod)->nchan/(detectorModules+imod)->nchip) - return (detectorChans[imod*N_CHAN*N_CHIP+ichip*N_CHAN+ichan] & TRIM_DR); - } + /* if (detectorChans) { */ + /* if (imod=0) */ + /* if (ichip<(detectorModules+imod)->nchip && ichan<(detectorModules+imod)->nchan/(detectorModules+imod)->nchip) */ + /* return (detectorChans[imod*N_CHAN*N_CHIP+ichip*N_CHAN+ichan] & TRIM_DR); */ + /* } */ return -1; } int initChannel(int ft,int cae, int ae, int coe, int ocoe, int counts, int imod){ - int ibit, bit, i, im, ichip, ichan; - int chanmi, chanma, chipmi, chipma, modmi, modma; +/* int ibit, bit, i, im, ichip, ichan; */ +/* int chanmi, chanma, chipmi, chipma, modmi, modma; */ - sMod=imod; - // printf("initializing module %d\n",sMod); - if (imod==ALLMOD) { - sMod=allSelected; +/* sMod=imod; */ +/* // printf("initializing module %d\n",sMod); */ +/* if (imod==ALLMOD) { */ +/* sMod=allSelected; */ - // printf("initializing all modules\n"); - } +/* // printf("initializing all modules\n"); */ +/* } */ - if (sChan==allSelected) { - // printf("initializing all channels ft=%d coe=%d\n",ft,coe); - chanmi=0; - chanma=N_CHAN; - } else if (sChan==noneSelected || sChan>N_CHAN || sChan<0) { - // printf("initializing no channels ft=%d coe=%d\n",ft,coe); - chanmi=0; - chanma=-1; - } else { - // printf("initializing channel %d ft=%d coe=%d\n",sChan, ft,coe); - chanmi=sChan; - chanma=sChan+1; - } +/* if (sChan==allSelected) { */ +/* // printf("initializing all channels ft=%d coe=%d\n",ft,coe); */ +/* chanmi=0; */ +/* chanma=N_CHAN; */ +/* } else if (sChan==noneSelected || sChan>N_CHAN || sChan<0) { */ +/* // printf("initializing no channels ft=%d coe=%d\n",ft,coe); */ +/* chanmi=0; */ +/* chanma=-1; */ +/* } else { */ +/* // printf("initializing channel %d ft=%d coe=%d\n",sChan, ft,coe); */ +/* chanmi=sChan; */ +/* chanma=sChan+1; */ +/* } */ - if (sChip==allSelected) { - // printf("initializing all chips\n"); - chipmi=0; - chipma=N_CHIP; - } else if (sChip==noneSelected || sChip>N_CHIP || sChip<0) { - // printf("initializing no chips\n"); - chipmi=0; - chipma=-1; - } else { - // printf("initializing chip %d\n",sChip); - chipmi=sChip; - chipma=sChip+1; - } +/* if (sChip==allSelected) { */ +/* // printf("initializing all chips\n"); */ +/* chipmi=0; */ +/* chipma=N_CHIP; */ +/* } else if (sChip==noneSelected || sChip>N_CHIP || sChip<0) { */ +/* // printf("initializing no chips\n"); */ +/* chipmi=0; */ +/* chipma=-1; */ +/* } else { */ +/* // printf("initializing chip %d\n",sChip); */ +/* chipmi=sChip; */ +/* chipma=sChip+1; */ +/* } */ - if (sMod==allSelected) { - modmi=0; - modma=nModX;//getNModBoard(); - } else if (sMod==noneSelected || sMod>nModX || sMod<0) {//(sMod==noneSelected || sMod>getNModBoard() || sMod<0) { - modmi=0; - modma=-1; - return 1; - } else { - modmi=sMod; - modma=sMod+1; - } +/* if (sMod==allSelected) { */ +/* modmi=0; */ +/* modma=nModX;//getNModBoard(); */ +/* } else if (sMod==noneSelected || sMod>nModX || sMod<0) {//(sMod==noneSelected || sMod>getNModBoard() || sMod<0) { */ +/* modmi=0; */ +/* modma=-1; */ +/* return 1; */ +/* } else { */ +/* modmi=sMod; */ +/* modma=sMod+1; */ +/* } */ - if (detectorChans) { - for (im=modmi; im63 || ft<0) { - fprintf(stdout,"Fine Threshold is %d while should be between 0 and 63!",ft); - return 1; - } - /*cal_enable*/ - if (cae) { - putout("0100000000000000",imod); - putout("0110000000000000",imod); - } else { - putout("0000000000000000",imod); - putout("0010000000000000",imod); - } - /*n_an_enable*/ - if (ae) { - putout("0000000000000000",imod); - putout("0010000000000000",imod); - putout("0000000000000000",imod); - } else { - putout("0100000000000000",imod); - putout("0110000000000000",imod); - putout("0100000000000000",imod); - } - /*trb5*/ - ibit=5; - bit=ft & (1<63 || ft<0) { */ +/* fprintf(stdout,"Fine Threshold is %d while should be between 0 and 63!",ft); */ +/* return 1; */ +/* } */ +/* /\*cal_enable*\/ */ +/* if (cae) { */ +/* putout("0100000000000000",imod); */ +/* putout("0110000000000000",imod); */ +/* } else { */ +/* putout("0000000000000000",imod); */ +/* putout("0010000000000000",imod); */ +/* } */ +/* /\*n_an_enable*\/ */ +/* if (ae) { */ +/* putout("0000000000000000",imod); */ +/* putout("0010000000000000",imod); */ +/* putout("0000000000000000",imod); */ +/* } else { */ +/* putout("0100000000000000",imod); */ +/* putout("0110000000000000",imod); */ +/* putout("0100000000000000",imod); */ +/* } */ +/* /\*trb5*\/ */ +/* ibit=5; */ +/* bit=ft & (1<>1; - int nchan, ichan; - int ft, cae, ae, coe, ocoe, counts, chanreg; + /* int imod, ichip; */ + /* imod=myChip.module; */ + /* ichip=myChip.chip; */ + /* int obe=(myChip.reg)&1; */ + /* int ow=(myChip.reg)>>1; */ + /* int nchan, ichan; */ + /* int ft, cae, ae, coe, ocoe, counts, chanreg; */ - nchan=myChip.nchan; - if (ichip<0) - setCSregister(imod); - else - selChip(ichip,imod); + /* nchan=myChip.nchan; */ + /* if (ichip<0) */ + /* setCSregister(imod); */ + /* else */ + /* selChip(ichip,imod); */ - clearSSregister(imod); - for (ichan=0; ichan>(NTRIMBITS+1))&1; - ae=(chanreg>>(NTRIMBITS+2))&1; - coe=((chanreg)>>(NTRIMBITS+3))&1; - ocoe=((chanreg)>>(NTRIMBITS+4))&1; - counts=((chanreg)>>(NTRIMBITS+5)); - nextStrip(imod); - initChannel(ft,cae,ae, coe, ocoe, counts,imod); - } - initChip(obe,ow,imod); + /* clearSSregister(imod); */ + /* for (ichan=0; ichan>(NTRIMBITS+1))&1; */ + /* ae=(chanreg>>(NTRIMBITS+2))&1; */ + /* coe=((chanreg)>>(NTRIMBITS+3))&1; */ + /* ocoe=((chanreg)>>(NTRIMBITS+4))&1; */ + /* counts=((chanreg)>>(NTRIMBITS+5)); */ + /* nextStrip(imod); */ + /* initChannel(ft,cae,ae, coe, ocoe, counts,imod); */ + /* } */ + /* initChip(obe,ow,imod); */ return myChip.reg; } int getChipbyNumber(sls_detector_chip* myChip){ - int imod, ichip; - imod=myChip->module; - ichip=myChip->chip; + /* int imod, ichip; */ + /* imod=myChip->module; */ + /* ichip=myChip->chip; */ - if (detectorChips) { - if (imodnchip) { - myChip->reg=detectorChips[ichip+imod*N_CHIP]; - myChip->nchan=N_CHAN; - myChip->chanregs=detectorChans+imod*N_CHAN*N_CHIP+ichip*N_CHIP; - return OK; - } - } + /* if (detectorChips) { */ + /* if (imodnchip) { */ + /* myChip->reg=detectorChips[ichip+imod*N_CHIP]; */ + /* myChip->nchan=N_CHAN; */ + /* myChip->chanregs=detectorChans+imod*N_CHAN*N_CHIP+ichip*N_CHIP; */ + /* return OK; */ + /* } */ + /* } */ return FAIL; } @@ -1275,9 +1269,9 @@ int getChipbyNumber(sls_detector_chip* myChip){ int initChip(int obe, int ow,int imod){ - int i; - int im, ichip; - int chipmi, chipma, modmi, modma; + /* int i; */ + /* int im, ichip; */ + /* int chipmi, chipma, modmi, modma; */ /* switch (ow) { case 0:; case 1: @@ -1301,208 +1295,208 @@ int initChip(int obe, int ow,int imod){ } */ -#ifdef DEBUGOUT - printf("Initializing chip\n"); -#endif - putout("0000000000000000",imod); -#ifdef DEBUGOUT - printf("Output mode= %d\n", ow); -#endif +/* #ifdef DEBUGOUT */ +/* printf("Initializing chip\n"); */ +/* #endif */ +/* putout("0000000000000000",imod); */ +/* #ifdef DEBUGOUT */ +/* printf("Output mode= %d\n", ow); */ +/* #endif */ - /* clearing shift in register */ - for (i=0; i<10; i++) - putout("0000100000000000",imod); - putout("0000000000000000",imod); +/* /\* clearing shift in register *\/ */ +/* for (i=0; i<10; i++) */ +/* putout("0000100000000000",imod); */ +/* putout("0000000000000000",imod); */ - if (ow>0) { - putout("0100000000000000",imod); - putout("0110000000000000",imod); - putout("0100000000000000",imod); - for (i=0; i<(OUTMUX_OFFSET-1); i++) { - putout("0000000000000000",imod); - putout("0010000000000000",imod); - putout("0000000000000000",imod); - } - if (ow>1) { - putout("0000000000000000",imod); - putout("0010000000000000",imod); - putout("0000000000000000",imod); - } - if (ow>2) { - putout("0000000000000000",imod); - putout("0010000000000000",imod); - putout("0000000000000000",imod); - } - if (ow>3) { - putout("0000000000000000",imod); - putout("0010000000000000",imod); - putout("0000000000000000",imod); - } - if (ow>4) { - putout("0000000000000000",imod); - putout("0010000000000000",imod); - putout("0000000000000000",imod); - } - } -#ifdef DEBUGOUT - printf("Output buffer enable= %d\n", obe); -#endif - if (obe) { - putout("0100000000000000",imod); - putout("0110000000000000",imod); - putout("0100000000000000",imod); - } else { - putout("0000000000000000",imod); - putout("0010000000000000",imod); - putout("0000000000000000",imod); - } - /*}*/ - putout("0000000000000000",imod); +/* if (ow>0) { */ +/* putout("0100000000000000",imod); */ +/* putout("0110000000000000",imod); */ +/* putout("0100000000000000",imod); */ +/* for (i=0; i<(OUTMUX_OFFSET-1); i++) { */ +/* putout("0000000000000000",imod); */ +/* putout("0010000000000000",imod); */ +/* putout("0000000000000000",imod); */ +/* } */ +/* if (ow>1) { */ +/* putout("0000000000000000",imod); */ +/* putout("0010000000000000",imod); */ +/* putout("0000000000000000",imod); */ +/* } */ +/* if (ow>2) { */ +/* putout("0000000000000000",imod); */ +/* putout("0010000000000000",imod); */ +/* putout("0000000000000000",imod); */ +/* } */ +/* if (ow>3) { */ +/* putout("0000000000000000",imod); */ +/* putout("0010000000000000",imod); */ +/* putout("0000000000000000",imod); */ +/* } */ +/* if (ow>4) { */ +/* putout("0000000000000000",imod); */ +/* putout("0010000000000000",imod); */ +/* putout("0000000000000000",imod); */ +/* } */ +/* } */ +/* #ifdef DEBUGOUT */ +/* printf("Output buffer enable= %d\n", obe); */ +/* #endif */ +/* if (obe) { */ +/* putout("0100000000000000",imod); */ +/* putout("0110000000000000",imod); */ +/* putout("0100000000000000",imod); */ +/* } else { */ +/* putout("0000000000000000",imod); */ +/* putout("0010000000000000",imod); */ +/* putout("0000000000000000",imod); */ +/* } */ +/* /\*}*\/ */ +/* putout("0000000000000000",imod); */ - sMod=imod; - if (imod==ALLMOD) - sMod=allSelected; +/* sMod=imod; */ +/* if (imod==ALLMOD) */ +/* sMod=allSelected; */ - if (sChip==allSelected) { - chipmi=0; - chipma=N_CHIP; - } else if (sChip==noneSelected || sChip>N_CHIP || sChip<0) { - chipmi=0; - chipma=-1; - } else { - chipmi=sChip; - chipma=sChip+1; - } +/* if (sChip==allSelected) { */ +/* chipmi=0; */ +/* chipma=N_CHIP; */ +/* } else if (sChip==noneSelected || sChip>N_CHIP || sChip<0) { */ +/* chipmi=0; */ +/* chipma=-1; */ +/* } else { */ +/* chipmi=sChip; */ +/* chipma=sChip+1; */ +/* } */ - if (sMod==allSelected) { - modmi=0; - modma=nModX;//getNModBoard(); - } else if (sMod==noneSelected || sMod>nModX || sMod<0) {//(sMod==noneSelected || sMod>getNModBoard() || sMod<0) { - modmi=0; - modma=-1; - } else { - modmi=sMod; - modma=sMod+1; - } +/* if (sMod==allSelected) { */ +/* modmi=0; */ +/* modma=nModX;//getNModBoard(); */ +/* } else if (sMod==noneSelected || sMod>nModX || sMod<0) {//(sMod==noneSelected || sMod>getNModBoard() || sMod<0) { */ +/* modmi=0; */ +/* modma=-1; */ +/* } else { */ +/* modmi=sMod; */ +/* modma=sMod+1; */ +/* } */ - if (detectorChips) { - for (im=modmi; imN_CHIP || sChip<0) { - chipmi=0; - chipma=-1; - } else { - chipmi=sChip; - chipma=sChip+1; - } +/* if (sChip==allSelected) { */ +/* chipmi=0; */ +/* chipma=N_CHIP; */ +/* } else if (sChip==noneSelected || sChip>N_CHIP || sChip<0) { */ +/* chipmi=0; */ +/* chipma=-1; */ +/* } else { */ +/* chipmi=sChip; */ +/* chipma=sChip+1; */ +/* } */ - if (sMod==allSelected) { - modmi=0; - modma=nModX;//getNModBoard(); - } else if (sMod==noneSelected || sMod>nModX || sMod<0) {//(sMod==noneSelected || sMod>getNModBoard() || sMod<0) { - modmi=0; - modma=-1; - } else { - modmi=sMod; - modma=sMod+1; - } +/* if (sMod==allSelected) { */ +/* modmi=0; */ +/* modma=nModX;//getNModBoard(); */ +/* } else if (sMod==noneSelected || sMod>nModX || sMod<0) {//(sMod==noneSelected || sMod>getNModBoard() || sMod<0) { */ +/* modmi=0; */ +/* modma=-1; */ +/* } else { */ +/* modmi=sMod; */ +/* modma=sMod+1; */ +/* } */ - if (detectorChips) { - for (im=modmi; im>DETECTOR_TYPE_OFFSET); + N_DAC=8; + N_PWR=0; break; } @@ -118,102 +127,25 @@ int init_detector(int b, int checkType) { //control server only-- if (b) { - resetPLL(); - bus_w16(CONTROL_REG, SYNC_RESET); - bus_w16(CONTROL_REG, 0); - bus_w16(CONTROL_REG, GB10_RESET_BIT); - bus_w16(CONTROL_REG, 0); - + resetPLL(); + bus_w16(CONTROL_REG, SYNC_RESET); + bus_w16(CONTROL_REG, 0); + bus_w16(CONTROL_REG, GB10_RESET_BIT); + bus_w16(CONTROL_REG, 0); + #ifdef MCB_FUNCS - printf("\nBoard Revision:0x%x\n",(bus_r(PCB_REV_REG)&BOARD_REVISION_MASK)); - if(myDetectorType == JUNGFRAU) - initDetector(); /*allocating detectorModules, detectorsDacs etc for "settings", also does allocate RAM*/ - dataBytes=NMAXMOD*N_CHIP*N_CHAN*2; /**Nchip and Nchan real values get assigned in initDetector()*/ + printf("\nBoard Revision:0x%x\n",(bus_r(PCB_REV_REG)&BOARD_REVISION_MASK)); + // if(myDetectorType == JUNGFRAU) + initDetector(); /*allocating detectorModules, detectorsDacs etc for "settings", also does allocate RAM*/ + dataBytes=NMAXMOD*N_CHIP*N_CHAN*2; /**Nchip and Nchan real values get assigned in initDetector()*/ printf("Initializing Detector\n"); //bus_w16(CONTROL_REG, SYNC_RESET); // reset registers #endif - - prepareSlowADCSeq(); - // testFpga(); - // testRAM(); - // printf("ADC_SYNC_REG:%x\n",bus_r(ADC_SYNC_REG)); - //moench specific - // setPhaseShiftOnce(); - /*some registers set, which is in common with jungfrau, please check */ + if (myDetectorType==JUNGFRAUCTB) prepareSlowADCSeq(); + prepareADC(); - //setADC(-1); //already does setdaqreg and clean fifo - // setSettings(GET_SETTINGS,-1); - /*some registers set, which is in common with jungfrau, please check */ - initDac(0); initDac(8); //initializes the two dacs - - if(myDetectorType==JUNGFRAU){ - /** for jungfrau reinitializing macro */ - N_CHAN=JUNGFRAU_NCHAN; - N_CHIP=JUNGFRAU_NCHIP; - N_DAC=JUNGFRAU_NDAC; - N_ADC=JUNGFRAU_NADC; - N_CHANS=JUNGFRAU_NCHANS; - - - //set dacs - int retval = -1; - int dacvalues[14][2]={ - {0, 1250}, //vout_cm - {10, 1053}, //vin_com - {1, 600}, //vb_sda - {11, 1000}, //vb_colbuf - {2, 3000}, //vb_test_cur - {3, 830}, //vcascp_pixbuf - {4, 1630}, //vcascn_pixbuf - {12, 750}, //vb_pixbuf - {6, 480}, //vref_ds - {5, 1000}, //vb_ds - {7, 400}, //vref_comp - {13, 1220}, //vb_comp - {8, 1500}, //vref_prech - {9, 3000}, //vdd_prot - }; - for(i=0;i<14;++i){ - retval=setDac(dacvalues[i][0], dacvalues[i][1]); - if(retval!=dacvalues[i][1]) - printf("Error: Setting dac %d failed, wrote %d, read %d\n",dacvalues[i][0],dacvalues[i][1],retval); - } - - //power on the chips - bus_w(POWER_ON_REG,0x1); - - //reset adc - writeADC(ADCREG1,0x3); writeADC(ADCREG1,0x0); - writeADC(ADCREG2,0x40); - writeADC(ADCREG3,0xf); - writeADC(ADCREG4,0x3f); - //vrefs - configurable? - writeADC(ADCREG_VREFS,0x2); - - - //set ADCINVERSionreg (by trial and error) - bus_w(ADC_INVERSION_REG,0x453b2a9c); - - //set adc_pipeline - bus_w(ADC_PIPELINE_REG,0x20); //same as ADC_OFFSET_REG - - //set dbit_pipeline - bus_w(DBIT_PIPELINE_REG,0x100e); - usleep(1000000);//1s - - //reset mem machine fifos fifos - bus_w(MEM_MACHINE_FIFOS_REG,0x4000); - bus_w(MEM_MACHINE_FIFOS_REG,0x0); - - //reset run control - bus_w(MEM_MACHINE_FIFOS_REG,0x0400); - bus_w(MEM_MACHINE_FIFOS_REG,0x0); - - //set default setting - setSettings(DYNAMICGAIN,-1); - } - - + + //Initialization of acquistion parameters setFrames(-1); setTrains(-1); @@ -221,7 +153,7 @@ int init_detector(int b, int checkType) { setPeriod(-1); setDelay(-1); setGates(-1); - + setTiming(GET_EXTERNAL_COMMUNICATION_MODE); setMaster(GET_MASTER); setSynchronization(GET_SYNCHRONIZATION_MODE); @@ -238,13 +170,13 @@ int init_detector(int b, int checkType) { // getDynamicRange(); /* both these functions setROI and allocateRAM should go into the control server part. */ - if(myDetectorType!=JUNGFRAU){ - int retvalsize,ret; - setROI(-1,NULL,&retvalsize,&ret); - allocateRAM(); - } + + int retvalsize,ret; + setROI(-1,NULL,&retvalsize,&ret); + allocateRAM(); setSamples(1); + bus_w(DAC_REG,0xffff); return OK; } @@ -1049,6 +981,7 @@ int set_dac(int file_des) { int n; int val; int mV=0; + int v; sprintf(mess,"Can't set DAC\n"); n = receiveDataOnly(file_des,arg,sizeof(arg)); @@ -1085,27 +1018,35 @@ int set_dac(int file_des) { -#ifdef MCB_FUNCS if (ret==OK) { if (differentClients==1 && lockStatus==1) { ret=FAIL; sprintf(mess,"Detector locked by %s\n",lastClientIP); } else{ - if (ind2500) + + v=val; + + if (val>2500) val=-1; printf("%d mV is ",val); if (val>0) val=val/2500*4095; printf("%d DACu\n", val); - } else if (val>4095) - val=-1; + } else { + v=val*2500/4095; + if (val>4095) { + val=-1; + } + } - - retval=setDac(ind,val); + if (vLimitCompliant(v)) + retval=setDac(ind,val); + + } else { switch (ind) { case ADC_VPP: @@ -1130,23 +1071,36 @@ int set_dac(int file_des) { case V_POWER_D: case V_POWER_IO: case V_POWER_CHIP: + if (mV) { + if (vLimitCompliant(val)) + retval=setPower(ind,val); + else + printf("********power %d exceeds voltage limits", ind); + + } else + printf("********power %d should be set in mV instead od DACu", ind); + break; + + case V_LIMIT: if (mV) { retval=setPower(ind,val); } else printf("********power %d should be set in mV instead od DACu", ind); break; - default: printf("**********No dac with index %d\n",ind); + printf("**********%d %d\n",N_DAC,N_PWR); ret=FAIL; } } } } + + if(ret==OK){ - if (inddataBytes << endl; for (int id=0; idnumberOfDetectors; id++) { @@ -2251,11 +2251,11 @@ double* multiSlsDetector::decodeData(int *datain, int &nn, double *fdata) { dataout=fdata; else { if (detectors[0]->getDetectorsType()==JUNGFRAUCTB) { - dataout=new double[thisMultiDetector->dataBytes/2]; nn=thisMultiDetector->dataBytes/2; + dataout=new double[nn]; } else { - dataout=new double[thisMultiDetector->numberOfChannels]; nn=thisMultiDetector->numberOfChannels; + dataout=new double[nn]; } } diff --git a/slsDetectorSoftware/slsDetector/slsDetector.cpp b/slsDetectorSoftware/slsDetector/slsDetector.cpp index 4d013a141..db2b3cbe6 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetector.cpp @@ -801,7 +801,7 @@ int slsDetector::initializeDetectorSize(detectorType type) { //update?!?!?!? if(thisDetector->myDetectorType==JUNGFRAUCTB) { - cout << "here2" << endl; + // cout << "here2" << endl; getTotalNumberOfChannels(); //thisDetector->nChan[X]=32; //thisDetector->nChans=thisDetector->nChan[X]*thisDetector->nChan[Y]; @@ -1703,8 +1703,9 @@ int slsDetector::getTotalNumberOfChannels() { } thisDetector->nChans=thisDetector->nChan[X]; thisDetector->dataBytes=thisDetector->nChans*thisDetector->nChips*thisDetector->nMods*2*thisDetector->timerValue[SAMPLES_JCTB]; - cout << "Total number of channels is "<< thisDetector->nChans*thisDetector->nChips*thisDetector->nMods << " data bytes is " << thisDetector->dataBytes << endl; - } + } else + cout << "det type is "<< thisDetector->myDetectorType << endl; + cout << "Total number of channels is "<< thisDetector->nChans*thisDetector->nChips*thisDetector->nMods << " data bytes is " << thisDetector->dataBytes << endl; return thisDetector->nChans*thisDetector->nChips*thisDetector->nMods; }; @@ -3928,9 +3929,9 @@ int* slsDetector::getDataFromDetector(int *retval){ n=controlSocket->ReceiveDataOnly(retval,thisDetector->dataBytes); - //#ifdef VERBOSE +#ifdef VERBOSE std::cout<< "Received "<< n << " data bytes" << std::endl; - //#endif +#endif if (n!=thisDetector->dataBytes) { std::cout<< "wrong data size received from detector: received " << n << " but expected " << thisDetector->dataBytes << std::endl; thisDetector->stoppedFlag=1; @@ -3940,8 +3941,13 @@ int* slsDetector::getDataFromDetector(int *retval){ } return NULL; } + // for (int ib=0; ibdataBytes/8; ib++) + // cout << ((*(((u_int64_t*)retval)+ib))>>17&1) ; + + } // cout << "get data returning " << endl; + // cout << endl; return retval; }; @@ -3956,8 +3962,8 @@ int* slsDetector::readAll(){ int fnum=F_READ_ALL; int* retval; // check what we return! - int i=0; #ifdef VERBOSE + int i=0; std::cout<< "Reading all frames "<< std::endl; #endif if (thisDetector->onlineFlag==ONLINE_FLAG) { @@ -3965,23 +3971,18 @@ int* slsDetector::readAll(){ controlSocket->SendDataOnly(&fnum,sizeof(fnum)); while ((retval=getDataFromDetector())){ +#ifdef VERBOSE i++; - #ifdef VERBOSE std::cout<< i << std::endl; - //#else - //std::cout << "-" << flush ; - #endif +#endif dataQueue.push(retval); - // std::cout<< "pushed" << std::endl; } disconnectControl(); } } - #ifdef VERBOSE +#ifdef VERBOSE std::cout<< "received "<< i<< " frames" << std::endl; - //#else - // std::cout << std::endl; - #endif +#endif return dataQueue.front(); // check what we return! }; @@ -4019,19 +4020,21 @@ int* slsDetector::startAndReadAll(){ int* retval; //#ifdef VERBOSE +#ifdef VERBOSE int i=0; +#endif //#endif startAndReadAllNoWait(); //#ifdef VERBOSE // std::cout<< "started" << std::endl; //#endif while ((retval=getDataFromDetector())){ - #ifdef VERBOSE +#ifdef VERBOSE i++; std::cout<< i << std::endl; //#else //std::cout<< "-" << flush; - #endif +#endif dataQueue.push(retval); //std::cout<< "pushed" << std::endl; @@ -5029,14 +5032,17 @@ int slsDetector::executeTrimming(trimMode mode, int par1, int par2, int imod){ double* slsDetector::decodeData(int *datain, int &nn, double *fdata) { - double *dataout; - if (fdata) { - dataout=fdata; - // printf("not allocating fdata!\n"); - } else { + double *dataout; + if (fdata) { + dataout=fdata; + // printf("not allocating fdata!\n"); + if (thisDetector->myDetectorType==JUNGFRAUCTB) nn=thisDetector->dataBytes/2; + } else { if (thisDetector->myDetectorType==JUNGFRAUCTB) { - dataout=new double[thisDetector->dataBytes/2]; nn=thisDetector->dataBytes/2; + dataout=new double[nn]; + + // std::cout<< "nn is "<< nn << std::endl; } else { dataout=new double[thisDetector->nChans*thisDetector->nChips*thisDetector->nMods]; nn=thisDetector->nChans*thisDetector->nChips*thisDetector->nMods; @@ -5044,30 +5050,31 @@ double* slsDetector::decodeData(int *datain, int &nn, double *fdata) { // printf("allocating fdata!\n"); } - const int bytesize=8; - - int ival=0; - char *ptr=(char*)datain; - char iptr; - - int nbits=thisDetector->dynamicRange; - int nch=thisDetector->nChans*thisDetector->nChips*thisDetector->nMods; - int ipos=0, ichan=0, ibyte; - - if (thisDetector->timerValue[PROBES_NUMBER]==0) { - if (thisDetector->myDetectorType==JUNGFRAUCTB) { - - for (ichan=0; ichandataBytes/2; ichan++) { + const int bytesize=8; + + int ival=0; + char *ptr=(char*)datain; + char iptr; + + int nbits=thisDetector->dynamicRange; + int nch=thisDetector->nChans*thisDetector->nChips*thisDetector->nMods; + int ipos=0, ichan=0, ibyte; + + if (thisDetector->timerValue[PROBES_NUMBER]==0) { + if (thisDetector->myDetectorType==JUNGFRAUCTB) { + + for (ichan=0; ichandataBytes; ibyte++) { - iptr=ptr[ibyte]&0x1; + iptr=ptr[ibyte];//&0x1; for (ipos=0; ipos<8; ipos++) { // dataout[ibyte*2+ichan]=((iptr&((0xf)<>ichan)&0xf; ival=(iptr>>(ipos))&0x1; @@ -5078,7 +5085,7 @@ double* slsDetector::decodeData(int *datain, int &nn, double *fdata) { break; case 4: for (ibyte=0; ibytedataBytes; ibyte++) { - iptr=ptr[ibyte]&0xff; + iptr=ptr[ibyte]; for (ipos=0; ipos<2; ipos++) { // dataout[ibyte*2+ichan]=((iptr&((0xf)<>ichan)&0xf; ival=(iptr>>(ipos*4))&0xf; @@ -5096,36 +5103,32 @@ double* slsDetector::decodeData(int *datain, int &nn, double *fdata) { case 16: for (ichan=0; ichanmyDetectorType == MYTHEN){ - for (ichan=0; ichanmyDetectorType == MYTHEN) mask=0xffffff; + for (ichan=0; ichansetDAC(-1,dac,mode)); #endif if(mode) - strcat(answer,"mV"); + strcat(answer," mV"); return string(answer); } @@ -4007,7 +4013,7 @@ string slsDetectorCommand::cmdADC(int narg, char *args[], int action) { return string("cannot set ")+cmd; if (sscanf(args[0],"adc:%d",&idac)==1) { - printf("chiptestboard!\n"); + // printf("chiptestboard!\n"); adc=(dacIndex)(idac+1000); } else if (cmd=="temp_adc") adc=TEMPERATURE_ADC; diff --git a/slsDetectorSoftware/slsDetector/slsDetectorUtils.cpp b/slsDetectorSoftware/slsDetector/slsDetectorUtils.cpp index fca29fac9..b9fde9e1a 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorUtils.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorUtils.cpp @@ -174,8 +174,8 @@ int slsDetectorUtils::acquire(int delflag){ //resets frames caught in receiver if(receiver){ pthread_mutex_lock(&mg); //cout << "lock"<< endl; - resetFramesCaught(); - pthread_mutex_unlock(&mg);//cout << "unlock"<< endl; + resetFramesCaught(); + pthread_mutex_unlock(&mg);//cout << "unlock"<< endl; } @@ -269,7 +269,7 @@ int slsDetectorUtils::acquire(int delflag){ aclog->addStep(getCurrentPosition(), getCurrentFileName()); if (eclog) - eclog->addStep(setDAC(-1,THRESHOLD,0), getCurrentFileName()); + eclog->addStep(setDAC(-1,THRESHOLD,0), getCurrentFileName()); if (*correctionMask&(1<< I0_NORMALIZATION)) { @@ -344,7 +344,7 @@ int slsDetectorUtils::acquire(int delflag){ } else break; - + while (dataQueueSize()) usleep(100000); // cout << "mglock " << endl;; pthread_mutex_lock(&mg); //cout << "lock"<< endl; // cout << "done " << endl;; diff --git a/slsDetectorSoftware/slsDetectorAnalysis/postProcessing.cpp b/slsDetectorSoftware/slsDetectorAnalysis/postProcessing.cpp index 9bca1e424..a3d8720e7 100644 --- a/slsDetectorSoftware/slsDetectorAnalysis/postProcessing.cpp +++ b/slsDetectorSoftware/slsDetectorAnalysis/postProcessing.cpp @@ -101,6 +101,13 @@ void postProcessing::processFrame(int *myData, int delflag, int jctb) { // cout << "decode 0"<< endl; // if (getDetectorsType()==MYTHEN) { + + + // for (int ib=0; ib<1000; ib++) + // cout << ((*(((u_int64_t*)myData)+ib))>>17&1) ; + // cout << endl; + + fdata=decodeData(myData,nn, fdata); //#ifdef VERBOSE