msg_info.msglen field after MsgReceive

Hi,

i have rewote example
http://www.qnx.com/developer/docs/qnx_6.1_docs/neutrino/lib_ref/n/name_attac
h.html
suach as the follows:

#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <sys/dispatch.h>

#define ATTACH_POINT “myname”

/* We specify the header as being at least a pulse */
typedef struct _pulse msg_header_t;

/* Our real data comes after the header */
typedef struct _my_data {
msg_header_t hdr;
int data;
} my_data_t;

/*** Server Side of the code ***/
int server() {
name_attach_t *attach;
my_data_t msg;
int rcvid;
struct _msg_info inf;

/* Create a local name (/dev/name/local/…) */
if ((attach = name_attach(NULL, ATTACH_POINT, 0)) == NULL) {
return EXIT_FAILURE;
}

/* Do your MsgReceive’s here now with the chid /
printf (“sizeof(msg):%d\n”, sizeof(msg));
while (1) {
rcvid = MsgReceive(attach->chid, &msg, sizeof(msg)-8, &inf);
printf (“msg_info: scrlen:%d msglen:%d\n”, inf.srcmsglen, inf.msglen);
if (rcvid == -1) {/
Error condition, exit */
break;
}

if (rcvid == 0) {/* Pulse received /
switch (msg.hdr.code) {
case _PULSE_CODE_DISCONNECT:
/

  • A client disconnected all its connections (called
  • name_close() for each name_open() of our name) or
  • terminated
    /
    ConnectDetach(msg.hdr.scoid);
    break;
    case _PULSE_CODE_UNBLOCK:
    /
  • REPLY blocked client wants to unblock (was hit by
  • a signal or timed out). It’s up to you if you
  • reply now or later.
    /
    break;
    default:
    /
  • A pulse sent by one of your processes or a
  • _PULSE_CODE_COIDDEATH or _PULSE_CODE_THREADDEATH
  • from the kernel?
    */
    }
    continue;
    }

/* A QNX IO message received, reject */
if (msg.hdr.type >= _IO_BASE && msg.hdr.type <= _IO_MAX) {
MsgError(rcvid, ENOSYS);
continue;
}

/* A message (presumable ours) received, handle */
printf(“Server receive %d \n”, msg.data);
MsgReply(rcvid, EOK, 0, 0);

}

/* Remove the name from the space */
name_detach(attach, 0);

return EXIT_SUCCESS;
}

/*** Client Side of the code ***/
int client() {
my_data_t msg[2];
int fd;

if ((fd = name_open(ATTACH_POINT, 0)) == -1) {
return EXIT_FAILURE;
}

/* We would have pre-defined data to stuff here */
msg[0].hdr.type = 0x00;
msg[0].hdr.subtype = 0x00;

/* Do whatever work you wanted with server connection */
for (msg[0].data=0; msg[0].data < 20; msg[0].data++) {
printf(“Client sending %d \n”, msg[0].data);
// if (MsgSend(fd, &msg, sizeof(msg), NULL, 0) == -1) {
if (MsgSend(fd, msg, sizeof(msg[0])+msg[0].data, NULL, 0) == -1) {
break;
}
}

/* Close the connection */
name_close(fd);
return EXIT_SUCCESS;
}

int main(int argc, char **argv) {
int ret;

if (argc < 2) {
printf(“Usage %s -s | -c \n”, argv[0]);
ret = EXIT_FAILURE;
printf(“Running Server … \n”);
ret = server(); /* see name_attach() for this code /
}
else if (strcmp(argv[1], “-c”) == 0) {
printf(“Running Client … \n”);
ret = client(); /
see name_open() for this code /
}
else if (strcmp(argv[1], “-s”) == 0) {
printf(“Running Server … \n”);
ret = server(); /
see name_attach() for this code */
}
else {
printf(“Usage %s -s | -c \n”, argv[0]);
ret = EXIT_FAILURE;
}
return ret;
}

and i see the client outputs:
Running Client …
Client sending 0
Client sending 1
Client sending 2
Client sending 3
Client sending 4
Client sending 5
Client sending 6
Client sending 7
Client sending 8
Client sending 9
Client sending 10
Client sending 11
Client sending 12
Client sending 13
Client sending 14
Client sending 15
Client sending 16
Client sending 17
Client sending 18
Client sending 19

and server outputs:

