From 51cfdae50ff91d99d9f1fd1dc9756a5335ee91fb Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Mon, 3 Apr 2000 20:56:40 +0000 Subject: [PATCH] Hi, here is an updated version of the bit type with a bugfix and all the necessa ry SQL functions defined. This should replace what is currently in contrib. I'd appreciate any comments on what is there. Kind regards, Adriaan --- contrib/bit/Makefile | 50 +++++++-- contrib/bit/README | 3 - contrib/bit/varbit.c | 168 ++++++++++++++--------------- contrib/bit/varbit.demo.sql | 29 +++++ contrib/bit/varbit.drop.sql | 36 +++++++ contrib/bit/varbit.h | 52 ++++----- contrib/bit/varbit.source | 171 ++++++++++++++++++++++++++++++ contrib/bit/varbit_glue.c | 22 ++++ contrib/bit/vartest.c | 24 +++-- src/bin/pgaccess/lib/languages/ID | Bin 735193 -> 736859 bytes 10 files changed, 423 insertions(+), 132 deletions(-) create mode 100644 contrib/bit/varbit.demo.sql create mode 100644 contrib/bit/varbit.drop.sql create mode 100644 contrib/bit/varbit.source create mode 100644 contrib/bit/varbit_glue.c diff --git a/contrib/bit/Makefile b/contrib/bit/Makefile index 9603cba27f8..96e751d0c18 100644 --- a/contrib/bit/Makefile +++ b/contrib/bit/Makefile @@ -1,10 +1,46 @@ -CFLAGS = -g +ifndef PGDIR +PGDIR= ../.. +PGDIR=/data/build/postgresql-7.0beta3 +endif -varbit: vartest.o varbit.o - $(CC) $(CFLAGS) -o $@ $^ +SRCDIR= $(PGDIR)/src -varbit.o: varbit.c varbit.h -vartest.o: vartest.c varbit.h +include $(SRCDIR)/Makefile.global + +TARGETS= varbit.sql varbit$(DLSUFFIX) +# vartest +SOURCE= varbit.c varbit_glue.c +OBJ= $(SOURCE:.c=.o) +CFLAGS += -g + +all: $(TARGETS) + +varbit$(DLSUFFIX): $(OBJ) + $(CC) $(CFLAGS) -shared -o varbit$(DLSUFFIX) $(SOURCE) $(CLIBS) + +vartest: varbit.o vartest.o + $(CC) -o $@ varbit.o vartest.o + +install: + $(MAKE) all + cp -p varbit$(DLSUFFIX) $(LIBDIR)/contrib + chmod 555 $(LIBDIR)/contrib/varbit$(DLSUFFIX) + +%.sql: %.source + echo $(SRCDIR) + if [ -z "$$USER" ]; then USER=$$LOGNAME; fi; \ + if [ -z "$$USER" ]; then USER=`whoami`; fi; \ + if [ -z "$$USER" ]; then echo 'Cannot deduce $$USER.'; exit 1; fi; \ + rm -f $@; \ + C=`pwd`; \ + O=$C; \ + if [ -d ${LIBDIR}/contrib ]; then O=${LIBDIR}/contrib; else \ + echo "contrib directory does not exist."; fi; \ + sed -e "s:_CWD_:$$C:g" \ + -e "s:_OBJWD_:$$O:g" \ + -e "s:_DLSUFFIX_:$(DLSUFFIX):g" \ + -e "s/_USER_/$$USER/g" < $< > $@ + +clean: + rm -f $(TARGETS) varbit.o -clean: - rm -f *.o varbit diff --git a/contrib/bit/README b/contrib/bit/README index b2ddb904b30..18a1fe1820b 100644 --- a/contrib/bit/README +++ b/contrib/bit/README @@ -7,9 +7,6 @@ make this code as independent as possible of the byte length, but it is quite possible that there may be problems on machines that don't have 8 bits/byte (are there still any around?). -In the input routines I have assumed that the parser eats the quotes -in B'...' or X'...'. - The SQL standard only defines comparison, SUBSTR and concatenation operators, and these have been implemented. In addition all logical operators have been implemented, i.e. ~,|,&,^,<< and >>. This is diff --git a/contrib/bit/varbit.c b/contrib/bit/varbit.c index 257f9766fd6..2a677ec6040 100644 --- a/contrib/bit/varbit.c +++ b/contrib/bit/varbit.c @@ -4,18 +4,14 @@ * Functions for the built-in type bit() and varying bit(). * * IDENTIFICATION - * $Header: /cvsroot/pgsql/contrib/bit/Attic/varbit.c,v 1.1 1999/11/29 22:34:36 momjian Exp $ + * $Header: /cvsroot/pgsql/contrib/bit/Attic/varbit.c,v 1.2 2000/04/03 20:56:40 momjian Exp $ * *------------------------------------------------------------------------- */ -#include "postgres.h" #include "varbit.h" -/* #include "access/htup.h" -#include "catalog/pg_type.h" -#include "utils/builtins.h" -*/ - +/*#include "catalog/pg_type.h" */ +/*#include "utils/builtins.h" */ /* @@ -43,22 +39,22 @@ * (XXX dummy is here because we pass typelem as the second argument * for array_in. copied this, no idea what it means??) */ -char * +bits8 * zpbitin(char *s, int dummy, int32 atttypmod) { - char *result, - *sp; /* pointer into the character string */ + bits8 *result; /* the bits string that was read in */ + char *sp; /* pointer into the character string */ bits8 *r; int len, /* Length of the whole data structure */ bitlen, /* Number of bits in the bit string */ slen; /* Length of the input string */ - int bit_not_hex; /* 0 = hex string 1=bit string */ - int i, bc, ipad; - bits8 x, y; + int bit_not_hex = 0; /* 0 = hex string 1=bit string */ + int bc, ipad; + bits8 x = 0; if (s == NULL) - return NULL; + return (bits8 *) NULL; /* Check that the first character is a b or an x */ if (s[0]=='b' || s[0]=='B') @@ -82,7 +78,8 @@ zpbitin(char *s, int dummy, int32 atttypmod) if (atttypmod == -1) atttypmod = bitlen; else - if (bitlen>atttypmod && bit_not_hex || bitlen>atttypmod+3 && !bit_not_hex) + if ((bitlen>atttypmod && bit_not_hex) || + (bitlen>atttypmod+3 && !bit_not_hex)) elog(ERROR, "zpbitin: bit string of size %d cannot be written into bits(%d)", bitlen,atttypmod); @@ -90,10 +87,10 @@ zpbitin(char *s, int dummy, int32 atttypmod) len = VARBITDATALEN(atttypmod); if (len > MaxAttrSize) - elog(ERROR, "zpbitin: length of bit() must be less than %d", + elog(ERROR, "zpbitin: length of bit() must be less than %ld", (MaxAttrSize-VARHDRSZ-VARBITHDRSZ)*BITSPERBYTE); - result = (char *) palloc(len); + result = (bits8 *) palloc(len); /* set to 0 so that *r is always initialised and strin is zero-padded */ memset(result, 0, len); VARSIZE(result) = len; @@ -103,7 +100,7 @@ zpbitin(char *s, int dummy, int32 atttypmod) significant byte first. s points to the byte before the beginning of the bitstring */ sp = s+1; - r = (bits8 *) VARBITS(result); + r = VARBITS(result); if (bit_not_hex) { /* Parse the bit representation of the string */ @@ -166,10 +163,10 @@ zpbitin(char *s, int dummy, int32 atttypmod) * for long strings */ char * -zpbitout(char *s) +zpbitout(bits8 *s) { char *result, *r; - VarBit sp; + bits8 *sp; int i, len, bitlen; if (s == NULL) @@ -183,7 +180,7 @@ zpbitout(char *s) bitlen = VARBITLEN(s); len = bitlen/4 + (bitlen%4>0 ? 1 : 0); result = (char *) palloc(len + 4); - sp = (bits8 *) VARBITS(s); + sp = VARBITS(s); r = result; *r++ = 'X'; *r++ = '\''; @@ -206,10 +203,10 @@ zpbitout(char *s) * Prints the string a bits */ char * -zpbitsout(char *s) +zpbitsout(bits8 *s) { char *result, *r; - VarBit sp; + bits8 *sp; bits8 x; int i, k, len; @@ -223,7 +220,7 @@ zpbitsout(char *s) { len = VARBITLEN(s); result = (char *) palloc(len + 4); - sp = (bits8 *) VARBITS(s); + sp = VARBITS(s); r = result; *r++ = 'B'; *r++ = '\''; @@ -252,22 +249,22 @@ zpbitsout(char *s) * varbitin - * converts a string to the internal representation of a bitstring. */ -char * +bits8 * varbitin(char *s, int dummy, int32 atttypmod) { - char *result, - *sp; /* pointer into the character string */ + bits8 *result; /* The resulting bit string */ + char *sp; /* pointer into the character string */ bits8 *r; int len, /* Length of the whole data structure */ bitlen, /* Number of bits in the bit string */ slen; /* Length of the input string */ - int bit_not_hex; - int i, bc, ipad; - bits8 x, y; + int bit_not_hex = 0; + int bc, ipad; + bits8 x = 0; if (s == NULL) - return NULL; + return (bits8 *) NULL; /* Check that the first character is a b or an x */ if (s[0]=='b' || s[0]=='B') @@ -289,7 +286,8 @@ varbitin(char *s, int dummy, int32 atttypmod) reading a hex string and not by more than 3 bits, as a hex string gives and accurate length upto 4 bits */ if (atttypmod > -1) - if (bitlen>atttypmod && bit_not_hex || bitlen>atttypmod+3 && !bit_not_hex) + if ((bitlen>atttypmod && bit_not_hex) || + (bitlen>atttypmod+3 && !bit_not_hex)) elog(ERROR, "varbitin: bit string of size %d cannot be written into varying bits(%d)", bitlen,atttypmod); @@ -297,10 +295,10 @@ varbitin(char *s, int dummy, int32 atttypmod) len = VARBITDATALEN(bitlen); if (len > MaxAttrSize) - elog(ERROR, "varbitin: length of bit() must be less than %d", + elog(ERROR, "varbitin: length of bit() must be less than %ld", (MaxAttrSize-VARHDRSZ-VARBITHDRSZ)*BITSPERBYTE); - result = (char *) palloc(len); + result = (bits8 *) palloc(len); /* set to 0 so that *r is always initialised and strin is zero-padded */ memset(result, 0, len); VARSIZE(result) = len; @@ -310,7 +308,7 @@ varbitin(char *s, int dummy, int32 atttypmod) significant byte first. s points to the byte before the beginning of the bitstring */ sp = s + 1; - r = (VarBit) VARBITS(result); + r = VARBITS(result); if (bit_not_hex) { /* Parse the bit representation of the string */ @@ -383,11 +381,10 @@ varbitin(char *s, int dummy, int32 atttypmod) */ bool -biteq (char *arg1, char *arg2) +biteq (bits8 *arg1, bits8 *arg2) { int bitlen1, bitlen2; - bits8 *p1, *p2; if (!PointerIsValid(arg1) || !PointerIsValid(arg2)) return (bool) 0; @@ -402,11 +399,10 @@ biteq (char *arg1, char *arg2) } bool -bitne (char *arg1, char *arg2) +bitne (bits8 *arg1, bits8 *arg2) { int bitlen1, bitlen2; - bits8 *p1, *p2; if (!PointerIsValid(arg1) || !PointerIsValid(arg2)) return (bool) 0; @@ -429,11 +425,10 @@ bitne (char *arg1, char *arg2) * Anything is equal to undefined. */ int -bitcmp (char *arg1, char *arg2) +bitcmp (bits8 *arg1, bits8 *arg2) { int bitlen1, bytelen1, bitlen2, bytelen2; - bits8 *p1, *p2; int cmp; if (!PointerIsValid(arg1) || !PointerIsValid(arg2)) @@ -452,25 +447,25 @@ bitcmp (char *arg1, char *arg2) } bool -bitlt (char *arg1, char *arg2) +bitlt (bits8 *arg1, bits8 *arg2) { return (bool) (bitcmp(arg1,arg2) == -1); } bool -bitle (char *arg1, char *arg2) +bitle (bits8 *arg1, bits8 *arg2) { return (bool) (bitcmp(arg1,arg2) <= 0); } bool -bitge (char *arg1, char *arg2) +bitge (bits8 *arg1, bits8 *arg2) { return (bool) (bitcmp(arg1,arg2) >= 0); } bool -bitgt (char *arg1, char *arg2) +bitgt (bits8 *arg1, bits8 *arg2) { return (bool) (bitcmp(arg1,arg2) == 1); } @@ -478,11 +473,11 @@ bitgt (char *arg1, char *arg2) /* bitcat * Concatenation of bit strings */ -char * -bitcat (char *arg1, char *arg2) +bits8 * +bitcat (bits8 *arg1, bits8 *arg2) { int bitlen1, bitlen2, bytelen, bit1pad, bit2shift; - char *result; + bits8 *result; bits8 *pr, *pa; if (!PointerIsValid(arg1) || !PointerIsValid(arg2)) @@ -493,7 +488,7 @@ bitcat (char *arg1, char *arg2) bytelen = VARBITDATALEN(bitlen1+bitlen2); - result = (char *) palloc(bytelen*sizeof(bits8)); + result = (bits8 *) palloc(bytelen*sizeof(bits8)); VARSIZE(result) = bytelen; VARBITLEN(result) = bitlen1+bitlen2; printf("%d %d %d \n",VARBITBYTES(arg1),VARBITLEN(arg1),VARBITPAD(arg1)); @@ -510,10 +505,10 @@ bitcat (char *arg1, char *arg2) { /* We need to shift all the results to fit */ bit2shift = BITSPERBYTE - bit1pad; - pa = (VarBit) VARBITS(arg2); - pr = (VarBit) VARBITS(result)+VARBITBYTES(arg1)-1; + pa = VARBITS(arg2); + pr = VARBITS(result)+VARBITBYTES(arg1)-1; for ( ; pa < VARBITEND(arg2); pa++) { - *pr = *pr | ((*pa >> bit2shift) & BITMASK); + *pr |= ((*pa >> bit2shift) & BITMASK); pr++; if (pr < VARBITEND(result)) *pr = (*pa << bit1pad) & BITMASK; @@ -528,17 +523,17 @@ bitcat (char *arg1, char *arg2) * Note, s is 1-based. * SQL draft 6.10 9) */ -char * -bitsubstr (char *arg, int32 s, int32 l) +bits8 * +bitsubstr (bits8 *arg, int32 s, int32 l) { int bitlen, rbitlen, len, - ipad, + ipad = 0, ishift, i; int e, s1, e1; - char * result; + bits8 * result; bits8 mask, *r, *ps; if (!PointerIsValid(arg)) @@ -552,7 +547,7 @@ bitsubstr (char *arg, int32 s, int32 l) { /* Need to return a null string */ len = VARBITDATALEN(0); - result = (char *) palloc(len); + result = (bits8 *) palloc(len); VARBITLEN(result) = 0; VARSIZE(result) = len; } @@ -562,22 +557,22 @@ bitsubstr (char *arg, int32 s, int32 l) ending at position e1-1 */ rbitlen = e1-s1; len = VARBITDATALEN(rbitlen); - result = (char *) palloc(len); + result = (bits8 *) palloc(len); VARBITLEN(result) = rbitlen; VARSIZE(result) = len; + len -= VARHDRSZ + VARBITHDRSZ; /* Are we copying from a byte boundary? */ if ((s1-1)%BITSPERBYTE==0) { /* Yep, we are copying bytes */ - len -= VARHDRSZ + VARBITHDRSZ; memcpy(VARBITS(result),VARBITS(arg)+(s1-1)/BITSPERBYTE,len); } else { /* Figure out how much we need to shift the sequence by */ ishift = (s1-1)%BITSPERBYTE; - r = (VarBit) VARBITS(result); - ps = (VarBit) VARBITS(arg) + (s1-1)/BITSPERBYTE; + r = VARBITS(result); + ps = VARBITS(arg) + (s1-1)/BITSPERBYTE; for (i=0; i=b as "a>=b",a>b as "a>b",a<=>b as "a<=>b" from bit_example; +select a,a<<4 as "a<<4",b,b>>2 as "b>>2" from bit_example; +select a,b,a||b as "a||b", bitsubstr(a,4,4) as "sub(a,4,4)", + bitsubstr(b,2,4) as "sub(b,2,4)", + bitsubstr(b,5,5) as "sub(b,5,5)" + from bit_example; + +drop table bit_example; diff --git a/contrib/bit/varbit.drop.sql b/contrib/bit/varbit.drop.sql new file mode 100644 index 00000000000..54b831ea2dc --- /dev/null +++ b/contrib/bit/varbit.drop.sql @@ -0,0 +1,36 @@ +DROP FUNCTION biteq(bits,bits); +DROP OPERATOR = (bits,bits); +DROP FUNCTION bitne(bits,bits); +DROP OPERATOR <> (bits,bits); +DROP FUNCTION bitlt(bits,bits); +DROP OPERATOR < (bits,bits); +DROP FUNCTION bitle(bits,bits); +DROP OPERATOR <= (bits,bits); +DROP FUNCTION bitgt(bits,bits); +DROP OPERATOR > (bits,bits); +DROP FUNCTION bitge(bits,bits); +DROP OPERATOR >= (bits,bits); +DROP FUNCTION bitcmp(bits,bits); +DROP OPERATOR <=> (bits,bits); + +DROP FUNCTION bitor(bits,bits); +DROP OPERATOR | (bits,bits); +DROP FUNCTION bitand(bits,bits); +DROP OPERATOR & (bits,bits); +DROP FUNCTION bitxor(bits,bits); +DROP OPERATOR ^ (bits,bits); +DROP FUNCTION bitnot(bits); +DROP OPERATOR ~ (none,bits); + +DROP FUNCTION bitshiftleft(bits,int4); +DROP OPERATOR << (bits,int4); +DROP FUNCTION bitshiftright(bits,int4); +DROP OPERATOR >> (bits,int4); + +DROP FUNCTION bitsubstr(bits,integer,integer); +DROP OPERATOR || (bits,bits); +DROP FUNCTION bitcat(bits,bits); + +DROP FUNCTION varbit_in(opaque); +DROP FUNCTION varbit_out(opaque); +DROP TYPE bits; diff --git a/contrib/bit/varbit.h b/contrib/bit/varbit.h index af55f486ea3..44007ad10a9 100644 --- a/contrib/bit/varbit.h +++ b/contrib/bit/varbit.h @@ -1,17 +1,21 @@ +#include "c.h" #include "postgres.h" -typedef bits8 *VarBit; -typedef uint32 BitIndex; - #define HEXDIG(z) (z)<10 ? ((z)+'0') : ((z)-10+'A') +/* Modeled on struct varlena from postgres.h, bu data type is bits8 */ +struct varbita +{ + int32 vl_len; + bits8 vl_dat[1]; +}; #define BITSPERBYTE 8 #define VARBITHDRSZ sizeof(int32) /* Number of bits in this bit string */ -#define VARBITLEN(PTR) (((struct varlena *)VARDATA(PTR))->vl_len) +#define VARBITLEN(PTR) (((struct varbita *)VARDATA(PTR))->vl_len) /* Pointer tp the first byte containing bit string data */ -#define VARBITS(PTR) (((struct varlena *)VARDATA(PTR))->vl_dat) +#define VARBITS(PTR) (((struct varbita *)VARDATA(PTR))->vl_dat) /* Number of bytes in the data section of a bit string */ #define VARBITBYTES(PTR) (VARSIZE(PTR) - VARHDRSZ - VARBITHDRSZ) /* Padding of the bit string at the end */ @@ -27,22 +31,22 @@ typedef uint32 BitIndex; #define BITHIGH 0x80 -char * zpbitin(char *s, int dummy, int32 atttypmod); -char * zpbitout(char *s); -char * zpbitsout(char *s); -char * varbitin(char *s, int dummy, int32 atttypmod); -bool biteq (char *arg1, char *arg2); -bool bitne (char *arg1, char *arg2); -bool bitge (char *arg1, char *arg2); -bool bitgt (char *arg1, char *arg2); -bool bitle (char *arg1, char *arg2); -bool bitlt (char *arg1, char *arg2); -int bitcmp (char *arg1, char *arg2); -char * bitand (char * arg1, char * arg2); -char * bitor (char * arg1, char * arg2); -char * bitxor (char * arg1, char * arg2); -char * bitnot (char * arg); -char * bitshiftright (char * arg, int shft); -char * bitshiftleft (char * arg, int shft); -char * bitcat (char *arg1, char *arg2); -char * bitsubstr (char *arg, int32 s, int32 l); +bits8 * zpbitin(char *s, int dummy, int32 atttypmod); +char * zpbitout(bits8 *s); +char * zpbitsout(bits8 *s); +bits8 * varbitin(char *s, int dummy, int32 atttypmod); +bool biteq (bits8 *arg1, bits8 *arg2); +bool bitne (bits8 *arg1, bits8 *arg2); +bool bitge (bits8 *arg1, bits8 *arg2); +bool bitgt (bits8 *arg1, bits8 *arg2); +bool bitle (bits8 *arg1, bits8 *arg2); +bool bitlt (bits8 *arg1, bits8 *arg2); +int bitcmp (bits8 *arg1, bits8 *arg2); +bits8 * bitand (bits8 * arg1, bits8 * arg2); +bits8 * bitor (bits8 * arg1, bits8 * arg2); +bits8 * bitxor (bits8 * arg1, bits8 * arg2); +bits8 * bitnot (bits8 * arg); +bits8 * bitshiftright (bits8 * arg, int shft); +bits8 * bitshiftleft (bits8 * arg, int shft); +bits8 * bitcat (bits8 *arg1, bits8 *arg2); +bits8 * bitsubstr (bits8 *arg, int32 s, int32 l); diff --git a/contrib/bit/varbit.source b/contrib/bit/varbit.source new file mode 100644 index 00000000000..8b9dc29aab5 --- /dev/null +++ b/contrib/bit/varbit.source @@ -0,0 +1,171 @@ +LOAD '_OBJWD_/varbit.so'; + +CREATE FUNCTION varbit_in(opaque) + RETURNS bit + AS '_OBJWD_/varbit.so' + LANGUAGE 'c'; + +CREATE FUNCTION varbit_out(opaque) + RETURNS opaque + AS '_OBJWD_/varbit.so' + LANGUAGE 'c'; + +CREATE TYPE bits ( + internallength = -1, + input = varbit_in, + output = varbit_out +); + +CREATE FUNCTION bitcat(bits,bits) RETURNS bits + AS '_OBJWD_/varbit.so' + LANGUAGE 'C'; + +CREATE OPERATOR || ( + leftarg = bits, + rightarg = bits, + procedure = bitcat +); + +CREATE FUNCTION bitsubstr(bits,integer,integer) RETURNS bits + AS '_OBJWD_/varbit.so' + LANGUAGE 'C'; + +CREATE FUNCTION biteq(bits,bits) RETURNS bool + AS '_OBJWD_/varbit.so' + LANGUAGE 'C'; + +CREATE OPERATOR = ( + leftarg = bits, + rightarg = bits, + procedure = biteq, + negator = <>, + commutator = = +); + +CREATE FUNCTION bitne(bits,bits) RETURNS bool + AS '_OBJWD_/varbit.so' + LANGUAGE 'C'; + +CREATE OPERATOR <> ( + leftarg = bits, + rightarg = bits, + procedure = bitne, + negator = =, + commutator = <> +); + +CREATE FUNCTION bitlt(bits,bits) RETURNS bool + AS '_OBJWD_/varbit.so' + LANGUAGE 'C'; + +CREATE OPERATOR < ( + leftarg = bits, + rightarg = bits, + procedure = bitlt +); + +CREATE FUNCTION bitle(bits,bits) RETURNS bool + AS '_OBJWD_/varbit.so' + LANGUAGE 'C'; + +CREATE OPERATOR <= ( + leftarg = bits, + rightarg = bits, + procedure = bitle +); + +CREATE FUNCTION bitgt(bits,bits) RETURNS bool + AS '_OBJWD_/varbit.so' + LANGUAGE 'C'; + +CREATE OPERATOR > ( + leftarg = bits, + rightarg = bits, + procedure = bitgt, + negator = <=, + commutator = < +); + +CREATE FUNCTION bitge(bits,bits) RETURNS bool + as '_OBJWD_/varbit.so' + language 'C'; + +CREATE OPERATOR >= ( + leftarg = bits, + rightarg = bits, + procedure = bitge, + negator = <, + commutator = <= +); + +CREATE FUNCTION bitcmp(bits,bits) RETURNS int4 + AS '_OBJWD_/varbit.so' + LANGUAGE 'C'; + +CREATE OPERATOR <=> ( + leftarg = bits, + rightarg = bits, + procedure = bitcmp +); + +CREATE FUNCTION bitor(bits,bits) RETURNS bits + AS '_OBJWD_/varbit.so' + LANGUAGE 'C'; + +CREATE OPERATOR | ( + leftarg = bits, + rightarg = bits, + procedure = bitor, + commutator = | +); + +CREATE FUNCTION bitand(bits,bits) RETURNS bits + AS '_OBJWD_/varbit.so' + LANGUAGE 'C'; + +CREATE OPERATOR & ( + leftarg = bits, + rightarg = bits, + procedure = bitand, + commutator = & +); + + +CREATE FUNCTION bitxor(bits,bits) RETURNS bits + AS '_OBJWD_/varbit.so' + LANGUAGE 'C'; + +CREATE OPERATOR ^ ( + leftarg = bits, + rightarg = bits, + procedure = bitxor +); + +CREATE FUNCTION bitnot(bits) RETURNS bits + AS '_OBJWD_/varbit.so' + LANGUAGE 'C'; + +CREATE OPERATOR ~ ( + rightarg = bits, + procedure = bitnot +); + +CREATE FUNCTION bitshiftleft(bits,int4) RETURNS bits + AS '_OBJWD_/varbit.so' + LANGUAGE 'C'; + +CREATE OPERATOR << ( + leftarg = bits, + rightarg = int4, + procedure = bitshiftleft +); + +CREATE FUNCTION bitshiftright(bits,int4) RETURNS bits + AS '_OBJWD_/varbit.so' + LANGUAGE 'C'; + +CREATE OPERATOR >> ( + leftarg = bits, + rightarg = int4, + procedure = bitshiftright +); diff --git a/contrib/bit/varbit_glue.c b/contrib/bit/varbit_glue.c new file mode 100644 index 00000000000..29b7debd03c --- /dev/null +++ b/contrib/bit/varbit_glue.c @@ -0,0 +1,22 @@ +/* Glue file to use varbit before it is properly integrated with postgres */ + +#include "varbit.h" + +bits8 * varbit_in (char * s); +char * varbit_out (bits8 *s); + +bits8 * +varbit_in (char * s) { + return varbitin (s, 0, -1); +} + +/*char * +varbit_out (bits8 *s) { + return zpbitout(s); +} +*/ + +char * +varbit_out (bits8 *s) { + return zpbitsout(s); +} diff --git a/contrib/bit/vartest.c b/contrib/bit/vartest.c index 732141e8df4..f07f5c5b833 100644 --- a/contrib/bit/vartest.c +++ b/contrib/bit/vartest.c @@ -2,6 +2,8 @@ #include "varbit.h" #include +void print_details (unsigned char *s); + const int numb = 8; /* const char *b[] = { "B0010", "B11011011", "B0001", "X3F12", "X27", "B", @@ -23,13 +25,13 @@ void print_details (unsigned char *s) printf("\n"); } -void +int main () { int i, j; char *s[numb]; - for (i=0; i %s\n",zpbitsout(s[3]),9,8, zpbitsout(bitsubstr(s[3],9,8))); - printf("%s (%d,%d) => %s\n",zpbitsout(s[3]),1,9, + printf("%s (%d,%d) => %s\n",zpbitsout(s[3]),1,9, zpbitsout(bitsubstr(s[3],1,9))); - printf("%s (%d,%d) => %s\n",zpbitsout(s[3]),3,5, + printf("%s (%d,%d) => %s\n",zpbitsout(s[3]),3,5, zpbitsout(bitsubstr(s[3],3,5))); - printf("%s (%d,%d) => %s\n",zpbitsout(s[3]),3,9, + printf("%s (%d,%d) => %s\n",zpbitsout(s[3]),3,9, zpbitsout(bitsubstr(s[3],3,9))); - printf("%s (%d,%d) => %s\n",zpbitsout(s[3]),3,17, + printf("%s (%d,%d) => %s\n",zpbitsout(s[3]),3,17, zpbitsout(bitsubstr(s[3],3,17))); printf ("\nLOGICAL AND:\n"); for (i=0; i %s\n",zpbitsout(s[3]),9,8, zpbitsout(bitsubstr(s[3],9,8))); - printf("%s (%d,%d) => %s\n",zpbitsout(s[3]),1,9, + printf("%s (%d,%d) => %s\n",zpbitsout(s[3]),1,9, zpbitsout(bitsubstr(s[3],1,9))); - printf("%s (%d,%d) => %s\n",zpbitsout(s[3]),3,5, + printf("%s (%d,%d) => %s\n",zpbitsout(s[3]),3,5, zpbitsout(bitsubstr(s[3],3,5))); - printf("%s (%d,%d) => %s\n",zpbitsout(s[3]),3,9, + printf("%s (%d,%d) => %s\n",zpbitsout(s[3]),3,9, zpbitsout(bitsubstr(s[3],3,9))); - printf("%s (%d,%d) => %s\n",zpbitsout(s[3]),3,17, - zpbitsout(bitsubstr(s[3],3,17))); + printf("%s (%d,%d) => %s (%s)\n",zpbitsout(s[3]),3,17, + zpbitsout(bitsubstr(s[3],3,17)),zpbitsout(bitsubstr(s[3],3,17))); printf ("\nLOGICAL AND:\n"); for (i=0; iKLs~OO`x+cl%uV!p4_;8{1eO&5oqC_tGA+WC1OM zO=1$jc7q!X*fKUIHiu8*Kw@kM974G4;5U$P1Sg;H%bO64121oQA>mg~Rdx5bdgc#l z>v^iW>ZzxmtDdUv`TI9c`oZr`+W7Ua7CKmAYe%8*XnUdXWLPMCpin3rZz~j@4hn^B zy!^H^?%8-rI6GMwJ)uyTm|kei?W@%r^8(yEF)jWsH0Bp1qE^49F+DEIw@yr3rh2MA zxj5dCO=o5%<->~$6RNbZxG*y}QIkW|XXf_SWU01Lo1EES7+p~a3ys6Iso6;ycX^>O zJu^G+&VY0&=AP%uI_KYO{Z#J}CgzIUi1Jtb5Vidcz1*F$gSZ^l<=pnp%q+|=%+=%s zCFA7$8q@We@rmjEVl4F})yyB9l&G0{ZL%R&Pb>tln;G9*PuMsoX1`n;p*v$sNZgoS zsPP9^sqVLL7thYjE=){K+(vWmMvkq}s%Q=qGy7|j?AqMCYM)9C@prG9OETy(v8?-P z1|dy8d5*f^i|vT?BZe3_59-W%)Bj%`;tdz#j5c~57bDcIEFKE zdcHO#dLfZ1jGo8YySQ&(Lyj>&$H};eKRMT!6?OX?2WLd#;PheH`*h?vJR%2}qdD_(ZG1rzCoBd>Oz&NoYcxa`^Fo|> z<^Bn(DW_ z0!Th;<5LsU3MM5bY0rUsIHwhAZgHNk<^00pUWMT5Fupje0Hx9dvF@mUi5q%A#l=K> zV_{EiK{nyj+ch`0=gR$;H|i6!qRCqdg{y0GbG0K1SkUW8ps2VlwN(UdNlgYprzR^; zKq#QuBdUU%y!zb4-i87XG$v>so4aW zZ!9cuBQu|X2PgN0Fa+lmuNC%DVYtcI!D;2Xw~&x@sK$NG-pNMNq_(gyy*Nd{iG2Et z({-VI3f|wCt|fIOmQdvDN(=~7m@8aTPpXm>x$vc39GI9%N(*vHd2wRzMDpCk!NuBS zQpOG^vgT4_6fip%a#m%PbB#$wmw?n_o~V>0En^#v@cHqH_jQXk-xAhA>fw zLCI@XOcyaJbHPv`m+RVou5|lr3k^U`VR>d2Au?Y8FK~ry>{EzPVJ7x2Vt4gP9zSH@ zIG@Mf+B`Inio#t~NYs3FaZk(n+k&NVnu(+3pDqZ1V+ zC5XnpxyF3+JG6))P>|NZi!TaVlP^#?qEM!t389_Iof`@PwbzT zi*kxk!dt`oftnDWw@O(OyB>l!kz2o|K?0S+jVY|A@_A5=bv&f0O#v|9&}yX>6Y<9; z847CEa}!fJSStJ`Qq9^p(!`BdEiuBI$a2)UN{Y&J$U4YD&XLhE6!#>C-db|{W(#wI2b1Q`Nm|U4iAfcxLOAel1?Pja*mA8Y5D*r z6CzI4YYPBP)h4C^RDR(c5w?f3s>~x)E|Q#rY>;^_fr2UpFC+_cjxb)TRO3V*xlK@V zKA#I;(==A)Fpn@u@a7dLs>nAda3~ORNwhZgnZ{gQM{$EZry*#OHAKRa6hV$nL!c~V z<1bLKx}Y^oTvLM3x=A7}4wDI)m&TAowF%+OeO{WJJy28Sz4PN)X+jmp_b(n6zJ-^$ z*J)&pXcwr86LS-X9aWy3m`?G02avT-_HYWMy`3t~*JqN_3=haB=J!lkzKf`kIqV8JQLv1TvFuLmXne~(-VgplNoUM*4kV{fwxLw^Hq9CmFsE5G0K6&SB;WwOZ@1l z%C=zHL||3{Y4krTk`A|s@&zQ$^CrOxR1wNKjeQeRZ8O~YTnQ(|l7@i2xHdg8t2ey7 zF*S22_wW^qv$M*OUy$a*WYBAKIHAB6Tk)*4C(-En47YD0lx{?VDwdbPtcvJ3v@hv= zVz!=?7G#{Fis|qK@Es>Y3rVNxmQ1NMp~7rTAbg51H{b0aQsB(KWF9~i71gfF7Q5V} zq#{RNoZka|&L5acNuHmWJ|slaxG4vNN%eG_KV{LB$SUOg79rDCxP7lolsACuFF!gZ3jb&Jo20kxfwG zxY}u`A|)m=P;zO9NK4cXWPNZjtW8bS_sCp@!ZuW_PQ}CZtR&Z%m-peo5-<~pvyR6m z2_zi*g4!4DAWt*HcO~`7WIhMx!v@#=gdR#Pq{Rh4EvmKJK{B#`p*EY0Jvo159%-4p zZ9yeDI51VuijApMX9=7cUz}9WgoWwa-g#gb7bzYTCexm+O-|0F0BvI^#|ZFkwDqUd zVuItEnNmADFLoh|N#$H)GAl{KLkV+}o;1qMi8LsCjtJ#l%9IJg$!>m!*f!VGrxqy} zsI0^ek;bS`3d_Hm!a^Ck?j-$7^1BH_C7%gguM)^-Pf7ooz!!`wXkTMT5;m?){kqdTpA3CFpD#wm!q-hBQ8rsKq%x!|}Z-0(ZayF`3yK z0gJ>!`arGDI}KGH?F@0$Fs_RAnaRbeG~N*i99|;$hG{`T9IoqgD?30pn2IZ0u zP0Xdu_s`DGtKtMDrIYe}cyKZ;ADmRudj<)*%v_xz^Lwhur@+I4q$kRJLuUu)(oM-3 zBA%LAR1wS>bNlrqRaH=4b;@X|Qor1RJ4> zHjZY|#!)TWIEvB6Q9ar?nnoKmt%<`m8U0-+&A<*a`_e64m%7dd>H1VsIxrQg;y!MI z1;?*16b>hG<*o84sWCSX5eTQ!>^XrP zO8T1;$u8~|_ADsRH$(CJPG#QrrbibFN^;UWC#Ll@a)QtroS_nNVO?$rCJX0zGMJ^} z#X`TSG?gLu%12~$e?+vWXrGD~XOlQ0o=Ga`8SY`mch(E%^@zj_7w*FfA~uKf3ZPx| zH21q4Dw3mGn3+ugl^vHrGA#*Z1l0vWVoqvGfD!3N3D@eA^#ivM&__-@l*va4isYg! z%Dfzu$%#r(OD?9UG=-L81UphlEUScM8jF|BLLp4@SQ1R~SQ$iCB7yjJR27pvmINV> zr4Taal|Yiml8~58eJW`hW_c}HKPMyJ1Q5Zw1kxmz1d}9}ghY}{7FCif0aTJpft1!t z$ZFJgO@$K#o-4s5$(3Q=x;T9cfETNIC~!9?U2OR>)Mez4Gw=$M-3+`^xMe_G6^gh- zBC^Dogp*7dKr#`QA!H&fgGC}t2Sqk3LuH9DfeZCaSk^Afgk`u(l0;aBQi-q(ktD(Z zLtzMjDiJ0zA!fp|Mk*5~5tIp&rM*%?hts5&1XR*X0y60(%W2X}f{^r*h}vSfAo%5o ztQVa{Q4o<~k~~<7peUwMSFlWr$ugzIWGPK{DNsg)2++Pv!J$lrDJV&WCE#pLcPqqW}>R-KlwG|z&C^IA5$KDv6pfm6W8uKe{DLxUAswJ{lsuB9CTsA3Rl$6Rx=)o={!Rk( z(}M3w-Mn78Fvs_cjr!DVh7d>R8MrVLP9n6JK-onPLYz$D?0#j@heS4nJZT1{-6~M2 zh=fSuQb@!S5)i4Akbr@FvP8or$r24Ib0r$;^3-z-H04Spa$F6*G26n23QiBr6)3m# z5=i#!5>iLob^U0&o*r#ed{h^w+v)_nE)KVoqwW-v*I7d8_yTo)CmF9nRD1x%2e8ex6>3^Yl8Nr`Oei zd2McCaW;jr<8y%t_4D(3?)+TB>TZic;OZ1K6)3i|^=$VlcC!+eTiJSUD+}-i;kW{m zy=+}JBNJE!61}qC=&5I9MqZuGoD6l{RGiSqX*m zTAhMsCzZUo^8S!K!{TrWU^9=f@(3FdGa7&o@2D>v38n2gO<}}_YKO`)NxZtcM$nn+ ziW-&A$^`!`xpPR_GNGdECWO2kArV4G>28IB$w|?53<>c^#R0B__ACC*$)a+Bb8txo zKyi^n!Ut3|x?dI(H>|*kY3?n<1;ET4+BXT{tn!EoOa@9onK=YRGO~h`0BL`ELxuxK zi#*RtlcMe$sIznA*`;i^Q|CMV^QDF+XvC&G=% z1m?lW{DcgX4+!BqERGu_NSm@8NO!UnI5Vf3he-o!%QZV`urM(WPm7&=BiWEG%Dam5 z0H+7I8K{yQi^62j(NUU$((_t^Lz$DIk)>ePCE}pkAuDhpG2RMZoK|eAXD8(xx=HC^ z61m?5N752ZkE9hCs&i-wat=YIcGxUYDIGV-!(~~b3}+oOob@!rSyY8BLx!`C8P2+%;jCvF&U%{RtT$&k>n$>z^)N|sQiijhWjO0vhO>?t&bprA ztfv`HSxO@5ePjWrrGzv%GgYvoQk$xDAWVu2BIsMlpsW=E2NFP@QOfAGCc%XybyG{v zCnZ1}P8O`Du70asbxoc7g|}o6($!&tZWd>mvOo!0UfL~66RIc=3DYv)1;{MK?)1zM z0Xi~N@T}z0ZgE_-r#3sWll1>>^1?OMT%!&+WlwSuA+N0%&JRidB#7*t zkxr6Ib9`ASeZfPAgo^BdF@v)MMu}555mF$L9)c#48;KVOP_`_X%4hU2+&IA-+Ra zQPwT$)LIn}*Twv0v9@<6Ya~vwWjRZ=abP^LEjOt9>9Uxfmvit&6~s;}pfSBy5b_QZ z@ab{6f93$4I?^SJP=X{+iB)@t%rgL}BKX^A+qd6Q#cZd3o7~~4;>7%nDoyQ87xgyE zPwY$5Dz{~u=TO17CX07lYRjoa*&(^a3YyNq^dOakmy!?RTcjkxera;hEXy_J+^<## z?y@+;v7sufBXk9b{HL<9S7+z>96E@n)(TEyg~RFAm!L^WVNz7LoMi%PQoSA`^lvh` zd)iP{eBc?G)|t#SeNqM<%HvJS6R$;7IjJD^Vy$qBteq&w=Wz+4U(Lt;XG zW1eedHDT-~jMId1HOx!`i7;-yaNcDYeO=ANFC8btFNwSI(sM4|xo~(vW>O~V4Zd(G z%-sgZq#&irrxGxFFu1MlU+#Hk*z=mLcszZ+H7>S5e^FJGvy&DD<|q zF*YV3r`2dqbJ`gY2<^}{LbzY&juYK?EG3uu>M$aq}c%OG4JsFq# zS2p#>$v7UZ`PlHVQ7!bY%F|%*>fUJ8N6I@^H9u)34`^7LZFJd3`X~9E2P;}`&zm5q%t(ZCTaq|;y$`=hUYbacJPhaF9p$|PR4xAC@F%h>oF>x)+1 z-#PMXd%cr&byZGj8>@6xD!a}d>ngS{*-EYAT~D%7#i&{ab+AD+t90$!HC9x!vrJm0 zhd$O99lC$Gdu{t!!^f&!Y89gg?ys;SRrXnK6_(uM>{}Im@BW?9-jA0$IPY)ai@CPE zjM!YsNF-@n5$*oinbd>^85r(vMT70i>QeO6kM*7)xM%y(-5>9d${!zK-O&#I|6+97 z!-MTrr^@jI9YR2eE{9e!m1u`grbPHo$D*Nm=_I-g_ZSeno5S2gLqE#)Qf$~`Co^GiZ5RD?FUB6 zM0^$2$P)(Se;()`kX7zmJq)TrT2wew^S%^+~cwMM>Wpdg|I>sc=q+u+wOghF;izgr(Y?-WgGOMC6t|Bn{ zn}=8S<$B}9FOUB1;ZgQbwDOUWEjrmW)G}?dmbAmsu17XsDx27a+)`Lho@A?ui0B$&?Tc*A$GE3`Z&#&A5}J8E!>+b$9Y6Ir_n6gBEs0+HYEQdiThw)Qn0U)HRJe4XOe6f*7&S|G1JVz4?yr5}3-tG?0>md?=(+%Gc zYKDsLo5JxH0b>cFMT}h-Cb!c!XpnQsHFpccyP|hKwkdk%#hy09k1qRKsgn%B@1t)& zCdPfML7ri$P8hj`Jcw!jr`+Xy`M*Qd78@y9!& z4}HG3y>RaZ(H9@z#b%@5K0d-jzJbq-hRZa=Xp#}{#sx5?0oNPZ5I!iB2y=CmD-9~5 zyqvi(w^sd}2{Wrfo&=+C@5iH`e`ff4y&+k5y*I{7i8E9VhSGF(IL z-Cf15F~9T|?HS(5FOJp9?VIE;dJ}Arq5Yh>Tq3ZodP&0_H)8y(|n?1Pn4Mv-S@;c z))T$-#8%S)n`$~OiEwBg+tW5t@riQi$Us4LP1~d1=I1yMtQ--J+lm#mMQSmw-@@CN z4ksoEbKUY@znioKsiFU>j!d`k{zlDEs@EMZ@8Xjg1Rs998bs+;dAPkySrb#r^$ zaEA}id99Yr_4$&O&ZXd>H#ZP(|1RFXhqtf2JVx8ZHbp+UL0ug@gLd|>KUEH!hw!Xc zOl-M%GRYA(FPPU-Jv^DHQOoanWOmx)!_Tsn9UK(%>Ljn&9o_SEi4~$ppLV0ZCwi|Z zN7zgy`9fVO$qFvXVIWUna?jY?snQ_q~wCLgJ(k~2d>cU@C=IKVQj{C>qE*S132L`$@jth0`GwLmuNe*T0u!;7AJ ztuM3;KOdM_M$;mZ>7Q+0B#V4ukLI5&)5v)Vi+thoT%*Jnnt-$OafL1c{2qQ87@)3v&U zi+Q@$+=kU6`|ssYri^Z~X}S3z!y?;Xi5~mXhVxI*@t#anz_Y%LdH@q7n~Vg*A9^Y( z{rR@yavg0()i0K=^Q^>*q|@^(7naGh^P3PW+1en=ZPK#%;Iph0{pFvpZm|MBsauQK z%<`)({IEsleU;w3FO?1^M7BMLv6W8)6a}2o)L(2UuGE|QBtBI{AQ{G5n6!Fxk-Mp)JglK?kN89HukRQ zgI_I=(~*k4dA4aklt-COp%i`Zg_HS)xVO!uJ!{`;TV|(nf@)K6ctUi+i(8^+UhApaWTBfIajKtc zu|(VvlRvhtd!H}0+m;zU^u@mD7cX{FR~)tp?%{tSUa>8*on@x@YYCUf>}dUW`R>4q z9(uggX>*2rH2UC61I13AExfO#YskWN5W6;_&vexD3!7rBEZO5je+xSQnVXgZLr{Ig60!Ii*o8uE9RC^B( zedxgDMG_W1)hAypN1y)6sYF+sYl+6LSd<>yrJYR@R@km1D_uDyS9Dx<{idn7K~#IG z)WHSg89s){akSfXUceXNJ6|=}l8C*$NiKuuQPb#>mxoU|LGOfjyNKrrk{N!pZ2Kba zYPWrph>rgLp_Qpht1IS?GD9 zFN(e~;OgYsO@xrjv}+hX$M-}(`9^;(Vd#*o>HK%hCV3R+v^kXBBxHi*_GDolr@0%> z)(dpQ;5bceb@G9><1{TT@90y}li%zQGq>eX+=-yDiWx|f381Zmj{a(=eKf` zz9W}v0l>ioIDCnuAxEd`W1MShdg`uWYALz#oF=x5&^ zWyeV^8%Z#kwFr!Szm#Fm0vCs}>&pSOwPgz&ZNe00c1C~rosDZ?ViZDV6LSmqza{$m zcP=^gro56;WmWhwR!LRRrSK7+7NKKw(<^IONA#{&))YISich~i`phe9LO}ATkG2}f z&{oPdj2tsvvhp1|#>%nEHSDG~lozcep@B;#Ki7cvz0uoVHT!g}B;9#u^uVkA>wtJu zlOLCie|z-ZSJxMTa&FCs*F+tEyESY&jB-sa=yb_m>w7R#(c?{en#ThsX&*_4H5`fU;7 zw!5~W{_^qhsM{E9WZ~|(`K7yQ( zZR`TjLbK(1ng!sXLHDr|$kE#hdvN#PUFN>Od6h)Wnzi+HMJHp~84Y}I&FRn|SwU>$ z>Y%3$?u(=PgWp@t-WPq~d;P3C`qcL}F(C@80}-$_2^?9su4w7^?RC&C?TUe`WX{^7 z8@}%iUEk~hJZ`{-4@IB-{!sMD%RTL0)r?;KK`Hu=?+-_PPxNf?sy5sR@v2UKugN{u zn}1ds@{(getf7!2y6*2cu*K+Ie?M4k$4JF9Xy4Pj|@;p^wJMT zqIdkbt3-yTQyZUeW?%h5xzCr;8{h?9YxvU-x1x*Iu`{~zhZ{HRcHEw7}-ppztu6S(Q(oaZE$ViMR+%u96J zkJfZ0L1pxbAFcJ4<{r%lx}K8{bV}YIMS4kM7gH{Nwe}@BU#a^P<@wly4;KrZ2T; z<%Od8o`vT*$+~7JH^0=L$c*grJUt!&bM)kac$d6b<1uHK1< zbsANERZz8DK?a3vfBX8z5YCN#!_-DHkP1Vm!aynvR~yOj^ro71@C`WD^39M^WST3g z2z*uR(L^du6Fac9&P~kA`=+f|BF(1cT=a{7+Pn%z;@$0uHvRLaFzv+BnS!@-d_1i2 zEzL9e8YPy8fR9~h*;G=GcN0INumAH}x&Yf2{pO!HXT;bz1zTTyG|9dV=E%2^<-CW_ z=e&YoxufkWdytImi-6t3if1x{Nr;5(iYCY{Jb^-@lk)783X_4)59s zIQS?I=xQqKlNCv+otH7i5>Y4~*fpFZMg+Z&$@^9cZo^g#k3fgWrYL)@O4|^<64l&f&dAbyu2;?>`yl#%X}0-U)M-9u~dGnY4U!6 za}TuCi63aG0Y4D*5O6I)HgFl*Wq^&C@~xPa{J2~qdIV)iFM0~=Je>_t#@uuh9F18HD05X3g90vm}%k7TKTL1OgK zzYca#U(uic>&DPR3JegDz`*hK_%@KHH34vRL+27-lX=CU%lPOOCKoa=RSX}>R$x~H zQ!{jdsmWDfYGHU_I{I*~UaPZ7-^&NImj~G-f%zEjXB4R-e1=v?D;Z_11A`D)I;EE8 z$pcF;bj(qZhY$MtgE~ifuScW1{%sRvXaYP-32azqv5i)gKTW;vD7Sh z5GMv6uA^sZfCeE^o&${ZTm+CLPk0(4gZ;-q_(;pu@^udRxL#=N1AMP1@F9U7_zu=c zYI-_k@7W550!AkJ0q~NSKbsO*1p-xw-P0kP85)EHVu&3CNFd27J3oVh%)|#G_evD@ zh_{4-Kvx18U-QbP0wOyb-S~5pofX~l^N@Wq>UqOupO4OeV?FDQZhm7^x8j{yt%^j< zC*ByjMD=A>A$&H)i;-DlFWs4%;zh@-CIEoX{Tor`SN&1t7fZslTf@L6Xh}`+dSiQ9 zXT$hl>dmT=NwrxuJZ$D`K=x4C6mK%ZSbXF^h<^X;a`eJ4Iworjr&APhb+r7KBUi#ujssLVuEsS7nc(;ui4IPlKQ98n`G1 zu8DvJd>6(y`qnQ;{H)&7Msj^@9%#$NTYi&IboedM-a|fnn%sLxhL*53#k+=W(e1z5 z8fMM)DSLtTfKN9`<*PhhW20l4k>yoYAlXNK)eg5fh#H|17MCf=(bidt@Qx-5P&^0wcX$(+P1GFT8PS*NBU%87Y%QIH&lAuu- zelyzn>n-7@+xHGux`>}+XS1;mCj7c7UK-3gGqi+;X;e+U*3!YuHE;mLLA(pt0S&#v zHmzG99|Xh9HTmAtqW}3dDw2U_ncmDxIblF@!!)$yhH0R9ig&l#+M=2NI~bk-O>ku1 z?_a5Rpu5I0i8IV9HZn5t6R(oMBuy)`7lv+w#XEj-!pjL#`+=zEzXn5W6#!d!Z{JLn z00IqOQ-w&}G%RF~WoqjOfsZNP{KGoIpv?*7VoMJR5qbYt{%e?Ri2nV*Mtaf;+mQ2* z%D>sN7CJ_wYS?0~(G9;jV>Qeak{RM%p68=K{mqutJQ!q8mt?ISoP}e<5;%@FCCAmc zj#gG2nP-5e$|N0s(|&fC&!_N;s@A`YtaeRc5?WqyDhLbYIv^M>@>$Dgn4tlYFRw)D z%V%)V#14=^?Fh{@R6ZlR{I>&btSy@Q?Jz_g6t{e(DZ9tfRhYgH zF3IpwMSb05___@GsHA?zn$R@R5*xm+5$q#tc=_dg8i8X`Z3A4lKv$7Kb5>%D$l6vU z5YZQX_;*fs_5^?YuITT6x0!uA`tRQju1;oZ(&s+9+S=NRZ33dTh>ZUp0#=GxrXy_+ zb2l-F70$Ok1wbZDw3TFwj;r)U+gLVr)6gQc&_w$w?A($Ru&~BP0D>1&OAVVQhP5V! zwWgN85bw@?sXdDRwdY!125~V>qzF>MrfF*8VwyHSg$$Fa-{_tHGZ>~EMf+)rghbQ9 z8OLkhTD+W{cA%w+P1CZp=~$RzGEGa7vspr**QVv^4+;yq>i5I!%h9&qZ|;L3l4v#B z^ZSh#Iojy9tAm~nLhNSRfi@@J&;IDkzdtR6cul;AmU53QY8N~J`x(bYw&$Ndv*zZCBXJRC4x;pbAKWvJ(#8R4EolmX{G`T37qpq(LrPIip-uL0V zS^wpT(@d!8=`?w$FCNkaDPaz{AO13{*a-x_jy73S&53)CS7BIOWGqeMm?lQCrfxe; zc^4r8(0=&H1T9Z&nrJ#nUyih(W}6vQp$D{{rnH{o#WfCC@y8h3ybAiX3iqE9|A?`z z;RiF@l(`M7T1{Vk;{fz*RZRq7^)2o2jDrp~bP)ib(QC==zZ!~vEfjQ z8^pU)SxcM^r|It8`>Lj8;v7sB25c07g*EyhCIld%Woo99EX~0t|87~x5=b_imcFUB zES!La6R=xcurjUl;C4N418Zv8$Xy$`YkM$=IGc)xJJ|Zmu`5U0KUipVEC-o`R>pF4 zX1LLJUN3iOje_LJsY!cb~St7RlK@=Z;Qai#z5tK@zx7; zhx<9(@DRX(3>=8leSd77z(!Bfcx+?h%QiuGC|h(_ysC=}9K0`U;z0lhbi(v)l?_M6 z9KeArZ6HumN=hA23`x=*@!BqSLa2qRwhano+cpB4OSI)-L{cY~rC4MFKpJeMf%ov< zyrm1pOD<`9$3y_-z;Uq#C+*;R@K%i`^|Pg#Cr!|RT+3mcvx{?fHS=n_y7ajy6fU@6 zV#kwlxRebJCJ4=D*`666U&=OzI3-W-+=navRhS7Xx$W!S`Zy6EC*tc9QK#?mu4Sx$ zeQsPWfT87!;=7lz({^Kb0V)crza8Mh1SkmsNP<(ie|x-YIXf?ul@2;)NB6}J`eFw) z-odR3d4;dEuw0G-40CV;LNBX?0J+#svtkZ9ZwH+>iR&k{WfDT|p!;@AZIv7oL_8F4 zvShtE_?U||;223Q9&K{C_-O|YXlm_P7CxSh5}J;M^R|5bG0-d$nV+a^QKhX?Jewk} zq7qBT#=+r)({#{?IJyyW?2|OV>ewDWn0=8+Y#2Tqhbvk2K!Px!TZ{o52RZ5>M;+v- zgKMfs2h{G%@v?5_u1}j|UPiq3p{5b<>1O2;%w8QvF(hlBj(^$1HicRY=2{R^ zyL!OjS~k|f#?eJ}cl9KKYav_kfQ+2tBkl1`J*+=I-pe|04Qx%&T-1FR?lZ*y*vraA zY)A?ExTlW|vwtQA4lH#NCmmnX#|AD-dvQR3TnqzT38CWi0+;A6pH% zG8c8)b@h3;I1da8To>8tY8e#QMS@(=C8{_|Y8=;lSYLcgi4{-9(e*5Vi&+2{cLc7? z0>mFLu}#An64#24dJSpHK&OZm;-8h+PzTK{E|u9PR0C9YvQ*EB$Cd}#c}@KOGFvx_ zW@YD z@uU50)lJ|^Jp=aho&gHr8G4r(*?Z{PJ-Bl!@-kPGVD{7He~kzeXQHdPC(?=W*Z|v9 z#GZMhFur4e`SCXf*h=Qa-yC3TSEkiA*&rG#UNy){eumcqf6vw@f{`}K#hvkyL3aLj zXrb$bhmkVfM7b;ew?Q^?L59+Fz;m@g%+qDvb2W2K;p-joz9F{d8jx$x(|bg@_E4@p z&(RyYSSJ=Neqo4h+0w~(30D{whuKh?+w#(YI6iZjl}EC+C=Mc(6(1aC zgX~)26yoEO< z96-O{ZTi}cL(_+kESkQqG{lTgQ1=5N2E#t?g?&R?C?A!{H*CGm!RK7;(Zd=aYlLR0 zn;sOKygQy;%|_k|RBCSmn(F#?1|mVGPLK$j<8Q2HLnmfUbUvd;rC4Y_UcQD6pOk2^ zkHNEV!Mduu+axwKYuG59F#5Q^CgGZoKeL9pm#0snEA(xB^=xDthP}S66V9jh_V~iJ zjE*ipuERylZW$yVgk!&fC>xmRDV^MwVf3e9=a>G@f0@I!}lBdSHsh4QlKH$4c+o#ou1X z`q}&9e_6-;PN|`l3M;2J*T(}x-`6azuV2@oz49ILnHzb4>|=oJ!^=p7ZyglcdS8$KPlZ*&cO*Qc#gf*MRx7}qcz`+aplV``g*7(TI9TIi z4Xon205jrv)mfzY?}(pX&&0bV*~9`p$__Bf4h$qgd!^3|43O>sjZJ_FI^zBxYl5^Z zzGjrIJQaq-v%)~PJAv-r1L@vBG0N7g&PLEQme%+E@qdo8&0Ps+P70dAoK{fe2mGu)Qe+4^%1*139}hjlug@y?B0&EG||j1*xkkzbE*-pFoZ z?eRA@@{m~*s?-7mu676;4wX{!n;H>+w|SYu-iQeYwlkj=MxtB}qYr-<*0FFlbBUk+1; zy*USPKnn-7a6k(Olv(}w$rITCi{t6-tbbTD7giPa-7#N_b((dwsy6lp0ftpgcMb7* z+t}%+!82McVO6z*d8_L98tBqClL!l4oiG!<@t1v5f zu(g{K(8W5K7KQx}$Gdm1a)^%`pd*HMFlOOJN6SFfG~heLmZ81DX&K;##fM8L+t22k zv93x-a{6--;WYsU1V3)Q9$l?IG0Dg`e>3biGFEZHq zM(R>vVrCUOF{@cxmjh1xvcX(-!+jnr?Z!K97T$5QOxO^MTO7yqailT9yJ{S;9Au`W z_2uC+NEu41=>nM@^6n?+eMmJ`=m1@cxWttK$PO3DL7_HLsL7W<+nP6?94B64b5mm5 ztT!BA)_(r6W0m3+Y^-CfXRJ&7JP~h*GvejnwUQqn3H6b0J`(C9Z9(DQB}^(=k@t0x z{3#U63~-*B338+A~Nkr{~7_KO8o24w7jiWf-hkriV3P6KLX>#*;1^ zUah8Q8Ca{n-xeQt*&wo2zx`xcsA+in$s+%9GuPApu!=||8}dLF-hHz0?vrID0BIw@;&NqqbiR_aQ2a&hf6HV7Lq8!d%x>!YCI zu#+@T`~>e|HMTz}a9q?i|2Ydir5_p=#x#*y6cty~% z;gxI-U{`1o$lUEF=`O!TOVscR6IwdhIr3etlTNiJ>z3%vg#Vx9pTj_VY#o5 zzjY=%V-0lcphKjn>mt$N)hP20yp(G>+Chkg_lGRU#GXw|O^Iu=H;TT+9Ym}!br6=) zv0S|lCx^kOgZ_~u>+Mp*mQ_*}tB4x$3C65L+lX)4#WxuiKCMp>mB2yo>DZp$(APoD zY?E`WwWf&&z9(g!I;Q>@2#~sF6#r-!8(f<{z$rSvspGhO7TX}c=nh4&&kEACyN7r%5iJ8vy8)x~hr z72#$)d=A^hE{n&`VZ&isWq=Z>dpW8HcyHcv4Hp664%w@#TLeC?3D(1f*M=;*yR#c0 zEj)BhoHi%t)Lh>Z5BwCjciQ6<&t)T9vIjw<9+9`jd6S) zJ83v=hJHf)Qb+uc=P_q6Ls?jF$0xmon++V)(>j1W6!kpVYT?msxVUq3F=}*u6fYkq z{T3~EZ@CyYy5bjC^)Q3Jxxp)NSP?qLJ?FELp|l%RC_ca!;@#)7)n|?7V;0gW4-*z1 zT&cA@xI}Ns8#eI^=kpk8w0ZN*8yMJ+b}_*6Fuma!E&@IRz;iNYt6R<9TZiiA!Ob~K z-m!@vyMS5Mv{S2ziwckQT1L#?%GQP{#d>(==^Hx_bNYWH?w7O3tpy=EWVd zLMJ^`}fKR)U+et^;PF_Z6OXzF7opH^;lJbVdT-y!t>qD#O( z`j*xb#G6)lO?>+$Z1CEQ(Y|e93oWqqZB0ac8$`sHm(-KzlAYG8m#|WYL*x9KlNaLL z^m8*GH59*QX!+<1N%n@D%!!X0>EpJ_*G|w+v3wUfiW=#=+Azo`u955FA6?3JoP!Tz zMCoHh>BI3h2e4c6qw((DTnE#}KJpt~sE^4{AHAlpJ53*T&~MT~k$d$~2mQc23n3gQ zz*(Wv`KWY!kh|mOceB;kYGVoW7@!IUsC9Tz#tQVjC|-!+fFJ*MHyb&-U(-72{{pyy zX9c>W4bahw@AT>_0AJ4i7GrU4#N1dfOO;)tR6 zI)4-OsEq+0JOr2&4Nw&WRK);QF+f$Mv^_{%Na8JI!owjk6%wF-3@{ZEpk|VAuWlu5 z+Q;Lp02MUwL+l$hH1M^)aR$6R(qdsyKk+V#g}%>2h{2+Z``n!Or75PU%7&9yk0$HSF4#hv+-+fB6GU7y)MYFbS)W6 z7M)jA;Stzr+VZ1p@r_r~g+FM+o188f(dMgumIySawQT&FnvIuG>?$a$jh|1mtEM)L zPcKL}=z8YZP+L);0&NK1>9g@`SF)XF<5(7UZ;M&03`M0Y3#08SynM|8Kc2pdomdhx zfmbv+V8oxfimi@czlv=QN3sK9v40R9xh6D+w<~SD)?rs&Tn+L}lCG{CSswQ0;at2R zgeu-!CEtS(eY*oM^~k70~Zws{yhGu3q-q z)gV&|vUTr>?>WxJ!zLjb6~inm7Aq`M5Zi#en6~&DmX`uH);I|G2xzNLPGof=$ZDXF z!ZBWhBN+w)CIS`$NP~eiz{L;SfP*}78X$KUe6E6kw+am~P~`FYhBz&#Xiq3K5-g9p z<0r3SqbosF3_E^cjrICKK4)nF;ST*!Ynm+e}~LkC$G@R(Aux zO~Z<>yN*>uAlx*w*BWgT&8P{faNC5te6|U%(%PnWch@#eP-g0Tla!QdSGHK8ZK9N_ z+ZhR9B4BBK!_7b2v~beA;>6rQT>_8OPlR|#Ku)SZ$s&F~GtNopgcP4BT zjj#zXsflAUH}1KP^~L{rJ==N#(x~mnZ4>UviLVKm95X6>|f6U^j`35P1vs?6zfNUpDq-BNsS{ zR?^p&%*0t}(k%yRcl`K~8`;Jl7m>WYCEm4<_4QgF;`vb91pa`!7m(ml4uZr3qLH;A z6t?li-?m^sYFijx*oAw0U)~PePTNMqi61<%iEl=H@Bk~Vu_1kH+Zexc zmm0sehi#5exQX>HS2$j8(@6bAkVX>h6Ge9=TT7UVQ)xr8$%Z|fIG)}Rzj-6;o3i1; zm~F#-FL7+WEthhZ3y&Y+ux;2+**1K!(6-T;QoJfxCbT_#96rA-XsqUw&tgO$*@RZe z#&D6$?uof0J^2W{@pB%BOne4e3D-Vs{8)yK-^U>K{WiYo{cJFPWiRUtx3xN+v>gl` z9momV4n~W#H9om@2ihC%wu51y19vvwE?_+GweceuVug)XTygYGk7FW@>HUm*>Ui(L zcHl0T?Py19wgbrv+ezGY{Cb@k6=-GQILXH^;+^9no2h7q z2ibnxL1X2hv&M7k^KAUAg-!X0?Jc{8(`6gKTOn>^81et`xtxb%pvE|^)?S|*q#eYE za~wK%Ev>cj$k}#0?A!C=Ya49Sr6_JbHt?~}AQcAfe8+YmA4jTxJbt0U4cm6o*-{U> zLb`7zjBn{J2Hxqh#d&Uj+6q?C#T|$XZ*GgrDC?=SauMXp6()^_*bR4RZTujDusd5@ z&4k#yA%9jT9_LS2gxTwK#c>A}SGgWA&h_KjeQaPid`jAOeI!0JF}YFEj<}G|B!Rj$ zzH>iY&!o*=g~xriXT(1{zy`NNdeIiI$1_$eb_oE?C@s9~ISZ6Ei#bfz()-dNE%y?rvU6!Rg$3>L!Q9xsjblsG6Tfsb+Zexo z4J-BgaH4OgzupwDyoGIQ;|<+gm`Q&pZ($eG-#=IIo4kHork1o81I@c=Ke@>jpEfD` zYfLgT4gB#0fdiV!C7(N@^(Z|S9wgX4oWI^$Gy8>tj zCXyx+{4{j@_zYVsAN-pcHrxXb$h~O%e`c7u3ee)ti9MSPcik*AW$6RFv=$mVNlqhM zx%h{(tXjb~uvS6xB1^pOAUmUHL|=^dj`+wywt;4L{2&{|PT&mM4w6qY#;+Y@#_Azm z7|9-`?|;VY=GfpV&=2NR0_}E{9bi&LCE4SdIlN?P^Y6;ZNpSg{_ajKF_W_{lWHmA(l&ywF$|* z;3{r}2l)c++gd14Fgd)w{TfM5aje+ZQMq1h#5#(VV|>$o;{v<&L^X_qxpSwgWgtZ$ zy8gaJwsCdZ0Ja@YRpuAta~9dtMB)EiWM`~fpWb*FlL@v8wM>&Kas3cGnHt}Bh`IFl zl|yWBW!fVJ1@Zqq#P*!$!Z_L;K&NUW#kNi{9ptv3l_ufhgSYZsgaPdxoPcBL58GJh zAb{k+H7KX*ATh8fa%guyBuKeDwR#*`#TH1Ic1y#lx;kktlIA+`k8fqelP(gXeYVA^ zx=4ygQO;R-+{$rCiHDSUIwex8;`N8w$;^w-In1_(rL;5IM0-`t!5`Ofsy;Ft?7UO; zaZWz6+edc$I7_jGi$8Igb%j38Fre(OPE?>16(CW8KE(jZ((*@6H9*3^SHxdA%vP@s zkcf-Ko2hNYUV~l<{rO?G_VoUYtR++dXU~oSTRq2sP|q>cOV(pY*csb>#B1_Sk>Icz zKsdbk{v+%(X|cY4gk8u^i#OiJ{2q8h=I-OE+t?+t-SfAxfpU+|Jo#e~aq%eYkFBF@ zID~0Z#g_Ko z+!RpN3|+hMok<51`QihSSLQn6$`L{XTqQWIbqvTZiB0uMxs^w?FnpaL)CK%$14q6i z8Kw}*0%`z7{*~N-0dfH4-#~#kbb&Xt@W>Ir>(=H2?CI6|qM$zT8NMgp{aIEHMfPB8 z`&k%NI`|%@W1=RQs0k)yQysIa(P~y59dxm2N@yryA1jegK6HOVobXv)0*mAsNFF*t zQ+q+i!Pi6`Q~gSAs34>ccDaseAZZ4YW{OqS`KF~}9DK{vF-;^bIgFO`H<2@RhiS$8hhd+6U~y@$j3blpSK z0@JtRUxaMaKtNlYvt(qV>MVLyg(S4cp)@}l!T7Y>*;OmcnQi64!~?gp_i=-G;=9== zd4q4ho87e%S+ykI`yO@|8;XDS9`@mtqgu@e?qGXDoQVYoG>!$S9Ff5q&hgZO!~+Km z1WW`h1Z)JH!dU>hScPPHNS23W(RpLsdnY@edynhyWJ8@YpgVde+sS(4$M0kj`)kT{ z4)u^P7}BPH;Jxgw?lVEhIRAeCUN*{DJo*Q09~+79`U7@3ZI=6UGpFxoceV5FeOHM- zLoHq$0SQ?WUvL-uI2(+AdKdf9id~tXSrWhZee8WJ)?qNX`j1$p8`#Bn)D*pMj`uc7qkd>rPHIba}wG;mXVJwP^AAz1;E6(Cswk_Fcm$gf87 z6pP+}>0PZW4kn!)2i}8s97y4Dz(T-Az(K%8z(c?f5kdkDrIToQ@ypJRV<24y(q$lB z2GV69U1W8`3_`*n^X)hW(#6Nwp_>u>^t0obNR^3HnMhTVX$vKUWSPh=G{BCDRGCPX zMJZ-o${Y*HvXCq|v*zn>Azc=7%R;g&BnvIQV{SfKRVUt02~S$ z*W~OGMUEwWS~TP=*ab+z0~hB^DGp)Uc4$<&Xg6g49^F-H>nchkw(|XKbmKq@i+%(0 zaS9{4;g4KLmUm5~@u{rP5aMD@G92X>JU1gi zcH$9FI3i3R;=it`oMZ}6-Rvfx)=MVpt-C)$mh_lA+jly6vn1h zVA3T1;0M^?jUUiDh2K>ZAIiQ`tM%#77e_$yE;Q@ob90?8#`&`*e+=|g_jMEnM@LtX*N zAl(FWB);H6uS5>-Y;WT-kUkU$DK4f6i;VRCGV5Ypm9DPz@>rF1$SIM}(ilX3t5+kR zoL7%V8ac4OP)FHKjhvk5SguBYLA;BpBmA5>6<;|lH4vgqRXmTwMCMc6JzrJnmUjVFKeyh%RbCDU)j_2q(}V8BgJay zza=ByF73~^DrH!k{S&WC&P3%jGz2^7B1; z(eUk@*7+29mXr*W-_~ruuP#l9pEMHh`L5Ec&+&A7&rz@kcI9CvJ`m(oI-rls(@F;7 z6<|&ODI&noO1u}`ts!Uw9DnyCY-^=Yd(z1_bmQtrS?P4)Jaa4w{2ZUe13}jETtYIw zbw2V@b|X6&fB&OwZFsDG^Y9(MhydzrY*(f0SO-1mQ5f)>_R--Ea_o8y4+c)?@(p{q=z#pKbDa4xyYY?fXX(jp!O3K%(vUl8cing>}6v3R68 zyW01bSeKB*G|Ch&Lcd?*8;wuV#9WS>9^Q`k#O?T131AAxoDpPL&5RfCRhLQa67MK} z{5)^>yc=nl=7-^ARQ$X_cN2Ns8}s0mhh1s+GSth)<76HXH_$?H4J5CA;`QuO6VlAt zVS%(-wX|ChZswf;(Rva^7boYjrck;3^L}hR#QKIzF`3*G7JYE>p5ttw&8o()AE%Ee zd-xQex*Dy}}jO0o42>xnLVqBP>k_#oeslqJ6B0q$ak zo4ST`0`d}vQDx3iDnl{D+WeE0zo|4KO)`?X@hNs#Barc?2idA?R;Q7Lc*K!@GG&zG z=5)*P03llVIb-37t3!YEAlnj-`Zpsj+#nOeZb2!@!lovqtERtI z!+IGn&*sRkE{XQ(z2uu7Vx@9Z?>>D7>8^*^YQKq_@@@7eB-la<4pzsn@QzR8{b5s~<5lQkMbh!!FoU30}Rp6Gpe z+5T`uV*Grs0ll&RnMc^_;cHrWc=6$bb@A(uaOY3~J0gA#MH}46se*4nrd0ewO21YM z7lnmHZqRDo9DBIW-qs{2;)@Fd+O|Oaj>=H{o=>q0*m(S{PqBee+n9?hiCWL5&}*%U zB^ZquJK3Y87-?v;EsD6&xK8U>##t8tCTD8tM^}a`7<5o*{(xA9BK=5Xx(c+>ABeyE zC_6FC#|`3UWVs1xH)l$GtA+mhR%%<9RRAl9&o||U(Ma@Jd~9M>!hBh;a+9f%^~IN= z>EL9W*iPuplZ`%LC|HXB@zdP7YNBN4VhnMgQxh0l4md7@>4lgVr#!XtlnVGCWQ zt@#S|kdz2=!z+_+h+WB+JnfhCe(9KoX*D$;-ar?*^rhM((fY6S4T>*@G(Ra9C|ZBK z)JZ<~PTE@!_cyg87rHz?_E}cCthvr=!B}#o-AzcRIdb*`BJXVRGd)d~CGcDI66AW} z$e?ilsqs~xW2dtNar8NMN{A^l@zD`XVu)YpS*{^+i45^+l4Tmg)3-0;2YYgeEVMmY z{Dcqgkcfl(#DR=%H3IUaE8^+TvuzXc|BL1RLD85`Bq~|G;dq zkqY?E^v!2kAHBuL>4>*J$<~BZ-1WB$N zTG>s{K`bSH?Wk#mY&Yj>#Sb5?&@sN~_Y_10&901e`?gjB;|PK2i;GXQj{f`(TYP|K zRlMtI-r)47*>F7ewES9Bx4?C9`bwhI121Zc&(X+-m>-|(7V?K8GbV1?uV|0&e1@&MMY9sFujeep$8A<% z8iXw2zESRxwXLo2TNZo@ImaFP~+-E8#9n;Kx0DG247otp6_GYBumeD|Z(7EfRPcCkI}uCt75V z#m9Mip1b!?nQ=P%)N^0`CA+eV%|AEvJ9ZI^A0BAyeeTeIvrjFJPd%Y+__?_g+B)|w z?`~(TSnVtpm$f~2`&8Qpd)UZxJz?9R*ow;7bIbbMD~rr}Zu=ko|5aUUY!yWm_RP%g%+Bs@_qO-Ky`?3$r4WUtmWQP! zDtk%s)k>;@Xf33VTpEzJ2x@tWi&VrI5j1pb1w|!7sG@-Nlpwkg(Fh7f2}lKOP?SbN zjDQ#wom(HV$tIiKIdkTG-}&a7?60M{G1!CU?ex3_w|VhSnh7~Ly^}@@TONqvG%2(Bq-@vC`|#?zC38#z9o?F1cL z7qCgA1`MNdVC!#j#;RP7x`-+~EeC&ZXV>n)(uB4;T^h8+c5DXA96UW=do7~fPl#~v znbq2Y5jb#{))sak zdZ|?S9NVe}-%Wv$H*TJ?r+r%b56j*m0^Ao;0)FeRFYEI=VbD`iPGIigL$O^2IgMP=Swhg-6&pULk1q1 zz_*1IH&0IG12s$kA5h#}$-kxnqwf{=AJ#pCzaU^JKHSJ#c*@M#iH7R> z#8n}tKoew5e3k_huyGmxl5ebhit9>0(^hj2;9b1E1W7Zw$68YCT?*B zkXK^F296tA_`M7^;gvS-QB`!yi+nlAzHanc9pYpdLqNhz$TA;E_S1MKuiT^Tb68*JEvgcwAG@z1NAEM#glY zr>g`>b6gOuWW^ohop_L?*^jD#+2ch>z&2cZvoHzVh)>@tPDT3h;Vq~UwXg$E)QGi7 z(Jf4fYJekne1}e1!1eZM^X63+PJolXVCP{QCjZUwly#4GuIKqcibq$GbhAK z4$orKY4I|^I4}C0=r*%xoY@f)sgApNX1XxMAKO4$}{FAQppiivg*Q_mIA^#@7wy z7^ASb!+6dJHP9|sTy~hlW7{3&XeBp{t-_x7j5PpR_^@w0n5l^Q{&-R908fwoRCZ%0p61{O@FpUw+EGgFnc{ioUY5GQ)s4)?Jd{C^zXSGw&wZ z6_oBxegZi5dCR{Ptt-g}+j+ohFT0n1520uER1z1`NY} zVe=-cOfwiY<6w>dzd=vSFdLbg^66l6Zb-51j5ZyBDY$fu`2@gG&nPr&q1US~G{-|X JzENoA!C%x@oOS>J delta 67288 zc-nNm37A|*buZr4Ju@EdJ^QAmHQHs#?z`V>yo_wi3*HwQgR$jSPtRzq*)-E5O9pdg z63h}HSQm4_Hed&Af&;-eU;$>aS;9+r0Xu&a)))wcyqAP6yhk8^@_2Qs>fZaS+w=T= z*3>z*ojP^uoKvT&Zh!Chd%p9FJzM|!%Y`;p*x6PnJXR_cjIdC6d!bNxxL7DW6%-1) zdHP%4eOs>%n{#v1i-plM3WfP;@#oOgtoXasoKhL}xrIYDk-Bqg)-pw^xzwCnn5xMt z&BkI=B&KGYjfII?y&)?es@0D)X2(@leR^rUA$w{pOgn|qa-lFCP92(`Y}Tg*)R=A7 z4i!c_Ii91B7Dl_$R5#B(-l$WrIUp;;TbQ4$)p_r{`;`P7Y|Pf@#;0Z{1-#IhY#bLA zc+RoL!s682Y$$T-wPtO4Zc^mcr>8_ysx_t@wGb}GVf1-JKZdSCIjH5eCb^)Q?Vh~f~$-ovw ziFGuK#NEQ^ib7$L^QSi15QWop7xAt(Ge6xB<-@}K+(J__WqN*c@u;jiJ2&2tovRe( z*A^Dln8bvw5G2gk78mc7WQb`v^GrDrsxYs2Xl|~#*j%X1i>d(eyoIoF=fYG|(N&+H zRIFD>UVcV#hJdYkX=<-5ga*9^KUe4zQPMXUbUueuP z%+*B;6H_ET7SCLoom;dEqYiJqwlLW^ICm(#qfu{)%%ii%W!CJW=0c+(TC3OUhZ~}U znW@FPNF1&a7kJ)6T1uiWr!_X!6p4w1F3#xL#oCN0HZ71A6&okX-b=F-HhI+@g~IrW z+3C63IPr~>u$UBu;ch4CpOMrM6GgRjRqvBC#q(wx$N2;|=0!t?=a-I)1o1=EINYGA z=Y3B$j?NWELykJMG%?YT{bi!L6@hbkPxEzAqBbsv*sLwehJ{q~jB(=j2&Y}h!sR5- zwOP?6tu z0GgQE_{`L-f=L2tHRiyBoGS{ou(Zf&UTiKMQV6~r#+T+5p!5{$6O+Al9gOZo41u!EzzB1KF1YMHw zjDS!;^CwgW*9P^4sY49~9&Sv}tK`(|{8Ce;6Y;)7!L4PD3!8yfq#S&H+ZZP(8TDh1s6OxYAxM4ap-AIbmn$6jz83Ok3;V;eB zh5RdcvN2mr@@Nr5lFutKAWUJtn38;2a!Ha4blSw>sktQ8lvB!+Q-`LKdQ(T2YST#? z8=T6D%k{5-`Gt_PD$87GOe?wsq$YEZQU_@o%V>lzj!z{u7LPPeBuOZtR7L_Vh4VD! zDL6k)Iq=bd$Aa15h)Vo|{LAR5id&z91VD3K1&I)S)G8u0G8TUj~lz zaU7~GLIJr@xbaV^=g7&0xh3cs2O+@24Q}{!YC?sD&Zg$4Gk|Nk$tA8(0K+A#F)JrU zVdj80bMrac=eWnf6$+F`3c|^QTHSSF42)UsCyfFzSiY0_kO%uOY2 zle@QXauT3$-~4<-GFM?PO@vs%mnmfkV6Mf>NzN0Uq;Oa9)k!-DL^Zh8$W^^M99(DU}L&k}rsne3LFO)_|y`9($2?!=Bw%}&fIL~W@lSjgRxLyf%?i{u?F zN<_%z_JlN$JooUSno0?8d#^OaDLAo+ph^oDeQseq0gsa0r@+MA!c481f{Rm=vvN`f z#3H;itRJok;kii4lGqRs?2%bN(jb9K;l>PRQ~DCf#ysxQ)Mfx!Y-qVsiwXb3ldhbW zy)ZSCgXMzvXld5QktVLZYKao|NORQqk`$TSNju0+wo88$k_QvT@rne&U4;e~AkR;O zmzrru32vV6t`X+8b$m|netT3d4~7YTu`%7KLuIj%R`b9?S`&%1Y$tX#57Y1gOa?@p zs@IwT&D5r50aSKjyKu?Fd6niKDi=vkLDtD4mq0<4f}6>NY!}K)rD~kW6L$$p0zMW# zr>U>XVeVm&;4LapWRY!7;7}mslxSt@bB%?%j^YY=K||0aYlws;DS`}}hCo@!`frl6 z+SCdrrYS*a%_N={he?GjN@d8Q+LSQnm-5u~{Nb8PA6gvGQd259KDl&U*cP7VR;Q5_ zqAin3PAyCwcT{?MYBt659Y9t-*>5S3wvj5iSf5K$bKD`HT0A&q`7WYDj$7noswYUX zK}~>T3rUh|TTV&}%}yO_OlQFHJ8KIK1>Pxz?NSvhQt5i?act&5VyiZjZcFUwW)*S4 zw28pH0#fgPvxv+b5$Ov_oEJ@k6{tLviyISDa@l6M%lIOk7E>Am_NvR_^>7c<<%R4C1e1eGr@fqCW8acClGoNs}X zR8#sXDw%dq0N-&U)Jz&pw`6Kb6DrL51j1+dbWcq;jwx_%A{hq|MM<@*GQ}=8Nh!~f zCl?Pwn~R5MQj!;^W{*kL7N!v2)+f0cP2BR%swCI-qQKRhAAH9_Do=s)+-NVHPyj`5 zQrAeqoTQ{G$<9^Tal3JSLoRF^46|^6bevU{sMQlca<7%g& zk`yP&K*^;mM2w|&IBSE0VQprreozKp6tt&f-KD(-<8y-lkps03>$pyC-hKYAx$>@G^yt53X+k@W^F#{dwTK2BGNK_S5pN! zI51Psl8u>k%@Q~_zBH}sgoWAKp+#U97b)%(Cc~buO;69I0BvI^5DV~KwDqUZXM*D^ zGo^NZQS3sNlFWt1be58YhZ5#0Jt>qM6Rn`E9udl$lpzy>limCkV%uC#Yb{aON@Qw!Ei`|H+(PNPZcU=!6huxCDjH5;uL^ozG$ZY20$)C^pozxb#BCf-{lA6=Dz9jm zRteXjGSHS{7N^3**Bb_XJ)A~z2|Aa$tm)Zv*>B`3HF794*?p>RC$ zD-X*PiN?ahtQgr53G=l9P~s>a5v$xv1w_L2T2k~lS$_hqK_EPko)i$sp`^V7BG|>v z!ojApe6J(_{Vb*4Z%mJC6qLlI&zhRm!^jCjE3jV$;=;Pz5KI>?xj;Izlsr$YZ%Q4= zkT=RI(z`z)%9FQG$@8*7oDg-A464H|%=lUL!X;}(V1^6#aRm{Z!$k$qE_#;RT@I}x zL)Dy{PXHAimq0Qs31tM;1wmp=YDj<);YJD9>eKbZM+n$NMm&_kM+u7HqD;!T9HhyJ zN>B?frl>T8mSO}uQbE#J8g=nZ&Uq2yrZhkUp;j zk~o%x#9-<(NzpKiYsvft>G39jaLy%=2Dv1d1i2(6f?P7Gf?Nrpf?NuuuvS7=qrPt@ zoFZ^Yf=Q4o!@PWH_6UGisc|UqT28vy@@1&&$R20l4J5l6c%v}OfH)8ezeFOkz?g)S zNEkpe5SAfiAS{DLAWR2EG%G`8fiQs!^+;G&E{lX^xT}*uScX!8unds|!T>{V2!JXO zCNUvK!m>gt5+)H836rTqa)ItlgI*F)K`#l&pqEUiK`#kH&`Tm}OJP&+t6xOD=q!qy zhzyg&!BPZyF^#%{Wmrt6DJ&*aX|PLy(j!EG_GJnVWhhKRNhmA<=WD`hC!mUqNsv5R zm7Gyx`Et2PW$cN=J{K}_5D`Jv7vQjv@X^O$nuN3HSq3NRxuqr+mGLi`ruY{mu~-tU zsSBOWwRAY6(rKVZf?1#jVHKy*P%=(~C=sVYgs`WGNEYpRq<^wN4HiiQHHcJk8V#lN z>Un9LMgoaIpO=Mb)Sw&9!*h#GrPx9`K;0OL?Xvk=T~K0_)x*=p}7L(mR96Lh@ozC=K6wb(x0JXTz-)f?tNWg$S`x?Zdb= zxLmm`7Yo!89RtSv5~Svm%$8pg!g+c$$Bgz?X;P3QYF0b+P^A zklONPh(xL-G_6=6A+bkGp_CcPMwVME1>!E4Frlv3ht)Q;p5KPn^V`t6whgVfZbKDn z;TTm?P_iji5Fb#uB)OjKQDqXkOvagPL}hYrK6O;~CznI&+7`90Z&B;o7PX#iQJ2E$ zW>R*sq2wgnuGVwg)jI4}>$%;kgs&CLsfXxLVIB^iSt#6a?d6m*vi+=tLU~(FLG#l} zUe1x%bL1Hohi!n(Ji^K&Y(&gy09M{xZ=MLH?if`Vv7y?lqD&I6uGSG$RTmT~-Iob| zpWHd5Y zP>SEYc9ldT;euz%6~Z|lye4% zD>f=AMeC5dY$KBksdc^QfDS`;sqbY(@}(z z(^0_99XM`i@NpACbwrGq8I1;Ux{9#OjmqV|5YXA-szlbNr{$3;2OH^$aAP`wxihjj zCEetP5WeH$xIu!nDa(O$Crg2I3#xdS6ri$vWhVuiQ{zxu?BpBChU_)+2InHc=>cvA zs^G?Jgvwr^qcjDj=d}cfGA2VkOTnCzh@)zUtiWcXycN7OtJpM`os@Iv4z&go&;1TK zl9ph4B(19|84F3S`}IO`DMtfvvqdKTfVXA#bN7U2xjLL$Oh zhX`jKBAj)MaMtw*XFZE>*3$@Qy*0vFUnas?50ellML6qOgtM+iIO`bUtm_fZdK%%B zsl=0>Aq_YyCFGTynabHwp-q)K945)8aQd1Vl$9dja019PO6k2WNU)iNZWhw>NeK{# zlL=c;_v6*BdO@B0g-5cAbpM&4o5WeBOi)0UrXiQ}q+wfU*DX#L+T?>tjZT^(@Bq&VPI=|or8MYEHV(t36V%c0}hQL2Py#3&}| z{w}k0IF+s^Ou1seKw-R1xOlK*~$dyYDLnXv_$jZyQTb){~ zR{L5xiv$oF_a9>YOWmJhQEx%zWUO%+!;AkVo}N}XWU zvtu}!#4`+0Bimjq5;(gwJ)H=EKu~A(+T7A?ikd!{1nk7Q-N7W5A)!$ojaYc*Yn5oDJB!EdhUQeMIfc+JJvoYg$ul#!IFdV^0~3Ujl;F)2u) z@|gsT-XGjm{7L-rk#inBYP&g;{Kc2E20nHe=)l(`k(jzl2A?-rQ??odW3;x;M6zbU8A*C*FLi zM^z3DpQP-{SXRIcVD=z zHIEPBOpdK6tm@cs#K<@rTjzt=T^h|bzz4Jy=;#ngKAN4-muhvV!N;?sm4<*5SS&I& zMi5Uw82#ei8}_biDQNQH^|fMojlL*&&n|XzRDVwp@ItJZs z53MWDIFk=;UG&xWjCT8!TjaTEUi7EW_T519|9Gk1&N@3Q=M={(ot4VI{bQZwQpZjz zV^w+mQb}a*+c#F0Y_K>fYfD=Mw$e#>#R!X&+!Y;tVDH-g(uKn(tDQ;`qK`aKVe5EC zZyRUp+UVC0oHe*cYd|*4Cv7nb9^BZsil(EI(Q5M^S4PthUa*cR8cld=+tH>62Zs5` z%gd2tyObUMuLrxM@PYPToAaPM*K4%tp^@m{ALwi2ZQLH6`+>ny)v5AY{YA%!W*-`0 zCjHySxm1phKGYl9H1g4v<#Gk)-?2TI8;3WwidGNM@3=%_v9p|EJTYB*DW6KEtt%v# ztu>`0M{-msalEy6s!1E>lUAwXoViuezut-~rcAY>$aYP@$q8^Rsw?SCO7S7DOi1sM zjX5M0$!MaN-a9zy`XK7A2P7xW_@WurnQSI#EyioU?f*G4uNwX6Q$5lA``V+eAL=^0 z>hS@rZjnyU(q&fZFE85ncyFodIg#;LPxQ0*4PMyI`>w(?dV)l%xUwSK6J&Y;@uUUK z3%@nG^!*zzTd_=@;C3t8EDSrP(cw0~v%+d@?Adag%CHKUv-^V^_`@8 zC)Rc>;;~|$?=ClX-y;qUR(&DrEiJ_CH0!z0AoW`-9qMJBipT9^or=XlmF6U0F(8R! z$@B&Wb<$BK^|m&8$HV>MDt%%DE;1`LX%8F}HHmUXAq|Ccqfo7469j}xtP|lP>yZo2 zd)2Z7;iI|7BkQs5V%6p%(mPlc3N^ONW92j9lh(%wuP&68Me?6QXnOvhHYnDHw?MxQ~_DX z%~q?zc&(UfCN%~bFgY`8(gL&!qccBn)-7Eco5(1w(V8-)zCescLa1TvmRb(A|HTh% z>Cp)@iInKK9~fm1Mk5~_8Ct33l8I6DM7Mr$`!#|j%g%RaIcc#3I3!PH@Q*^zjpEMNF2uPk+V(eR?`V||09!D-^LD5twSI{4>(SFFipIQiN4 zI0a*AAwj>#d+KfNK6>(r-a&&jd6(WO7s59RcKqSb+e!I`hF`TaV{VWpAJkVJNe!2< zGGHvRb`fJ2hOb>l(;KAPSLj8_>ZelJ&h`56rP19V-WI+1!S13TkhW>3HTrLoe}UlN zxdyp|tMsu1t;`IpR+Q9kq>)?aDR847J<}8Y>ErFa%VhdQOwkCU`=0AQ2=(!8r9>n}z_U8kGm3Tq3}tV%ti6|(c@!ITPFM@bE+p}d@! zm|oQf8z2h>tr$0xc&__S-OspO^v#eC*Q|wURKX6LhS8GGhu5KFto(qDye2bgv2)k? zBUkJ=Lz^#?=6*w|*ng6xGDC{^Zcg1$p0lO_>c2x^%)I?HO{*2v%4|~GgEwx;RlJYCZa@?+%$G`Tbng)K_fB)z{5*M~`aiXOeXMcXAE!v}ChGI<2_l-72Z zJIDOq&z7=M4sGe6Udgn$O8Z1_(eg;LhfIqTzp0g`fRta26ST^U3WrxNRmkA;VirMN*Sl5u&h^Q0RJc@Z7qb ze6sKAKuCwyBp*V^iSOdX*S<1F`>CQ*K;-$X)?~@6!Y11ExV7Yp|H*b?z)a8L?C&jl zwh#%vPq^<{-mxbnq}>yoy636BsOJ;iMK2&^n_oE97Jcz4SJw9pLPnL3x7qq)_pO{$ zW^(h8QwTmuM{ji3$A`~toeJO2YjM+8iwaO2^V;b7j}H(vWizPaL$$)c8(gl<(QKL0GtXBf=Ui&5WEes8j%Rz@t-`4R7JcCpRaTFF z`H7*Z?ZaKYR+a2Q!h4G*qC2X5lAMR`_NrJcSAKHmw$<32RduDu2^bMSc+V%d3O6>x z^XA?XZRV!yA3xbYtT$q)Z7!McsPgniwlccl>HfafEuCcu-@a%W@e2>Jo;@6q4lpaz z!gx|pi_~{$R`b@#B8{xgv_%?uO|FpDTF-7pIe8^*(Slr=PD}K&Pjy~K>tTi7q2EG6 zkh57F6J$1x^y@nWGao%Y(4(12%MyFOZ=BwCYmPcnuAMoQoA21l+h)sZAQ>nCENH zXozYgzUSkNYyHm+b>)lM(S4ulJrp>3N8JkC);7Hsz6LE?-wIU3EZdFnvHolH?B|T| zV~Kobn?##5uFi8i34S2TOiCqfR;?C{-GXtnnP?}JOYB^4SC=yuHrb<&=&8@|W_QsN z4DH0ThB8Jgb%s=z8p>)dWhaIrLpk|L<*2}P9ZSq!H2;NFT<*HJ(B8BojhNep2xMj; z=Xfc4;tO_%w5QSczu-lSU+N~O?8V-aZ8~DZbnUb4tQ6h!?2eumJz<;C{FnNMIL*sV zkyYi2hC84Jv94%aeCy6zwXEpqmwE>+dl@BWTh6KH$dBYD$Z_R=#MQE^BWz_9*vhDTE>ZJoja;ULBzi&->z8QSrI%0Xt~nIOpyuZrnvtuAob{ zW1M=fx9k{Tc=SCMl+I8y7?L=GArDpq>Lp`}JciQ+L(M-SXwyYrA4JfOf-0#;=tAn<;T*TA% zq8B(f|MkmNwmMq>m2FY|rLL0g32sMIUl~3pCt19s<66jBaNKW|aG$ue&Ns}=+;X>{ zPkQvzuZ%=5ewz2fT|wfL?+VHAg#%pVg?{)p1^cy?t+N?JuaxvH=m#0x3&@ z;68`Ayhhz$9f>abY7Y|wDF(#mVi3@jcVEdVDvj|ylOW0|oZ1{kU-j6@=xbj+w?{K9 zPE~mE!~bndxI)LfV!Yr3I90C|C5@1V3i7Uv!!^MhlE6YW8>5h~4*fX9A+?dOZh&2N zh}}6V3@aa-brK~47$;}19m7TI8}0q;VgB!Be?7|Xi;n#D&QLSV4!L@Ibu(|g9dh*A zbc~aWA2_C)^Vb~m@^bBvt9q`E3i1tE6!%Y}HNaFlRO^Ud{WsfKd-VFh*%s>3?U3KJ zQg6srO<%+@OyRti?)*I6R^Ib;`0y9I@(+a|M7-UW$A-cM{_GEiCZ;5^2&i zzA+kpbh&kzIGCHXxA4Hl z(NDf{_2suLL$XUgXIqI?(zWQ4%L%o`wT)!1Tyj2FL^IEC;F{-8p5IXJfP$P|ZPBNm z-w$9$J8K!=X8TguSRp<74Mo;zy3U|y!1c3Lm9EmErv zQqtNK4}js2g(yZpe_?YOi01}icuTbD?{?CO%?_6|JLa}*R%mHH6or4+zXpm~;*d7v ze~rx5aIO4y(zUF-SLj+T8#>o=T2W#Xli&WjWCgU4#2F>m68o&^qW@3q^v)*Tab+u~ zq<@-o#9Ui=#wFLLgDLte&!V{3_oEm4qT-9gk@Z+twD-jk;i9>=I4~)?+%128AbQh_ z!+Tqsbj;;ClILaLc=61EW%7jT==x@#ue%wpleciL6Xc`oqzvby+rByIoRPyDtwjwu zt#wJHRz~mr=F6N`l7x!Qrdz0207~hGD=(il>pj$ zVMlK&)hH5-p8oqw!d7MOl4}g*bk*yU>V+=91n$13<6PrS(LsDSGR- z)(^h7l`7J=tDzME&2kHvvt7zDP-9c0^O(_Sogo zBi|kvJf55d)_IA_Nf}l3swCUJMRon)ci$d~qG!8$y=u$O)r;==eBY2)_42Dw9BrKu zEq!Op&c$UW+B2%TeYA;M4%8X_pS@me`cQ>r*0HjYf=@gK! z$FoURmRcC;nZirY$*gA@WWl@mUvY^`HE5dAJHFdTSFAdsFMPL;HbK!peb`&)A-dY)~y)FThJ6g~0%Eicav7jKq%wvRxd&6O?g2QpQS zkL2EH(?9gzoETb9?6Ha|WaM@oo+IreS4IgUzg6)ZI3QP ze7gju&H?5;J-VE{x=LQtaw-Iv!g(w1k?|{)_COI~#MLY&Y;`q>Y*o~?J|3vWItyLa z5%?+)=A=8NS4-H08N%D2zJnZhv<2%snrG-c$P{tcD60I^AbTPT{>jW{z}08eh3J{@ z;*65t3EXgD75c6gJNI49Lis|G;u5SBLPA&dQdR8D)BHl;GqnypOV8CMg|ulpJ`bmv zbh@Y)-SE?aA}dC-Kizyb(BPxs`+A=wy|kjDzxnAlloB5q;rj>#8kHRSK#mQB)in`b z_V)vwf*>9Bt0atb6*ziXU06|P`T+_np8p1g;V(vi_0K!lBhkrDpn{}1_zN{{*YRnqFgbC7zP}HY&I}b~>Y2y} zQkpPsQ)h#zO6Myx8?AWMGy~v8Abnz!IVs zUGp!)ZdL8#sq>L6 zU#gw1HraZ%+(HiN>kYkMQk(Bf39JHvq|k*g)zu~o;?*ad@^b952>r{onytZRK$5s<^h@2ELeFyL7D%< z0SlY6HL45;^GL#?M}9dJ0-**H!<#+PLQF;EATgp~dkPuY0%|S}S{gZ~l>c2R>|m=p z2T8M+qT7Bo;<2OzZ|vR6^UA7f-IC@mMNj=|Cyvx|^fG#PQd?)Bh+pQ6H%Di#tGI~$ z_LQ8_u?o;bAzN~WRwqS;|2+5agSVJk3l{Lvwl#umM+aSvKHJjX(ZNf;WqCR9s(L{bP0xfDJw?xO3R}Pg5rK$4@V|D3 zK#_+O2{oMM@vQf^ih@`m+lNQ)m)BzO~xEkq!K9%54n^oyg4=LzMiasTGE4U&V{!MiK zZ+5W9qq}}H3~N_BO)CKi`cJ$%D5Zd{7j$$m^Px@gP%Q&Ariq7uF!x;ho;t*q)r`2^bZCYqa@6?y)tlW;q{pmkLpBZQ)r2J} zUK_xWOe!YoAh<60IH6^7<&o8qlodseSE+u2`5oBwN&tDkfJYxvAG z6ZTl9aK$n}X^trTufeb*#d=u8M*t+3)YIRo_#aww)6j-#qGA=gFKx}p-U4$VbP#g& zHayHjicET3f01^SQ4#nm7Q!)`8Z%8Z>DCgE-Y@D)Q`eW&<_F`=YgkWcTG*KuZZJ*D z#ym&Q1EXeII7Ulb046%GME|qd`^0@?(Wn0~ye_S23l2v={lnImxmZaPUDHM$+M0PH zhCF!xP3+u0oGZst)ZPC)>+RMn&=V@f2^VaZ>FS(-n5${JE{xViYB-@!x2PZS@F^|t zVK1;VkGB-rfSD9Rp79Po+ZwCpcp^Fu(_s3rF*8v=m_E|&qj>P{-n3j70a6|y zYr zeNIf@Y73Tbytj>Q3N2_|Iz9;ilW7^+4oti!0#IyC^+(yJm7Kj)1fVHo@lc2*=E%Y| zC?5W#0I&7uEs|ncninNr_oPF>t%7B_m;>g~O3ztBg6w53LUSxkt7U6Wu4QANHdtuO z#y)Ki0dTcRO?;4KDSo(}b&c!XaX@M;^f@eebuCoO8C=Bt0CT$BXzvbzI>1FfFHK~VV(6?$dD{oBBg;kfnJ{sJlSw52E zJ9ue7;exgc!+(h5GuYYeP4QRH zU^_2LnzO6GIq@bXquZ`}m({nHE!((y?IdC!$}FV7*5ufhLHldVOo2#}ZegjFxx7ZSovL02dF7YG#s@QrJ zh^7;u&yoT|_r@_mdpYQmJG$TP=-Pm`#UIfoLP)M-VsmgHXgc6)hXQu=_CUNGR2>eg z4)N#%YFW$N{5Ks7*0W=o(6BW6I}!-Yv7@`$Bqg7Z!?kQU1c%#>R@T*%z-_$2Q)gT5>?l9S4@Kc!mL8I4(4ypr3_YbJ=TD-H&;5q?EqF{U2uBVHI2g}p( za2$GEz|s8!a)0hBU35n2cFxH?6-L{^`0QbJ#)RYJe4^TLe3TSjhd92igGiRIQ^E;3 z5I@(&`a=i(eFy!0N4xYup!j}3o6t)H>)i!9Q&49)s7>6$1B0w|*YHWdvr;a{ALwEm z*yo6r-Dc9WIAzV+a;ugO!VYRfHyhZI)x&;Juh2g4%J|xDHaLoB%%*GTO^bU9aoo*z zvDd}Vb+ZlEs|*Zoy86+Ri|&PMf(CTa*Km`)dc38FZKk`nAC4=-tUo@|!`6j*i|F^e z7PhGG$X)a*T+72+zFrWS!5jQTI^f6r9&>BE5!?i(ax;D~>9*2v&2Up+G zyS7drDVg|qFE>~JN_-y(9c^1A9t=QnN1ryw)YchCHm$8bSJysN^7UfS@iTp_ycrqoA)}MXLEO>LwylE(c@VV4KO0ITEaK`uE5@(mmFx_OJn@ky=tB^p_luTSq-rAmQ9s*sHVP=l1zcSB zZjkg6j}EX=_U(B80NcvmA~a8Ya)7n(PKx4ZVK|`8wkH;R{ILNxvL-Fhi@!p)^NRtt zZY$O{fPd zGQVu;css5Pv5hcyG^fV}32|+R_1=Uz+5wZNyYC)u#>K7lHpm09CR_DZQZxhcmxq|q zF6Z#~Lu_c3DowAuslZ4Ln#aJHhyJ&xuK~|>Fi)q^MP74y-z4dHaF~@%ZR6y5dZQjT zn(V*h;t1Qi_j*uV@Hsxy)3?^*o;8cF8(~A2Ay)4Py>8FfiN_V>)ECWZ4>0{ zYr;pj+ef$CuYz0U>rpjv`58cire1WoX#;ET!5r0Fe9ZjNAJ;93 zW+;1D+{C(WhX!z~?PGY&hp&&BzP{7OZya(!XlD6TMZ|~?#J}If_Yoj(u4eyz)B(PB z#m)3l2lyB%_u-qwrjL7YT3rv&QXb2k-*PDqH?xkbwCl*GkB4{q^<&dV`>0<&Hr3_h z_=yVZ>()h-Llf~&D$Fm@WNzNf`h3jQrwfgvkH(SGZ;NL)vk};<`T_DOK=O2d*+)a^ z2PhMPPAx{^c=Fq&h2fKx&T?n9!Yb9H?OX%K1EXwh_(uslS67%)j1<=hv=*MDhmu-&x2*8UmG^@+OQeu zIw-)aW;7x9qNH7x?ZWk|!)AcGNxwO4;>}?*kZ!+n_B1-KPjpO$B;DAV4)0 z=-zq|uh_v68>vYUehp~xNn;Z61pJ)s-OUG z6$Gx0Iq9I{v$nG{aDp%f5V-o7P&?6byirK(M1UuGfrlhufFQv0gFrtr2s}>*^^PeF zAUN3{=srv!cmA=tgKa;EGle^QyeMl1sI2gotT>yyetCwIBU6eW*}+E6NPL#(cCfx( zK!|?pDnM-&1b*DNlRddysx5kPviN85&v&trk+cN3?v}VAT8xd|tbdQISM;$| z02Eo|A8|40HLNNG?5rwy6IRv2UXr&`@$LK8O!3=pUKXPRX%doN6x}JwyLm>t*Vd0!h2qbuiDEt^d|@tS`4iCPxrF* zLup;`7f4KBiod*?_qeR5WK^s1y0h5EP&Q@2cl0a+?#_sBR=l}%QK>lAS!v4- zqAUZxE@l~UXlLQIL(2fuZ5f7#0QGV~0`UeWwQeXzZ{cM^3ojE|hTJ2(>ulC{CC0)m zL%R!O8K$R$z)}6~pha{q#OB#-ONhN%I2;JWTZV;Wvv6!ycE!pvESw0taO!E64K%$6 zW*M-^Z{(1Pm23pCR|u_HhK=)PW3Rl*r^LjE20Wm#=<87!%(V;$N8w--;=@JD$bpM; z;DYoUE)GH2>GKtY19EXdaNo}|TpSRc*2UkfvPPKZds=<~HF-v~j5zr?vA7@&ABpgh z3qEpzr{8+>a%>2&TYW#8=(nb%dkvbiQ;Zr24L5Go?e$U)|MTGT6h7?G9ie~0rx_Hc(GS4OAXw)weU)r zxGOUgKVh+fFni}=nJD!p+BVbHDkCX2j!TO!TXzqEjoGSksr8zD_<|1G7vYWe1Im=_5aa!YLNN!(qL< zP=EsDI@}2%o%rtfpB=V^-4L&G+0eeEA-v4R0q7jBa#UvGDg0EF0IPje9K{{XQEPsEtmb4QHrAs(h(B?{(SQ`2Lr%?gLq- z_?3%J`n87ygPm&+PdEsYW}{6aL$Ff}vIkv2TQ1x973cD4$&hlcPM*tIqKOyY-V)-! zV>vTt!#!vYV0RXB5tp)!#td$FtsqE}^ZRo((IEr2SLo{l>JnFi#}3f|+Gqf6G=O-a z%d+L#jo)`38ywD%IC5UPDwx?J7j66tUiMm`4R?LEgFQLe6MBa>dWS^9Sz>S%+r{y? z*sxfi@!jXMq2YAWT~Gj|clJoh)?&Xr13Z7*v#^SdIS%HynB!p%XjAeKTBM>9moH%5 zw;NDLdyBzA?AFI_eeBlPdcvXd^vmLj3)q$$pw$3Jrp1Xlh$}U~;b?JU62%Y1pTB@@ zVte9;$5>yx__2rhw->PL23XP#+`_adR9B7nkFoRNCYa?InjUuy7>r|JbTKv% zD2}@|b)zZ)U?>g*OD)Gl3UTq0fR4mnlY9qbIk;XOT(1tUR|nUtgX`5nL#sYQo&ZRV zh1A&e>#1B$ddKL2xsnumqt3Ic@kjQtq4RKz=#`3lRKOXBenM4<9JCaldm$TKmy}4N zNAnz6fvUXK;nu2;UC6c+i^ceFFJxO;MNE5#412`uE@FdMr-a~YaXjP#t`-MZi-Vgi zvfjgD8sfVzVm)o*3ihds*l4#dgM8*TCbJd59>Bqng@fYm1V~zd)C53)TR3$CE8Wpq zu9Ulrl}hzGI`@!2b0w~bkK~vW*Dq#X4@SFrF`AnAQx~&s?CSWXi`no<(v^#G4Dk(8 z7FYJO{!a0>p8N!3KkH@d<45?POHCMK&Rc7R1pAsV21-sU;JqBnMHzJ=&TqN6Zz4x(B-4;bIaeP(Sz%20m~Qgn zj(%BGi}AXS6+dtZTW_a>M_15wv`%2L(~fB<{4YC0l2ywL_yXE@GKwaCbt20TSt=GfJ^>KXKrCjk8VNb@! zxN#Xw+}F)|`oJ6B*}e zXM&c8PNP?aL3`Slf;cFaQ19hz+Xb7J+W~vs+xx*(|Dd zoMdg4v2 zxFWsO#>BT@$$H}-U&p#b&&Mt>Sm*iJ1xD`lyF8YM&X|Xhbx(T+Yk3%37vE822a+Z^ zFr+vjIIDyVUe8z_S~C1_qUB-G#0$Lmnyc7=yyuft<~`pU-*FY&HAIU=|MsCJKWP}h za1|TcnaLk918CyQTcM?y-*mNh%H(6P&qv3N_*iKjn{VngpgHr=dGqz~x)0{8$HLn; z;^%-i#!p|(Hg_3_CDj^#?`k$OoZ&$JXgW8=8?Ir4;7t0swtQS$KCUgiQ)BtI)+$ow zP#2G0!#0Ongv7@v241hReB2ZH4t9wq%}0|)vZrxcXht8`r@tO!4FgRuBL z*R#E4So*Xg*T(}lu*w=F%#NQtL0)M97p}z1w?TbPbP6;`K!AH+vdKd&QyXaCF%Z8a zHPE`!=!QU;b?s~1$Oeg%L8@bYE6albS*Ayi0)6)w;Jz*hcDi~d4o!Zr^*T0IF0;1y z=Lgs+=EV2h#4hP09AiHz6zpnM#F|*8(i#8rO>AqZnzr#E->yP%$*#f^K)b5lKNNwh zEv32`U!}8SEa9kKg%>||72F8BYGB(n0~^(OJJk!A} zAKT&$yGf3fICQGvxOod3U4vcQ@h@gsf7yT_AV-?<*KXlc;2;i%F7syTr}G5C;jDHf_VjA$YP>rD zWgD7RvkmPYm2G%9Qtf_*cqObWYKa9&Cb3A|-L^0*11=p0pbPQ&(agBvFKyeTV+LFL zGc^a##t)U)ByrNpt*myojb(LE^_lPv+BRVaWt)bBIbQtvTUm7zR@MA9@dSEve9LXg zX_akSSlGgTv^Pe!X?Z#rKv6s4Aq^s1nWl}6qcSw@n{X7U4NbVIWScg2<0NvIb|VB& zJQq#QW7-e0&CWI`MXoX}ZqvmcJ!HF70P)g6w&z@Zlo0%~)u%ZWEq=ZMKIHgc4l+Xq zD>mHD26sV2KF+z14N+VmzKv8|njdH@$AqnhZEAMj#uHi&=raZ(W7`an0Ei>dth_U!N(I`agMSx$DoS9V{3-qngQ1e#No>}eU2oWez=E; zBPIcY!6o?(;-N#VLX+(-Ba--$3)?~!Yl%~mCl0Y*X2(A`#J0Ba(QJ)>HO+duEtCV= ztyJR|X2_3(sF5x975xbih@eZJl>rVO=hedbv2cFu!l|z0OK>9QDXjUbj-6wL>k8s1 z$;zK!kSem_=WJ~oO(ZSK9m_;fc!n8YG|sj&H@bEwGU8OhU&U_>*!b}Pn+$-pd;mL!Y9r#|CO@VW7C(pLQ65A%%>HiRA{EuFKMpC1qF zctQN?DYgwaRF01Yf>vE3TmT1col7^spPynI*lw{@imnkGN7#T5R}pL%Jtr3@+eL-v zikYWY*1Pa5gyUfrT}!mT7U#sZ<8|X~V3P|sxovztE!O|;_@z78ATyJv11kPPWBAIKujS$lsvv z5~~b~9}=~_AzaL`JqQ@uGV-oE^^j4dmik+)q6atUZ4d4`iPQbca^v!B<3gz8=;s3I zcGttrw1+xdgwMsm*WvqAt`Xz!A7O)CxT&D@b{ccvI&E=qY30-2zZGM_wg(ToY%hEH z{HhstCfgX_JHs~bhH3QSHIUpvcsFUInyOla}7ZlHXWX+O~z@!!s}t>qDIms;wG*&OSqS4$&vY@76rFPvkh zOdXqJSIE?tQrv&=a@*7XdE0%h`(9t#zW9>)q|KRmW@ZmpZ9loUAOGb%8}bHqqJ-x0 z;p-Z<4~GpLNRHosKhFkb`~64RHZv^{(6`~TCX+3O{@WoOG~(Nivh}+W1*^f=ek+MI z?JMJt9c2}^DSrMa8}9C+fE#6`4tV_gqihp*&(~XG8k`bvaQtpRZV8n-#_AiSENPapU<*^_*+f3XJd-fzT#j9(g%yTEV1*uhIOWM z=~`G~TYM-DCth}dJ3e?1Mu5CC^^GNF3=g-;mwN3LuRq2H{j`#YZKK@^JZw9Cs6Klv zyOCuF5Plaf&_>DSr;jn8`10?^m>FjISU3;|@GUgL4|~}GZY%=ri!FA5p$t7RY-8-# z4t8l*iR=I_sM{0bp>P|QN2hRVQ~Z-V+0E>s_`KuXfNY8n9%n;*1AXE+yYtMnzN3eE zohsZSbV#I!;-M3Kn|$v$Nxi?q=%;x26?jk>o;Z z{FS@e=00(dpce?t_|>mt+tyu4?G}sFi9t`!-}^eo{dT>uQ3VDVRorqoM)GJl{_X47 z`Rie-X~RFP8WNf^u7&JelKDqMb_F{p{#nTUuC#RW-Zpkmva6>vG`48b?`rF$p-33u zKsyFp3Ulx^k7Ixm(YYwt@};6i8sKLaSZsJmSeys)ycxXad;0K3^B{2r=L30JZy*8w6lCMHXri? zq)OHgkSI8gBKqD}s<($plr;N7heLsa-K7grmpNt?>l)-FUYKcl+Dbd7fknhckP9(* z@2GDlCk6a0p6r-r09lq;*?RvL*5%XOn=fE%1q=j`E}UW0wnKy*1Y86>1bhULZbu)p zAPc3!bdW3|B4G+4U8tS#t&3wiNS1?SIY^d+WVzYuPG%xKWC{g@WVy&K7pZcQDi^78 zkt!Fda*-+*sq*L?=E6`T%R^>)NENOF(?hB}q{>68JfzA)shD_U!W$3%xBUeE?P6d4z(2=AR7WWw06t@`4Avk0g@FU zS#bY_gz*MALILGK>oCV4OND@T$*NT#7(XNJSm}kec;&t9z?z}VfM zz3k7p0eaw#?9FR5B@kEN#NNyceCAE;{xuu5oL9e@9b{g-`Aw{+3n!C&ijnxWZ()~h z&QK2KX91=7$8TY0ac{5tPgul0L=msSZijSAzt+|Bf5P6p_CnBooYu*=imwH|<*jUj zH}I>svg<=Qi*(fMhXn8t@DTvYNlOjnREdo$5JR&L1>%R>N}E|{Z<)!D+Bz7nb>Mrq z1R!x15@#WC77}M6akd~1S1x|_mIEOYhw2xjy^d`oRj7S!)V?-qUmLZrjoO#$CoV_) zhPSb|vEjJq?d+YaUzQo_w)o?3XKz_O0;W5@{7+e>ii8B{x=7Pz<09n!yo*k}`{VE( ztUVmk7XzvIjVRbupH%&Bony4b&dj+Gr1pU};cHTNPvyuVBXCUN!lYjhwY+MN^QtRH z-ZG=(t=+c#Vka}PJrhGokt?mg8eyocKbei;oWUpSu@0+?f_#t{0J1~0>1ef8$yURK z@i+0I&~+=+FI@AvJ@8I8YV;?tY?l`=rx?*F?6rtzH;bhnI-byL*{@|gWPbY6#;GdV zpv?lKF87HqkM<;$h(1qvCfJHYaleEB;wf3BwOSEQMcAda;uD9lNRX?;3)D-8IJ?Az zCD#SS=Sa1RWUba|2ooq42tI^Wr4TVTbVlTm%G6jxYEy4Se77ADoWPfBZ3MIephQ5Q zs-_W$6SMf`?_yn{#yMJY3Fmq`Ix7MN+Jj8t8m$7)?8ZK6BfVNH;Up!J2_(~)Hu5ro z@iK{#t%yY=5#lEg9Ws>2RJU+ySKJx1tJz26SHx`lx)Y`CgVoORScOTW@z$72n34T% zBz-n@_>$5nFQkeP&MFMw#&JI4?85LE;5r0OT}Krk1aN5^yp9*CU^Q1~ja&5!+xb#b zKRYj^S$u*OrA~Z?bud2n-OMLx%zmNXrR`y_j^VsNSI6X-FWzQ!rOT%xF!E#BCm8__ z*$`NmuHmLq7OFO3vAeW6>cTM*KgTqL*#78WKPRnpO{w0;I+;>#2l&iO?dH;UL?0Jz zY(`4OFkAHE*+{=$$f9%e1S2{T22sN}Lfo;IP-Z|bIRgC}!Y>TpP%3hv7)_gz>Z{zD zAb8i~rAfL9P9T}I)-ZCOuonCTq4-aui$!>+-->_p0P}UBu|-6E>_Ij}pT&1=aHGVhY&8KOanfr`Jq3faUBJls zwB`DS@sdZ8!vuvMU?sK0n|?BW=|MKkcE-PZkewU!;IueONU9k|Pz%CH?UH?86Tjvm zwt;(%?|F!A=kDUO53yeEL*z^PG`5^9lg{kUmvrf)X_M+Z-}1#3+;?)_78xh=txvd1 zA9~B7R~{LVTuJ19LNbNs{X6pebDw;e-Fn`U)Cu0&CRb5+n_Na7x46S^C~Y79V_%r{ zIvd+p={(s+?a&92A1JW+>POhn?yE|pR3^37^hRqq&@DY3;|^aC-}eaXxp{MGw2V1! z=JQAdALPq4gt*q5@!YG5+x{?xv;xNB=l+8AgyNCc)|_;BhS;Ixk>V3G&=DE*11+U& zW%?35=NYi^^W+`aw9al-2_jP-S^4cP&3f^Zf6jVr10pu`%53;nZVvs*n$km&&XBh^c@u2(a^K1xg|lBEJOD*JPS^wJ>?=mu9YutXP%lwh=Ugp zK})(e*JNIkM?S%jRtchc;sU{l)`GZ%4#jz&hsB^uo?R8fF=*%JPYSzjirkRAgDrX1 zkcTkXf^?Q)lDIjuPLU_QhI|Px$9sVko(@ND?*ywQKI`3|FYC~^%f9|77uLKg^C)I8 z*is(C=^i;4LoFq&Rt@Npk5Nut5mC&c4}N6K4LsWMuR{LQMtBACpO&nS;6v()?|Y2x z2-oE4Adg~I3sP*)a>S8aG2K$qZgp!s;qLV+Atg_voRqjdE#lJlF5iQf>sFNXp?-=C zT0Jzf=9ZAVgW@sex|V$SfjjZSvb6O%%^M^ZurI-Z|CMO#Ix(SkE5u!jnr#F%>g%I$HQe zjz@Rg^*WHXmAzfACq>5r5%hti4ihX%-&6`Hn@L?_myEkltb8x3pBCX^DrP zV7qs><^?n>IiyQIBwxF|y%aB4q4C@`V)g{Vo6pTT@jXwnf!4xa{Kylmx9FLI(#yT&sPgPqYa@Pn zptYov*!XzeQ*3?o&d1B4xUHBskm9{|r(l+%kr%prnMFs|b(Jb7Ws0<=UeiouU1=5H zO4bTTw2LBQ#(PN0R%umTArVE+2Km<)Y$*DHfa#*oy~`f&_(4_5QV?zaP|t|?MTAxP zF$#kjKf!yBE`GdR_VF|IejwC9Pk-R%q)^n1UwDZ142V0F<(vG~3)EKr7z-S=Q5S!ilf=MTBzvz|(BkIhyJgf*IgXW{aOmSl7}AS=9KK zPqSXODsDf`_QZem4C|VtTUx-FV3{N*Y%6Dv#BVaJ(lL%;@Wr;VTK-4RaLJ?XUpc<+)2t_UKh1{Y(ND{ws|Aj^aplvj zpLy}s{7;*o;5X%VIC5N0>LtWK_%y4Ce&X_HIQSEu3YXir35U0Z$*x#`Tclzc%g}IQ zAbWIkuA2CD2TfL7KS69rFyL#-R>V&~@;M#cuT}N(a_1RY&`10XM1G4VZV9i6yPjcv z!D@Y9yv!(RGuEHy2j9QZyvN})Z0Nid8ku|~Pb4R^!UXhm?Cd7I2*l?a_YG>NmznWB z&(JG^WeyDj-(F@3_>QPiAih2FMO=gE_+D`O{5 z#(!8-+*00m}%blmqX7NwE*!t67d_(c9GJEFqukJ5? zVGsNG=_kKfJb8e1pEd_e_qLTfik+vQU0W!C`Uf`yG z?9c!Bvax;T@|{nxlNGzIvocofEw^o~obLTXX{evCxU;@l;(t!>|7K~Vjoop&_MOrX z?_SwadI#ffW0{ptU-gQ%eLFkKrG2I1SbTrj_6$4Y^mQlOt~S}$_~ED8dU@SXKGk;i zrw1=wnwV%TykcRh*|=(Mypaz1^!Janzo%zKXX)bdShdco-u>?O z6K8gg(^qNv6rX5uT zf;%`n*gTlP1R;VbjAcP&8^=IK0#dF)Bv}vxoyr76C4@+Xg?xq~7UPDRB^*I6|Uv%lKD_np7@`+jYGenp>XJ_)9i5Tr?0^c`^^{g!|ATByX`5A+lbDzNdf zem@@~uzsvDi9$DwA8%ab5a9hO#%2lvtEL&3G$ROBx}J@TW*BvrY9hVF$c~37d}pmu zOqB8Qbw<848Fg)|5CTtG_TFT)=}?8etBuD7Z1Q_;GaP8em$n&-O8;Q~cH^S#BK~&> z=}}ZzUfgNxR2;d-m`5!m+#3Xe4XXCKy+&~aJdeqTj5Rc7Fg@Zq$1UOzHw^*;tB8jO zzcUg$LpGj1VGPn$h5U>W1uz!l&KgxZ#Nw_CMrE=kp9XbQ&|z)HF%HZ>E?5`e;j9%z z`@OYjPHA!ZqQcVoo%oX#oFv!*8xl|?Fh;<{=p=R#;3hV8XGB*xG^emBMA3L`8k;VF zYU{U)Y@mye4$)Yf$Soa8FmU+i06$}K3g2R@{nqDr3x#3$ zcLraptLKX0e2z$%0rbX9PCC0D@M^OD)lqIvwAR^Pp$s18@mLP~&>qiC0wXY~fM1R4 z0ERE;@FMsI%jWQ{1XiM1!V3XTVQDG98WvQrfIAxef(sV&Erb`BDO|v{kyP+`DX&4;x>%5A=No@O*?*KJ{J8tpw<})-$v*SoyVNQURw|T7wQ~aUL zyh$YK)B`X4H%Y(C*YGf5SOFfo%k#JrB=U%-N$87xnDDf&D`@bF>uIS3_=;pt%T=lx z&cz{9^o?2MR0=NOI0)qIT}>7fMD3VNfSN6tN}rxX16in#-J8m)UOah)f4(*Ne@dMD|gG zSd^rYS$IuEYY>TRZi)t7Nn8FcagLdmqICpp48g_p7LgyJf-WO6m8t7?A*+b;9B9cd zAr13v`KhMH>w2s#kAemGdQaIU3i@H$U^#%nS6DMt9@E%U#VZ;mhs3~stez-WlgP>R z6!+G9j;*=QU>l#EET`!`-lIoAyX?|g<(_U=XJ%$;;Eg7HG-b)Q_Q1iN(`1HFfzKDo z6b^~_Xs*-%qI^;+zlK7rEtS258vFC_N=3J&xMZp9r@>*|xm*t59dW#{R-TL34HAm} zx7%b{PZ*BykCxBREEwEua!)n`SFjZW&Q#8&%;lV$4_pX_%j6zCa-pH}x=cz#Q2@z%M!G tJWY8_NHZ74sx$aL+jIe5Lpsb{2XNZoFx)JH-Ts~7<|sIe14o$s;XjIT0lWYJ -- 2.39.5