[datatable-commits] r398 - pkg/inst/doc pkg/inst/tests pkg/src www

noreply at r-forge.r-project.org noreply at r-forge.r-project.org
Mon Nov 7 02:29:33 CET 2011


Author: mdowle
Date: 2011-11-07 02:29:32 +0100 (Mon, 07 Nov 2011)
New Revision: 398

Modified:
   pkg/inst/doc/datatable-faq.Rnw
   pkg/inst/doc/datatable-intro.Rnw
   pkg/inst/doc/datatable-timings.Rnw
   pkg/inst/tests/tests.Rraw
   pkg/src/assign.c
   pkg/src/countingcharacter.c
   pkg/src/dogroups.c
   pkg/src/duplist.c
   pkg/src/reorder.c
   www/datatable-faq.pdf
   www/datatable-intro.pdf
   www/datatable-timings.pdf
Log:
+ Consistent use of R_len_t for the future (int in R currently).
+ Tidied up a few casts to (char *) and typename allocated wrong way around.
+ Passes R CMD check on 32bit and 64bit.

Modified: pkg/inst/doc/datatable-faq.Rnw
===================================================================
--- pkg/inst/doc/datatable-faq.Rnw	2011-11-06 11:09:00 UTC (rev 397)
+++ pkg/inst/doc/datatable-faq.Rnw	2011-11-07 01:29:32 UTC (rev 398)
@@ -14,11 +14,10 @@
 
 <<echo=FALSE,results=hide>>=
 if (!exists("data.table",.GlobalEnv)) library(data.table)  # see Intro.Rnw for comments on these two lines
-rm(list=as.character(tables()$NAME))
+rm(list=as.character(tables()$NAME),envir=.GlobalEnv)
 options(width=70)  # so lines wrap round
 @
 
-
 \begin{document}
 \title{FAQs about the \pkg{data.table} package in \proglang{R}}
 \author{Matthew Dowle}
@@ -387,6 +386,9 @@
 cbind.data.frame = function(...)cat("Not printed\n")
 cbind(foo)
 @
+<<echo=FALSE>>=
+rm("cbind.data.frame")
+@
 \begin{itemize}
 \item Finally, we tried masking \code{cbind} itself (v1.6.5 and v1.6.6). This allowed \code{cbind(DT,DF)} to work, but introduced compatibility issues with package IRanges, since IRanges also masks \code{cbind}. It worked if IRanges was lower on the search() path than \code{data.table}, but if IRanges was higher then \code{data.table}'s \code{cbind} would never be called and the strange looking matrix output occurs again (FAQ \ref{faq:cbinderror}).
 \end{itemize}

Modified: pkg/inst/doc/datatable-intro.Rnw
===================================================================
--- pkg/inst/doc/datatable-intro.Rnw	2011-11-06 11:09:00 UTC (rev 397)
+++ pkg/inst/doc/datatable-intro.Rnw	2011-11-07 01:29:32 UTC (rev 398)
@@ -15,7 +15,7 @@
 <<echo=FALSE,results=hide>>=
 if (!exists("data.table",.GlobalEnv)) library(data.table)  
 # In devel won't call library, but R CMD build/check will.
-rm(list=as.character(tables()$NAME))  
+rm(list=as.character(tables()$NAME),envir=.GlobalEnv)
 # for development when we Sweave this file repeatedly. Otherwise first tables() shows tables from last run
 @
 

Modified: pkg/inst/doc/datatable-timings.Rnw
===================================================================
--- pkg/inst/doc/datatable-timings.Rnw	2011-11-06 11:09:00 UTC (rev 397)
+++ pkg/inst/doc/datatable-timings.Rnw	2011-11-07 01:29:32 UTC (rev 398)
@@ -12,14 +12,13 @@
 \SweaveOpts{keep.source=TRUE}
 %% \VignetteIndexEntry{Timings of common tasks}
 
-\begin{document}
 <<echo=FALSE,results=hide>>=
 if (!exists("data.table",.GlobalEnv)) library(data.table)  # see Intro.Rnw for comments on these two lines
-rm(list=as.character(tables()$NAME))
+rm(list=as.character(tables()$NAME),envir=.GlobalEnv)
 options(width=70)  # so lines wrap round
 @
 