Running Server …
sizeof(msg):20
msg_info: scrlen:20 msglen:20
msg_info: scrlen:21 msglen:21
msg_info: scrlen:22 msglen:22
msg_info: scrlen:23 msglen:23
msg_info: scrlen:24 msglen:24
msg_info: scrlen:25 msglen:25
msg_info: scrlen:26 msglen:26
msg_info: scrlen:27 msglen:27
msg_info: scrlen:28 msglen:28
msg_info: scrlen:29 msglen:29
msg_info: scrlen:30 msglen:30
msg_info: scrlen:31 msglen:31
msg_info: scrlen:32 msglen:32
msg_info: scrlen:33 msglen:16
msg_info: scrlen:34 msglen:16
msg_info: scrlen:35 msglen:16
msg_info: scrlen:36 msglen:16
msg_info: scrlen:37 msglen:16
msg_info: scrlen:38 msglen:16
msg_info: scrlen:39 msglen:16
msg_info: scrlen:39 msglen:16

as You see client receives rignt value
msg_info.msglen after msg_info.srcmsglen will be greater than 32 bytes!!!???
Why ???


Respectfully Yours
vasa

Are you sure you are posting the right result?
Cut & Paste your program and run it, I got server
side output looks like something different.

The reason “srclen” keeps on growing is because
your client doing this:

if (MsgSend(fd, msg, sizeof(msg[0])+msg[0].data, NULL, 0) == -1) {
break;
}

Which you are sending (20 + (0 … 19)) bytes.

-xtang

Running Server …
sizeof(msg):20
msg_info: scrlen:20 msglen:12
Server receive 134515162
msg_info: scrlen:21 msglen:12
Server receive 134515162
msg_info: scrlen:22 msglen:12
Server receive 134515162
msg_info: scrlen:23 msglen:12
Server receive 134515162
msg_info: scrlen:24 msglen:12
Server receive 134515162
msg_info: scrlen:25 msglen:12
Server receive 134515162
msg_info: scrlen:26 msglen:12
Server receive 134515162
msg_info: scrlen:27 msglen:12
Server receive 134515162
msg_info: scrlen:28 msglen:12
Server receive 134515162
msg_info: scrlen:29 msglen:12
Server receive 134515162
msg_info: scrlen:30 msglen:12
Server receive 134515162
msg_info: scrlen:31 msglen:12
Server receive 134515162
msg_info: scrlen:32 msglen:12
Server receive 134515162
msg_info: scrlen:33 msglen:12
Server receive 134515162
msg_info: scrlen:34 msglen:12
Server receive 134515162
msg_info: scrlen:35 msglen:12
Server receive 134515162
msg_info: scrlen:36 msglen:12
Server receive 134515162
msg_info: scrlen:37 msglen:12
Server receive 134515162
msg_info: scrlen:38 msglen:12
Server receive 134515162
msg_info: scrlen:39 msglen:12
Server receive 134515162
msg_info: scrlen:39 msglen:12

vasa <vv40in@newmail.ru> wrote:

Hi,

i have rewote example
http://www.qnx.com/developer/docs/qnx_6.1_docs/neutrino/lib_ref/n/name_attac
h.html
suach as the follows:

#include <stdio.h
#include <errno.h
#include <stdlib.h
#include <sys/dispatch.h

#define ATTACH_POINT “myname”

/* We specify the header as being at least a pulse */
typedef struct _pulse msg_header_t;

/* Our real data comes after the header */
typedef struct _my_data {
msg_header_t hdr;
int data;
} my_data_t;

/*** Server Side of the code ***/
int server() {
name_attach_t *attach;
my_data_t msg;
int rcvid;
struct _msg_info inf;

/* Create a local name (/dev/name/local/…) */
if ((attach = name_attach(NULL, ATTACH_POINT, 0)) == NULL) {
return EXIT_FAILURE;
}

/* Do your MsgReceive’s here now with the chid /
printf (“sizeof(msg):%d\n”, sizeof(msg));
while (1) {
rcvid = MsgReceive(attach->chid, &msg, sizeof(msg)-8, &inf);
printf (“msg_info: scrlen:%d msglen:%d\n”, inf.srcmsglen, inf.msglen);
if (rcvid == -1) {/
Error condition, exit */
break;
}

if (rcvid == 0) {/* Pulse received /
switch (msg.hdr.code) {
case _PULSE_CODE_DISCONNECT:
/

  • A client disconnected all its connections (called
  • name_close() for each name_open() of our name) or
  • terminated
    /
    ConnectDetach(msg.hdr.scoid);
    break;
    case _PULSE_CODE_UNBLOCK:
    /
  • REPLY blocked client wants to unblock (was hit by
  • a signal or timed out). It’s up to you if you
  • reply now or later.
    /
    break;
    default:
    /
  • A pulse sent by one of your processes or a
  • _PULSE_CODE_COIDDEATH or _PULSE_CODE_THREADDEATH
  • from the kernel?
    */
    }
    continue;
    }

/* A QNX IO message received, reject */
if (msg.hdr.type >= _IO_BASE && msg.hdr.type <= _IO_MAX) {
MsgError(rcvid, ENOSYS);
continue;
}

/* A message (presumable ours) received, handle */
printf(“Server receive %d \n”, msg.data);
MsgReply(rcvid, EOK, 0, 0);

}

/* Remove the name from the space */
name_detach(attach, 0);

return EXIT_SUCCESS;
}

/*** Client Side of the code ***/
int client() {
my_data_t msg[2];
int fd;

if ((fd = name_open(ATTACH_POINT, 0)) == -1) {
return EXIT_FAILURE;
}

/* We would have pre-defined data to stuff here */
msg[0].hdr.type = 0x00;
msg[0].hdr.subtype = 0x00;

/* Do whatever work you wanted with server connection */
for (msg[0].data=0; msg[0].data < 20; msg[0].data++) {
printf(“Client sending %d \n”, msg[0].data);
// if (MsgSend(fd, &msg, sizeof(msg), NULL, 0) == -1) {
if (MsgSend(fd, msg, sizeof(msg[0])+msg[0].data, NULL, 0) == -1) {
break;
}
}

/* Close the connection */
name_close(fd);
return EXIT_SUCCESS;
}

int main(int argc, char **argv) {
int ret;

if (argc < 2) {
printf(“Usage %s -s | -c \n”, argv[0]);
ret = EXIT_FAILURE;
printf(“Running Server … \n”);
ret = server(); /* see name_attach() for this code /
}
else if (strcmp(argv[1], “-c”) == 0) {
printf(“Running Client … \n”);
ret = client(); /
see name_open() for this code /
}
else if (strcmp(argv[1], “-s”) == 0) {
printf(“Running Server … \n”);
ret = server(); /
see name_attach() for this code */
}
else {
printf(“Usage %s -s | -c \n”, argv[0]);
ret = EXIT_FAILURE;
}
return ret;
}

and i see the client outputs:
Running Client …
Client sending 0
Client sending 1
Client sending 2
Client sending 3
Client sending 4
Client sending 5
Client sending 6
Client sending 7
Client sending 8
Client sending 9
Client sending 10
Client sending 11
Client sending 12
Client sending 13
Client sending 14
Client sending 15
Client sending 16
Client sending 17
Client sending 18
Client sending 19

and server outputs:

Running Server …
sizeof(msg):20
msg_info: scrlen:20 msglen:20
msg_info: scrlen:21 msglen:21
msg_info: scrlen:22 msglen:22
msg_info: scrlen:23 msglen:23
msg_info: scrlen:24 msglen:24
msg_info: scrlen:25 msglen:25
msg_info: scrlen:26 msglen:26
msg_info: scrlen:27 msglen:27
msg_info: scrlen:28 msglen:28
msg_info: scrlen:29 msglen:29
msg_info: scrlen:30 msglen:30
msg_info: scrlen:31 msglen:31
msg_info: scrlen:32 msglen:32
msg_info: scrlen:33 msglen:16
msg_info: scrlen:34 msglen:16
msg_info: scrlen:35 msglen:16
msg_info: scrlen:36 msglen:16
msg_info: scrlen:37 msglen:16
msg_info: scrlen:38 msglen:16
msg_info: scrlen:39 msglen:16
msg_info: scrlen:39 msglen:16

as You see client receives rignt value
msg_info.msglen after msg_info.srcmsglen will be greater than 32 bytes!!!???
Why ???


Respectfully Yours
vasa

Are you sure you are posting the right result?
Cut & Paste your program and run it, I got server
side output looks like something different.
i is very-very strainge !!!

i have attached tarball with my

  1. source
  2. binary
    3,4-results of server and client
    could anybody test it again!

Again: on my box mgslen becomes rignt only if
srcmsglen becomes greater than 32 bytes !?!?!?

The reason “srclen” keeps on growing is because
your client doing this:

if (MsgSend(fd, msg, sizeof(msg[0])+msg[0].data, NULL, 0) == -1)
{
break;
}

Which you are sending (20 + (0 … 19)) bytes.
i want just this.


Respectfully Yours
vasa