-
+\begin{document}
 \title{Timings of common tasks using the \pkg{data.table} package in \proglang{R}}
 \author{Matthew Dowle}
 \date{Revised: \today\\(A later revision may be available on the \href{http://datatable.r-forge.r-project.org/}{homepage})}

Modified: pkg/inst/tests/tests.Rraw
===================================================================
--- pkg/inst/tests/tests.Rraw	2011-11-06 11:09:00 UTC (rev 397)
+++ pkg/inst/tests/tests.Rraw	2011-11-07 01:29:32 UTC (rev 398)
@@ -1095,30 +1095,21 @@
 cat(format(tt["elapsed"],nsmall=3),": .Internal(order(u))\n")
 fsorted = f[o1]
 xsorted = x[o1]
-#cat(format(system.time(
-#    o2 <- sort.list(fsorted,method="radix")                 # 0.318   
-#    ,TRUE)["elapsed"],nsmall=3),                            # (page fetches on counts minimised)
-#    ": sort.list(,'radix') on fsorted\n")
-#cat("-vs-\n")
-#for (GE2140 in c(FALSE,TRUE)) {   # GE2140 = getRversion()>="2.14.0"
-#    if (GE2140) cat(">= R 2.14.0\n") else cat("< R 2.14.0\n")
-#    cat(format(system.time(
-#    o3 <- .Call("countingcharacter",x,FALSE,GE2140)         # 2.186
-#    ,TRUE)["elapsed"],nsmall=3),
-#    ": char group on x (ad hoc by)  [slower than radix on f but without up front cost]\n")    
-#    cat(format(system.time(
-#    o4 <- .Call("countingcharacter",x,TRUE,GE2140)          # 2.400
-#    ,TRUE)["elapsed"],nsmall=3),
-#    ": char sort on x (setkey)  [lower up front cost than factor(x)]\n")
-#    cat(format(system.time(
-#    o5 <- .Call("countingcharacter",xsorted,FALSE,GE2140)   # 0.222
-#    ,TRUE)["elapsed"],nsmall=3),
-#    ": char group on xsorted (keyed by)  [faster than sort.list(,'radix') on fsorted, same result]\n")
-#    
-#    test(389+3*GE2140,identical(o1,o4))
-#    test(390+3*GE2140,identical(o2,o5))
-#    test(391+3*GE2140,identical(o5,1:length(x)))
-#}
+tt = system.time(o2 <- sort.list(fsorted,method="radix"))    # 0.318   
+cat(format(tt["elapsed"],nsmall=3),": sort.list(,'radix') on fsorted\n")     # (page fetches on counts minimised)
+cat("-vs-\n")
+for (GE2140 in c(FALSE,TRUE)) {   # GE2140 = getRversion()>="2.14.0". Must be FALSE first, so can simulate 2.14.0
+    if (GE2140) cat(">= R 2.14.0\n") else cat("< R 2.14.0\n")
+    tt = system.time(o3 <- .Call("countingcharacter",x,FALSE,GE2140))        # 2.186
+    cat(format(tt["elapsed"],nsmall=3),": char group on x (ad hoc by)  [slower than radix on f but without up front cost]\n")    
+    tt = system.time(o4 <- .Call("countingcharacter",x,TRUE,GE2140))         # 2.400
+    cat(format(tt["elapsed"],nsmall=3),": char sort on x (setkey)  [lower up front cost than factor(x)]\n")
+    tt = system.time(o5 <- .Call("countingcharacter",xsorted,FALSE,GE2140))  # 0.222
+    cat(format(tt["elapsed"],nsmall=3),": char group on xsorted (keyed by)  [faster than sort.list(,'radix') on fsorted, same result]\n")
+    test(389+3*GE2140,identical(o1,o4))
+    test(390+3*GE2140,identical(o2,o5))
+    test(391+3*GE2140,identical(o5,1:length(x)))
+}
 
 # Test unique.data.table for numeric columns within tolerance, for consistency with
 # with unique.data.frame which does this using paste.

Modified: pkg/src/assign.c
===================================================================
--- pkg/src/assign.c	2011-11-06 11:09:00 UTC (rev 397)
+++ pkg/src/assign.c	2011-11-07 01:29:32 UTC (rev 398)
@@ -22,7 +22,7 @@
     // For internal use only by [<-.data.table.
     // newcolnames : add these columns (if any)
     // cols : column numbers corresponding to the values to set
-    int i, j, size, targetlen, vlen, v, r, oldncol, coln, protecti=0;
+    R_len_t i, j, size, targetlen, vlen, v, r, oldncol, coln, protecti=0;
     SEXP targetcol, RHS, newdt, names, newnames, nullint, thisvalue, thisv, targetlevels;
     if (!sizesSet) setSizes();   // TO DO move into _init
     if (length(rows)==0) {
@@ -52,13 +52,13 @@
         PROTECT(newdt = allocVector(VECSXP, length(dt)+length(newcolnames)));
         protecti++;
         size = sizeof(SEXP *);
-        memcpy(DATAPTR(newdt),DATAPTR(dt),length(dt)*size);
+        memcpy((char *)DATAPTR(newdt),(char *)DATAPTR(dt),length(dt)*size);
         names = getAttrib(dt, R_NamesSymbol);
         if (isNull(names)) error("names of data.table are null");
 	    PROTECT(newnames = allocVector(STRSXP, length(newdt)));
 	    protecti++;
-	    memcpy(DATAPTR(newnames), DATAPTR(names), length(names)*size);
-	    memcpy((char *)DATAPTR(newnames)+length(names)*size, DATAPTR(newcolnames), length(newcolnames)*size);
+	    memcpy((char *)DATAPTR(newnames), (char *)DATAPTR(names), length(names)*size);
+	    memcpy((char *)DATAPTR(newnames)+length(names)*size, (char *)DATAPTR(newcolnames), length(newcolnames)*size);
 	    setAttrib(newdt, R_NamesSymbol, newnames);
         copyMostAttrib(dt, newdt);
         dt = newdt;
@@ -97,7 +97,7 @@
             for (j=0; j<length(thisvalue); j++) TRUELENGTH(STRING_ELT(thisvalue,j))=0;  // can skip in future
             targetlevels = getAttrib(targetcol, R_LevelsSymbol);
             for (j=0; j<length(targetlevels); j++) TRUELENGTH(STRING_ELT(targetlevels,j))=j+1;
-            int addi = 0;
+            R_len_t addi = 0;
             SEXP addlevels=NULL;
             PROTECT(RHS = allocVector(INTSXP, length(thisvalue)));
             protecti++;
@@ -117,7 +117,7 @@
                 INTEGER(RHS)[j] = TRUELENGTH(thisv);
             }
             if (addi > 0) {
-                int oldlen = length(targetlevels);
+                R_len_t oldlen = length(targetlevels);
                 PROTECT(targetlevels = growVector(targetlevels, length(targetlevels)+addi));
                 protecti++;
                 size = sizeof(SEXP *);

Modified: pkg/src/countingcharacter.c
===================================================================
--- pkg/src/countingcharacter.c	2011-11-06 11:09:00 UTC (rev 397)
+++ pkg/src/countingcharacter.c	2011-11-07 01:29:32 UTC (rev 398)
@@ -30,20 +30,20 @@
 #endif
 
 extern int Rf_Scollate();
-void ssort2(SEXP *x, size_t n);
+void ssort2(SEXP *x, R_len_t n);
 // See end of this file for comments and modifications.
 
 
 SEXP countingcharacter(SEXP x, SEXP sort, SEXP GER2140)
 {
     SEXP ans, tmp, *u;
-    size_t i, n, h, k, cumsum, un=0, ualloc;
+    R_len_t i, n, h, k, cumsum, un=0, ualloc;
     if (!isString(x)) error("x is not character");
     if (!isLogical(sort)) error("sort is not logical");
     if (!isLogical(GER2140)) error("GER2140 is not logical");
     n = LENGTH(x);
     if (!LOGICAL(GER2140)[0]) // < R 2.14.0
-        for(i=0; i<n; i++) TRUELENGTH(STRING_ELT(x,i)) = 0;    // TO DO: time the cost here
+        for(i=0; i<n; i++) TRUELENGTH(STRING_ELT(x,i)) = 0;
     else
         if (TRUELENGTH(STRING_ELT(x,0))!=0) error("R.version >= 2.14.0 but truelength on first CHARSXP ('%s') is %d (not 0 as expected). length is %d (should be nchar)",CHAR(STRING_ELT(x,0)),TRUELENGTH(STRING_ELT(x,0)),LENGTH(STRING_ELT(x,0)));
     PROTECT(ans = allocVector(INTSXP, n));
@@ -73,9 +73,9 @@
         tmp = STRING_ELT(x,i-1);                             // + 0.800 (random access to ans)
         k = --TRUELENGTH(tmp);
         INTEGER(ans)[k] = i;
-    } // NB: i is size_t so must be i>0 otherwise underflow to maxint.
+    } // Aside: for loop bounds written with unsigned int (such as size_t) in mind (when i>=0 would result in underflow and infinite loop).
     for(i=0; i<un; i++) TRUELENGTH(u[i]) = 0; // The cumsum means the counts are left non zero so reset for next time (0.00).
-    // INTEGER(ans)[--counts[(tmp==NA_STRING) ? 0 : TRUELENGTH(tmp)]] = i+1;
+    // INTEGER(ans)[--counts[(tmp==NA_STRING) ? 0 : TRUELENGTH(tmp)]] = i+1;  // TO DO: tests for NA in character vectors
     UNPROTECT(1);
     Free(u);
     return ans;
@@ -100,11 +100,11 @@
 
 
 // Copied as-is directly from src/main/sort.c :
-const size_t incs[16] = {1073790977, 268460033, 67121153, 16783361, 4197377,
+const int incs[16] = {1073790977, 268460033, 67121153, 16783361, 4197377,
 		       1050113, 262913, 65921, 16577, 4193, 1073, 281, 77,
 		       23, 8, 1};
 
-void ssort2(SEXP *x, size_t n)
+void ssort2(SEXP *x, R_len_t n)
 // Copied from src/main/sort.c.
 // ssort2 is declared static in base i.e. not exposed to packages unfortunately.
 // We don't want to call the sortVector wrapper in base because we use Realloc in
@@ -117,10 +117,9 @@
 //    it to the && to short circuit instead.
 // 3. NA always go last in data.table, that option (of scmp) removed too, but there
 //    won't be any NA anyway
-// 4. size_t instead of int
 {
     SEXP v;
-    size_t i, j, h, t;
+    R_len_t i, j, h, t;
     for (t = 0; incs[t] > n; t++);
     for (h = incs[t]; t < 16; h = incs[++t])
 	for (i = h; i < n; i++) {

Modified: pkg/src/dogroups.c
===================================================================
--- pkg/src/dogroups.c	2011-11-06 11:09:00 UTC (rev 397)
+++ pkg/src/dogroups.c	2011-11-07 01:29:32 UTC (rev 398)
@@ -11,7 +11,7 @@
 #endif
 
 int sizes[100];  // max appears to be FUNSXP = 99, see Rinternals.h
-char typename[20][100];  // The typename in main/inspect.c seems static (not available for use by packages), uses a switch, and uses the internal names.
+char typename[100][30];  // The typename in main/inspect.c seems static (not available for use by packages), uses a switch, and uses the internal names.
 
 SEXP growVector(SEXP x, R_len_t newlen);
 int sizesSet=0;
@@ -19,7 +19,7 @@
 void setSizes()
 {
     int i;
-    for (i=0;i++;i<100) {
+    for (i=0;i<100;i++) {
         sizes[i]=0;
         sprintf(typename[i],"unsupported type %d", i);
     }
@@ -34,6 +34,10 @@
     strcpy(typename[STRSXP], "character");
     sizes[VECSXP] = sizeof(SEXP *);  // a column itself can be a list()
     strcpy(typename[VECSXP], "list");
+    for (i=0;i<100;i++) {
+        if (sizes[i]>8) error("Type %d is sizeof() greater than 8 bytes on this machine. We haven't tested on any architecture greater than 64bit, yet.", i);
+        // One place we need the largest sizeof (assumed to be 8 bytes) is the working memory malloc in reorder.c
+    }
     sizesSet=1;
 }
 #define SIZEOF(x) sizes[TYPEOF(x)]

Modified: pkg/src/duplist.c
===================================================================
--- pkg/src/duplist.c	2011-11-06 11:09:00 UTC (rev 397)
+++ pkg/src/duplist.c	2011-11-07 01:29:32 UTC (rev 398)
@@ -20,7 +20,7 @@
     // Unless, order is provided, then it also drops any previous row.
     // l must be a list of same length integer vectors
     // ans is allocated first (maximum length the number of rows) and the length returned in anslen.
-    int i,j,nrow,ncol,len,thisi,previ;
+    R_len_t i,j,nrow,ncol,len,thisi,previ;
     ncol = length(l);
     nrow = length(VECTOR_ELT(l,0));
     len=1;
@@ -61,23 +61,22 @@
 //     columns are looped through in reverse order.
 // iv) not using the rcmp function, saving the 5 if's and funct call
 
-//  It is still a comparison sort, so is not meant to be very fast, but should be slightly
-//  more efficient that base for the reasons above. Intend to come to a fast radix sort
-//  for floating point (which does seem to be known).
+//  It is still a comparison sort, so is not meant to be super fast, but should be slightly
+//  more efficient than base for the reasons above. Intend to tackle fast radix sort
+//  for floating point later (which does seem to be known).
 
-extern const size_t incs[];
+extern const int incs[];
 
 //#define cmptol(a,b) (x[a] > x[b]+tol || (a>b && x[a] > x[b]-tol))
 #define cmptol(a,b) ( (ISNAN(x[b]) && !ISNAN(x[a])) || (!ISNAN(x[a]) && !ISNAN(x[b]) && (x[a] > x[b]+tol || (a>b && x[a] > x[b]-tol))))
 
 void rorder_tol(SEXP xarg, SEXP indxarg, SEXP tolarg)
 {
-    int t, i, j, h;
-    int itmp;
+    R_len_t t, i, j, h, itmp;
     double *x=REAL(xarg)-1;
-    int n=length(xarg);
-    int lo = 1, hi = n;
-    int *indx=INTEGER(indxarg)-1;
+    R_len_t n=length(xarg);
+    R_len_t lo = 1, hi = n;
+    R_len_t *indx=INTEGER(indxarg)-1;
     double tol = REAL(tolarg)[0];
     
     //for (i=1; i<=n; i++) if (ISNAN(x[i])) error("NA and NaN are not allowed in numeric key columns. They have to be dealt with specially (slowing things down) but also NAs in the key can lead to ambiguities and confusion when it comes to joining to NA values. If you have a real-world example that really does need NAs in the key then consider choosing your own value to represent NA, such as -999.999. If you want to join to the -999.999 values then you can, and if you want to represent an NA row, then you can too. That will be much faster and clearer. We think that requirement is very rare, so data.table is setup to be optimized for the most common cases; i.e., no NAs in key columns. Also, binary search is faster without a check on NA_REAL (it seems we cannot rely on NA_REAL being REAL_MIN, unlike NA_INTEGER being MIN_INT).");

Modified: pkg/src/reorder.c
===================================================================
--- pkg/src/reorder.c	2011-11-06 11:09:00 UTC (rev 397)
+++ pkg/src/reorder.c	2011-11-07 01:29:32 UTC (rev 398)
@@ -9,9 +9,9 @@
 #endif
 
 // See dogroups.c for these shared variables.
-int sizes[100];
-int sizesSet;
-void setSizes();
+extern int sizes[];
+extern int sizesSet;
+extern void setSizes();
 #define SIZEOF(x) sizes[TYPEOF(x)]
 //
 
@@ -19,23 +19,26 @@
 {
     // For internal use only by fastorder().
     char *tmp, *tmpp;
-    int i, j, nrow, size;
+    R_len_t i, j, nrow, size;
     if (!sizesSet) setSizes();
     nrow = length(VECTOR_ELT(dt,0));
     if (length(order) != nrow) error("logical error nrow(dt)!=length(order)");
-    tmp=calloc(nrow,sizeof(double));  // sizeof largest type. 8 on all platforms?
+    if (sizeof(double)!=8) error("sizeof(double) isn't 8");   // 8 on both 32bit and 64bit.
+    tmp=(char *)Calloc(nrow*8,char);   // Enough working space for the largest type. setSizes() has a check too.
     if (!tmp) error("unable to allocate temporary working memory for reordering data.table");
     for (i=0;i<length(dt);i++) {
+        if (length(VECTOR_ELT(dt,i))!=nrow) error("reorder received irregular lengthed list");
         size=SIZEOF(VECTOR_ELT(dt,i));
         if (!size) error("don't know how to reorder type %d of column %d. Please send this message to maintainer('data.table')",TYPEOF(VECTOR_ELT(dt,i)),i+1);
         tmpp=tmp;
         for (j=0;j<nrow;j++) {
-            memcpy(tmpp, (char *)DATAPTR(VECTOR_ELT(dt,i)) + (INTEGER(order)[j]-1)*size, size);
+            memcpy((char *)tmpp, (char *)DATAPTR(VECTOR_ELT(dt,i)) + (INTEGER(order)[j]-1)*size, size);
             tmpp += size;
         }
-        memcpy((char *)DATAPTR(VECTOR_ELT(dt,i)), tmp, nrow*size);
+        memcpy((char *)DATAPTR(VECTOR_ELT(dt,i)), (char *)tmp, nrow*size);
     }
-    free(tmp);
+    Free(tmp);
     return(R_NilValue);
-}               
+}
 
+

Modified: www/datatable-faq.pdf
===================================================================
--- www/datatable-faq.pdf	2011-11-06 11:09:00 UTC (rev 397)
+++ www/datatable-faq.pdf	2011-11-07 01:29:32 UTC (rev 398)
@@ -382,40 +382,32 @@
 << /S /GoTo /D [254 0 R  /Fit ] >>
 endobj
 287 0 obj <<
-/Length 3593      
+/Length 3594      
 /Filter /FlateDecode
 >>
 stream
 xÚí[[sÛÆ~ϯÐôÅ`ÇÚ`‹Å¢NÆN›TmšNSuOšX¤(Ö"¨!ÈÈʯï9{Î^@.IY©cg&Aìý\¾s[–gó³òìËOÊŸ//?ùô‹ª9“P²Ög—×g²®…mΚ²¥®Ï.§gß_Ld©‹eŠLd1LΫ²,º×“sU+x³…¿
-¾…xžM¾¿ü˧_h5šYÂÌm»I§Ð¯Ût‡ÂT²¸Ç[²¥¨ëÇÝá8ø»Âí¼™ÔUÑÍÝH·ü{^}4Ic„­”Ÿäê¢$ìJ´u­°Ë¹l¤°usv®,ìTQ׿uîpád²¸‡¥`í?Âãj¢šâ>ìF¶BiŸ•h¥_Z˜ÐÞ†žûw“s]UÅ×0Ü?à8ï¿!QM1[ãu¡žó'4—ð'%-c´¨l”vOëü§¬±ËÚÝ­#/.ÍS­GÛX¸Í#­\ãÒ– Ñ¼jìpƒ?LêÚÑ}Á¬Jxæ†$³á²A@ØÊ3y¶F‰Ã‡o¾üäì;7â†÷€‹Ï[çÉ ’P:—$vÙ³V´FÇ,S‰ªJWÀXüº¼áýhäÆ3ú>`Óór±êá?·VÅKl™;Éé=Á` H½T(õ
-I½ë
-Cj&I’mw=²xëš6î`î	Ùø-9tÓt¼{\­§´nØÒ5<â×Õ{´nó8k·v§iŠÍ*ž²÷LÅÓ­¶,.øÔKǼ’©E«õXj"§A ã+¶.‹ëÕšéêûàV¦tYÌ©asŠå0§,©ï’©×0t„Ù#U×DDè‚ÄÙÎáëžWd:ÃãÔ‹{'6cáK“ëìµ`ÞϼncWAR` „ª´q P‚„)Ñ‚²9r}Nb^ñzÜ"ҝMph˜«ID¦R at yÉSÉÉyÊòr6çíô9ΟW¶BB¼À%vGGѲºi=¢©ƒ{i.9ªšeÀðN„a;²TUño§¼Nh˦³„‰3Ø…»@L¼„¿ïœ(Ë¢†¿ï÷•·ÒÂh?Æ	Ô†­ÈºÏ¬Q•BÃ^¹½?_-T€öÏv9^‹ZQƒÉrÊÑüxD—Ç÷|ï“íS•ÎN¤o÷¥ø^µ¢	P' Þ‡ ü†læp‚Õ—qã7yá #,mõTé8¾àÞbZŠÆTeG–¥úÈ$Çöê$Û•T‚»³Ïö*Ëöº˜®þb»U‡Ø~ˆv›R4ÍA0p[éðÃDGéÊ?vý¨àÅ3xžR¯[^òÍ„
-oœ@ž_­nyîeN”dÝ
-#Ç.ª·¼Î¶Æçu„FJ¨2œHБ:7Üg´™…',€rXz̜ޑ-³Ç
-iÓ-®™Àwû[QZuØo¾]’ÝBKú}ËÔ²Þ_À÷gKjÜÞ¯/‰½]dɧÀß6òù¼cÓy¿ï4ùv¾©ÛŸzG=Ÿ¨| ªl2ʧßæ¾åÏþü1¯xèÕÑl:qc‰¸Ç¬ÖoXÁ´‘ˆ
-óÛ6¬áÓèŠÝD7®¢tÚV·¬ny‘u%”
-ì~{ܸ?ÏÌ  Á}ûÃþpþNP—®w[Îl£…h¢ñÝ~<¾‹=90eóК4!Z@$»ïÁÕ,LÈ,ÕÝà½yï•”¼£ˆç@Â"8˳UÀ6&PoÉBuÅ€ƒø÷6äoóöµ.…ŠÆÚ¢± 9@Ì!	(Œ•õ!Ïí#/àºiY–¼8‚g
-#u&LÖ@™‚¼VÅŸ)@fFV\ЛùŒÏ¾p¨H	k…jí ½
-H°zÐ|ÑøfFÏl×–SÂ8<`·ÍøðnÑ'ˆ¾ˆFAû®Š• `•9,û†*èËæ˜eüôÿ;”ï+˜y\ƒjrhmXÁþîæ¹–MñšS_ø|AS—[xß#Žö^2ðE–ZZ£oï¼×´vÕԝ™„
-¥bp‘«Eü¦m¢ìá”,{øÈ»ºs^ÂÜÙÞeç#é«î–ùñÀÝ°} ¿DAÜ+õ¾dÞP²*‰×å¾ç\™ê—`½ÿÉž(Ÿ¾8ùlX>]Ìå©XŇ4½“pÛoœbN‚yG„s)φ}¤¹#,Šyšó›J} çì©]r\Ч¸Pfèo|øësÌñ*
-M–ô<P
-Ïg²8w¦c&Ã=£ç{$|·ÉºMV˜hÜž©QË0	K
-.ÜQZpåÐ
-OR7d¼ÕÐôþªf‡OSèƒ÷("0‹›Ô{'\Œ]ûÇ:—-xÿvìÜ<5Žù·Ia âýÔŦ4;uQ|
-†ÌāS$v×)]ÎÙÇà®­Ûx£üy°ó>J¿vÑtÏîYݺ+øÆAþ|–S6m?@Æá¤~œ·@8c3ZÒˆyº$ɼN¸ô8²¼ÛÞ² ÙŽ $“†öÑ"Ռ٨Æ)`ÞÆA™þüÒ6Yz46•=þ™¶~ïÈ„y÷Cƒ!QÐ@ŸÄD8ëàË 2¦}MËe&¬(ëàß3&x:q}*_Îe„¥
-H¯Ýö)ÝœZH×¢´rŒ
-|,ô|²ÖêêýÚ£§i˜ª!U›c·$v?%­àIó-\¯òÁ•ÒB¶ÇÒvª`Oc¬‡£x%&ÜÛk.yå2K•0‘m¯òa~HÜmbÐĪþO^å éÐ'ZTÕ¥çHŠ¶k/ʳ8'm³8vu} ‘X6‘”Ùt‚̧Gé纤zÇñŒ@[
-YfA%‚Ðmö<ÂÎ.œêÈÊ•#gl©w
-‚„ ˆ³C¼4¥huý.ÒÔ¾£þ/C¹Œͳ¨ûßr¦àÕAg3FUýœD êGªF4e®–#+âû‹ž´?¢ð"©Ø"Án‡Èþàõmä‚T™…‡çÀ[vƘ	לÀ¿ß2NwÌ/Ç”¬(X+ÝfLõqGv9“ýN–Ói›+Ëjâä%EeÏXw¥.ú§`{²ŽÉ5h»çÎ}Y8^¸>ôƁÁó½ñÉ*è’¼T!€ÆMlœQ.Ç¡7]/É¥‹´MkÿÍ¡5ÞÝàökªæ¸ùƒÍÀ]†65®BίIH“ÖÐûµ·sðìÒ«íÝž1ßÅVs‚3;|À?%d5®ã+ªã9ëý%Žî–
-øçÉú	ZÀîíѾù	|•ðc"„õŠÂ-0.‰¯b8â¢ø)5Þ¯½»–\ë î®}GdZ[Ü®¨W¦+ÑFó–áPB³Ù[W¼òù¯!Üò ÛmÀõz5Z®¶Ï\ê‹£(ØÑÐ%Ûç³áصÞƶ-Cve9ˆ¶„ìXÎL‘P]U[¶õ7CCƬ55±xAft‡‹Ñ¡ ‚ç¾Ó%éßèid«*{ ÓJ}D™–œ}3'QѺ¢Ëˆ7êØM…ãŽÍ(€$“€'çn*ÑØQÝÃËÔæx‘µ˜•M£‹¦Viq¡ãYoóEeÀ¯;r³¥1¿Ô,çiæ#ˆXc¿¿±àSkÈà­Ïš÷9 at 2ð(¨ìÕ©QZÑF`~lýyÔæí"IçÃ-´u._èJ?gœ 2
-cNý­þÈ*ä`6ÄwÒ6f뤨YiÊMói:d&A·I î’´š&Ø\ÞQ­ëz¥¾ Jyœ˜³ «Šä
-qRg7puióÚïŽr@\ßMõmƒ§­cÀYa™6Mþ¹Û¤´Ëpƒ÷`5&xN¦u㛲èý
-å¦,Æ7!N	U“ČӨh’šÖ‘†’>þ*æc&¤w#zÁ°žOM‰ç²ÑG…Ž.?”L!»)ÙÊ¥UMÜW5ýÕ™rì¥Zµ!®I®X$I=7óÝb|Á%”W|ëe¹“Aì^ßroAé„Ͻ[U±d†p€	m;¿iX„¢‹Ìáxù¡ñ¸yRÕI®Œùë}õU&¼®ñ“ë£ÔþŽ­Ø#óÚµ¿‡Z‹*æüÓÛåôÄq;lª´.™ãGpº´Â´906/‡ÊÃii¥°ñ¶¥'üQ[¼“ò·ûüj\?™õ‰y\®
-¾_›®ä/¼H|š‰²4¢49÷ÉW‰_ú8Ä$€g ÀŽ·îgÔJ–+{{£Qi¢×C‚v8+’¿Ù¸RÔm½ç™˜š5ã
-™Þyyû¤¿Þ¿ÚÔ2ú%‡{3x7⁻lbÝ;ϖ–í»Ê­Ž?vb¡Ûž¢Â¶Íþã¨ï‹BSÿzâ„ïùŽ†-M¨Øí¼9?R¥D¡ºZÝí$Y±¿:}iø:rÖ­Ñ¦ŠæL†œƒaŒüÈx›5{ÔL#ŒÉ`š¯)Þ±]D­»«ËöYÐ*a[ù“9ºõ
-=ܠѸ}z§†Ò”ó›L¬J“˜ûEãF—ï‰AOäL)…Þ­EªQé¹÷$šÂ•Ϙî6ÜзùzµeŠB° Úä†	6snýu$ÅDrß²
-©©ÃΧõsú Õÿ Àõ]–DŽ%Q9ŽJ—ü-Kš.¤ÆFmkú½£|
-¸¦ÙKTMóëe¹w*™Û§1¾bŽW·úäv\zõmô‹ÒäÇŒã:…³þ²œOª¯Ì?^s¸0<Ž ¾vÇspŠ²š½¨`ÊW€àw»—¢vëÓ!€Ì•”Z›'U”Ñ1]-üo~éöÈ£s%üÚˆÊ+ᏬÁh£4þ(m’TN™*vKüÝûè.ú«ÇÜEßYÿŒ¡I›/¸[äÄ#Z‚Ÿ~›öýÓå'ÿ/
+¾…xžM¾¿ü˧_h5šYÂÌm»I§Ð¯Ût‡ÂT²¸Ç[²¥¨ëÇÝá8ø»Âí¼™ÔUÑÍÝH·ü{^}4Ic„­”Ÿäê¢$ìJ´u­°Ë¹l¤°usv®,ìTQ׿uîpád²¸‡¥`í?Âãj¢šâ>ìF¶BiŸ•h¥_Z˜ÐÞ†žûw“s]UÅ×0Ü?à8ï¿!QM1[ãuÑ<§OÍ%üIIË-j¥ÝÓ:ÿ)kìò‚vwëÈ‹KóTëÑ6nóH+׸tD…åh4ï‚;Üà“ºvt_0«ž¹!Él¸l¶òLž­Qâðá›/?9û΍¸á=àâ3ÇÖy2ˆ$”Î%‰]ö¬­QÆ1ËT¢ªÒ0Ö0¯.ox?ÚÂ0©ñÌƾØtż\¬zøÄ­Uñ[æNrzO0 R/J}CRïzÃЁšIÒ€dä]lÞº¦;˜{DB6~KŽÝ4ïWë)­¶t
+øuµÄ­Û<ÎÚ­Ýišb³Š§ì=SñôD«-‹>õÒ1FjÑj=–šÈiȸÁJ…­Ëâzµfºú>¸•)@sjØœb9Ì)Kê»dê5aöHÕ5º q¶søºç™Îð8õâÞ‰ÍX8ÇÒä:{-˜÷3¯ÛØU” ¡*m(” aJ´ lŽ\Ÿ“˜W<„ž·ˆt§…CÓæj‘…©P^òTrrÞ‚²¼œÍy;$}Žóç•­P /p	‚ÝÑQ´l…nZhêàFZ£K@Žªf0¼aØŽ,UUüÛ)¯DziàÃl aâŒv!Ã./áï;'ʲ¨áïû}å­´0ڏqµa+²î3kT¥Ð°Wî_ïÏW ý³]Ž×Æ¢VÔ`²œr´?Ñåñ=ßûd;ÇT¥³éÛ}i ¾W­h‚ Ô‰ ¨÷! ¿a ›9œ`õeÜøM^8ÀK[=U:Ž/¸·˜–¢1ÕAÙ‘e©>2ɱ½:Év%•°àî쳽ʲ½.¦«€ÿ‡ØnÕ!¶â@†Ý¦MsÜV:ü0ÑQºrÀ]?ª€xñž§Ôë–—|3aÃ'çW«[ž{™%Y·Âȱ‹ê-¯³­ñyÇc¡‘ª'´E¤Î÷mfá	 –3§wdËì±FÚt‹k&ðÝþV”Gö›o—d·ÐÄ’~ß2µ¬·ÁðýÙ’·ƒ÷kàKboYò)ð·<F>ïØtÞï;M¾oêög…ÞQÏ'*Ÿˆ*›Œòé÷¹oùó?Ì+zu4›NÜX"îq'«õV0­A$bCçü¶
+kø4ºb7э«è¶Õ-«[Gd]	e»ß7îÏ33(@pßþ°?Ü‚¿Ô¥ëÝ–3Ûh!šh|·ïbOLÙ<ôŸ&MˆÉî{p52KµE7ø@oÞ{%%ïèâ9°Îò,Gp„	Ô[²P]1à þý
+ùÛ¼}­K¡¢qÆ…¶(d,@sH
+ce}HÀsûȸnšC–%/Žà™‚ÁH‰“5PF¦ ¯UñgÊ…Y‡‘ôf>ã³/*RÂÀZ¡Z;Ɔho¬Þ0$ßE4¾™Ñ3Ûµ%Ç”0Ø-C3>¼[ô	¢/â€Qо«b% XeËÁ¾á„
+ú²††9f?ýÿåû
+f×`šZV°¿;ƒy®eS¼æÔ>_ÐÇÔåžÅ÷ˆ£½—|‘€¥–ÖÁèÛ;ï5­]õug&ác‡BE©\äjF¿i›({8%Ë>ò®îœ—0w¶wÙùHúª»e~<p7lÈ/Q÷J½/™7”¬Jâu¹ï9W¦ú¥Xï²'Êg†/N>–O—sy*Vñ!Mï$Çö§˜S‡`Þá\ʳaiî‹bž&Çü¦RÀ9{j—ô).”úÛþús¼ŠB“%=”Âó™,Νé˜ÉÂGçpÏèù	ßm²n“&·§F*FÔ2LÂ’‚w”\9tÓÔ
+oF5ô½¿ªÙ_ÅáÓúàýŠÌâ&uÆÞ	c×þ±ÎeÞ¿;7O#FþmR€x?uq„)ÍN]`Ÿ‚!31Aà‰ÝuJ—sö1¸ëAë6^Á(¬Ä¼Ò¯]4ݳ{V·î
+¾q?Ÿå”Mېq8©ç-ÎØŒ–´bž.I2ï„.=Ž,ﶷ,C¶#(ɤ¡}´G5c6ªqÊ#˜·qPD¦?¿´M–Måc¦­ß;2aÞ½ÆÐ`H4Ð'1Î:ø2€Œ„éãA_År™	+Ê:øÄ÷Œ	žN\ŸÊ—sFáGFiÒk·}
+G7§Òµ(­£=Ÿ¬†µºz¿öèi¦ªFHÕæØ-‰ÝOI+xÒ|Ë׫|p¥´í±´*ØÓëá(^‰‰÷öšK^¹ÌR%LdÛ«|˜w›4±ªÿ“×_9 A:ô‰Uué9’¢íÚˆòÀìÎIÛ,Ž]]H$–M$e6 óiçQú¹.©Þq<#ЖB–YAP‰ t›=0ƒ³§:²råÈ[Ꝃà!ÀâìP/M)Z]¿‹4µï¨ÿËP.£Dó,êþ·œ)xuÆYÆŒQU?g ‘€úªM™«åÈŠøþ¢'í(¼H*¶H°Û!²?x}›¹ Ufáá9ð–1fÂ5§ðï·ŒÓóË1%+
+ÖŠF7‡S}Ü‘]Îd?‚“%ÄtÚæʲš8yIQÙ3Ö]©‹~Á)䞬cr
+Úî9†s_Ž®Ï½q Gðü@o|²
+ú„$/U qg”ËqèM×Kré"mÓÅshw7¸ýšª9nþ`3p—á‚Í@«óÀkÒƤ5ô~íí<»4Çj{·gÌw±ÕœàÌNðO	YëøŠêø_Îz‰£»¥þÀy²~‚°{{´€o~B_¥ü˜a½¢pL„ËBâ«Ž¸(~J÷kï®%×:¨»kߙַ+ꕃéJ´Ñ¼eøß”„ÐlöÖ¯|þk·<Àvp½^M€–«í3—úâ(
+v4tÉöùl8öÆE­·±mˇFYN ¢-a';–3S$ÔcWÕVm}çÍА1k
+Ä@M,^ÝFçábt(€à¹¯ÁtIú7zÙªÊè´„RQ¦%gßÌIT´®è2â:vSá¸c3
+ Éß$àɹ›J4vT÷ð2µ9^dífeÓ袩UZ\èxÖÛ|‘AðëŽÜliÌ/5Ëyšù"VçØïo,øÔ2xë³æ}Œ<
+*{u*F”V´˜[#A¿Eµyû…HÒùpmçFË:ƒÒÏÙ'ˆŒÂ˜S«?²
+ù#˜
+ñ´M†Ù:)jVšrÓã|š™ÉEÐmˆ»$­¦	6—wTëĺ^`©/€R'æ,èª"¹BœÔÙ
+\]Ú¼ö»£×ÇwS}ÛàiëpVX¦M“î6)í2Üà=X	ž“iÝø¦,zC¹)‹ñMÈߣSBÕ$1ã4*š¤¦u¤¡¤¿Šù˜	é݈^0¬çCSâÀ¹…lôQ¡£Ë%SÈnJ¶riU7ÃUMu¦ûA©Vmˆk’+IRÏÍ|·_`p	åßzYîd»×·Ü[P:ásïVU,™!`ÂGÛÎo¡è"s8^~h<nžTuR£kcAþú__}•É¯küäºÅ(µ¿cëöȼvíï¡Ö¢Š9ÿôvAy =qÜ›ê#­KæÀøœ.­0mŒÍÇË¡òpÚFZ)l¼mé	Ôïd†üí>¿×Of}b—«Ä@€‚ïצ+ù/Ÿf¢,(MÎ}òUâ—>1	à°ã­ûµ’åÊÞÞÂhTšèõÐ… Ίäï@6®u[ï9G&¦f͸C¦·F^Þð.Cé¯÷¯¶µŒ~ÉáÞލxà.›X÷Îų¥°eû®r«ãXA趧†¨°m³?Ã8*Çû¢ÐÔ¿Þ£8á{¾£aK*6E;oΏT)Q¨®Vw;IVìï‚N_¾Î‡œu+d´i§â‡ƒ9“!ç`#?2Þæ@Íž5Óc2˜ækÊŸw¬@‘Cëî*Dz}´JØVþd¤n½B7h4nŸÞ©¡4åü&S#«Ò$æ~ѸÑå{bÐ9SJ¡wk‘jTzî=‰¦p at eÁ3¦»
+7ôm¾^m™¢,¨6¹a‚ÍœÛÁG‰F1‘Ü·ìECjêðƒóiýœ¾hõ?(p=G—%‘cITŽ£ÒåË’¦©ñ£QÛš~ïè Ÿ®iöUÓüzYîJæöéAŒ¯˜ãÕ­>¹—^}ý¢4ù1ã¸Nál„¿,ç“êã+óÏ£×.#H†¯Ýñœ¢¬f/*˜òCÅ øÝÝútÈ s%e£„ÖæIetLWÿ›_º½Æ2Äè\	¿6¢²ÇJø#k°Ã(?J…$•Sf‡ŠÝ÷>º‹þê1wÑ÷DÖ?chÒænç¹ñˆ–àç„ŸÀ¦}ÿtùÉÿ jN#
 endstream
 endobj
 254 0 obj <<
@@ -1879,27 +1871,29 @@
 /ProcSet [ /PDF /Text ]
 >> endobj
 445 0 obj <<
-/Length 2102      
+/Length 2103      
 /Filter /FlateDecode
 >>
 stream
-xÚÝYYÛ6~ϯ0Ú‡È@¬H$uh‹4m‚éµ] (’>ȶÖVÖ–\ÉÞMþ}ç"EÙÞÍnö¡\ñ‡3ßôF“Õ$š¼~É÷›Ë'Ï_¥jR„EªÒÉåÕ$Žã06ñ$3i˜çùär9y”ÓY¢t0ŸþyùÃd¦Ò0ŽÔd”E’0ÅÛiÄОAû“©cûÁM‘§¹“+þ¤#r»“kû¹ƒÜŒÉýÜAžŒÉûò篲ÔSnÎÂ4Ѽù+¦\ÀÞ
-´Z/í]”DðI¹Ëê(‚ÏyC³h[h´Z
-m1,·Ðö<Ä•††L½r»HÀ‘­€jl¹ÙgÂéüÙ1¬?ôÊßõ%4ß–sh_@ûZí
-¬Ó4³¿•›á¡×¤)še]y:Ü{â9ÒþZV×Âë0hêVtrO«¹ÕM9 {êú¡žýï nMÎÖ2YœX«¿áÏVö]‹iûÞb¿’ìõ/€þnnÿôÇ€·³èÞŠI¬RH¤82ètf‘‚¯	sSÀÙtæÓ3b%¡Òv½“+ì<‹,hNÃĨû8ÇQhKp·¶Z9ÕF’朊MòÎó<5õ,6Šs~[<ÞqÉ8Š2‰ÙJ¾Í=ʳg²ʉF¾¹°K¨=ØûIDËO‹ˆZÄ‹]{Tx@#ai¤oYrDô¸â³TÂÆÞz8‚
-V¨k†eWÓ*Œqµn«$x8iªN½<’%Á_Êæ‡Óô¸d‚r_É{¦&VÜß±h?)GšU5ÈCw´ò(J퓲Q$ÜP´‡®·£#+J9"Æž€LG²@r>º¶³nVL¯k	ï'¿¼€Á‹Ÿ†ã:^s3ÕìF_óò£Ø•‡:ù
-—˜'KÒH†ÐwÑvâƒÕbOV›%Ylᶌ3 ËÁU”=JÜL“4(ks曩Ü0Ú†y_Ì^MsÐ	«aw|œæÚžF’UÝÀŽËG¨«êÆÍ–>aS¼á.(]²YIZÁ½Ä`ÉU
-³°‚œqêI–°_kWbÚªaŒLÛkœQAßn+î ·'´¶+ %R––Ã
-Qª£ù¶jp‚írB³0Ö©‡Q%ýžÀñ]û›LêÂØ¿dLÀŸP|©Äd¶9ëiÚeÁ•Üi™o*†è-þ5ƒ÷·ÙŽBy£3|ih菠úS+
-Z]å[Q dX-î¬G9CÒ‹%ª¼Sqt¼ÇÛ‚½Ø^ðØääšÕ-ö­»T¼€&" îl8×^1¡õ_ìóšœf%ûKÇ+n)
-î½\Û0Qm»YðR¶	6qêÐâÎ/ä&
-€œ3§öëÝÌeö–§FÉÃ|@^ÿ€GR|ÀCȇû‘0§§¤Q˜$ÅCé÷bçƒ=è`ÞßkcxT˜PÅ	áGÅÅã­ÌÁn£Šó–‚y¦¯zlÄ@P‰F¸€¶Xã’)V<{»f:0ÌšgjQtI•rA¾.Þð=´~ÅÚÅH2F50™S ª;JbuUyu“o™Ðdæ^Ãd‘3ܝöEwUŽÍo at 5³è¡?e
-q*JTÈ«~½Z“–\²é¤€š-‡ã9Þë£X4šÄ“ÍŠ‹×O&o)€^pÄx5…ˆ®:ø•g4å±Ð–À÷lT\“œÆV=Š­ÞäÍ‚Ýr
-‡ÝØš¢¶¥¸„Å„‰4|ã^#Ážqìü‘«a«Kîÿ^7˸í”ìÿÀôJ©Å¯™‰L+µ9Îh5›»ŠfJ<;©9^Âün¢Ô¦PšsÆÜËAÀsgiªè¥´& ÉK7KVÄîË,nF‡ŽKËÇ/ˆ¼“NÓž«Q{¨ÊT
-…ˆOU Õ€Àøæ¸#Bp5#6 ڍìEt¥}«`(@~—ŸÊÏ™‡!ã0ÄU"Uq͵‡¦§ºV6R’5˜¢~_—èòRƾ°\¶BÈ/œæw‘&…"«ÀÑ yÅuÔøP*èAÄ׏¬ÄÖOˆ°ä²ð¤ÈÅH øµõ’:Ÿ¿$ú»ê^81bîŒH2T3{¯(¯+Áçî4€{Àk~m£2ˆ1PËĶ¼¦ÊìÊ\¥xØ•ç‡äš3¸\nï¸Ì6F»Üã#­÷jÞ—йs‘©ÀéW©„MWóÓ EvàärÈŒ…ƒ@'9©°å.1h÷""L\‘ç$CuƒýáΉÜ&Ûæž`
-œ^Rïê¹Ò=äGöáI\°ª¬N’#áa‰~= ÒADÉýtjï7®³É:(O1Ã7]¸Ÿ±³•4þæpªÂV”1ü"¥~\Ì ¹¼ÈuF'·4E Áˆ2£Ò ‡Çªg\:øþŠ	>’< —?ݨ\pkvE7&óGôNW»Š”–K^"5oGî«Mî¿ŠP•‰¼JY^”Í IÅÞHãÖÝË»zÝHA†Q~Tø>·h·ôl†SQ}Mmë y €£™à‰)Ö¹zûFÛñS‚9
-îE ÿ³ñð,…Å [XaÃ
-ï¿;Â3‚`ºZs at EÎá•ÜÆÖŒäÞ;©˜(,jã>áßT°Jô÷­{x‰Û±Oï+®ÄiÞ4,ͬª£²¥°0XVv?ŠùÜ&Þ%¯"ÝaË­<[ʽ<0|w¬\v÷«ñs`*Lá…;SÅðŸª8}wùäop#Á
+xÚÝYYÛ6~ϯ0Ú‡Ê@¬H$uh‹6m‚éµY (’>ȶÖV×–\ÉÞMþ}ç"EùØn
+´}Њ"‡ÃáÌ7—7š¬&Ñäå“HÞß\?yö"U“",R•N®o&q‡±‰'™IÃ<Ï'×ËÉÛ œÎ¥ƒùô÷ë&3•†q¤&3 ,’„)ÞNã †ç)<¿3ul_¸)òt WcrůtDîq×crm_È͘ÜØ×òdLžØ?{‘¥ž‚ps¦‰æÍ_2åönà)áéåy%¼R²:ŠàSÞÐÀìž-<<<5<‹a¹…gÏŸ¸ÒÐ'S¯Ü.pdA+ [Fnö‰p:v돽ò·@}
+oË9<ŸÃó<<¯ø`¦™½ø½Ü½%MÑ´(ëÆÓáÞÏ)öײº^‡AS÷ “{ZÍ­ÎhÊÙS×õìukr¶–ÉâÄZý¿¶²ïVLÛðû•d¯ô—¹ýSÐÞB΢{;(&±J!‘âÈ ;ЙE>
+¾&ÌMgÓ™Ÿ+	•¶ë\açYdAs§¬u&F=Ä9ŽB“X‚ËÚrhåTIšsþ)6}LÈ;ÏóÔÔ³ØDðQœóÛâã—Œ6
+e¹·’Ø­ÈÅ>ʳg0cY&B	ÛLÞæñÞO"ÆžˆJ¼>w¼âËÑä|xðEL…ÊÈé©<ÑãCȉs!‹…ó%k‚É çÚ€UÙÏ´
+ãBü,^±J‚—’¦êÖH"Yü‰Ø¨lr¨.MK&(çð–t°gj‚`Åã;‡ÆØ“r˜YUƒ<tA+Ò¡>)_E2Á™@Ëqèw;:²¢|#bì	Åt$$ç#šk.ëfÅԘÀ~"ñó+øøú§á¸ŽÄ_£ËÜM5ûÐW|…ü(på¡Îc¾Â5&É’4’¡ô^´8`µØ“ÕfI–[¸mHÖ²|YeAÙóG‰wÓ$
+ÊÚœùf*7̃¶aÞW³ÓÜtÂjX㦹¶§‘dU7p€ãòÑꪺs³å†OØ”o¸ÊE—lV’Sp/G0XreDÃ,¬ g<ºD’%ì×ÚÕ„¶j˜ãÓögTзۊGÈí	­
+h‰”E£¥åpC”ªÅP¾­œ`»\@hÆ:õ0ª£ß“8¸k“IB]Þ—Œ	øŠ/•˜É6g="MÂB»Ô± ¸’;íñ"óMŽ§¨¿fð¾ží(Ž÷ç1:Ã6CÃxÕŸZQÐâ èì*ߊ ÃjqM°u0&,r†ŒKTy§âèx·G±½à×``““kV÷8¶îRñšˆ ¸g°á\{ÄÖqLtÎ[rš•ì/¯,¸§¸÷mÃDµfÁsÙ&ØÄ©C?ˆ#8g¼›4 rN›Ú/v30c”Ù[^%ó!xýIñ!îGÂœž’Fa’=¤ß‹ö ƒ5zÿ ¡£0¡ŠŠ‹·2¸*Î[
+æQ˜¾êùc#zêXH4´ł—L±âÙû5ӁaÖ<S‹ú`Hª”C:ðvñ†?ÑCëwQ¬]Œ$cT“9¢Š°£$VW•W4ùvÑ‘	Mf4L9Ã]´/º«rl^ÕÌVŸ‡þ”)Ä©ÊP!¯ÞûÅjMJXr½¦“
+¶dŽçx¯bÑhO:4+®^>™¼¥ zÅãÅ"
+¸.èàWžÑ”Ç8û˜ ¾g£*àšüã4¶êQl¥ð&
+Ë)vgkŠÚÖár$îèó•kE ƒÞ?åØù#W'ÂV—<~S7˸ï•ìÃôJ©Å¯™‰L+…9Îh5›»rfJ<©9^Âün¢Ô¦PšsÆÜËAÀsgiª¨MZ¤ÍÇÍ’qøü
+‹›Ñ¡ãÒÁòñË"ïdдç
+Ôª2•Ba#âSÕ HA5 0~†9îˆ\͈
+€v#{Q]iȁÃïòïòsæaÈ8q•HU\së¡é³]+)É‚LQoÖå º…´É8–ËöQù…Ó<ðî1Ò¤PdU8ú@G^q5~”ÊA#ꁸàú‘•Øú	–\¶ž¹	¿¶^R'âó§DWÝ'FÌÅ€$C5³÷ŠR°ðº|îNC ¸´òk•AŒZ&¶å-UfçPæ*uÀî¤8?$„ÐœÁår{Çe¶1Úåi½Wö¼„Îu˜‹Lõ N¿J%lº
+˜[ف“Ë!3~ä¤Â–‡Ä Ý‹ˆ0qCž“Õ
+Ž‡;'rg˜l›‚5pzNU¼«çJ×È-ŽìÃI\°ª¬N’#áa‰~: ÒADÉýtjï7®³É:(O1Ã7]¸Ÿ±³•4þàpªÂV”1ü¥~Y̪µ`¹¼ÈuF'·4E Áˆ2£Ò ?Uϸ*tðý
+| øƒ:#nݨ\pkvE÷Mæè÷›®v)-—¼DjÞŽÜW›ÜïŠP•‰ôN¥,/Êf¤bo¤ïÖÝË»zÝHA†Q~Tø>·h·Ô6騾¦¶u4àh&øAbŠu®Þöh;n%˜Óà^Tú¿`),ÝÂ
+nèÿ.„§Átµæ€Š<œÃ+¹­ɽwR1Q:XÔ6ÆýSÀB*Ñ?þh]ãy$nÇ<ýQq%Nó~ a©hfUuÈ–ÂÂ`YÙý(æ3›x—¼Št‡-W´Ò¶”{i0|w¬\v÷›q;0‰¦ÐáÎT1ü›*NGDß]?ùR#3
 endstream
 endobj
 444 0 obj <<
@@ -3035,114 +3029,131 @@
 /FontFile 505 0 R
 >> endobj
 507 0 obj <<
-/Length1 1838
-/Length2 11345
+/Length1 1856
+/Length2 11465
 /Length3 0
-/Length 12497     
+/Length 12622     
 /Filter /FlateDecode
 >>
 stream
-xڍôPÚÒ
-ãw‡0¸»»»k 0È`ƒKpîA‚Kp×\!H ¸[p— #÷žs¿ÿ¯z¯¦jfV÷jY{wo:*M6)+'¼ÊÆÅÎ)QÓæâprò°srr£ÒÑé‚¡ ¿Í¨tú W7°Dø_Wúb“B_xjN€²»€‹ÀÅ/Ì% ÌÉ	àæäúÑÉU ô [ÔØÊN*Œ“³·+ØÆúRæ?Œ–L .!!Ö?ÃRŽ W°%PBmAŽ/- 'K0êý?)Em¡PgaOOOv £»“«8+ÀµhƒÜ@® +À‚ê@GÐ_ÊØQé º¶`·¿ì:NÖPO +ðbp [‚ n/î++à¥8 at GI á‚üEVý‹À
-øûl \ì\ÿM÷wô‰À?ƒ––NŽÎ@ˆ7b°;€ òªìP/(+ ±úƒtpsz‰z Á@‹ŸòRZ à‹À¿å¹Yº‚¡nìn`‡?$rü‘æå”å V2NŽŽ Ô
-õþdÁ® Ë—c÷æøëfí!Nžß¿5beý‡+wg=ØŤ$û7åÅ„úÍðqrr
-ñ@. —¥-Çéu½A:¹þ0¿(ð÷uvrX¿ˆ ùƒ­A/?¨¾n@ êêò÷ý·ã*À
-l	X€lÀÔ²¿˜AÖá—Ëw{Œ9_fÀùÇç¿ÿL^ÆËÊ	âàýýÏûåW”~#£Íò—âÿú¤¥¼ ¾l<¼ 6n>.€  @€àÿ¿Yþ«ÿ?Úÿ´jÁ÷ÆùOB%ˆµ@è/	/g÷OãßÃøß
-êN/£0þ3ùo9ù8-_¾¸þ?ÏÿŸ!ÿÿÆþ,ÿo“ÿ’wwpøÓÍø§ÿÿÇ
-t;xÿMx™dwèËV¨9½ìäÿR߀þÚd5ØÝñÿz• À—퐂Ø8ü÷Ánò`/•&jiû×ýç^Ò;€! M'7ðo
-€‹“óÿø^öÍÒþå=q{¹«?] —uúß’rK'«?öŽ› tuz£r¾Œ7À—ëeA­@^N6€ƒâ}	¼ÈóX;¹¢þq£ü| ©?L!A ‡ì‘€ €CíôâSÿ/äphÿ	½0ÿ ¦Åß²trxø/ïGÇ"þPÎaõ/Èà ýò 8lþ_âmÿ_$€ÿ_ê9ü
-8ÿ\/… ÿ‚/…œþiì…ûò|ÿËý¢Òù÷K¬óË
-q YCÿ±rýmýkÒÿ‰}éÒõ_ð¥K·A~ Ç?ä—Ûå€z:ýËý"Âã_ð¥1Ï ÷KIïxáú€\ÿŠþŸá°tw}éúçú¾LÎðŸ/4ä²DŸu²	µ«ý|[+EæɶýMlšnûM›ï¼k§û=&r*SMvðªëµTêH/öÒ¦ã•äå£ïA[#rD{²VÇo¿³DíÉíÔŸß	'Š¤(PÈÙt%wü]üôƒìáÛ`»”éò\Ü15ðn=û¼ÊÇÂg·µvjøUÐʧØbõbÞ•ÎÐå[äü ¦F‚²Q¼bÆ=õš¹ºžÆ͝x¦TNdAõ?Œå)ö5Z㎻ûá³\©ËíÖMBKbDL…;6Iï+½—¦L4ç[V¼ê:–þƒ°s|Ý1…ËaÑg[]ûÖuÿÜ”žnB˜‘„˜_é}Ìj»b’c)UoÎé’òª—Ò¹@›…«FøYÃA OMh»ç>·Ág™‘ Þ€9BÛ– µÒÇA›Û@Y¸m3ôK´òvÈryt¿©UÓ\Ž¢­3pÃ&»Þ3hY—jdÉkXiæLÙg*Òc“ÙÿôÒ2Ëi°kgÜÍÊ‘Ä6•®©)Xl¯¶=5W…ì=aC…ûµP"i,Mjvf^O“&ڐ™IýöSVÍ^Ç€'êmäÀ¯Mür½òg©šª<Álœ"Eäø¸»¸ˆõqwB…ïë²+¸ëÊ‘qOŒáoªz/Æ¿\œ˜²qŠ²—ÛèHc¡«;¤à}ÔHP=™Îã#3jìÃ.UigFô;–G
-}öí‹,D–Ïʱ®’|üíòŽH¼ÓŽÓ4Ýë ­^kà‰Á oÿèÝ~XÔg0	úˆ‰·Ñˆæ´a³ ŽPü¹îç’óîk® ýZXÿø!á’î•rà…§mÿœï»w¢ŽH?¸=ÆrÓîÃ	ÂløàƒÓ†O`PïBÈÉ„‚mc&Ž.f˜Dyt&‰1¬º*à”û`f‰T_»0¿¿ê¢#ÛõdàÊsº0U—õ(lŽùˆÍ®Ðߨùìetr\”Dè3õ›=Gç}²Ú%%Sø¢èHḴǣæ´m (—†Ù¶ÛrQGÿ°ü{mßæ¡ÅšÝ")üö99)ÿô7F®£f“Ãýf<=7¿¯¹³õ¬-VÑÍÄ6r,áÑæŒB­bâm‡:råæÙë:	ý̲)"¯©,б%™3¸dT½çÖ~ºÀR¯„V=a/\¿QÿSúSi”£V?žÿúO%¤ à6ƒl6Ü$5¥gáÙhkæ˯	«eéý4ü)‰¡$›R wó‰TIý¤éVK¹9Rü•a&û>8•%$æ‹2¢W
-ºpOáÎÒĉ¡¿öî„ÍжP@Í÷}较Þ=U¹	C„«Äo	fkÊÕ[¿„דŒr—
-=ƒ]’ˆè8û¬ Ÿ=ÐÑBô@¡Æµxßʦòǘ©\¦ß2*"ŒûQ:*ñ3)ô¢úĽOb‰ù®œSN[µsõnZÏñè‡8?·—á%3¤±­e}ªÄK„*=Ky1Ò®S-ÙPjÃ+êÀWˆh÷èÃé­JP9”ĪÍWNrÛàiì-²ã‡éö$ß7{N$¿c’hƒ/–yµš—¦o/`ºaŸõñÓ•²H¥%ªzw
-óÆ|¬ywIÑÚ¼_VÒLßëH½¢gËñêÕ‚=Ì‘2‡™wëÉüS¶™üˆÆ(Üó«Mßs^S­yè]fn8|Öô£cÒjÅt<mŸ«È¡ÀÅ£ÿDÝ­$¼TŽësË5£(«Oú€è÷nžÔÏW;¸ –¿¿ñãhºtz¼€Ò
-)rQDàpw:éc?ê¡”ý9CR€Mò†à/cùgv1ØcÀ8¥ùÇ)[çÊ©M¯Tqÿðz‰÷c8
-³<8²ÂéÁ¦ÍñMùÓ¹	Ìôm¼gÎ?]7¼bÖù@ð¯óâMm±²ì%ÏtÌÆâ¶)eLM‘ÆüšÙ\„$Û'WAÏ+(’uO%Èy-~ÑžjѮɖøB«šŒ[Eí;kDRˆ9’[xÓµ‰;ø¾TM"Ínë5̱ʓû3/…Ä„ÂãUF)·£0‰CÔuпSÑW!â%oоóûqãH'®Û9a_»þjßÕ=¬ÖPR
-Ýâþí9)–– Å¥§
-Eà“Èg4«b¤Ö%‡Q'”qÒ6îGôd½õ‹+÷nþ™Ù÷t¤†ºWÚ—1C¤vS0¹N³\jåÕ§x˜Óda§&Ž1óɐÝéÜé¸m‚ÞÖ¸Æ
-eTÌPiô÷cô†ÀµŠ(R‰ïl8	•´RH.DWDÒ{ø‰ñ#Ï(ÌoIBc]ÂcÄ×G❕ˆªèj_\z¤Žîøs5
-Á:THÕ¨,TÂRòã¼JK3IîÁfɼ_«sH¼4ã'¸`H#9øγdnϬ‹ÞÌXýÉäc?ŸöO6ãF¹ªC)e*7aD³TÁ¯¥Â1tD£§òa9·FõÉÇFËïågìì‹wâ轑ÓçÙâZ]ômdiC^ÕÛcm>Ì®Èp{™²Zk—7ló©!ü.QNÈÌÎ,ì×6vFy®¯m¡dñß$x„¹‹¡ógóÞôdò¨<E¯](O0j;äÙÕ¦1}‰?­‹dJqBî-’ª%<úñÕ¿±(§nÖà
-ðÓçÑfýNEóÆýEãŒu3Q!
-¹´«e×ÝJEƒ¹Š Þ£¯À‰ÜžÉõ©ÈQpŠê›¡6%ªºÔÆ.ÂóŠð3¢2Àúâ)œ³®›:i;>gÇòò’qXT«?2~¸†WYìåÙîÄ9;߯ªÐ°P–úÙðYÜ´WÈ#w:Á›™™AÉÚ:]-l¥Ns’\˜¢:M¶ÔöÊë£
-{°¢êÔFƒMÉz™ÙÄ|–‡Ôµ%´“G¤S= k…gÿ³4É‚¶ö^ÿl(¼ÜšÆëoËJ\QTtíW¬R*fÕhAægX+&YŸÀq(h ÏB
-}W×øE¼@ã„AÕÐýøJ›­ƒ±…J¹©Åè‹·Á*Jg•IÏÜ’ä{sà§;t¾£(˜	¶ødYÕF>3×yÅíý*›àҎ׮»¥ÁØ{6ã5štÉï½ •V¿ºÒº½òf¤-2FÛ'ò­–C™…?Þ:ÅZ™GH©ÝkZ„Æ„³AŠ#ök I&4MÅQƒ6ô#Ó ²ô*¬½4>+¼If
-9¾Œ:=]Û{’e.¡23&Ø»’1Zg™¬ÌÁ
-l–1ÆVµ8”Ÿ4ë¿OÒp΂Zʘ·ÿÈÛà̊믬ä«4”b`ØOŠäRÎDcB'­ÁK™…HÈ9ÇÅ­]p
[TRUNCATED]

To get the complete diff run:
    svnlook diff /svnroot/datatable -r 398


More information about the datatable-commits mailing list