Are you sure you are posting the right result?
Cut & Paste your program and run it, I got server
side output looks like something different.
i is very-very strainge !!!

i have attached tarball with my

  1. source
  2. binary
    3,4-results of server and client
    could anybody test it again!

Again: on my box mgslen becomes rignt only if
srcmsglen becomes greater than 32 bytes !?!?!?

The reason “srclen” keeps on growing is because
your client doing this:

if (MsgSend(fd, msg, sizeof(msg[0])+msg[0].data, NULL, 0) == -1)
{
break;
}

Which you are sending (20 + (0 … 19)) bytes.
i want just this.


Respectfully Yours
vasa

sorry, i did attached at last send

“Xiaodan Tang” <xtang@qnx.com> wrote in message
news:al2dsi$9no$1@nntp.qnx.com

Are you sure you are posting the right result?
Cut & Paste your program and run it, I got server
side output looks like something different.

The reason “srclen” keeps on growing is because
your client doing this:

if (MsgSend(fd, msg, sizeof(msg[0])+msg[0].data, NULL, 0) == -1)
{
break;
}

Which you are sending (20 + (0 … 19)) bytes.

-xtang

Running Server …
sizeof(msg):20
msg_info: scrlen:20 msglen:12
Server receive 134515162
msg_info: scrlen:21 msglen:12
Server receive 134515162
msg_info: scrlen:22 msglen:12
Server receive 134515162
msg_info: scrlen:23 msglen:12
Server receive 134515162
msg_info: scrlen:24 msglen:12
Server receive 134515162
msg_info: scrlen:25 msglen:12
Server receive 134515162
msg_info: scrlen:26 msglen:12
Server receive 134515162
msg_info: scrlen:27 msglen:12
Server receive 134515162
msg_info: scrlen:28 msglen:12
Server receive 134515162
msg_info: scrlen:29 msglen:12
Server receive 134515162
msg_info: scrlen:30 msglen:12
Server receive 134515162
msg_info: scrlen:31 msglen:12
Server receive 134515162
msg_info: scrlen:32 msglen:12
Server receive 134515162
msg_info: scrlen:33 msglen:12
Server receive 134515162
msg_info: scrlen:34 msglen:12
Server receive 134515162
msg_info: scrlen:35 msglen:12
Server receive 134515162
msg_info: scrlen:36 msglen:12
Server receive 134515162
msg_info: scrlen:37 msglen:12
Server receive 134515162
msg_info: scrlen:38 msglen:12
Server receive 134515162
msg_info: scrlen:39 msglen:12
Server receive 134515162
msg_info: scrlen:39 msglen:12

vasa <> vv40in@newmail.ru> > wrote:
Hi,

i have rewote example

http://www.qnx.com/developer/docs/qnx_6.1_docs/neutrino/lib_ref/n/name_attac
h.html
suach as the follows:

#include <stdio.h
#include <errno.h
#include <stdlib.h
#include <sys/dispatch.h

#define ATTACH_POINT “myname”

/* We specify the header as being at least a pulse */
typedef struct _pulse msg_header_t;

/* Our real data comes after the header */
typedef struct _my_data {
msg_header_t hdr;
int data;
} my_data_t;

/*** Server Side of the code ***/
int server() {
name_attach_t *attach;
my_data_t msg;
int rcvid;
struct _msg_info inf;

/* Create a local name (/dev/name/local/…) */
if ((attach = name_attach(NULL, ATTACH_POINT, 0)) == NULL) {
return EXIT_FAILURE;
}

/* Do your MsgReceive’s here now with the chid /
printf (“sizeof(msg):%d\n”, sizeof(msg));
while (1) {
rcvid = MsgReceive(attach->chid, &msg, sizeof(msg)-8, &inf);
printf (“msg_info: scrlen:%d msglen:%d\n”, inf.srcmsglen, inf.msglen);
if (rcvid == -1) {/
Error condition, exit */
break;
}

if (rcvid == 0) {/* Pulse received /
switch (msg.hdr.code) {
case _PULSE_CODE_DISCONNECT:
/

  • A client disconnected all its connections (called
  • name_close() for each name_open() of our name) or
  • terminated
    /
    ConnectDetach(msg.hdr.scoid);
    break;
    case _PULSE_CODE_UNBLOCK:
    /
  • REPLY blocked client wants to unblock (was hit by
  • a signal or timed out). It’s up to you if you
  • reply now or later.
    /
    break;
    default:
    /
  • A pulse sent by one of your processes or a
  • _PULSE_CODE_COIDDEATH or _PULSE_CODE_THREADDEATH
  • from the kernel?
    */
    }
    continue;
    }

/* A QNX IO message received, reject */
if (msg.hdr.type >= _IO_BASE && msg.hdr.type <= _IO_MAX) {
MsgError(rcvid, ENOSYS);
continue;
}

/* A message (presumable ours) received, handle */
printf(“Server receive %d \n”, msg.data);
MsgReply(rcvid, EOK, 0, 0);

}

/* Remove the name from the space */
name_detach(attach, 0);

return EXIT_SUCCESS;
}

/*** Client Side of the code ***/
int client() {
my_data_t msg[2];
int fd;

if ((fd = name_open(ATTACH_POINT, 0)) == -1) {
return EXIT_FAILURE;
}

/* We would have pre-defined data to stuff here */
msg[0].hdr.type = 0x00;
msg[0].hdr.subtype = 0x00;

/* Do whatever work you wanted with server connection */
for (msg[0].data=0; msg[0].data < 20; msg[0].data++) {
printf(“Client sending %d \n”, msg[0].data);
// if (MsgSend(fd, &msg, sizeof(msg), NULL, 0) == -1) {
if (MsgSend(fd, msg, sizeof(msg[0])+msg[0].data, NULL, 0) == -1)
{
break;
}
}

/* Close the connection */
name_close(fd);
return EXIT_SUCCESS;
}

int main(int argc, char **argv) {
int ret;

if (argc < 2) {
printf(“Usage %s -s | -c \n”, argv[0]);
ret = EXIT_FAILURE;
printf(“Running Server … \n”);
ret = server(); /* see name_attach() for this code /
}
else if (strcmp(argv[1], “-c”) == 0) {
printf(“Running Client … \n”);
ret = client(); /
see name_open() for this code /
}
else if (strcmp(argv[1], “-s”) == 0) {
printf(“Running Server … \n”);
ret = server(); /
see name_attach() for this code */
}
else {
printf(“Usage %s -s | -c \n”, argv[0]);
ret = EXIT_FAILURE;
}
return ret;
}

and i see the client outputs:
Running Client …
Client sending 0
Client sending 1
Client sending 2
Client sending 3
Client sending 4
Client sending 5
Client sending 6
Client sending 7
Client sending 8
Client sending 9
Client sending 10
Client sending 11
Client sending 12
Client sending 13
Client sending 14
Client sending 15
Client sending 16
Client sending 17
Client sending 18
Client sending 19

and server outputs:

Running Server …
sizeof(msg):20
msg_info: scrlen:20 msglen:20
msg_info: scrlen:21 msglen:21
msg_info: scrlen:22 msglen:22
msg_info: scrlen:23 msglen:23
msg_info: scrlen:24 msglen:24
msg_info: scrlen:25 msglen:25
msg_info: scrlen:26 msglen:26
msg_info: scrlen:27 msglen:27
msg_info: scrlen:28 msglen:28
msg_info: scrlen:29 msglen:29
msg_info: scrlen:30 msglen:30
msg_info: scrlen:31 msglen:31
msg_info: scrlen:32 msglen:32
msg_info: scrlen:33 msglen:16
msg_info: scrlen:34 msglen:16
msg_info: scrlen:35 msglen:16
msg_info: scrlen:36 msglen:16
msg_info: scrlen:37 msglen:16
msg_info: scrlen:38 msglen:16
msg_info: scrlen:39 msglen:16
msg_info: scrlen:39 msglen:16

as You see client receives rignt value
msg_info.msglen after msg_info.srcmsglen will be greater than 32
bytes!!!???
Why ???


Respectfully Yours
vasa

\

begin 666 test.tgz
M’XL(*ZV=3T"^T[;6P<QW5SY$DF+W)“R[MM$XQE2WG2)/’^^"’)%N?(L
ML:9)AA^V%,E=’??VN"??W5YV]B1F/4’(U<T0Y2-4T!P@]8IC’X0>NV1IND M0L!:+E2C^2&TAP40JL63G$LA18-5-5%&+/OS<SN[>X=3:P5 2Y9PQGW\R;
M]]Z>?-FYIUL
H;92FXOA,-MX<[.=J@9>&O^W=D>:X
%8M%H&PE’PNUMG82V
MDSL!<-,Z)027=/,K>ANU?]3"B:NOVF:(?DVKG\D'.[H:-ML_3N@GZ\_+'XT MT@'TD?9HF-!P=?UO.SR4SLF90E*AW8:93&LA];% J4G1]9RG":@RZ0E/VZS1 MFDP;^80IJ]@3>"BII-(YA?:,C?7T'I.&A_H'Q^B^[&PND57V!0*M3?09A1IY M14ZG9JFI*E15$DE%IPF#3BCIW"1-F#2C) R3)FB^D#$4VM0:,&?S"O"EAJD7 M9)-*O"-K3$I\M&1V,=9#!9WJ2B)#DPDS064MJQ@TD3*!O4-2!7[968F-^%* MCCY4C6I=['6=,YD;+L"<U30"[%-3714T:> ]6@:;**EF#19@V_H:PW@2(,1
M!!N%"+2&E##-A
R"C”;^Q>78O%&/DFA=GDHGNP+UMLJ@9#J7TJ S!5H@&1B@
M%V9OF"ZC":#&5 ,#;8FE:E6_&QEK:VA4@1K<!8IV@PR,73PTZU@H/CP/- MKF5LIN'&1GKX,,4N:R8(NF(6]!R-'^\?DY[HZ1\8'XESQ><"@?J\#NJ#E'U& M^HN*E@J"XHV']B=/Y?8U4T=38Y<UASZ-SFJPD$\9DR.*K*2GE,\:L':Z0G/: M-)U.FRJWKYI.6K.85M,9F&C$I10:#.948B/FV?(8#FVFCX!8EPHM;= (Y@15 MZDMJ6X8^1 U9SR@YT!U71GPQ*=9T@"QDZ#+OY:CUS>@8XU0J4S#4(&PFK6"* M65LK(70^3%MP*F"+N*YK.KA2+IDVTQKP46;2IC5K"R9@T9\K,9H+5.89YBR' MV=[1N4F27EX&V!=<>T1M</H1<[K8H@)X"!-#P^,!J7>H?ZXE)?_VCOT.!@ MO'?LD(L0H5?+Y139[%.84UEL#5ECYO!2>Z924=KXX)&!H=XG#VUG,&SR1"%C MNFGGW/RUG)G.%92*!@1[]=#/#1ZG_4,4@HF1F"R9#A95.0-3<YH0#6[-$8,, M?>PPE?J'I",]HW'ZR"/4U=?-^Y[J.>ZU,/@L6WF^>,TT/C@T>F+48Z];*VYI M',SKBE'()B9@D\#.,AH=<U 3N62&!5D8(H#[?G"?B&J"F(*[,S?'26"(:NQR MS)QMLWQFUE9YZ$F(%Q@R1'2:LX/4B)+5@!UN8A:@4KJ691@<([)BF9/%HB1W M&[YQ'<R<$6=TO+<W/CH*<5D$X]Y,6H&(N7DPEAF!'8Q=$?=D]-E2T$TEA3P6 M)E-)*T1J>247K!@:6R+;#8S"&' :3FN%3!(6FP""]7"#] D/-,#0ZI0BK%
MZ P#:H9?K;D2+"W9\+A+F^?49AP=3L"[+0*QP2N[;2F/X?AEDXG<B8(9>&5 M'U;H8+AU(>Y8@E,0C()"JIW.-Q%‘2CM=H13:&QT]3[ZJ-,TEH^)Q3(4"’%P
M^CM\S!KGB9’@:- #O!J)H](A]UC&RF_! +5UB:BH’3O32]&<U0A/MX+<’<
M0$8"4$1HN)E3HB=E$^E<$#\2^J3<#(<77#R;F@"9LI1BA[QB.AP.2<&DT4IF
M&V<;>[]!6PSZ/&V1N=60’[.[TP-A_<L=T,EKI)#+H>W%=H?K7(K8V)=8;JX M=0Q%<=T7&IEWF&K:$+NM-5 RJH)G#LX)KB]R-A]DBD:>;:;[6N1]C=;IM*EF MPDDVT\S:SU[-V#;]2?4RMJ'7[;;8Q[_N<TY/9>XV%R!5^)D$]OZ?**0SR=O[ M_N_<_/T?#D<Z[?Q/N*V=O?\[.JKO_SL!LDQ9]H>V:%!7P\#/Y/Z'E;^M^5_< M_YOF?R.Q6%O$WO^1CBCN_UBDFO^[(_!"?. )G\]GXS6DEB#VP5E_71O4;^SB M[6V$DITD2/:2^Z!&',J+0 -E!;ZQ[(#BAU(+Y086Z,.R![[WB#Z?* R@#XL$ M80<+CB<-O/\TX*=?]]=A*0+>#8T[17\-RH/^%>C#<@YP+#N%#"QU0%_WDK\. MBR7.DM]:,/363'JB-9/\0FXF9&BA*+D'VG].\+@/ROUBS%VBOD?,H5;@H ;Y M%)1/0MDKVNZ%\NE-[.QSZ$"$K5"Q2A&W'LK=A,_S$Z)-+ /9#>6!362\#N7Z ME_UU0X+N)1UP.,“R+R@74](7#DC?;C_O/C;^$^MAO^>N&&;Z;7(3Z/.!^
M@5^&^LV%$OU1J!$?M\6
’X/2C/@S_DXKN"Z7Y8]#=!&7#@[T&Y>M;B%R!O M07T*\(=$_Z]#R0"^+O!_%/I9\K^!?G+.7_>OK#] 'H?Z>: /"_H<E*\’JSA
M^”“4KY\MV>/S4+X)>(_ W_?PQ_6><=CGWW”\HW<Z@LP?K\8_PJ4[SGX$? Q
MF;N7U’=BL.>I_EXB’1T8.M(S( T]<1H?$P:ZSDR$)>(T%&Q.N6/<(X<E"
MH_UF;1)V)]2/I-8:2+B>%401]Z$6$D9(J5S:5-"G0A_21!\D!+[E41*[UDB MC;+4)&&_!!IF2;1%)$A>]J(DD3AB%A],0F4)?9;L<.[C,[8"-]&6QW%_C" M.:QA#;Z"-6R@9:S!BE_#&IS]/-:P$;Z.-3CE&UC#!G@3:]A@?X U;,!O8@V& M?0MKV&QO8PV+]"VL81->P!HV8%$#CWV'D(WVYZ%E8_^+8@TW]J-&*GZN7ML
MV(^:J=BW>IGAJ
&6WMUA>&HJ8K;>4MAJ/&*D7#8:CYFH0\66&XPQ4=+5
M%QF.,U%Q&Z[F&8XS4M%-5T\S’&>F’D-\F.$X0Q6WW^KC#,>9JL<1#S,<9ZR>
M1IPR’&>NXH16&QB.%E#SB!- !M[GL+]L?#WB^;#9&G@8?^2_T^69OQ+PW7S
M,WYB[EJ:(HLU^XSZX4_GMTY)G//5T`<-4W./%%^!K_EU\8_VMBXM…
M</MB,ZSC</%EZ/S>\OC"#^:O[QG%$Q.OG0Q#$NQ=C_RG"]"
]*P?^$U
%@D
M&Y=YT_P!4OB7D^]=!!K/V!NPG-“QS’D>GW]W_0Q15T”/,Z3X@X]0DX:%E87X
M^OS<.BE\XEL835?
!XLS[[X9D]ZB74^#."[N;:SM6_QKZE^-O#9QJ6XL7A
MQ?CZXK!_I/B=$JL/%N,?0/ME
%>&U6O(X.J/6>_\NS=4=.7BNL#G/M@HU
X5
MEN&#%$OQJ]W_Y-Y5_<U\X&U3X/&XOQ&-%PCFOW05S6ZM9N+DZC2:8(JF7
MYHH;9(JRVC>]%_4]@:
+W^7<5P>!<.'F&8+L8YVSFJU’3K8
!Y?;CXYP^
MLK)6"WS?N[APD]GJ*-@MBJ>_+$]O2OS<U<V"O7,4FM3"S=3E^+?)P3^_@,A ME^+,[#"?XKU3-6M]P&$1C*36O0H\WE^WC, 5*LZO[!E>BG^?V:GX'NNE"ROS M'Z)-ZI<WXL6UOP!]F!V H,[6TK=LZ[AW?J[.]T(WD[-KL6%$?1 E9;FD2_%U M5!*MWHK-3_/FX@^!$UOSU=]DW1^J?= -#.97_,"C^-UU,5GPWL_@Z*,X>J\8 M?>TC,7KM\VA#]91K[,O>L4SRU1_QL3.6Y+5?6/;H_.T?.75>'%]?N+Q&;+\M M^?/#$*X6YZ\SG]\P?W'A)D?X5KC.=L?ZPFNL?V9]H_#/)VU;E7A<:Q![HO@: MJ/M.Y3.?_ZA*W+^K.2X5V_OE*D#*4[ !4I9G"I *2:\:9%)A20=M!OPOL"(
MA%$8@,5@45OW#H0?PAVE!L[-W5#V08E".0)E!,H$%!W
RU"^"N5WH?PIE’>@
M_!T4ZSZ)]Z,KP.=N<4=A=T"X^^$]Z]2\OP[O=1<1]/\A[C[-(B['A'W.CSK M\<XU(^YZ]XB[UBG@B]\#4.\6X^X5]S<;CO;V'J+!HX/CC30:.M@>BM+(P8,' M(^%H&PWJ"OZ:K31^K%1UCIME.!(*1QP:W:J-A(S9K)F8@-K4>:U:7W S4/0\ M">4T4PF3D)J NT<H.9N#$;PV=1("+4)P_/./?,;$87 OX9_LEA!*00OT:^RR M$.)_95/385"25Y/PHD*.B6Q:)IR=K&6SX$!<^O_E'?/S8H8UUKM#K*'W_OV0 MN-/7"/^H\U6^IS>).[J3[FW'_=UZ9X2%+]4(_[H=&X^%B?H&D0=%:08?^
M>J6^Z%7[N/B_E\C_&W S?[Q9W2+U:TWT&’_GGS_W6+]HMNA’!>Z?8’U?
M;K^UY!YWT%T%NJM^YT.M–]GG72P_Z[“1/^FUDW’\DH…MR/;]97EIMVK!N>
M82M ]SL…BKJ+P@Z%,7>A0$W/TONM(,.XXZZ”=VO.NCR0)??A.ZL@P[CPPS0
M’2/E=GE5S+56Q#9\GYX3/D0<Z_&:J&O%6^,8.,^8@Y^EPWFW^0G2Z17L]PW’
M&Q7A.T#778’N’L?;%>$FT/U^!3IK+2PX#<ZWXN=Q,.3PYWH//PJ!]*]\Y?PJ
M>Y/'G,YE?5&KQ622SB7<,'&^:K@_N$XMR[N$X[OY/TVSBUSQ<:Y=:_:>#W' MSUHX/SBM-VZM>'VOV#A_A9]^W<+O9KAJXY]D>-[&/\7P&1MO(,ZSKY:M2NG- M6<M?C3;4LE/&B>_QX/=Y\/L]^ .N=?##FW67:VWX&[?[%>LL#K#X:,W/!_/[ MK&,^/IA/NX.^!NB?Q/DY\*>A3CK&)QWV\8%]O/*]N+X-?8\MN/5UROL2/KL= M\LXYZ%&_W\:<P();7]4Q_@\)O[-8\_USCSXH?]EAKPN>G,M%3\[E;STYE_<] M.9=KGIQ+T9-S^7=/SN6_/#F7=4_.9:>OY.^[P=]W^;B^33Z>([G7Y\[)/.AS MYV20#G-_SXB<2@3P"[\&]RZ!'_"Y<S:_Y'/G;'[9Y\[9C/O<.96$SYVS2?G< M.9NLSYVSF?65YK\;]N,+/G<.YQ6?.X?S&QYYYWWN',X?^=PYG#_SN7,X^&!R MY7!DW9Q0)M.YD$PD:;B_5Y+(I"Q');BIY-,9)1DB^5 ,NOK&AD:D@?[1,2"0 MI*0F36:TB41&8G<=*5&8(7@ADI*%;':6I#1=5B13DT0FI=<Q& 3")9R)8\WQ MP3X/2]EFR3(ZG*70@%/S?] KLCQ6.LF9%"KEH]R)'I[A$1FG4F:(I8X(_RF[ ME'%R9ZU$*HC_#F^EC)PII5+ZR9DZ8CDHD>ERIK D=G\422]'OLO*/E7,H[$\ M5&D$9KVJ<.O??W!A0^@%_R___CO2'NUP_/M__/TW&NV(5'__N1/ W_@A_ FP M],RO],IW9ABBX4!97B$:MO(*\,7S"K$*5!&;*K(%5=2FBFY!%;.I8EM0M=E4 M;5M0M=M4[5M0==A4'5M0==I4G5M0';"I#FQ!=="F.K@Y5<RV?6P+V\=LV\>V ML'W,MGUL"]O';-M'MK!$K&U;5.W;HNK8%E7GMJ@.;(OJX$](%0[\E,5_.+-O M8_B_5?P/=X0[//__5S3<5OWW/W<$*B5N/;G@<%E+I*PE6M82*VMI*VMI+VOI M*&OI+&LY4-9RL%S#"DJ7:QTI5SM2KG>D7/%(N>:1<M4CY;I'RI6/@/;5>V@5 HJE"%*E2A"E6H0A6J4(4J5*$*5:A"%:I0A2I4X>.%_P5"TB=5% `````
`
end