RODBC/0000755000176000001440000000000013073621375011142 5ustar ripleyusersRODBC/po/0000755000176000001440000000000013013621651011547 5ustar ripleyusersRODBC/po/R-da.po0000644000176000001440000000704313013621651012676 0ustar ripleyusers# Danish translation r-rodbc. # Copyright (C) r-rodbc & nedenstående oversættere. # This file is distributed under the same license as the r-rodbc package. # Joe Hansen (joedalton2@yahoo.dk), 2011. # msgid "" msgstr "" "Project-Id-Version: R 2.12.0\n" "Report-Msgid-Bugs-To: bugs@r-project.org\n" "POT-Creation-Date: 2011-05-30 09:16\n" "PO-Revision-Date: 2011-05-28 18:30+01:00\n" "Last-Translator: Joe Hansen \n" "Language-Team: Danish \n" "Language: da\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "first argument is not an open RODBC channel" msgstr "første argument er ikke en åben RODBC-kanal" msgid "Argument 'channel' must inherit from class RODBC" msgstr "Argument »kanal« skal arve fra klasse RODBC" msgid "ODBC connection failed" msgstr "ODBC-forbindelse mislykkedes" msgid "Invalid case parameter: nochange | toupper | tolower | common db names" msgstr "Ugyldig case-parameter: nochange | toupper | tolower | common db names" msgid "no parameters, so nothing to update" msgstr "ingen parametre, så intet at opdatere" msgid "missing columns in 'data'" msgstr "mangler kolonner i »data«" msgid "argument is not an open RODBC channel" msgstr "argument er ikke en åben RODBC-kanal" msgid "argument 'driver' must be a character string" msgstr "argument »driver« skal være en tegnstreng" msgid "argument 'value' must be a named list of length >= 4" msgstr "argument »value« skal være en navngivet længdeliste >= 4" msgid "missing argument 'sqtable'" msgstr "mangler argument »sqtable«" msgid "table" msgstr "tabel" msgid "not found" msgstr "ikke fundet" msgid "destination argument is not an open RODBC channel" msgstr "målargument er ikke en åben RODBC-kanal" msgid "missing parameter" msgstr "manglende parameter" msgid "destination should be a name" msgstr "mål skal være et navn" msgid "should be a name" msgstr "skal være et navn" msgid "should be a data frame" msgstr "skal være en dataramme" msgid "already exists" msgstr "findes allerede" msgid "unable to append to table" msgstr "kan ikke tilføje til tabel" msgid "argument 'varTypes' has no names and will be ignored" msgstr "argument »varTypes« har intet navn og vil blive ignoreret" msgid "column(s)" msgstr "kolonner" msgid "," msgstr "," msgid "'dat' are not in the names of 'varTypes'" msgstr "»dat« er ikke i navnene på »varTypes«" msgid "invalid channel" msgstr "ugyldig kanal" msgid ": table not found on channel" msgstr ": tabel blev ikke fundet på kanal" msgid "dot.dot.dot names are not supported" msgstr "dot.dot.dot-navne er ikke understøttet" msgid "missing argument 'query'" msgstr "mangler argument »query«" msgid "invalid numeric 'as.is' expression" msgstr "ugyldigt numerisk »as.is-udtryk«" msgid "'as.is' has the wrong length" msgstr "»as.is« har forkert længde" msgid "!= cols =" msgstr "!= kol =" msgid "should be a data frame or matrix" msgstr "skal være en dataramme eller matrix" msgid "index column(s)" msgstr "indekskolonner" msgid "not in database table" msgstr "ikke i databasetabel" msgid "not in data frame" msgstr "ikke i dataramme" msgid "cannot update" msgstr "kan ikke opdatere" msgid "without unique column" msgstr "uden unik kolonne" msgid "data frame column(s)" msgstr "datarammekolonner" msgid "odbcConnectExcel is only usable with 32-bit Windows" msgstr "" msgid "odbcConnectAccess is only usable with 32-bit Windows" msgstr "" msgid "odbcConnectDbase is probably only usable with 32-bit Windows" msgstr "" RODBC/po/de.po0000644000176000001440000000632413013621651012504 0ustar ripleyusers# Translation of r-cran-rodbc to German # Copyright (C) 1997 - 2008 Michael Lapsley and Brian D. Ripley. # This file is distributed under the same license as the r-cran-rodbc package. # Chris Leick , 2010. # msgid "" msgstr "" "Project-Id-Version: r-cran-rodbc 1.3-1-2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-07-14 16:29+0100\n" "PO-Revision-Date: 2010-04-29 23:11+0100\n" "Last-Translator: Chris Leick \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: RODBC.c:156 msgid "[RODBC] ERROR: Could not SQLAllocStmt" msgstr "[RODBC] FEHLER: SQLAllocStmt war nicht möglich" #: RODBC.c:169 msgid "[RODBC] ERROR: Could not SQLAllocEnv" msgstr "[RODBC] FEHLER: SQLAllocEnv war nicht möglich" # FIXME s/:invalid/: invalid/ #: RODBC.c:220 msgid "[RODBC] ERROR:invalid connection argument" msgstr "[RODBC] FEHLER: Ungültiges Verbindungsargument" #: RODBC.c:289 #, c-format msgid "[RODBC] ERROR: state %s, code %d, message %s" msgstr "[RODBC] FEHLER: Status %s, Code %d, Nachricht %s" #: RODBC.c:292 msgid "[RODBC] ERROR: Could not SQLDriverConnect" msgstr "[RODBC] FEHLER: SQLDriverConnect war nicht möglich" #: RODBC.c:296 msgid "[RODBC] ERROR: Could not SQLAllocConnect" msgstr "[RODBC] FEHLER: SQLAllocConnect war nicht möglich" #: RODBC.c:389 msgid "[RODBC] ERROR: Failure in SQLPrimary keys" msgstr "[RODBC] FEHLER: Defekt in SQLPrimary-Schlüsseln" #: RODBC.c:434 msgid "[RODBC] ERROR: Failure in SQLColumns" msgstr "[RODBC] FEHLER: Defekt in SQLColumns" #: RODBC.c:470 msgid "[RODBC] ERROR: Failure in SQLSpecialColumns" msgstr "[RODBC] FEHLER: Defekt in SQLSpecialColumns" #: RODBC.c:524 RODBC.c:572 msgid "[RODBC] ERROR: SQLTables failed" msgstr "[RODBC] FEHLER: SQLTables fehlgeschlagen" #: RODBC.c:647 msgid "[RODBC] ERROR: SQLRowCount failed" msgstr "[RODBC] FEHLER: SQLRowCount fehlgeschlagen" #: RODBC.c:697 msgid "[RODBC] ERROR: SQLDescribeCol failed" msgstr "[RODBC] FEHLER: SQLDescribeCol fehlgeschlagen" #: RODBC.c:744 msgid "[RODBC] ERROR: SQLBindCol failed" msgstr "[RODBC] FEHLER: SQLBindCol fehlgeschlagen" #: RODBC.c:763 RODBC.c:795 RODBC.c:964 msgid "[RODBC] No results available" msgstr "[RODBC] Keine Ergebnisse verfügbar" #: RODBC.c:801 msgid "No Data" msgstr "Keine Daten" #: RODBC.c:865 #, c-format msgid "character data truncated in column '%s'" msgstr "Zeichendaten in Spalte »%s« gekürzt" #: RODBC.c:1113 msgid "[RODBC] SQLBindParameter failed" msgstr "[RODBC] SQLBindParameter fehlgeschlagen" #: RODBC.c:1158 #, c-format msgid "character data '%s' truncated to %d bytes in column '%s'" msgstr "Zeichendaten »%s« auf %d Byte gekürzt in Spalte »%s«" #: RODBC.c:1175 msgid "[RODBC] Failed exec in Update" msgstr "[RODBC] Ausführen in Aktualisierung fehlgeschlagen" #: RODBC.c:1207 msgid "[RODBC] Error in SQLDisconnect" msgstr "[RODBC] Fehler in SQLDisconnect" #: RODBC.c:1212 msgid "[RODBC] Error in SQLFreeconnect" msgstr "[RODBC] Fehler in SQLFreeconnect" #: RODBC.c:1231 #, c-format msgid "closing unused RODBC handle %d\n" msgstr "nicht benutztes RODBC-Handle %d wird geschlossen\n" RODBC/po/RODBC.pot0000644000176000001440000000424413013621651013130 0ustar ripleyusers# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: RODBC 1.3-6\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-07-14 16:29+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #: RODBC.c:156 msgid "[RODBC] ERROR: Could not SQLAllocStmt" msgstr "" #: RODBC.c:169 msgid "[RODBC] ERROR: Could not SQLAllocEnv" msgstr "" #: RODBC.c:220 msgid "[RODBC] ERROR:invalid connection argument" msgstr "" #: RODBC.c:289 #, c-format msgid "[RODBC] ERROR: state %s, code %d, message %s" msgstr "" #: RODBC.c:292 msgid "[RODBC] ERROR: Could not SQLDriverConnect" msgstr "" #: RODBC.c:296 msgid "[RODBC] ERROR: Could not SQLAllocConnect" msgstr "" #: RODBC.c:389 msgid "[RODBC] ERROR: Failure in SQLPrimary keys" msgstr "" #: RODBC.c:434 msgid "[RODBC] ERROR: Failure in SQLColumns" msgstr "" #: RODBC.c:470 msgid "[RODBC] ERROR: Failure in SQLSpecialColumns" msgstr "" #: RODBC.c:524 RODBC.c:572 msgid "[RODBC] ERROR: SQLTables failed" msgstr "" #: RODBC.c:647 msgid "[RODBC] ERROR: SQLRowCount failed" msgstr "" #: RODBC.c:697 msgid "[RODBC] ERROR: SQLDescribeCol failed" msgstr "" #: RODBC.c:744 msgid "[RODBC] ERROR: SQLBindCol failed" msgstr "" #: RODBC.c:763 RODBC.c:795 RODBC.c:964 msgid "[RODBC] No results available" msgstr "" #: RODBC.c:801 msgid "No Data" msgstr "" #: RODBC.c:865 #, c-format msgid "character data truncated in column '%s'" msgstr "" #: RODBC.c:1113 msgid "[RODBC] SQLBindParameter failed" msgstr "" #: RODBC.c:1158 #, c-format msgid "character data '%s' truncated to %d bytes in column '%s'" msgstr "" #: RODBC.c:1175 msgid "[RODBC] Failed exec in Update" msgstr "" #: RODBC.c:1207 msgid "[RODBC] Error in SQLDisconnect" msgstr "" #: RODBC.c:1212 msgid "[RODBC] Error in SQLFreeconnect" msgstr "" #: RODBC.c:1231 #, c-format msgid "closing unused RODBC handle %d\n" msgstr "" RODBC/po/pl.po0000644000176000001440000000710213013621651012522 0ustar ripleyusers# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR The R Foundation # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: RODBC 1.3-5\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-07-14 16:29+0100\n" "PO-Revision-Date: 2012-06-26 19:38+0100\n" "Last-Translator: Łukasz Daniel \n" "Language-Team: Łukasz Daniel \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-SourceCharset: iso-8859-1\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2)\n" "X-Poedit-Language: polish\n" "X-Poedit-Country: POLAND\n" #: RODBC.c:156 msgid "[RODBC] ERROR: Could not SQLAllocStmt" msgstr "BŁĄD [RODBC]: Nie można wykonać SQLAllocStmt" #: RODBC.c:169 msgid "[RODBC] ERROR: Could not SQLAllocEnv" msgstr "BŁĄD [RODBC]: Nie można wykonać SQLAllocEnv" #: RODBC.c:220 msgid "[RODBC] ERROR:invalid connection argument" msgstr "BŁĄD [RODBC]: niepoprawny argument połączenia" #: RODBC.c:289 #, c-format msgid "[RODBC] ERROR: state %s, code %d, message %s" msgstr "BŁĄD [RODBC]: stan %s, kod %d, komunikat %s" #: RODBC.c:292 msgid "[RODBC] ERROR: Could not SQLDriverConnect" msgstr "BŁĄD [RODBC]: Nie można wykonać SQLDriverConnect" #: RODBC.c:296 msgid "[RODBC] ERROR: Could not SQLAllocConnect" msgstr "BŁĄD [RODBC]: Nie można wykonać SQLAllocConnect" #: RODBC.c:389 msgid "[RODBC] ERROR: Failure in SQLPrimary keys" msgstr "BŁĄD [RODBC]: Niepowodzenie w kluczach SQLPrimary" #: RODBC.c:434 msgid "[RODBC] ERROR: Failure in SQLColumns" msgstr "BŁĄD [RODBC]: Niepowodzenie w SQLColumns" #: RODBC.c:470 msgid "[RODBC] ERROR: Failure in SQLSpecialColumns" msgstr "BŁĄD [RODBC]: Niepowodzenie w SQLSpecialColumns" #: RODBC.c:524 RODBC.c:572 msgid "[RODBC] ERROR: SQLTables failed" msgstr "BŁĄD [RODBC]: SQLTables nie powiodło się" #: RODBC.c:647 msgid "[RODBC] ERROR: SQLRowCount failed" msgstr "BŁĄD [RODBC]: SQLRowCount nie powiodło się" #: RODBC.c:697 msgid "[RODBC] ERROR: SQLDescribeCol failed" msgstr "BŁĄD [RODBC]: SQLDescribeCol nie powiodło się" #: RODBC.c:744 msgid "[RODBC] ERROR: SQLBindCol failed" msgstr "BŁĄD [RODBC]: SQLBindCol nie powiodło się" #: RODBC.c:763 RODBC.c:795 RODBC.c:964 msgid "[RODBC] No results available" msgstr "[RODBC] Brak dostępnych wyników" #: RODBC.c:801 msgid "No Data" msgstr "Brak danych" #: RODBC.c:865 #, c-format msgid "character data truncated in column '%s'" msgstr "dane tekstowe obcięte w kolumnie '%s'" #: RODBC.c:1113 msgid "[RODBC] SQLBindParameter failed" msgstr "[RODBC] SQLBindParameter nie powiodło się" #: RODBC.c:1158 #, c-format msgid "character data '%s' truncated to %d bytes in column '%s'" msgstr "dane tekstowe '%s' obcięte do %d bajtów w kolumnie '%s'" #: RODBC.c:1175 msgid "[RODBC] Failed exec in Update" msgstr "[RODBC] Niepowodzenie w wykonaniu Update" #: RODBC.c:1207 msgid "[RODBC] Error in SQLDisconnect" msgstr "[RODBC] Błąd w SQLDisconnect" #: RODBC.c:1212 msgid "[RODBC] Error in SQLFreeconnect" msgstr "[RODBC] Błąd w SQLFreeconnect" #: RODBC.c:1231 #, c-format msgid "closing unused RODBC handle %d\n" msgstr "zamykanie nieużywanej obsługi RODBC %d\n" #~ msgid "[RODBC] ERROR: DBC driver claims there are < 0 columns!" #~ msgstr "BŁĄD [RODBC]: Sterownik DBC twierdzi, że jest < 0 kolumn!" #~ msgid "[RODBC] ERROR: DBC driver claims there are < 0 rows!" #~ msgstr "BŁĄD [RODBC]: Sterownik DBC twierdzi, że jest < 0 wierszy!" RODBC/po/R-de.po0000644000176000001440000000740313013621651012702 0ustar ripleyusers# Translation of r-cran-rodbc to German # Copyright (C) 1997 - 2008 Michael Lapsley and Brian D. Ripley. # This file is distributed under the same license as the r-cran-rodbc package. # Chris Leick , 2010. # msgid "" msgstr "" "Project-Id-Version: R 2.10.0\n" "Report-Msgid-Bugs-To: bugs@r-project.org\n" "POT-Creation-Date: 2011-05-30 09:16\n" "PO-Revision-Date: 2010-04-29 18:20+0100\n" "Last-Translator: Chris Leick \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgid "first argument is not an open RODBC channel" msgstr "erstes Argument ist kein offener RODBC-Kanal" msgid "Argument 'channel' must inherit from class RODBC" msgstr "Argument »channel« muss von der Klasse RODBC abgeleitet sein" msgid "ODBC connection failed" msgstr "ODBC-Verbindung fehlgeschlagen" msgid "Invalid case parameter: nochange | toupper | tolower | common db names" msgstr "" "Ungültiger Groß-/Kleinschreibungsparameter: nochange | toupper | tolower | " "common db names" msgid "no parameters, so nothing to update" msgstr "keine Parameter, daher nichts zu aktualisieren" msgid "missing columns in 'data'" msgstr "in »data« fehlen Spalten" msgid "argument is not an open RODBC channel" msgstr "Argument ist kein offener RODBC-Kanal" msgid "argument 'driver' must be a character string" msgstr "Argument »driver« muss eine Zeichenkette sein" msgid "argument 'value' must be a named list of length >= 4" msgstr "Argument »value« muss eine benannte Liste mit einer Länge >=4 sein" msgid "missing argument 'sqtable'" msgstr "Argument »sqtable« fehlt" msgid "table" msgstr "Tabelle" msgid "not found" msgstr "nicht gefunden" msgid "destination argument is not an open RODBC channel" msgstr "Zielargument ist kein offener RODBC-Kanal" msgid "missing parameter" msgstr "Parameter fehlt" msgid "destination should be a name" msgstr "Ziel sollte ein Name sein" msgid "should be a name" msgstr "sollte ein Name sein" # Konsistent mit r-foreign und r-nlme msgid "should be a data frame" msgstr "sollte ein Daten-Frame sein" msgid "already exists" msgstr "existiert bereits" msgid "unable to append to table" msgstr "es kann nicht angehängt werden an Tabelle" msgid "argument 'varTypes' has no names and will be ignored" msgstr "Argument »varTypes« hat keine Namen und wird ignoriert" msgid "column(s)" msgstr "Spalte(n)" msgid "," msgstr "," msgid "'dat' are not in the names of 'varTypes'" msgstr "»dat« nicht in den Namen von »varTypes« enthalten" msgid "invalid channel" msgstr "ungültiger Kanal" msgid ": table not found on channel" msgstr ": Tabelle auf Kanal nicht gefunden" msgid "dot.dot.dot names are not supported" msgstr "" msgid "missing argument 'query'" msgstr "Argument »query« fehlt" msgid "invalid numeric 'as.is' expression" msgstr "ungültiger numerischer »as.is«-Ausdruck" msgid "'as.is' has the wrong length" msgstr "»as.is« hat falsche Länge" msgid "!= cols =" msgstr "!= Spalten =" msgid "should be a data frame or matrix" msgstr "sollte ein Daten-Frame oder eine Matrix sein" msgid "index column(s)" msgstr "Indexspalte(n)" msgid "not in database table" msgstr "nicht in Datenbanktabelle" msgid "not in data frame" msgstr "nicht im Daten-Frame" msgid "cannot update" msgstr "es kann nicht aktualisiert werden" msgid "without unique column" msgstr "ohne eindeutige Spalte" msgid "data frame column(s)" msgstr "Daten-Frame-Spalte(n)" msgid "odbcConnectExcel is only usable with 32-bit Windows" msgstr "" msgid "odbcConnectAccess is only usable with 32-bit Windows" msgstr "" msgid "odbcConnectDbase is probably only usable with 32-bit Windows" msgstr "" RODBC/po/R-RODBC.pot0000644000176000001440000000436713013621651013335 0ustar ripleyusersmsgid "" msgstr "" "Project-Id-Version: RODBC 1.3-6\n" "POT-Creation-Date: 2012-07-14 16:29\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" msgid "first argument is not an open RODBC channel" msgstr "" msgid "Argument 'channel' must inherit from class RODBC" msgstr "" msgid "ODBC connection failed" msgstr "" msgid "Invalid case parameter: nochange | toupper | tolower | common db names" msgstr "" msgid "no parameters, so nothing to update" msgstr "" msgid "missing columns in 'data'" msgstr "" msgid "argument is not an open RODBC channel" msgstr "" msgid "argument 'driver' must be a character string" msgstr "" msgid "argument 'value' must be a named list of length >= 4" msgstr "" msgid "missing argument 'sqtable'" msgstr "" msgid "table" msgstr "" msgid "not found" msgstr "" msgid "destination argument is not an open RODBC channel" msgstr "" msgid "missing parameter" msgstr "" msgid "destination should be a name" msgstr "" msgid "should be a name" msgstr "" msgid "should be a data frame" msgstr "" msgid "already exists" msgstr "" msgid "unable to append to table" msgstr "" msgid "argument 'varTypes' has no names and will be ignored" msgstr "" msgid "column(s)" msgstr "" msgid "," msgstr "" msgid "'dat' are not in the names of 'varTypes'" msgstr "" msgid "invalid channel" msgstr "" msgid ": table not found on channel" msgstr "" msgid "dot.dot.dot names are not supported" msgstr "" msgid "missing argument 'query'" msgstr "" msgid "invalid numeric 'as.is' expression" msgstr "" msgid "'as.is' has the wrong length" msgstr "" msgid "!= cols =" msgstr "" msgid "should be a data frame or matrix" msgstr "" msgid "index column(s)" msgstr "" msgid "not in database table" msgstr "" msgid "not in data frame" msgstr "" msgid "cannot update" msgstr "" msgid "without unique column" msgstr "" msgid "data frame column(s)" msgstr "" msgid "odbcConnectExcel is only usable with 32-bit Windows" msgstr "" msgid "odbcConnectAccess is only usable with 32-bit Windows" msgstr "" msgid "odbcConnectDbase is probably only usable with 32-bit Windows" msgstr "" RODBC/po/da.po0000644000176000001440000000570413013621651012501 0ustar ripleyusers# Danish translation rodbc. # Copyright (C) rodbc & nedenstående oversættere. # This file is distributed under the same license as the rodbc package. # Joe Hansen (joedalton2@yahoo.dk), 2011. # msgid "" msgstr "" "Project-Id-Version: rodbc\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-07-14 16:29+0100\n" "PO-Revision-Date: 2011-05-28 18:30+01:00\n" "Last-Translator: Joe Hansen \n" "Language-Team: Danish \n" "Language: da\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: RODBC.c:156 msgid "[RODBC] ERROR: Could not SQLAllocStmt" msgstr "[RODBC] FEJL: Kunne ikke SQLAllocStmt" #: RODBC.c:169 msgid "[RODBC] ERROR: Could not SQLAllocEnv" msgstr "[RODBC] FEJL: Kunne ikke SQLAllocEnv" #: RODBC.c:220 msgid "[RODBC] ERROR:invalid connection argument" msgstr "[RODBC] FEJL: Ugyldigt forbindelsesargument" #: RODBC.c:289 #, c-format msgid "[RODBC] ERROR: state %s, code %d, message %s" msgstr "[RODBC] FEJL: tilstand %s, kode %d, besked %s" #: RODBC.c:292 msgid "[RODBC] ERROR: Could not SQLDriverConnect" msgstr "[RODBC] FEJL: Kunne ikke SQLDriverConnect" #: RODBC.c:296 msgid "[RODBC] ERROR: Could not SQLAllocConnect" msgstr "[RODBC] FEJL: Kunne ikke SQLAllocConnect" #: RODBC.c:389 msgid "[RODBC] ERROR: Failure in SQLPrimary keys" msgstr "[RODBC] FEJL: Fejl i SQLPrimary-nøgler" #: RODBC.c:434 msgid "[RODBC] ERROR: Failure in SQLColumns" msgstr "[RODBC] FEJL: Fejl i SQLColumns" #: RODBC.c:470 msgid "[RODBC] ERROR: Failure in SQLSpecialColumns" msgstr "[RODBC] FEJL: Fejl i SQLSpecialColumns" #: RODBC.c:524 RODBC.c:572 msgid "[RODBC] ERROR: SQLTables failed" msgstr "[RODBC] FEJL: SQLTables fejlede" #: RODBC.c:647 msgid "[RODBC] ERROR: SQLRowCount failed" msgstr "[RODBC] FEJL: SQLRowCount fejlede" #: RODBC.c:697 msgid "[RODBC] ERROR: SQLDescribeCol failed" msgstr "[RODBC] FEJL: SQLDescribeCol fejlede" #: RODBC.c:744 msgid "[RODBC] ERROR: SQLBindCol failed" msgstr "[RODBC] FEJL: SQLBindCol fejlede" #: RODBC.c:763 RODBC.c:795 RODBC.c:964 msgid "[RODBC] No results available" msgstr "[RODBC] Ingen resultater tilgængelige" #: RODBC.c:801 msgid "No Data" msgstr "Ingen data" #: RODBC.c:865 #, c-format msgid "character data truncated in column '%s'" msgstr "tegndata afkortet i kolonne »%s«" #: RODBC.c:1113 msgid "[RODBC] SQLBindParameter failed" msgstr "[RODBC] SQLBindParameter fejlede" #: RODBC.c:1158 #, c-format msgid "character data '%s' truncated to %d bytes in column '%s'" msgstr "tegndata »%s« afkortet til %d byte i kolonne »%s«" #: RODBC.c:1175 msgid "[RODBC] Failed exec in Update" msgstr "[RODBC] Kørsel fejlede under opdatering" #: RODBC.c:1207 msgid "[RODBC] Error in SQLDisconnect" msgstr "[RODBC] Fejl i SQLDisconnect" #: RODBC.c:1212 msgid "[RODBC] Error in SQLFreeconnect" msgstr "[RODBC] Fejl i SQLFreeconnect" #: RODBC.c:1231 #, c-format msgid "closing unused RODBC handle %d\n" msgstr "lukker ubrugt RODBC-håndtag %d\n" RODBC/po/R-pl.po0000644000176000001440000000756413013621651012735 0ustar ripleyusersmsgid "" msgstr "" "Project-Id-Version: RODBC 1.3-5\n" "Report-Msgid-Bugs-To: bugs@r-project.org\n" "POT-Creation-Date: 2012-06-27 09:31\n" "PO-Revision-Date: 2012-06-26 19:38+0100\n" "Last-Translator: Łukasz Daniel \n" "Language-Team: Łukasz Daniel \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: polish\n" "X-Poedit-Country: POLAND\n" "X-Poedit-SourceCharset: iso-8859-1\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2)\n" msgid "first argument is not an open RODBC channel" msgstr "pierwszy argument nie jest otwartym kanałem RODBC" msgid "Argument 'channel' must inherit from class RODBC" msgstr "Argument 'channel' musi dziedziczyć z klasy RODBC" msgid "ODBC connection failed" msgstr "połączenie ODBC nie powiodło się" msgid "Invalid case parameter: nochange | toupper | tolower | common db names" msgstr "" "Niepoprawny parametr 'case': nochange | toupper | tolower | common db names" msgid "no parameters, so nothing to update" msgstr "brak parametrów, więc nic do zaktualizowania" msgid "missing columns in 'data'" msgstr "brakujące kolumny w 'data'" msgid "argument is not an open RODBC channel" msgstr "argument nie jest otwartym kanałem ODBC" msgid "argument 'driver' must be a character string" msgstr "argument 'driver' musi być łańcuchem tekstowym" msgid "argument 'value' must be a named list of length >= 4" msgstr "argument 'value' musi być nazwaną listą o długości >= 4" msgid "missing argument 'sqtable'" msgstr "brakujący argument 'sqtable'" msgid "table" msgstr "tablica" msgid "not found" msgstr "nie został znaleziony" msgid "destination argument is not an open RODBC channel" msgstr "pierwszy argument nie jest otwartym kanałem RODBC" msgid "missing parameter" msgstr "brakujący parametr" msgid "destination should be a name" msgstr "cel powinien być nazwą" msgid "should be a name" msgstr "powinien być nazwą" msgid "should be a data frame" msgstr "powinien być ramką" msgid "already exists" msgstr "już istnieje" msgid "unable to append to table" msgstr "nie można dołączyć do tabeli" msgid "argument 'varTypes' has no names and will be ignored" msgstr "argument 'varTypes' nie posiada nazw i będzie zignorowany" msgid "column(s)" msgstr "kolumny" msgid "," msgstr "," msgid "'dat' are not in the names of 'varTypes'" msgstr "'dat' nie są w nazwach 'varTypes'" msgid "invalid channel" msgstr "niepoprawny kanał" msgid ": table not found on channel" msgstr ": tabela nie została znaleziona na kanale" msgid "dot.dot.dot names are not supported" msgstr "nazwy kropka.kropka.kropka nie są wspierane" msgid "missing argument 'query'" msgstr "brakujący argument 'query'" msgid "invalid numeric 'as.is' expression" msgstr "niepoprawne wyrażenie liczbowe 'as.is'" msgid "'as.is' has the wrong length" msgstr "'as.is' posiada niepoprawną długość" msgid "!= cols =" msgstr "!= cols =" msgid "should be a data frame or matrix" msgstr "powinien być ramką lub macierzą" msgid "index column(s)" msgstr "kolumny indeksów" msgid "not in database table" msgstr "nie w tabeli bazy danych" msgid "not in data frame" msgstr "nie w ramce" msgid "cannot update" msgstr "nie można zaktualizować" msgid "without unique column" msgstr "bez unikalnej kolumny" msgid "data frame column(s)" msgstr "kolumny ramki" msgid "odbcConnectExcel is only usable with 32-bit Windows" msgstr "odbcConnectExcel jest używalne jedynie z 32-bitowym systemem Windows" msgid "odbcConnectAccess is only usable with 32-bit Windows" msgstr "odbcConnectAccess jest używalne jedynie z 32-bitowym systemem Windows" msgid "odbcConnectDbase is probably only usable with 32-bit Windows" msgstr "" "odbcConnectDbase jest prawdopodobnie używalne jedynie z 32-bitowym systemem " "Windows" RODBC/inst/0000755000176000001440000000000013073621042012106 5ustar ripleyusersRODBC/inst/po/0000755000176000001440000000000013013621651012524 5ustar ripleyusersRODBC/inst/po/pl/0000755000176000001440000000000013013621651013137 5ustar ripleyusersRODBC/inst/po/pl/LC_MESSAGES/0000755000176000001440000000000013013621651014724 5ustar ripleyusersRODBC/inst/po/pl/LC_MESSAGES/RODBC.mo0000644000176000001440000000540213013621651016113 0ustar ripleyusers ($:%_)$)+ *$K!p,) (Hf8'$ >3J/~04*3?1s-1. ,4 -a 1   ( !) +K 9w & )      No Data[RODBC] ERROR: Could not SQLAllocConnect[RODBC] ERROR: Could not SQLAllocEnv[RODBC] ERROR: Could not SQLAllocStmt[RODBC] ERROR: Could not SQLDriverConnect[RODBC] ERROR: Failure in SQLColumns[RODBC] ERROR: Failure in SQLPrimary keys[RODBC] ERROR: Failure in SQLSpecialColumns[RODBC] ERROR: SQLBindCol failed[RODBC] ERROR: SQLDescribeCol failed[RODBC] ERROR: SQLRowCount failed[RODBC] ERROR: SQLTables failed[RODBC] ERROR: state %s, code %d, message %s[RODBC] ERROR:invalid connection argument[RODBC] Error in SQLDisconnect[RODBC] Error in SQLFreeconnect[RODBC] Failed exec in Update[RODBC] No results available[RODBC] SQLBindParameter failedcharacter data '%s' truncated to %d bytes in column '%s'character data truncated in column '%s'closing unused RODBC handle %d Project-Id-Version: RODBC 1.3-5 Report-Msgid-Bugs-To: POT-Creation-Date: 2012-07-14 16:29+0100 PO-Revision-Date: 2012-06-26 19:38+0100 Last-Translator: Łukasz Daniel Language-Team: Łukasz Daniel Language: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Poedit-SourceCharset: iso-8859-1 Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2) X-Poedit-Language: polish X-Poedit-Country: POLAND Brak danychBŁĄD [RODBC]: Nie można wykonać SQLAllocConnectBŁĄD [RODBC]: Nie można wykonać SQLAllocEnvBŁĄD [RODBC]: Nie można wykonać SQLAllocStmtBŁĄD [RODBC]: Nie można wykonać SQLDriverConnectBŁĄD [RODBC]: Niepowodzenie w SQLColumnsBŁĄD [RODBC]: Niepowodzenie w kluczach SQLPrimaryBŁĄD [RODBC]: Niepowodzenie w SQLSpecialColumnsBŁĄD [RODBC]: SQLBindCol nie powiodło sięBŁĄD [RODBC]: SQLDescribeCol nie powiodło sięBŁĄD [RODBC]: SQLRowCount nie powiodło sięBŁĄD [RODBC]: SQLTables nie powiodło sięBŁĄD [RODBC]: stan %s, kod %d, komunikat %sBŁĄD [RODBC]: niepoprawny argument połączenia[RODBC] Błąd w SQLDisconnect[RODBC] Błąd w SQLFreeconnect[RODBC] Niepowodzenie w wykonaniu Update[RODBC] Brak dostępnych wyników[RODBC] SQLBindParameter nie powiodło siędane tekstowe '%s' obcięte do %d bajtów w kolumnie '%s'dane tekstowe obcięte w kolumnie '%s'zamykanie nieużywanej obsługi RODBC %d RODBC/inst/po/pl/LC_MESSAGES/R-RODBC.mo0000644000176000001440000000774713013621651016330 0ustar ripleyusers)d; (0F9,44%= c q{1#+/?"Or# 4(<]3 7&M t '~ "  * 2 K) $u 1 < : (R {  2  , 2$ W i '|     .= T`FyTE["p  !# &%$  "( )' != cols ='as.is' has the wrong length'dat' are not in the names of 'varTypes',: table not found on channelArgument 'channel' must inherit from class RODBCInvalid case parameter: nochange | toupper | tolower | common db namesODBC connection failedalready existsargument 'driver' must be a character stringargument 'value' must be a named list of length >= 4argument 'varTypes' has no names and will be ignoredargument is not an open RODBC channelcannot updatecolumn(s)data frame column(s)destination argument is not an open RODBC channeldestination should be a namedot.dot.dot names are not supportedfirst argument is not an open RODBC channelindex column(s)invalid channelinvalid numeric 'as.is' expressionmissing argument 'query'missing argument 'sqtable'missing columns in 'data'missing parameterno parameters, so nothing to updatenot foundnot in data framenot in database tableodbcConnectAccess is only usable with 32-bit WindowsodbcConnectDbase is probably only usable with 32-bit WindowsodbcConnectExcel is only usable with 32-bit Windowsshould be a data frameshould be a data frame or matrixshould be a nametableunable to append to tablewithout unique columnProject-Id-Version: RODBC 1.3-5 Report-Msgid-Bugs-To: bugs@r-project.org POT-Creation-Date: 2012-06-27 09:31 PO-Revision-Date: 2012-06-26 19:38+0100 Last-Translator: Łukasz Daniel Language-Team: Łukasz Daniel Language: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Poedit-Language: polish X-Poedit-Country: POLAND X-Poedit-SourceCharset: iso-8859-1 Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2) != cols ='as.is' posiada niepoprawną długość'dat' nie są w nazwach 'varTypes',: tabela nie została znaleziona na kanaleArgument 'channel' musi dziedziczyć z klasy RODBCNiepoprawny parametr 'case': nochange | toupper | tolower | common db namespołączenie ODBC nie powiodło sięjuż istniejeargument 'driver' musi być łańcuchem tekstowymargument 'value' musi być nazwaną listą o długości >= 4argument 'varTypes' nie posiada nazw i będzie zignorowanyargument nie jest otwartym kanałem ODBCnie można zaktualizowaćkolumnykolumny ramkipierwszy argument nie jest otwartym kanałem RODBCcel powinien być nazwąnazwy kropka.kropka.kropka nie są wspieranepierwszy argument nie jest otwartym kanałem RODBCkolumny indeksówniepoprawny kanałniepoprawne wyrażenie liczbowe 'as.is'brakujący argument 'query'brakujący argument 'sqtable'brakujące kolumny w 'data'brakujący parametrbrak parametrów, więc nic do zaktualizowanianie został znalezionynie w ramcenie w tabeli bazy danychodbcConnectAccess jest używalne jedynie z 32-bitowym systemem WindowsodbcConnectDbase jest prawdopodobnie używalne jedynie z 32-bitowym systemem WindowsodbcConnectExcel jest używalne jedynie z 32-bitowym systemem Windowspowinien być ramkąpowinien być ramką lub macierząpowinien być nazwątablicanie można dołączyć do tabelibez unikalnej kolumnyRODBC/inst/po/en@quot/0000755000176000001440000000000013013621651014137 5ustar ripleyusersRODBC/inst/po/en@quot/LC_MESSAGES/0000755000176000001440000000000013013621651015724 5ustar ripleyusersRODBC/inst/po/en@quot/LC_MESSAGES/RODBC.mo0000644000176000001440000000464313013621651017121 0ustar ripleyusers ($:%_)$)+ *$K!p,) (Hf8'W$|($%)$")G+q $!,%)R|@ +W       No Data[RODBC] ERROR: Could not SQLAllocConnect[RODBC] ERROR: Could not SQLAllocEnv[RODBC] ERROR: Could not SQLAllocStmt[RODBC] ERROR: Could not SQLDriverConnect[RODBC] ERROR: Failure in SQLColumns[RODBC] ERROR: Failure in SQLPrimary keys[RODBC] ERROR: Failure in SQLSpecialColumns[RODBC] ERROR: SQLBindCol failed[RODBC] ERROR: SQLDescribeCol failed[RODBC] ERROR: SQLRowCount failed[RODBC] ERROR: SQLTables failed[RODBC] ERROR: state %s, code %d, message %s[RODBC] ERROR:invalid connection argument[RODBC] Error in SQLDisconnect[RODBC] Error in SQLFreeconnect[RODBC] Failed exec in Update[RODBC] No results available[RODBC] SQLBindParameter failedcharacter data '%s' truncated to %d bytes in column '%s'character data truncated in column '%s'closing unused RODBC handle %d Project-Id-Version: RODBC 1.3-6 Report-Msgid-Bugs-To: POT-Creation-Date: 2012-07-14 16:29+0100 PO-Revision-Date: 2012-07-14 16:29+0100 Last-Translator: Automatically generated Language-Team: none Language: en MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); No Data[RODBC] ERROR: Could not SQLAllocConnect[RODBC] ERROR: Could not SQLAllocEnv[RODBC] ERROR: Could not SQLAllocStmt[RODBC] ERROR: Could not SQLDriverConnect[RODBC] ERROR: Failure in SQLColumns[RODBC] ERROR: Failure in SQLPrimary keys[RODBC] ERROR: Failure in SQLSpecialColumns[RODBC] ERROR: SQLBindCol failed[RODBC] ERROR: SQLDescribeCol failed[RODBC] ERROR: SQLRowCount failed[RODBC] ERROR: SQLTables failed[RODBC] ERROR: state %s, code %d, message %s[RODBC] ERROR:invalid connection argument[RODBC] Error in SQLDisconnect[RODBC] Error in SQLFreeconnect[RODBC] Failed exec in Update[RODBC] No results available[RODBC] SQLBindParameter failedcharacter data ‘%s’ truncated to %d bytes in column ‘%s’character data truncated in column ‘%s’closing unused RODBC handle %d RODBC/inst/po/en@quot/LC_MESSAGES/R-RODBC.mo0000644000176000001440000000714413013621651017317 0ustar ripleyusers)d; (0F9,44%= c q{1#+/?"Or# 4(<]3 76M 0   4 F4 {  0 8 8 %D j x  1  # + 6 F &V }    #  ) 4? <t 3  .4N !# &%$  "( )' != cols ='as.is' has the wrong length'dat' are not in the names of 'varTypes',: table not found on channelArgument 'channel' must inherit from class RODBCInvalid case parameter: nochange | toupper | tolower | common db namesODBC connection failedalready existsargument 'driver' must be a character stringargument 'value' must be a named list of length >= 4argument 'varTypes' has no names and will be ignoredargument is not an open RODBC channelcannot updatecolumn(s)data frame column(s)destination argument is not an open RODBC channeldestination should be a namedot.dot.dot names are not supportedfirst argument is not an open RODBC channelindex column(s)invalid channelinvalid numeric 'as.is' expressionmissing argument 'query'missing argument 'sqtable'missing columns in 'data'missing parameterno parameters, so nothing to updatenot foundnot in data framenot in database tableodbcConnectAccess is only usable with 32-bit WindowsodbcConnectDbase is probably only usable with 32-bit WindowsodbcConnectExcel is only usable with 32-bit Windowsshould be a data frameshould be a data frame or matrixshould be a nametableunable to append to tablewithout unique columnProject-Id-Version: RODBC 1.3-6 POT-Creation-Date: 2012-07-14 16:29 PO-Revision-Date: 2012-07-14 16:29 Last-Translator: Automatically generated Language-Team: none MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: en Plural-Forms: nplurals=2; plural=(n != 1); != cols =‘as.is’ has the wrong length‘dat’ are not in the names of ‘varTypes’,: table not found on channelArgument ‘channel’ must inherit from class RODBCInvalid case parameter: nochange | toupper | tolower | common db namesODBC connection failedalready existsargument ‘driver’ must be a character stringargument ‘value’ must be a named list of length >= 4argument ‘varTypes’ has no names and will be ignoredargument is not an open RODBC channelcannot updatecolumn(s)data frame column(s)destination argument is not an open RODBC channeldestination should be a namedot.dot.dot names are not supportedfirst argument is not an open RODBC channelindex column(s)invalid channelinvalid numeric ‘as.is’ expressionmissing argument ‘query’missing argument ‘sqtable’missing columns in ‘data’missing parameterno parameters, so nothing to updatenot foundnot in data framenot in database tableodbcConnectAccess is only usable with 32-bit WindowsodbcConnectDbase is probably only usable with 32-bit WindowsodbcConnectExcel is only usable with 32-bit Windowsshould be a data frameshould be a data frame or matrixshould be a nametableunable to append to tablewithout unique columnRODBC/inst/po/de/0000755000176000001440000000000013013621651013114 5ustar ripleyusersRODBC/inst/po/de/LC_MESSAGES/0000755000176000001440000000000013013621651014701 5ustar ripleyusersRODBC/inst/po/de/LC_MESSAGES/RODBC.mo0000644000176000001440000000515313013621651016073 0ustar ripleyusers ($:%_)$)+ *$K!p,) (Hf8'$ 2./$3T$0+) -4*b(0/ 7 3X # ' 9 & 19      No Data[RODBC] ERROR: Could not SQLAllocConnect[RODBC] ERROR: Could not SQLAllocEnv[RODBC] ERROR: Could not SQLAllocStmt[RODBC] ERROR: Could not SQLDriverConnect[RODBC] ERROR: Failure in SQLColumns[RODBC] ERROR: Failure in SQLPrimary keys[RODBC] ERROR: Failure in SQLSpecialColumns[RODBC] ERROR: SQLBindCol failed[RODBC] ERROR: SQLDescribeCol failed[RODBC] ERROR: SQLRowCount failed[RODBC] ERROR: SQLTables failed[RODBC] ERROR: state %s, code %d, message %s[RODBC] ERROR:invalid connection argument[RODBC] Error in SQLDisconnect[RODBC] Error in SQLFreeconnect[RODBC] Failed exec in Update[RODBC] No results available[RODBC] SQLBindParameter failedcharacter data '%s' truncated to %d bytes in column '%s'character data truncated in column '%s'closing unused RODBC handle %d Project-Id-Version: r-cran-rodbc 1.3-1-2 Report-Msgid-Bugs-To: POT-Creation-Date: 2012-07-14 16:29+0100 PO-Revision-Date: 2010-04-29 23:11+0100 Last-Translator: Chris Leick Language-Team: German Language: de MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); Keine Daten[RODBC] FEHLER: SQLAllocConnect war nicht möglich[RODBC] FEHLER: SQLAllocEnv war nicht möglich[RODBC] FEHLER: SQLAllocStmt war nicht möglich[RODBC] FEHLER: SQLDriverConnect war nicht möglich[RODBC] FEHLER: Defekt in SQLColumns[RODBC] FEHLER: Defekt in SQLPrimary-Schlüsseln[RODBC] FEHLER: Defekt in SQLSpecialColumns[RODBC] FEHLER: SQLBindCol fehlgeschlagen[RODBC] FEHLER: SQLDescribeCol fehlgeschlagen[RODBC] FEHLER: SQLRowCount fehlgeschlagen[RODBC] FEHLER: SQLTables fehlgeschlagen[RODBC] FEHLER: Status %s, Code %d, Nachricht %s[RODBC] FEHLER: Ungültiges Verbindungsargument[RODBC] Fehler in SQLDisconnect[RODBC] Fehler in SQLFreeconnect[RODBC] Ausführen in Aktualisierung fehlgeschlagen[RODBC] Keine Ergebnisse verfügbar[RODBC] SQLBindParameter fehlgeschlagenZeichendaten »%s« auf %d Byte gekürzt in Spalte »%s«Zeichendaten in Spalte »%s« gekürztnicht benutztes RODBC-Handle %d wird geschlossen RODBC/inst/po/de/LC_MESSAGES/R-RODBC.mo0000644000176000001440000000653013013621651016272 0ustar ripleyusers%D5l@ AK(h0F(?,N4{4%  #18j+"*D#V z + 5 " >C \   / E@ 8 % !   )' Q ,k   *    3 .C r    ,   * A #    "! %$!= cols ='as.is' has the wrong length'dat' are not in the names of 'varTypes',: table not found on channelArgument 'channel' must inherit from class RODBCInvalid case parameter: nochange | toupper | tolower | common db namesODBC connection failedalready existsargument 'driver' must be a character stringargument 'value' must be a named list of length >= 4argument 'varTypes' has no names and will be ignoredargument is not an open RODBC channelcannot updatecolumn(s)data frame column(s)destination argument is not an open RODBC channeldestination should be a namefirst argument is not an open RODBC channelindex column(s)invalid channelinvalid numeric 'as.is' expressionmissing argument 'query'missing argument 'sqtable'missing columns in 'data'missing parameterno parameters, so nothing to updatenot foundnot in data framenot in database tableshould be a data frameshould be a data frame or matrixshould be a nametableunable to append to tablewithout unique columnProject-Id-Version: R 2.10.0 Report-Msgid-Bugs-To: bugs@r-project.org POT-Creation-Date: 2011-05-30 09:16 PO-Revision-Date: 2010-04-29 18:20+0100 Last-Translator: Chris Leick Language-Team: German Language: de MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); != Spalten =»as.is« hat falsche Länge»dat« nicht in den Namen von »varTypes« enthalten,: Tabelle auf Kanal nicht gefundenArgument »channel« muss von der Klasse RODBC abgeleitet seinUngültiger Groß-/Kleinschreibungsparameter: nochange | toupper | tolower | common db namesODBC-Verbindung fehlgeschlagenexistiert bereitsArgument »driver« muss eine Zeichenkette seinArgument »value« muss eine benannte Liste mit einer Länge >=4 seinArgument »varTypes« hat keine Namen und wird ignoriertArgument ist kein offener RODBC-Kanales kann nicht aktualisiert werdenSpalte(n)Daten-Frame-Spalte(n)Zielargument ist kein offener RODBC-KanalZiel sollte ein Name seinerstes Argument ist kein offener RODBC-KanalIndexspalte(n)ungültiger Kanalungültiger numerischer »as.is«-AusdruckArgument »query« fehltArgument »sqtable« fehltin »data« fehlen SpaltenParameter fehltkeine Parameter, daher nichts zu aktualisierennicht gefundennicht im Daten-Framenicht in Datenbanktabellesollte ein Daten-Frame seinsollte ein Daten-Frame oder eine Matrix seinsollte ein Name seinTabellees kann nicht angehängt werden an Tabelleohne eindeutige SpalteRODBC/inst/po/da/0000755000176000001440000000000013013621651013110 5ustar ripleyusersRODBC/inst/po/da/LC_MESSAGES/0000755000176000001440000000000013013621651014675 5ustar ripleyusersRODBC/inst/po/da/LC_MESSAGES/RODBC.mo0000644000176000001440000000463513013621651016073 0ustar ripleyusers ($:%_)$)+ *$K!p,) (Hf8'X$ }($%)&'F&n $!-+Kw(&  5# "Y |      No Data[RODBC] ERROR: Could not SQLAllocConnect[RODBC] ERROR: Could not SQLAllocEnv[RODBC] ERROR: Could not SQLAllocStmt[RODBC] ERROR: Could not SQLDriverConnect[RODBC] ERROR: Failure in SQLColumns[RODBC] ERROR: Failure in SQLPrimary keys[RODBC] ERROR: Failure in SQLSpecialColumns[RODBC] ERROR: SQLBindCol failed[RODBC] ERROR: SQLDescribeCol failed[RODBC] ERROR: SQLRowCount failed[RODBC] ERROR: SQLTables failed[RODBC] ERROR: state %s, code %d, message %s[RODBC] ERROR:invalid connection argument[RODBC] Error in SQLDisconnect[RODBC] Error in SQLFreeconnect[RODBC] Failed exec in Update[RODBC] No results available[RODBC] SQLBindParameter failedcharacter data '%s' truncated to %d bytes in column '%s'character data truncated in column '%s'closing unused RODBC handle %d Project-Id-Version: rodbc Report-Msgid-Bugs-To: POT-Creation-Date: 2012-07-14 16:29+0100 PO-Revision-Date: 2011-05-28 18:30+01:00 Last-Translator: Joe Hansen Language-Team: Danish Language: da MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ingen data[RODBC] FEJL: Kunne ikke SQLAllocConnect[RODBC] FEJL: Kunne ikke SQLAllocEnv[RODBC] FEJL: Kunne ikke SQLAllocStmt[RODBC] FEJL: Kunne ikke SQLDriverConnect[RODBC] FEJL: Fejl i SQLColumns[RODBC] FEJL: Fejl i SQLPrimary-nøgler[RODBC] FEJL: Fejl i SQLSpecialColumns[RODBC] FEJL: SQLBindCol fejlede[RODBC] FEJL: SQLDescribeCol fejlede[RODBC] FEJL: SQLRowCount fejlede[RODBC] FEJL: SQLTables fejlede[RODBC] FEJL: tilstand %s, kode %d, besked %s[RODBC] FEJL: Ugyldigt forbindelsesargument[RODBC] Fejl i SQLDisconnect[RODBC] Fejl i SQLFreeconnect[RODBC] Kørsel fejlede under opdatering[RODBC] Ingen resultater tilgængelige[RODBC] SQLBindParameter fejledetegndata »%s« afkortet til %d byte i kolonne »%s«tegndata afkortet i kolonne »%s«lukker ubrugt RODBC-håndtag %d RODBC/inst/po/da/LC_MESSAGES/R-RODBC.mo0000644000176000001440000000636713013621651016276 0ustar ripleyusers&L5|P Q[(x0F8O,^44%  )31Hz#+"*C^x#  )/Ih_* " -? Fm   , < ;K %    )  ' -D r "     & A M ^ s $     $!   #" &%!= cols ='as.is' has the wrong length'dat' are not in the names of 'varTypes',: table not found on channelArgument 'channel' must inherit from class RODBCInvalid case parameter: nochange | toupper | tolower | common db namesODBC connection failedalready existsargument 'driver' must be a character stringargument 'value' must be a named list of length >= 4argument 'varTypes' has no names and will be ignoredargument is not an open RODBC channelcannot updatecolumn(s)data frame column(s)destination argument is not an open RODBC channeldestination should be a namedot.dot.dot names are not supportedfirst argument is not an open RODBC channelindex column(s)invalid channelinvalid numeric 'as.is' expressionmissing argument 'query'missing argument 'sqtable'missing columns in 'data'missing parameterno parameters, so nothing to updatenot foundnot in data framenot in database tableshould be a data frameshould be a data frame or matrixshould be a nametableunable to append to tablewithout unique columnProject-Id-Version: R 2.12.0 Report-Msgid-Bugs-To: bugs@r-project.org POT-Creation-Date: 2011-05-30 09:16 PO-Revision-Date: 2011-05-28 18:30+01:00 Last-Translator: Joe Hansen Language-Team: Danish Language: da MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit != kol =»as.is« har forkert længde»dat« er ikke i navnene på »varTypes«,: tabel blev ikke fundet på kanalArgument »kanal« skal arve fra klasse RODBCUgyldig case-parameter: nochange | toupper | tolower | common db namesODBC-forbindelse mislykkedesfindes alleredeargument »driver« skal være en tegnstrengargument »value« skal være en navngivet længdeliste >= 4argument »varTypes« har intet navn og vil blive ignoreretargument er ikke en åben RODBC-kanalkan ikke opdaterekolonnerdatarammekolonnermålargument er ikke en åben RODBC-kanalmål skal være et navndot.dot.dot-navne er ikke understøttetførste argument er ikke en åben RODBC-kanalindekskolonnerugyldig kanalugyldigt numerisk »as.is-udtryk«mangler argument »query«mangler argument »sqtable«mangler kolonner i »data«manglende parameteringen parametre, så intet at opdatereikke fundetikke i datarammeikke i databasetabelskal være en datarammeskal være en dataramme eller matrixskal være et navntabelkan ikke tilføje til tabeluden unik kolonneRODBC/inst/doc/0000755000176000001440000000000013073621042012653 5ustar ripleyusersRODBC/inst/doc/RODBC.Rnw0000644000176000001440000022053113013621651014177 0ustar ripleyusers\documentclass[a4paper,11pt]{article} \usepackage{hyperref,color,url,alltt,parskip} %\usepackage{Sweave} \usepackage{Rd} % mainly for upright quotes. \usepackage{graphicx} %\newcommand{\code}[1]{\texttt{#1}} %\newcommand{\pkg}[1]{\texttt{#1}} %\newcommand{\var}[1]{\emph{#1}} %\newcommand{\link}[1]{#1} %\newcommand{\sQuote}[1]{`#1'} \newenvironment{smallexample}{\begin{alltt}\scriptsize}{\end{alltt}} \newenvironment{example}{\begin{alltt}\small}{\end{alltt}} \setcounter{topnumber}{2} \def\topfraction{1.0} \setcounter{bottomnumber}{1} \def\bottomfraction{.3} \setcounter{totalnumber}{3} \def\textfraction{0} \def\floatpagefraction{0.8} \setcounter{dbltopnumber}{2} \usepackage{color} \definecolor{Blue}{rgb}{0,0,0.8} \hypersetup{% colorlinks,% plainpages=true,% linkcolor=black,% citecolor=black,% urlcolor=Blue,% pdfstartview=FitH,% pdfview={XYZ null null null},% %pdfpagemode=UseNone,% pdftitle={ODBC Connectivity for R},% pdfauthor={B. D. Ripley}% } \begin{document} %\VignetteIndexEntry{ODBC Connectivity} %\VignetteDepends{RODBC} %\VignetteKeywords{databases} %\VignetteKeywords{ODBC} %\VignettePackage{RODBC} %\SweaveOpts{engine=R,eps=FALSE} \title{ODBC Connectivity} \author{by Brian Ripley\\ Department of Statistics, University of Oxford\\ \url{ripley@stats.ox.ac.uk} } \maketitle \sloppy \noindent Package \pkg{RODBC} implements ODBC database connectivity. It was originally written by Michael Lapsley (St George's Medical School, University of London) in the early days of R (1999), but after he disappeared in 2002, it was rescued and since much extended by Brian Ripley. Version 1.0-1 was released in January 2003, and \pkg{RODBC} is nowadays a mature and much-used platform for interfacing R to database systems. Thanks to Marc Schwartz for contributing some of the experiences here. See also the archives of the \code{R-sig-db} mailing list. \section{ODBC Concepts} ODBC aims to provide a common API for access to SQL\footnote{SQL is a language for querying and managing data in databases---see \url{https://en.wikipedia.org/wiki/SQL}.}-based database management systems (DBMSs) such as MySQL\footnote{and its fork, MariaDB}, PostgreSQL, Microsoft Access and SQL Server, DB2, Oracle and SQLite. It originated on Windows in the early 1990s, but ODBC \emph{driver managers} \code{unixODBC} and \code{iODBC} are nowadays available on a wide range of platforms (and \code{iODBC} is used by macOS (aka OS X). The connection to the particular DBMS needs an \emph{ODBC driver}: these may come with the DBMS or the ODBC driver manager or be provided separately by the DBMS developers, and there are third-party\footnote{but there are close links between \code{unixODBC} and Easysoft, and \code{iODBC} and OpenLink.} developers such as Actual Technologies, Easysoft and OpenLink. (This means that for some DBMSs there are several different ODBC drivers available, and they can behave differently.) Microsoft provides drivers on Windows for non-SQL database systems such as DBase and FoxPro, and even for flat files and Excel spreadsheets. Actual Technologies sell a driver for macOS that covers (some) Excel spreadsheets and flat files. A connection to a specific database is called a \emph{Data Source Name} or DSN (see \url{https://en.wikipedia.org/wiki/Database_Source_Name}). See Appendix~B for how to set up DSNs on your system. One of the greatest advantages of ODBC is that it is a cross-platform client-server design, so it is common to run R on a personal computer and access data on a remote server whose OS may not even be known to the end user. This does rely on suitable ODBC drivers being available on the client: they are for the major cross-platform DBMSs, and some vendors provide `bridge' drivers, so that for example a `bridge' ODBC driver is run on a Linux client and talks to the Access ODBC driver on a remote Windows machine. ODBC provides an abstraction that papers over many of the differences between DBMSs. That abstraction has developed over the years, and \pkg{RODBC} works with ODBC version 3. This number describes both the API (most drivers nowadays work with API 3.51 or 3.52) and capabilities. The latter allow ODBC drivers to implement newer features partially or not at all, so some drivers are much more capable than others: in the main \pkg{RODBC} works with basic features. ODBC is a superset of the ISO/IEC 9075-3:1995 SQL/CLI standard. A somewhat biased overview of ODBC on Unix-alikes can be found at \url{https://www.easysoft.com/developer/interfaces/odbc/linux.html}. \section{Basic Usage} Two groups of functions are provided in \pkg{RODBC}. The mainly internal \code{odbc*} commands implement low-level access to C-level ODBC functions with similar\footnote{in most cases with prefix \code{SQL} replacing \code{odbc}.} names. The \code{sql*} functions operate at a higher level to read, save, copy and manipulate data between data frames and SQL tables. The two low-level functions which are commonly used make or break a connection. \subsection{Making a connection} ODBC works by setting up a \emph{connection} or \emph{channel} from the client (here \pkg{RODBC}) to the DBMSs as specified in the DSN. Such connections are normally used throughout a session, but should be closed explicitly at the end of the session---however \pkg{RODBC} will clear up after you if you forget (with a warning that might not be seen in a GUI environment). There can be many simultaneous connections. The simplest way to make a connection is \begin{example} library(RODBC) ch <- odbcConnect("\var{some\_dsn}") \end{example} and when you are done with it, \begin{example} close(ch) # or if you prefer odbcClose(ch) \end{example} The connection object \code{ch} is how you specify one of potentially many open connections, and is the first argument to all other \pkg{RODBC} functions. If you forget the details, printing it will give some summary information. If the DBMS user and password are needed and not stored in the DSN, they can be supplied by e.g.{} \begin{example} ch <- odbcConnect("\var{some\_dsn}", uid = "\var{user}", pwd = "\var{****}") \end{example} Users of the R GUI under Windows\footnote{This does not work from \code{Rterm.exe}.} have another possibility: if an incompletely specified DSN is given, the driver-specific Data Source dialog box will pop up to allow it to be completed. % Something about security here? More flexibility is available \emph{via} function \code{odbcDriverConnect}, which works with a \emph{connection string}. At its simplest it is \begin{example} "DSN=\var{dsn};UID=\var{uid};PWD=\var{pwd}" \end{example} but it can be constructed without a DSN by specifying a driver directly \emph{via} \code{DRIVER=}, and more (in some cases many more) driver-specific parameters can be given. See the documentation for the driver (and Appendix~A) for more details. \subsection{Reading from a database} where `database' can be interpreted very widely, including for example Excel spreadsheets and directories of flat files. The simplest and most common use of \pkg{RODBC} is to extract data from databases held on central database servers. Such access is read-only, and this can be enforced by settings in the DSN or \emph{via} permission settings (also known as \emph{privileges}) on the database. To find out what tables are accessible from a connection \code{ch}, use \begin{example} sqlTables(ch) \end{example} Some drivers will return all visible table-like objects, not just those owned by you. In that case you may want to restrict the scope by e.g.{} \begin{example} sqlTables(ch, tableType = "TABLE") sqlTables(ch, schema = "\var{some\_pattern}") sqlTables(ch, tableName = "\var{some\_pattern}") \end{example} The details are driver-specific but in most cases \code{\var{some\_pattern}} can use wildcards\footnote{these are the SQL wildcards used for example in \code{LIKE} clauses.} with \emph{underscore} matching a single character and \emph{percent} matching zero or more characters. Since underscore is a valid character in a table name it can be handled literally by preceding it by a backslash---but it is rarely necessary to do so. A table can be retrieved as a data frame by \begin{example} res <- sqlFetch(ch, "\var{table\_name}") \end{example} If it has many rows it can be retrieved in sections by \begin{example} res <- sqlFetch(ch, "\var{table\_name}", max = \var{m}) res <- sqlFetchMore(ch, "\var{table\_name}", max = \var{m}) \dots \end{example} It is often necessary to reduce the data to be transferred: we have seen how to subset rows, but it can be more effective to restrict the columns or to return only rows meeting some conditions. To find out what columns are available, use \code{sqlColumns}, for example \begin{smallexample} > sqlColumns(ch, "USArrests") TABLE\_CAT TABLE\_SCHEM TABLE\_NAME COLUMN\_NAME DATA\_TYPE TYPE\_NAME COLUMN\_SIZE 1 ripley USArrests State 12 varchar 255 2 ripley USArrests Murder 8 double 15 3 ripley USArrests Assault 4 integer 10 4 ripley USArrests UrbanPop 4 integer 10 5 ripley USArrests Rape 8 double 15 \dots \end{smallexample} Then an \emph{SQL Query} can be used to return part of the table, for example (MySQL on Linux) \begin{example} > sqlQuery(sh, paste("SELECT State, Murder FROM USArrests", + "WHERE Rape > 30 ORDER BY Murder")) State Murder 1 Colorado 7.9 2 Arizona 8.1 3 California 9.0 4 Alaska 10.0 5 New Mexico 11.4 6 Michigan 12.1 7 Nevada 12.2 8 Florida 15.4 \end{example} Note that although there are standards for SQL, all the major producers of DBMSs have their own dialects, so for example on the Oracle and DB2 systems we tested this query had to be given as \begin{example} > sqlQuery(ch, paste('SELECT "State", "Murder" FROM "USArrests"', + 'WHERE "Rape" > 30 ORDER BY "Murder"')) \end{example} or even in upper case. Describing how to extract data from databases is the \emph{forte} of the SQL language, and doing so efficiently is the aim of many of the DBMSs, so this is a very powerful tool. To learn SQL it is best to find a tutorial specific to the dialect you will use; for example Chapter~3 of the MySQL manual is a tutorial. A basic tutorial which covers some common dialects\footnote{MySQL, Oracle and Microsoft SQL Server.} can be found at \url{http://www.1keydata.com/sql/sql.html}: tutorials on how to perform common tasks in several commonly used DBMSs are available at \url{http://sqlzoo.net/}. % <<>>= % library(RODBC) % channel <- odbcConnect("test") % sqlSave(channel, USArrests, rownames = "State", verbose = TRUE) % sqlQuery(channel, paste("select State, Murder from USArrests", % "where Rape > 30 order by Murder")) % sqlFetch(channel, "USArrests", rownames = "State") % sqlDrop(channel, "USArrests") % close(channel) % @ \subsection{Table Names} SQL-92 expects both table and column names to be alphanumeric plus underscore, and \pkg{RODBC} does not in general support vendor extensions (for example Access allows spaces). There are some system-specific quoting schemes: Access and Excel allow table names to be enclosed in \code{[ ]} in SQL queries, MySQL (by default) quotes \emph{via} backticks, and most other systems use the ANSI SQL standard of double quotes. %More recent SQL standards allow \code{\$} and \code{\#} under some %circumstances. The \code{odbcConnnect} function allows the specification of the quoting rules for names \pkg{RODBC} itself sends, but sensible defaults\footnote{backticks for MySQL, \code{[ ]} for the Access and Excel convenience wrappers, otherwise ANSI double quotes.} are selected. Users do need to be aware of the quoting issue when writing queries for \code{sqlQuery} themselves. Note the underscore is a wildcard character in table names for some of the functions, and so may need to be escaped (by backslash) at times. Normally table names containing a period are interpreted as references to another schema (see below): this can be suppressed by opening the connection with argument \code{interpretDot = FALSE}. \subsection{Types of table} The details are somewhat DBMS-specific, but `tables' usually means `tables, views or similar objects'. In some systems `tables' are physical objects (files) that actually store data---Mimer calls these \emph{base tables}. For these other `tables' can be derived that present information to the user, usually called `views'. The principal distinctions between a (base) table and a view are \begin{itemize} \item Using \code{DROP} on a table removes the data, whereas using it on a view merely removes the convenient access to a representation of the data. \item The access permission (\emph{privilege}) of a view can be very different from those of a table: this is commonly used to hide sensitive information. \end{itemize} A view can contain a subset of the information available in a single table or combine information from two or more tables. Further, some DBMSs distinguish between tables and views generated by ordinary users and \emph{system tables} used by the DBMS itself. Where present, this distinction is reflected in the result of \code{sqlTable()} calls. Some DBMSs support \emph{synonyms} and/or \emph{aliases} which are simply alternative names for an existing table/view/synonym, often those in other schemas (see below). Typically tables, views, synonyms and aliases share a name space and so must have a name that is unique (in the enclosing schema where schemas are implemented). \section{Writing to a Database} To create or update a table in a database some more details need to be considered. For some systems, all table and column names need to be lower case (e.g.{} PostgreSQL, MySQL on Windows) or upper case (e.g.{} some versions of Oracle). To make this a little easier, the \code{odbcConnect} function allows a remapping of table names to be specified, and this happens by default for DBMSs where remapping is known to be needed. The main tool to create a table is \code{sqlSave}. It is safest to use this after having removed any existing table of the same name, which can be done by \begin{example} sqlDrop(ch, "\var{table\_name}", errors = FALSE) \end{example} Then in the simplest usage \begin{example} sqlSave(ch, \var{some\_data\_frame}) \end{example} creates a new table whose name is the name of the data frame (remapped to upper or lower case as needed) and with first column \code{rownames} the row names of the data frame, and remaining columns the columns of the data frame (with names remapped as necessary). For the many options, see the help page. \code{sqlSave} works well when asked to write integer, numeric and reasonable-length\footnote{which of course depends on the DBMS. Almost all have an implementation of \code{varchar} that allows up to 255 bytes or characters, and some have much larger limits. Calling \code{sqlTypeInfo} will tell you about the data type limits.} character strings to the database. It needs some help with other types of columns in mapping to the DBMS-specific types of column. For some drivers it can do a good job with date and date-time columns; in others it needs some hints (and e.g.{} for Oracle dates are stored as date-times). The files in the \code{RODBC/tests} directory in the sources and the installed file \code{tests.R} provide some examples. One of the options is the \code{fast} argument: the default is \code{fast = TRUE} which transfers data in binary format: the alternative is \code{fast = FALSE} which transfer data as character strings a row at a time---this is slower but can work better with some drivers (and worse with others). The other main tool for writing is \code{sqlUpdate} which is used to change rows in an existing table. Note that \pkg{RODBC} only does this in a simple fashion, and on up-market DBMSs it may be better to set cursors and use direct SQL queries, or at least to control transactions by calls to \code{odbcSetAutoCommit} and \code{odbcEndTran}. The basic operation of \code{sqlUpdate} is to take a data frame with the same column names (up to remapping) as some or all of the columns of an existing table: the values in the data frame are then used either to replace entries or to create new rows in the table. Rows in a DBMS table are in principle unordered and so cannot be referred to by number: the sometimes tricky question is to know what rows are to replaced. We can help the process by giving one or more \code{index} columns whose values must match: for a data frame the row names are often a good choice. If no \code{index} argument is supplied, a suitable set of columns is chosen based on the properties of the table. \subsection{Primary keys and indices} When a table is created (or afterwards) it can be given additional information to enable it to be used effectively or efficiently. \emph{Primary keys} are one (usually) or more columns that provide a reliable way to reference rows in the table: values of the primary key must be unique and not \code{NULL} (SQL parlance for `missing'). Primary keys in one table are also used as \emph{foreign keys} in another table: this ensure that e.g.{} values of \code{customer\_id} only take values which are included in the primary key column of that name in table \code{customers}. Support of foreign keys is patchy: some DBMSs (e.g,{} MySQL prior to 6.0) accept specifications but ignore them. \pkg{RODBC} allows primary keys to be set as part of the \code{sqlSave()} function when it creates a table: otherwise they can be set by \code{sqlQuery()} in DBMS-specific ways (usually by \code{ALTER TABLE}). Columns in a table can be declared as \code{UNIQUE}: primary keys and such columns are usually used as the basis for table indices, but other indices (sometimes called \emph{secondary indices}) can be declared by a \code{CREATE INDEX} SQL command. Whether adding primary keys or other indices has any effect on performance depends on the DBMS and the query. \section{Data types} This can be confusing: R has data types (including \code{character}, \code{double}, \code{integer} and various classes including \code{Date} and \code{POSIXct}), ODBC has both C and SQL data types, the SQL standards have data types and so do the various DBMSs \emph{and they all have different names} and different usages of the same names. Double- and single-precision numeric values and 32- and 16-bit integers (only) are transferred as binary values, and all other types as character strings. However, unless \code{as.is = TRUE}, \code{sqlGetResults} (used by all the higher-level functions to return a data frame) converts character data to a date/date-time class or \emph{via} \code{type.convert}. You can find out the DBMS names for the data types used in the columns of a table by a call to \code{sqlColumns}, and further information is given on those types in the result of \code{sqlTypeInfo}. For example in MySQL, \begin{smallexample} TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME COLUMN_SIZE 1 ripley USArrests State 12 varchar 255 2 ripley USArrests Murder 8 double 15 3 ripley USArrests Assault 4 integer 10 4 ripley USArrests UrbanPop 4 integer 10 5 ripley USArrests Rape 8 double 15 BUFFER_LENGTH DECIMAL_DIGITS NUM_PREC_RADIX NULLABLE REMARKS COLUMN_DEF 1 255 NA NA 0 '' 2 8 NA NA 1 3 4 0 10 1 4 4 0 10 1 5 8 NA NA 1 SQL_DATA_TYPE SQL_DATETIME_SUB CHAR_OCTET_LENGTH ORDINAL_POSITION IS_NULLABLE 1 12 NA 255 1 NO 2 8 NA NA 2 YES 3 4 NA NA 3 YES 4 4 NA NA 4 YES 5 8 NA NA 5 YES \end{smallexample} This gives the DBMS data by name and by number (twice, once the number used in the DBMS and once that used by SQL---they agree here). Other things of interest here are the column size, which gives the maximum size of the character representation, and the two columns about `nullable' which indicate if the column is allowed to contain missing values (SQL \code{NULL}s). The result of \code{sqlTypeInfo} has 19 columns and in the version of MySQL used here, 52 types. We show a small subset of the more common types: \begin{smallexample} > sqlTypeInfo(channel)[<...>, c(1:3,7,16)] TYPE_NAME DATA_TYPE COLUMN_SIZE NULLABLE SQL_DATATYPE 1 bit -7 1 1 -7 2 tinyint -6 3 1 -6 6 bigint -5 19 1 -5 18 text -1 65535 1 -1 19 mediumtext -1 16777215 1 -1 20 longtext -1 2147483647 1 -1 22 char 1 255 1 1 23 numeric 2 19 1 2 24 decimal 3 19 1 3 25 integer 4 10 1 4 37 smallint 5 5 1 5 41 double 6 15 1 6 43 float 7 7 1 7 45 double 8 15 1 8 47 date 91 10 1 9 48 time 92 8 1 9 49 year 5 4 1 5 50 datetime 93 21 1 9 51 timestamp 93 14 0 9 52 varchar 12 255 1 12 \end{smallexample} Note that there are both duplicate type names and duplicate type numbers. Most DBMSs started with their own data types and later mapped the standard SQL data types on to them, although these may only be partially implemented. Some DBMSs allow user-defined data types, for example enumerations. Commonly used data types fall into a number of groups: \begin{description} \item[Character types] Character types can be classified three ways: fixed or variable length, by the maximum size and by the character set used. The most commonly used types\footnote{the SQL names for these are \code{CHARACTER VARYING} and \code{CHARACTER}, but these are too cumbersome for routine use.} are \code{varchar} for short strings of variable length (up to some maximum) and \code{char} for short strings of fixed length (usually right-padded with spaces). The value of `short' differs by DBMS and is at least 254, often a few thousand---often other types will be available for longer character strings. There is a sanity check which will allow only strings of up to 65535 bytes when reading: this can be removed by recompiling \pkg{RODBC}. Many other DBMSs have separate types to hold Unicode character strings, often with names like \code{nvarchar} or \code{wvarchar}. Note that currently \pkg{RODBC} only uses the current locale for character data, which could be UTF-8 (and will be on macOS and in many cases on Linux and other Unix-alikes), but is never UCS-2 as used on Windows. So if character data is stored in the database in Unicode, it will be translated (with a possible loss of information) in non-Unicode locales. (This may change in future versions of \pkg{RODBC}.) Some DBMSs such as PostgreSQL and Microsoft SQL Server allow variable-length character strings of length only limited by resources. These do not fit well with the ODBC model that requires buffers to be allocated to transfer character data, and so such types may be subjected (by the ODBC driver) to a fixed limit or not work at all. \item[Integer types] Most DBMSs have types for 32-bit (\code{integer}, synomyn \code{int}) and 16-bit (\code{smallint}) integers. Some, including MySQL, also have unsigned versions and 1-bit, 8-bit and 64-bit integer types: these further types would usually be transferred as character strings and converted on reading to an \code{integer} or \code{double} vector. Type names \code{int2}, \code{int4} and \code{int8} are common as synonyms for the basic type names. The SQL standard does not require \code{integer} and \code{smallint} to be binary (rather than decimal) types, but they almost always are binary. Note that 64-bit integers will be transferred as character strings and read by \code{sqlGetResults} as character vectors or (for $2^{31} \le |x| < 2^{53}$) as \code{double} vectors. \item[Floating-point types] The basic SQL floating-point types are 8 and 7 for double- and single-precision binary types. The SQL names are \code{double precision} and \code{real}, but beware of the variety of names. Type~6 is \code{float} in the standard, but is used by some DBMSs\footnote{In Oracle the \code{FLOAT} type is a decimal and not a binary type.} for single-precision and by some for double-precision: the forms \code{float(24)} and \code{float(53)} are also commonly supported. You should not assume that these types can store \code{Inf}, \code{-Inf} or \code{NaN}, but they often can. \item[Other numeric types] It is common to store decimal quantities in databases (e.g.{} currency amounts) and types 2 and 3 are for decimals. Some DBMSs have specialized types to handle currencies, e.g.{} \code{money} in Microsoft SQL Server. Decimal types have a \emph{precision} (the maximum number of significant decimal digits) and \emph{scale} (the position of the decimal point). \code{numeric} and \code{decimal} are usually synonymous, but the distinction in the standards is that for \code{numeric} the precision is exact whereas for \code{decimal} the DBMS can use a larger value than that specified. % e.g. Mimer Some DBMSs have a type \code{integer(\var{p})} to represent up to \code{\var{p}} decimal digits, and this may or may not be distinct from \code{decimal(\var{p}, 0)}. % 'currently' is from 5.1.x DBMSs do not necessarily fully implement decimal types, e.g.{} MySQL currently stores them in binary and used to store them as character strings. \item[Dates and times] The handling of dates and times is very much specific to the DBMS. Some allow fractional seconds in date-times, and some do not; some store timezones with date-times or always use UTC and some do not, and so on. Usually there are also types for time intervals. All such types are transferred as character strings in \pkg{RODBC}. \item[Binary types] These are less common, and unsupported by \pkg{RODBC} prior to version 1.3-0. They parallel character types in that they are a sequence of bytes of fixed or variable length, sometimes with additional types for long sequences: there are separate ODBC types for \code{SQL\_BINARY}, \code{SQL\_VARBINARY} and \code{SQL\_LONGVARBINARY}. Binary types can currently only be read as such, and they are returned as column of class \code{"ODBC\_binary"} which is a list of raw vectors. \end{description} % An example is BOOLEAN in Mimer It is possible (but rare) for the DBMS to support data types that the ODBC driver cannot handle. \subsection{Data types when saving a data frame} When \code{sqlSave} creates a table, there is some choice as to the SQL data types used. The default is to select the SQL data type from the R type via the \code{typeInfo} argument to \code{sqlSave}. If this is not supplied (usual) a default mapping is looked up using \code{getSqlTypeInfo()} or by interrogating \code{\link{sqlTypeInfo()}}. This will almost always produce the correct mapping for numeric, integer and character columns of up to 254 characters (or bytes). In other cases (include dates and date-times) the desired SQL type can be specified for each column \emph{via} the argument \code{varTypes}, a named character vector with names corresponding to (some of) the names in the data frame to be saved. Only a very few DBMSs have a logical data type and the default mapping is to store R logical vectors as \code{varchar(5)}. For others DBMSs \code{BIT}, \code{TINYINT} or an enumeration type could be used (but the column may be need to be converted to and from a suitable representation). For example, in MySQL we could use \code{enum('FALSE', 'TRUE')}, but this is actually stored as \code{char(5)}. Note that to represent \code{NA} the SQL data type chosen needs to be nullable, which \code{BIT} often is not. (Mimer has a nullable data type \code{BOOLEAN} but this is not supported by the ODBC client.) \subsection{SQLite} SQLite's concept of `data type' is anomalous: version~3 does recognize types of data (in version~2 everything was a character string), but it does not have a fixed type for a column in a table (although the type specified in the \code{CREATE TABLE} statement is a `recommended' type for the values of that column). Every value is categorized as null, integer (of length 1, 2, 3, 4, 6 or 8 bytes), double, text (UTF-8 or UTF-16) or BLOB (a sequence of bytes). This does not fit well with the ODBC interface which pre-determines a type for each column before reading or writing it: the `SQLite ODBC' driver falls back to a \code{SQL\_VARCHAR} or \code{SQL\_LONGVARCHAR} type if the column type is not available. \subsection{ODBC data types} ODBC defines two sets of data types: \emph{SQL data types} and \emph{C data types}. SQL data types indicate the data types of data stored at the data source using standard names. C data types indicate the data types used in the compiled code in the application (here \pkg{RODBC}) when transferring data and are the same for all drivers. The ODBC SQL data types are abstractions of the data types discussed above with names like \code{SQL\_INTEGER}. They include \code{SQL\_LONGVARCHAR} for large character types and \code{SQL\_WVARCHAR} for Unicode character types. It is usually these types that are returned (by number) in the \code{SQL\_DATA\_TYPE} column of the result of \code{sqlColumns} and \code{SQL\_DATATYPE} column of the result of \code{sqlTypeInfo}. The mapping from names to numbers is given in table~1. \begin{table}[tbp] \qquad{\small\tt \begin{tabular}{lrlr} SQL\_CHAR&1&SQL\_LONGVARCHAR&-1\\ SQL\_NUMERIC&2&SQL\_BINARY&-2\\ SQL\_DECIMAL&3&SQL\_VARBINARY&-3\\ SQL\_INTEGER&4&SQL\_LONGVARBINARY&-4\\ SQL\_SMALLINT&5&SQL\_BIGINT&-5\\ SQL\_FLOAT&6&SQL\_TINYINT&-6\\ SQL\_REAL&7&SQL\_BIT&-7\\ SQL\_DOUBLE&8&SQL\_WCHAR&-8\\ SQL\_DATETIME&9&SQL\_WVARCHAR&-9\\ SQL\_INTERVAL&10&SQL\_WLONGVARCHAR&-10\\ SQL\_TIMESTAMP&11&SQL\_GUID&-11\\ SQL\_VARCHAR&12\\ SQL\_TYPE\_DATE&91\\ SQL\_TYPE\_TIME&92\\ SQL\_TYPE\_TIMESTAMP&93 \end{tabular}} \caption{Mapping between ODBC SQL data type names and numbers. (GUIDs are 16-byte numbers, Microsoft's implementation of UUIDs.)} \end{table} The only ODBC C data types currently used by \pkg{RODBC} are \code{SQL\_C\_DOUBLE}, \code{SQL\_C\_SLONG} (32-bit signed integers) and \code{SQL\_C\_CHAR} for reading and writing, and \code{SQL\_C\_FLOAT} (single-precision), \code{SQL\_C\_SSHORT} (16-bit signed integers) and \code{SQL\_C\_BINARY} for reading from the database. \url{https://msdn.microsoft.com/en-us/library/ms713607%28VS.85%29.aspx} is the defintiive source of information about ODBC data types. \section{Schemas and Catalogs} This is a more technical section: few users will need to deal with these concepts. \sQuote{Schemas}\footnote{which is the usual plural in this technical usage, athough \emph{schemata} is more usual in English.} are collections of objects (such as tables and views) within a database that are supported by some DBMSs: often a separate schema is associated with each user (and \sQuote{schema} in ODBC~3 replaced \sQuote{owner} in ODBC~2). In SQL-92, schemas are collected in a \sQuote{catalog} which is often implemented as a database. Where schemas are implemented, there is a \emph{current schema} used to find unqualified table names, and tables in other schemas can be referred to within SQL queries using the \code{\var{schema}.\var{table}} notation. You can think of a schema as analogous to a name space; it allows related objects to be grouped together without worrying about name clashes with other groups. (Some DBMSs will search for unqualified table names in a search path: see the detailed descriptions below.) Note that \sQuote{schema} is used in another sense in the database literature, for the design of a database and in particular of tables, views and privileges. Here are some details of various DBMSs' interpretations of \code{catalog} and \code{schema} current at the time of writing (mid 2009). (These descriptions are simplistic, and in some cases experimental observations.) \begin{itemize} \item SQLite uses dotted names for alternative databases that are attached by an \code{ATTACH DATABASE} command.\footnote{and may be subsequently detached by a \code{DETACH DATABASE} command} There is a search path of databases, so it is only necessary to use the dotted name notation when there are tables of the same name on attached databases. The initial database is known as \code{main} and that used for temporary tables as \code{temp}. \item MySQL uses \code{catalog} to refer to a database. In MySQL's parlance, `schema' is a little-used synonym for \sQuote{database}. \item PostgreSQL only allows a session to access one database, and does not use `catalog' except to refer to the current database. Version 7.3 introduced schemas---users can create their own schemas with a \code{CREATE SCHEMA} query. Tables are by default in the \code{public} schema, and unqualified table names are searched for along a \sQuote{search path} of schemas (by default, containing \code{public}). \item Oracle uses schemas as synonymous with \sQuote{owner} (also known as \sQuote{user}). There is no way for a user to create additional schemas (that is not what \code{CREATE SCHEMA} does in Oracle). \item IBM DB2 uses schemas as name spaces for objects that may lie on different databases: using \emph{aliases} allows objects to be in more than one schema. The initial current schema is named the same as the user (\code{SQLID} in DB2 parlance), but users can create additional schemas with \code{CREATE SCHEMA} statements. \item Microsoft SQL Server 2008 uses both \code{catalog} and \code{schema}, \code{catalog} for the database and \code{schema} for the type of object, e.g. \code{"sys"} for most of the system tables/views and (default) \code{"dbo"} for user tables. Further schemas can be created by users. The default schema for a user can be set when the user is created and changed \emph{via} \code{ALTER USER}. Prior to SQL Server 2005, `schema' meant `user', and the search path for unqualified names was the database user then \code{"dbo"}. \item The Microsoft Excel and Access ODBC drivers do not use schemas, but do use \code{catalog} to refer to other database/spreadsheet files. \item Mimer (\url{www.mimer.com}) uses schemas which are normally the same as users (which it calls \emph{IDENT}s), but users can create additional schemas with \code{CREATE SCHEMA} statements. There are also system schemas. Mimer uses `schemata' as the plural of schema. \end{itemize} It is often possible to use \code{sqlTables} to list the available catalogs or schemas: see its help page for the driver-specific details. \pkg{RODBC} usually works with tables in the current schema, but unless the connection was opened with \code{interpretDot = FALSE} most functions will attempt to interpret the `dotted name' notation. The interpretation depends on the DBMS: the SQL-92 meaning is \code{\var{schema}.\var{table}} and this is accepted by PostgreSQL, Microsoft SQL Server, Oracle, DB2 and Mimer. However, MySQL uses \code{\var{database}.\var{table}}, and the functions try\footnote{currerntly this is stymied by bugs in the ODBC driver, so \code{SQLColumns} is unable to report on tables in specified databases.} that interpretation if they recognize a MySQL driver. Some DBMSs allow more than two components, but these are not currently supported by the \pkg{RODBC} functions. Functions \code{sqlTables}, \code{sqlColumns} and \code{sqlPrimaryKeys} have arguments \code{catalog} and \code{schema} which in principle allow tables in other schemas to be listed or examined: however these are only partially implemented in many current ODBC drivers. See the help page for \code{sqlTables} for some further details. For other uses, the trick is to select the schema(s) you want to use, which is done \emph{via} an SQL statement sent by \code{sqlQuery}. For Oracle you can set the default schema (owner) by \begin{example} \code{ALTER SESSION SET CURRENT\_SCHEMA = \var{schema}} \end{example} % http://sqlzoo.net/howto/source/z.dir/tip988922/oracle whereas for PostgreSQL the search path can be changed \emph{via} \begin{example} \code{SET search\_path TO \var{schema1},\var{schema2}}. \end{example} % see also https://stat.ethz.ch/pipermail/r-help/2008-May/161304.html In DB2, creating an alias in the current schema can be used to access tables in other schemas, and a \code{CURRENT SCHEMA} query can be used to change the current schema. In MySQL and Microsoft SQL Server a database can be selected by a \code{USE \var{database}} query. \section{Internationalization Issues} Internationalization issues are made more complex by ODBC being a client-server system, and the ODBC client (\pkg{RODBC}) and the server may be running on different machines with different OSes on different continents. So the client may need some help. In most cases numeric data are transferred to and from R in binary form, so the representation of the decimal point is not an issue. But in some cases it could be (e.g.{} decimal rather than binary SQL data types will be transferred as character strings) and then the decimal point to be used will be taken from \code{options("dec")}: if unset this is set when \pkg{RODBC} is loaded from the setting of the current locale on the machine running R (\emph{via} \code{Sys.localeconv}). Some ODBC drivers (e.g.{} for Microsoft SQL Server, Oracle) allow the locale (`NLS') to be used for numeric values to be selected for the connection. The other internationalization issue is the character encoding used. When R and the DBMS are running on the same machine this is unlikely to be an issue, and in many cases the ODBC driver has some options to translate character sets. SQL is an ANSI (US) standard, and DBMSs tended to assume that character data was ASCII or perhaps 8-bit. More recently DBMSs have started to (optionally or by default) to store data in Unicode, which unfortunately means UCS-2 on Windows and UTF-8 elsewhere. So cross-OS solutions are not guaranteed to work, but most do. Encoding issues are best resolved in the ODBC driver or in DBMS settings. In the unusual case that this cannot be done, the \code{DBMSencoding} argument to \code{odbcDriverConnect} allows for recoding when sending data to or from the ODBC driver and thence the DBMS. \section{Excel Drivers} The Microsoft Excel ODBC drivers (Windows only) have a number of peculiarities which mean that it should be used with care. It seems that their concept of a `table' is principally a \emph{named range}. They treat worksheets as system tables, and append a dollar to their name (making then non-standard SQL table names: the quoting convention used is to enclose such names in square brackets). Column names are taken as the first row of the named range/worksheet. Non-standard SQL names are allowed here too, but the driver maps \code{.} to \code{\#} in column names. Annoyingly, \code{sqlTables} is allowed to select named ranges only by \code{tableType = "TABLE"} but not to select only worksheets. There are at least two known problems with reading columns that do not have a format set \emph{before} data entry, and so start with format \sQuote{General}. First, the driver uses the first few rows to determined the column type, and is over-fond of declaring \sQuote{Numeric} even when there are non-numeric entries. The default number of rows consulted is 8, but attempts to change this in the DSN setup are ignored. Second, if a column is declared as \sQuote{Text}, numeric entries will be read as SQL nulls and hence R \code{NA}s. Unfortunately, in neither case does reformatting the column help. % http://support.microsoft.com/kb/141284 The connection is by default read-only. It is possible to de-select this in the DSN (and the convenience wrapper \code{odbcConnectExcel} has a \code{readOnly = FALSE} argument to do so), but this does not support deletion, including SQL \code{DROP}, \code{DELETE}, \code{UPDATE} and \code{ALTER} statements). In particular, \code{\link{sqlDrop}} will remove the data in a worksheet but not the worksheet itself. % http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.ii.doc/opt/tlsodb13.htm % http://www.stata.com/support/faqs/data/odbc_excel.html The driver does allow a worksheet to be updated by \code{sqlUpdate}, and for a new worksheet (with a different name from existing worksheets) to be created by \code{sqlSave} (which also creates a named range). As far as we know, no similar issues affect the Actual Technologies macOS Excel driver: however, it allows only read-only access to Excel files and does not support Excel 2007-and-later \code{.xlsx} files. \section{DBMS-specific tidbits} This section covers some useful DBMS-specific SQL commands and other useful details. Recent versions of several DBMSs have a schema \code{INFORMATION\_SCHEMA} that holds many predefined system views. These include MySQL (the name of a database, mainly populated beginning with MySQL~5.1), Microsoft SQL Server and Mimer. \subsection*{MySQL} Comments about MySQL are mostly applicable to its forks such as MariaDB. We have already mentioned \code{USE \var{database}} as the way to change the database in use. \code{SHOW DATABASES} lists the databases `for which you have some kind of privilege', and can have a \code{LIKE} clause to restrict the result to some pattern of database names. % MySQL 5.1 manual 12.3 The \code{DESCRIBE \var{table}} command is a compact way to get a description of a table or view, similar to the most useful parts of the result of a call to \code{sqlColumns}. (It is also known as \code{SHOW COLUMNS FROM \var{table}}.) \code{SHOW TABLES} is the command to produce a table of the tables/views on the current database, similar to \code{sqlTables}. For example, \begin{example} > sqlQuery(channel, "USE ripley") [1] "No Data" > sqlQuery(channel, "SHOW TABLES") Tables_in_ripley 1 USArrests > sqlQuery(channel, "DESCRIBE USArrests") Field Type Null Key Default Extra 1 State varchar(255) NO PRI NA NA 2 Murder double YES NA NA 3 Assault int(11) YES NA NA 4 UrbanPop int(11) YES NA NA 5 Rape double YES NA NA \end{example} \noindent \code{SHOW FULL TABLES} gives an additional additional column \code{Table\_type}, the types of the tables/views. There is useful information for end users in the \code{INFORMATION\_SCHEMA} \emph{database}, much more extensively as from MySQL~5.1. Some of the non-standard behaviour can be turned off, e.g.{} starting MySQL with \code{--sql-mode=ANSI} gives closer conformance to the standard, and this can be set for a single session by \begin{example} SET SESSION sql\_mode='ANSI' \end{example} To change just the behaviour of quotes (to use double quotes in place of backticks) replace \code{ANSI} by \code{ANSI\_QUOTE}. % manual section 10.4 The maximum size of a \code{char} column is 255 characters. That of a \code{varchar} column is up to 65535 characters (but there is a limit of 65535 bytes on the total size of a row), and those with a maximum of 255 or less are stored more efficiently. Types \code{text}, \code{mediumtext} and \code{longtext} can hold more, and are not subject to the row-size limit (\code{text} has default maximum size 65535, the default \pkg{RODBC} limit on transfers). There are \code{binary}, \code{varbinary} and \code{blob} types which are very similar to their character counterparts but with lengths in bytes. \subsection*{PostgreSQL} Table \code{pg\_tables} lists all tables in all schemas; you probably want to filter on \code{tableowner='\var{current\_user}'}, e.g.{} \begin{smallexample} > sqlQuery(channel, "select * from pg_tables where tableowner='ripley'") schemaname tablename tableowner tablespace hasindexes hasrules hastriggers 1 public dtest ripley NA 0 0 0 \end{smallexample} There are both ANSI and Unicode versions of the ODBC driver on Windows: they provide many customizations. One of these is read-only access, another is if system tables are reported by \code{sqlTables}. % manual chapter 8 The default size of a \code{varchar} column is unlimited, but those with maximum length of 126 bytes or less are stored more efficiently. However, the ODBC interface has limits, which can be set in the configuration options. These include the maximum sizes for \code{varchar} (default 254) and \code{longvarchar} (default 8190), and how to handle unknown column sizes (default as the maximum), and whether `Text' is taken as \code{varchar} or \code{longvarchar} (which affects the reported maximum size for a \code{varchar} column). There is a single binary data type, \code{bytea}. \subsection*{SQLite} These comments are only about SQLite~3.x. Table \code{sqlite\_master} lists tables and indices, and the \code{sql} column gives the SQL command used. E.g.{} \begin{example} > tmp <- sqlQuery(channel, "select * from sqlite_master") > tmp[, "sql"] <- substr(tmp[, "sql"], 1, 16) > tmp type name tbl_name rootpage sql 1 table USArrests USArrests 2 CREATE TABLE "US 2 index sqlite_autoindex_USArrests_1 USArrests 4 \end{example} My current versions of Christian Werner's SQLite~ODBC driver store character data in the current locale's charset (e.g.{} UTF-8) on Unix-alikes and by default in Unicode (UCS-2) on Windows (unless de-selected in the DSN configuration). The default collation for text data is byte-by-byte comparisons, so avoid comparing non-ASCII character data in SQLite. Actual Technologies sell an SQLite driver for macOS which requires \code{believeNRows = FALSE} and has a number of other issues including that it seems not to support dropping tables. (Christian Werner's SQLite~ODBC driver was easy to install from the sources and worked correctly.) Version of the SQLite~ODBC driver since 0.87 have segfaulted on the test suite. \subsection*{Oracle} Tables \code{cat}, \code{user\_table} and \code{user\_catalog} contain useful information on tables. Information on columns is in \code{all\_tab\_columns}, e.g.{} \begin{example} > sqlQuery(channel, "select * from all\_tab\_columns where table_name='USArrests'") OWNER TABLE_NAME COLUMN_NAME DATA_TYPE DATA_TYPE_MOD 1 RIPLEY USArrests State VARCHAR2 NA 2 RIPLEY USArrests Murder FLOAT NA 3 RIPLEY USArrests Assault NUMBER NA 4 RIPLEY USArrests UrbanPop NUMBER NA 5 RIPLEY USArrests Rape FLOAT NA ... \end{example} The Windows ODBC driver we tested had an option for a read-only connection. % SQL Language Reference Manual chapter 2 Oracle's character data types are \code{CHAR}, \code{VARCHAR2} (character set specified when the database was created) and \code{NCHAR}, \code{NVARCHAR2} (Unicode), as well as \code{CLOB} and \code{NCLOB} for large character strings. For the non-Unicode types the units of length are either bytes or charactor (set as a default for the database) but can be overriden by adding a \code{BYTE} or \code{CHAR} qualifier. The limits are 4000 bytes apart from for \code{CLOB} and \code{NCLOB}, which have very high limits. There are \code{RAW} and \code{BLOB} data types. \subsection*{DB2} %http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/index.jsp Schema \code{syscat} contains many views with information about tables: for example view \code{syscat.tables} lists all tables, and \begin{example} > sqlQuery(channel, "select * from syscat.columns where tabname='USArrests'") TABSCHEMA TABNAME COLNAME COLNO TYPESCHEMA TYPENAME LENGTH SCALE 1 RIPLEY USArrests State 0 SYSIBM VARCHAR 255 0 2 RIPLEY USArrests Murder 1 SYSIBM DOUBLE 8 0 3 RIPLEY USArrests Assault 2 SYSIBM INTEGER 4 0 4 RIPLEY USArrests UrbanPop 3 SYSIBM INTEGER 4 0 5 RIPLEY USArrests Rape 4 SYSIBM DOUBLE 8 0 ... \end{example} %http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/index.jsp?topic=/com.ibm.db2.luw.sql.ref.doc/doc/r0008483.html The \code{CHAR} type can have size up to 254 bytes: the maximum size of the \code{VARCHAR} type is 32762 bytes. For larger character strings there is the \code{CLOB} type (up to 2Gb). These types can be used to store data in a MBCS, including various Unicode encodings. There are corresponding \code{BINARY}, \code{VARBINARY} and \code{BLOB} data types. \subsection*{Microsoft SQL Server} There are several hundred views in schemas \code{INFORMATION\_SCHEMA} and \code{sys} which will be listed by \code{sqlTables} and also by the stored procedure \code{sp\_tables}. Another way to list tables is \begin{example} SELECT * FROM sysobjects WHERE xtype='U' \end{example} where the condition restricts to user tables. \code{USE \var{database}} changes the database in use. % http://msdn.microsoft.com/en-us/library/ms187752.aspx Types \code{char} and \code{varchar} have a maximum specified size of 8000 bytes. It is possible to use \code{varchar(max)} (previously known as \code{text}) for a limit of 2Gb, but this may not work well with the ODBC interface. The Unicode types \code{nchar} and \code{nvarchar} have a maximum specified size of 4000 characters: again there is \code{nvarchar(max)} (formerly \code{ntext}). There are corresponding \code{binary} and \code{varbinary} data types (with \code{image} as an earlier name for \code{varbinary(max)}). \subsection*{Mimer} There are tens of views in schema \code{INFORMATION\_SCHEMA} which can be read by SQL \code{SELECT} queries of the form \begin{example} SELECT \var{column-list} FROM INFORMATION_SCHEMA.\var{view-name} WHERE \var{condition} \end{example} See the Mimer SQL Reference Manual chapter on Data Dictionary views for full details: two views are \code{TABLES} and \code{VIEWS}. A session can be set to be read-only by the SQL command \code{SET SESSION READ ONLY}. Mimer uses Latin-1 for its default character types but Unicode types (\code{NCHAR} and \code{NVARCHAR}) are also available. Unsurprisingly given that the company is Swedish, different collations are allowed for both Latin-1 and Unicode character types. % reference manual chapter 6 The \code{char} and \code{varchar} columns have a maximum size of 15000 bytes: the \code{clob} data type is available for larger character columns. The \code{nchar} and \code{nvarchar} columns have a maximum size of 5000 characters: the \code{nclob} data type is available for larger Unicode columns. There are corresponding \code{binary}, \code{varbinary} and \code{blob} binary data types. \newpage \appendix \section{Installation} \pkg{RODBC} is simple to install, and binary distributions are available for Windows from CRAN. To install from the sources, an \emph{ODBC Driver Manager} is required. Windows normally comes with one (it is part of MDAC and can be installed separately if required). macOS from 10.2 to 10.8 shipped with \code{iODBC} (\url{http://www.iodbc.org}, this is also available for other Unix-alikes) but from 10.9 the headers are no longer included in the macOS SDK. For other systems the driver manager of choice is likely to be \code{unixODBC}, part of almost all Linux distributions and with sources downloadable from \url{http://www.unixODBC.org}. In Linux binary distributions it is likely that package \code{unixODBC-devel} or \code{unixodbc-dev} or some such will be needed. Both \code{unixODBC} and \code{iODBC} can be installed from the sources under macOS: they need ODBC drivers compiled for the driver manager in use. At least for macOS 10.9--12, all that is required for \code{iODBC} is to unpack the sources and use their headers by something like \begin{example} ODBC_INCLUDE=/path/to/libiodbc-srcs/include' R CMD INSTALL RODBC \end{example} \noindent and the \code{iODBC} sources used by Apple can be found at \url{https://opensource.apple.com}. In most cases the package's \code{configure} script will find the driver manager files, and the package will install with no extra settings. However, if further information is required, use \code{--with-odbc-include} and \code{--with-odbc-lib} or environment variables \code{ODBC\_INCLUDE} and \code{ODBC\_LIBS} to set the include and library paths as needed. A specific ODBC driver manager can be specified by the \code{--with-odbc-manager} \code{configure} option, with likely values \code{odbc} or \code{iodbc}: if this is done for \code{odbc} and the program \code{odbc\_config} is found, it is used to set the libpath as a last resort (it is often wrong), and to add any additional \code{CFLAGS}. \subsection*{Sources of drivers} Keeping track of ODBC drivers is a never-ending task, and this section is no longer actively maintained. URIs are liable to move or disappear. A list of drivers for \code{unixODBC} is maintained\footnote{that the author works for Easysoft is conspicuous.} at \url{https://www.unixodbc.org/drivers.html}. \code{unixODBC} ships with a number of drivers (although in most cases the DBMS vendor's driver is preferred)---these include for MySQL, PostgreSQL, Mimer and flat files. MySQL provides drivers under the name `Connector/ODBC' (formerly MyODBC') in source form, and binaries for all common 32-bit and most 64-bit R platforms. These are said to work also with MariaDB. PostgreSQL has an associated project at \url{http://pgfoundry.org/projects/psqlodbc/} and another project for at \url{http://pgfoundry.org/projects/odbcng/}. (Documentation for \code{psqlodbc} is currently hard to find, but there is some in the PostgreSQL 7.2 manual at \url{http://www.postgresql.org/docs/7.2/static/odbc.html} from before it was unbundled.) There are drivers for Unix-alikes and Windows -- 64-bit Windows support is available as from PostgreSQL 9.0. An SQLite ODBC driver for Unix-alikes, including macOS, and (32- and 64-bit) Windows is available from \url{http://www.ch-werner.de/sqliteodbc/}. Oracle provides ODBC drivers as a supplement to its `Instant Client' for some of its platforms (including 32/64-bit Windows and Linux but not currently macOS). See \url{https://www.oracle.com/technetwork/database/features/instant-client/index-097480.html} %\url{http://www.oracle.com/technology/software/tech/oci/instantclient/}. One quirk of the Windows drivers is that the Oracle binaries must be in the path, so \code{PATH} should include e.g.{} \verb|c:\Oracle\bin|. For IBM's DB2, search its site for drivers for `ODBC and CLI'. There are some notes about using this under Linux at \url{https://www.unixodbc.org/doc/db2.html}. % http://developer.mimer.se/odbc/ Mimer (\url{www.mimer.com}) is a cross-platform DBMS with integral ODBC support, so \begin{quote} `The Mimer SQL setup process automatically installs an ODBC driver when the Mimer SQL client is installed on any Windows or UNIX platform.' \end{quote} The `HowTos' at \url{http://developer.mimer.se/howto/index.tml} provide some useful hints. Some details of the 32-bit Microsoft `ODBC Desktop Database Drivers' (for Access, Excel, Paradox, dBase and text files on Windows) can be found at \url{https://msdn.microsoft.com/en-us/library/ms709326%28VS.85%29.aspx}. There is also a Visual FoxPro driver and an (outdated) Oracle driver. 32-bit Windows drivers for Access 2007 and Excel 2007 are bundled with Office 2007 but can be installed separately \emph{via} the installer \code{AccessDatabaseEngine.exe} available from %\url{http://www.microsoft.com/downloads/details.aspx?FamilyID=7554f536-8c28-4598-9b72-ef94e038c891&DisplayLang=en}. \url{https://www.microsoft.com/en-us/download/details.aspx?id=23734}. The Access/Excel 2010 versions at %\url{http://www.microsoft.com/downloads/details.aspx?familyid=C06B8369-60DD-4B64-A44B-84B371EDE16D&displaylang=en} \url{https://www.microsoft.com/en-us/download/details.aspx?id=13255} have a 64-bit version: however the 64-bit drivers cannot be installed alongside 32-bit versions of Office (as far as we know, and definitely not for Office 2007). For recent versions of macOS, low-cost and easy-to-use \code{iODBC} drivers are available from \url{https://www.actualtech.com/products.php}: these cover MySQL/PostgreSQL/SQLite (one driver), SQL Server/Sybase, Oracle, and a read-only driver for Access and related formats (including Access 2007 and Excel, but not Excel 2007). That SQLite driver needs \code{believeNRows = FALSE} set. Currently at least, installing those drivers on 10.9 installs \code{iODBC}. macOS drivers for MySQL, PostgreSQL and the major commercial databases are available from \url{http://uda.openlinksw.com/}. \subsection*{Specifying ODBC drivers} The next step is to specify the ODBC drivers to be used for specific DBMSs. On Windows installing the drivers will register them automatically. This might happen as part of the installation on other systems, but usually does not. Both \code{unixODBC} and \code{iODBC} store information on drivers in configuration files, normally system-wide in \code{/etc/odbcinst.ini} and per-user in \verb|~/.odbcinst.ini|. However, the system location can vary, and on systems with \code{unixODBC} can be found by at the Unix command line by one of \begin{example} \$ odbcinst -j \$ odbc\_config --odbcinstini \end{example} For \code{iODBC} use \code{iodbc\_config}: on macOS the system location used by Apple was \code{/Library/ODBC/odbcinst.ini}. \begin{figure} \begin{example} \$ cat /etc/odbcinst.ini [MySQL] Description = ODBC 3.51.26 for MySQL Driver = /usr/lib64/libmyodbc3.so FileUsage = 1 [MySQL ODBC 5.1 Driver] Description = ODBC 5.1.05 for MySQL Driver = /usr/lib64/libmyodbc5.so UsageCount = 1 [PostgreSQL] Description = ODBC for PostgreSQL Driver = /usr/lib64/psqlodbc.so FileUsage = 1 [sqlite3] Description = sqliteodbc Driver = /usr/local/lib64/libsqlite3odbc.so Setup = /usr/local/lib64/libsqlite3odbc.so FileUsage = 1 \end{example} \caption{A system ODBC driver file from a \code{x86\_64} Fedora 10 Linux system using \code{unixODBC}.} \label{fig:odbc1} \end{figure} The format can be seen from figure~\ref{fig:odbc1}. (\code{unixODBC} allows \code{Driver64} here to allow for different paths on 32-bit and 64-bit platforms sharing a file system.) The MySQL and PostgreSQL drivers were installed from the Fedora RPMs \code{mysql-connector-odbc} and \code{postgresql-odbc}, and also from the \code{mysql-connector-odbc} RPM in the MySQL distribution (which inserted the entry in the driver file). The MySQL manual gives detailed information (including screenshots) of installing its drivers and setting up DSNs that may also be informative to users of other DBMSs. \clearpage \section{Specifying DSNs} The ODBC driver managers have `User DSNs' and `System DSNs': these differ only in where the information is stored, the first on a per-user basis and the second for all users of the system. Windows has a GUI\footnote{Extra care is needed on a 64-bit version of Windows, as this GUI shows only 64-bit settings for ODBC, including drivers and DSNs. If you are running 32-bit R (and hence 32-bit ODBC) on 64-bit Windows, you need the 32-bit version of the GUI at something like \texttt{c:\textbackslash{}Windows\textbackslash{}SysWOW64\textbackslash{}odbcad32.exe} -- and beware that both 32- and 64-bit versions are called \texttt{odbcad32.exe}.} to set up DSNs, called something like `Data Sources (ODBC)' under `Administrative Tools' in the Control Panel. You can add, remove and edit (`configure') DSNs there (see figure~2). When adding a DSN, first select the ODBC driver and then complete the driver-specific dialog box. There will usually be an option to test the DSN and it is wise to do so. \begin{figure} \centerline{\includegraphics[width=12cm]{winDSN1}} \bigbreak \centerline{\includegraphics[width=10cm]{winDSN2}} \caption{(Top) The main Data Sources (ODBC) dialog box from a Windows XP system. (Bottom) The dialog box to select a driver that comes up when the \textsf{Add} button is clicked.} \label{fig:1} \end{figure} If \texttt{Rgui} is to be used on Windows, incomplete DSNs can be created and the dialog box will be brought up for completion when \code{odbcConnect} is called---this can be helpful to avoid storing passwords in the Windows Registry or to allow alternate users or databases. On that platform, calling \code{odbcDriverConnect()} with no arguments will bring up the main ODBC Data Sources dialog box to allow a DSN to be constructed on the fly. macOS prior to 10.6 came with a very similar GUI (figure~3) found at \textsf{Applications / Utilities / ODBC Administrator}. This has been available as a download from \url{https://support.apple.com/kb/DL895}. Another GUI for macOS is available from \url{http://www.odbcmanager.net/index.php}. \begin{figure} \centerline{\includegraphics[width=12cm]{macODBC}} \bigbreak \centerline{\includegraphics[width=12cm]{macAccess}} \caption{(Top) The main ODBC Administrator dialog box from a macOS 10.5 system. (Bottom) A page of the dialog box to specify a DSN for the Actual Technologies Access/Excel driver.} \label{fig:1b} \end{figure} % Both \code{unixODBC} and \code{iODBC} provide GUIs (which might be % packaged separately in binary distributions) to create DSNs, and % \code{iODBC} also has a web-grounded DSN administrator. UnixODBC's GUI % is currently called \texttt{ODBCConfig} (see figure~4), and there is a % KDE control widget called \texttt{DataManager} to manage both ODBC % drivers and DSNs. See the \code{unixODBC} user manual at % \url{http://www.unixodbc.org/doc/UserManual/}. (On Fedora these are in % the \code{unixODBC-kde} RPM. It has been announced that they will % become separate projects after \code{unixODBC 2.2.14}.) \begin{figure} \centerline{\includegraphics[width=12cm]{linuxDSN}} \bigbreak \centerline{\includegraphics[width=12cm]{linuxDSNsqlite}} \caption{The dialog box of \code{ODBCconfig} on Fedora 10 Linux, and the \textsf{Configure} screen for the SQLite driver.} \label{fig:2} \end{figure} On Unix-alikes DSNs can also be specified in files (and the graphical tools just manipulate these files). The system-wide file is usually \code{/etc/odbc.ini} and the per-user file\footnote{\texttt{\textasciitilde/Library/ODBC/odbc.ini} on Mac OS X.} \verb|~/.odbc.ini|. Some examples of the format are shown figure~\ref{fig:odbc2}. \begin{figure} \begin{example} [test_mysql] Description = test MySQL Driver = MySQL Trace = No Server = localhost Port = 3306 Database = test [test_mysql5] Description = myodbc5 Driver = MySQL ODBC 5.1 Driver Server = gannet Port = 3306 Database = ripley [test_pg] Description = test PostgreSQL Driver = PostgreSQL Trace = No TraceFile = ServerName = localhost UserName = ripley Port = 5432 Socket = Database = testdb ReadOnly = 0 [test_sqlite3] Description = test SQLite3 Driver = sqlite3 Database = /tmp/mysqlite3.db \end{example} \caption{A personal (\texttt{\textasciitilde/.odbc.ini}) file from a Fedora 10 Linux system using \code{unixODBC}.} \label{fig:odbc2} \end{figure} What fields are supported is driver-specific (and it can be hard to find documentation). There is no clear distinction between fields that specify the driver and those which specify the DSN, so any parts of the driver specification which might differ between connections can be used in the DSN file. Things that are often set here are if the connection is read-only (\code{test\_pg} is \emph{not} readonly) and the character encoding to be used. Command-line programs \code{isql} (\code{unixODBC}) and \code{iodbctest} (\code{iODBC}) can be used to test a DSN that has been created manually in a file. The formats are \begin{example} \$ isql -v \var{dsn} \var{db_username} \var{db_password} \$ iodbctest \end{example} Both give a command-line SQL interface: use \code{quit} to terminate. \begin{figure} \includegraphics[width=6cm]{Access} \quad \includegraphics[width=6cm]{MySQL} \bigbreak \includegraphics[width=6cm]{Oracle} \quad \includegraphics[width=6cm]{SQLserver} \caption{Parts of the ODBC driver configuration screens on Windows XP for Microsoft Access, MySQL Connector/ODBC 5.1, Oracle's ODBC driver and Microsoft SQL Server.} \label{fig:3} \end{figure} \clearpage \section{Internals} The appendix is in part an \emph{aide memoire} for the maintainer, but may interest the curious user. RODBC connection objects are an integer with several attributes: they are numbered consecutively in the current session. For example \begin{smallexample} > channel <- odbcConnect("test") > unclass(channel) [1] 1 attr(,"connection.string") [1] "DATABASE=ripley;DESCRIPTION=myodbc;DSN=test;OPTION=0;PORT=3306;SERVER=localhost;" attr(,"handle\_ptr") attr(,"case") [1] "nochange" attr(,"id") [1] 11371 attr(,"believeNRows") [1] TRUE attr(,"colQuote") [1] "`" attr(,"tabQuote") [1] "`" attr(,"encoding") [1] "" attr(,"rows\_at\_time") [1] 100 attr(,"isMySQL") [1] FALSE \end{smallexample} Most of the attributes record the arguments of \code{odbcDriverConnect}. The \code{"connection.string"} attribute is as returned by \code{SQLDriverConnect} and list driver-specific parameters separated (and perhaps terminated) by a semicolon. The \code{"id"} attribute is a random integer used for integrity checks (and in particular to reject connection objects should they be saved and restored in a different session). The \code{"isMySQL"} attribute is used both to select the default quote character and the interpretation of \code{qualifier.table} names. The main structure of the connection is kept as a C \code{struct}, a pointer to which is passed around as the R external pointer \code{"handle\_ptr"}. This has a finalizer that will close the connection when there is no longer an R object referring to it (including at the end of the R session), with a warning unless the connection has already been closed by \code{close} or \code{odbcClose}. In addition, a C-level table keeps the pointers of the first 1000 connections of an R session, to enable \code{odbcCloseAll} to close them. The \code{struct} is currently defined as \begin{smallexample} typedef struct rodbcHandle \{ SQLHDBC hDbc; /* connection handle */ SQLHSTMT hStmt; /* statement handle */ SQLLEN nRows; /* number of rows and columns in result set */ SQLSMALLINT nColumns; int channel; /* as stored on the R-level object */ int id; /* ditto */ int useNRows; /* value of believeNRows */ /* entries used to bind data for result sets and updates */ COLUMNS *ColData; int nAllocated; SQLUINTEGER rowsFetched; /* use to indicate the number of rows fetched */ SQLUINTEGER rowArraySize; /* use to indicate the number of rows we expect back */ SQLUINTEGER rowsUsed; /* for when we fetch more than we need */ SQLMSG *msglist; /* root of linked list of messages */ SEXP extPtr; /* the external pointer address */ \} RODBCHandle, *pRODBCHandle; \end{smallexample} Most ODBC operations work by sending a query, explicitly or implicitly via e.g.{} \code{sqlColumns}, and this creates a \emph{result set} which is transferred to an R data frame by \code{sqlGetResults}. \code{nRows} and \code{nCols} indicate the size of the pending result set, with \code{nCols = -1} used if there are no pending results. ODBC works with various \emph{handles}. There is a \code{SQLHENV} handle for the environment that \code{RODBC} opens when a connection is first opened or DSNs are listed---its main use is to request ODBC~3 semantics. Then each connection has a \code{SQLHDBC} handle, and each query (statement) a \code{SQLHSTMT} handle. Argument \code{literal=TRUE} of \code{sqlTables} and \code{sqlColumns} is used to set the \verb}SQL_ATTR_METADATA_ID} attribute of the statement handle to be true. All the functions\footnote{ \code{odbcQuery}, \code{sqlColumns}, \code{sqlPrimaryKeys}, \code{sqlTables} and \code{sqlTypeInfo}.} that create a result set call C function \code{cachenbind}. This allocates buffers under the \code{colData} pointer and binds the result set to them by \code{SQLBindCol}. Then when \code{sqlGetResults} calls the C function \code{SQLFetch} or \code{SQLFetchScroll} the results for one or more (up to \code{MAX\_ROWS\_FETCH = 1024}) rows are loaded into the buffers and then copied into R vectors. Prior to \pkg{RODBC} 1.3-0 the default was to fetch a row at a time, but it is now to fetch up to 100 rows at a time. Entries \code{rowsArraySize} and \code{rowsFetched} are used to indicate how many rows were requested and how many were available. Since e.g.{} \code{sqlFetch} allows a maximum number of rows to be returned in the data frame, \code{rowsUsed} indicates how many of the rows last fetched have so far been returned to R. The buffers are part of the \code{ColData} entry, which is an array of \code{COLUMNS} structures, one of each column in the result set. These have the form \begin{smallexample} typedef struct cols \{ SQLCHAR ColName[256]; SQLSMALLINT NameLength; SQLSMALLINT DataType; SQLULEN ColSize; SQLSMALLINT DecimalDigits; SQLSMALLINT Nullable; char *pData; int datalen; SQLDOUBLE RData [MAX\_ROWS\_FETCH]; SQLREAL R4Data[MAX\_ROWS\_FETCH]; SQLINTEGER IData [MAX\_ROWS\_FETCH]; SQLSMALLINT I2Data[MAX\_ROWS\_FETCH]; SQLLEN IndPtr[MAX\_ROWS\_FETCH]; \} COLUMNS; \end{smallexample} The first six entries are returned by a call to \code{SQLDescribeCol}: \code{DataType} is used to select the buffer to use. There are separate buffers for double-precision, single-precision, 32-bit and 16-bit integer and character/byte data. When character/data buffers are allocated, \code{datalen} records the length allocated per row (which is based on the value returned as \code{ColSize}). The \code{IndPtr} value is used to record the actual size of the item in the current row for variable length character and binary types, and for all nullable types the special value \code{SQL\_NULL\_DATA} (-1) indicates an SQL null value. The other main C-level operation is to send data to the ODBC driver for \code{sqlSave} and \code{sqlUpdate}. These use \code{INSERT INTO} and \code{UPDATE} queries respectively, and for \code{fast = TRUE} use parametrized queries. So we have the queries (split across lines for display) \begin{smallexample} > sqlSave(channel, USArrests, rownames = "State", addPK = TRUE, verbose = TRUE) Query: CREATE TABLE "USArrests" ("State" varchar(255) NOT NULL PRIMARY KEY, "Murder" double, "Assault" integer, "UrbanPop" integer, "Rape" double) Query: INSERT INTO "USArrests" ( "State", "Murder", "Assault", "UrbanPop", "Rape" ) VALUES ( ?,?,?,?,? ) Binding: 'State' DataType 12, ColSize 255 Binding: 'Murder' DataType 8, ColSize 15 Binding: 'Assault' DataType 4, ColSize 10 Binding: 'UrbanPop' DataType 4, ColSize 10 Binding: 'Rape' DataType 8, ColSize 15 Parameters: ... > sqlUpdate(channel, foo, "USArrests", verbose=TRUE) Query: UPDATE "USArrests" SET "Assault"=? WHERE "State"=? Binding: 'Assault' DataType 4, ColSize 10 Binding: 'State' DataType 12, ColSize 255 Parameters: ... \end{smallexample} At C level, this works by calling \code{SQLPrepare} to record the insert/update query on the statement handle, then calling \code{SQLBindParameter} to bind a buffer for each column with values to be sent, and finally in a loop over rows copying the data into the buffer and calling \code{SQLExecute} on the statement handle. The same buffer structure is used as when retrieving result sets. The difference is that the arguments which were ouptuts from \code{SQLBindCol} and inputs to \code{SQLBindParameter}, so we need to use \code{sqlColumns} to retrieve the column characteristics of the table and pass these down to the C interface. \end{document} RODBC/inst/doc/RODBC.pdf0000644000176000001440000237224213073621041014212 0ustar ripleyusers%PDF-1.5 % 87 0 obj << /Length 2594 /Filter /FlateDecode >> stream xڕX[o~ϯۑX{N.Zl&m#16YrI93ʖNLrx78Xq$~=9{/@Y2M4ɂ̢J ~ //],X]Pm2P2~'disT0G8]?GvLV($ܟreDٗ(:8J(@GyYI>ݛH%E>rz#פid\j6 &  hՠLfQ4ˬ/Q5+ө} xpGQyYZ1oW^+ *pGuhF0H,xJ̕nLZϺQ-&lAhBc5}W燵fV{HId~>$g@b*ckQUM$ݎ#kvKÍr%ŒDջqƙopzi=w{Hg r?Uf{|h`NDRpwn5V#Wwʾ0DI㜄8b<{N0s"flQXIIB:-r̶UD F^զ[gn4/{q޸h| GL۵4+h7W?4q qf9alY ,pū\C;k֞ZDĵYxjպpR-ӻcUPGլHXL߷Q)),Y-XWnioo"zi.9FK" )D+8 [G"d14 b6{pn-i_Mo6\) 'x/jzC^xVET1QGyVY5j\Q /أh:@kؕ$dkW捉HFq0N }/zp"Q%p"PݰD@+ۻ~`&뚴O,Rlrm=n!  J[~1F*MS_;p!7ſ@4rzO"Cvbtc(\|LUIG35<"%K7)92S b~C,̤؇\h[34x\@]7y>#nHyF\pLFKbVQ|U 2.G$oKt07AUgзix9Ȫ4㽑£<1M Q-`)@ΒQbGq*)A^+8d5ü @}5:vx ~0+{=4GJz(jW'9T F3#m,UT!EZOamloGGRm-!m+f!$#wz^;H b2S[WFԲHw ̼dV>>+kxFa&"$$nq+.~yQUӘb6r]9&P 2DxA&¤$n %[$S4mqL3 Q`dόa%C&qHatp01 _{B{y_k GOGuUWV0q#f :L ~ڒ0o|\cŊ]Z5nN1u(n&a$HQk}*X5ٞQr,>"8 pL( wM.8Ia;o)Ęu "$wcpS0B"C?ycA,9hf4GٵoL3H0l7#zIRAt=ՍQQoWg8:z oFX(#bԝo tyf7ެ$~?3ƞ[ o=Lf€L} zgyΌaםkeB `)H8FN3n> stream xڝYYF~_!d8%#6&pE:HIǧH x ꪯnEEx;.TQ[(Fad\ar(h@ڷ}r:*]I7z}7ޣ$AĴI4 uIb,MalLH8mdVQ9yҵ]SPրI:O^ Kv_q77 ̅ ∃#ۍ ]wDZLcHlP:;fmNJ_wDæ 8E%zBЛ,NE_qUYIw@gK@tJYfþKp6Uk=OlItbpSf "w(h+bB|9Ńt!{H|b&lp_".#Г~bp9_8c[,+'J@ѲQ3OT]6<\AD yi]aO'Y # SLQnș,m/utl.PîgBQٓ_ tv큍ڸ*}ͅ_4ڷ]/KL 7k3F{ԬbXW\jТa?5_`ֶC 5Nx5zs3 :ֵHUsh??45JTV?:@q}Z3P# VJPX؛[nqAi">٣i4N&jL!`VL6<{f*,շz;蹷EA5xdlx0?]SVOwBHQE:9%뛏W߃%ptTErO|U{:0L6a_Tz \&AVҺů׈Z~n˥)6kV+.; !Q@|zyXdpv}^^]=<<Hx*=uv`Z+v.j]EfWQʼn!w+*AqB$L ^%ܙj be-!f"sqcSԼbLQEF7H,?e  2rSˮzgaz K<k̢2 Nd=3D)P+v蚛 HؙHS  /D5_ʰ$Xң{3c ω ![6H\[[nNj>cAag~Ў>r@ r"| O5I.ۦh)T{((*LtW@IaM,GzxG{:0=H)fWEJ00f=[8U4rg`+'Crٺvb +#y?p,FV{B`$z8]<otf̥KLN̚Z`ۛt3d!N&5pfˆ@ Ecus;ZXŜW̪10er@Gxmi{ `op(P~ N8sQko<$ԉk/9X >,, ޿$=Q@bCc>4n[wWs .~k( =`OgCTW)یV)kkg9L%"B5B~n0(]jU{dgI-7O@7XsfX=6f>>ل붛S.kLQ>Mv{s22{,\\ ~'h6)U EY-V8~c(?-6 "10_hrhQ/n.~vZ' <ѮHi(ߢ(dya%ӣ ~UC P޳i9/u/3(hr|Dѿɱ8b U͝, 2'8![4 ~gҡV'RJDưC*}an=K#`)i,՜+qJX* Ʈi8Gˡ(qwk v0sd> stream xYKsWt2ax%A2%ɉI*>خ c WR `3ϯ{6oOB|}u⭌,dpuPhDlj89]*,uɃ/y0%͊JmfέmrUdzoڞoMVm/{ \5<҅[`wm] 7^J-"xZk(ŭ@A2NLdQ:"fth%?uM4eF3m4feB' !ݔ훫_O$L HY"8 ɏ? >%`O@,`T'߳:')eDIbcwmdI2gJjŃS_ ͱOE$ro E{dqeha Ge؂~~8̮Y 퇪YhF{;7 %!T@.s"`9_olڸw.ْѷVU]d8].OϪ)Ͷ.˫ˢ)9R&`}I4p@j4ۊԀFM"YpHܗn9_ϙe $;Wu}sϾeY+=Og=DEP޷ôT HTލ(|:eE".]O#BVs& ~#욢ڃ(&c\DcNQaX/..tWW_rRi$?>%[ΤC5Eq92^ïR擅b@*-ȣ]C{~W+f;uE .pƫIJWv]ӝvvUiY҄uH92al nf+D*W%0iy*,!1H۱izE*@|V׳̺8j?&u|w}L+84#>UT?w|;R@\u sD,A8pĺ%i!]< /;3` Qgh{;_y}"/s*51s+~ۡ-ĥ3YzDyu-Uի E3 ?n}zT Θix(r hLW5<")${(mC>6ԏ(J%4AL7qY(Q P MϔJJq,(ŐULK q2u}& =T4jﮢO8b\e9 $ٳP?%M ~$I Q y%SE!@0\yzs5\+6~q=[ɍ#GOLV]0M[[(C{n,,%O1E5nf{5n lt:V62t&>}]˧j {x6x .}vrj;YO]&ӂfb$Dӻ#u_}3Q1"W4怡Fֹ]z¨8C*4yp_skѢvLgB;z&@Tư0J 7T)ЅS&}L"dPjRGql`ZQtD﹁uDɎ6,2!3u81j2s\Hs)TBLKPr`GO  )NT,2 " A*@UV⭉Y4<4`o 3m$,93b RҀ. mDyWΝ=-:k|4)yGm6BRN\~hp4n.G;3nl]8#}w73j@T9le?U>3RFSTKWo@H endstream endobj 131 0 obj << /Length 2662 /Filter /FlateDecode >> stream xڭYYoH~ 4n^5ELlLhHx~~ՔD:8죺Cwޯ{/d@A*&b$x}߶G*6~k󒚡_擼igڊu>]Mr76sif#:+7GF᠛5,;Ps#F9 b4&oy ÃGRФ|t}'Y Ѳ΢]+3:7'# [ymeoEpw״uBSOqڇԦRhόYZ 1Ҟڬ0vԪb_x!(: !:?u[ cb0wVE˹~"LXq`7:*QC%PکG[2dvoF5]YaJZJ%@{G0QG'έ㽯{6"VűLM{>h!,S'Z6n>hH$0Ct4fI"I̫aTs%Pz!R H\.Y>^^ HH_El9 FS۫(@D$}m=2 ~ a*$YcGʝ7?ܰpL+X5Ló -0N:W# k 2oR*KoY=LH_a[ ~LbrUOnDa WXVʗ=6Hl c܁%'K28 ^D߫e"frr _N]gsB 9)DD(t0p<쑛ТI7ޱ7""eĆ:ʡ[k=?6uˬnU7®pn@3;`-)9Gv(f[a?PxWW;7\M8U$AR1̚6wcյ謂/ě(M4t 0v~}kPI>;\k?=AzH%=K,:R @Q]U%B5ټmEG`hoy|ɜXx!}?cߋI- -e1\c'U-fb5D]@ņ:dI-_U T΅YQ/&3Uƍoڬf 92Cr[@8h6|xOY0=;qCAK1t}-_,6Z8<-:CwNf8`NKZ.9[$Ig4I]R%&[K.Z]]-6cۥ&0L6H IwŶЉU$R&бHgmk_e6'Wڙ8Ƨ T!\D"ο3(p nXYtEQF X(ֈC]>tȷjNpess+*n*n)yQ8B90#[;j7[ҷP;cvew^פ I5C-8GZC_2p\^ l.@dž]?}3ĝGI{3cpijB).$:y%wW KO.ءYO,rţ-zu ĺ({"D^׼v~hAu:k㇇!䏄 '=c?1kJ5`a+7J s;1 lޝgFwREh 57 =r2Դ1mlmapӿJy{CJ`b\&SMe}\WVF%); ϴ'9BE<BGRNE0%#0¯j)MCxd+`iڦKޔi|9skY"YWnѪn&UmFqa]D;gؾkyn)Cqn+_V-7>/ݣ웑-HpJGyPݚm&ф~s 0IAp29v@]&ÕmH U*DȀPa֒ٝq}ݘ6 \maoM敭(AX0^'>F 5٨ <8@44AWuEX1eC;;@jL(aߐ%in3/-/8Έ7B@Nգ4ӏM~e<.]gwE)aEz48'T+q "VT8昛~H"] 7`Bd8*{M "N9/H  ov 3Uf#]bGUF endstream endobj 138 0 obj << /Length 2538 /Filter /FlateDecode >> stream xڥXKFϯ-0f=ر">CFCfQjJTh_z}Ul67/nިd yQn8<ԛAo??M] '9DNW#^)?*R7{?uhn +߆w[iӕ*ϫ=1̖_~4wі'y].RD~η/˟ONE~ŒV7p(<4Lkԫ27_d"I,N6_$rJ~=qO_ڝހZtowqxX=X{Qu͜6̼e޳NpGNaz%$k'E;b4VNz06VNʼnٯ{X Lh _/,_ ?y ySW̪~ LܜLSWPsSPYɞ%AAnw*N}+琔//<,,t5$X,Ė4Q2Pd>*9#%CG۪oi$xėe}Mi0]i`k-x9l@*qIVpX K[ 28h6PAڍʶAw4˔cj.N;s Z(a|`,OʎƎpEkzy$?GIYOa"N=4ROSkr*Ӊ^ܼy5R*!_)` An<5B?V6R3<rL:sΰr0PGiq ] B'HRCÜh{ 8]Uĕ7tMvb N.f94у(?S=g;BNzqE @cMU6̹<9hrX<*U^:tu9} `̑ XD̑׌p!0RrC,^L{\j49 #UXB FSf%@ٌXU\f#az }W!-fzFJU"] vNa62R| b˃H|Dhc쒌 )3Cp 䎝9!"jxeGB(*8")kb $ѭw'a: л1 hkCq5U!O08֏d2d001gf dCo1MXGK~0A]#d9:+`j1 FŬP%,@fEKSgquq1 vzzd0P̠ ݐ^l C, |y4^ N˰l|.NDh V@-Y" fP0dⴠD21i2 I·sH8s 'u6~MWϼx:m%Ps7U 0<K;BD-f ϙ)1)w'strz#E^۹TBulyV.A(Y`+B2zHd|@pcM.HrUaiiLdBdlL?.j? Vr摛 srKH?FH V7oO_Lzi@Е$R̔ Ie0,(ʓ_GnyqG'k|nsHFQ([@s&v.بn[?G̪թ "Dةc,͔.iXVDXcKp#9,VsW;ę:u HcEAQ5=e蔬xQ ͠E\JS]21_PV#?l k ŞےW`1-ik^VAG;&vZ#\>1#)R\ds|U*v&GP=dg[l'\Hֈ&0[.$ULmǴsX$ZvvY )?!@Qa}[ۼ>#>E&Ő"@9od.'!I岉Ȼ(+Y6M`[~q z TdFcƱH0&E93~pFlaM|lj@oN4ݨ, a߼obE~_ 73Mlr@4O_% @ ~  }Oc[b:#G&rj?U6Up@"2_UyeP% OCIYNo%2~ރ̝/ A.TA-I଴o5PJѻOZ" endstream endobj 145 0 obj << /Length 3102 /Filter /FlateDecode >> stream xڭYKܶWLĭ@ARvKKrwqj/1˕+\htpw w{J6P-QKSIoAW?$VeEZ|{nګI od }nꘟNu{(6?Vg츽& d~8quTc7 MZ$^k17((4[ s3m#a^q`PO/3ԲZ^2iJE܅70u}5I?d"k..(*+yHd=]]!qyE۱ypԠBqJ~/.Y?X.^Z$zm Qh 4^Ёu_;Lk#M[S.1 Sg*a8=6q;^wqnzg N U $w%L) :~OK;\jv̆:O;DMǢ&0}'ۗ?~|W[ :Q.Տ]d_{9{ ԰zA%%$,Sf(-)1| ai?N5Z++']|=mtߓA 8 =n Ұ`-Hh4Ec9E"| WfXfC.eS;^>*+}SpC Aq/BLQStnrT:Ծgw!=#18rvZrUXt:lH7`סa U.A76hףW|8Rh8 ɋġ\΃Ф@髭z{/ڢygqe^<q=_0Ks(cf,N\5)(8W; 687l-ٻp0v=DL-Ƌ}Ûzw2z-rf ?ٸ!'НသV0BŠ [l09+'.ՇM| >K]M (ª9gbjmF l=̳ (UI263P&FUNČ:Tٵn<(in2ҽ˛'^Fw^veq;C nsR A9]ۊGG L)g'@f`gckq*LI1G.5SV;JKb-}xM>}s!+$vll FU\87BRR}Wz{Iw}".R_N[Adtyj!/g'm T}t "?QbV.#ty ё2.b6YriȜ sl'"LKyO{$,H=9a[Y`a$1Y hHĬ̥a\v/ՕfI1 \Qo|} }G|°ztrB.n*BEڣ^2`\0A6$MGʤ[7j|yXor-P4̖~Ӗ&rC ܲn8chK\iy[isVg̩A-C]o4k^΍|`Sk+TJR}$b$ĩ)/+5"dl(99{+Fc9BU/cxT% "9WZN D$@y}5- CT5S7M]ÔuJw*BpppHT7ȇ.#97Y5Y-xpc|I19vo6s,W3E_fkAX4ouR;_s㞨f3?\B$N+\$u&APG,'BPu&Y sYL"V" VjhpSzMHU͟n#xǁ*&x WBF+v^?w`b<5kz.TSXw-,%E`/[۵zz(??]f2 ՒK$psu endstream endobj 150 0 obj << /Length 2937 /Filter /FlateDecode >> stream xڝYrH}W-TUİVɶhƗDk3;3ɶŊD9hig/V 39G}p؉hu Mv`hF[|O7T\2l߃mI`u ];M$4ϖ4ݙnl::i}z3^x6yrG\'`GU*R&$D#J+/P4P!s[ɦ fU7`Xj݌'8Gȿ7%EFŮ&a⮫WggC#ۗYrF''&iwֿyU>{< ,Z!8tO00P=Af֣RaSFC;8SqH68 VeOl ϷCS@ɢjPlF=7hߡYEkHRn ң rn~e05FzvڌG_Ȼ>AwrȆ,&vM螩}Myk&Jyn V c>HMөyu(L`'ǃ1*Vk| g0"﵎wEZ6ځw%np0{W,VEb'uacOJr|N19p#]ϟؽ]^X#! rN꾦iGxiR绂ijZP6\f}+9Rz$U<=>QZrC=ѿ~g@잣c#VFb6HNa B 2yPhWm!, Z6ECתcs(-UR9m W~lIAV{0NNTҨ5] ~#NϗE <") W4K?ۮgz-cjz|68aswxb):e]P8Mct!-㯪AF־W/W⺞v"ZqJbq8 )16[3-7=rv6~puy婪2[E'^u5C)Ȧo C]Q,#_'8a^ ` ;xRڞwxL[i(%| Xt'l]d1f됔!Ol?mё 2H2a[\+ ˀd-^p NJZD`_Z Ms]r&С3 G 8j"G3EV{c`;qY&#aU"9x^Hx ;&5!x $p_AX󥉬YatW6@}B06GFsZtl^^@$H,,5mJI51׹ۡ#e%@6 .nX& ͎h{%sA!A{*԰8ls/\zq@vo?_._zP7*- )CFL#B$aiq$#Bk0snjo?ŃlP'yt}Vc.q}vh17Q,\GD[ ޛwm瀬Ƴ\G*抚yo7R?CtaxxC9MX kjj@&fCktSe{1klQ@XP0gүͼTM'hjU ՏfS <AmS2cN^h/T{x1*r"2ܚx3| fЙxׇ6Ls@^Rth/=XI{@-]H'% ]|(qL1^_Lg7p:]MW}./_5#O_ BD\!F$;.ҺZN!T:("m@B:?DR !p`( N,v9g(Λ2Sfˈ?f;Ur12\6DJBA΀>Oʛv9=8azjܫM'z`>|-fA'dӳjI:\/fL?bv>]+x#p@D$Z5\j!W yg͢P#"Autԇ[|E0~Vc \2G:VsOW|8!rq:o^Z//hbnQXcDҢVDcr8;چ -TqUoᾸmoH ϶xzp}Ü`}X.~Km G&`jܚJZW> stream xڍko8{ĪHzҴ!i{nUl%V$7~͋*~p8/΃`˳@/WϞQv? RX0C-bIoe޺)U'KݶX2m gyLj*/*\W @U~!hX-o"+?_}wv7:[}EO_|| xoitJ^~[i'b|lj t>mod rFjb7/ꇢhD'҈4@Q$p~{Dΰ+f@B,"kC;fPU)ՄVnQDZV 5˦+ =Ll02?EJV猨)9OR﫼,gM4FhluQhB,Nhf0RD@!YT%scCN"ɔĜP#y96b1f<1wc#ydXcCySE*MQQ H se8*Jbq#ǒ.8ۢVqͳ Pze&fz-8a@=êuJ QgisX$ZO:ɼ|6H>4U^O;)i88fPcp?ަS]RFM 8a!G:N=kx&*Qc^SbgTM} olM;Cߤ=fǖPBr^rm+Y0*QǜN88\8=Bċ`4jTېEp$[.рI4~%fONCɧ՛eC a"iNo9hc댟;2Ȼ( @ |1}{F)jq;ϯZw z*PZ~H ;^)n;UR߮oZ~95j+Y/V=/IFLi^^#R @~m:2Eq- 7oR$l[\z9f!豤@+ۉ~*ƢVHqCľ߻Y?<_A~jPqG1g)]X(o㈃Khi_f\BcpB/G$0X&A:)MdM" P [3ӇgW?B޾e, c8vHOh?> stream xYmoF_1]Ka%@Ӧq]`D'e'ұ_g(ʑlK-=ĮggٙY)Hd=% $IRڑ 5"m@k.!&K$x.X3CENе\hA&Ȁ ΐg' E NWxM!F)DoPd)a( RĶ b kDU4Hj C#j|2}+Ƀ-ibd@z'%2YЖoGxt-)Y +BF o7Ч3i06-cOJA> =L 3atV$U x,V"pڠ@aQk[ ;Z@8@ vI/${ ŃƸ0Ps, qK.a0ŴH׀ }E V0a?`oyx-߂* 0KDT$[XUSکeǔPQvD/bؔD?a5MrIu9_S|y9D9 dg`"ȳiu᣼OoU3!?S~Q=l7:GVC7oӲapMhG@3s΋ۚɈɨkTAeakbBuef V% LY˦O,ii7us?L6>gLb:U>.h;-fcy3,t4-5ұbXM9:-so`~'}頝stӺ?~(g*',7Șܔ2xzSLb`A)ȇwm1*>J `1 0&؟L*lFi3kqmfi@` h; ;bb'Mvp0aCB""#9 սQ3Sfac99q70YSFCquCIT?s&J!9$7볪j\Nha',2 H D8=22 & r 3=8J| Ā5胨54YVLuy^^j)y89 |6B$OĖ͊,DN[]hDjHȠE9wB>ܷAp8?%FfΘhr5URdD q".@E0@y$ W8 >=fvއ%?G>j3n{.Qq.+0Ol Mq \CqOR~ eHUS e*PZ  3NkQm]5bX]dK1.iVrjrC Y5:frru#>7m9J-:3ߌ@=3*UX`V"gcM%)\n$lF#|H*௫G^C/O[z 5;?uz{yp=u݆煄&"_#=#8Zdfa3 )sDDf-qc8ue͖̲z̲J_ȐH% [>ݜ[_预%^EE,Rge/&ߒ"N>H|E܌QJOBzD;]7%?\]vnԕsQ߂9KS 6وIE.|qI) endstream endobj 165 0 obj << /Length 3109 /Filter /FlateDecode >> stream xڝZIsD*%E\&6 WɶB-Y6\\)3vwhͫH~~ew* (S۝ЩlYL>~7bЉ ^}n8$^.it][;Ox[ۦkn{`\hV>X[7Uqz thMƷ<'y{A׷^]U PG-e_x &m5C{,p0. eMύ_"eSTJb_l믾 ΰ)~**yϭ0p p.Zڠod.C]6 ι*, 3]ߊ#_~lt3F):h,V6LζJ/n5B9Q1D D8Ά4,#p  ɻ(c' +H]qQ 6NeU!{S;\6w5͞1E^- ]ʾᛎJGnm  Z8pdo^fGL ̐[YMB%[$X3'ꭍ0skfN7Vg v1mT7UzD蔌9o< TʅoE^Og&mCdmSo@@|0wpSU۰ ǯ$ƯDX ϛ"8d1/Arf""3z NxqW_+t-(x nx炸#4o5$ ڠoC-@l5Ue\ǬOZvl5ַYYt0 PcvOH-#5}!xO:LJ]DNJE+MKA毆l^KobtG|Ǹ4iZ*r`e_qZ}QxEUp'09 yF~n>+xZ3K,h>P*닶0ዶ6Yp2̫ד2iN10-x@Dㅸ3 뼒 7xLc1;Ԅi-krGS'\%"t=TYdڽU kfE}8~?gpҕ iWă98B#Ӭ1U| ;D/]+]e>+ %,?QX0R8t 7r8r񾃤6o燪81<(Cy0+K$Tƈ.u!J#O~2esGT֜2ͬBFd_SoyOO g`+8_eYSX$ߓ L9ZQʯ`G1eʍyqO-.^ĿS=toȀǦ"^S~('ڋM PMoI8>xAzs27 X16#4'ErN-'DN&9Ań7.cU\$[M-۬I@ZokO}ͮnn]Y~MYdG#ЛF;&bw> stream xڭnF_1ȋ9ads$GjȈUWWެܾWsc/VM ]m_ˬHF[4k;W&߶Q~Nc|Qz1I*i]soWN,yvbϋmQgѷNY5ޭa|N}}ߺ: owovJ \ʊ7%봪3 _mﻡn`bPzM<<)sN$ӜG9Ǥ&;6* ꯞ2'pOMD10 a,S9L8uy" L2Cgd``p^C^wMD:9HBF,P_,}'[*njMoȷn|=iէW fZQ];7o% ձ]=i]QW?G 0yw}sqj*;,aH־@ցhJ/n?@ʪ< Gp F@_A6_0aHLj쟲b{AC6Mvx.uVQl"n"xcjm|Qy #7,Iݣ>! ik\{#6jAumr.C7.K!uM_I^?ZexBHv2KN7Bs}Wk 1Er۲س흑&w:"]w}8*fkb^N6YtM4Ӽ7@Q <2H";RvBçyy(8M|,c2`a0Xhd-yVhkbzz@SI1f+p#ځBg~]VlwkRtV%/-oqȍzxUqbyoo~YDevs-iotf pfg&S ‘T 8`}>?Sy 2@iT}mlS GW4Mfq.T61"7f$l!,a/Ww~xӇ$~(xyҢ=!4P놃}-׻Q4S)HZF1ŗL]<{M!ۈ.GR\!xw7@Mv T+Y,غQ8$8_#OB_cb*[ %Jn':hRŢE~௸K]tm$X*k.f#6 "ݎ}S,]wٞ _x(nXH}X{Q0V$c|9⫊@$<  gf%[ D#b5v,+iɇJMtbB OKՇ>R}mɚQ_dHإT wQ8M26D8xX)f_uiBQ_^"חdW,؀;z4b\%'H(aоd R7|R'Å+YW*ICw%]qL|Yl6C$I3Rc^Ȱ$oe{ţ,MexOEg;6|$۫qb *KVCO*mYO;* @7 /BȻRT#oYV3RHD.\  1 TZdC`Hy,yuk,d~~yfIΆFP&/[66N p ./uQOSĠڐ.KsQI$#] SbSacuuHv8>SV!9ȕ\+gp98,rpp9JzԄ'U*ڇ*J4|Tr*]<#q]jcgʓtd5*]p=y@xM?/nɖ¡F !$˦C@kWLO^֞;M I`0+,юPe6->gl,dF -a\y!0٧xŧ\D6D]ͬtRNj]@=:x(r>yOqѾ6b7Г"*A'ν>_Qԕ^TӘ 戵QCC" ȢQ l,p%VR˰ v_ "brCʐ7oF endstream endobj 179 0 obj << /Length 3154 /Filter /FlateDecode >> stream xڭZ[sܶ~ؗ3g4f;NNLL]"'5(^݈F)Kۑ -GNI&]OG'W;烳냯V "0s2?O>#TGa| |4]T;fҴñ'p,$rHrH3_89J1 m`1`%9^ @*0}plQ gDclgFARJFm>;=8~R{!rQڢQ`)/se!BRE]>{{v5(5XQ)kf օ%;@p-b/A- Dldc[@Jۨ7>tVqؽpz NmA&y(P3LJ) eT`zy*܃n/^.GS[sTWg̙a H E^Ǔwg`%iPjKIYR;N@ʤQϮ/΢JB4HeUZPy- HY-ox'%^h\0:a(] s!y?})]K/ή/~Q{EH`֖Qώ-,UØܢ Qu2mܿv,uI9^嬇M!=pKX;\Ap8}^`\0,@jDZ#5!"fD,7 FudoICtFSKdNЫ$+&jU,>ׇG|)ACc3jV<-m?2*+.@n8zzIYKi7:x Ͱ>`_J'")&RRBkYaky (Y>u. W8+DyHbS6B%4Ob1-&A)["&pSӚr*fdNGfVg( :\m 0&"(\Pxii΄u8`k:--<u-ۼ,!S/Fp^|XvCXu.8i64ڐ}H8eRGG"I] lj9p0@ YQGXVovO &dS0ę$>?^+I[2C0X )ҵc,MWtipi|?i0]&{Hu]67lE[*F{+fڻ/ xrcJ`Z٘ڦv ڳ9!Tq{iT}Ɣ5jtk/8OC 0]W` ejYH LнEZ3r8'5 =7\ǰY\46|)W*}SttT=v ^|?ZIە(+Z{f@KD=lgEa]uk҂h,gy]k %4`ھ14Ыz(}OKs.7]u=Dða.*KZ_l0Z?*?_.{Q,`xƭTt"yO"r9x'x">wD;ƚB[ 㱀5nDy6%_ XC/<cPW=f5tF! =OK :)*О{QL;;Җ P3<EY@РAXzmWW?}3 4[81ې0t&yh7Q#h ]CDbdB|ٔrJ!fUj#&:h)ePԅ*!X A:bp=7MIZo \Q1aW~XCiJNУV VPD.iN%,A$8. Is!2hJ!5;_RC#Yߨ ͊lY+̂U듋 +S:I(i2V35Ⴊ̤ZyVcWA~-zݒ嗆];UI ?Î2_Ͳ 2|dL$i"9peS!an{b(jf1ܑ.2rx<D^t0 .!Йyh,eC}M6+?CA3^CQ=5x.qSԬZPA@bSÛdmq_R6AI'/u5-L p&/ *}qm]3ݴ 8m-/m) _xї`8:%}bT|5\o_ԤPe&xŅF{dK8ά gw'n<8 hA'Mf!u:W0/7_xUo5۔Ԏ#̣.J(.ErswO29ޒ)qVu# ŸvUēd*Eu:zx{L*ds!vu9Mʹ endstream endobj 188 0 obj << /Length 3011 /Filter /FlateDecode >> stream xڭr_U\%R\mXH`E* (\=}w/v~U_~7hTE6Y7?D':nNuV5f/þulW,/pxe/9ѱw/ۓWe}5iy*~vEmDF\-ۢ=s <40*)o=Pa}Ú}(-b]I ~ByuEF7tDHNN0>ո/^urgY[+tE2wy|,?hgU ҈ 2+kFe鈥۟6 ݱc/o; /Zi{ tI[&צdz-P>FŤQnj);^nԌj0<M,:*}[g{6t[qd9C(DUjHǨy 'fGโْ#7zV/_/9]5}T @v@Fv8]V ol_L#%2%OJfΔuUv&LUE˟U;PRi4- 2ُ ⫙iuIDA @4:dy#z(bן`o:]t+:8n'[~HR(CACʎfFD=f210$ZO8)$ W%LVI%6I͞!mm))Vy3&_#nI)m#{Z!;M>QvFFzLՒ+[Yߠ>[ PjX)(-`I\Pw(t!09* `#c K/Zltц4+;2\Bi0ɓ8l#sB e6:-8@w״' b3#?8h(:u:󧓄t( MIX#4EwN T ^ƚKPjHZĨ8AC X&o,7mzL; } >?Ǘyt w7c3:<־ B;HQ-?/Q@8+2QSO1&̠+Hti0kᘛyj qwYjcufCucEdڂ eoi?^$PN +/*Υ.^dˬVzm+19ʴAyb&9*Լ$ZOZJȵ16A&r=6mAvj,UZH2; ?Z*U!ºSe_EW endstream endobj 194 0 obj << /Length 3240 /Filter /FlateDecode >> stream xڭَ6}):laMΑ`Tq5k:_R䣝LݗEIśtśM瓘ϯ|Z&<^cM*6ׇpJEUO7CtUY}. 4<ůYb\_sjDĩK="d3 EDEU}1u{ӨhWw迿G}xW'h֊\fEbr"TU ݶ'X=ϗ fN:p*2ty5#dxsQpDFu?<;|P|GF|)*UArrgѩ}uɺ2\8Tx_ ъIFs]q#6`{n]XA \],{[ tUT&TtCYLTS]:QY cx}ӁY[?:muʜ`K:r'`S"vJ-`kBNLn͹#)-sJ5vXo.&Fh Xzxe y#s;\%N~$yp^L) 2HT@1AqAtny aKj8Θ[~[5"E:Da Sy$ùOd2HDnp(;tM 3.ap)1jSsCC)m6eҚ])$cBwEԹ."h™Ww~pM//~z'X0QZIb) 9O~5` vwKH 7'LQ ͬT唥WoJ'c&Hb"2 n (=XWrVxSݙPnEt&Np-:\zZ[4a  S w%-Q:N"/@cR`kxdRp~M\ԨǵjdY ["ԊWquuifq 3W0(mxE]k eV#}3jc aZC2 LOH&y¦Tc՚O. r=G|vA3,؝s4);栵G-{ | xb % ._` pBpBho`",Y`jɿT;I`ֹ4'wI)t>&vR!B0|,_9+й`dʹ'H帪%֋+A v.:B@"QQcġw'x,%.Du; BPHPq\q\κbTԊi sN{qjQ+ c!ӐRG܏;Xg ݹyF.G"dRP D` D$^_S,!z+9:%A{Y[oiT*%TmE4e4 Wɦϼ,4]7,u~w%EMS':0 nH+:@Sh21w婃ٮ3k{8{(kCjJ5@<?&igxyf I^oC8D)n4PrN?PdBܽi8;ࡻ{X[8O}$P^5.,\G\qhy~RqK+pQ޸aO&*>9ZEў\ ZT{Ogb2*Gk{d̊?1Ɔ@HDu @lbTc;P~2dqwd xQ\c:7 6eCI*aM6 8^-ץ2u~S+ln(3m`IB5~Je뀽22LLssmۻ7o}]]e:E&2)tZr@[)F'@Y^fFdc V#}PJsߡOS7~տsHAe's@s!WP(LPt84L ? sSW%+#b>0AIrv\ /6: ^K #2b5K %'thv:Kٻͨ?XjEwxJCP)]럲!w5 `pW)/q4c7x{q4뒖97>L]qgMy  D6U6̡tϭ6FjtM&dPç"hJ/@Gr&f7);8V*`[Jz3hJJCֲ7Pv>ӎ,t+|"@NX^"_"(+uWM1~Oj_ endstream endobj 200 0 obj << /Length 2728 /Filter /FlateDecode >> stream xڍYKo8WȀ[i`N2wBKlio(T$d=?^ūQvj]E-0I"<-/6rЎ**]k_e0vߑ7[ܩ˸LF0u65XJҙ'09]*I3Ǯaz8ZVNc^0y\D-nDv`6};ϣzKhEah=pdla8K(Kj/(LTUYqVJAkjwZ.@e/խy`Q$wWgٍ:50 Ë$8-|?bN8Gzӯu',>?AW,U_fLpbZMB6Iv0*Mx\@WmA ITRk~T[,M6kuu-G6^c  ߽^:&E7` ׿_v;Fd+2:yi A9F)6V[:/&E[X2F Jh.Fq:(l5N:4f<<04V CHR 6)^93 *夂OTRAlj{=-$(,Xa+S5LL Ƿnj: `J.CQl@W$؃V qvh/yp??){f͢\=v.cyVUK^z@8lR*J! ɣT{A{D MX@-eƢ((II)22 HU })*U&LLN! {xO7XCo0tԙWY 8F &n4"t_qjf LZ:EX:277ã+'0ڟ47 >-I1HEzRAZ=88LEl`twYI/Gk0z=YQMR'('X"$4z wnM; u!֏I1P[(^pi-͏;<"|$Ge.nHͱq#=[#ݮ$PUמQ|EufNCWyRa/;]Ig7?q#fyQ¤r{w.I$OO\DR rӰp?3Ľ~ɂW`g&!=8SfU>C|D@79O0.&p7ޜBK-|CtٮңsF%> XLL GH[Cdy0Mi?gN s=PT<7&OÔ}VaVgZtwEfo\ApXkӁK㘮?>1.XlAKL)P)n!ZUV$56CHU43U=_{ͫ4 xxt<;@'x{cD$47V^S&` %k*W2۶s\[dQ_\GlKA<ћ> stream xڭr8_PUC*۱w:[}9MDyڍp̏>|&+y/#*f;f^Ů 5ӟή!'ePuT6kc.e@nOd&UXNfBZݦJVGO"YMg%2३GMB7ﯮ8SIw ZVԿ(Ic-I.ǽ04>"GXV8%PjXV.`'^ƦHj𲶪 y' ?+';ġю,Q1r1.6CH|%d/}ۍtsƁTT *g̷ސKٷ2CA>T3μ 잇t$Nl|hzi-¨V2ivz|P6YZ >s >7)x[U/!C!ymiv'DvC@15_EY`;|7{nZϻ f oilmsi˖Nlv(S[ !eU,.i tR8m&{MgIj7]Rn!.āh-Xۨw7FR2̠6HwM! 1M _9P!۬u.%tײT50a;X0*>Tn H)ӡHQ5+#pFDp`5\e`o3^d@% :29HDuV\[ *%AUCg >ѼCoޞ2]qmӛK 5vQ߃Ec?d>7BP D endstream endobj 209 0 obj << /Length 2529 /Filter /FlateDecode >> stream xڥYm6“/vbU{l.\t4\[Yr%6ݙD@,ſ<;>]B 幩AuFAX4|(@|X ?*7H"(eʚ[׏Aɜ؍/Ys0r Dj=Nk׋՜*RݹNi7\9-q4̆rHvD *kDEۚ²rv5Yޙ,[,UJ |7 R1)D!Ϛ~\Ay }St[|4զ۶2)Aԙֵ^JJij:X&6|ja>R/ (99IDq7T70&EIcO|IADW9_xmwz6*S>G)Mz'~qH$u1:.ɍ `Jb_9=!Y`=p>%G'FQ mN]e0Ea|0ˢG.gnE6_`h5fcVLI`A*bB>Weu2弾`žちC0 3&OJ5($KӋח/ "h_HE]©eD =o~}LX린ĊV"'F%]7Ol$C+_5g_:8C$[]-$&72?aH [#dRcJ'sӶx 8^!IP>2oo^*oĩ[7Y[5:C㹮(+B 9{X"u֗Le b,Bց?B/l!eD-ƾ*]'PFP{kI[k|vbG~w 0XȞU/Dx_@od?-_/'@-Բ(/NxI{ơ*hlD^@z\s!rZ3|ڜoiEnf!Ra= n(fF*PhtpR=z6ȧ66px;%*hC Hqa&K#t_}$U7/V˝cIrU㫰i=̒H b,jucˈ}`a />v8}j|5M}!}@H U ='!MC#k fS#m0:&G>!ᙊ=SfM-Mil/묳vo'UQF+lMi.5ie!ъ9[{SngA$K|^)a+>`6*<׋՝b.LPD pSuqZ2ȗoz`vꦑlHčcn/?2`` ^mʯtGNlwD c;B*+.v+_AN-h,4u fE{TF Oyλ 46#x?_ xʒ]Ν~}Yx磚88_F /hCmGL~.`EtCN϶ _qΟ\g􊏭&Vv'1K9QE%}w plyV2X3_0P$ yzL,J`S-. j8v2LS"+s c i6~r'=:oN]-[K4!6KyRˠo7_/_<כ0')Ǖ@Ӛ;++.ۼxi9#"DF.!ZV2F.,\mD..9ITMA-Y_\]Hе U]֛p  &'j9c~A\ZZ$|bԓ_0_?~ūs@i5FA} E:qv!h,ڶ7|'_-u۬Bvl erN~W{٦+y c$@7>JU>MUġ{" ed*JU0d-pBq=DƋ'eF\Iۇ}U/͍t'5[mC85I 10{GE!s endstream endobj 215 0 obj << /Length 2191 /Filter /FlateDecode >> stream xY[o~ R =( [N,%6rD*nί?3;KT)ms .3;oh=x{{hvafe*N,t yBpo €Tċ,!¶@(gk<ϒq J0]eG0ʊU)%*msOx"@y3 o-Vgν%<'ElIWbZʼj[5 cyH캿,4]/4<&*H_3 jCZ1ŃSC`eB,~Yť o<_M*X]AiPg]~u]oeO LX[=:)!,SydyzR2TՒZYˋLK؃UVX"_@v&zFLiz6|xPΎTYZ.â ;|nFh#L v3puhs޼; ivB|n {)@6\*T/0Ӯ@!$^yr(H@*UU|/Yw2!-o~E% zoh)Si٠`D͚)U'qZ-]8-o\h43>2sԻ \jZwEq~\ς^\fRb "P oa39j e<]! ^LбHuklw~y=P3ODD, 跞!Su,<`>h?{EI "{hP4:4D%:ݦB`S6OKwf8ʒ|3L{u±ܦYYub m/GmP( ]&Tqs- j|Xup1'}icZ5/]&5)*\tMJa@@iYOBd}V ć66Ψl,\~/KWR8BsqcHoJZ-+K-)ԺdW{ǔt  0h1}xCkw]sܸw{9 ?v*Y(^PRiͮ2Ró-坟0z+}y=/|0%{'Τq&2PZ|-|APcx cU.K<Xz`Z|m[ Ds@ 0#^=e Byri )'nA鲔+ 6%< -_4W;驿1虗 zN#SСH$v5) ։*3=7BA4X\ SPk$\i j#Ozz>3?GVP3,fz7]9暸{z:*[ؗoabtV)ЯgnB>Kˋl#+RQiL^GC'\QB$ ӓ d[jkR>(:`c'|TqєkK`n; 5 4"*#]!jȯ[5sۚf" nD)뼒Q 3*!Ң$!}GӦt(Bt@H%/WAj_CM.jgKp{2!bZTma14_@}?%|zȶN+]o :Ň@ w@3i$>ccؿkrN|dxs pt0> `j+@{3aGFY[-a\ endstream endobj 221 0 obj << /Length 2245 /Filter /FlateDecode >> stream xڥXmsF_WWR]mvS~XڤRIj,a / {}Z.f_X3og߾iyj-}#(VI\W=IO~O璇Y}os G)K9bLH))Yn:bndO"mA|ݕ:[칡PhmmCJ3Vpa{7Wˏ7(}6_}>HDiH$Xm~kX1CIDDE8[nL@N0ҋWS֑I$YڝҖDZNyi4zd2s^xޝ; 50!#{͸-E+px:#mtt Ňw,ESvqvsHqVukUԉxGQ' qtb.#i ٢qxQV-]b{KAxwqF{Τa{QG$ߟy1]ϴ?F٪m9 /tט N'^DGB49LB DR\`XpUͫi]ȉU$kn3Bi1')=Vk mM]bh| o ro F8H\:4=&ld tr:I''[ӦNnOpxpk[W4 /X3bF+ԉvպQ[Ъ*0mN,_#O"6=pt=ˣN2Cl ;Nt15ZUUCmJF0jDO~čOA rq} uscCwBh2aqz},M3mh3[ &Nv۵[cbv9櫫'+7җY`'$e0a! MaLg$8SM]. -Nrky/(m׮B@tL%`=l/wh.n*5dq@>s^tߓp;]V]Kn6aZ᮱ۋI@,UUkTμ@IE>&6~q.dGR>qߤk'NqOa@[ 6}:+W\~7*ǖt@Ksn-;{$} YkΥ%v\?K ce=xs9_L}8eqB5>ą/Mr\⠏Pk}Tuf׳t[MݞLI\ܠR;rDEqlq kW4_,0׹0_SYš)ʱ)<ꝳ.m3N/(8[h/y4`'1l<ִi4w~=R?Ip ]|q{L4 2*uX6gI[VbȕVqhvc799 W9%}nlK (m 8R " U.WBm&*}_3C3`B_z}}APqpdP3= L|$U5GuPZ쉉qf,=F\mɵSoJԉMN޷4Et#Xwo&"C! Qw%O9M/+<P98pi|54- ]JFcq1rg!_s JĨ;Nr\e+;ZܕXGZd#A1* 䯠Lv(j> stream xڥZnH}Wmd 6K͎`iTH*{ySh ٬ԩRjyv{tV3=τS{3:ݦ !d0_M$M^ fx JxBa߲<-_B+zU8F rbS&Gz /.^.07!p6g7 LʈoC ݻ7ޛuFk#h5}x:V7H/f#ܝ&Ky&5 OhͩC9B; F`-k>--tX"RUCTY92NK!BsEZӝfmAF.]$q^p"MZ .T}h/D+.罠/V?2而^RiоΈJhnnuKMR$#[2I!gg~~RpȍhE[zXNFYb!v\$$~;ܔXGcï,ԞO`y/_?_~x]ҬOdYNe}"#+%Έa|k"6=T0Se؝9@Iת)vh؇,+JܑYzj}o[|y  @F(*wY@CFU ϗ񘮼G`##Y*Z~P`!NZY}M(]ßr mU iR ˜d 4iY; qbqsvVɖP8$=MpΚYB 2mLqЄ}l|r̂-bkBˈ<wjm/G ›#jLRȋ{A.3ˁUYlpK_8ݴQ*FI.yěۣG*Be)%f 4=ءۙPJc@M7Z`{y2' Vis=MD{LF ]nɿtc@kX Г=ݱElʹ^FkS y+s[Spl,.a^KȜZa=:4p]T *: zDT)9rGNO+00XbٹD ]޲O U Dϵk6^s KEQݹ^Ӊ4WjKF\F!f'h⻪\UvoL~LFd&R Lp>$#=@, CqvAN;2C嚒%Ή[%w%vP=O\Ԫ\źRyd7+hxIR,zIӜ!L8<}7 ]J[8A\F 8c qj7nP0G M|Lps혟`UbOJ+ғLrcQM-*עHe*S۩udѯ',_ζE`OZ55WQʨhVrǚcI:iKI5YNx`(X3dXe$x < /J#^fC{6KKw4 82 Nu"xKdI 6ehWmM$ڥ4|tfyvRRНF ||Ck*6I[ۇd[w֍AIɦYT-ZYH' Nfq x"-+v@4"059QV 8|WeY~IVQM+~x+Ja*W6sc%HMYd.NRsY͒q'KGߕ&]$ی, KYRR;%/Yydգr= b"{iKWT6y[[-6# -\qT -kW/$ }~.0M`am͡]Y}r`?}hMG$čoj[|,o iQ \Ic*:.~]?W؅9(|VYT7 Z>՟7&'BĢ] aGݓڔ,~1CHjF'pwoWm"ɟJ9@Uty/I:Rn>rgK#Ydi ԑVsu nJ%B~ c\N!c : e\c@E<) CWB[eCd0,"0MW{czdr&kPY[iB}gXx WT;5+tF endstream endobj 253 0 obj << /Length 2448 /Filter /FlateDecode >> stream xڕYmo6__ ˀH-@qҦ\Z:kڸ?3RZ:~9|< 7XݮO=zU, &dJxbտ<՟?ZM~D23sh7C7}{Á횮mugŚ/W}MqMZx&Y ߴtE]'Mj=} WU5֮WYE,u(X$3tQx!6攞rmy3N R|X3ͶUQE-_r}MOtΜiJ7/v?bO9U0=]au%`/8n5cs94M AADzT-F=Pݨ 354:EYR?_Q٨ @LJ K\3FUuNCɂIاnkݲB`ݨCs7ep,r9dz[ vmcTB,M3cؠT6S}}1k\'۪CNH`.wY 3i{J0jk#:JɯvD!߷WGj6&fĖ6z B,Yt.sa,o~MCյU(Kv }L4^dX .߇0,Ȥ M?e{GE27msL e@dvVmm筹㹍Mo1|KSjT9#Y,O4e\ w/o~^3aM "]޸eK eQ믡tp,M$\pXSwp }Kx~qa{~uZ9sC-wg0E7nMZd̸~xHfJUkg%OG^^EؠC"όJe qxڎ(G3%OC2Re!e , uQn=K#c! nvs!j<9cHېkuM׭%u:f3t}۪$6C/<dgVL6羫u wpAvE j YjruK@zd,`~} + ǠgUu4k 6>6YaxxQ>DbGcъ"#UH*ȩq~'I 1բQbp4ە/rȌ3*S{]5;=@P78"G<4 %EbM@+Map&6)z4.V:`IF׈`D|Q47j!tw7;Ff4B IеCMf {l V" x@ŹYECOA(#^Ʋ;i~ ="\ֳkF0pۮ@>]}'!y;*[>I ?.Yw+d G(^G66[2d$>@4RH5mHF :QJhVcEK؆Kp+GGY̩ 0B3%]N%QK!n X P Vz> Bx7&y4ZVP}ꑘP4%"\KDŒ0vo/.񲘳$p<}}[֚D::UWGcڈ0m\(eq* 08{5@|\ * c<:k06;F~ÈHq|2gh$^krU3"7qvrukWM}ۙ@WDYhwL9Qh4廚N}Pn8Щ݊O$$?Cܭ'K;*A2%utc}N%<kN- qX@grf쓧:#~1%59{z`< XρO6,v|K1hVbDā(_P:'T]۸j /0!1plԭm/m B lh?~ZuSM0dL90\L5CiHIu})!WWm`~%liLZcM+ \o #@jeOr i]tK<;ǵ^[##}>t~1DBD!@K{{Іà 8&R&.rl7Mg*> stream xڭXAw6 W调D")R{oY׮풾YgK$7e}Aɖ#'鶋E Oj ,ܩ0,x̬ Eddd۲Bw4uNڲZNF3X4pp{ ]fV^|ԣ=HOȊZ#kyyZEI#w޴0xMVp1*;[-}گ ~NhAGoz][,h@e,.'˖A]+QVk9p>l&$)( kr&X`wCtر!zM֕ PEk n+M\Ў6h=kia5Q۽^ᖄ n5KۆV(Bivql-)ȋk;6`*^3ϙJoˤrsfbR\̔S|єJO8&$-'}st p j Г RB7jbIGDb#xȄ2!'[GPcf{UM>`D ];VClIAVENǣ)S+>dٻ%[S]O0 >6/R # Ǒo 5HA*:|*@-="m |SF"`Sz6菇nUx+pE` 0@_hŸ3IƠ8),u:]Kli(@@S*__ Eծꮥu|KͻvE2~62}4n؎x7ڭhlh|T@QHyӵմ^I/(-4߉#􍹁W37ZOxP5w endstream endobj 283 0 obj << /Length 3005 /Filter /FlateDecode >> stream xڕYmܶ_ DxW}I"nNݪJIE~{d'~933\wq7>s7&h_?6D^B?Ϋ^F;EV?:Q\ot*qM x"q/7Wڹ&k"h'o_)Z:}(N) P>VZ+u.7]_z}հ?Z/~_tVX^j3kQZeMgCh?CE& leS;-ԉiUbEza)ؿtaVć$] DeuE Dl²UPHHv X9w:Vx=X WLo}GF%ěH%ˆQI`W%rVq|}#KuE/KB xN:NckEg%ʋ躨:oS8?k|W2~s\)eP/e~([`&۫8i*Q"|EhcN6Aݴ.*u U;IOs) š=Qe/-:G YéîY$햍McٞGи}Q ;| $@W݆ »Ys8VEnl;kA8)Ӫy;g~=B19e!{&E]/ 8`C[*fjG $rT8+&|s֍wғH^DTE%B:@rep# BY0]qQ&Nibvpm^ڄWNl"D$oq&9='@8C_V4:?oW &5Hyƛ+d`l${Tg F6E oPQuiםyNwBSC{m@h(=V|qim< X9!`ª#rUS8~NgѩƍnEkonǧ1(s%tZoNBན3YIIT ϝ7Β!IdyZ_`F?3"@#@1( W0p^S89e=E*v)0# fonp]n-(ʼnC!co(j0 8^B[騺w:slNcKjj`nλM9tBp{"UHkvp YE`vѪA(aˮOԇ6=)t1)NQ (ەD/$ߵaivL.1K2(AZyhŻvt_ >QZ9%_4ˢnǽ/UN')_n/R7 \[S_|hfNF(,>؈fF"}g;# ηcq0ghY$vM4!WC ,)r!McsdfIvm؇>mpvKQ l BWrpl${@? _D-ی5Ֆ!%}:0fs. 8ij_1CPE.5(crr&[Whq&,_[=SCRm^*#$}ɴ^ɅN<)/HV[z %h2Xyh Zid+eHw_ڦH[+P޲Y>=KUx-jv%̸A(=t J$UT5|񸟻y_:NH8K]*sqZ6J Z P?f.%.%ۥl§tA-y13 |b?y,l"40>dP@h> $'s`P%vPz\ t7JB/:Vu 8)a^l5EOϻZxSSsĚ)D&ٞECӞzgHjy.םc%gv k{ь'Q^pzࣟ9 y޿yk"D8XTV|P3[@:3i<=a{J{mǷ>F;tq:' ~; oӞOuCGn99mQi#W^GJ2b8ME؆Ft1!5Cf!|>M/J~ L 1.f! endstream endobj 161 0 obj << /Type /ObjStm /N 100 /First 882 /Length 2624 /Filter /FlateDecode >> stream xZnG}WK= Yod vE%)EEr $̅U6e Al #)GkkƕU0W&:SUi;v|R~DFfIa,7QYVL\UX2Їmby,7A +rˀPL>(0VQ"+s(!-=c +g1 9 @Ή8FK\a@&* an〈 #[v Axu,뚤qzEd!|¦'gi@6FزNy n y\|QYJ7 1lQ#fD1 fMJ2@ @ 9D \& V>MYI%'D$/RĶ{&M@O3 !b̾Q|V9fY+ g&b8  1!BVIms`E fd"xn'jl/:Xh٠xYokUyD`:]O?f:;S+K6^AP^Lԭ4-^N;^zlsyE_MYw+U-?j? /Alz)v,rY]/FqͫyIXM[=V.0oɟff|x$ay<2}ϫŸ\4+OŋwyF lT;H m#tp {*VOjeDT*FZ-Mޥݨ=XԾ.7bZjs-HdNGG..-vG4:B#riwG۶ڵ:Z_x.a_ûI=6xz3W`VٍN]M'%~oxvvL_<ՓjV)gj9hQ-UWE9{z,pɺhw{sXOOn>$ɐ,u` ?IwhHWB:q i9מ s@o9}@K2}c%9ڪblDגPJ' !.ȎW9ND\7ٛXU+} }6r:dwl\zj]Y daщ>,%sbzy{[Mwi7rLFwx,*kAȖWh!cvђOAKWp|B| x1F 5i)ŽȽRܱ92OdFhT}EV: OJ/^>Bz16@bOQGԝܻ{z T.'l{xE_2IG#v&HG[A..FNaĞf{Snڗt@BMN"LaIZkjB1WW^m2 ň,2cmoҤ1QQ>*EQ*txrr捄6#5s!l/WD/}x@Qs@={B_ Dz8O;BYuYꘄR?sIi߷KH{Zpb^.UK AYwAzS.!a j40GCu=/>7<̲/7΋9{HIN,FE]I;"70bV+|SV6;lۺUھjԠt^=[$V9л}$oOlumcX?A3^AZ(g .p4ŢD5ZISdϰ(3sA!@"|sף˧7bV.,.{ ?D O=[$F>rb*u9MX|,尾 OG q!Lj+xQj@ S'/|gҠ,X#pXw3>̨C~ocsV.h7>L.軇(4ZΠDu\{V}Te*8Lo= E-b[괟=B_m߭x^%soNjSi~*.6mx܈&ו _h%m+2 IEErͬO endstream endobj 295 0 obj << /Length 413 /Filter /FlateDecode >> stream xeRM0WzQJ\ $C6M$) ;h<{~1'C\9J2@8ܑ~gtҙ )4z Cd/[cRRah(;nuO52QWlXme6{8+y qL)Ap|^H0T䅒W4qۮ>B8zDڷhwnc#Ҿo|clɴ*t6LSדZ^Y,(:̌ cB?Ɉp? QlŶ%<1yedyp=)F>wmDk%v#zmN]ꁧ۲hM`l|TϪUρ endstream endobj 266 0 obj << /Type /XObject /Subtype /Image /Width 461 /Height 384 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 17558 /Filter/FlateDecode /DecodeParms<> >> stream xy$e}?OUu{q+ñ?5BE B^Z$H xxpfDDgD`cacfxSSSUuuꝭ~y9O=TB˧STQУBSaZT09 GM r1 Ӌp!܇ Xt DA`& h @1pstV9*&MUzzO֋ EJr(Ic9CGG2jcixC`p۷Yö#] UN->O0ѬXɓ -==Pՠ56p? ʌ9:~jzM1ф;8ax :ˎ} SBa3 T4h`ՅP@SD]؁vƄƄ AD\#yTׅP,6vvZL5`YЄ`X0**!,Q 694BHcUc0[/gc&C;_^h+R1 E`*``pM@&31Os4)u(h6N׹\pbT K`),*C`á1wWHSR 3…RsO0΅1:`T٠=(#6F+gݼ ,Qa+zZn#_?dX1 o;oajcâgB`J6:{/`xř`trDD1_wi14"FtM( t,#GtLz3`[p_~paС(0u²},#SvYumfr`Fa`LSjCg{*@oI>}vc=3e`+E:[&ajodCbpu!8aqB]uln:?b`u3U;Z^ a²%L]u12lmܺume?f`p&^Î =Sj|qư&Q$[v2Ue&,B@ACU%mvۛ*TipKpBe`)Pq㝷Rh,A3ʕ5ԜB+WX]hd2mT1\;Xu[>k KXվe@@ ۘaQ)uЅaa a²(@ e:+*PP*tUߞ!-++Vx Y1(!W-rA718$TC#3>Xּwb]=(Uup FPTshұ=w0tn¬0YĎLQV RAj& *Sp<87te\[jAiחNđz@=ߎyu#uk$^~|wugL=_uӯ[4f3-k<.KK֟ 3ۧ2uQ=u,zr014E00mR 2ꆘ.;IGU~ gc#0TEÎ0_X{aԅ~S&Җju4T&?c"VKZ_U`N ;]n|WLp"Ow{n~[gLwyZ!tÄiSMGL K`v@_3,XBxƳu뢮 Xwځo!,܂e" .OhgǟX a7U4.'L1I]?`Gy3fLG`ݞZzȌ=8qk3o|>w?ꓓgLRڣoّC>zw]o6ulz&/Ioe⧗U}gQf}P%LMA {[2[LE +,n}Ȧ X`L0, |QQaw;p>i}w2`1UV3րZP*>/{T^]8=+=YZ#'O6orxYcCDL!c#ff狻?x̽ggak`'q^~k>,zgvq~K۩n^2݉lm߼dK_m,?qK_}{&؁6ݟCkίw=xLXϸ{˃1?! \\@P4@ř~ _ȹ, dzjGa0-`bnyx뤅" &s&+6$(UT{TX8\ɰB`p ik>'jlFr>kw uqQ}Co_*e\v j^{}Кo#fSe`zoXޞ{>+uca'<8ng}sǖa/_w;OMmֿ?:ާXW}NtCWxYeۛ7/t⾳-nn3lh~I!Wc.wͪ^0W{Blc0$Go-~oϭĹ{ٔ?]P{m[׭g{9ʣw=oK^Nr>9}]8Z.A01C7`ZO ا=_k}OוN9' ͫ p V [i/Vco]gsZ~xe/{8]/gː`&?l}۽w}/ ݼt[:ջK=VI{V^U)'0,覰88)8K}eWokT`)lB 1@twNQ06,qX񬘀ҎQ ۮ՘}yU*B/0 lV<۵ 䆗_^gyMf8{?_O<Ɖ߸k ;GʌI%kBӧioc9pۚ{}|mCo_j>asKOtW7la;i#&5.*#œt⨃o_?>u^ Fii*MY ?t&+SA ٷOјCY3 #¨ .  !s)fK-LMf3bb #+ovQV] g_zK@3-1sIEpܻM4L\Ӊ*O뫾;ep'3ueܝ8#`K!2'#o^:$T~Gc q+3ԟnMSwb18(` pK̰.40)vbg?O S͇,fY¾zEJ 4[d0*vۘ+W6vծx)U22BS~>yKeЮ:yyٕXswR5KoOXs].h7}?|㛷_^tv;^|5uNzʟ)ڧ9w:{ߗFyv{#n3w磕`Oͳn?y?Z`=)gk񙆰8koW]ybqo7{ɷ];^v#3 _epO{ƞ\aC_Wۋ~O+/؁t]ep[WVyq]dꇞs5v)~r ~+8xG_Ə74+_(MVS @?M1D݄n 5" 2~[[>.#| C=?[z=Mô>LVѣ1Tf\E6k5v\.Dc"p.#gC['8/P+$|4k?s@Tz]0Ƒ6Ek_`Mk1{ @{kϘ:ƈ3ZGy0r%aqƎ-lxMTz5:m#@*ukBa; C{F+OGRLnjk`FP_.COGS0MrgʶSoִOTћS~S7(c$6Uh*g3< =/tĈt]#}X1ot;WE:MRzzۓL̬3KCnm֚pAۀKx 3me= cBSʠ2U_~U;.W ,f5 ¤DD1X7U4EĪ=L՘f0nҙþ MغفS^0Ll5?7~B(U%3 SL ѐZmLj1B?{DWv ?eۆ:USc & jX\L=g)k7Ŗ 0ZCLp&,,qKX3MaZ!`:tVV-c`\@QYHbLFY: (/~3NZ]0p. ,,( ,CL׼o =V=|ym}jEqsUa `RŸnYR-u6ϰٱ(bn* 0+Vg==lwN`@@c.Q,K-ȏ~YxbZT7 z>M֥Äp 1m""s{-@hjuTRUZ徕P0RrA:[m#e4KYBm< Qp5#>7MM ؗ7 h!LmDUeq6zP5X*TGyOhf ©Ζ FPXf78ky2d)P j/x`UFè8ouDtlr"=+(4C x0' 6hң̟8)6ly hY')XN[Ad ,ADAd ,ADAd ,ADf<3g4Nش~M.A4h3gm|\I+/^PA\gm5ܼI??}W\yuZ# $ .[o77h_q$3B/FI<,](R?!:BX;pF=(%q ֛{ R(0w"zYsJ5|ve/AD>b`Ys&(?Y^Ѵ';R- :ljS鯨idAR$]1tI_g&q͖ٛ`Pb6N$n'3C"9+c?Y.ZZMS fmKȕn' m]ݐa &HTRYKbk'q7y ʏArCwbjo?c?SIHu50՛?$oҟ7g+2v{vE<I0o`{(K7j'/IyrlřLnSI.VFvAѴRoJMDg<2%e7S"%X45xEv#b ${1臟#(O.;5 |IfI'ek (0NӴMЄII>]$Byb#?EOqLZ]%am@dzM~B[VA2ۉuvXnHveܸ3_Kr/sN%ۅTJLklHD%Pq< 8FQn RkZ xCY|!g!jn [#Cg:yaUai&_+q2A"a!,A6y謣AqAV+ٰRI <V!ɜdWFK)&AZ/ \qeW?bͤ9H{@8['0_ga?g`.1JIJ#JŔG';CDWg Y l!%Y l!%ADg⺮GVe SnZFass&/^к4>S)Z#XjˢD6F֞C$-S)ߧpkkYvLX gIsd:-ORL2y^U&Qꄢ]h]AD\İD,fY|"AEQWi8ODQR~\gҖ^. %iӪ:Xl]AdD{2˩یE`3g2%, % bFd]B^)A:KDp.z^ADxֿ漛׃Z<傸$?0AUV/g tHM&H^|][s"H 1,Q4o~&b%p^oy9$ w'NUgZͪ lӲOD'nw<D\NO?M7Wu<Vk UUQxU'xpW2So-Dcҧpy"ۓ h0B| WKz(MɡB< z׳NJEjLVMn%h=_:| ,ѩ)a(1!D'WEiX;H|nDlt؝<$5@t99ݧ׿= {Tq.yrUVEO4Vt77<\X3]9@{oGOyLO!CʑB=nU6)Ht6ӱմb*q5 Y\JAĥ`/q/8ТX4dџC7Q&,F*,i0DozB`LqJX%$i#NDf%$dힸ4-k;'!u5Z30KTEXFoy(nDϴKn6AYMDV #5$%Hg t "[[?js.{N+ w,{&ÒK\oaya"k:F$<$IZ!n+yǠBB[tȳ[Y e/N%Ȏul@IwINr_gW`.߈)<1Fv֩=$ g49"y.ZDFy] #5,mjMED@AdG=m`W{Bi䴲ڞ%$vR䇊z:m. y,aw/גzo$lU|]uOjdz)m~ߵC5M.5XM7+bG":y]6BJ""Oy]tHD_fꛠsECjKZ.n.;?AtRq@D}z^W)Z.9ɺ"gy]mFUM.UXM7Q(-%8g nqfY Cddg-,/NgEjBs|k*^zchz P2?K{lΘL'鐾uޣp[, !._ .g`ZS;,' \. 0U[; ,xz֜/s>t1l~/p%xltH'T7nLKE׮6X`g`P iu8x+pi n=TX{2cW_ \S7vlxd nOp~WB9κ`rXq0~ՋPhmT{6Y+^n,F<%.ϯϟ{QIv'I<+8%Ȟ{r.96Lڒ @a,vynXEfv?5,aZ```rCS `-j-\?ԅ{>x96QNW+e˯~êϝ{$R!}B.sVruלlX&,u@s9g KhmʍD֎ ?UlR{.duMVF,+׮\y0M,[.";Ѫd?ڒ `` X|,9"Ó ,eϚf㌃ E\xEv[ۿܲLӲw %,L;mJ|cGڷ b|sl~"K $R!y-U[&p_w]$BOP S´řZ ֶ^PMKZ77.6YK9(JcϿׯ:oŦ=tlr-n p.! 8W9B s&RA L\imP5REtX9_}(=*rOl{r˴ga& ! */1"8Fn6K P w2Qpޕߨ LگZ܄h=g z[1& )c[O=̫.WMhyӎu.MAHu'ݳ[Gv 2t1菧sfTєzN;v>[65o A9S+8-ftS:Mh)fjo 苔`+Ћ i$accHƳ?uiZ :tv5i"$܀ "[Hg t "[Hg t "[Hg t "[Hg t "#,AD֤v#2EQ>~T(sQ2At uKZR~,=M Ad ,ADAd ,ADAd ,ADAd ,ADf0t "kQggY+&;7۩i_$5EbZSI۸̚sgF6;u#̚p:8p)6w9f*\kצe*~桄u+sp=;mb ŵ.= (^g[F8ʋ%d&d^"p=k5wgh$N`6. ~*wE m]iFXu&h%=cgyk,joKJN$}GH$8bF#Q Vw*k *_RvFiAyFM7"ÒP΂ JWbŊ+^v*>0i I]dy55Q$$k381i40}xrP5;00пh vݒڊf׳Ss$m#ܦYQA(F^iZkw:@L%^%O^1~;R  !ZJ&wZ!1ZFn'IH$[4Ҿ(KҪ;|, Įc=tAS6.7 8B;9NXz7Iu ,NQTMm6AW~L\=vŌaI`=z.6lyóo aQ <:;E+#V7ej Q옏?%_> =gCGN"TskrAN^j[|=]9JAC~Ys\Z m:{Pj+Vx 6"lȮ\iw[zdzFlI}uNկ9 zrlU!k=~X'o:,Ƴ3+V`e-`=Q;N|kķ%[ ik١tӥTk$0n2 !l.Z4zgZCհZCgl,-HgE`5GDWJRZO1߿hѢdnoߓL-a8CF?,$ewTs/clLqcTcUzd$ On;ibOÊ /c~!? bxAp{׍ȳ:Ia!.1V"E'")$(vHjLЅR%WIIX STOY5;J6:Psje< DO=XCXdg=oZotԊ џu2"z+X.5qB /ZԿzum%Gdķ1xVBv!jfMuO@$!q5z7tB}ԙ] ώD6669;LWѦJLv8[g|"Zp&OIֱAt"B1x "kHg t "[Ҽ޻nIADg~ԥi"$RYzRAD 4?K-AB:K-AB:K- C,Nё{ t "[Hg t "[Hg t "[6"\iYN` <:$.f*5֙W`fY^V4-W70s֯: 0z-1(EtY̢{ﺥhG`hѠcD֍sh.'0̜?Ybck{lAA-K:Kt2ntK-\)8hiK 'bsM#NJZ%%x$3dz[@`u`H[6\-[ ctz5] ̬ ,1ΐdEh-98:frMIZtp9_┡wF'\ ڢ3u`Oݶl,eIg0mm-OFWLu0 'ēD6JzՔ,,r Y@$\O=vx^B:KI$H "3@A edKv!ow=Ζv*]BE*X!k˶ [޼( a^{ :ADAd ,ADAd ,ADAd ügzN$mn߶ [>iz' ژ |cxՑMF6`{qSEF^,J#M]IiT'%pdMyEj6o}"X? endstream endobj 267 0 obj << /Type /XObject /Subtype /Image /Width 468 /Height 352 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 16914 /Filter/FlateDecode /DecodeParms<> >> stream x{d?Os^h( " xYtݟ, ȲTeEEV֊*^`QS) B  Asz&|dNN$3dzfm {ܵ LIJ`[$%&wm߱c}iyUж`v05Qu5 HPb*^wk-0EFAwܮ9ȝیF J".F@BV-/9 fP1\( {$fC`8c^GEhKx0I:\ge  Rw à!JL,,l$,"")i@KBMUK%he SGYҠ$ }{ Pжb_J\K}΍,SM=S^2e]e]R/"i(uCh&\ .ܳA#7N} 1Z@0d9}9tLZvҖo`B [N;g貉7t6KC,=R>26adW2ao~/ r{LT'RJ+0 1wz_gϝvl <hkq[ug]O>~F_fKCߌ/y 5ܺO|Tfs/wyƷ65⮏L4KUQI,+?dO!m( iG5w7ܑYx'k75=arι?o0^~^tt7Q7g_w%?9H^> Oz%X*罶]}G\aZ@ﭭReXUɶ ˟<|~qͻ -DRێ0t'ANjމ4yo`/b/z7?BЀҪ9>NJbg'PIN/'?{'=n`GJwt::pZok[vyii'.=pBe鹗m7.yuCf9#k#BJLZu4'g;qG&;8q;C2<閭`V`Y%)E_wu=LH% BF ~he!tH/mW4]i0NrZ~WZo|{>vco/:A:tq?o9kGy$]}3ny=鱷]pϗο_-({_B.[Z~Tm*ð=խFB&8_$Duk4~oA0L]{W> woM8_'%;rJ_y9'v7=ʛM{[߽ ݿux oi[~Ԇw%1;L5=$|~s I?]z%g{Wv=ͿCN=q^vmIpND ]0T YMR4̼ݿޙ?|B0:U% ̲35@(G 㹍j4 Bwܯ9'scӪ_|]2ΛК]{thflzܜк楯ܯ}:8#,glqT^W_.Q3>|놕tuM&j&oˡN9ӫةbΨz%p3i ܱTUkW Y2+0f|Φ/|ӾcF$Pܑ/g.H4  i40r I[ire7[2_ZG}4{׷V5_Eoo_/o]< {jy8la^zלc,A'DK~W74 u}6z5g OoE̚7>`ħ`lM}?ڳ[OW#X΃%~›r}·\tFw(],׮|;}c;vV:)5g[+W?Iw~4suR睊ϏT<bs0i[DսEg`g}ru۱ǭYG`>Fgo\p0]zwȚfGK~)i[iO8^kџo `/sN>̿>r]`쯻?}/P~n-m/_gMxl~^a89O oY&U0 77JBIRrzdz}Jmòɉx#J@f~1ttBd]@bpou+1aA_ ~gH)hO/7V<,h=CN5l~riAڧʿ{? @!cKOvK~mm~Ibp[}ߨ4wxމc3zZmA n+mj*u^gue!'ڧJ#y~Epgҟ6ݻisŏ7^L'L=ZW  K(S!M&a2Mb+wѻW* ;*q>]d I?M<,HgN6R ~G;'㵞~Q!4%!LՔi ۄeڦcZ"ݰl`>5+H%t 4B_:.tNTƨm;aĨ- ߪ'Ϥm`^@7RB %HꐐP%lli[Â1߁|ɒ7I tEtXA4[#_#g*B~ذ\2H%4(kBNR(RAI)I;ԛvf8w.9 Wnd]] JNtyI HPN̴RILĖ;uAөZZE~e'v&9vG +쫑v(4 3Q )&`QuZxnefU5侳& ӖPR #2$(g(y2' 1u]3&=~mkow72ag{ᖍ+α(=h&0L/dT 6'75 _ S.}&NմRm],L45kmaڛ_w{VڰMn"MS RAJR"e+:Ҝq"+ Y-$uk= _u59U >$95cܤ3ZN*6LKI$I)a`)aZJZoi3|y/0c"+6TR i%ɲIZBJ ]غ;3<Ϸ )0LmV*Rؒ,IDD*,QT=5Th܅NNnjpi ۆJ"RtK/)"RT$}p @tb;0Q/w󿡛bVqOWTD 4RdJ) H9ca;5߂±&VZSp}+,ҝg{lz^GgO`7t<1gޱ/|ľUZ? 7WZ.h>yxw-{iCdI˴  m3prS#p0uqضu}36N8h&i4M^x,{xA7s{lۺdtwɆr <1{bsԣ陋S㔩GoƏX0 -5e;V4DlrW6`;즻;DN84HgL= s?# 13#[H2|swz?nj0XWkO1hUvblX; ڜp98jF&{;B^&.]?n7/'$|=lo!yQ< +Cb6dai2Ms±h/GEM+[7TKEw5oB١rPMEv(oCT_AB6ldcN=Լ ɆuRDm\Lj0/i0j_+ږPjšo܁D tꩧ{Y!!V ^~ОBیjI!11T9yLb䛻mN/*yĘ6!;X=[{\XshX݋lBh 3fa7O2˖-0w@0L(cNMYlٲe-Z$"g9000w@P h^0 StR|sW`K  ~v*CbO5I7 m6ʌmλnMfUCk ;wu˺ c\v|8J_1{l1|Z ݅н`2=i/.`hEJMr\a]vcn۠jlG,VRӯ#<`j6[?t]1mFmE)O#ߎmxA5_-էlmլ\* m6^_ $=%4_t;-0L&4RiuFk/0Yѐw`۠♭n2 JDVN8NͷfŬm[%5_).9i%`|;v hj1fmCI$mQ )S0ۡ!K0mQtFlͷ7̰ m uTI>"a_s[;;_32|6BghxEG C7 ԆcdT}ߠf컯c/6E v$'|}t<\GfW0bDc4_bIuٚoC䍋@I#Ĵ9x{O%:J2h7Mv<γ!{]Mjx;uo>=gE4{z)t|COD_ eBڬWAf.1+j_ 7~bLb2&42;KM>}fCf+ɉc*F,dplΚH7EVouR7WU<J8cTݚl4җWm-$$;կx Zй|CmRl4_aZ>vͷJB5_tNPdbY|ݚ;$mi/4ߖ0( m0rdMy{d:6cm+Әf&X,'jU}rDxbMSjI9h-600F)uQP\7"֘MYiQIڏ.jS x|+ޏvXhOr|Y?eq &fi6~!^$7]:C[R ^CapS#&z~yhoH^4ۼ lN&Oݱm#qKgFu ʗ>dn*5g4jӊ),3QZLhdp ,,O#P5LQWM!;636cvx0i<߄KhZmJk$iR-aFcr2&NBͦz[3-\pE:I0LivWLSDkE!E0cΌlw:(B ;+5g5QUu#05nɋ7!Jtǔ{,&?&Y-s!Yof©1Uک_V_1F{ގni^<$mjVÈ^T\m*>qcYhwo0LRȿn TBhJvǨ>)W7H b;' ;۝2mWvA=0Yo nTx\sC:1Xcf 紭34L=GZ'oְw&0clAMu|>&3C.|_jviH٭ GMvhgլa3,ͷyxi;ܢ4V$അ}v1[Gcq|6BqZ-}(gjTf'j稆3u@,-#(wD 8EpLՎ)l?I~1U MnD6YpK.\h… u:hbs#~r|8aiOOh) i1vHrEh0ۢ1xf G *ĢVzi6M|Sn{ޚZgԬ3ɷc_aN4FY?g3ykhѢpºgCgKй eisa>vRv| FlYL;|yw^_ "T#N=Uaiv,7- pVo N=ɏac;7d:1:ϷIF{mqHԲm_ 9|SzhDLfyU^-T͗a2?obOrW_m]Q60m)K&Z͎Ri *-JUW!|5_hZi6q̊4Me+ eKsf+άvH~B-"Z&I Qx 8۶4yWI}Zņi)IIRJM2-%[N/1Bv(.;k[I^JwB :!x8-6'X%X7>3]ZaSefu=HC®a{vamIhWІb;p>vge+ɽ4s~-iݷżi+fO }8fGxehGi fe8+|Ճ'h(]n_Q*!I@IR9rD.DPtb&]-1dMuW͝C^on"3nSigCC4h$ )"E0 :ͷ u)5$a|GҤxQ":π(8d6Cc "$lN۸wLaA-{G{&+ RB Uw|m<7N,/eB,cM&5Q'JbzFPRPH${iƍL2k52JRSx^_i%Y%S%*݅MoGTM !U QfB洽/Dݼ*-3S7!9i;V ZР"LUVj?FUiPoEMr0cj$4}thRR`Xr|4߄wu1g֑/IQȄv.e~>K;|vl}-ȷ7UB[TFy`u ޘ 2N?VCrּXX @Ϳrgep hϬWH#74Qy)lrj9to2*˭|f{~~U|[7tCgk>s{q!}%,?},`|$♤IzO[ƫ|p,#o.{kl4^|qʝޭQwB< y4B{Ҕi:_xfёoZ$n`g^K7// HFߺE/R<ߘFh<߄&1c<|'!a< 0{ͨܽU 32Ф#FYf'-ۈ[>p#oM-ㅋnޕ \p.M2-熛썇xh Nc0x #_dK R!FJ8f s _sw؈jByuh"5>J w5Ę͒E|ȞIʺ ҉)Ipԇa M)ؕ3O(~lm=r"|gl4=O P\2yBJ1Қ^ @@=^Yl Q6T->7wB#BD5 8͙k 3[o땄pY7ʩO;80hVV]xX+H᳍CsD_h˖-EMBk9Ѷ|CoN*zȢ{ f֑)Lv.8suլr׃|xn|-ZԈn2ӝ֧f2ם"n͌XkUS==gug'p_?ۓ{Oyc֌# S.\5]+I33:h'jʹO`3f<>4aݻt%36 /#:4__:d$%I|2v@`^wղwG_l?ڲn3٣LSYl"H#E"K9嘩/[;E--Vy%b#\ɜum'N6lE6 iKF?cq=OϪ߆46Yr^^إn5L$qh#hlM6+FBz}npGcUl)QɴRQ"m B6!"ȷJnڔž; nc>Cwօ1va1-yMSYR MHܾ4_'rաnpQo%D|.jj1i:߬|ҟox3lV+ޱ&4~l?{YlC󦄝Z:o&j{nBtUM 13p\Jt'’H]}EJQbL;:AuQ;R==uȸR[fyZ m?`|fU|+; 7kʒO^fZYJ,9Pl6L1ڲfOEu`t04t>~v5b_\ɼ|Ԍczgj>2|̷(V k 8{w_x)tJBJ(I&EB^?Yi)F%MB$az5z `dJ)R`Y:̎|˴{[Ka2'7}/9:gY?z:ҳg]zO=sg}v lx׉S2:#E<9k['}n&a2W/2sm&jT]"$N1J]9#1ƐCkY5UF4eJ[TmT=c/oD$o(L8UJoۺ>ms=ϝu2*y¤|y$A7f|kg֘K bi-c8/{׬]ַ{6+{녗7m0`=^zf\|%d`8&MTӳ+/l?~jj}r캽RvZ\녗m(5︩K]}쁽Tݟ2S/uuO3?@%wjرPoYNQA6>ҥ$HRP'[S3}v )KF $^ZUkޯk۠ 3`Ҟjuͷ48ѕ%%URV //^|@AJ9︾_ӏ?ĩuJ $j4MۺcoOz9`ژ޾K^+K'ѳR?:˿cV*Rؒ,Ip,QT=TUW ʗP;j,.kחr&{ ̴?K^ T,D92vҲAL[6TTW"EDƞ $ MB(j' KQX .kחB9(O^1*Q'vtZ<1IDDW_ɼv &%}b;~7-n5BҠ{LW_Z|S08r Hʼ{ϓ:_?>τҮaJ#QGsl~#o.'bԪ/_-[NmO~%(cUo0>vSOrՌmWwF߰$ Dž)RJ R$5P@UA@]t;kZ厌4N1m-aK`44!뮯jb>l"(ЌS5B.Ĕ”U1+ѣz,l'YLY-A$R%HT \:zn+oɋ.trrSض3@ - l[:m-J%la'C DDeC'%E)LA]_U>/ $!u 5?84Сk<@}%|)ʰw{GwCv[$0.YKNk feϻN_~ѴRW_z6(~崽pl!RRIR>~$PJ)AUӹ}a+2-)-0hLrX#KNki~]:D3mNľҖDԉ#r )&k*Ҫ($sai25ilY}:,IaIW5/%iŵ>0;ʹ:NI1]FXחO>b߃KX{sfH}VPzpy &uu| I#ߺq!eBR#`v&wwL b6VVjږJ'>>o+Ԑ1>|qU_G 'QɑzqĬWm'^mMq[e}u'ωFR{b䛻Mȵ0šo!Oe&w]1-ck[%0E21 StX-$2LAa͗a&OX-aÚo!0E5Bš/|a5B.)0`ͷaÚo!a͗a ʔKxA 0 r0LaͷaÚo!a͗a k 0yšo! | ):|L92 k\2 StX-db[HXeš/0L[%0E5B&ak5_)(2 k\2 StX-db |L915_a`ͷKakL | k SPXe| d[0Laͷ0eTy0 3 k]2 StX-dbcWO2 0 2^xCϗa&2 ;_a`0 |ar/0Lha1|ar/0Lev 09`$/:eͳa8 l\d {ֹk0 )oBw0 Ԅ5_a`0 |ar@Wh2 ô/da/0Lev 09Ηa&2 ;_aHہaZ>^ M.#o+WVlT|vd5y~u߽ Qg;1OKI0pcۄy(7|&GƮb0L.e1=sO;5UT[Ɣy?n~eŔ釅N6͏*xw<]h1aˌ-WGL{u{I)GAl(>XП%}[6thgO8;GL voZ10]b7Co[ua^\-»˾ i |$G8+^ƈVD*2|zM<5e:x;Zuj`[} /spy^y]wn-ؽ |[!:)Gf22t,zOǓƹQ:B..13" o bt(M^¡CZTͶ!pԷ/Z->&,;0+N x9lQހ*"g_xk 7ɆD &_/gƕsmSrjg1w‰ҙΗd.2i,&)42 ;_a`0 2L>zyeڑwL_vA&II`˴c1u c oD+ǟ4umko6aÙr1o1 ;_a`0 |ar/0Lev 09Ηa&2 ǻ=طgmdYRje 0&l _f-;@V2 dW&de%hf# Z$zsucה^#}jK*3Nl @ڄ]y0 3]{; endstream endobj 300 0 obj << /Length 386 /Filter /FlateDecode >> stream xeRMs0+r1/ !U;NGnmeFo“a&ol0!> stream x_ם?L[;nnnG?tl&Ǐx?n+061M| A 0$@;8~l3G"A^Μ9sΙ939Ar\v}dddfflbH^t:m6861$kR6-ia $nM 4sedddhh`0秤$R"m ,=y XS.rw` C q:555 .]*,,,((qFjj*%&@V{ꍬ nPiO˗$Bƍ6bئik3؆ .\@ʮrh4ZDDFC힜wtiiTVVijv;nmiۭr*s/싟|V64J#=VImꓧ*jv׾.s-_KbBzQPu~%鴮`\[{]+d˪ ʕ+4nlllootVbhZZDD(ʻ755zf,z^j~USNJE{Ymnie;adCq8ȑ:ޠo8r$*zVvȑ4Dmm5Vqȑ#_egŋ;}b \mЫFGV8qe8fgOF{idTT@q ??%B -L([ݫ( hM J2555݉.Z42P6'Ot{R'<<i7;4[=# l%l*~bsA-w[=aWP=.r4WO[I QbKzW$5:,SScʌSWڛ|:Lxq"R畓_iw|,Ϯ1Y+3NemSѩw}t)"W>`O>RY W>/,IeY LN{K THGɥHvR@S+w\WNՔ\+#yyyMMMlѐZNiel~-ww7)e[vwR3M҃OK ĬK)ۂݎ.dpigF}mLR.oNC^Evuعlh͏%vKj Oo82nj֖^;k*G"#vh4Z|7\Bmlgkgܑ#ŝiZR%b#iɦp8ttva쨤 %],vA%*%2VmhȵT<"6R1&5݄|]Ceujj954[Bb`-:yCj-$G\J5iH(e[vw2;W0;a{zh>ZU;el.H eU~(e41K*M R5L0Ooi!Q;_"wӛ,q92nvuibTԥnPORs}?m#.*x>ǭrU})5q4*vv;6Qi2shHLRZFG2@}Vks_:iW@4W;mxs%%%4e&kAqM$VD(۲&Ȕ)e Uݻw;;; H\VauiR#Gfw }mҡLFO,6 Ƨjr[hJU!WHrbbuw܉I;r[:K"͸$iWkꬠJrnG#Cç$z@e"𕴩MR~)kcF' Wb##yhrp<*7nK)VƁ~uU(,g:ϴpY۔EN"Cdlr*SWZlEGqV+@ۚ}]ձgt,w0X ͻȘLUvw޲*%&ʰr4 jhiRox #}mơÙw.sm4~1#r݈+5}.6uFl+ACGK&4v-8} .6fU% FWMAugRDg7ԚXAmhFF~+F5󎘇/K{1ҿ)f9m<e&䟧{ rb#ٱs] ;Im}wIOV4`uTW>eE?T\V3\Qj 4`0 P -MCvW($zR-͵DhVIʹ鱻SڥS"mZyw‡zM_rZLעMfӂ-b*;\p2ZYÖ'rXNmaK9=.7eu[|{x$I*:0'x98tHUٽk146e 2<⡍nw54̲,.&s'ۆcǎOƿQF_G[ln#);{C¿pK1eg_$xpn"nl<}_|#XoQy?9Ӻӯ*^c\Q˩Ѭ{=O.#FsPNHp#9a]D:&5 H$ sܹst599?zbeO54ܼ>w-Kx` ?=jqԷX[Rawl &$dim0_|7O'n Ʋ Y -.AFrŽ h4]®UNx٬q 'bt/|N5l/>P7D<-/7T_:T3ྺ8f@bBӶkX[;w>:;wĥL ceA7Ѽss* 42~bb ~Y/9 ~E\{߿ L(_}I@2%(? /]]~E g+JK(u2<_'roP!A EGGqUs VPKRy٭f|Vuձ&S\]\8ч :{m`XVԮ?ljVwDXWw3i;Wqb>%]:*I>)}PDf];}F%Gʟ>페xx$|3իMk;}*Z=lY_÷W$)) Q}ļkDׂ VQ #kDeG4 q.ZOkcAN-)5i_tmRۿ+)+$!UQvQYV {4#vS"vո}'N)j6w 5 `ԏw)P3_^PPv.] >\a@}ʶNZIO7v3ˤ|_*_س|4 ssz.{XrTBٰO;_B ߢl,5:KfgY͝+%]@cK.X>.h_Eͯ.+% /gazgۓ鐚a9"GS2[Hs2 ?Ԟhߡ&V\PĖ'$s\Umk ^Xh+;#njL+]4fb XeA8tS<^8p8?{gpS Cȫ.eNe!hrG M,mȡ$VPPW6 FMM S+aKKé8qUgeCGAwSm] {Aֳ66˿SɂՖ>Tg23/)"<383?5K0lK,cd]J-%ԮX*їE/9߹(G-/^&{yjŒX1 '_~#M={mqw## 2<,L`{t72jt@({c3U0>ڲ޵(:ڝ%(؉*_#HV-# wK[o)IQDz#BC: )IY\[P2)t ^WWg4tmjZt5999"e_(jshk> 'hW)Z)RJk9>2ŠQ9[K#-J+8W%5),~ZiԤG]η h)Q*p#JӫUıW`ޚo9{i*m} UUf J^s΍ Vi(P*~!$N+}QWzK,jG8\@Ԕ}oS͊4U'/M Ϲ0/)!exI!m)UFcB+W>24#{UCC%8-),rWj^%-6juDk,t3b?RfrX-ej7E8T=ʮK6FqjK:G=ߘP Q×))q>KY]v#eyiSY^{%z']g)RmocY%5 HY\[P2)t Nw2Žihh4J >==ʌ]:kپ:Yx˩x].u,Wȵ<;UV?c׵SmOxZGfۗ:Qx(ҿ^)mQUl`/_|=UV~V3XZU⯅_ ¯J_=]ֽI%tFYo[hbؼ*x6_BYזtH* Q_]21`[ ~t\z]w)h1og|3xFNK_,) pwG≷k'j>|G4jׂyDXם3qt}zi\oJ*hu9vP7|ivSE4LegE^uĵX.%]裞oLrT^~JEG좳rQ"/{]'u_w=wwK_ ˂ H {3A&%nvf3N_{K]#F4=>>2 )qd|p|ӸKz<uvv:VÀ0Zk KT.i0X,A)a1Ys/B􌾰cf (>ĿmIG#AYW؏);npNǾ_\`L/THX9;?|| 7XC&;"`ll|xC؄'Oa.ZMY&k[}~:m%:ֆB5Nڴ1忾_+~g%>Β?ӝ֟?c[S[H:@7 G=Em&\m9\[M(D[ioڶ 4f_K~or іh_>`v逤@3;ib/` 111? 둑-6zmy._^߂q8Շd焲Z?mbwі2I@ Mf+--=q[o&m逤@j Al·t`E3񁁁Zu-$IaξaP𿔷)#08 ap O R9x^ O7뜃oX98 ap 08 08 yValhhMOOv {FFƭ[)&08`ي cp0U\\aZGFFF+tETN ǟJfq`prrrz{{ggg LOOOnnnQQE),'O7a?***~ }ٙwSSS4/(((Edҍ7x? ~ǻn橇 K_WTVS(zgՍmf?WoܸaX:?)2,h4=էo hfffX?ן3|Gׇ^?:B!JuA8uwrt+aWe6UjP%j˝,N,zgՍQ~"z9Ζ<66F ?dLUz#;*ð4!..NZmӅ>7l6͛7)b|G6t0#-y lW㽱xoy/z`+{W: _K~O NoY$ɢRmq׻?߲ Wwo,)^i7O{ љ{榼GA>yrJ[w{~['sGr{鑜pE9Ċ<T=Τݥ/WSF;:"ޝ+i{ë<ʫ/LN4 o@7_Euv`:gxv;9P9SJܫMx0HC!JQ***Zϵǂq5~_&#.4=cc xMO3.8+ >N:iƶ(K(m $4#<;ؓG!vQ~&.nڧB;#rMe\`1KVM}r hd5vIgu%;)mNttcUw:{Z NL4FQOi~kqWQc'0 B<_)pnPxi[[[n- _8^)rՍHAxP![xnya4y5`Y"s yzߊl˻/w+ϜQ64^M6\<6Fȿf= Dvpxp7d3zͨ3lE]wU(bk &0L)JJ۶5?k'k1Zd6Ԯ?|{ k}͟ӣJv%]™V+Xq3[7 - A7ڇo"1H1SrX;%\qƟ/JݷLkWM#b_v/cDT1k#{8obI|}FEItu|=g/NiK0X:6FȿWUUѼ?<Xx֏-E|ƾ4~u605j2}C {@Ūz;V33܇ j3?hlllnnlt'gɖ<MbEߪ{lXY,z<|${Z5YOd bxx")J< 0 ΅HOuuu4((CQZapep]ǍF#:t:vŁDŽK Jf`?N7LdpTP(ͬF>x{ȮS+ G:eLFem}F5fq`ΟQN\][\}\f5v+N(Ǎ_L?|O*_ |Q|*e"[zmH$1wpYǼmLP%l f寈_mS^!pIe.=X{`]9s!ʴH䣅H \p[ w Ϊh܏hrݹT:Yֹg3Ȼj.JcZ`,K˨ys+|z.2n}}JLm댓xJR4v??dtJ/X<(Wb$ϔvYS6{BJ3<ݣgubNIK} М˯^zVbMSN" ƻ9 Ϳy7o;ʘ[bAn):HdăsRogefް%)08S 2t[ gOi R*SB7^>'ۡ ?Nɇ:RBxV䙗7xzif ^[}XqMg/>_W'{7+D?iNc?[期L{7cK2WYe.3$puhxgp0wM&鼳^Ȳ٧Y'ui6UsەsjƹIpK<2n,FjCS{O)3S}KS`po )Cea}hV|=&}xg79JvM8^dnLn{U+Uﲁ-dҒ7<e66W?g#$gȝ{}0-zVvҗz2I|#Qf-4JR_ < }+ <3E7)'}ԥ)08ŻHq6tq;s?,K0rNkRvZN.~w)UlOhG)Q`%b|8K <+^$-̲8#.m]育uIÛl\*mhhMOOv {FFƭ[)&0x 0x M*..Z###:vŁA*Ȅ082 Un]333===EEEy2`;??gn㟞((((E0878R__ "S@BA񧰌Rdffq: 0: rr9-ѥ~Znʿu?|o uf(ݼy"wԟJ% [;wP]yy9 !j(t2)t 98lS-flX+ccOEOiesY<к}G=#k=lg+MåR)-sSt2w\TD"hbHWxGCkR(i+imj\ f8w6+oX%\k\bI"%-vO[KTvն_;WiY5CD3hNQXGy_ L&3'ot}Ef)J;WpJ5s[8rn_ԋ۸+ ω)53gM-&fi |\vXz^_e}M$` \WTTL&swϾׂ4%.AP3#_.Ց{URje*ʞ]cy,ϹZ+'QB$L:l1UJSl2d-k"0L)JJ txFDjz\Zۡ幖I9*VeMxEʹ)J===555734h$jZ%Iܽ?)cMT7H6Zym32hI۷QZy1iX92GG1kJU:{E&RIՑ].ot)%K}k^/ۤ^]0НW3isjSy&' M~I9AcΧA Xu| WyN)b7|'ghpӤ&dpSSS3Oq/MO8;tkYȴ{)2dpS֩B`@cccssƞudKzpP)V[UapJ?L[YYP(hJSNX{tWCp2 Eb'˯҅]ӑhv]Q0Q QCCŇ~ )4/(( Funt }qd$K E@ѠPdif VU՝:vŁA1Yk08O*_ |Q|؁JOgbpRi`p!O7 9x):ap`po7 sap!777==ڵkW+tnjll08lZsw;::Vv"@qh)2a8 0x p8HU999GELOOOnnnQQQ~ <,ϧ?3&''/ (Ja8 0 N߸qjF0W_QQѬ2NmV( (uJfffX.kpp0;;[.]'L.Ø8 I(5MU~]E]N&>7:fQn޼I[;0848{Ν;Tx8K+aڍKʑwh䵅7Rm5]P+ZZ+vo:x0CVTTTapipl6+8<<x}lt,H_Dkda3dRIEڱÝK(4\*2 YrQElt8D<Β$.rW^?\(iewfXА{Qܐw YJ.rILLQfp2]̗d%&fZ*&fuRk+3J+sYi J1*J|յ]CkzagD, |7 2h4Ef+#C1,WMS& Lc06qv'JEKE jMAJ҆"qZbٯkZEh Rwvw+2岦6oIzБ(v]M$`sgpRI`k\WTTL&r ww{xҔR2$$˫:6[r ;Tr5/ABFآ[MfO)])q犩d+Q*qDqZwxXM+b~q5)%)ͺ޾{@lWA`&S(VLJ>xc[UUU4x<#"yulv,nkiFΎ$2oI$lA{YsRdӔԼW[J:l eSx~߾IR[%iqAwVӺFGԴTNɶH|yt6$ȜC-*TN_2v'vu˚o2}Zr7_*(P98ghpHWմJ {?)sę퍒Ah9hM K/osx<&M{VGNLY 2<Jb79)|aTw%=&cm)%Exzߩ(7ڨR7]fHJ^^qsS728188ԤT*:2wwrWH ~NIHLʩyvSR= [L_K-RqIotq7KJHNR ' Mҿ'++]5=/5%xyu*I{{;E↿& NtTVUUѤ οUujjjfEƽ.\&i"NάEy"qoR,Fl/:E NBp:U oUhlllnnlt'g=&a/\UPpE|X~Ŷ~zpP)V1|*gkpd 4|tUU%DQ4~cjhN(Qd08auQt:S]].}+ f}1J!jhhP/A`p;f4%Fu>sŁDŽK aphp8d2uvvRi~~~"@qhPL(2x 4 _llAժ ;E@Ѡ5`j`(>?% 08 0:Q*6 2)t 98`s78 9808 08ap 08 08 08ap ap  `p`p GTl6`pfȤӍ78u7x08`p080808  `p`p 080808 08ap 08 Ri`p!O7 9x):ap`p08 08ap 08 `p080808 zJfkLJ>xc08X| |ap  `p`p 080808  `p`pap`p0Q*6 2)t 98`s78 9808 08ap 08 08 08ap ap  `p`p GTl6`pfȤӍ78u7x08`p080808  `p`p 080808 08ap 08 Ri`p!O7 9x):ap`p08 08ap 08 `p080808 zJfkLJ>xc08X| |ap  `p`p 080808  `p`pap`p0Q*6 2)t 98`s78 9808 08ap0x?][ i"gM~:G}dI!T?I]LxAg6u|AT$E9 K0K5O6Fޠ2꺱zXY?_~LXӓl+JͶz?:ɱlK;-΁-c]Љ}BvVf^ mH3M ,EzTI]Gt^%䍘7vn?L|N yF!n :Y4y}n1wLb)wIjo]t-oM7Gi'|%ӔnVK}ĎVE~lwDzz,k$]ڟP1K588E;?&Վ*"K/-AqN~E˒O'˝cϮ)޿?BcGGk rm]Phtb9t]CfW%c7Ke\ߓ⹶ܙL Pv'y;AYe'dR|sp ]owˢwp-+-~c;g.2TgbcbO;!zTE-^Bf7 YuLAG;A3.Agb*v't&ZSc$Tڟ&ױj"O, BW͞/j)ceEzY(hX&l]P^x2P1 ݤP"ؽ Vz?RҘ,^1`14:ڼ1=ZYQsh9{`ّV0,|wh!/=Ϊ~IxI/D(4inu%'7L,ve춑U,8bU\Q䉪Щvİ'zYvf@* eۑ-Q!'NgBW$aEX,ݶY|ӫU:93o+/9P/ -Ђ-:h2Yưm *vU,װE0"`4qkJ׹:Kѹ3y(S9}3R)#***)i-t -MӆP$4iV}Z{쏕?԰kؿke9m$2HkSN Q=!WGk/C26@.xUZ/zMk ( yL2:czsF"/'6Vg@9EڹfENDh6gŋNY-(*QM-\J 4&{IlQ}$ݪfKrڈx=BR *.e!^@ rIYIw5ѫSd\cpaI]%{ε^t)eo! Z}wu"*hU<Q390E./lsI>xK4&#GGMauN^ . DȹT< NPj;`/J.Q|b4JLT!9\ -춚Ek5zXn1Ǐ&CMӇ}[Mt*yVBfs{V0 n"neM /'SepjfwjiM$g"e}'ȕ Cǂ=)d@51:_%38G)6A 4ǠiYHo`ˍ%ja_Wtn[TX.:ڴF0L= J&' tzmL@0!L]*!s B ֆ 27/cVVWXm:1518u)/^ȫhrzͦ˹k;iIhF%y5DiU+/+\Q- .Su#2C <UE˳xH.GZ`d&W{ Y6o&l;b@Ewz<ښ彎*-Bhdi$Q&,s9WɦV0:y"WM^VIt~F[7=kr4: ml{NhO~B~l<׌hR|ef755~yTNw5uze]M 'bE38䴰Z3Du6x*4.U&Jb4}UQ ð,,:%aZ'Ю yJ iF]F?O *LP o'>Z$1?W/3ë8\n#HR'hH1ԙ'Ϯj'ﲠ%_BHy .NSvky\a1.Eݬcrc 2'j[S!JQ4iaT ά&[<iP{0H,9Df\0ovڂ NWv>eTHPagUDNsAOX P?}A0&!OPs:N~&z/zYl9"^)Di)n1=r%nCdz*:-.eЪA1k28aI6NjkßW h!)#xщYA}R"V2U sL-jlUujKk6OX%oT4y4SƋցƖZ v(~VFGq*w+Ц5aSe^Vk*˛⿤d*&,,nsW@F ݜV[zJj,4CU]YG +G 8ҴYSG Vp\ۋ/zTQ+Fȩ$W#(yr+]I{P*;Xt'cgULeB, x베 j_K*a&sj rl='MԸNx^Wb6 Y%]DC4+SO A08/'ښ 5QⅽӎHRJJ7$Y3W>VϤqDXDAaJhKg^$ۮ&Wa>-vmj d\t*'8NA(X9Umah'҅J9h"' zNtN)WeaY2zTcMQġ!z.#|,PrPΫi S ym {Ul++*=±4f@ѯ̍ Y&S ^=q 9Kțp }y31qӌ=ZsHa U@1c1^%buፈ SNˏNi#zNaP? i[_K2,"RW)&dph].#gguHPƀ;A֪ !s沀l'؈ǬH7E<>thErH \ e`ps\!]̬tq.GlEJ6!8T {$RɷOtOay>8P=.!V2Sepc跸!LzT:y5a e,-1XJ6Ī3 SN0M & i6-ji"cǎ;wn N~ ݅ېxrs.5)1C=> Ëg{M55kn8%I)hKa'ME=5l2)`B+,F}$F-WH[e\!)1`(]֙G718TfH' @pSEϳ6$f{ک!HY{ nff1]VNSޙ9vZ.2#}&4T1VYӈF?tS_%e ;zNa3 ifσ4cRO҃[~&> xDOelkz;2l YIP;A[mj_eCݥ3$0LCtYTy9iB5Q-؋b^\dqU\!yM , _*MB!M槒xQPurIf{ ej,*m2N*c7^5cjӣℽ32x2"shCwTXu<] #*W n QyaJ礮4yPlSUJ]級){ #zѥ4p'ARI2QQ1n2n䴠 ?tÃBW˸BLGnLj~aR>*]RǢ{ ei6ߺ,zLՋMsPZLX<3ĪKi,zΠlq!ؒbD0/%291DWq  4NtyQ{#0X @ 2828@ @ #@G @ dp@ @ ## @ 28@ @ ## @ @ d  9s+@ 3(P!?T& ~(}ttt@  L |:@ @ @ @ @ @ @ @ @ /+ g[4//ax $ ?AxP0@@k׮]H?bN:{/Ȧ6lO;v~ƍ0uy'_xP{2@@nkkK$W]vg >%EvիW\ڻw/(2/g3LNN^oᄏA9ׯױXgE~f$zA 34@ ߇⧟~zH{eŋccc۷o|Yf,[+¯p N<Ǣ_A/ArHKK (Gu8ǎi h?u@d?>ܹMOO_t P]lǬ烖[d=_I$p(wP*.H uv;<|%W`&j!uy>$d 9^@"Pg F[~07o wYb<~çH쯯oٽ{ལ> 0~t֩@3qPtfbs΁@ה% mo'|W50=5FAwyT[C?e˖ 6=/|+pBĊ}cSSSdmt3S}g;6bV[vr:U X,YgϞ}}O>$$`&W\M9]`S|[L)t9u({UVVŸ ?s|Jwu hbw! 8J%I7?p r&%bM`ooocvff>loQ1_{m]P0һ}Sޝpn:zx/ c2N, :rDQIP kݸFlP7U.~|㎿?m/7rCۚ5K-$ULZ>}q\?<|Tx< UUU@po۶ @Jۍc@@s^}YRvw]8dtLm&鍁-zщ~?Km6nuOR`MDC;~ɔ0i OF :>pfb` Ncax.OoΣ]Ty,t듇m,|;P#94vH~ k!t@@Ǐj?樨4p/ w܉c@@F.PmOMqxcZ [k.O$xS[u5>+i?!\px2EٓcRI{IEUK\5APTfpxk'OX׀׀kٍ`d]C}kg<x !}7i% X u^uPm2֭[9 >c0⦁>( 2X ~!ݘ\emxǐO87GτR<V nEE v^)u93%3 r7 >`ڎl.7;LO i})!_۾)Ⱦ)UUUy9uÇA5k{ӦM`Sh%.]Jsu }q˞;Z[[wZ`޵17^-~9ҟe\!{sA2Z{ !g2裏Ve-{W_}?衇,=RBzb2ٳgB;qOȯ;B_G߳wPpuáDb|lt``̿FMQWgܔ@d9z2=O&_)9%:ޏ \=x ;dvT:3 䕙cyvy".tp˩6ֽo)E^`۟u4FGⴘۼy3|w+_~ڵk-w4XF +`~;v LX,|xyOZ뢵Fǃ (?={D"'~ȔS"fCpAx__l}Ḧ́GhT׿>>i}%s]@ӧOwttR%_-74@F +`/x3#,Kĩ;wʏ$) 9rJ{(ސrӦM@t_ōj_7ruT\{ ^;AI ?o3.`Rֿ_=wwr^@JHO8Ċ0X}Hqy&SÓEI00y8uTkk+(B~c} i0:|&{:y'*J$i]"OwGȉs?.q`9myoy+gf=?pBzx @ Vfff~60E0]?:ĞGw 耟ߍ<4z1:|33Թ7+,q0APgRJѝsNWN+Ol{v|zZ\|ncX7Ѳ~jNj_³+,.EF"(řf=w1gotx3 # 53d\Y)4uA ˀ%gqE d33(2\xmڴ Lxg @T}APYȳw|K'>}sO{t=ݿ9wlo/X+#W Z7Jsw nǼKuقP'fV>im|T7 Svi@,;vttw0떸;-|cklׯߺuk loܸK  w 5Q7Bڼ{AN9-){iw{kԇ%\!nx6#`3wyN'kVC=1WY,F+%oyPjاQ(;BvO RzPva`܊AuTPĒI%y$ՠ^*8:*wneq3 +:;dM b o #4/Z>/uu+/z.q:76Su2*Ksڈ$Kٚe i±1jx !AT^$NLLD"`0Cz0@<DA{~wUp\=}}lg^rR~^e;3#)$S/jE)K{NํܺB} ^1H.VxhJ _P`N/4u:tR5g!1!w7L'GFtƑor]a>elt:j$G] yDGHepobf;BfYY}!w3q q.|Y &uhH sqo!;r֗ 'rȈt+LݑEsrvWq7dĻ).kLO+iT i %]l&E;?>c B?|!tҏ7{5eV/;lݡHd(<۸2~e9ќOّ}jO [NVq7P_uArp>9J8>H{I$ 'R40Cc3iiRV%@"#^lYt-3 M$q1ԞdpNJViݢ9PZP~}H$rEPs+! !ĢlȻ}Y7|^]u˳o/y``^ORBzgѿ³ Ի3ڭ$^Fld nKx:@XsP=åjY/|C])]i %k!+! u;ۻ!"Hz{{߿/3@JHO|E ?~rr(8~N \H,詩g@ @ @ @ @ @ @ @ @ ďA@ }+X@,#?~;aU @ &!@, _~Yo\G by:Xv~G d ߱rX0P;@ ˎё@ h!/ endstream endobj 271 0 obj << /Type /XObject /Subtype /Image /Width 637 /Height 478 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 59312 /Filter /FlateDecode >> stream xSU7?x>O=s3EgTTRGNJZ< rjԂ @z -Mi)mhB)4QkNKח);k_{kZkt:曁W(]Q { QQQ#]< lp8l---gh((("agmKiA 1ε@L>sO>}@ #A!7kqmblmBPSk|vꦛF/}R0g,EK_[.Oy퓺_Y/僜;Cn"}vk+? hgqjIcF'N=3Tr JP/,/n?p"j\n]fOI_i>EbHY+&"ԇ8\\C }RwPcv^JNVqB]Ak57LgQ1Zrǭ?\ ʏYh4%b]^3m{m-2TO|79JnPߠ|SZf;{.g%^,z<ց[̙s]=vkYL]%f9;˭{[*1Qe^NUk`ԶqY[[ !V@ EmdQ~&WTr.^{xmm=6WT?j Xÿ_S7q6HBL{J!?&R7d_, Ȁje_b0+|}Q$&A3y2!FKpP z* ŸmWnR*Ֆ{a>uH$کT%$D1_l'P2W{?rV>v mߚᾴI'(_[k+BR܊GkCs _YzI)>yK@ 1}_yX)Gz󹚝DtmBjPV55Շ"jMic"=.QUPI5|VqpH%C_`8&A'(?F-?Ven:~QH~b͎MM!۔]n9^~ XkG>{pgy}}9tp}榼@Tlw6M{SHq%g+;MBǵv"{`MPqrӬT;VY[X#zpFr#Pd>=CnA (򇤭EE%ptvU75U) տZ?"K.z-ʆ^{Dϫ$lx& 実>0FK*suF_)9vh1`516K*wE\?㕫wZ L[ykviwkoy}ZD' p^kˋsN>3kwVCyk6'7ᩖ..7ה+SA|M҃ +jšYEݵbjҠ<ZrǍcuPV4Ե _ˆol.:ze^9rLlUVaJ>42%0W2ʪPDľ3B vȁ.sgNl/Qo~zD[XZ,{ww!H5XZ[5=Aٯ2hʇ{]AT{Tm~\RZT#DXJq>ZgLuCϙQ`79}!;9U$pm"K:DŽnw*}Z\UufF᪪VO#QgfhUUM#x7S7Lu5NZ-&cuuj)$n]y}QŠw"X|Tĩ3G?* GsO7ͦ46378h:endPMIRvjhZsz\5)hюVdz. EG.by#.Me3䩦:C1Ca9lgy5M'O6j%Àa֞S*,XRY%J?AZr ǎJOaΜ2-A:*p%HUwxa/ſa(?KAg-WȔn1Pu ?-;V:]謈t>jW- , ieIXZGv/{?h,}J?Yfd1'_/X4q Kk5k},7#~=o[0(6B'Ө?JPV3݊>{-gY1̕_QϞk?ƃk`*.Ge0}r~FM5DiƗTӊrK5 yiې#Z4?ced-KIB"_zJ4-%)fP|onG+Ǐ|<|15*&_:4o}\e˓ 9XZڏ826ȇ)ŷ LR% e0W*((--gѢ?U{ ug? ѱt;S ?3y~#T#{Wi=U\FϐX>:[pQXjz^ |XQVZQ z[daRn9g5UR+;'|//)1p6 ̈́ɗ= r?+5{޿c^u,O1l0?/--`gA0~jof ,EbU!DkUJkYB-aUڱ}֭;v}.q?~b9|qYBI9ڏgεnЯ#>)PZW)ᵿm +"J|(eΣ)ؒIߗQ%_%|caRUJgJ>*6*կI$a! /j}}oV޾rm+)ʂ gaceWd*ԪOT o|wxs{6/ UlզyZm][, '_I.yignp SpϢ?˚ جHHUa:(~OMs}'$}vfg+ʪKf(+]j-ޜMfU5D ]aj l'3kUr[2l?P$_k+ny.W,Tv*j.,*/.֮Г+wU''RꉔB>hJ8RܽceETSx~٫귫-(HFrB Մ er! WP09*˫7765LƦ#fhGkR[e媷=[iKJ ZeWN_*@]N^=RZzK|>i=oO~1:_ZPZ2㺥<d= \c? fo_($U!@f&PF$LIPZc+/PXXXP~&77+fqt&kҺ E'B+viJ*(?ZyIFnQin^l+9ٸ/SRu#^.NǒPUkظ]ZcX,m kņU?YKOԗH[UhCoGuGȑ#Q { g|aUɖ3:Tk3 `I3L 'NRcUq~~QDsI8;aj.'IX1$m;Lδ6(է-N68qPdq3'*EK567THk$~\]D3VVibQ7ҭfL!KAXN(T 0 kle=V_\i>K s'MR M'9e:NCٝf58O1:R|ykֳLg\'__r_gNKB5AkǠK'g < Y+de@[rI Z] 3gϲ*;r<Y*y%i[j5`RկG^KqamdQn/*)-%.]Al"NW/ $!, HzKbcVQA|G ACLjeeė uӆ.). ("Z2r~0~9CaQZlb$R%%䓢T WC6QQQ p8pQQQÐ F#{ ((((?r $6PQQQ~@L@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ De6YO5MrglՉ@ 2߸l2%lkfs\ڸŕpiLL 4o\(:KfЪpr  SF!@ Ys9nW+2J1(6Xǘ5gf &Ҟw H R&&.7>q4^s&C4{33#@ ݹ %91s ɽKrgC#R)㦑9_[7vt%3\Nȟ2G ]݌0u-Pd,3f2:jE6Ewթ n b|fKݬ^bL77N=&l| V"K bҳ-#' v !V9ed(&/CI^!ټi5Ӽ1_AnyfbKZVUd !yw7gtFjX6W(fbk(d˲ΎV3 :bz2½ AzPPXyk@ .,PWg0 kۖiI]y9,0V &pG˜6W7{ezƖ#s%CP9SC>xu3172gh#W,=X~19I!")Qap1K*h'—E$Hڵkz{ύ6 (ns?wƞM<eO=g>w-1_Q%5h4VЫܲ8,a+cwIh5@~6D4Q`4Nyl_..)9Bnv4A::ݤc2s/5o# Qƍ3v+z,]AcsىeĔrʲϲYڝt84\f&tiI(:uf'xۘϽH `2iG9sz!|Rv:SFD>m"' NRC+BSjd:Ch-IzWS~!\ze|֤O' yx>DY^tJv)Net 1a ]$D7UK\~, 0Dh,$SoOfL-5EȌC:J87dK Q<;t{1].hC/ЫT:='& 5FԆnl"-j#㰌3}uVǮ"w -+eevXtD6 <$B dA'JIyB [G(en2ɘ@B Y,vo*p!H4Pq&mTzl1ڈK3XQj9*&$[A:"HʼV3^i(S{y~p%J<4pziHNg2PU;pkp(Z=|Qd.vadZ,C/XmJ~ P列L$ߐ`lOI $!{vgUK46Fsi6{'CND:k, |'q*h)҄'y%h1|nU\%4Jz)Zxx_Eg-rސ\' ͐N&VfI? 8'C7t~|E"qF+`fi-X 0mɂmM֘fF $ Lc"x's /6TѮ|QˋFq25i IQ[KzrP.ߐ9tރ퐽iwaf)%x8WJ]᳽ǼS@|ON߀P],$T؝,L\N=^jO@bOfY] gD?.ߗZ'7d͔WYhH- #i_B3vh+8G _t%!0ڕ)0 #͕& YTQ *N W䋚iNǪCF%qIR~Ra!~z%VBc y]6TDZzsScqy]jScV'$TGL$*V),(?P>>. 6FE>&*uVA`,rqRVQiWD=T(M^ސKwGKWN*݉-w&ȕ.xt'cw]bp+,p%Px_Pcfe)z(N!(+>g*żn,L&xٗv[4qAwo&*Y ;z`9˱ߊِLNf_ĸ=h!*G2"|v%@O!QI$Sic.<6o;2ՙd/uvvN g)L3)G|LدVBD$+z8"Y-I) ͑q&* /L idc R&rJV>\|˗v31[=u]&:fBCoܸ!u/{"(0#UٞyByEtww< xze?rFww^^oE=Bx&&|cQ8,lF}JLiFv=t`hjjp!><>=: TMkpU\Ζ]^9~A[&g# N @ݴ/Y>۳g/CŋGAnbvBfI:E>wu]fls6p/S/xqoC"q Z]uEI]W޲lرdt9^)id,l|]N8|i{3tY;*H}}H;B,X ##9]dn4m&@~Okf99gt|:7ē[ 4F gx/"ߔk@ >b={1'''11q4nԲl3J /aX*ȷ_ ˬBtuig sf$-%bU)vz,C s2? /HZQ# }vi7V4ݩ[o^͛7:/h%sNfW ,L[E5~݃%gsFM][f)_4hn*ݝFs$>-0KC_1ڽ',k9FcurLԷaįvׯ_bEZZںu;]YaVϧ$d{E" s4E;!ͧ7ܼ2[9fXwni+tNڍXpۈS4]zիIKlC`P'L1荶&Y}v}o%;K2{ڐgSױ=]x~;cF#5~bض "~7Ϯs4ӕT9ǕVlT#9[7].YRT؞TW;xV|ӧȿ:/3OevL[mI>Pqw=[)_ܢW~Sbv:ߐm.liWbǖCmۘ"ݩ%羺= 9;;!uO1m*g/q M6nmtDE~a3}oGdW~Cް |z6#_]F#56iwp Sƹ`Yjbh7ڞ5t#N &tAtzrte(tï82Ipܢ7類{+CҬEW~g@*,ZlkBvwř̏mۘ"ݩXSo^O;As2{ڎu Wٍ8%E&z8B6lQSQ-P-zvuVאc5Fm(a62u }+o y-tϺtFŻ 44<&uv: o=R1Iq y#NvO7In?ٻ-w%64+Xp݈3UŁf5{"DMvG-l.<mި;~zmrh6TCl^=|o3idwDfL <>KsիDo=Re zĴ] 8,D"rʵkצ vdӮt݉D;Gwȶp gӑ;[#ktWNElX+aH6Ӯ87n f!;'s/ M~ELW*׺bμ=Rݨ$';mN[N9"lA@ė/_=G:`m՗Cv!h7T3xFE7p uJotq D Lv!^[%5u'c% &3@ sn l`D 7i D64PÓR l`m>;͐vbҮt>貧o+O.{|-<,Ѫ:_`TSi@ f.hq"b`\rehdVA" Xa1;N]bbo fĊA+oyGμRm4 lK?Z;5U-=-] @E &pN[| /3tX|HhwCV}'ixn\Z ,p/HoHW+9VZ5rrmiO(&3sTua=kC i+?C F˹o6]~)LϿ1#,O?翠3Vj?NJ=6{lܵkC CSSsҌOB~E,-Q+bwS!Bu= `lJݼ׮]qs'm F'0ވ\tF Ph"#tՅ/|._~0z\X:pG1t#J曶smPEEE@`Үt s_\fg}gϞ_8hw1IH*b>_v1%ao?z}kWw?q M=†mχ;05Up2,o0̇Q.c_2{iUrn>W3vyҝU^ԫiÀNݦ'(wxxpaO__pl8$ q8X'.]4//իp=[g8kܳ%g|;h:|ytK j믿tTkRR ,((((--p!O=iJUPד%Wl) ؎9@v-E@vf+}գ۶6, ^D8gI"V-T 2YdsC 0?sHNgIaҔʲ|G9ykqꎖfLm"NoQ]ԖʌQ`F[ ^ \}Ad1tpFE bয়~S7997o@w|!8U8/Ǎg8q SsD>>w'uă;:ƹׯ]pR~Ǣ@?FX={1'''11q [ 'WǬn^\1lG>6%*v$'0+tyNM\hӗ;FBi7.s{+n11ӮKRj$$i4 ʦ0M.v,VC;YG*vquJ͋f" R;h?ܶm{mtn޼>ꉣᢳsM5O\ӌ Sٵĭ&;j=5i`:KW;9>0ڝ'2t|l|ݧş,ƴ Wg1c0,@zh_s]pIyE dik4C0te~իW]v>^pۏC=^(}!,~F(h˼Әݻg^xaz{|ZT~誚n>ܤG>}NWV~g9 Si1$}n B VXNHeE[_`Qn-;Njwy%!}t}oߛ|FɴHBҪU }t_3,P Qbptz}/^j*zF.o^lzޛ7o:t_J?m2C+%[gu\gKZJ4"QR.vUͯz,NZL ]>2>,]ә|zKet0򅍱}2v|b a@_~#55h].@%OG>-9K`[2~qe%,`2'@DrOMed|BJ5O)s{"'1CBYYrb9Q]Pr--sḗsZc8eg& ;X%JrFi NXsS4=/>>n'oǠ8;r|,o>vB "Dfax@A]rEAJI=f$n#>WXnݺ5fcmcAVƟH=[v68Էַy~BOocyŢy^NFriSs;ۛא)WnO+}2tjn ]Hi=t~rjD?)GWӹW3tַ_v>:-,3^ij3:n2Q/~^]m$/I.]OVL]OQ{_L'&;ӧ`%._~ 8~X#u :/$}&z/"Hẓ%Z\6gϟ?V1:wE!}ڥ1c4j[^Gy2g#: G/D}/ vQ>4 6=*.8z|[$08H*j콕 F tOwzŇxf_Z6^",H ߳dZSɪ\1Y d.ƿiMf6zzϒf"(W\;G%GSajL]Jff/س {Y8톭ֈ,!? Pff&D`炡 7nܸy|ceEO35\HP9sn&["m.cW3{.2w spef4H: +wnɭً :@Y9mSg U*if"L{$cVѥ9ip1l>E9S̚L~fVBf^73[ʂ  jZw =VMs)3wt]04+ jMAka [{dXDN+8iׂ̋@ ¬]vsihJ?9{l BMRW+WpU3!k[SS3005u [D/Ӂ^wA[AU\R xPm^A gTfbB7{>(t4^(G8BO^RQa,gȍro{}};hC H+hj'hi%Z0]~F@5wtѸO^ 3(x"=(O'a: &y]=Kzeۗ-+^kaY(X}oyy귮np2ݖTCUx0sG._p*BvD*///))bOoݺž/o/7P aZYxb7@hJQ/^,+,s[[[ok=ȡC|\Ռ/!?pyZ}Y0b?W_};2I rKxu?xu V?)I_vyx˜K!YGC% w^b17I]9ODyn*4x.teeeGh~`(LOO#C,H\2]Kltvb޺urBBܘTiwj Nzvv~FSRRrƍEw= TL J?LV5w:&uݱ}1. ˦?b&'=L O"b*|]wiq1 i3IvئjiWgO4#Ĵ]kΉ|]ʼn\Ld*;ӂ;*?3gF iEnaI0>P3d"/`_xa… xGsǸlRل;Z?3@ 3vycS O^[^z5ms%*ח,wafַZbQ#iv iwD)>+n {xS__8;v ""ɳ-g͍N:b3Ǧǀvo @LڕF$}{O7p>x\3__8?[7}pNn{ O m-'_omQ==(6nrf:/:nvl+`&].Kw_oLJ9ElE_)i'L٦ocG\Vs-mSF 19Էַ䖦wr >yf4d4tjk~2 es4JLZnީK&vgW;kMe}w3J?͛lL˗lց[D^Uj{~])%_m[?.G 6vڬi\յm,%&L%KF`D!%NM(/lѽ*&fKJf.x/!&\.+?G!.)1IgtZ8UvFsJ6jU}YqPY-2IwLVA[K2'2N2n9"=YJ"3v!.=v.8l.{ڍ!sAPtK7Cl*ܔDr'T"c0R(׿b}}.od/KC$]۞8mJiמ3uVէMxos?w6YqF 6HkhRLgEJT|mJqWs["ǝiŋ)))[1n:?sxAO96fvN,Y/v)c+V4ģ`q77 p'u_{{"?߁D9h7--mH@7o]H(QQ{Wc}]dҎgKuL&`JO$wVR<ۉJ'w8ۓⲬ^*IFD^yBG'^5|\I|Mr0 4"!t"SXL˸$9IiW ╶)N&).I#rߠOT}11ܪ8%ܒQxyg&.>2i"AJ¥WC[lhnH'kqIRIwjRt*@c6nhBt!i }5)g]QC3JiБ^]/c[IhH&6!˔}#F|u DmP@ X-::kVBJ3< >W6QjDu4RZApJ-$}Y,v2-v\Jneb(houSo^"QN _ݿիWc!kؓ;h/O;U>Q!dY >[hCGD[%JDwL֘<@Թs2m#Sh4zM"&]%/KA۵e$`qS)[Ȗ@')Z0G6 FqPJCtVdz TȢ&0`mN57AGqC8@b @} X0  oIZÖF4ڥ,.~-)|y2\EΰaLڑv' | PPPJ~ƤqdG)&L6B;U$z5.lmW% E.M YIju|3e-, ]7s^_N6>>-oR9TIU6^] b;B'J CxZJ`&j&0U%R_R%8eEI86qq PFR,+lf1-ivX7}yHrnEEŵkb@eeezMq5^ zy&ZBx҇$&Rq%3WʀQ q'R_eO,ZUEG8 vv\ATqlwz3e#Dά]C`yxT&I D5-%y88j-i>s8ڥ6aJ* -GH_)RFPȢ{?|w,#Әvgv3튻~ ];1oDF[ B:!6x]lU01ÔEW9$eInd+[=D5XM&w蒪Zabvu"]1lS'̸d yl̬c/ f}=ѥA?d'aNЮ'f| -`Kghx"<6:&bss1KCvCtxæalFebЮ%;Y%E{¹w&vǺヒ|>lҮ tSI9vL6Wgbj=E_gVqAv!bhy#2KvxױצWRvCR].YW#D7hrz2Y' _LܟVjS!yD!uAWq29ÝAM#8o'*YP]/9K;+nT+"^:\e@ڕ;wtvnEBlDvNgaa@EEE!lN! *77~"ɐ-?0.UFCH|pcAK/9UW-@ڄEv(CӚ,#w=`۶62ꗾuE >{iOHnb{&+Unp|ؿix;f :|4p17>`p9aՋ䮱voܸdO?Ap sqY zD H9FcOJ,Yyc|H7)mƆѮ_ֿ͚c=;hlQ9W:a,mm 533y#9f]uJ?e96ڕns|@u8@vHnv{ѐ{ooXYcy8Tw2>GǙO+NSe)綷=pc#]\?rFv?@Lwڽp=2׈Ny睷XXih?UurjE&q6h~ޚ669w4?~GhWzƍ\rq84"s iŋS}\$֖V3ͺ5%M ug;rΕѮȧ0F .@ -G0]ޚϊ@; +fvtBޚ-kfwo0h^U掎Y+[Zi8k.No~` 17Yʰxe.l#T5f_:fd>aN7`sEAAAAKHkݯ tc$zS}=kXםAόϥi_SMoL((((w'>;E;܂*QZO?ʯ}f vc2-]j#2݁Xn?Ͼ??3O E쮺1L vݣgϿ_han%)Ѯ2 bնx0 \n޼}mo; G 1?rTiv\ζPZM_N%\ͪBם6" bjm)U7n_|w~zڰyO^;!1?vwis@l@*,l E}r].bw;aWQWG.ݰ=G_ |vO;_eȏ؜C};[ŕmHT%Fz[]i݉ v/]}ξ/P>{;{?g(G,+]Y<$TySor ''6HM3tTiG}nsE)'xp|IW jű\Z%wCDQz@gGD~-%Tvdf)yO P-$ukgSvv6 MYtisYCN_86ӛ6&.p,zr඄ voi/G}ZHZHyCijk gī kO1 vMp^o???/=a?yn"#,epLGt䲟umh,u)ٔSc$HT !ZH$|>f]~wD  NKpD$*D> $p4DO)+JR&$RT D|2,R ge%neD4*Mi֭#u /˚RN ir1vqwDLcрǮ_r88!OG0EKHKxbb' k_Xqo z AxHA KR$") v c쎎n-vȁ \#z;˶}'}ߩZ/k* m0ZXNNq8!N?0*L"G4GT*Qai%Ww*FR~r=Y.v8#v-:QigrK`Λon3v[ Kvi#C2;DUY*F5*إWT 'GL إz њM]0.l]mY}fp.. jDc><3lw }&?2փ]DV؅D<77 Foχv%$k'Jnk4ҿF:} "[SFf9:6kZS.I-i6vY"'V2V-P'v %C5͖pD Im 9vA} es$(vl:X3ޣ v]FC&ɭ|_'4϶B߇~C=9~ܟTKT6*){cfgUڳ:ՏZ)vB֡6iATK pɶkȺ Z*:)UtO<}MTLQ#0G5]Gh*U .2+Fx_klWI;RQFQuepJqJd%J ]5hgc.O"[,fp.BX) e1Bƫ -lO_:vh Mr)춛خ3KX$UɦLؕuإgJ.9P/.TGuzˇ׃<&T43l4GtC((nޞnKO<;$Ha%l!v˧Y:_=v'%ZN,LFzaC ,,Bnt|m*@z &ʯ2\l/lڄj"Pq>%:!+(mD/ i#*N \Yۺ˕Q>( >:UkpiM!{Tvخ+Av-KL6؁#bR 1Hj[nT7+ŋk.(1ܩ k*m $9 ʎ.[:康&㫒70...\pgi+n yqz Jc+%G7G f]d ^ti`4)y$._6(|U װ*-+@r/O=l= 7߂ .AFGGEw,x$ Vej][b'W N|:{7 bfZ~*؝ի[rEW Md/36V;dBB춠+ZIo5m=zߚt ]v-s1>0uđGnbj>&y$֥w9sw*}hb5<)ΦsgRkܐRPSL2wt=֜dx XDf2g͹??f7jJ:o޼)>i1qv? _O{Ks,^5yɝ̄N8P,ckw:l._$isSC>e6gu0Bnmؽqe 5˿V|6m6“ٗ~oBm_ba(E|PSdY ;xʒ^oBVclۧe[a0<6[Jqoo 5~VQ** WXp`kulSv^>55=7®C2&2yo nݽ{|M~ _cZ i.kWΠDעewx?'l5;Q*)oMls#adrNwʈ 9hv8zT`+(R Sj@!t;RoLM@{Xn,jks:nfɧ0(\R앒nFrYEb8=aŐǥ e#׵55Nڮ'ecWZƮ`ҶJ*n][mOSgmA?@g5 vo7z*b:/WGOr| c\)iQӴ'Zvb^";|r-f;h'TtYאEDDZΒ>vt6FmVJAPMH2AǺяܱ >B?Lv$`WI8IBVA2q=vŽ;XwD֒VإiJucج YK (G/-O@vMe"yLx\T=]3 =ZX׶Ȭu<( aM6ʖ+5<3F쪪CM-q>bʓ#n'zTq75Ol@ҶDuRΫ(gCBN+ʒ.Za[dtkh;4Ǯih+WǮ[VӲ2Tj/`p]N+̧ee(FN ,h̴ EUN lc8*Ī:K:i)a4 ++Qҥ\>G+}&4䩙f%?3!8YV%fArhKyhӴJ-`MEd^Fhi%Yr~D C[Swͺv#d.\ U"۶`# 2av s̰ۗ@Pv.k׮~dY>s挈ݔ_g`r;#>@{JitiAnN) ~6Z(OIvh-|qاخl'%xU#>s;|Nw$4i|^o{G0'Кlȕ/x=7@iT`2ʭqJf.lŀyB)~Uۖb`Xk&isdFn=fۅ9@Pv/|k_[5Գ>k\d n1zSK%ɵ|KDsZ(וe9Dź.7W,F; $6i)Ur 5T V^+znMx)[Vwy vîhyfnbjaɓ?|_RySoM^&t.dCٖ*5 nXcB&e7mQP6,`U]غ[џ0n[4HOO*Oa.{U |Zymh(Mbe zn@l*t؝̨v/ oT|PPPםemjvFݥR%<_((((®MsQUkbw~ׯ$d.b;`_.&a7>0̅?B-]>[(BAAAiv7'=:j}. &`yJ&Mf.li\:-]`wii _.c{n>vcFKapQd&o J3T-a.]C[*nqffOf$FPPP6EunM/vLbmt>*/Hd[PMz{}$=lp:\xr]Yn7n(lVϺ?Ç;Q^P;# n|7͟l^;o!N }  y9tů`wb/MxE7g&HJzDBYq,(և]t(5fD(((Mx५͛gΜy!m kWgrp'{s2]O61|wsֱVodܨur֫+Hkp:w?H5o(L à]zuaAVܨ!w=(tIC]g|;w<{džfola^V,^z *nO`]?ī'Wops3{asԩoX*d\WE"# 1YXXbvvvffZӧOClvӿqe21ۍuMO" [,P{Y9'֏]6lk>L&2 Qsdekda,(vO&v䉃Sedz설\=?G 9 C6 03#{i{ 7Oiz#qX,}oIvL/Αǹ Ŋ<%9^PkO=1 Cؕqw:7S΍c͸`gwHrmoȲ 8pʕ+ yFת Ou_bە+gUj|t&./^yBI U_a\B^*@g~gGK􏙣ɣ8R%CLV=>3"o+;3՞8{<ۣ/?Q9q uvxWRZ7<d^zN&`׀aB+zY&98zhu'4]owE=A5Â(sF l5c#AǬZft׻Wg5^&T3U-bj_iu/)nI5!-kj/+¡]m y2 g.믿^ͳ駁zONz~HG< =R >~=5_[1q\9p>u@3u* ]]]&-٘7Ff{ٺ-3ׅ]y9vm"voǛ3?}htvM%GC<;\30EEg  ,Ļ8s1G$nGVMd 3fk5F&? WFTWKxO$eY#r7iӺj]Ã2e>]tc../fvkq%wM&;wT؅jLrdv>V> 7B0;77;z DVͽ=6{C//šWzg5{GfD#Y:8>3לMN<=O0ߘ;G9\C cccݰscw '3o$ae6L DRysc<(XM^ËMM3ifezh9<=]V]tj3C|p%uaz͑&s|ɓGWu¹:>Meg]-V m]޽w=)B{4saJӱ 0tAeqoM.q/] n1qOE(5/N;ݧ*2b `8W<µN3yp!h(;-\CDft+[jMF橩b0ƭ4egdEee:\KZVȩVH=6I}2J+ #̌Zܜ,$ORw\zN/.ZrIM &o. $5Bm[c~|r,x"`9e*+xzZV@緮<[&&bMdZã~%Pu56v`wq=w̭(&dnvBL*)3#bܽk׉ eG~sqV:z6sjuB}pӰYk7&[bjDVH,.Js;Q^P;#Y@~`wm)Ss嫇1e[֭[+ls)krޞ3w ։ <}2?((((v7g  uˍ\[/vzݔ8D e+d!v݄5DrKlsKFx[ M^=m}v4u Cmpw=ԃfBAAAAn6y ͧ օT aW vC͞Ff؆[z5u U( ypַ.A;H5tz!_eo sik/jX]. bj@MЛb1~+' H58b$MꭘEB72wjj%GG.&N 5Fs6W'GN=5ts>wݰߜBC"Y*߳'|u-]ĮŬ&D0$bndi[?v[mR!Ne8dßjlmsP/&8O~pJ_oF!h$RNXçݙdh&'B\\{$.Wf{\͹svfD6tU`(@6Qfxe!$KuoDb.MxN-r(*+5baO^POs|Tg+$ΰtE5Ԯ@|J '3C`ӝSN+<)ށXN`WX^8O 8qi8yfKqfUк$GΫ 4ruqz;TZ5+d&ީ݈z}96܂u |KWZu\>Ő +k72lcœ$SYg޴B.@ggnYe3`\4|R/#v-fDͱ{iZb|EtE #~LGU 妨2D/]IW$Lgܤ^zρSSWs!5;cL:"_Y3q߁"KPqTd W/4RY($s9.]K+bVLnQ )M 1Rˡp]Sh%E:?WHn`Q¥8)Bv+urߩ)TVd3!X:D*_pZC>>TW 3kr v,P4gTKU7A{FT3*_!76w-#v-]!9֍mv[pѮ%v 1B|tljfZ.Z!;5u,Ua*[ - v4vKe;5T!>݈"qljX?1ش0{ .`(-gN4UY Cz㶤%$!0!'Zg6vy!/_ߝÙ#8v#7riyz>ZCM Vspp3lHVɝdNdJd(Υ=X874'3b{;Of[إ*QU3-: –8bhw/K/t .UaF2 m`Nz@(>DղyShyS 8:v8)cWoOÖGu%bi\s KVT bWI8tN:]=־i'9d2%q\].@{]nKbw'3VmE iLZ)M@CX53u,it]UO]=K3Mc<+{gb@.|X*|AN}:8vm7mZ-]+ٓZN2.bUu[SR+D.UEry *e֞çIm.ٌq)c੶:Yz4~e$`iyib lʷ)X6c{/--_b#x<3?? [Dd̬}kq<^\A+7 :G&ߔe@f ZՏȣdwX+NL:2S-|b|eXr %u 4ǥ9'?y@gl|*~r\LϳZ׫#gG 6L=\%h^WP&-5 YFJ59LfZ¤i2sVId2[!ޞ~qRɗI/NUuY}\sgÝZ}1O}!/ԇݛl^iWUV}RVL`wh7k_Y=YD~Yhcrpe MN>]Ҵt*Ռ7EyDl^sSggAI80?&4b!YUcn0>;쩳|08=4Yl[WFƧoaڂ>QUgUO⬪fcE\T vfo^`;w+>}lSYߟvt bEn!v>彿]~7l?4b8_;[;~gWO$ P?ƒ=?$38{'>{' 'vīա,=lk^VY=$2>(LNNءU ]F.k8GSosG7&3 xap pp@a!3R!0"5v[3$ ʦI:zTmݞl|x$>0ԝw_x'~mĮ )Zvldfrˏ+2WQcǎRxY<]~7o>bw/Xڊf^| †& :؍w Q{I te|Ͻ=RweL=|7+o{OI.enmƨ.#80ns vAAAA^dzh٣ .;> vfК.n5/Ult<$!68O>ʳp >|a2)lVKa2 v\?e6&+'}o?wfZfrifiW.l Wk&)_4J!|F좠C?3òA4rٌ]x._ Z`q\*0[ð۝쫟jk:dk`amUW176R\͞p4ש4Y\\?oB(((MnOj&IW\ l_Qx뀘Z-J%⛕˭hU얗\n_`zZkT>  `%vvf  4m>s\mHZɜ3\`nE^`Md ZEAAA6@+2S<n'_cH |2[&3\6ޚ=3rEgYLݵtN_<.(((aP$\g#oZ-ENf2Ff&Hi!υ#p|BNgY v]̶Q]Z+bF4˲ldn"WԈ2!cz΋m8v{&0vVT:p )[^^@eѶ}6J.3"y (((݆cwm-vA50@f 3<(((FayH!v1vE;3|%~2khj%E(((bZ` ܶ vfOշMM[E"v-V&6OMM[E"v3p/ b1S*#ř|1QPP8ԍ/&dDAAA6#n[OA/U=ɦx2D&maW\IQPP Ddn8)}ce۶.l|>3zBAAA6& 7`R({Xm;f/. bmdp,"45vId"M02 bQa㽍3`cxaŮgU v7DrAvWNo ;v~Ů8 " v]ܨeDߟfC/SxHXj:sXw dVNfFAAA6lQx'Pu|lUK@d6Mo=rKÿt !Ba i =)v3 Hr=Ux;xX}chDp $1LM泠\ ,cvO8k'\K8xaf5rv-v's`O279ڽAUW4fZm%0RCX/jN9S@sԓEAAA6 ?sw|so~wOJ v|,Wq< 8f+j"jΟ Rs5|]. b7^ ¦N2rbuL\j9vIY>@yH5t] m,v݉^FUhL gNz|ӏLt7YOuq6j p ; ʌϠS`c8^WMpbW' beWaCzD<1 glNO=/58|f'~d~ح6ٓk`l}Wĸ]|=QPP ƮBV_6b+Jww|ر7wɱk?dFG~,mv1 |5sx.@mMDU25e\hl(R\mjFC@AAA6z65 J[ᗎzLzQZ̨jfd>0LE,U*Ɍ@}OGAX*3/2Ae* 8A3\5bZ~Ώsa߼i};A^,E!Hg [+th~Qf_2v Q^5NXwgL!0l(@LbvJѩFS1 F뾊\))TD*( ~.[vn=nv8T9;n{ov>_S˃M]G2P٪an=-GER\LGBVH)?k>O'{}ChDj9hےd YiPΈ_Lnl2Ocݱn컟?m}W3w#vO|./j ғ{\ғ۴/Lw'&)rأ2$i6NqJ zv3loK+抪w'/g}mS6oe{Efȩ&9rP Hm6Xyl@RUϬ¥Sl)Q/3M9A~mĤPKN˴jsV\GKFI[ek% G/O+#v;vZFgG]S#svA Y_xĄ]$$|ĝaJ_M7 ٰpPr 8(Q_8V\Qot{(wS٧e>6C]8d /E.Gp7\JYΆ*»ͯ.W_H牪ʄj5<)SKvpP\^p vdmedm^2~CO|/}a7r=b?⻿WP;ucv"d<##jꅒ @!LH(~ؚl}E) J1L͖E1Dc'Cމ}wIz/NTS%vҁSX$,eR%ZkװB]ёSaõ:'9"Ydп25J$!ӛ.f.bz=Q54W~vw(C+R4Bb|ubG]r*, Moڮݥ>GXص$41dl&֢S]̝W?LĽ[ Sj6a]W0ñTF]z2hBy;zxA@x6h硫)Ls^w=L7;@vvs|@3#)/j%;vm:f#6Z}])EiqT ] (Sbv(Dإ6[;8]mL\NW0E'@spKP85Ŵ hTo_ŪczAӷ爙-롏Z$FW7vT>VaiNax|^oBˆB#~GJ|w( mv84a #?a(I-;X V:HnNM%f'+^*khIӻ#)*ɨY5Y ]#.bձk\ G&.]lȇ`k{D[s3] Ws:VtqBD:pIUNI )Ej]4wPc9bW+-qIA*[U)pk3U$CHĮE#[Hhjd?CSXdБ_#vc%;DPh*rtdKZIRJ.ڟ?) Ul)dnՄ 5ʗrNJnW *%BnM.aJ׵U^ʹezwtvwY.rF"v[g3"lYR+MLd&.M=Oy}GҥCk'k8*~ g"!S;UYK,IѼ`W3{KTVV?tm!W,[@*v`\ft1S'59q1NE)SpS!a~Xg3*!bq,ٶ0nq0K6ji4^Zlr)k{](e,Gi)z^דWg2W72Ď(ɈybTk tjZ P|F V;h[E"ٲB#l:)U̞4HRΆB0O-J) WTîX WhItl4OukJYϚe_\No(![ݻZe6=j +O Ye%3zU7Fn宔:Z;m¢ּt]yW}L%k>8 xmSꅺ@7G KKKG~A;&KzWx5߾}y{{CAAAnp0BH5 hf3]qrTk],˺3\f\.b[r*OD^jU%&SSS"Hޚ˜k,w[;Rwx+w+M?!. _VJ<D{ NUd#]Jb>_3#V.#,$-L/VkBfS@pۗE-4lvC5zddUjg\L?wPʝJϵ h%ZV5Znwy7d+[0[BcTidWuACKb":ϒB|0=L~nz'QF /ғ/hN<* ACKeǡ.].l5aաӆZ~=x|ttro|g>7˱Ё]B HZ:%|'3Lyyp'_YE5|*)_sWq oa˱[O:U4LʊND£ ],X9vѡ@zb5fsepvy% giʦ#*DȦctɋ=—z vIYC.Wz*ֆ=;%vPRoGyq,4?Bn[@C2`_׊]sA]+pEd2@[T+nm$.fl\݅X>N~hc@}K~myk# 9:*~;P}{ܪ/zá-4:~7/g56]K!N99Cuz[P XW'Wg>uMdi_#צ:"0{b 9xM.*W$˦S~STǮC29qK=@<%S7?p?+Uk5t0&~kbfg9.hPVju|6"zoE [9pv?V^ rW2@Qɻhwˡt,^Cn{v ?CO.8b8zW.S>p "vYZհ 'чc>!f Oa|?qH~7Ow_?vޯ|ae`UO^`77_.г w7E#}U#%|Q]9WWƌsWE%ýnᕎFI/PyRc1t/liaEUG3ǣū3_!KGB^®-"4:0`K.hIeԡǁlwux:kip7Q?tm3YJM)2mђPǮF1tM`k /BV]ss,oGV s]Dx'AIã%)ȣ[kÔX9b &X*z]dskh-2v9׵"w"ņ߼ ÿmv֣:db-],4gSo{O0qk$QFa1;M ~~];`s9vsmYExu{#vE w(8@2BYЃҟdWhiͦsovn=(hM28~7/!Kt7gVw" -gEOxUjUkM= !6qbЋEwR> ÑT\v! 6`]j!-\\FHw-|YbW_#];c:X&aC!pӥˡ92Շ*0ve/@a`V}!f(p#nSb}thYD}s-Z6&Pan̠A|dqFf s 'ӫ420ḙadOV]bfO≿qݠ2 c?clg 0 8yd9d2,gnOXaG~Yߵ!NWdkvE Nd@Į!#퇮Hg/#{|АCs/w-<:T"X#xE},:-(jz}i,^5D62ȴf2~R6^m®?_ ;@7hd&4iL rFf cmT."N. '*62nGص e`ƌ Z!$kz'}l-Z6Pu&_SK^.ð 0 ruv͌]ľwŰ 0 +ڜ};,f7Ͱ0ȲpT`7]jn2+@P-V,uuzي~۔{ݑη]*)rT'&zbŘ[)0'3bpi&gVh5tl,^b%(Tr-cYE\C.e 1@?2=rX`Ba9DLhy%DP'r}bCN-PG̟?lM0|Qc:X"cmƮjg-BKey;,;{2`/@wEC;rGiOV`` Sb}"#2lSKkyТ1`W `~ .ފFf3v ef拌8v ̠ zÏ|E.6Xټe8Had* ؅߁[° :,*h"O9j{9~]2-XYY7 ]˩k"K_H$VAl+ek&mKr^q _Άu^,1N9Yt4:۷@#wV>!qs-jJ :QML3: ]NMˆ_W;̵uΆ_@D2sW.BnJ~b8G;`EFͺʊl42326U Dr"TTrJ.] xxnZK Q[GjXEߐi aHF%Lz}d](s nz]~7@L2S0C|?!.lM6]Klp";ep?Etwd*A؇m<+vL6 ν#7>xYJt[ ?q6 le<knjH7Y؅kb}(.+ZZb{Z-0;K7OUcz,˲iUwkLӺŲDv۝(پ1B$ξLJD G EcWnc:TyH7k"T:e&l}qQx[M1')o v&+Maح-u3~{J)"|rPP+ @!d$d: ZpOj nrbaj6TEtiE6xBv/TnFOaa.~lv㺾L%ީ_[] S⽭.ս xnTfJW=4H)nVGEOidK)ic((][KF၁ں0x aWTBkW"J-o1,&B$yBi1Ն#cm(YWe'!I;ΜBݞS! UN7(s| sn @"ZLG;kO^Ww)U.#xz_G#[K B);EM1v;bYw;EAJScŋdy`Ȱ(MNn*v{4 WꏶvZ1\tQ`tm,rs揕'n{Li9uŒb}{וv9O*yTIs=wλw{Νm{̼mvh޶^uۭmmQ@TvEQ ؋} bG ˌ"Z*b)~pȈ2"iNkpsOUd#2m7E4MEJ;кvuYz1rf5*%k"(32+5/w-$"K'ՙx+ϛ%B[kQˮ,¤|CՖBK;/zήzY=;w*MpzV=uHX3>MY4 J;vˮ;IfͿ6C%kAٝ6:KϹZJ$a<`@vg"Gd:kht4ZgXt'ؐ3LYtV]ni8кvM.ߎgbd! F^-sR6ǿlP(fs͙Tvgr!U&zPXVsCxWYQ|O4}\LFQoT?^`0d[d'\_ۍ .!Ow%kͷq:;)U~YƘg@IJvL3M~6.SΙ|@k=MwL_Ó]ߠ`pv2cݝ3YiZC .+k>? fLv+dv?0%MgJ:[xFPv!~ig5s%fAٕ5idloF_..F_wHJ0c0!J:yfOyewy6!hminƆ 2W|񧬂S_.ԅ&,'fw¼]cW@A,,:k$ d_"2bVyf~$7eJ ; ٕ)5vndif{\bW`6^v]A#퀗٠A%Hgx < d"+ϭ*++kL- .bĎQ)_>3Ә!%wٌ0$[忺ׇmAdneWg;ߦ4OEUUd_ ʟ43 2*ULwAWM,PWWײp:+lL3JĀ7/w/ |]ĺb- d2%%%&hAAEyṶf.QCCA9] ]v ~1,]? +4瘷VDBax+odfA]mt+"FL!HlM:c6Al( \kgT) S!̹슊K蔪>nJG s+i̠%6rT{T J^C#?A]Pw?KC¡J4ɢRYp 2bb@/ QsQvAY](5eAkGPvAPv݂n, XNvb eע #( (. "nn$ܰ{׼Oa9 EZi. ʮLc=C߷(x{ 2(w$e@9"í[Ν삺=z*B HdJK.h.>EY=]:mBJ@p?"J؆rI6 pyjv ';Wˤdʫ7BA` Y؈x$O lJ8%g@Vhd/D,8HuebH!89-Bb|g? FEYX rIΝ#X\\||5ip ;Ł5~-#_cTH' Haw"ҩ?4^nP_vCs8ϸp_rp(2OYGEYв bcO[nq" CQ5 QA(A@aC'O-@~zMfDؖM^M*B2#BJD@H d/)%H!_.d̕CI.N+9B[E\W3FEYpF&RNOađlDף#QdOlɭfr 2e_t"=% ?2N%dNAk:p$/2_.t !.18"/'lA:dwlqJ1΁]Nɣ[Tm S838-]r2?/P8ŕCJ:"Ӱ]]A'|)(7.ԴeW@'O0RvB D" +N6H%.aNaH6w㚤ᏬQvANeb.{\ #]]]SnA&v:'[tbڲK'XU@eW0wȥ$F6)M?. ]@˟%BDD+!8.^Vlwx]Na-%A7,?LlX\",,n?r#?HU6XSS.7%(7]Jb@,Dƒsbkӓ]nFK f,r"K~wP2U({HGv9 :ev:. ’]7saTK6@U$g}1%܍eFBz;:˽é(;}`clM[v$_:dMdPvAm%73ٜq\d5ee$8ͭ[U+#%+]#@Hv_ի_ɫ<+SxGp. Ȃ]B0\Ae1/+xkޯ3""= _TeAeY(P %AA`_AĢ ( (                                 hfi݂  f\aDZ{x'O :t\y 96,W 6w>᧒ޡ./6/q=0 ҠQ*vڴib]Eݻ1w=܊/n.}G?t/&`O|k&c+zp\`/=Oc]CeY=x'yIcc#O?mmm ? skm>.''*!'wQ09*wΟWCI3 d6}IVjjVF{T C͵5]Oe5H;;( {{/R(V 822W_ف.K{ 빵6{@߰<|h~hrq|6Frjв~{oݽ#:u6Vի;dfH^Zەt|;vn_pע={aZ=2:2jM,Ã_K&U.sy 빵6/Y!aVGt8UNV7"U/X=IÉi՞;sL`*L_}3>]iROMOKV?W/腚WO$9> HEQ*_T*kh<9;I(3)X^@5>?IXgf1μ!\yo͋qCZ N$#58!z8riicq6Sצ:}J>*{m9ZSX)Js@0訮۷m~xcb)tݺk[ o( Ni|䱭N;ӕM}l0tlצsyo/ fBΑ;7 ^>U%Wfksu_;s⸾';כ?+x-!#Grsskjj v=  5{'v6$Lzs%TivDzr*ȥAPQQ7f]!wvܟA`bMRK mg1+L|b+O q9'qMpr;Hv.6μ!?{gg{<{Ah=*z\6 IϬv8~RfaT^$۳OBK4|v5Ey6GeCȒ =Q]_iyg}dz9i&MMMg>~Qz4(@ŋtuU_?|[?P(o( ; HKt$ \_^TTTQ^QWWبlmm%:>7T~d٤BL M+(RJY1 ̗`~YY~ƍǏ]kh#m>ZAb/,Yv61%2e76_?pA":kJ_FQN\!dRFPYY  7ژ]tK"3mlf%rÃ/~%qXf5.ǯn:5sַ>J'i wTqg6e/!rv;yx_kS0is`N7ʘvfb w6yyOm{?u;kDdla{~n-ISv7xx{۸)r7eՇGoݷ< R).xxҤ=j_<%3xlܞQ=ws6yK>xgN fFFw))Z%T fՉ\r 2 wy0}jzz:ʮKnn'c^mm- rQnR~2X;#"CmP%LlelC`C.$ٟ]v0"A(L c YY&f1%Hb@QNrFipnxcfNwHnx?V% o@Tɺɋ܉[vvTm+b/0IǼ +J(JHL taE>-1+,#gA,[nC]M]|eIuT^\F{0099i7SHHpTC"bu1p6O+统=~#*'^: #³w( s`#ص9HD[oA6A\{1qˁ3ϫI'_ESTg6?1g?? #H+#n7HyZQN8wyh]BǓ9i&pD'BK\e1\NS04iiS)PBC8r|ҠkRrUEp_xLS]~)!;_PCGWQ?z~ tl]KM/== /4C$닶[|3 ,]^`=B^|Cez|D}6|$'RNiL6y"\'Vo2,d;`5؞ޘbmsG㹸Z)^u/RH|"#WkR2dXǹDf1+,a0U4WES\.'Q Ś}0ʀ'im3Rqʙ/c7wd́9_73Š1{o59Ŀvz R;x)U햦=GG<DK)gS J* E-=&k\$cJtݓ G4%[M,7ώsDlwoj_i~[]ƘP})mbApC|߾5b礙ɭ }E\_7XJvѽrЩR^+{Vb@ag2[{rr2twM[[[{{͵zgG<iL=+b+9})Y'3l" jťdz+^ȵJOhGꕜ)R~hGGX60dTOOOԝ|ktq:Qy+=XI>4ʷpXCޚR\m25sPGKO<No8>Ǜ2ys|T 9l`Hn9S'i፳{Z??=`W`=@e2F3G/gWriйe556]_R/l cdS?ɓkyjm{MBM 'O|L v4de?rij̀-냜ck+>f͓7#2:]#s& c"&8\qEDdwй]sLK+Mn0\\C'n_7]utUz˗/f]BBB!{{{;&TpZhl$;.l%huݼߙجmU^Y+l fSy(w+ٙW5M FRR222ޘjc^wDN *bgYL6d;9ǬkJHq jixZ9`Zu}"$vV'Nm;2z&MӔx.N޿e9OnQ=6k 9NUW":-*tX9טlZ^\{Njۿw jI&à${ao(jC-*Hy^p] LRl{]uє6k&.ljS1o3NYHp@>׻C4B-2(:N~͆>VctL]q-55r>Z$&&gffBŀ>04A5tloV)}ؾAv?5u1}퐮O;!S^]CCC`)\s =|+e&Yw Zxz9^dj9c Oj9i%t"%(v%^M߯aƒZ:Ҵm j nIghAj)]6]U&򠆎3SC-m3^WWtkn*S[T ꎑQ~`k&=3k!=>յ]`蒉b /Oe;,ZwMcXϭ!M/}*)F&<дcVȚkn{L򦥥y{{ẅ́􆆂NA!<{a;;4440xxܹs ÏF.h5ma=p-nY_l:NaBNY! }N󧙀ˆ(&&ɓ|Ν;'a/A͝5d2yY/`بT*\V&M[lǰ[qC`31_7>>ֺ.l}w=A& |],ݚ.WbwYcXϱ!?AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADUn endstream endobj 305 0 obj << /Length 355 /Filter /FlateDecode >> stream xmRN0+H "7PD86mAx . <WR"P:V+a- 6)`VZMj<w0IL^Y&Jjs+ ycO6f%zb ܣ'"Y( > stream x|ǹjT EEEDA !HB!!]r$ٝdooos!#<17;;;3;gf6 T͗= ٌX}QK^p0xL~ۉ*FyWH'\7v,rˌ@)"Ul2[ZԤjv붧%`W8g\uo=bbJNMK(7VY/## pDM_! 6'ky$ee尟<#n99̤M*Kh_šeEUᆩvr8MGmK+Tq"Lgw eh($vS|yÊtȊi$D;3_. BB]/U*dD9C@Tp˲5BRHPïL0kΫ>CӁ8IMce"kŊ6ȲO6U\)sr擫^DK^b^Ŝ \Ċ/pBIWX\1Q &j\0R~rAJR &W@c)WE+$\.-N})r:%(&Wt'{HSdW}ܬ3x{UKX? ]3K9·ǖ,%xo߲8(ȡC;o?rppp00Jbk VF, :ppzA &%cY³^woqyOKMBB(tR.|_5*_t٧8Ԫ?hXQZ6V LKe""̷L ["ؿu:v'JPnC 8`DtaK\8` P&[kcO-qzӴ4n3OŻ1=O,L`cy_ tp))P(a5b} &:: °.838[5j5|[}sY$V 7A~X[!\+>ٱ\Y&(p8qnX[X۱S[ΘYdmE۱_#';hH&ah8*ҥKp͛jݬT. :m}TI&u骐 #[Nr;<~+Wwf +Œfi)LϷ|\}[k,T`TTZZ>lڵzr9@J"+(GjLG% sE'>X P_Asϸ8&ؘH`nki4BAaHyߘ7t:-RZ[Q4qhjk<*RaT&YTS^ b֬ i1!&,") toO IppP1tcuxN|eT[LgOh 9D) ”+vgM%W1Y3gBn?ctȐs_?~ٯmz+:o5ԠM6qKMHټ=׭] a]  0E0){z @xk6mxȿ |WOh8Rܱ;nٲ釿: z5Q?`2T;>tf.a}oF𞖖[O~ JD8FA @J' m0qF5kC^tWGKa8LzYC L4vKy 2!! w1$z&8Ξ=Y)  S0|I&4Rr CS>о휯G۷o h4Lj?.Zx),f1z4T&`!^xvS`ȄG0/:#=\BF {'}u B^)쯔H6J$;$%w=Ǽy_OrrZ⍹a˗n6 %.R*No߾}O7:}HOK3c߄Sj!CJemU9'[Ϝ$8y$4|H|~ ~?p\6NI)T#q2w _~*dɏ`ȑ#D ?|1Erh@"##e#x! ={veR`;kgSasfS|-ץK|).b:gY={1u쯾 N!p-7Y<0䥗Hh>]zjFA+q J 3J(gS?25JH Rb f4U^~ ?9qnK'oZ NtTDuMsMPS0CL) !X X|` [OՇƁ.7f޷VxN{yApa~ƍ#>t{0p4Шc7o}zܺe3Ћ,އRXա/5K /^!L s͐K0k$gz[84)+/q~[8M@~< J$K%Uxl׮ akc[O^<$&-y#iȅ p{ &:4= #&: 2 +E& [>σviH`7kƌCI#"0LȅSˁaCt:-YG+q $WT׷|4.?yB@ fWZ8PؗLN?y L^23JжRLVN1;u@ȿmjZ 0!'!vZZ IXh(UӴؐFd2xy@2:@>iׄq}:m]!Wa.t`??,Z\40L9}q~ xJK!W###hV`[ 8ȖÉ#kn˴=\vυ 0Hv=c62Bǀ:´,?~Ɂ =s= מCAa+0z)ekSS-sVp_|'Ӫ >?G[OL&v)߇MAAh&QtGs4è *ŗD5X7{ΛSp۩/C%o%"~[=H wbmËgV{ Ń? 9a+|~cO:9 0!g7t tgGiB~#=gΜ| dHᒟtM 8ɓ: ?\bz2XCO*B~20Ái0 qn@>0 3P|Κ9{|ٲ! Cp!q1>q?P tQ (687 (ը^qgt{`mҪ>ʝ#MP`85SktA} KR 9_aX   ߯/쐜m+-ȪWyJ2h)ry剃8.9mɠ J~20IһB'N FۑHע=-"<閦j=z οfz;dߐaɕ҂Xƨ-ŒЧ'lK&vعO?091QLRM<+di@3 ]q'éQtdW3?5@*L='ILHH3 >ާz؉N[v"Yt_ɓ[K/f*7sN4G~0ϏuL7n |7L A*axwh6/Z634mߐ pXBf;$ }\[>f7MOOg|~{'Z&ˇ? pX0yS QTd(mF~և琟tE$s s%)]0ɂ]'ؔ_a|~::\.8Wa ݸq# D2vaB8~Ri`rMv9E m=<4TZ24Hi p=g7}\>е~}@9L@{P?~ r<пӠJb?{,\Am٫ ȽX3(7I%u~rxF/7_N_0^&0X>%XB\쾿wgEq1K3!Ok̻FΓ@]7oC\ $U+ߐ4/| L>{x7$0X]T(+%?Q)/s;u$i=p`Lߺu]&6.^#?89C^zaٽ P }aR'ytӦɅ)&JNNM0ށgO 6adk$ \>chT^YAN`NܾJ--s`i5"ըh4ks+o{k@ƿē|}^=- !a+bF<޵l|><HN ,V > @~73-7 @ ᅲ$__e?۶e }^ \jT.~PH $ @=O=9p5E;y>ηn3vܸP?iyASLC]i%D9bPShd 0@fܿ`Ex@~0G * :[jq P'ފ5q[HAT`7M(L @*C-m{Ϯ$.pMzsfAOD"I}PIK™*ߟ,є}=+WA$Ip9 z\DIΙ3tÇSW<ڵ3&&"y!* AM˛b񞨨H.7[ƂpF{?555DFɃ=ʇNqOrO=!3^ [ \t(\Ȼypr``$+1ٯJApP( %Il={~{v ooo.ccb`y`9Xi/QmjفlX+>SYS盺aI=%HR |S'a#fk.۷o瘮\$a;:|L˟|vB` !اFa&<*Dpz_(*3+%Fz5'WY{GQt%۶uM֯_M۶l fdd9rc`˩ >&j7c]I_ Or:[B:YW/e*~S]0g\x5ךc:/ܧ|0W;J,_Gy(+7=2lWN۾]ۮu9sn.X- _^ٖޫ`ɋ` xnc˛xdV|+Wdf{Tv_m`}V iii2ǿA&~~ۭG9,eo$򥚂>AgMkR]&8Tff(y$7'o`N녤%9Y2:2Đ}L/B~wx%P[N=ZvxM rً.7 P`o 7}Z #%'5 >1hJ=VZA^,aSCNIe`[j Ksߥ#?zP ZR\Lr܋;çW.$cPɤ>YV4@&WgZY~1 ppZT1O*=-nw'3tBܸq>泷tml[S{MGυ_ޑCQlDIh .s"kf?.ba[hJJ4W L*,*' PS+ K{W;Iķ=߽+hv|n \22?ڵk7o޼ξA>k?{׮^%+}3frU6>~Ue"P%ƸӅ018--p6Jlxll"şJ/k?|}n$g (Oh 2BຨPQ;b逷@D K<\bTcY:fGXDbh埂+@'hfIA |.[[&-w]_ZxO;7qƭ0?fRpyF'k\>RRK5g1%5%Ř>0>ud>:擘^k:F1> q@|l b! (~F1~),RD8XXP z a/^CBCB/] !._t18($80$(Bpv>/ g>}9|;{ާϱvZ9S;}F`彔{ |ydžN}z~@y .._`a  \_!Z c>J WexE^``põW7|2;sGC@,(\`„A 20bAД(g0'JY9S1 H0Hl<hIxLyE@ fXm684'緶>s6C}+p` 'H[m6}q}L񏊿IWgD_<}MXj-[*m+c`BOw$-.[D=ۖ/%b\G+O9o5/T.[R/3/2bi-3雿:?xEdHp2 B}P( ɏBP($? B( BP(&FPY$(uA2ok*5HV'ؿBjWl?~qJMU%?s^?Q(Tmx^RRbKʂH [Iwq8)PT6h`Ӫ MRj'^"D9_Y+! +23+5J/B~ N~'An I;~˲$nW_x0/!tǥN} *ʘ_ߌqu򋶌\Tu[$C[˶db]\ۿ3{UZ$UvE7Hqg/'ُ5ulIfȬˋޮGxk_dU^6dR_)jq{ GL9S0g:jٱU9tU3<۴l{CXs$ܤ$9@Tq;99{FfU'['w"9Ðro#mƜ*b{ '5rtBK?C`U:=βHzcl3Hqg/'ԲÎn6o2h\]^\չy&H%x99Ɇ jϠscɕ:{=6) =!'>~5_wнNYk+'r䆍7-cI{ӽΛ&b2 Edώ$Pb:wԸ5NNSgZ`զwov0 RE#3݃TF^CS]WzEC@#?/$f'_pp0TidN ?~:-DEh_ uzs7Hd?+'90u[#̕!N^4QMXgBRE Lvqy2J zVVI+' XZ pT#nF쎀@߬^Vvvx P0Y3>;>k =8 cwH-*ߵXo/kZ1xfϟCȟէRFɒusit(9~N>uY¼~m҇|8*+ϖM8f7J6풗4nG>?!FgR+5eBԪ^qiϛfC`6}Ȩ7l]@ d'GG0 Z&nCǖl|{Vr1i"[I֪`Վ[$ؤJfC`+zN?Sf"ؑj"6`yN~I9-cms-_F§sx%֔Lom[jQ39WvZ+,Ooy@$jb2U'j?jA>fk{}rpo;ղK=I~( 5y,y'C{xyɟcƎҥ!zɜ~BfxI;b[ǩEm$}>Zm1* FV5n'Bs'buf)5z]?@IWD Lo9s~+ [:s. LwQ8;^"AO*^NVv"6U$t\\Ǝk"ն}kF*byt[oz LEhxjܼ͛@`S_L[Bh)JVkqJ-PgAܯu.1KRi.f,O/$ҀnRW?)}gu{KNO-/egGWE7}ᘞ<7qvqm9h'UNfJcPkRلi4)*|n2ãûw|s)A#@;5q{sLK[ל$)6LnF ߝ/07#{ ,bDUAex~]ؽE)H=ޫٷ֑j"K;7qEyaϘM:DF޹i=>?TW$F~jֶV ޏ<95jݹ[ϗH1f&O"Uj :d`f3[ۖ0H]{tSp_||U*F<ӧmA~1%;U!DĨ4˦ Ƹ{$hHgg m }σ,v\;WE zVkoR}"s|ؗSϾT#ր^5T--7YsgƄ$흠Ɖ3M[uKBR*OƝц#ϗH1v/OϱjԵ= }cD4Vv#ϵAiٶ/G>\ liG_ZomgӪPvv[GhuS"7fْsl\RɟJ UNkU2Ybsv+kӰvXlp `^XXX%fْsLL启O/K*5iX;6Fȟc( L[rIm?Eɟ(S*5iX;6f;333 S2l9*:_}Ȩx?Z= kzC-9Ց?Z= kݐ YEEE3m$>~6 #( U b^)¿RArG&}kOKM%GPQkk[)!Q( ɏGP($?B( z( B՜,c- >ƃGPƏ/kh&:#x d+*&h#Q(ԃ(K_\&hZ}}'.:CxPbĒWsM3RvI ~@M%i9h֦T启A3<2l -D#&Nbcj} T)nL1yYF] ahɟWb̪mXS&də_7T'yYz] ahɟ{ِYN96-mh&#D)bvHx%lpQ#33\/ŒZ{ ?3/3fR6!ug(7̆xD~F.?Sz-jY6Ff&N>,>;>k #VGp5@~޼ $hG~J#!_ Ni&8Kx-c?˔ܥ--:Pmrth.uiY4[fCFmuNAdNk|<]s7sH_>H OYq&!rV-pum1ql|~ҾGEjx4];"\Lf[+h5nRk϶e$|z~?gwIQ"kM4Z@~޼'vvbsӹOC n4`д B8RЖ5rhid6+7CY̥ &5j(*VJeҢ5t<Oїg@b͖%~@.&䉑sxwjO2w]'J5}=<#xX;#fZ5oLR(ul K"n1qI@~q#hJ͸v4w^7ql{ʳ4pXuڸͤRطiD2ds1[6Oʃᜢ B!xOsWggiOwyz"imܙ=)PqWf;lĹc IGdJ]H⦗c>BKWזύ}Iojk 9 Gl)X͚jٿ?Ř)W-:Vfyd6d'/>]VoHHk-*&2{lN [fiO6˒4h`yd6d'cy[fiej4A!7üD2Âa `5ш5_`A'LfCDOf/ZXݓnEt hvkGUUuL~ ɱh5QOP(^GP($? ɏBzC uE{.!!?޾g{K]=€\<?Vgec?-'/.&h<]̲#[$i?ܫ3S /lEEW32MVǗŵY뎣Ȼ~.m-Xؽ \X͸ys۷vhwg޼c])ίuuvՌf-^evy{%5s7ԴiSK#oػlu#lԃE+ihJ~ '`F >]Z=]x-C6+)GGum# yۿi{=n-z_PP&hjm??c^nܽ׳^"Nɍw'IS4Wo:yػlu#lԃEbcj64!?]MYȵ?*VxgD"H;CUZVqZߎ۴`e#?-zȟ{ِYML:evmbDSC^]کϐ &`ėI-yzGإGv~AG[>ҥGߟsvi#4{t)7n=-[!oGdCF5 :0 '^hikrthWEӧF פ]}ұESW ğeJGrZv[t<$scȻtxXw2Qiro VX= [?;@^M.Mq2t';Z"KiU+Qy?Shhאi9*~ sP,>G3Tڲ}w["V(b?BKWזύ4A;GA}+j(մ YȟT% Zlɏ7f)Xfb⒐^ ɏ&SrMТceCpfA~(ͫܘȫ Pқe7 .M 'd\uZqv{*$MТbH~ sjkk*. bwX}gþZ}j3Qݼzi$?ɟlH%i-2:N;ƭ`w֍j5^$“ʔ7n*zZbB}k K0KKY~>9W[/(ΌL*Nb 6}e97ʮ߸$SY]`yns>[rU41oA32꫺@RrkտuW{Yf.(($?ɯ7'ho>KyjłS#/gNVٝ{}!0coG|6*U~Xv6"U~=6]Th,^3_/j} ʖ;MJngn [b8! Zk#ׇ@"Q5E~؁ohvȯq|ֿV1 n>{u^u/f6}9n2pM' rz>Af0<}! '߼kIj_֍~ gg%p]3J5_-_^fֆm ܜ{}|.ݻ"??Ybȟb0A߾ߵ*+'t˲23NzY i AUYp;};\򛥿+}5ޗo;Wi\#4zC}۷J$?'?|%.qGD&g ;+7> >s9} [7/smԫ__r>83ɏB?hO&V÷2v˿{]`}+v}`W Wh+ZZVb:S :"}FsZYRvk6okOSG!?[_Q.0=wxZv)@KqQqXx8!򕛷o,+?pʾ+k Gw9ܒeoP$.!V_-]zU̳ٞ=*g*HϺiY3Y)u3ِjiԢ7wZH~AY/޹s5^`6ߑoxQH~$hk"  sZ ɏg{$>n.-*XubH~khv#m(;'?jFf>Ӫ^$?e|4=#MдN~(_Xx%-=M4:#B? ZGP캴??m%L!JU2ƀGPyyE),-.wꢿ;ؓG諺}1:~ߠA{>ٷՍ. y7լ)=Eکנ/6߭o<߻i/17TͽlHɴ.Ѩ#73 C݉5H55)Tz$?J(+X3S1έ["[gtvw[fq(g.vn⇿޽Sza/8P?'0ِaдs+.Xns 7!ΏӥxE~ҾGE:T*H%I`A՛5:7x>4auch[&&9egc:p4}jpM5Ja6ԫ\q{s۷vhwg޼CR/ԵkGOlӽM Ka\p`uICH[>w{=A);؅K?y푦nnMy퓥ewmo kU@=ڶjgvn()(cYk8nLҦ_?ȟ]ONŔqWO0Xn7{a)y̜m='"[t'H# ԣÕF"nk4^01G6M'xè!VrJcXJ-I[?gXr풿9ٛ:Ig+9a~iW1K3]yt>_Ot"ײVvsJVOn2?w7\̀o{SX2LVTvT{ew6b1FQ~T7K.5rȟ]ӧba?2ΆhX cv9#aH'7@@Q84ttG;VOŠ}4^01%&n!N^6֨R5vK!M,_amҗ5}.LLazO}}LLQxoWe37eܣ݋c>O/%q)ۛZ!aj^.+U͔;7r<)<4s#u|.pP?3+_KŒb@'NoQ"kM_5Zđ!=MCÂՉ'{tG;XJ-1Imwr4I)Ϗ>ᘗ7w]z_88)ܤwo3lucYu$N7*C Mu$㟟F}~'Hy6KyiWZnz|h ˢw;%aѦ44, ]1ZNK bU)P& ߵLos-` 2Uߐ'VK$ }ƽZ},gU#BzW8g &^N_֬:lo kU&ǹ]$iXՏ>g]CH NǸYט_tzbf`G΍۷gCv~jcWd_/Nmo kUKA3J /%g־suF- ,}!~moC :Gewi9*v<]RWlH"q/tuqqmܸ9 =I HÂÌ=ܴU~W"iHCߵԵY KN Jl͠L-;}7wvZ hq !waMpuu}K?K+ZK]\;! Sp_#ͥ.͇Nty)[hx!8ػlw|4{>lccSX2XB Z4ޝZ7qz3=҃wn$ ɭW_iJU]Y|V'~Px0tje*(|&/ FB>l7f)z[ٸ]ڲP$D|NcvHմO%0O޼_<礳C~{([]ӾN\dSr[tO۷jĥק$TvyD1i7oluʨ:#!%#IEzI~ ?ِ.KҠ ZdtB? 25EF#Q(T=#? 74AGPvN~ 4A>B*$? B#( ɏGP($?ɏBH~$? B#( _ȯCP($=$ H~ ɟCP($#?Q$? B#( ɏGP($?ɏBH~ B#Q( ɏGP($?BH~ G!Q(GPH~B!QH~ G#Q('nNK ɏB&#Q(ɏGPH~$?B!H~ Đ( _O!GPH~$?B!1eD$? B?<oH~ x|$Q(W{( ɏ=H~ $? BjB!qBڃBPH~{ od^!GPHzH~( ɏGP($?ɏBH~$? B#P($?BO~VC ɏBH~ G#Q(ɏGPH~$?B!uQ(ɏBPH~$? B!( GP($?NɯQCP($=$ Gr( ɏGP($?ɏBH~$? B#Q( ɏGP($?BH~ B#Q(U7?ը!Q(BɏBH~$? B#( ɏGP($?. B#Q( _"GPHzH~F"Q(ɏGPH~$?B!H~ GP(ɏBPH~$? B!( GP($? ɏB($? BjB!)( ɏGP($?ɏBH~$? BĐ( _o<B!H~ GWJ~( ( UM!c_EPH( BP( ɏBP($? B( zPȏ!P(}!?>BPE8BPWM_RCP(T#?$? B!( ?GTcϚvKi䨸,"W&Igei6:xQ(o%/Ff% T2E^LBNTlVdLfdLFdLzl\,)K& K^4h"7N%1;_*q,m:;)}"h W}z.0'x. 嬿|Y餳 ͹y_^Wa[ps?y!gΧ:?rJw+^LI+KDϡb޳'b]:y"z#vEP"<ҙZ۞CDy9|^Pm߯|ޤ{iGmQ6nk֬_ws7xKm?n]ZK.M=ڏr|sa/ujŵٳcgr ^fxi٢ ߿Rssf 3ή0ti1)i99[kH eBn-OE-3,<{a -Lüd>UO.^w (RUS;z4umc jIߺ\n b3 ?_-vu9Dz"}I爞/ìY9)z`ūփӯ^yNf"ֹU3=UsjM]<ԹC>t߱c>;y#͙tɕudyYa' ^vW")ͻ?+5vD\zwNjqJŅ#>UtO`*-]:t%)9TM \t](=>MTG.F@|`>`$S<I)Λm$ޓͣ-9q/Vυdj4ZvTC0 ÛS~S+N]^4m Le N6M램L`QM/9x1xnʿGcg:|*ș%9t\_G>{dԁ=߮>ܹwnsعan7O0{˃[ V~tj7ŢT=ъgb]qɷEBW`i1OTp=/LO4wTw`>`$"FC'HCZǛ <+h+G|`g7)dN9cħvƬ|:Gfg2GW; ebd/9x7no6j'p۾mި{ale7nviÆ ׯ~ knlX}eKFMAOdĤWtSB_@1C!]1~˻T3f`qutt_1+v✻T5IÝbEZ嗐H k4Z0C|I0 I:<'>5U?=6L?T'i0_$$Z?W_e6-K]Xyg;lcg]<=Aq3zF+A)ZN%׍\k2,FF|ձ3Ok7m7oN~}7&}e9aىOLwl'7lWv~a=/$gbа鐕.WsM >6zއ՞4222ln–VOn`t hG3v8~C+L>TZ}˃LYI0Z&Z7I ~ 85I/E%w5e }"H+?S9~%TG s!gci0ZLǮu22 kЎ+]6*6*IhU퍜G k?ڄqg6ťdU ljld6y>/}u؋YIώql>!F c?_׵;쫳\ wDBg= f87no'@pP^{S7,*c$ڼ]mm5$k޳ 皏}1=ܧ>=w_v<Ƒ&~?A[8?eݱ5f1߃< ox- kcn~2mݪ$d;,g=aݲ|lGGoฝip.lj`hոXp|dOњ3V_oQuEՋ[6H$ޫL_ENyP KuQeU)v/ZeZ|cSd[C+C%@($RrYf<ʺCxT𨡣GPKԾ* PV%%ןE*yɎoR]*iUiG55 /KojUhg5Q-͵ R.jˠCVn("ӄ9itWmȷϲ4Hw_QUyM\fTglTݺxUea= {\{$TB<_^.D5!VϐSʩ>o~젷ܐ*^XUfD5Ed5?ZU͏ݨ3:35x4j[=.wjlΚK!#@$eZK6M^̌iJfUJ#5Q_cME*)gw'U^iY)C׵)6fϗC68ɮ/tẀ7Jn[^̨*~t 6uQ-~f |պ+i ~J7nȊA=7/bzmvwS'H^?ʴB~mlN(q32m03* UT+@5rT P۞ݖx0FV.s% Ұ+*ҲSڸL$_xdK6r^>*O`~ {Ë̌GĪDlX«5!w'+,c:ruG_]J&9 nuOl~mlۛr%63D0BmWڵ u /oTٽFA~~mlۛj%6#JfU,JS!ZdsvT:T#-sZV5/mP=9(K(C'a+VQVJZ*/%*jOwlb",C"7ocR;Ba&AŪ]K?U.?Fedd3tV6#ɰH0vOOB cҎ*joTnJ KfRS84[$IxTj&NhoaJH`&&2jfJh|C)AZ&z;P8h? &`ڮ>FEH3hB7ǔ4!RM "5h'OBCSS2'&)՛ի(WoQB?R~P 1g]yK> 100),#UOIݽ|yTJLI*?7$&䷍qG5M_gO,x&¦҅i?X邴4>^@bbOOlzm@U;w=<"b򇇧1#ygf=p--^lyf %3pr32rwʋNot7la3㡍E]I&#OpC/nĴQgCx ksbru0ÕMI8׳c(ٳ]]Ñ&EE%%i4>iusϝ7//8ynnIv(+H (DYz]6.W 1U.n]XXVPPZP  E<^>n\0 11[HpL,PƴWFي=^mv4TPx^ɻ7nx+ߖLV2cx$9˒oJO"P_W/`2+LsL{̖>8xp/SN/jĺ _Bb$Uz#(3#bc P (D%ӦKfΒN"ݶC*})}Z.NN!>>qt:](<-{Vї3f/XXbo`WTה~ٳryqS P~<s{68)?;{|S)?T0Iz2R?e1[3P~P~ڥ=c{@A@A@A@A@ -hUG$HJZdqi@@A@P~@P~@P~Om4;8:9kѲƀ'MB%[6InEN~q73y_,y'j@MKʞelBP~fSҧœ– ٔ_$ HF܉#M L8oN:ga>lݲ|P~fS ?+L?UyëMSGn^=ېoY$Eh6/,.撉y=~y$@yo̲o#-} !>`qAM D> stream x 0ð'ICq-6d>v/By{&Ax~l endstream endobj 274 0 obj << /Type /XObject /Subtype /Image /Width 449 /Height 319 /BitsPerComponent 8 /ColorSpace /DeviceRGB /SMask 310 0 R /Length 20142 /Filter /FlateDecode >> stream x|E`)*E܁N='Cz=HQzi %$ԄCI!m{͆@ 3٧eɆ3<wh,AGvP(1!!55Tusδ#lLghu5GJٳY)vt Ķ"^f֐՚Rm-͛A$Fj2'OLNNNLL^QQR\\\TR>Ex`)RUFJ $}[hIej}[^V&緒˭3X]?!*l cP JĪ*JtDǓ'NtNO,tjNSOtI\՜>]#%JZW:I[k5:rFqtkun(UfCڱjLV?N |3<g-6[5ʽ6JѰmmug/k}'IꞲ>hǙt*"R.db#Ucǎ1I)E26 F}r^B 34p*KytTUh\r"EѡBJ?glv)Fxm'\ 0)R`uvgLm$))OS u9_&r6~W&E6Y۷\bΜ9+WܵsgVVVӶY*:k";ײkx5O(obLeFE˴~l+0r]}AUc5RP1:)Aʀ&qGyrFs6 jSYl塩ڟMڝ:#╮1QqZs-2RpVj2s{Uaa ߳{wnNe(}1;+ʕs P-@f&雠2r+Ntg&:رRNHC:ߴi&hC,[|*d؊۷m#055e֭T{;o*+ɱ3֥M{,_28cy+r85ee̴8.URS|pǻOT{FjE*iQj"UFbHZZUMV%rk5SF%j|  l/֝V(Odd @v"k?-eQ P۽kWxXS :IQQD)2ӱՒh6gN u^/!*e.4yP#޿O^u^T ;.E*ci|5Y5w*N\u'g,QyUSOX-:jwUSbyr n-y&(̳k-X%dJQ6}P OoFĥ11:ٺuk^n8* DNPi"T*OOOC~ηR CH~4:e%yTl(N5@'4--U2Dř{9Ee(Q5/eR:]lN C]UYbIS]rRBRDSǩSd,i߾vTRlV$] 2SuH6 'Kl"5{/Ze:{qBB3gL%8A2[D $ 8@9 \ro߷8rj!)"2:y`3d9CGκ|jJJrr2`PH1P:}sIOOMÔɓfLiժpKZ(3G3'~]9;cETsxI͝g^Hehnn.;?L\`AvVۈ^m^Tf4Z;jz-RSZ2(R= 554X`cD# "3QQ8ӧDU! _ZŪi?H|^ĄUS>l@x*u|:.OO7Sɡ ,PKIIa8>>nY;wl.m[Y3x/NXSG63P΋hJrPI*m[6oʐqzJٱc+ 2F,8c61$9~O>{%FQ!J[;v,+/7G8)CRR׺֤KHdINfR%MkiމPp^u]ӏSwŶ&q_IQ}R6) ]&f˖ %F 깅sA _ RƽOJs"]HY|62 1+o]"\Aƌ췲9?>]i;kD:X:̌E TSdS4>4߅#PqS"TN{C& %Dolϼs+𔘜tLDj%t-[l ` ydXKL`&t,q%֭"E]|c sf9vXA~*!UFCz>J3}/2z]6WΈ O(?EEFDoX><hQU,4 mnhn夢j[#B]j$,[ѣ5W-_LB0?!>ZiRt mZ]qGPFl+V,_^VRBf11єN-!PjY{)N'ǬCk׬ZΌat; Fma˖͋.`C{\z5}`m'$Æ+.#ҙC6Ú5.Vt:ROY8̾*j%m tD۬,Xxv@?P ڵkؾh;۶nehuTL:bj.Ad|y^R=y?D ;JV āI#QxٽF .JGţJ%Tfs:ΝFHUAGT㥣CbŋIzʧ3ϬPנ!!mbTIWI"aY)IIeVW,_Hy`S|\Iy*jjdCfL9g\+zq|\ܜٳ4{~\!%rp~fU0|qrx^vS:rQl$ϨH0T̅*1@GDtnjo#J"EҥGfpm,Y:ԲBVSC .ez twȻ(2e"QwBHwfK J A,wRݱPOGRT&~OCf3fnvbd*Iv6Kd=*}~Gb W:  ,6N;3֕232h!_26epɂR1ҁϚ9q#N9z0ujqmSi;Tr,Aٜơd+:*Ł<wMnn 3{ꔰ+%$Qcs: :jUn}$cKّB'YdqRKN[IMDI`'%bqT ;5X̧sTy)=BBIl2lADv*!9ڳkq ɕBe.;wl߲e3bI!_BYscoyܼy#*t@)N'"t*KԵUY  |6eșoY֥PN{OJrE?ˬwYuPJ<p h@' ͉/.Q"+l?JdT_61{ ?y>Dm~+[`b 㩩SdNCjLv)*T*'W,)l:Mرq(8eV2dQ lV>wV^.+AUi zd2+MR\v*BӖdgҐv۶TfK$tP5!K(%ᓜ[V4CU*F듙e8 M{RHLL\gʶdb2dgt`~^56'@ɮ^Tq&]MFt8|V K~ JŎYx$z1Ճ&1iF:{$ϝ3q#gSFw@U}Brrl aV賆/ 7iPZ,\|۲wZsgd(UfrrrvVfsYYTT6VF+U4esRk$:潓hmBmS,wX)\qi_!H*7;1+5ES=2B:P +ei-aZTPݱDS|)[MNrX3ٹvZub_`wvC6YMKi$94c4:F?**;BGSSS\#z'G^bE 7&&Kh xNJt 7jiƒ#BOJST8lKqȯ> >zQ <w-5>~K߽sJ)bNF [9FsڂfĭPfa5ڳʬ'}S@!aa+ZRً*;.۷Ν;M6@'Y 8?4;3 oSaQ~Bep aC?  /;J/qxǚwp{H:#R 3VM"򤥦PŔ!"#PGNJD9cE~IMYxI<㦯\,i֬^@hy+mCJ,,,k'jeW*uphjXN{?|(^9f-<,lUx8~F^a[fպuHNJRRAT⨭^ =Yq"9puմ ǜm]34¢tDFoʀv효udaPD'Gk~B?o9"-#D)A"d*Pg<&ݴOf ñv(FcS-pf]*ͅ't#E%\+b/ҡM&֑ÇXahX>Os֌da͛QP^GI~?MKRJ`wd2e2uHlHjHSK0d; @4X"Jܿw/ CrөgVtVfU NBT *7cT]:˩=Ҿ=oathV96 4cL֋U(%5Ubf) XvA(P3.Q$!GF"/V}$⑂GaLX? O':z=;vݻoo)J{03#]2-TKFNUaHgƍ4m[%:.XdSf:,)7g+v #ڤtm]AŦdG6E?aml3ڵa6NZm.:.SNj ;δұgn" 02RxshO\W:e gH+q UQi"tYtl,oٴq+mѣDK*Ʀ*,YNDWv_9.I h,l} nTdUN<-;7mJEE&:^'UO nXޓ"[U<#bocvickL45k{f\-ṕHT llN-aPa'WmB# 9Fҽ%tї+hrfeGo kB%s("̟Xp΢*YTT03FjqGPڶkFCb/VNI`c9T &MREyy48)ٖ*t#?Y:&*IL9x@NN6>BjA˓:Ї;tXҡ:txGGKp7Yػ"u.v@Jm۶;reP n /}* {m˝#Ir'C:7_Z*)e_9o(F||TkNoj|RFx ~){jV I5qDܞoJ,ώqjll,YVt\tʼnX6--MytIkߔ^Yqc,";!;nlVjIQd/`uCԭ4ʟiBQ=/{%GGQfJ}Ҳ"qDC`FEրe Y]iaS48/NȬ 4Px+WIwl!LW/3kֶdɻ0{C T'*f͘A)v嶨\yTRX)@H NϹ<ɦUA7G9)GeRgoWkw*=U֩='HVRYDH3wL)hM1v/)Xd5 ֕&U3T>9)%<'~mnOWͳ V7% >Kݩ&MPrEٮ #-/W(s %F#5SN:nh+d^StQ=͎,H۔/(հK#7G( ;KT LVjTXxe40!BuRiG2N/+-_vи -?[3FSQYP3~BCKBM~ܨl-d7*X:9?sG;,$ A r IK~ܰ?g+I[ncf~xs#os~iEegMƳ [߻#+( OM~[Y[{ԩӉ {^q]LCuuu{-EhPOa WQYO;axR;N#? ;VSUBPChe~$_)Zy[YrGPCZa>M,ÝA[\&񆶉В;F֯N_iM&G:y˺j-*ЯۭF2q#˒Nמ;{dSPj%-zW!d=#{t $zS8q_C М6oHSrdtsZjwjkL~Ӣ+2t9!.?/}ZKb>67mL[i5ږ^rx_^S_R\xfƺ_9BΝ'k3W'Ŝ=[BPE(e3J:Ӄa}]y?9)|4'EL&~Y7'b|,;vէL7.7 B ? f;-En>:G/.Un<ƵBW83ff?!r?H {:H!EO.`;^/KN7ԟ*ZUZ?}w̹ 1r `隻VաBPFFhg;vcq-wY>]We̤ '_Ԯqھ(Ҙ㫏PS~J~OQe5JZ ;$d}Mi:獑}.Bv\h=3>R @hXU|3 -+4-AACxp֮H=qs'XPNFhmNGh.Z2~; ;om4O׌ 2υj!tßZJl˿=H޿ƜReЧRgAϯmYʄ̿VF+t9 fn򷜮9_-AvP}]wOْ&ؙ* c=k`l=K+_fsj;&hH1Za_Ҥ+֬{ާ?̲Vxs ')Fpn{~~SZp? AZ~:xۍ/NΫ:C+Rhi觗=Ԯ.onAFSMeV|oB.=ȓvҘ}kE~ބBW )-w;ïIר^c}[ۀv A@h;@OP  @e& P oj mh9:B=()B5[aA#NK TU r!4 UABBz B!./GGSAm@=B۔:)Jd̽}l6GCPA(8AЅZd#)BmӤVXo@4`jge 0[~8udF`tMxםC6yh1tܬUN٭~ 4`j 0.͋ʷsR&ϏTj{Lm VO稗~_k!TYZ@ 1#& %BE'Z.PxErb<9,H4UΔ(8[9B5Ϝ_~`0S+ s2K,]<&6+i#T& !t\jNk߀}Y<&_{^iNt9eMWr/4`jgU:AB(a]ox.Sx䶏P-^rɃt*sܬZ~oEߍ0P-':M^}xL,ٚ _gERY~CIp>N"[ G(* A@( AeМ,Pi@(A:4ബB+ H@YDA-%  xy APhff P1~b ڍS3~.^_@U) t!^u) m' < \IGh|PDnA!-= mQ%V @P[Chxv^!%-":<1BϜ8)s- DNR˗5bp@s``.wZ+rX>!95$z֭FjQ)RTƶcv0v y6f+5ԓJk4$cљ{砞þ]zp1aɑYo م.x96Hʏy\4xvdbT&fys ?{]L.==i,p.=r+kΞO |+<_?]كozc6u6rdl'ߐGgOdI#?Y/mv7eSE=<@ g5X5F_5w5Kݩ5]rX-p`˪^yzp7exz±Tuhl+uN0 >=i6Vf|yת䡏ĸOG3ϰ^5QAnS#o9ƽa8K5JPaw#`}'3 w[1Ef;գKЂYHIM?G~}U^NS+QDpž|~~䧛'&bzн/sfBس5tߦjh!>\swXACxp֮k0t ԩQ>/Zѷ,QgwG Ay),WȈZ:4 ᏾_x %C6h|*B9-k/J:Nܜ*7qY1{SKVb_˓cA蟻WZO8]./V6evyN6Ky,(N=ȟYZ?m ڝQC%Ghn~Irj& 7 xkAjy[4axоߛWgV6"?4$r̶u6IS1>~"^B?u醆%_{߶+FHQ^!}Z91eEL4?0#t۫7{]WPف_WueWtXMsطE?<y)BsRYd1W\5:Rb\Om'b! uVDYo h|ﳟVHwɶ Bg}AFr񷣺M7bMZ3 1"v9GЧRAϯeB-~n-\,^)U^t kO=l~fY+n rk9o5HbK{-o矪ceN:A@|䴿?#d 39/n:AmnO'fe$% B@(A@. Sp?*B33Y?!ti B# @ A5|ui*EPAW"{UUuYqOBFV& +Ǐ,){3P  [OTxsP  v{UaՓjn[=d 04cYz8`@Uٸ JS@w>p^ + < ɩ"4‚*U^krvk[iW>ХӓD('t{"vFOF7Cty!j/$$d Eک!Jy.)ێI9''m{>m%'KK+.%Bo2> r='ؓdi9 6g#1]4- c(/c:wzxuriNe-/HMVhֲ'|SOzŋ q_ESв":p,Ej-:7yH?CQH,Tex&_8iasU`bφqKH)=Ձ![-CWnEO}`^ي AmeY<)~"*/HT/18ůxoY|FCGCY>sD [ow: >BKJmybOnY:޶v?[c0}BPGhqՒ+ ԯGkѱ)dHڭ+y,K,]]_,KB76ZG}BPGhQqyjZ'БAϏһOEtow lEhH1mu?e Ž4"d_M<%楡tɗc})>B RR< =AhmmmFA_+ 3Р[YOj/,MJ$S"It"4$œ  HDhn~qBb'amxAm9yEq)={cP  ٹG= B/T#AF C" ~BӲ B1G@@h<?nG^}9 MMt{GB!JF~P dzGzy=Bf b>yj|B!}#K?@h(/WE0C5<3zG^4TGQnėt6jK:K[s>7:4l =eIM|u`Ϯ]LPqs ?[3SVSQrJvrn!h~vD˯}G\J ~D(CP{B~9-=G;^Xj87VT.|k<ˠ~`)oY$BGB# g.;<&8'x_g3Ǹ H VM5%w š%yIl{gz@~!=!K?@(y5ܼ|yr,zW!d=#{t fyJ>kܧABGB# B+ȫp7#T)AϿ@q< Oo+(udJ}j)uzZU|ЋA_02 )Mr/A Ab FTO #iY&V#t%#K?jԾyNK +^oBH64h42[+xFB!}#K?C:yO{߿ǧ7:ϗ퍚O ̛|G(CP;C~䛇P-'^3%VuSܛQջxA(CP{B~䛇P-'^Ks)CT^DoZu|Ƿ ?Ԟ"Tɻ”]^dkz%yjOҏ|Z]k*ztVD(CPA~AɻxoBPAZ޵|˼ϷBÏ<zGV*kyOZm)Wڭ7>Q"T{xD(CP@~DɻxF)h譿jJm2#A^IF(CP;@~P<AW2B#t%#K?@( AW2B#t%#K?@G7B#zHQS jP y &?nGI ي~P `zGB! F(5G葝&c"8;x#K]l>bGxk[ ,b-JehE-`1s]%$)2R*ůOP̷u* T AP~;u4d+q߭OL$㎉/lՖtW%d re%'K%_Ir_>۴fCC>en/:_l>hga6P-?? ۪ϝ;[k罂jdOnc-<'oO`'[} 5@(,B[ߏCks=b)[}JmX2䌃zo/,W^:yy뿸zqerg_=~<]5S>šmӧc6D؅Ϛzg6P-?t wqIvo”ī}9۸)OWS_}ĴoFu1Eh<ߨV$:}9}N2w5ۣ`)ݖG/.U䙏nx่"SPZѧfUyvYV kڠBUFMZԝϝ5Z'ЧٳgUy.m)5W@( B[ߏ|Y:1DZ }̾͟S+Uy|6x>{yոG'ԹK:{10d1Uɶ9\ YUA @( B[ߏ(- ;9{ٽ#ҏv[WC[WYLLZ>GVr+tڠB+kZ摲]}m[Ȁ?bǮ>b:'~{ @( B[ߏo}bw>/V< OM fs)1~p?|^jZ>{tڠ>B~ų<޿[$^nĸ{gԸϦ9пS(6GWtkI(}^) Z GݿSu"ҊWyqS~`y>E_fs jf;:ۤ*A}W/EO4;we_ zZhA ABA@(A B!P   BPf@(AP? j?PfsA'B!.H"?1 PVb. %@(A\(APyf#4Ј  ~VJsE vgxx8 l|.4>ӧ"׭E@@@@dߌ:lܰu 9( iӦv@ șwwl߾e.m޴iÆ$%&T(wyD~r-[t*AYV endstream endobj 310 0 obj << /Type /XObject /Subtype /Image /Width 449 /Height 319 /BitsPerComponent 8 /ColorSpace /DeviceGray /Length 333 /Filter /FlateDecode >> stream x 0İ2A!/4mMth/!~P@ L?gPE endstream endobj 313 0 obj << /Length 542 /Filter /FlateDecode >> stream xڵUMo05*4R&iCOiTV ˦$RO6xa ܂z܈VBo-!  ̺o[޴ʮY9w\#BJsޤRZQW3LΚń 8ҎALR08ⲞpyӤ^f׵T2pB -6iMҨ4<+И#+:ۤtsR3:?{kv  ʓE&UiB6ص26D)4cqi`$ &Lgܨ|= -/H9-PYor<˳\y]UE7ÉӏVh9yʴ兺ms_04Q5'A5RMH{{MM_ߘǝ)l*)̫j$~A`.G0i@;xV֥y%rb3x!dWtMU>- 4W^OT=u DJXu/PQ( ] p{ endstream endobj 317 0 obj << /Length 404 /Filter /FlateDecode >> stream xڅKO0,i{)m9ѨDu1a%Q j^h C~ ,;OwN3r`G2#2386PLa B2]cⵂ;`ص XaFp6f:M9Z%ˀ]X<'wJDZ wΊdz*n= R,W uI ~U:h~NzJCkiI2>_R手 vM0!FWU3ྯۿ0p KyWu]]\\b0l~XU8D)-=rMSx[ʱϛE 0[RA~ijle}?c1Fc~'E > endstream endobj 277 0 obj << /Type /XObject /Subtype /Image /Width 471 /Height 417 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 12906 /Filter/FlateDecode /DecodeParms<> >> stream xye>筪$!T@T$ ê.j?f(Y6 .˲ʢ + & $d2Lzꩩ5 뭞~-!DSBU]'{ t:l.t]: M#5PUWSu ( 耳Ԓ?ôwԐ7` K\sXpMOa;G+@$Ѓ^tuIVoL ɸ.1o=VdC5蘿Sz)[1y19 ą Q~`&׃}#m_/vq'~ }Z*54!@i06I0x),Nx̂^S&# 9#gԥdIʂB@A@i.\S=5)eARsq-CJ"ҁIhۅA.;x =1W>n_GPpYXivrŖ~wxHҶeB`f5vq/f8Snc0!o >/_NBph7 _P`$pKҒ{i"y{SiTa9$P`Zuap\H ˑAɔ%vv9U3 v:ʿgf )]--86Ya{hΝs}$"~ly&&J+B–RrHӄͯDԺvsg ]!K RBJ)5& Mttiwa7W:tC9t%lKJ]RjRHHA+ϣݯ6gzP>mbtV ah޿ % ͢Ow<Ъ"v a.=%LO|3fc941 9=( Cei,iJ˔%mKL@J˄cIےMt9X}2-]ԑj )k b>E2~@&^˴10$u CE qȾ=vL .wԄ"ih34{>,ӵLi`Y.ux HW MFd-@6lt!Nto<&̝{O5Ӯ?gh~0[`ccWϸn>_tg;]BYtxGlA鲓S} bxTuKYtxϱr{(<}lWH ?{i]s).;쟽GJ }_H ?MJ4-&,#NW۶+m[z rP>%D-\rMSLiY/Kpw~ dž pÇut=Nළ N2^ƞݥSοWSƉ;5{L-yS)|^k^9I*>6axʫy(3o_hlSxƦ㳎ls]kp>ґ#2z~ؙ?qf}kMaТ{ӿ3ϟ:ϛYp5t/%mWG붙bW=Ov]{>壷CwyYoy-0woo%>4T֧,|\1 dluƟxҫ Kv3Zù71P_•' c,>u}#/?A),Eہ+!u &ӮZV8 yr58G怡ۮ%KEXHRnLhR WRXpȉrsBn=!5:~bxg^ir/87[۟GNk{==]`ZpTe'9pf_v3zDl]x>o}[BCVk[\c<Ʈ%?]?Q%~PP`ڰ]Y>^&4̛%Ԇrip)\^J,I˄kKJ)gO?ח{0_^-lS@+FzVΛt.p}ϳr\qa{u'vv[wLͿN;Ym~ōW{ ͽW+ܾ%X䕇f1GK/>oS|+M_ֿ}w_tC[ ==rmZY.y[}9=)}/KB%r\䌴\߲}f &OͯGF׼׽/`$9ʄzeڲd!4]{}( t%\ ˻bai*IÀ6껽??7=.M>҅Ǒ ˤ"8B_>hE'm/I͸t}n⯯/9o O<;/0~ t4v S_0~x~;,H't{q"G[^_XoU_?3?ѭK7u9>?%_*\nz/!¯=vڶϙ;f_w8CŶWc+^vsw/>h=%j|瓅\#a4pfGy򗞃t7i~X(<#?~[؂eIہDž |_K}(H…\,[ڎSs,e?ֿ<+qFZcJۂ#ӐcB=0 sP0քYﺴt5GopS*sy CVM~=7q'Ͳ=/}HxK?c{֛_+^p˶ _rW^p]Ⱥ[v|?惮|Kʿݗۇ.gfOܩ[o<?կG;]x %/?[psn8/7itSqOzduڽXx\ۏ~ ݓ'^X׿P=5V?2 o}H^ӡ]pu Z}о|g|?u5?ك__p}R䯉 CR+p_>O;#w)l*0> iT`{ǽRu:u~o{x:Ҷ,Jpz`;7 z1AGB9CCwk;6p/z3o3Hg{\WR?efzO7Leuqpug\$vʾ~ap>?;nud {`Xh>: olѵ  kV sO^鎛dJ&V/3>1#Խ֗dt5GE{ ̙g\\#;7I:URݹoy6}^aC_W}X0%LE[4kPnY>P @~?q}&ZG ]{CHKK1a0498%?'@ZJ4NRX4!{)R@ '>;0滪)!jw5bӷOB.G-`A+L Ӕ鸻|9y}"_!4!m͵6]liߍݰl`> tlGBh!\{uC:Х,1_sMDws&n i M !])&\[+mG86ii>CS[aI=_nB pXuc ۖc[r1p^),-|:GpꮄѳTr4dmaws!0_I+wme B\WBB8R8Wj8.\Ҷjwaw ޹|ΐBB.:tDž5:~rCx)<::,Хv)puK[{RP>-ZTphԯ,t䳷6nwz-ּXK|;+oeeC9OcdLVD0?\":iC=7w#'9JK -[oOӒla;p$ׅC\J ׅ v+6,aiXX_ȢClކ.6z8JN{*Tb VoDZDB: MoJh8@(mysyFFԬm;/;!=b*׏DoE91ò C37baZ(爉[wm+0 5Nq6DD*1Tb &"R)LDSH%0J֬^ D xɲ-XpC^ֱbҋ*d ٣= D jŵ,>8^5i)_2ʫnT]F=F-s.5&"RIc )i Gboۼ+Vp+M a,#%s]qD`$7 u1JO,9(ǭ^"%pl~T*ѹmqZhoHly *9[ Οrh'Fm{\TT%*l_3.i)%TI+-J`8sfiاw!Z1'%$է*U#+Tޙhs5i/&}JՒ>= zm&%@ujR8H8AL`ְYΦ؀VkgN:'$T,5!E}k]Ӆk߇JC9}Ԇ~}W{Μ}R v)`*k)cc}EI~haYVbgFj54[_Ft}%O&$HE%Ob`BJFZaRe[i)kI%-eU $Z}{;u̥W$v) >לe)*XIiӂA|CdiZI_ aDZuqcMDKp=Uw3."fLa"jZ֩D$+/U]V&&F &"R=fZU jKt:b ٣= D jŪiwU7Qк$8 9""RxO7Z$DD0F[ػQoٔ4ru=|<"Uep"_?]B[ujT >{엄gNS k=`u*G}l21+DyLشm[L). f4gCTWV,_ZНcp d%.]$OM %x50߉K^]=DR8%Mz}'i@zeY*^LDf3ö0J_VS? V?S/Y D,qSx3.fS:@j2:z B &7_)cAuS^t,La"joVm[[ Q1]Jmma"j˲`Aǚ)LD$61+v1ȚFJ6KD /LDV=u3;$"]5maFcȹxDD,&(E=ϑLۿ0:)cI]MDUl*&׬^-\1 9"II%c^TU"jKU7|K^EOqOޔk9/Qu U/[ݍ;^bDu)rg;vP8|tt'­v7QUst.(Y4.] )It%xhֹ蛈*N,vFK\ݲWy5`&"RIk@Dԍ&"R)LDSH%0JLa""DD*1T=I8Duh &ؠ QLa"j*V]~a""4DD]IBJ-LDSUjl)La""?G"R]0z:"Wәj&),6ui;]}ݲ9b;|qmfjUO!c'e,Iu^M"jn+ iH G7z3褤`cF0Q,4-\Ѥy䍶ҵwpqR<&pDतr ѭ5N?(\i &T?DJS(X'iJG爨 pJE'%}Ů$e+!" iͬDD*1Tb ;QrN&&Y|*"05Iu7xUԷ`Y%}W]nW}[xp`C\EU}'jꑰzգp߻S7;5T#"R)LD&̇VߦedN 5o;j\[+z][Z4/SW [\UԼv6}OZU\FM~o2R\ڹhg[-ՉOJv-.i7C;eJ奠XK;A%uSDNm7_^!cޚ;M/Uܐ;#w_5-;sʍ;mr#,3*nmꯠkHz3u՛,宦ѿÎyeܑJ#tw5HT4Cz9ZّFT;hYRoDqplalyRI,Elѻfc׭KCHK{o9+ц)*4ĊK響[ݲjS =⡣)*;w6:w?IYJU%R谡Ptph Mtj;-vk.T^FDSZE&s9DD*UtoZ}NݼMJKT+/o=;u+I#ːOEj~2b/<2Fҥ+YFSx8&V&P],V݆mg0)Vш]5kDԢΩyG .մDXb UQcVvjH%M DD݋ma""DD*5a Qp8(05Oշ`La"jֹhJmn "N1)xɲ׃;ŤpͯQwb0JRu(Ƕ0JLa""DD*1Tb &"R)LDSHjF6s ۪esfzDԚ*n {#2}+6*j 5H4=څ]\#+1*'ɲRRQI DDu/fhႅ{ Ҥxriʤ}IJT@lUc_nx2[GG_h<)Z.UeJhh+DO%#Qg]9,eP[5yBuVDTw՜#-+)\cs5HhSCD8//lEtWq+vh\n%i%IsD8\%R:pLqH[/Xx|t11j{$z Їp7IExUlś*@3;^:S!,<>hxi?x2bMgI쪂Ф`Ihï4U)(cHsE=EatR0ǽRV2_h sh,U" p-:ߜ Mۤ5 U3NJ'TzUAgzhpCĞwS{P Jz),Mݶy]핈]紙bRrt:;~4]%~P;_8;8ou{@#dǪ#8r V)eTL RMJc O9yWZ$iI%IVabD]FIR~[ƕv{ lvjz$b{B_B_e0ǖ^ ~1lhm{/Ko>]o׆+zxU~a_FG(lx U7H_y~S62wۚh~=j)5%p|8*K-_fnGRstɍ5j|Th1l YRU~umYJrr[hm)%N䪱{A2*,} :8Yo*:L)~+҃-ѣYzPsT/cecW&Ԉ}P;jh>ٯ""flL&(#"R Wlժ9Z+Ղo! b Wfe@o! a Ww-D!&"R)LDSH%0JLa""DD*Uvښkǜge|._"/CT86ӣ=2uժkN;+@Du !QUW^ucҤ2c gP]4k -qJDEk\KYL QKvxtH%)>~bg,LMݚE+dubW)XFK*Ҽ1{s.Ό9gsvV2TR3JD~-ǜ9whauIJ֥L^Ю#[fr[$Q!FP/xpRS- ^"QHEylq" eI+l)J&}82f˾D]YI`B1FM]^:g,I]?5U¼eV[Y@QU_/Q sDDH)LDSH~n "N1)֧n Tb &"R)LDSH%0J5nƬ;9aeJBjFDԱb m?DylcPmիc7˶D 5β,{.ZeLuM1uۧ&ZD~M|ׇtk0n.u""Rq'| endstream endobj 278 0 obj << /Type /XObject /Subtype /Image /Width 425 /Height 410 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 24261 /Filter/FlateDecode /DecodeParms<> >> stream x}yՙZ@la FhԘh2(&癗Q8ɛ<żL2Y3@DG#KWl,-4;MݷUuǹUun6"ϒ:wsί~9eDE"84]@טC8c'ڻmCXݶ#>b3O0a r:l @,U|=i +Iy, zIH8 F07bT>RBOplho!!}Dݰ}nazV5FO؆cJM@_,]cSϝd 1*2*2R]'G^i70nCe&͸́vEkfAb;w-*YurQ::zH#@!1@1cdcJDhTp,Q46rEL8҉X 6 r\\tґJt!t g'iu YMK=ܰ-؀$.lfk>;A}TF\F_N2ȍ\Ma B# R()OƐ0dS&^rc?L7|[3!r]b{thXkfTw?*L|;[Ge+(`B``[:߃c)%#s2 $G0b \Ũ0*2*G$ހlߞ%`OH R&MEV @48Ȧ@yݒz}`)؃܏&T$Xþ5l#G! Q;VB,h;{a`-ÛL@C YMl,e3Nك={~R`z8Iǀr,&F`1!M\ʲ>٣^بʨ q$1eu&1M3݀pHlHc#4\7[g@6~}Y>p &$<윳qc(|dTg;y@uJ(3D edeɲȶH8de"+ ""\4`9a&4DVAppCL`1@H8ߨ{eMsldade@FC^3?\++,X1V=ؽV8gRM yT.Trt7\p;iecJ/pR=*iX>>]B\{[)F6KeyQdô-yOÝVxypZ6vۏ(Y g>_XYdgʎ .c$a "nb07,8!{T?pǛp=ycg}?d˿ZX{NWWU xٓ켧aW>dۮl ۮ*#ȸhnCzԷ U;#%cn=aNv]j(skɘ[na_eRH۬T_0F+rT;Xxb|p;bK_vm?CPOlbǰBVFdɒe 2pcC8p[+w}b:HޮNx*wԂ}8gN{03hޡ:4pV W_ͭ_;s㓷]UV]}d}']}レ"a?<?^{ٟ[ [xOMn//iEszR;H?=^Nz=/.9*IOgXpfclßF,t .<1y3]Lƣ.G na <ɗdfoe$tq}q5ʤE&M"t*"go_.99IGG>DAנS&jZ&VO6:8xKR8yV#cPnfR0ۿY/U~|(YIec~1;Eg&<6k♀&9&;)6̻⏯[fS03/&w^[%};ӲZu=lL Kʷ^睐٥C;n&^m}}k>Ѥ[vg jhѥYNCNm QnR\m/>!^Becd֯df_RCvӸ/)iڡF`@9pM2N!evHbO&wsde9'fV(#^,7a48:H4\ێk.?_:;v Yu2GZn{j,yw8 Sۮ.na_[XNOg^Y'*Ͳ\\zWoT؍L,lO'&赗av|1&W5LV/{ϊX "^6(neuK>[ {JRLֺwt?YxblK+: FQU]t w5q zvU򺅉+m :,Rme|;_KK>[퉉nw=?T))&sYR{w=~Kcs?Ǐ_vϩNwZ|imsߘIf[IʺcyĈ~/+g1NgK#娟=nWT(smyNfeDҚJO|F^Ö|<Փ0~]^zP;:B嵃HV:-';S?*BFiirI!qsaf}["+Jޔ,|FGqN)-y'Ļs7OO{0򍗮I]idnxY{4}ߛR&Υ5_& +m>3ngSl݊\2=k̜j"bvH{ͶuZEKXi:@ADdagMS6kg})~䛂]da+ c_Ť},㌑1AcN q'l0mY'ݞ=*jlȎR-_dWG l5d>i9J{ 'Jc8p qa2; Vxs,k}Am840A6~{OQI%5L=2WlTBQy_Ғ3Jw?/#*m> ß$cif0` FńCllǶ3!\x4~4NZn7۳ϣ*8*?(nQ?vwT9wЉ188c#G# ph$ <ݲt%yΗ%UDb L͐{ ԸkCG-#c"ϝ컾RV(St_=ͬ cO#Wx HL4"oC34F6Ec'wldt7c%6k8@BVFA;ۆE0tV3J!cL$8`bwt84 )5*~(+1hܱs / pGBs A ̘q lS"-7_gwycɨCQ92X;q"6ES _&ܓt>鱱%'ut-kfCFeTFeT/y8Ȏ ʨ|eFeTF(7*2*D9Oʨ.׼EsU{ظsޔ/86gThvڷ]Pѳ FA{=#|VeFiX9su W3҅3GAXE9VW?*mD)m> + t;::`눪K+u M&$;98T[mSl恮큙cػmV+7Is,EmX~Vǎ:c` `ʺ`Pˆ7TO7ni+:tJ,vꖊk} ew=/~"\Ufڊ׶Wl)Mﶁ)&)TaTAdGgD_0qqZ 4LeųVxuہAkϞ8v-'4ɟg``xsM}wn8ؤN8ΜRTmIg{e{_E߮"x]kߗt ţrGN~ k"1@QüjCݰ }X,Stl1 d+͎ ">Fw}}qNxi/<~rE"N+؞'6w OpM/-O7N_{APe_y_9 nW/Ep\Ј%/h5Bl /S ZK_ Ԣ`)ET7<֯y󅔝Pw3Ϝ2^,c +A |;K/w׳mۡ3vҘiO8ʳfUl`}>)g'۰ЬZ5{z^bqk{?5*2l'PGҰ@H4*4=&e1*' h(4((`YJbA9:i J\~/O}1xDnBCUT"Wۤ!mY?{v[+>tP:Rے]رCQtZcՆ=N_0|iyGEB7 +RJD,P~݆gjSAK(2) UEDݧ|]hX YD 2XPÝދf8;7+QO?8 CnI3tڞ'ha %w[f'~m3wXUEp3 I"Fh⩊`hZ@ L*5H,rpiy?uzϛ:?uJbD{Lz-Ϟ:[W.L+:"UKu~lBIЛ?u$Ն˰m|x# H?2sΤq 3sgs0f@=!U/woxd닥9%lBY,) 'dκd]Y" ޟ^ža$g_4ѰabS}5yM.hA"3("yaS)*0`8 y"AD ! /K^y_[Z[͹V—-S3BNl3ڹ6' W=aT%>>#$M! `EIIǯ< ch^yA*T=q^xkjN1yuߧs^Q/]a"ϻ7\|yx(-d;T<1(Cv嵧.NA%VM緾4v#itD:qks&;AnrG9AB-p9aLm[gߋ{7Ol:6#ӌkJfR[UHE2v*ϟ9!sN&o?B*k\pPb+N!Bհ)D (|yJ sC?!(_DԩPAD"P /9]QQ!9#g0kBS]EYV K"s -i^960^G##"YGdUM]:ufI}%ذRcGO;{;m|+15o_,'^pĥ7?X(EA'h7%FFJH><P-B5"Tٛ`H 9=yL.( [w_W dC\]0]g1H"X) 87u4S:q3Θ-`lK9@0fdYea;rD}Yξ;Lm64XL{c*m=WW>rKߗyhVs.C` O @gG-"T5@<Ȇt$Fp\ȀQV Ǽ[J\! >qe!vb,fcш`:cDFc,fq]zc5S ט7  H۠eeG1Sc:g6rrM㺮oٻ{x~bߊ׶=}KOzP/m83ˊ ~Qd@)>vώ'67g{^6g{__0p ^u1;ZD2".#ArȜjcfW7LɢxEgQOm|#Ut<[Rn"}! |#}]ZV e9 [3i1t3td228L`3t]B?Y0smT:sp1A45{2ޞ`L+nNNd__v~_,wڰ߯>{Xm y[dX*i-_|/ms G8J EFwBOSfS5 L`/AB#Od'dR:׏I~I~.F9S1Fp˽@d2ɅR$9 &H"2wȼ9(jr5WF ra>Ktut" z$x1]`ޙ ܕ@k"$%7龘aXmUes]ڪ檲ѶgχO<_ʒʻ 9l޵w|uy}UejqCrP\vB 1vu#ُEbߟ~mWܖ1l,==Bk0~I]?Qn5쇫9#RRħ|4eo_a3Ruxv B/XY@G`K{~K\̝~.=K.1DZ8BE*LF-'Trc@v6U xϷ( J3b 3 iY4MlX ;v5L4'_Q^05nh[ƍѾMij|kT&=?k¸}Cc^ݱ7^f"Cd9q Lj׸GO3-?ۦU^zLvDJb./evAAB`yab\xW s~eu.<&(iV$Һ#:Aٹ-Hr˒mNx]Fp]NkW9b рHL8;qP5l(b =L a@V[6eL]B >y1k1C@]'6p즪d^oo`m{|~ɥ`:yE༙SI-kSr2!Al"!x>N#ƾOϙz]iG m0tCMnNaz m_#}k0JH8*BSgQ?`jAPA#+{?*JstL59  pn^wzӍlQF,:#rpR`]?7d!gl똻t>/7|6bO\Bzsu {3mڲg q@W\ygߨ֠ݵKNVќqijӊw9_!rbl‡9vڼB ·TكoAt. 5އ@-irQPDoDdoa7`mHtNn w0uF:7WtiҹpkViL`h(5͡Peii 7t ^BmAISlk``lUYMI5Ad Gcݱ㌙܀_( Nx o8wvuI|%'M_% Wَ5t;Pݟlٵo0k9B؂,G;%XDޞwBFSÏ<)ujΘ^x,yopO2n(k?I_9v960WOgo9Ӵ#*Sy$?\-g0C z s=T@R:A4y|Eyy[=CY0 е5}L>|i7_pQW;*G E=^4h,}.r}R`77bV @=B cw_`z݅B^xue^z *TEB^NuPز[0UcpI?kSRxVr |ZFTzӾ/FԺʦ3ZMojٳ} q C'!B82d+{\myuIcʓΡΙc'.^m]hXP}U8\As_'c9}PxpoSأZߜJJ3,uy|\Vy xuMdʭ2׍4J"}$%R8%~2/>0Ҧta.o7lT em'e9ܛq@Nm8i\}cEi:g:\̘.Sƻ2{{dMeIea"8Yج75c˻2vw:87H[:ʍDMb6Ԩ_ĥ$!_|,(E*,0\qI/|ۜA|{{>ZO)-Huq#]EQhMPVb3Y,A4z'07.⦦VHNPmEnb;"k v2c؎WXVo*{*k`F,{vҖ=&^m{$'L< cCmJbs@Xih9&;tҭ;sklr0|  Fr@` f^GP-8(读 zT/#gEؑ?cZLүBv@oꆘ@:jCDC^ȷ*0$/L=7KOUBdnky|wE' Mp`LM33=5Cuw_]ܝ !wga$'vfTؔL&cq}%+.]]*_4/WHձ7tҋL=`4{ͫ<_޺kiyߥ/[HϜ92Ud-Z<[,YJk59So:ԨwRE*.h4 zn`$r̂0!ȕ׵%o & V3⻵s;`JN7!wl~(D=z,ARnp قȕw8h$ h_>=#9Ap `J4]***f߬Zz9 f4W%cnYzCKmMw7۲jS憣}Vxs5KVR[!ny떶CWMot}NsCUI @[GokKWoX<VhU5YۡޛWY>%cpoVhnh;Իu-ݩ,'@+  e+5^ņ \2{WSR=)e3S.?V($~^:xGnS؝w~+P&#XR/?OjYԪh?7 J<;AlfLgLq rBnGD G6#lƸ#^2#p@äF{3UuUD\2B>uo)ϻyExE^VmjU%ubʵ 7KymzeWlʵ7XjS{k9 6K !]W/Xr t*PD%'`,Ϲ2]k (P* wP<\wU6╊GVń #aUuv4L :']K# c+qf 02ؗ )%:BABXVRיHשּׂSQQ"m.&Qw*d+nt |q^XyŚNjs-p8[ܼb͜憪dsC[w*t/Vt L47tKla7XSx SZ.|H=`Y^uS-o `ќK_ `qmzWmj_H'/,YJȫO0%ʔ!İd?2DzA":A^^NĪ\tqWɩ@6iҔ% 7*00DS^ &U .P{5̓J0%v~V34d9H#(kd; p3oIu2/I0Fi`L,liQ׺`w* |!347Hjy]VX}զdO@v5U32Vf_<niy`_dd\fNe$vx^ 7KP} JImmz%HKVmj$NJۡ^i2yx,^M矺dTzզvu|OCK]%F H/ ? 5ޟ| Pt}%yݩM矶GԮ6KܢS.KWoP͙ڋ%R$SK,DH$È~AȖ8.ۤb#,'&"%錛OBN`g&z}ڰ@hG ߣ󻊏ݞj+(KtOV> Q} 5U&|T3 W!PT%节09zz6-4wlA-A o A$HD1oN/οD Hef8]iǍTUUǴEԾ({`CUCP%+.oa-?K:~ɸ*'ۚܰhqKWoX]ܠhU2^刘!XΏO]0=;e?߼UUN )Ry@? -#1kS8$wpᄠ'^jY]3R冋 JRm4_! 'y@DQkz)ޢm0’xmMͩcّ2˳& D9J)w@``LbE ;qt+3v„ ee%^,QCςj\0Y5/D]{uLW/>H%6/l/r[(\~ќkR[*qȲXnt4;^} +߼(. (n(yp`@UhR/)O= iNeRcccii^SU͙?|D̿<ԋ#v͂Rwr}o~Cזkުd !KXBB!P)ywppƇ)U\s`֓+NM8P)Ciƍ:u 凜];v%4:OZ<еi<ƙəΘƘ.aMk8RL>c'MlI׊1R}Zy;X.?kNs\ukk92`Fxcޜ r#Y1,?kyUگ/tnڻ^hqrVd?(so"hX<֒tIoLw*-!x,uY~@d'GU'jBxɺS\<@%OVʵżl"hQ! EG祈'! EB.[AgOC0bxT&J^ؙ/cŏXuUƹkm6xhN[gWǁronPԫ8KPȔͲ&Nh@`f΄z\r30rOІ(~@B`P.+PjWݩ[X3U*٪ "_ m#*7MtGMfcq o+7 ѻ$#x ֵH;lؽkΝ;wj?ҭҪ2 MC$" eP S{^-uuuMM&L04WH^{k0xh]KmEgdciM]t`gsq$18tС{{wGrqz8R$RZ.GMɧ$ ij` /@QsgA`A|2 $jK,@MuW_~_/^zaIlae|k0Zrm=ѷ߽<=><>??}ǫW^v}xOo>͕p8k)}G}nsQcQh\4yR2JmZ]}"ݵ]r+ޅݼ'ir`0Fk}zc֭[olvh4 RK6%}k;v:Y}][< `4-//ml>x}pp㓓>DQ4GҵkVWWVoX]qb- Pff\(R*ZGW_[YOOO[XXW\YZZzbsu^t䅅hvrrrz.i0IäDpW\i&%?A#H4G҃߶aI]F:si輜"rR-Xf.nb"Oc9EMGd5y| 9sZԥ_Ţ|=XY d6jk.9:Ts?vEQzͺ;3}un:gQ5؜˅}㽕T VasN3o`sg*7xud|ťn#]YB\^4{lz1gsqſv&@aq0R.㾉B @"Dd>}$"HDhе[@oQODd>}$"HD @"Dd> 2cELd> [\xSO[^9\|v=\%^DkD'nj'BDwn J[tO7wEf/L-'c-f`=~Oicܹ`\Q9W­ū[Izfk{ןW_NkL-&d+53'dZs63/ZTǼM郾nU8{jO哑s@o}^Mw3k0>֮Z73UsYc+ VVyBPQý?x/~R?zRYIPu5porb}$"HD @"Dd>}$"H4:/A"~ڼG%jm:Ю@냧Ϟ]5]ȾaUDo^vJ|>}H}=EQMVN4/dfFޡ:}z3)mVgx Β=5YoakQCt(Tхjsְ{V8m*iFl=^f&~N`616z˧˜+cufawT3GoWtl3VYВۭ~f(tՙg)8{[(x{yq. Pgij@>՘=Wl%gfZh՛t:863{.V^mD:_H2@+.' 2s8aZati >[>&慂q?̎*;{98TסK{{/+wQ>̭OP@>}$"Hԡk(m2 ÁV c~2p[;mWx{@u @"Dd>}$"HD GOڮD E?/f&ݶ0?}=qö! @"DdfxSkZ~e 7pU,`>f6ff2ċ\_s2֒6Y 4`ƍhicʘ-CA]➒rE]vky{vspEaQr}e b[ wz?ٗ:i.c)5f‘}u @":zf2 ÁV}i @xȾx{@u @"Dd>}$"HD @"Dd>}$"HD @"Dd>}$"HD @"DdmWU=~*ȵۭC _O=o M&mWL+ ;_t}eZpf<$SZgʍ7 oFztWRoK.Ǽ$"HD @"D|ƥ&@UJ v&"+E@7 D-hpDd>}$"HD  GOڮ\[;|.Pd_<}*H4]Gۮ8|6h @8VRdXܰ‘}=G^d_;LWȾJz_-l7 gD}>L=TF'bo1";=>7'TQP׊$Z*t7?nY̩u`.2}s{vzxnV+oyO~uX_0C-9w<{73)gnȌwn~^%GpDd>}$:oL&~:0/x[;mW<>}$"HD JXq?zv:{Ⱦ>xyUh2m (]q.M8@"Dd>}$"3.ܛ+yM1ys7iċHw+chN\VO;<`^ȾKtdQnySUe*ȾK)u=l=sm2^_~F˒9:(vstido~uf1Ǥ ϺDd>q&]~? 흶 Hf9@"Dd8tG?h eܻ{g?I۵("*7n }{IUkk{'LJ5. Ⱦ>xyUh2m (]z9{C5|}kW~Fk9 |IF߳;P&(㸉&fEՌȸ Fɾ CF"ݢ(RJ%dX?tǘUw ~3nw\ڭLfYA.9/&nB譺^d>v=u1u5S3ǐw^\/GޛOSX[o/\wU٨Fn+EZRч[K~k_ExO n.ՂaufV=\8pu荀!R!mZR9{IzpC0 K;s޺={vpQb`nȾ i}P3S%>AQdp_g1LvCtGEHX끭흶ܻ{*B@.>@"Dd>}$"HD @AJbı"ELd>}$"HD Q̍tS}$tV}$tH4w J @"Dd>}$jfUhtZ|ܻ{g?I2-57]մ;"y{wwқ_̹2-u7}諭]{rԤurtVC3i1_ GTyHE'jцڊ6o}e+=rߴl}bmi66돞7ݏδli/^2|c~K1_95jGEb>Ԁd&V+UN3v+ޭn~t%4+z%Ƙ.p/CFMƸoǹ[\j'rw1(Ny{vmH};cv.m*q;Ani݊|b(zZ#exTO&ڨWUM<]a n+Z'JͶϛNYv8yusJwj;jҝ˚%ĝ؊o]ٗSy ǣ3=.e씴A>R&Ѐw@&D]|j0xE;mWaL9[ZBS')gKˉ~}7_@}$"HD&V @"Dd>}$"HD @"DK7/g tN団J;Dyb.\D75fϿ|n2Uygo`'+6{ͻWSU+D)5T^w߶]'E 0V endstream endobj 279 0 obj << /Type /XObject /Subtype /Image /Width 562 /Height 368 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 9759 /Filter /FlateDecode >> stream x{U}_^JjB"LRmX :v:сNU"*FbZ߄/~ȋ/ߞǞ}{?̝{wϞ}siO9ox\}5Ը>2{yțe_pQG@#D QmİE~N̸rL,hЊMx tT" 5x+ Oz\ g4Rȑӯ:8 \~ e/}}S.;]oX;`Gpvk{̒mm~1F[B ?j[it8swPMP_E~".χ\e‘) 7 YlrFC'O?x+}6"7KGiTB?2 N ) M:ޙOԐp/ o#tC^}KhbഇmV(#&p$88$ʰ%QG)Єz|:2>&GG}/bHUj p>ACJT'˨41%I+~wp7Lh맜RiMtF?6aݦ m|hREJzb%qN~RZQ:X:H"/fY&;cJ7IccEt iPJm%MIq𳎕Ĕq"}q Ŝۖj%EXWpU$%ېL0_x`!RL'<';bH+YӶЖHPP,eW]:g{[9RLHLNit#{Fw?- f_YԊ{vEӏ+1y@|Ӌ{̲زli) z"L|VY-GVj)) RR$Mһ[5/ٳ煕Fwݿ{_ [)^!&Y/Lע%.x˗E)>'Oty-cj6D ,~}rCъͧqq3K%m:JR$>:ec4d(ic4XMPZmiM6}GX?/ɤ"yWϑX4֝DZ6HYqKyŔSNz0Wa;֨ƋLnziF?L#Q[h}V1,>[MglKG_YcmIQ #/ | d1Cq,نլ/?0͊&t*&\ )c'KG}mS~ת(GEEtXv7D\t7 _bP?e}}#mO]{ߔģW K|vn7~ ML#Ȥ:Xl)EiF^Cu/[~$Rroqtr('~*Z',] o7ǿ3m{jٻoѦ'[k}8./N1wu]3xBݜSl>iV2pI~37n%QW:;VO[mZL3=eFwy_~SWj9keKad>^z,؃%{Wk΃rhO&xҗG_ 0崧=6c$ ̾&Lp;s;ݒ+@2)Q:_cO,7ؗumtb+P+m%jXRaz$9㭫vXL +b_ϑܘb2 9f R`4SnZJ%Q:bَ,{q2:ekڽr투L9{VlloxlN;t}x沏b1=V Tz{տ8wy;};Œ&u|lWeRkg\i,[Oa`ј?^YGiWMO't&9rmamX*ޤ[>1BX O8 _kMkv]NoTن&,9ӁI:`C/ujׄvQ$tHx/mJ[X-+ Iퟺd#og3}e+hg\=&GN`޵63LJg [M;龙~JD? pl1r[&}EeL(WD"3:vRoYPŖfcYa+>1UӉ)rk̀m8όaُNhRL >e>E۲*bv\ #x HU"d5J)Vz'Q]V:'+P|y[I7&_с?lXѝc~,%2DI;O֡$jMS&!&aN ^JRL&PIbZq'dЖ7HX;_1!P).[\W5KtudS\{kFEm {G1%EbRN~VK]m7I.? lNH}vEiσJ^7S캒j[ojCC&74DCԟݱzj tJgA5q&9?\|.lNl=Uo`C'=<O}r!IZ@!O Ǜ@sF;Zv|n}p=-\>N>UhHB+Ɉ $^y@0}I|D6l~['>^z=V+`%JX V8a(JsY`%M[+@WvJX +`%VJX c@ uq+`Rd`%]+uWIX +z\W}(QBb%9>LӭD a-($zJvDXVVg8`%J_bx+[>ۿ2V,}s:[)&l~JVJm%wJՋA`%Vúl^ГNܽ8[4==}/61%A`%u%Gz)B3ϼ$&-+D1=9VJ]W2UTq%2Rx'A`%Ts+Δm%2_թdPlVM6/?߂WjUWr[c`%Jiॵ-x+zRb _[Ig$4o(2+U&J1dK\"8+aZa%D`%Vv:?նSmPo\Ŭ6{1)SӇ +aZ$H Wg+*218ƻͥ'BX +JʎOJzwcU(6 fja%+afՕ<'JZQIY zJ OJATj%퀕g JX A`%J7u1l'jܤ_q RLCBLVJXэ19JC@jHa%+a%2d/#q<l4JJ[ܗh#VMnaTw ct~{;`%+AoͨM]BTlplBX +%$sR6+ѣ V%!JX)?`A`%X `%J`% V$GPX +A8%ƒ+VJX jdyJ`%X +VJ`%X +VJX V+`%JX V+a%JZi3VnaSʋ8zJRIMkRմ~XG*Xp+uU~^G*Xp+uױTRs՚%X +a%T*Vb@_Y)[>V ȸfͿM \M[ظKɹ]4&r3̋+n%1IO1K0r+n%tl[aRWٽڙ`VJ,p2~ Ό>2 5c}rD+%nbj"l.+˄TV2V8wCSN+T'vd[>5߮[)qkDW[߽m3W`V屒#ʬV铁w8~{;TCs7m;B>I0Co+%nʲzJܶX RV'<ۡX+VJXuGL`%JXu@JX +Vx)AD$ +SVJPgX VX +VJ`%JX d;$ ŞV baOfVꂕɑj1E-gRvH82SZk^+ҕ=XҞ*7>dSC+yUJ]RTc6WM:yRo{Vs +2?V5ؚ\l>1Gۡn̼>\dɦt[}gڶuθ5)J,ǿqUv-ٴ{GObX߮+%VO-Ζwe(e,ԂJ;O+e6+ [ TgFKe%T,+QW'lNSY'}O%Y)VЕQWrj7*R!V\- 93Ƒ̧X +e;oN<ޕ G/ʶRQy?וx{*񟪈/eb%Teɖ^}Z\5RE[{QOB osW l-oyJyZוUnR?[lYt~T*weޑc)~ʶDX RbbCʳ8ǂ_Ui(mq;6Ƒm^Gm.Ul?svaGeXJ1$:%Qy{1^g&[ƺn%$ IF#8bf%Zґ#[#msX+u%Ru%GXgwi6R?c6e*8rF<'V [S>V26sJϺRMZhtUN=)RJ]d,oY4J>׌܍5l+J]+%Wf%ţ9X)u%G'Xr([o Vr7&v[o%oUVr7.eՂB`\)vڵVJVJX&>BIVJX +QR+Qhc% ʋzV,{`%a8Y%&VJiC!`%X V0h_ +A BS퀕 Ɲѭ+Qhc% J~f8VD R+V]b[ZWrDVJj _qi'ddR앯(8-sf&m+YtKZg2T|d,CNg%cJmj]Q's7,HPMٝ}vP+ V"R[8M.TN>.cm-6H1:qӳP?ך +(}ILw>v?O+biS\ו˱2Ku%x>xz#m]srZ'ŔddRl^GU(q)Kg"A$.U`b’؂X_WϳmsĦ Vlf%Ddd,gRQ+lFK)b1K@z;؂SZJnAi\ Dۡ+Vaz~̧-^i{;TO#v V*D*GVJ`b"A`Ҽ`OgDuRa% mDDyGoJ}}t= 'JX VX +Vj+<JʱRg@+exf [ (`%X +VnYX V+`%JX @VzåۄfoēA(ߏ>U2X20JZ*#+*e*~ɖA/rh[Á?mCAAA)>e endstream endobj 280 0 obj << /Type /XObject /Subtype /Image /Width 510 /Height 361 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 33502 /Filter /FlateDecode >> stream x|Tǃ>E?zK,(Nn/^P(*VzMO6ިRTfܻ7w7 |~̽{ݻw=sLvFG~MV:O*FTs1Q5^eW5RRRRRo~SLDh3!AEۨ4;Q9GghOc2=Ff{HJJJJ)17},`Ç9>ǩR'O PwHx1#>,)))I~)gE-ix9wܐg-ԌW'X0&}Έ􈡩a)%jB[s &? y/ݽ6$\ľE$D@!+}9kIx2^ N;2mд0ԩR&MЇF?c1)ͅ~v>UIB?}3/Ƈ+`.eM_bSJJJe JɃV"|ߚSߑ=3MK?9GACGvYZZ\dWǪO]P_o'!/tD@oM❚39r.27_T,?|6;|3p~e;kNNMl~SlnnFޠFS3J{GQ}뼳pQnz}{֎&|;{UwèǚO~I\y{ÃۄU.\xE;]^t^ O]ȀF}^o'%u?;n-xuq>g$|#:[2.ec`]?wt2o+dߢFZ&l'ꕓ~99a&/G;Nu;.H:;9*fjJ7sAM]"(8%˷~Isy!jWrHsaXc%A\w@fk&7L/>k _ \{[.9&Ss~oN7~Gؾx2뱧C8CЭ`6} 9{ v1|7n-5ɛB&b-sөۖr{gy .mgM :͗$ů^ORW ٻ架ބcl~ϥyȏ}Fvt3-LI~Gdt6/#OhO4?⡞GO{u=aՠUoMx@&̓\~]+7r##Nɹv^=U߭zSÖs{[4?_jv|soD;:^>#^w9{RRnkvq'nV)MO L:`K:Jj*~U"{Tۺ,!$BڑW@Rlu}ζ z/ne#toyJte߯Uל~zH~:5 f5 pSؿT_-rgܼu\PC&Aܦn6bj~-AGjjN{o>Ղ  G_7v!7恍uK<:m!kTN_!O?kBg ˽M} ?!}M!vs柶[,e7&% L4+zڎ&lj`I(FOc56rMҼ''~zrdwz{N}}/v{Љ~6Y3Lu׻p1r-%U2ԷudR HcBNk;g3e5'!s,vOO=K@FE_nkF?GaYT*, ?݄S.XeK {4S_-Ɵ&Ӻ8x5#"kw2g˹;pτ˪y۔ 7 w#+W8z~'AW:Wx N9}潩X=\%߉Ep5G?p{&صnT`_>>Kv]uf0 lwۖr_ p,CJ| .-Sض#n}%#INW>XߤKJc](eJc<4y!$D'z}?Kf]Ԇܹx yUO[<^ua꫱Q=3O"ݤߙҠF^#}//8o]tUi(vÎ}dP*1QDE{l:yݛuN]Q_֌k;?bcx~& w?p8*:!^6O'A!YN-HdaG`!_& Aͬ;SC<9mlѭ27Z>))>#{?D !L2KXL}5v"}\䱦a??[I^/H'ߏL0jnsM:/ nf #q?p[=`oOS#"Psiu-AGvN9ydRFK*-I3|*_ɝlОzo#!h#ay5qF&o_n]Qv,Z<Ds^աA^fmvOuЯAosS@mZ&464JS=_Ŕ^)]ܥtR7^ۃ  ?z{O?7bu{ Uׇ[k­G;Y .;{cЩ/2BGKI {{78Tg<۳ٞsg=j^^rʗ|r'";<~?η(]#OW﹔'?.f?ZN+'" S ;reGs_tkil䎖e֢VZynYf_>ѣ<~u]=״ȟȏãԔ?PO]-{LJUJ=kc Qh%]4kYB~ MDxD-3**%UUn=)h))))Xb=jn\&/%%%%/%%%%%/%%%%%/%%%%%/%%%%%/%%%%%/%%%%%/%%%%%/%%%%%/%%%%U0wn]/U 믿ߧTsGՍΒʕ+휜܄F kڹ\B { 5\~ʯ\Em[c+wm7[V{VE}JIIsHMldeeekHvM|,v > 2 uuI~))gHz5걝E@of/W+gqEx䊭sEA@\//%%wWEa˿O)))!y]0iiiXcC A]O@?n#qRRR5v_0, ;OlH4f_ #? ,j#K=<f / #0Mi4!82]ED~G7`.7toL] F6|,q=NUKG[|?) Hp?K>P4}>< ɹm~y?#(Y{3v|xѿpF>~K~|oRMrͭ=jt-Q_g!:PU&<$ZX[࿺#`!>q:<݁,F42冑\׮)?/t680wXpo?Vn< gi6u<9F#ƓTd2i6jĞQg|TJ7F.UW2c"1n{ ?+w?/h䶥͟_ފ>YB<?'Wd>Z7c]5(ߑg)818 ] AFx&uB`n킟t]uQmVGkZ\65z8=Il~k/:GpghYoF_EϺC~/dc0_0 L].`m~/,Œ]-~}a#?@- \|=|g%x=?|Ot3P >ppa^kqv ov-v XnPO 8qXֲ6Q7Y0un|ic%>o=q"ee?? >55G{ 8WZ&RRRC~r1G`a-! 'yP c~lw5Įɏn>$/!kX >rY{E0y;rkx.asZ4_]Cx}M3˟ bv02+}tP$pWQthI6a֑ag8hxW7&o3_Դ5,i//%%~~|O{6'hWgڏƨ~}c+!5yze78K_JJa}sز%Kŋ~l̼Ϙ6muH60P 53yhZyc==u,6Y$T p[>_zgϜY|?wI! Dlcd&b~) PІ򤐞>!t<Vv>|vzag`?[8G٥%ڵٽ)S22]}zڽk/Bh(<ٵ{E˗۰~ܘ1 Ͽt"bٲGg@׵W5jvDę3g8l秧N 'nb)vzנsA9v"l"ꎀ#Y>s{%mַV4a?9!$te۷m;y1cϜ>=|ذ6l`^9{웯:.K/1}}9`+?nɢECBϝ;72h8G<ܷW>|oz0˼&Z #i?ˢ_Vr "u|$- 6߷gxcћ]|9|3gAl1cs) 'N\b w!< :cG7ggΙg @8~#!<!T/,:~(Χ/i;]' O#~`>EM~/URoBZA`C#N67m uĉϝ#יo l̡R'\Y/`@=C'?o3 W7>H  ~o&OI~))Gw[FxY-\tukծ[Vm\/bvשSfvm̎u \] Do9 :Ǐ=IÆר_@86 ~6!Wmx {/]$j' l/𣽼G 䗒wC??`Ѿkʵmj̙aa=w;ǫ̓@&MڥS'xϷn7ukܱMKO;w+P'/yY/DD8uVk$%%@Y۹5W?r0 (gXxO#G%M(7f1Fa?Ix ̂FS8?|f9y>?s4A ̞pEw?ȑ# `2}2DC'>!.~/a'@:r$f;?!>wApK=E ~-N|^w?撷tWcv<\ F{F7i =agfΟp_4hyoG6U*_߾t01??aaOwЩ}I&_ذað!C[~vDD 1|Ç O? :ܹspeAjӦgz"x8n━'O¹v:>߇w' 0`̨ǎ}8~mXPWz۷(0 )ކ >}Aǿ.} |Zد3Ϟ9ԙ[4`'REľ$q@0꫺k?sRLˌY=uW'NpG_d/o)0WXDZRy;>3ݟ;,ZzE/\2AvY| iSr͛4ys8sN]}_g{b.?֭[wvEYwæM5blNKK8֮^=bXP=ccb0I5~Kh9h.Xo*D?@~nll,޽{Yj5/]ث[ޫV`Cp֪+˕-;_0 BG1^ 0Ჸ>3<l7^*+fD(:A>%bWY@?汯swO_-[ԨZZ80g*+ԯ]g]}~)KǏqxXرcS'ݻwGEEhC`~mJBI]윜7oз ݟn;k׬ gNp<gA>7ߑ%$y m~`Lr*xyX_oץS'0{yURnZ=10Uzn97n0ض~:eTPP߰n/'VTr M4R _yW_~l6c ?K/+TT/!11&&fm]:= Xfzu@ڵ`ڭZ*vDNJ^zᅈ3s=J}.\8hW[ϝ=K 0͛9:o\#Gm`ߕfxffw+a.%N:v潸`q7 W5sf5nrAt]ݵk׭}굫W;ߵyRR*Wh;s1k`6 SQj-w؉ CvbL>p'N1@ T9qq,]pj.J-?C4؄ȏ9yMd dV-QLĹ8epJ/-F4Gm~)b&SkH͏ò|˲‚9hGf\l󔼅-W1-3[*˧hsbp:Xp9O >k1l%pmdٛYz.~v[$Pre#Sy{ h#-(i[W]E g}L Ec4YHsc09ϣ^Gvԋ$K]HI8I둿sGM.divF~4tycA}G#b+"Ϭn>:`I~>03[sxE[h>nEG/\> %5d5 }5Ud|6byf? ~!b'yUa/O e&NկI~(RRR%wձ=]HKg,GzGgC * /sd^>//%%#\}χYzX؞\W_8r8r Ve>fɧ8HKII?yLGxY`z7+# <5Gxϝ;'^Gپ\#5y%JDT'`yGgx7ʶ:?(Gɏ)j{χ_կC~+/%%U/D@V. ~~]~.z̓Gx-usx /],n '!9|W\ʼRRREM\"? pљ+y噯uYUo`;b:SU' Q,G'$Tѓ?ޣFχt6|Gg_>a_sW̋ LDZ>|Tfx 7P RRRK~[wl%ᱯc௓ yyA^ò:W¨~>{8]XᡳpYRRia|>i@~|[uNMo:!0W>j=ɯ_Vv\G'A_ϷD=:|r3ZQ|!{%UQ|x:%sPßg1 vޤE__JDx{0~W|`&2\m ~>RwF8|VO+26>W3y#=h65gmN~Sptm|W_V9K & SwN~fǘIcVi:]:_簆`G??^*-B7'{OqtG5~}N7AY:_WuPRnE~巄!if0'&g^/l65vѯ 4qyKl§YcYXGuB@~fPs_{m~Mc Rv B~hrsks }!E:3f6Sl`|V FH=B~ʌ==Ȧ. J~#*r^N(AcKwd `Q|=BH'1_ȯ\:1F~;䗒r@c9u[|m~>a*l~j_m >^SeÓ]:K)u WkΎ::ݸJF.e31G8_i û<¼]~x_{We 2>af0'dž:E3oZs&&&qM^~&f%E N~tVû:9-(χ6?scw6u=/ BQ/ m~>_sWHsy خ/w&ٷRRR.Yzk/2; d,f`)?˛|VcO,^#?3%dQ/\lIBxbeȿs))B$frN _bq4ů.H~=|T:û_8R]|ͼm|x;~ɋf$y{ B6fՓ0S<!9|p*4Q-9l, أ =ANtKKIIEzG60 D7xN~WmA[Bi#\@_0կ+/%%6#3W#sû?QTw4W|u8Ypq.>=L^a}.$Fuϣq޺ސûBx`p>#:GX]X(Q?O>RRRI~G9թXff`~թ\j3?NG~~{_gc=/̈䗒rCˬkhS<|B~3>?~`P'm`>&[ B:SH&/%%UK^̧YcEXۈ fa>G/Le>ll47Izf|½321T[[cj\Qt(5TML3HStخ^~)v֣\|a , .UDH)ҋGti~HI3.EUZW ,q;yVEno')|"aI4ɯ#n\ B~%%% ס(}c7ѹTg-MѸyE ߞfjQ]aM~A.2Y`3qy_slʆ:Ǩ\L^-`o5yYM_Yy ?FΒ ~IA`wTM~1|Qß`N!u5Dl&M3|@gɏײַNBstesj]]4 ]J5_YM#9_%<`a6#Ś{Q~aJ wb YN-{_VTw_ҹS7Rs?2)_v͈wy/8cߑ1?<홵󳌝8/e|~~5] l@2ݥ%o?ߑ\Prh<(P>^w0״n8xl~V7^ȅx?R!?0J!*s;"S6q9/Ls?s U;|uN; q4j=:#:7xe-c.O_H״ՀA^k߅q^&Y~͐| f?~290A%JII y1Sk CztJ<5=B`zM.5>8 #Xɕ柔$AoqW|>H$?!7h(ԓEkR=|0?"|N>o' (x<'g&l`g>7G0#$kc~ >,S_JJm=SG& ɯ~Tt[ϧ\A^F~fԝ__JJ c{h>μ]lwr6z.om~/r4b%ܐQf,cEw`m~ bMe)],[5K%rIKIIHTٙ\i6 @H~a. ,9zM.\2ƑYoWlss[#|lWgWv6HwdTk<l0d0[ϖaoA"qOz*qp-KCФ o$ (̂_-G8|$%%%݊QHuۓtͫ7~&$5Y0p<2o"N~q.t; aOyNyr盯`r{+ hDv|WqYjftǩk Sbq=DV/Nb*Wآgg5ؤgLOt:iUStӦS&[ I(Wp3鑴z&Qb=gXɏ}|fC/7y1P2;3@lff.Toﳀwe~~EoՅOڏU ֭[jʍ7Xׯp\Ӣ4~m?`-!?D:u'R35ɯQ?Vt~uƌ ޞ|Hc|7ۥe" >M8<صnZA1| 7:Gx]/M' 6?!_ևx{f?qp?%[~h_YMl~ b+5\E`{ ?Ѱw%\:q#6?gaNz{\#I$dgweB~/Ÿz{2&'cC-.>~Y>ڇ.@q0 "̧aC? Mv&//A)d-OP7]. Qod~7o1G%'8‹'J>W,?fS kmu N?#KGF;|s E痒w!cP7\?Yzq^}C>\ mA>D)_MP/tJl?C9FO?-3K |W_# i! *8㶔$ G?BΛ4'sQl%6bLB t3뛻ڏ: _6Ջ*^ b~agׄ?<:lח#syI%C2ͯ?[X \; e.h/=ڇ~JvP?jh::.}D &pq9K|0 R_JoH~jwÑG֒^KzgR)@~h۱R?v}j[??z]M:2Dz.kZ}5<8,H|))I~~lQ<}tY{d.}>})|W 80!* ؜8 &` ge룞D :69@~$%%o$/o?1؞ُ~jUYg9y ?$>G}^= #}MNgG3t8~$HIIO-ho3 %%$'bӀ1ԤA57ӹi[}:4P[y?}Rٟu!95-ȯ6o>OI`!#$܍ɑߴZbݵԺ{u7vY޳ܺwE=A{W&Ѿؿo[[P+ ߶|j$_pk;V%Xeyoњvݫ-א.lMk,t=kiM*%F_NIKB~~g//%%v?2? *['UN; k ~&.{ ` _oύ? #'VV${ -[3Zf4"6??,ɳQ)O?}6oG,5J,W jgg<֌h͠8[g|AgQg1PG`{p'g*!; g}MK_JJʭGxG_#A`ϟtoJ=/2{b_F#u;Q͘4}Z PXtA^; & (ʠ/͙4Bxȳh}I~)))%y|eKX=[ Xm?>h d̷5sO< ?^oKo1i%4>a-m]@sDjp8U SHq ƈY@2[h;cz++uho/zod"%%UhdZ¿0}Pn)`C08ϟ} "^@lS(🊖?{ 94؃?m2L1B乀<,&Z&͟;:ׄg#i kwCJ^shE:u-POo-(4Q|)SR166O[J/ڛږ*mr)(bOmN]@PۺP-2#O<`MJ5l~FN̿~ w\%7 [r-- ߿p% % g i'ϡC>o*) R/ muѭia-&5H܈J.@XY O#+C|%ބY;2{n߾]l~I~I~"|7)|Ҕ)XoVdi2XI髭a-'6LOҀt;PLP`om2f aA"M=.|j/_},v.e;yi>8lN:GRs4ib- 0Oj5S9>y ;Z.J?l:66wn -)SK4^ t^YnbJڤwmbga=!ZwMwW[i-~;r7{<gh݅6Vw6b uyx: 5yfhE1)CRi":fvL,QIl)))"趸ޥ}D@N'2IDI |X4lR`${& )4a${__:>+~W|`x% %-oSa6 Ji8Rh ꑕ#+%"5ѨʖQU,@m] |eV32LFL(4_\%ktےmᣤMkP/kiEHh-eV ,kX&Ci#e<lH]bWRp5U34 4UhtѕFUN$8RQxKq${_툣 @+] Uz~4QM(iG4t 摕i@/?6ljRdd0Nmp8ŀpYF>;l`]KD3W[̀vH"";8_5О_iDWT4B q~JsI~)))w#lG<'žW<. q?v&,`"Ay ?(MȊf#0UH8\k)铂\v @x;tv佦724 ި8G+bnt#y?tW ~ y\_JJȟtt{t1~ePPe)|]<c#d" рvA1>6Mkd_4&8)øi><6K+air1UFa7l%ꓨD8T9s@-]##**TF{XBPUxO_HKII"Zy^,@ɟY cP 6"@)t͉S$VO_3qD8bBĉ6@^"5m 9%쪁x^\ye6"]+R{۾b<tɡRhhb>(fw3䗒r7oώޏFzSC6+]VDkS%Ҿ cD^OR-!:hu&ۡ6\+5Y4$܄҉L$;4DpL(BlWO|t =XGUm{~=tSA0oc{G 6;z>=`&{^ E;w|( %ܜ0^Bp PUCfbHu?t `mr@ކ>m&Wwx6{m a?}8oO!ㄜkc *=ђ~A)J=%<,dGdQ>LA#q P9lޡr ?P'a\*Bઈx[;!;lTWڴ_`m2)U~pqU֯ḅ"a0;6}8`Q>c*=o=~wM@<LZilm{lQ?"zFR  ]vAٞbG?n|ѕTǏ2W|{ƒ6䥱T56(Eܘk[nA'>h 3VXĶZ}yQ~ޗ{l~)I~I~'ɿrґ<G ?l e#16_P,_؆q_ل*R&Q,.<`K6`w`?{^(czšUo r'gp^ۜ9Q ޑIï<ȟ!I~))I~7#KJ_ yX ^ \`{(Ljߓ@ؐZ#+GU]+Ŏ&ЦXڈ59r?aQ Y1.嫭CĢ=?yQ>{JH?H_ZFyez3/@ W_x)[ut?Zf 7~MgoR ^ͩ/5T$ 3K]9Q j ߋfQ܃@2"P6:= 3>fdE hmv}'a8GJ1'R.$=^q握8 ʼnf9<9-Q~Է_6<_{_|ϗ3FHbu┄F~)] Fnޅ~O1plq\OB}U&Te"=y#_&?5@T@E1h21O$|Q̘1 +^>f7Q'ǰplK%1T#l R^D4Va>%ɘϘѤO)S󌤍A /Z{FxEК<y]!4KQBq_,KfOnB~D\AH~~"? tg9ɋ.]f"FFUPd@Ȁ*UAQUA96b@I3ROcLj;"vJsE[Lv *'C)"v2nr{lS.a m;il(Q ؆:6BńdY,i369cŌ5Fps{#y8=E1c[D:rX3_m_wB첂m~/FSl/ISߘTt#w#ՒfJH5ŧRSM8mGҋTHeNLJCDlډ_lW2؄@i"폒m&:HEI7[hjȖԘփ>$J>/?4Kd[Ȟ[RlM=Gنu_QF;3ڑ;ulW]Yvgv3&61_vqۈ눴:wXX~~g?u7ŸfW?T<#w?8%W]Ͻz *|r;S4Kyv$;8 %$v뚪C$*&o 'UMo,\JUJqdS)JvNCR H)HH @Ҳ(mkzfgfgf]静,>_ΐ\6YW/_:{eb^\߷2N{Wie} ^錱1Z e6_>"okʷ-}scC?c65r3,%HEkw|>*_>'rG˽\[0$Rvڧ2ݶ͛7oyw6ۺ@R̐~Z=%ϟt[eVݙL˓'}cuU>NgbH7i Ee:vC=*SI^Jݷ1[GF׹$h~I,9?yܾe+z7!*_:vN!O>1d#I:l 4̙xϨY>Ԡ?6 hb=݀>la>UΙd|?`8Ǟͫ_9^[{jE0C;OoOrɓJ5AíZ[pQ=gz5?#uOGwxU)?e~Or&GPo~|tro[ &ݓFUSt(H>.V\cہ;3; 3oKA>΄>5|<_b>pa)~cNFU EVHO<7ҙ *+*HhPu\X!'s.A;9?œts}b~edBzw+||ei^?6@aS̟6AJ`S퓲y<1@h y0T*\hcpzfΜtم\!ߞò)S]w39A]T= uţo^?Kš;c` 1?y[z{ў̎fGXG@tweA;܌tTAa))w05)hy<ĭ>݀= 7C]ƞ-FpŶ,o m~ f1kўiI=lzA`ٰw;1Eޝt.3W~`XÄ ?Hp0n>x}hhd,j/*;o X32{Ȳ. 1gahyFXt;&n0AM-f@Rfi2Lԇ Ÿ9R>GduxτOb:do~?];CPr+B<۳4 -/p9GZ>{DtJ%*3At} ?>,M a=Lp׈y뤲0) vy~`n>lO _ ɫ~h: MbW4[z)5CtXiu$w"tGsAʿ}׹ۃ[ Ohma~=Ȍjt&z_ }~%u-Iɖ)q& څ6t]mh˔92y4o)>>xϒ Q?Ϗ6#7&sfAO+Ej2^:tikPv+yO?z@JȒg11-.r;9!t9$GyvО  eׯѻG6[6.7' *ɑҴ\-ZFG,]a(-.!y$;2yXf!=7D}>]Ï(OԸI ]9™ؘkY,U"*-ʝ],C9o 'Jq/>#>zՏ C—.,zg+EbFC_@b!z᱇??йGY]r/J_E3MVWD\OrTwoqŕ^?O~]ʋO_ŗ!~CZ^z-wo(Ͼs,u{<_z^~?Fח~{r/%$|?KVy5_t+/~%qw˽gn'+I`'_|,/I/nsQr}gqܸq|k={>_*wV~Ml{}|/= _CCGeTg/e h~|("}(kkk\w) ekk˶ _S}/a _ud{""_16=eyP_,uq:q3D0Io4Q6E;0>/̽AN;ԧR_ u+!z"zVM+ޱnH_`0P毘#[n^лm_F_ /5=CLu_yWҍJk({Xy1~h:adGj9qwCǹ{7<-GI8R:JYs /R p3s>Y zja~=v{ٞS^q/a~%c\uGFOzvbisS!GHd}t淍3rqGxmO9V;f{R<)""|Gh{_q3_譬ϢR6ܞEzǷbf4tYC' +y9'—/#nHZYWM+ԇ{s*/^~Ë=+A{p62^M*ei_z^{?;|4,ۢz✎{ cE\Wc0?}4wwl׵߮]9 _{>_.ߌ*\L0?0ͯ'p؋m }ss>_@+2jߖɑo?ㆩ'jubNKD_oW^K~^wQ*mYw8JE0?]’oY-iopoXʝess/IKR"bo{Av·!EToH9&|"y+5~e e~'KwToV¢^z!|ϻ.(t h~%Lg9|=9]nT=["K0?Wf/=e9=s;Kwrm7O_Q9zFde0^m9=/ = -Guy]^f}Op)TwYt> ˗ύE"(7^Ah\k~lK ;js\pRNSy%'c7-i8@ř?J]?d"o3R'M|vLv?/]*({PO~+%9Q3n/#{X2a~P˿2NI8&+n'&K4J2MW]ެzoݏ 禷;uߵ}"m7-wMʛ?y{{|.\8_wߺwu#$n[}1q3cgd.6gGNݻ+=A_Pȶ"_? /b?ͅ _ؗg/adL}XŻgD~H`~Y:im{6[hE/{W=f{K9g{Q_~=Lqܸw"֭L._ob~`>#/FEMچ'Ėuwv#>mlAc3T=߯;@k(74H ҩ>\ʠ+mWp̿R~@e0No<(;60?Cmlv  C/=Zd{q{3tϣ:!ƗxRϗxFFGz$2\wEKfX$1u&88/kEG.0}y,ֿ19;,ݢz9A_3,hTb͟8=HF9ٙ?3f̿pKj~9߸Lu'ݞ0<\ߵ v ?o4tT-`~_'0|}1-+O|&q F?r]R>)&`~P^GF׹$hIP?y~h~=ϯ]6wyc"2~B;' ۾Gg{C rF%8f2b~ _c'R?^=w>)4oa9'>gR4I'xG1_u>`@FFzx0kH̟}h`s5F}ۣʖid_ro_O~eG%oK\ 7qW50a~Ho:c?`~0?wE/Wlf7x@aN(((((.`̏`~0?zSCU/';/6?$o:7a#oM6a;xg0? a~_?w,I5jlO}oL2o!R?ٿ@e~0?4rG3ԕҢW k~9c{ JcZ9WsejqNȕ4;wzA6߂k@> -%2g>, {~5Eԣ|b~c$T&yc~ۻ+q>~(l>@͟,i)=?Wl2F>ٞ ?Y&bٞH(As{y~cԝ/-u1Oo!Fxa~0poxvhOp%ya~+`0?Cza~U5?WAbWҊɲ_|a~ [QeG 0? `~0?C/?qO|P&W뿠 +)rƃT`^ ;=x&4LN3)Ͳm(3HcB?:]QPPPP;CC endstream endobj 322 0 obj << /Length 2302 /Filter /FlateDecode >> stream xXYs8~` i<Ǔr|dq&v_2Z-P#o7(S/4}k0bo'[+@X{3c+x̬\r&ݪLfe7f1r$wirf0!d9"Ui*o&ukKb撹Qug[FmVS"+a}U!m/& @U'C{յ*= "UpI::mq t}/Fծ^# 0haL?^#{~lUY+0Z߷s Q$2CjZx5 TDmj7?Ϝ PkyVYX5QitVyVFH"YQMp7H?@'m=:k[:Bi~{A Y/W*$|vڂ'Oa{b =>]I ayHgvL-ّśS_pjހ7ʇc" ,O..otۯ,{yBίwo3huV˷R7--4)(,('\/OpdQ[~ ts 2Xf#Qn,q kq2Ξ$V4 g;8@b'/*/&La߅*Hٯ/>i.+tz4y*'er0To s7W9.~%O]cuE)]ByC@y-i_4&7TVY{9 jpBjnypO0&VLzSw2rc/p׋3|3r$GNio.nGƸ~&~hWLɃ\OߵJ:;$)NH mt+&0^7U2%k2"ʝhG~=fLa2e;kp B.vwڮ.! a(܏h,HPE"G/ YmBP8A,*5/k~2; cPw#~ {`0߮&-FX]rP{ּm!{J<ܧ[aA8U+Bi~[HjanNkuj,ڴVYěCeIҵ"2̳:PǩC$!G .8ѕ"߿yw,$Ef*&4~/20,yl& GC&cji^)1PFiK@0|!/eY*kI2/_S84A9QD }b6KLz: Z?,, hF;4d12{_yca*RrA^,cl xj†Ȟ}AS 8%`*G  ECy !DI(:g萄Ϥg%'`$q}*(ԛFc>dֳ9jU hbl` ~@*=@ rd^FMn&0dX~XO|]/ +>f-@; ]QK3+/DG(K| l6+ W$]cCLLw<ҬFI@~}YŇwKs%ssTUؼMΌQt]OS+a"9&ZQ8*<[Ag3s[@F6;y„{BΕ!5 56Ҹ,IЇnB&fVE,i՞ Ky0mCU`PD{[/U8 endstream endobj 328 0 obj << /Length 3202 /Filter /FlateDecode >> stream xڭks6{~>ҙƋc;{ʵ3iCS)E$U7o ]{䳻}x{?,-3!B e͖W7Gs*Β6y{G34hHxIQTif>|zy|q4y6\@yǯhVU6i\)@p{4}8N˛[iG'CF2>K[4It7?7pH5R {V+ac0gCmU'%~h2#="b{n>͕B+}kv*"/D$nڴS^mIfXx~>*E+a.r$!%+d` 8Ǽ?~/`"` '}Êu ޝ~LUg5@gg1 KΔ罪IyGW#/6ʆ^?RUI[=Ҹ@[;6vYx) U ̺/4oG}vy m3sFg@MQVS p'-P8(TאUR~ I :crIpɴPͮ@wI`A=lٶ!<<:Aو0^VvGe)+鹠 (uhh=fq$a]8yj}ݝ)Ac HHJ@6ڂ~S = ﶍܥ gK#Ư[ŕڊ|,WCndrDܗ=E|`;tsJttwHx+u3FF@E11u2p-7v>}W;.CP7ƚ-'?h8[ܒ^ (|< ֌ј7 Of$+$*4nDm7Lem\ 4sE5zQ559J\HP ~+߸5f\ 5:^OZ@$M1Яe$OWg]hP2-46!)\kR-mt~?v*j6ICe(AXPLe0 .6!Jmit VcJoWK'1S\OI5I}с$,!HN' i+&@X&W{[ = ݁_s>\jh(F"d\qu<9;YqqB@)zKMڶowUIwq< dzY,S24@YL)R Hbo'{~wgRC]0;tJSb)vMm#O(SHrutI"+ŕG3?LJ/^c@8u7 iIkGqV=u[Z9I {wY &vnT9)MZWCeVV bM~T$TS'8(1o\>xGu嫿^"R=8/ ^B] كٺOыͫqc) Dr Ơ!z:`Q$K;3鈅CIA9ZWhG ͒EL ckni7Xgr}ާ%&-(0,hoD^U,OC'ȻѕxЈ` JQU s 8$8V:,8%d^}Y=s~ m@"ME*[G~!I֟dY,䋰 @B=M/cs[s|Q>j$i~x?/guğoD{m3g_6S*'vCk򯴚3@)l勰]>-05ER`=K_{*Rhm"SYmvqС>c &}[{Թ=mvf wv^^e>!WDsو ]1Ϳ!tnV2} GW%fwe%y1"ql1㮁9`I*PY}LB7ǡVQg)U]>.!Umag۴klyfNJAQ;2Sa@ΘRB;6Qq#U.=ɰ]Kf@J E5TCrZ?3{t \/PEt`5tiEcf=?|Oe?٤* endstream endobj 333 0 obj << /Length 2051 /Filter /FlateDecode >> stream xXoF_! ΗHl{v7;Wmy 'K^}$KG(WP3 ɽ;{8;y'[3C/ u-W/*m”'-Z' 2&Us2R@]&bZL~fE%fuuWu!IZI^@UxUgHvuIO|̄bNEU,I=;q/fJ Y0ruSbU1PU"Q[?֎=.- ;nظfKYWw0~ʂqDD"4xLEڿju(}<֠q%iH]49lfÊ(Vٮ(vKp[l=PC9`¥2f"#|y== 2D^'Lz߸% b2n<Ŵ aTxOS',VJ\ОOm?c(dq|y>\gZ-W9ytBfhy0;saa$ Xε_AP &•I1qt1+|SMc)iyc0hC{7{D0Vs2h!4Ezoɭ: ~2o H{q R\HU#OA"Bk6 lz)!!}X̯dǩ€=R>hs} 5̌$;SMpms:?'!_0|ϸD(❢i3[^]O4Sb!>z66!(hqEE|6JU4 F*/m "oi"/{~J@[Ͷ<ÉɃ< ^*bI-JL!ʅַ`%EEuZ89\MۀZ$x(SnP$=v4thwxo -{܃@-C>_C>9 ENHHaNEDZ2<7DxlJ˫<&?vHꕩUM/7M->&yٚ;L8&-/f][ 5{wlx1Ll6ac5?N3Eok|A~ߝ߰,7xwLr|HrqppC#*5|ܺY~ډ  o?i Q.MAD " 9?QQӀ$ 3 8?S#"/ݗq )p$*z #gKMݼY161K䓛ZO۪:=Ȝxk.5vey$[b<Ȯg.|/-M@es}P{zR93-AL‡)N%;}U7#3*!Q|YxO%`q{^[m]_ǮӘ}ћV9/dukH W4.opkP+{rnj(iPG|`1gMAN2qRR e$@< LwŐ)n|ȡH%:N'CmXVU8iQ0 (&#dta[+XRKEg<`( %Ho.k-HI(Rj8ͽ'YخrѴH_崩)3+:mҟ]ףF]0_J$> BŪ۶儥ۺLY _ 7vF73@X T6uJ4Qo>c%g-X$G {gMAFSǘ&l޴yЂsOY۴i |:psX*Q)6 } Oqy /zI/~i8x endstream endobj 361 0 obj << /Length1 1417 /Length2 6743 /Length3 0 /Length 7707 /Filter /FlateDecode >> stream xڍtT]6H7J %H΀ !-] 1tIHt " )% 4>k}ߺ׺>{s]765 *Dx@@Q4x@~|66 ˍϦuq!qZn}[*Pv@X$$ @.YKw5@D@]dN^.0[;6Z8  !)G bZ젎;B,m$Ey $kʋt ZPW;k`#dl;6a:0zᆰn7h+ԝ?`?n_g.WB0dKd!l608.‹Dq,ֿpWm% niu ݹ%@^J`y;_B\`N(W^W׈|ܞZE\' sBn݋:  nN|TI/ȭ >[(  *  ~]-ݡ?A 5 XAmaWuCmطo=LoeD }|:Z\&;&-x<@xe4,aJ$@O"_xg-5-k(ܾ@gN1Wݐ;;-apuC @y+CD+[wL ey+)-C<0Wui C@5_?ح ?[BAou-/ ..^W|k AJz0Dݦn ]' c dm dD|[>?ځ7]n{[P'?5<tV%E:dmU?!K1N7 .'RIrǒӌ[ p>$h6^\i6*ؒĀGϣ#sрޢ̖&LGvѩYLĪSף<ѺQ&lV_Q< _LA> /Ee*_)˕q10+u縷lB79'&D!p1=#^inQ5]><'&<16bwTG%ug۠Kk~+s\lڠǠUel31[8XG[ uGyx)zB*g>v1IC;&E9;qBPbe lK ǫGl>[BHKJ>b2ZiUMH?=s7>c2N= 0?P,>TWrr|D>JT\:V3km.).0%M_[{˒CeY/_5E LQ{l|)g=,Qy~ p&%qMY+ۼ ,`phDuIaG%ڈ+qԇQc6r~:}(^%4*HQw' | CMHߦFr-e\7IӜ9PL5wl%VU?籩rLN ūml*"PnlG<]EEՏ#k0V(7&nb3 9˭e7@^25gAŞےH%f]Tvy[\:/ 'svY]>*Zcʼ@eRdE*%7z"V{Ŏ,f)yVVգ=VOI*j%eW6{Ν!6Xo^s.')#j9oCZrt_(dmdb曏v!lԉvMSK1,X !%ZuV3?Ssڼ݁6WZ=-uPƨO♜+p~S/Nոz=v-^Ln40ދ%-s99"fJ*i/6jY`:fRL-XhGpS~ʋ1ʙ](.ɊƁw8.鸠'?hݖjگ=43Vi@i68;NHepNHLt= =ũ 9d˛ǯ"ǎb}h& L5 SoߥDZQKwH9#E<6z4{K 7~Q渱}hM[ QFE"5eAĪ )I<MEp3=_{F=)-np\ØZrQF! ztñhU1wL~9-*C$EGe?[R1g (Do4~<#S~6x1VQ>cf :ݽ|=uN6_rqr0ǪX4=7(T5mau\^G4X/4y&+ e8z5+5w*lf*R;<Y5~*p6-܊8w|'Tuhu 4o_f2ޜ6ً窞PUpcK- E_胃wi8v h ±=;">Fd87('(igf^@LNH!h믚i{)ݗ 8e7 3yژV&uaD+<* RuqHEX<2k*v5s^Eb^TAQpiv C𲜂u=Yћ{}4EBN+; {9ltt#Wӳ/Dt \bO^:{ao[}#rDcR(<#ܚS2H LVW+|I=ḱ=!v?H5yuڳJ hBvr{H+nKazL 97:HcrUnt xw(e 2qbRɵ'N Q>E`3-oD]im&NEcMё;`R@Id#l옊 ijb! /zmV_|oDWO 4ߒrٶ Y1zVH84ѱGDΟ~hR-ASaFpi=#qQ(}T&Sbz ԔhQ&Kpl̉ ƐZ]6HBft#F[\眦Az&¿e7/W>u y ލRz<ˡx7['fU,'RbAG ;HU-#n;5h4IIdpn"Y6vKI -mNr^pM )|S/㪃8S]ߝqcl}z{90tOxZj%emUυlOY%Gnur1_}j( ꁦ=PIb}ΛBfqk,m̪ViEgOq&z~SH zr 9qb|i!\eAؽO1J 4 yą}י+F!Ȗ%w,5jRxR{DJ5(uqD|:~6 p=+j̙&LzT8. FF,ec]3̆' a%3~V[xJ2dXG*7ASuV+TΞxkZ@:+p+$weG2Fgگe⩱6!,1~0T1"'ǖcgi8H| * [hQ1^~^,P|O)]`.Y`jR_hAN8X1nh!d*Ph9"5tІdL ]D2ZFuگp?<#InG >#%N)׺XM ^шq4mzZ/)-Җ Nb5+hG e7 g\6Ӵ T>FD#<)e wU .Tϟ0N&3+4a#pe ϔzF=0`qFR,>QkA_;;"#/JEuxy'NV2SW#Qx>m0p5L-^,G,Mwia2Ě4xxĭ̓H4ܹ3Wta/T $ J۵#֑2a5>5 iz;‰r:/dKy[_B{NJ=+/ϱlGQj0Cq&*|7kCTj4MDX5vX\-}1uT͞/rMӓqޓ wTxX:M8üejFB<)( Ϊ%}g߷/^0-`# ]GOz_Yzq~GVb02mY[Ky}" !2q? ߓޚ2~i dͪ+:BHnԑ`=v73z̺x;N5F׺4­;a9]NX D tĚj=yq2CCV{D(5zwEOJ[}Yi2Rh6BN!ׄ ma> J^LL0 ٽ}^o+af%g$1? ?H0'5D'gA>Hˆ4.p\l4}Z 6GnӼțAfv,p]^޳SmHw,PG"Y>)Bdmp+hv .HY+`g0 cǶ{CvW?TmO>2k[N*3U8;8|_f~.|˷8o#7x8(&!A |;}X:;S:!SB@;l؊u7o]` u!Gh$<;53}CCG\rwAqH'7ûk];20r>:G}nDfQKG 3n7|%eAR[s3GԖbd<} :&,KO1NB6< }?gEL0~n`jp_#wåҴ=`0_PNEm GƑ2۪-fVl(xY@\!?w坡${}rt~<^VBAo.&hoQib]?!s endstream endobj 363 0 obj << /Length1 1711 /Length2 11687 /Length3 0 /Length 12781 /Filter /FlateDecode >> stream xڍP 6 Ak 'Hpr{kfާi[ݽޡPdd!`WVvA;F9 Ct}I]_*0@dgp qHm,*EB#qrv}G9C@Os]ÁM \ [: yxx\X!V WkQ2@4V_ Mxۘ.&n` 35:@SA8X9o?ـ4C`/x' - ] @w=g@:Z;8Q#n^Yl!qp]]POdz^l7 Yڀ-,(͑MlR*BGfr𰳳@N5A*9qXAWg7ϿP8863 b_6Y@^l1;U}}=KRR ap88x|~G hwU[BzNI{AK: ?nny47xz?zߌus}./UJB-N `+'BqKǢۀAj? ;ѽn:@!e?@ggk_u-@N1 q}58Q^^M`/cl /x_|uk/ `/yE^֯w?WͿkk/Ed r_c; r|=7ג,s7g+uz# 2GY VK{M2,9wc &3Te~p-<ҋ#C-LsR֚h1׆8E08Yp"Q7@L¢%hݥHƏ{/Y7P2:_ūX:mX&,kYrx&BMػ9r-Nn"j"}BRkiZϊo|Fo,dE|^OS!W#t.aP¥0p1Tґ!Y&VRd|{"LЃ`!>=bMD(s0@[w3˟ 8- l N`f\3OFc%`% -mWWu~TO7jfj? G 񃦰L:w\9~3+pQ?>B ;~owJA2= 1TlE H#J>h658Xf.Y HI[tC10avuy )MB)VX'AAb>dXVI@JN.rĵU׻K?&C([9=4V2_缘(eY7G<yPPee%uw9B4(` 8NG ŵ.{%fQv{Vh$sB$5e}f*PB$p cȲA0U-Gۣ%&a2"22Ƥ16}omTmo[ԾQ/Z8?|L_X=pwW|n9%V=.eQQUˋ,mb-Ĩ)xOH{`?]c3ޭH!FeTږPNKW 245R <^k' :_d>a[..4|Oր)P[&j9Z%)=d-rv)57]Wکdޯ)]4LWvl0v8# R0\MI݇n5]-לӟbE}/uHicjg'7re"[%8 V]md m-_=v gW8Cg<*Eɢdア-p3_:\BPaDfvz 'ϯgRD=KFUDiA\@酧F*{K۞wm'zh޻tY}b+F5t&avݝ'a ]l-Pܾd|[SJF9.@7!̪є^w pKt筢|9mQZgbrF` a3RPYeڶr_sep) <=+RNT TZ6XW6 l?mĔLG_&k1 :E{NKVci,a7{%X 0?\mPTּ3o_4kIڈ^NJX@R+72`I#Tު pxDp/8b YfFCKو/V{׋w8SZ W͸wP]jTW!ߚȟEtp%SbIUv ZDED@9E\S,t^?JsbtHk|!8E)'6'ٻ$KyhpRV3(`3E{~Ooly`KU5t1*@4[ո݆]?|&[ =#D*i('Q| o ^^(k+Jy;Ak3%(s?MA"a욛`;r\H@VI2ר2/an];D"V {}vїB]wO2d%}XM*NϡN{ӊgL uFM;Y^ʎyF]Y1niv6 dG1RT/406rzn!56'LK@>D}a^I IEKCsҢ8nEZjT2#nQ`,l⑊ 5=ON2)N>f̹l1Ipu{U*^Hk疦7 zYj7M/GH_w GxIglI}]ܲZ܍k2.aab; ؕg[r5_>1=-*}-J4w4/-דŶe3+#M2qoO$rWI]Q)0I *6>5/ОUeɭw/NH;r*2C) O\BsNIxdƼ~O8_p(5|JK |*Du/mB27OL[eZZ[ 䍏2J+4ݔ5XJsh}<䞈37u"U:fx8 B?lDBwPQrQUoq+{3n܍bBh\pG4hix /MQY*#euXbIO~v8Z\QpqJ[q&oJkᵶ£W7}hz~2}fԲЌ@p_6"l傸DPޔ<:?5U@8kyܒ"H&|Y%p$.q.f z UˏIpyg8UCeRit\Ď%ު&g%!.+ǣ )MmcO+KJq(fNxF$;uu}"Sp]gּ2A21je_ҨZ*han={T4Y}qL7>ܚ ٕP4OQ׸-@s[Яcdzj 7*Uz)\%U{}p19)%8!l)}R 4$u|)D j`(?hM> ølsciqOJA&,x8w=#f@*iyԼܮ XUf ( g RN @V4l 4/d$>lDTz(V`ȾLH i-CHu2:' FC )pO .W7e.i镃ǃbyfQ2;dKq j|{wMGJR2DsŤސstGSuvENfm86+ޭk#?s`' Ֆ B<diOYC#~t GB@VD3Oij ].X9 )yz 96WP0A1t|U^S.&cՎ邑0mKhwWUk7iKioFH_c!ÿ!$W#bk? RG궄Bg#3Fd-,E^}$n׮WZc3c ^1C^BI]6XQTeri٘)3xCMyvؠz4i]LDoHIQ7Voj@ą<<+n8)yGs)Cr2 ݌j- }T"4N/%.baД1R1,J gsVҨ4%va[ujq̿cKV>:/As%%[h$;+/ a-'Q @4#ΐTQKlVR"tcsp= Q,^`cK3If%:4eW萑3tz~p?pw#:.xûJ\7 9(tY/ϩ=\Rɟ;t'Z2W<|Ȯah=~G_Zt3ߑVqs]7jXÆ]B9;[O0:ŽW>{l-&Ε@y>:UrhjN{-3u TR+t,%/HVxvb~C=AnCM6(zn%PpFH<=eHe$DU,y}潸q;Sם eHU (lլk'_>N{R^#uw^'A?_\<3niSWHplub0E;mVQ=80O[76UFr#^O=L_`Elي  VQb⡌\n/, *W fG}-Y h9c78p׶8d,na4(;BI-#*ZRY㗬0?[4Z]lӴÙy}h) & t)a(x{Toq -ٞn5Q6S>Pٝ}i>p ?xi}oyLqmmo.o XA}(HR%5T9*d&mOk.=&7_5FC?r[0H%HYDo-Sx@Q~A!P0qI7-MydrĦ9([>RqJ"J+4ZZ6vF߻~34tK3% ieF-c=!{K fL(sW& 'uDXRq8%Ay]<=Ӭ7~_/;$7yɠ=̜}Sv StNHsCjH9 '}@{# "5H# CڭaJE95 HtZ}kP?ZvVwYrWIg6IyE{sK5ieWͪC"74-|O$ >Fh?n#MdO3Q+j<8C^kP o - |{%&vY7 cd< jdOQ;L<{{NIy+.rAnȲ*uʞH?'߹zQ[63j$N# UG@Us6u~=4W\tU:LLhx#UecmnBP8b}* T~C('Dk3a 9_oD1*dfg]:~+h8BT; ^ gAYNyJqH\߰t|5HYܘ Tcܤ1̵~0DBJMAik5s{7@L]>{D}L5a fvH4tᡲ0Ne\VȼOOKNQqrRuSq*ci amk.U@]}DZǩHj6R3Nk8k#۠}L9o&,tRr&7Rq7a!()]yR|iGÃ!tWPq5Mf Ƭ6a_J8^]R=ᄰsl6[+(۫OD oϮ'VߵH, 9g @ <^C%Oͣho Ѫ!;s*6xbv R iaR%22J4SU"I[O,u>z!)}"SiQd 1.#cnҸ!0Iīm˹} vx,}7 L@W~o_/9ގg?:Jz#FQpߤ?\jtLpDILVL6_&EE[Uy=@1nqP&%a;fʡAG*ig›a11d(r$̃SV 'Q^'8!f*2[ }V7` !"m'Ep;n[Dtewv/!N֢‡Jlۣ1s0DP;YfDFLk; \li0 #9 'ԆSC}(JWN;0i}Y$GgL;>O.Fcd)uoktuM>M ">g TV zXtsDa\|fkY5e^nu5=WN̏SɶKYC\"MHH !i>bŠ4m bII՛)J6ƨY`wۄ`G=mhQ}c ,#K3\X)D\=?n)* f)IdiWR9J|Lko13-;4,+ SVao̤i6P+>ﷷ>-в!EBBBkN͖-a/m\?Q<[)]}>[$};0+?,j:j9ē)tW0ܐ9 .ztl׳61+kϹvO_tM Bj?<@_t{ &V #'N']\Cg~ .Iqu.ޒvw occ'6|| 1ڕ L)H&yEcIrPZvjcHvE~=@Hy|Ҩh:#eve5քlgk,V`8G3vۄ1}*GL>.RE|m+"w%oC$b|n?_dRx~ %)NDPa[Z\IQA 02(]2U4й߹@'@y]T[f16on`pN'z;޳yyys xYKR QVRNܟ8f.F,nA"m=Ev=r|N RZۂ |>>>}TQ`gv/p+ KvtW_6ޮ/9;D PՒҟB^oϫIMcX֪q+rPo]&h .PGF:P> -A#Еzu>%@8f'{q )MҸrlxq ZNGt/K%nao˛V6L "6sGnU_ endstream endobj 365 0 obj << /Length1 2139 /Length2 15184 /Length3 0 /Length 16461 /Filter /FlateDecode >> stream xڍP\ֆ n54ݝww܂wwww ]>}gk %UaS{c  #3/@T^D̊@Afb:ގN Q j`app23Xyh Y2v g Q{O'Ks }@mB`; l r4. M6U{Kpqqebrwwg:3; -],* gdoi5 KT\܁N =x*-PtY_W"K&&@;OK;s (!Bڙq-mH+ ř/Ly?fq;SQ{[[3_Y:Lݓ?dfigj SW&u;KGWؿ}ޗ\\<#abj,-kvwZ޿n +% dni'2_,=`_fjogG̤-"Ho5{8 ,63(-]Xi;3{Ͽ}?7{]v;_oE66۩cZxs]]ާ@}&_+bocm.Y31Z:KXzL,]L,.ZWkl,@JΖ]-fc{.'6އ37kX98@'''{+rpYw]C|fN=QN_K"N0!n0L=z"޳(,%nfb0)!VzOл"?着?^gd|_|?j_dǟ/tGNw1k/ktxxYߥYߵAwqH~#1{^?G_rG۟`rpuqGZZ<lo2qurz}Ow2AX]7 VpJ`P3{թ7 l2MMVжӽphƾ8ݧ5D'gv3A"xBOG>/>֐2(J$='–j8ebԣK(qIa\h/=Ps߈e|İy>.zmV:AޡORz,{ɄE,5 vHWǧwqφř(Q~QEϭ*{a1,@pV:~Zr v9Wb Ob1Z$$es/ho˛V<^oyׯ+iI;jj3`d1 >#Coւe1Vu2^(o _L ?!A,;fc3xeze"XUkuEх&*CqՔ)T-%JDS esֈ~.*eYbD&&v]X81s-È͹\@ğ'?Q0 R!hk ^0Y`UEh#]{>syA̞ޮhƜޅang_ akC420rĮXO3UݥnF].)ճ`%T<3) ou эkH Վ s["Z0>i:f65+ #/t^覓OX`-[>ɳMp8Uީy5E_7/݉ 11T:(,^9JHnJ=cO AC?YC6WGŃ"ÀiB7#6q*̩.Nω-I=%pۓx2[lFg6Gb7 C-!0_i<%8K[Z$qHZ0ec+V0qR>6Tg>ж,Lj62:r'ȵ=5 |{Do7Mg)e 0'FCQat%+,IV76!sC{:U\!4$ A=X19,e)Ѱך-):h~vpƩ[nu_=+ c$[wK=Y5zHVEN4 +:¤=h( }ԘhkX2h 8ul.c^ev%T IY~N/< @J^OU$8Z&@V $K !Qe8 ә4hL4U^pcwYf-*n@C,a?8UR.`UB&g>v,4lMRNaPw#v6F `$6׫y 8tF5تv͜@U-چq^Na&;Dw[BXSjX8Go6Lk% ֣̤e֘x @`֙ٓV>RR Kn-̍KG@nYT1dkUNcJ h?U4sIùQJ@y)WٮyDȟaܞ(B\7#}balyGɲx'z6o)sb8;*oE}jM&u?)=>H\*t,f;J%MF @_&B$22 KGF/ j@Rr'o)&WhY)}Ljݮ "r*^#{Q.]& pDzϾW'A&R> hkNq~ Sdw@JALxwIfR('?CDl1lWi_E^_$ ا$b~TrVf,#Sӱ){Qq lSu4W`xΓ4 o" yl/Sk^:b V(4{/7ޡ<߃#.ɶ9H[y]gEF?c~1ܜaH =#-7YR]gԤzIl97~lMjP4`OEK3?aiӸ|4& `65{2c4B}?ɻi^1O7 \ªy}pC=duHN =Хjv鵕Z (h+2_wet-Gz(F/TpUglBB/b;nX4_Α9g_/+$h!vD5oX@;+BE\ Fۅ'j+1 ]D"1pJ#$|1߈y۪% VuzDo7<ɱQ.|/ "_϶@ c>I)^͛o-@NpA(RZ,S㷸Yc&[fiQk@gZg{nRP߼.Uw朲SrXYګO҄eA34ӕ*c[Bd\kПΆtsǤ,qI.a5x~ EBnI.#\$y'tH'JKҰ盋%/[(ܬ{Ջ`9Q-جd =u^`Y]vot)=QJ߻}Dzy7 )lQ > L@^O8 cN݀ 96Sn2=rDW`9G(ǿ1 T R6ឱ{$O5,j{uP7=>?SJ2kit$G?oˤmL{3|4m#,$FQva'>cΡ󘩦$g7OX LX-vhYɢod?fI퐧SdnV `wd7tg ܍=n:ΰIC4lƺRw:X\.1Eqآ/ 8V,v4Kȩf bÀ-_ao\׹q[O] c-ǑN6:$},S)9%# F&0C@%`Kh? `h] vfT$:I(z@CضxHQ}_:t`ޯo+KRpV4pjT`åN-.hr:;IB v3K|UJ<SE.X2$FqUGLK"eǔ^%?լ-["?D"W+I!K#8H(fiɱ-C=(akFNBv갳,ҧG5όZgn&Ź/T5T6v! c!SN%#?tn}Q'!y%|]9D:Nz0D7x[VZ_5DJRK;[he nB!X!<߂\Da8$.NJ vDGimʔnJgEfөޢ01Yԅ#މөqOrlD*.;9Ԣ,qGeU R.wMJ}ؘ@9!WWRIh&ۜ]Fwu|(IjSTM6w}}ZUfC!犷|Ƙn􉕑| #= WǸĒ.o;60_WRGX 3RN؞/;b/lP1gpRʇf D Uy,YO_1P#~j%^^ۦ[yXFH׫bH Kt[9 ;7_a87^][ļp5lCõן77RSI:57$@py^>ஊz\l)$*iaAR}&qD.ݓ0mB5]kE%6cU-h`vlPPVLd_.ԕTE!8f4 $to/+_xV܀|N8nM՟sƾjjBU% GPƢj:FT 2Y4&b먈"1ۿ':.r;\U$V˔oWiV& yWFFc~17~0 8dC?1*}ul752d{OE;X6N#ǤzE4F|u'ȼfZ0y3V֞΄TXxӅkS'u`0ޖ+׉_yʪ&28  !|GDK]`&Dz \(~{Zh^v*GoPW?mTgY'-ɺWk)j:cFaɍ *NsE\!tTPvq2L$dK&:QjE֮ϮO(*\OUݎ?fnU'-h@b#K*eRY 8pW' ͝XP@ Gufoz~`ùLȆڗpl&Wc&Y1J~vZc=._W#bx_NSuA_x\bLuWuvm'>U.?i4 G#=5;9=#[ovk*4c4E̷אClȲͰZ9vJ#*0#pEvGY9BTȄ)HӴANfP~} -b B$ ު.A/9-$ `ra\p.V$£`; cBNQZd.qC˥^<{Xϳ$*,Uԏ<>;3MMwIZ9&A:@'Ϗ:Z{D?];3be4 8@_R*^ʵ﫺E7~W#nN钁\gEpAA_&/nfAX0֔Ї)~Y=,+@%ۢ~XN^&aH.srW.< wƙ9muܳ(.J!H7Q4~vtf 7'hTf8qcG29[ۂ)jdĮuG/T6_a"Ov~n»/OHf5" ʺѩGvl&20a J~/HLCy($ kGj2γ=D?r2~aq`LtV݂Uv`9qu**E @ Z<\Iz\~ ;7(wRdTjZXA7mҰ ].@z6Yh2c/˒ͥA-G89ð-t<ᜭg5p:`{bN0e;1ϰ*Xśy'6{ȟgbWyy6&TE|qӽUgƚλ_/Qlt?l(DC%Q#: AIݱ i=_Cy߇ֶyk8B򈵍T` G"ex鴑j~zjS%oVI{WՈLst\l&ebncTx#iGLy"3v%hG ؅^ٮ b]W Ӊsh+5:WDӤ}=OqҐ_ipxW*e5M\E75}AR*&XΏkNDEWGiL~B;oxtJiXwg̹|kPCy1Ǐ^eeDyN a'dXNrN ߼"D5ߚ~|!;dMb94> <0WDCō=%!bqi陉Cbh#ъf`]i##_AI $`W[V0^Ɇ\E%>'k8% hxh%2}v9uK'2@Ze]/.yr]2z۽f(8F%G'p4,Dn(T2N끾\)@+v˺'FrK≡h~ĮW|Z# .ELH:^*`#4+,(\C]7-ۓu^ k╵Tv+dI(M7#BY٘meb-}74{ԽBt3Q@n9OD')h 1.O9b59pS꓋5 %˚ْ0D&c^yV'جS!2-u{;{pX<|#GwV&|>*_*¡l~[*4@>k&f ʕ+hnEp͆umuSmrO8(suY477Qa(,^8%iƶLDž ΥVZt3 F qV'\Xkz9NaHzrnF1>.yLsp^Ai{sAf[;;tEqvG{ ;w2 l=qVҐM^!R R];E ~-q^Ff a!&. -aSȓU XdBYD7"6E]IlW]DnK'Ea,p[=2KB*k霅ljHp *+&#Dйq5QCQ&m! [X鍴/KMgP T}5L_BiA~ב?\!KP1%ؤ쯉p)ٍ=`JMHM%38|2*f-ܢr#90%*RkvD%nFE>%oΟ%hywW.̪[k& |=s+b#+Hg+JVr>DqD !"j)tSȝ~sq*"~7„)wl[vB)!ORyV멜B+Q]oz γ-Xt(,wեV@^51zN$9e W2R%1Z~17FtS{cE롈3'KS.=C:m6l+;p n+d&`9WbV1B3W0`G !֢t)&{pso.8`.c}NG00Oj("|/݋ˠ_4BݹI ,M ʦYS/%ڶ/W5{Ss qJe "s'8C!*E.) l.3Zh j”-/>[[>.J^1,)Jq؋F$9!GJ _+8WV31`(}{B0}5 0ddy&ri4?> +yܛ)hL˜&o%2 g(Lom\`à g=h=`HtމqM4vi]i^A6R|qgm4|LY7Rª/T Kʻ]>3q*jmֱy{T 53 Ud%;9UŒrm%*^?" EpcK AC?om3'Ml6v< ?kh n{(/#E+*Æ%}%t)®bI^]* }=maʵJirO@`,ѣMh3@sAyYE~GC]4ϣOțvEJD -L{S(p+|B?<9bOmI91"1wm`} Lnmp,^|Bx_U?uPǼuQJ(9qbiy92<@-HC$ #4-`/H*I ֫e0&m9ne~w8mn%YwXʪi}{M2hK'R;%BFzDVlN'؆#.R_gꪙ jG7D;8" L$.9K2eh$lN!.8+E<ʓM^#Yüpxt0AgRgZ~պr_Β^̏{>ēugexj6\]4㲪s켜>UZf9&mj7M m/1'/a8%ߴ~ ?K-hyune랛r[_^nSH p'D'lp"6x=zs4ڱH ,>Z@sGIpcM׶[21\MH@/ _Ǿq8-8s,J(=Farl B5_~HQcldI"JmX)MGX!=|=ͬ6AA,aF2[TDbwҒh',pKryyJ͕N6}}'[ VF7tDE.G}n%vlKQLfCҘK4)_ 4N5籖*)(|~WCY`yeig^&uɾQM}ȯ!O_k|P;74Jڝ:> PrxFpEX@FXw!6|~}jѓ~s6i]@!c*y_({y$iݟ@R~݂ S n˫qIh|-LO9r`WVUL!2Ŝñ/#.V tt& 7\Wc iMёgI`8Nfz=SdG9: CYMl%"dEaUg(oPf".?7*Gh_xW,(1άX8e9'M۪C&9sWYL O]qFWQ˥,:;5QP+zFjO|}}ϳ6{3n΀$gNO0sKX3x v5}zDb6/,f-bDyʹG)on?Bw2I w8U*` uhDIw?%`l ꕫhdLv:ۚLױ* wOtTiXj)OlUᙹ|LB6uS_F4 u\ gf1MtC*ސKt<$ pw~)Wp6X U\D7Nn] {4%BZFEƯ[xKdҢ"l{ͻ.&/'1e=ceDiUW[KRhC ݄BE-}k.ֆX' X[+koX~xnQ>(-@AH|q{?ˤChiRw:н(`OF 5GХЌ/ ~¢KC_F<^MrG5$ФemPig=\Oz"MHhm6<0Բ)Xko0,tci(PZ ۣZ!hnCvd-ܫ2z%=25˫*K_tb |Κ:L} >#Kc.[W% Mo=@ӛ++gD) nsYvihq!<6s ܵGnf&T ,) h?w\*ݗ"a&# V"MW4Mr+]zF3:ܥcf!Ҳ:C !?_ЧOH! ToV˹(W|隉\T*&2/*C-/*#b -HQ^pe-R?3@F;Rҥ)b+a+*؃RԫlnȜz# ]s>'y;Gei L*fF_/ 1ZiUwIASsjN`{FK9[[/{skQø=ΕrfxO}>dxHZYk}6Ʊh)"3|kԻ3ŏqaFՃUMf6M$0f:[X1O6ϖbDҍpVaATg6%]$ _cWq?]]v1ǙA-L_.zJ9:.3~V ERo";f)c9)5X5ig" zwdd+v ȗڵֲ};=K5fxm[JTV/f}KUǛM# 93w ( 8WëOy-(x)ĭƴ㫨ԝd*}'Qr S.dҞѠO9FN*gMc263Mlő~@hb2Ci DQ_mAi n禹xAƜ& #MM{OWLPF[FBN-q~9j'#C,4̺v;yO}> X~n p#yi姻;XOŨΗQ endstream endobj 367 0 obj << /Length1 1411 /Length2 6165 /Length3 0 /Length 7125 /Filter /FlateDecode >> stream xڍwX}?R")PNi16 "!) HJ#!t3yv]9=~dk,d# P@A Pq'40\?*((ө18~@ i  J D`w@OCd* @RRJP G+.#0F@`P?Bp:b0Hi!!A+Zrx0#(r~ B&H 0q0 )\`(syc-] Hp9!+ 0(@]Wv?`4v\8u%C A a.?{wjp;+AOBp%gpoن#)S[Ā"b q eTzF"{\P_=CC#)@;:dSC˸` ~ _'KpX={*|ZQY  $@wg`؟:W n ^E]p?#pԅ@1 ??Ls?v+GG!po9A`\۪A HT([Ca1q{ᆏ ܚA= $G`p.\Ͼ{Ł! q_ 0NKG"# W/[P'Bq  v n;VbX%I?',0RdEU^J4ɞynԡv;~{KPM}݁6~d)f'ʬҥ^,QT vƜ>vH+Sio.֥g2b;`*W'׸iudO=f{XWqbdUEV\W꾕ImAe|'Vqew˒;S&>{BSNGE䆱4'ͺ3`+>8kxMOv-xe1ͯ(wQŷe}(~_թ+j|_-(koWvDcf}2^C2jUK>UKb lԱi[͎ֈ3=vxeO!DO[}2d=2f/˷k*ύDZx [WhB`VGW )}hgc) 6۔[x&j&^k+ z9{k_ā^u6vkKKofE }CWwo}e_iz@?܏mU(.+Xfumqp[=uLx¾:AmkjWgJ;"ʉ}.6e?iޏ#tyI뿢.u;˖jhd뿾TܓLx(Z1A,zP7{ěe0fP@!)[ vq tK݂;GIIC /kz[~eUq{eyeNsG 1B\Ub^4@P#{3/r-&kkvƷ7?O0M>Z腹h2/z}}?!JّK6@e%`N+V;SbCL֕Qul2GI!|n,^d5Bu3)IU?x!<6:UnyL'xКkzB6 ɷۧӤ❳gףl*Ye7QCь[d<(C& B#b4_ = .$~aNy_`jM{W!J嚱;;i}GVwcޝ)ű;᳛ޤ08|qkcZ7I1aGckj FnG ~STR>ݴNy_l=e6'R)M)M.xp.^iżg#1NUq,ބN*~FA`:u+ZspIz!kw(b4dRb{>.e[N3݈Zlb&W(2i2׶fQpN= G^33u(f=#}V{Bp1^83g6s-/Ok~Ś'Aޤ5J1"ʒbT WSWMRzd^F$ݨ}kªܩl̳ѱhm1ANQ${jOϛ\_* L]CUQn.s+?#,ݬL;>z$D%d&qЋ-ro|S=vn{ђۗ\B5jNq޺H鯵Z':iH911Ho"ȉ&)K*a?|&kח@vZV3m{K e4S}O/, B=& ^[ R ݉Wt =GU7NzpUOgFP{R+&RdeU;5OZ̉{A#JlT-VSSR[T3Hq}%Ǽ_fS`r\A#q/;!/m$]8G k9Nr+ .V2٤,+JE#*&M,0_(U:2 PxabiClKv_tj!AoIiAF;pfS tK?V64%iLh{xc,5O`K'urV_w鉔S+V`JiFU҉;2?٭CYmV9|+HS8Yz*cmԆL [Wy*ے~IDYN-,&G{)\f}y`ߑP-}ih^X 4{v-ayrC/˅ٳha7 \:2&-TyJ v&۝{=JË--QN_mYsw(3.6{-H%B{8/H#  iww2e/v~lel>7o{& O5fV" yr^ +gSHd'[W +Cѯk8gϐ#3:;~"r 7HTeeꜪ{N>jX ΔB5GB'G-KSRQ_ZCŏ٤eUp [udCrt֓u,_JǑԣV1nP3dәTP;Yaۋ(D=&x-9itI[Q/M> H"TϋD_c>P+>tq.U %Ds#FC?6Xcft䭥t`N<)[N`#T{! ~]-זCwt/ed_ itvDq^Vc_XRfПT~r{s\~q69CB&b:_qwSUYˢ?ohJ"k4X;\˔cn긓'g#~(CA;"< +X'=IkB*#GE11VJ p>XyLPz`-,}߶k5nX 0m0gtb݀g*z 4 Pγ(jCZe9_Zոj0ÓK^Vr]M^u.<7 sR^TQJ"/"vK5cUW;QTj-EʊnC1APRZR|D1q~g*B03vܓR%:dG/ ٤j+,.0YbыcA[&~W)z9--ZJ~E#P ѥ" ޯ7! PSg_2 ,{9]ٱ)L5`"\qXžWl7j{_6;j5t3p;\ڮ`!I@^KNuY^y?h< /[:cn@YL c,B,hxy]9㤳An}EǏu[smTJAM2KemɑHLmx5&y'ggˇ$u4謷uS}lyз!t?y.aN][Ǐ)BOna&펁]$.i=m egE va:W(D=6֗|RHF<ʤ-4"?}]>Rbߏ' {bon-8gqC9浟k7/&t2wc&=WyGNI˾ ;h =1[x4ciaGIb )uVAtz Up1 ^7Fzec7 p v>]yQKW- ]2f7zFnſ7ͷFOn4iitq\xe} N]As-\fwI2(3I®*]EɃ̰t>Z7T tpGR“K(d/ K.zV R0{ܨ5=_{8XAo)jTMq^!;AKXN u.H2@fV/QDomʷ"n2W~lSn|;֭3nz5Abg{ҡ"W;giJr, Ұm82,Ůl'S]ntiJf G5쎦L N*/}`5# 5`[xY"eb-Jn\i]IVP(0?F'ǵDx8e`gjwe@k#+T }lAwYEwG".P'/'JhZ> stream xڌP]Ͷ-{p׍[pw6N܂Kp .%ܓUU5GZEMRnL,|qEUV ; %fJM_.@7M sXXXXl,,06(2N.֖Vne@cF `fW:@bmfP4qڃV439Yݼ3'+- tx( ne]̀ ws 8@MVt'Xg`ebOg.dd33G{'okK,0q0hb7031 @JT`jX;2ZnwД%nIX@cfggm=| ,-~7aĬ`wȄf tppN9YA:9:,@M-&@;o#VVhi: 6 + @2wteUW,F6Noq{+W[Иǿ@A ZJ 4DbaRMݿ4&v tAj9@skwu3QKU hc}]_+F/hقW$N/)`hqrL\\L@ B_VY4zKf&G7P Ԟ?rqEA\f?,% ^7 H}+Yb0Af?,A . (񀸼@\T ?EqQ@\4 ?Eq@\txA&(Eq|fv Oo}0ATqG `ڛZe5 RX@cAe-_@d =`mj˿ .[y;YZԨ_4cۿ hvAДj 4?9AcԻ2drqs=omsk @n*oc- 4#?\(1@F * z$h v V?˂.pf7+_ P h?< fi  埥4sw_)!,/84u׉x2M Qi2.t?"æ~tMC]ۑY!y=nkhORx{6JP@X*:2HOȨ.l U2ٝ}ƽ瀴ח {*\qq`/PonsHO؋}u>>|YRgs%A;LY-+^Zj(&}ǐƈtȖUk_1ͺ&M/o4r!Sƪ0pgv[wjZؤ~y̿ӱ:j}jt^6x!~NV0'+^*_QtDPa#$\7RG .t?8gG yE;OtзP.7ӯiExVƟ?gIFoS7C+/$ʽIp.]SsJ-֌Fx<2iVkt|,T!=a8l  5?q[Y)fupQ)6q[;,?[5(U9CZ4n{?)}K"$5 7ᕂ=:‘?RrgU+ 2vk)sHgpr2~ҒZk|iOTx.OWF:-,R< .7 &VF #ϴ&sGItN1* r<~6e9ʹ.vOGUI8[z=јa|8[Cx˪;"&(R%W'an8r(6cE&EXj 0_L n)|ě.ge@$, WSʓx6G羌'u.K쳕c2:9R=uSIOqL)Yӡ3a6-n(KkҪ)0 T`qbTne Ґ/iC;H$ŀ.9&i]@9*"a,̥im&tU<| ̫73q!Qf=g$Inf&&1CQT\}Y׃zk Gx$B-ikh~ZSYc?(=WEn.ꐊztإ5uUk73|K%м7DP@$wOavpw@OF"8\2MWWcjj/wND!CQfRٲf\ =n+/%B&(/uoЭюβ7{t:n{1V@%gb@i,d^8ƒ"BFuͰw޽]=эs6ީ&~wⲢ\|2:w3B"cِHk=qbMs=|DpL$ۄV?:swEJ=|hJJ]Ś:eܡܨP8vyZ8zՌ=ASgg!RqݒN_R'ׯs=QdbuUD&Qd( wR?rPu?YM:d#Pϯ5_Rkof0;9@)c#Ѥ 4Mg"T7)K5m^fn9 >5V-4[5)o}Dq־_5"^5oAw.Cͅco"8I/Vn9> ▩Sts ,*P(vH~mYe$F b>5"r?byyѯ nRHʃ!u5s{O ^G[ 2<"Ql* $5ۃ%Z*9i}\rD/2GLxOXFUiLT 2v_2dsz0fJNBlrb/M̐g͖4ʽT݄j~L$IRpaRE>{Z7E{j( }=bXZ y  ٦(|kp98XJ0hbwAEFfeM>p;ӲȒVK*ѯ>w;nJЌ Rc҄6 W-1r㌉O"6.ͽk$ Bɇv_U>W|h~h*bUãF2luU%TEd;֪3d[u궋TOKnv I 4`ݘiVq5Q5 DJTŕoa)v4sMpQ=f{'%Nynp`m҆ILjn\-{_e0ұT`p:{esxfŒ'OYbAj0wv4+q= V:{!j.&:ߧy gptcE87gh?'!fJDb`x"3 L/O٦լ S֒ d]?ZJd ȚP Aw&A=x0Bw4+MEI;w.1sH .SCL_-7SJwȤSѪ-]g`I4^oZZu )m&IeceF'>=4F4L^&kGn6X#GX@YS}!8I͆4j b 4pdިHsRJj8kjgATcN-kUO3ۉordmओɡ!bձ-qvY֎#R5Uu;s?=gw˺Gd jn<}k>nU#rf4 P4_OhNx>eƩRiCܭ18o %삸5[r،sawD;2"k-B_l[Un^<Щ'v$:ƗIp tnĿT56JsIg7-<1#nō@∪gv4zw߷䵢 z,79W|0^2m笄)>ڕuq>-c Av [9?EqA="勏[1'U-\$!3V|bnRQ4ncWo NW>/ m@]Dbr4Y9TW ph7,M[ *BilYqE O:q]/U|SEY^5.{E NH"3 WΘsgM.KFENFvKyB [_)|;y* B?jsp@\k'[s =FĉQaj \X`XFgZpuԵBccP9.kEvE8jgFX#|r|̵O ݏf21[+!:!F,o8 >qdNd-^eN;+>k^ '&Ns ]g8|ʁh/&;*88u$ɖWVWEaoS/O%ڒ'#L?I{Vո{VtkmVQ.!WG~mC_AIUߣhPWA"_ŭQH{,=;=1הVX`?vŪ~-2dn-wnDzx% (wAbgf*. hY*vF -lN5%kϔD "Z@&&燎&딿#LPkA{?3O$‡Dπ y'>22N>bEDmtM.Y[g"͍>=~ m#G5w<}Jճ}"j`as%# IA!tV+c34C%H,[ 37AA#Uq-ws.Crb4lZ8KJ5J1ލꁍmKڅOuO4驈&@ta?t,,jm1]"3=1\cS5qj.;TJ52+wҭҡ}A@DYZ! 7sup d CM!"A[ݹIl^ 3ԃh?̺S\Gd]s B].}2_䗱H".ixj~5m{O`&^k&M{%_}DFvH ﲳ<e v0(Tȧ*gA,dlzlUu~,8O#N,푕79v*E:UqƔ+`%H0꫽ 72&\e68cn{Q9Ʌk"pd:^9Ñ끭{U&GDSۄFi Lf!վ͸ [1:+g;t:UOO/Ke,/a{l'yFUk2KbO^,&py4<j09,NgF"a|K֬%: *ܔ P{uJ&hI)2\7z8a8:Utzɐdp%i3?Y]m֏ӒG?P&ℌq .ls>~|s48 H Erx7ژesaͽ?"0J++>pgq &8C 7ňNQ{Pf4Jh~YVp̦ +g17Wk+Dߡ)U7͐ϓMXOqEnH"$*kxEO<`pk@H/@dA(ON|R~8pI`lYdAR,fh9!OǏU jl+ţ-ܯVr lʘf?%uSe'oqysZe|PsVU642 Dt4Էu9$Qz}f柯O?8z[A LZ`FAJsf%mˊ@p[#'6|+B2ϺZXc.v-8tc0x%tYWoEk 8*X}>}2"ݑ#tb{r1=kbQFh6͡k 5 X`$E̢ c C&8F^a݇tl3zWy1vs6;%7tcLii]RZ)`'cdS4 u}NJC-݁:s:PAւB%# eL'c39|w_<+EhT+(.`$wc=^l'sC] =#q 1NmNW\ {5q[r\"a|H4lBrUtO&=UYG`ik,siTAz Zwt󼲇CRnIxNx!sǖvY[ `AdFP[(G}x,\ĵaR֝Kz*ϝ-;֛ W08,F@v*3:{Nr4U\bRБX2tVyMMϲf*7̋4@],xoicdYrH3s_~>wg$҈kGOHfOrcY㉩?oj>? k#s"}XpCdJn?0='K'O,(vH}\[ϪMp H6ON`:eJ/UeC4#{ 4b>ax>HR t 7,Yj73alnBR^&!yeG"hm-u~͌:Pi7hDO3wF_ag-PcҪوoiRVJiz_1_L&>ҔEuجtBcADA K |MUc˳R? 6o/dV<z/?=O}4 OE-k7(_lꖺ\e2/2 JS]E8[^bIfX(pa2+}g@ԃ tQt7QϢz؈_q4;>팧 X֞$Bȍ%J{`}~K(Jt²繶^ ~aE K}R%iF(?xɸ\KL%{̫y莫 3IʌIYAgd#~\NT;aWyXNqC`r/wbR V.%huʠx`#Z-|lbM-yRɑ;c=?j@ҫ#af|8i? )?*:#Н$2n_hOk?G~wJ&p"F;R^y/2=orET(1$ w֯йiTqŬ+~aN;pン5I?q.9aPIb{xR5žp, k5F; Tx|eRSCäVoX1;4[BD[m8Dd}˥ }o-?`EvLF>2ٌ`b6!*K$C:3>(; և\v Od"[ر-90YC$ &4,q(oֹWEFpr]~9u = wt'ب]^=W}aLN4ѵPB!. :*M*KRW5 Mjzcnfݫ7(&@}jQH5,NIYE~L-7ʫH]/߇zb7?3Jv`Z_vMp\-{b?Qږ!J?[zl}g:d{;}5\a*Ѩ38NrpeCwh#r+9O<.p+݃|c3P.̲Зf Sk9'@+aQU2/ @R*2鬶'"4kj8߀j>%;*pOtfG^XiT:x1j<΄|B/ɔ~++O8Wn!=ArR.uL󫵠[2cN!Xf8T9ht|v pF-YkӭMp8W x c Oz? Rd#`Hxٗ=1WrI@C (:zq#S8߮BMǣ3lN&{.$SXI" 13dWFǏ^ z?wbȒkU@r%v0L,^CBNsv -#It rjMo<ؤ|j^$Ck9:r F]fUn2S/VP 4^7 r^˵h쀮YyW!I ۔ FŰ+GzΪPbh:0r Ԕ ieiJ Tv 5l}=al xm86Zl*S1cIb 1Jv2:Ʃ!-2],_}pLNA:$3,_j|D7ZAXW t#$sE0%~ ?'E/%Pqn/|نR78f]󇥗Dpu ɭ{{ywCu'~ Gb;5PFYrt؀1VbAdXy`{ i/}b\Jz.`HrOFR!S# Xb2U*0L5v `6o1tf%h^7w/ xCVپ`6M NRjSQ-\ e{ cMl7>"0xw^}*du>>xu oguwy ka!xLA\#/>ȷ{# :@5-PEo;,wEax_0t՗ BG:sRbME*UCIyIJ8 JԎX/?wl' ]q>Q,q9v.FAKҮV{$lЛ U:Sͯz@Y;sj˯=h!C :E)g%SRialS쌑  4nَ\ڰ1dqScEMY .zI:1"Z3cEI\'y0V9Ĵ 14-QgYɦ%f!r=#u^ps}b.z0~-WOa X~R;un!)+n(#Ԙa !(عYz"{flP-7I|KZyPqR VzJ¹Fm̀2AN.['XڥBC6QA+EB[lͨ rØ?*swOO‡>Ǹ+ p_Ya;e#rM &VOW>ůGGp,f&a>qZVl~ +J;%ivwи2 ]J@b'u?Fؓ68YCw'KbTKjQ$L\ok` }K2|V&oijS/xjk1 LHz]yT\_q3uRlPOwWVZIky[cG*)_1NMœvD?84xTF"iĴ+!vg3]`#2.scK7!#Ye:EslH6%q 'v<ë|Wgh^D4@!dΌZ!vK,[{Nܴdfz q~TϭG]DaPՁ"P_' IYTӠऐ5cL>$vuXS{Fq[3Tח;z2+gnK( dZ qP\ޓL&gXgmG:<7ĭ(?Ľ╠bb@F۾"9*DkIb[ẐzW3MgOE{$z.kzbk( | ?r9U+CbO 'ǼKaIƕx彚+rMbbmhOL9| B)ʑRTnJUaKv,[U;FT|֚9) |Zw/x*w{ zKK,tvAc.Qu?%M/M1UI6SlDŽ3G"hHk%TjH"1YĴ--'HЖ6R.-:~-9r9lgӟuB "TTJJEy#7e]!q_~h''o9{)Cf|`r:pA= G"!)?&",zݞi5^bTI6Ky[NBٴPA022r"LA9Ȃ {%9• x}U\3|DI_J%#ZWC;cVKq!QyVg_`^8^g.-C^9[,uSU9L~˛U-|m;7SQP'|rN֦._7eK] .1B"fbU@&7MGj|`RG@,Q^MÌGn}+]+טvl򓇲 *<q R(|W zfϬv'LW%5t~ )s鑶^yVW˩}RC)fE9.ٞ)l<`Ub/YVJ5ޭ[i>'NKX*8evCI=#>~XnCkJ^W,od8@? VojSڄgF[UDn>Y A?uN4Y9^v틠肻 eUϫ2-O?}I+K6G.vr٫#*|=~b 8JYs*Z}]F% ComoZV‰NԼb 1G-IWY(([b{C46 N UG24S;avIj;(Sc65*v o9wAUN+VhusdoZ.GIo 3[\ަtѱA /Ot5mUh3aB3Daz̭~C,vNy?yH89{sDRZ$jҰ~T. al 50`KrHp>!*9@pظr0i? 奂D>^39)]yk4C'(US(:Ki$iDF+u|BnsY:5٠2oU2PPͳ7\ &Ov3.$ w$ZbG}='?dnUCƘM%#y@m)5J&muK@8{׋I2`:_hAȔk01$ld7Ja4[7n C8# Ζm~U$@*/]}TGx|cQ)34SơT_/5ױzviXݣ5:F |H2ѧߍ2LOjHy!i4LhNѸuya6jh71ӁzUM)HҴ-7@|׆OY@5*[儛2&q|gB ^M,Ľv|@" RW W~jw15V֍c 5Ȍ,3&^;߇QyP8-d[G4 6TSY-N3^~EK/~YpL\C='< fQDu3OH*xa.Δ3>l<< a_yU+sւ19#@SNTqmebRG1anQ#KFuaLz6.>Ͻfm2QJeh.H a#Ӄ$.*DG>QcBX9S6 /E}afC0p5{f9 GKykxPrG2f*E[񾻞+tr%QΣwE+F×۔J _.'U%L t"dğ$.|Ƴr% Lv_p3 j)H)T(TԆtqnj&4vW.dރ4U)f|&t]1 ai~$cM$(> ?!0o=o>6*LȒF15c<-f~fO$R;y`4<=V5RV^jk\LH?]Fuwt?[Mn7TeBXvw+LN~1Dxax TlYf/:$&)'iMuO!r&Sr\ Awޅ"J_i[u]o8h[??ܝapmߴשWa|1W3li1))=iX_WN;#C^G9>_GWJuuz壚+f,Q)m"yBƲ",7AC ~ %i^÷Vħ n⊟q) 6Ϧ0vJiZb@sllyPH!yP`PI"+2_?^R'Qu MPHT'򏾋BJ51ԧ) XڰؚG#7Cۡ5/u&g2Wų< AڼNnc&krŒ`-..qxe!3UWIHjLtf8\a1H%We̽MTcdIxy30"Y;.|vM3?Ɖ Y",4HHM9 Ɍ(I4KˡY6%$"بzd--7zqo$u_UQHv: -X5 |IfX9ha*蕥TR)^bq?HI-5ٲuwu|X'C^[ʕ9Ajd.N& i$odo_bfb?'- l;kw܃qXYG4;/t䱷j0UpZ4?_eCN( Pl'd\{ @V̈́/Sa\A+DW]=c/Rp; f֝jZ*5=@'plAbcB]\,! PAPQw+uY}6ۋ3ZOOb)qfIʀ+ oP13V3g]w!uBu8w{]R6y[UJdc fdy,*%׊ѱR }~HՕ@|DԶNb4K6̓a@C)fɥŵ1'f Gi$ςWRNkC.Ua%ČGfYًq e~Y,@`#" A̗wU1oƑ~XFqNYԀy\*S:kw`XauF|'| cd$8>t5Fo00.Ukd?s{4{brE[mii~[gtt2l ^?AB{K;y'Hsi*9q5A_;sQ^c:hTl- "mm 4 mV *"l/@.5;Éw$(cԢPz M$=NPupT8&>|8.u%j#ǵN+NJ?hSV&rVvѾ1!4W~l/Cu;!g|p{; p%Gq(0 +u@1ێ:ǧxh7ASv[1,xSN7zW L0-{T!3_5nud#SM.4 0>JEn&x?EiV‚,Uop&-+D4֎̈ȕfwXz#dC1ce(#`9b).ďO n?*R,Z]\G푊L4׆JKxe9hݼ>rSĄh|X6[9 & j 34,4\okuDZcQe#aoɣd>Xf(DވwZBdNb{iXH}sYaU9(7NZ/@9rc,^Oaj 7{ݐV"2 d{ v2N.In8`!}Hw%p$8Vro.fKnޡ8XKp wGS3r$? qNV4 (H 6̙G`襌L./_/F>ip"fϣPAGo Ҽz^&o9_W'qV]`#šZaZIFhoxO%*uhvGT=,-HrNw*}X: 2zzz SH7{j}ZyM\05!B*(v#!>@VOX\maRG  RȧcVj:I R <0% mC};|92ai#z'  TvⷷT8ae:0 |9«Q;21j1L^nϡm fNÝոl-JC kS\4˂b:l(뽈8nPҬqZzd0C-k>G೑+2ƒl rwzQe"ˡ+  0y\R8Vf@)}AVj(QxZ455_kϟ,JJQz[Ap # 2nx~@bĸ( f58ݣy4q=]!Xn"X(X](.R mzh UI :h'դV7piQ^u!Fd퀹HebogܥS:Ρ Xp/N(m&݄Q(na2GI>(U)hXOš\z.^110}.S@ /R+?Afv.ށ;dLa'iB7V`_|EPNz;]Ƿ_$&-vj@2J-:n.#HCsuj/WdQPX +hޛ*BTz:~38`06qE)!Y-2cx ۆRP٪ į&ߧ<2gbF̽3@ηHIi)uCs&ι8 l{vѿ,}èOm+r [^v#bKe AuIصD}A|_%>{HwR5YtyASv~Ϣ^@/~N䪥ѻj;x{ACEQ@ 9Mo>#Vi^iʦ3X̮1 'F}s);X"tKsD#EYu}jV4D;9z-j{jl⑻pMѼԲ$'upGE{"d3us ǂˤ8 W 7]ႌ^Xˢop7Q]&03ĥuRГ endstream endobj 371 0 obj << /Length1 1816 /Length2 11318 /Length3 0 /Length 12455 /Filter /FlateDecode >> stream xڍP-J޸܂{#h ! -X @Gf̽WW]k{"WVc53IفX|qUV6 !QQ[9ـ2#Qi Vv`C@N/6 c8;0@`cl@  | c+33@ rDwXYX:_)t-bej (;Yl_*L@NEA+`dlllcZ9YTA {`-ɘV̝\! v|p 5Yy=g7_ٿ$ݭs+@IJ͉` 6hlhobleclG)Qˀh wrdv="oSڂNHL_ݝϛ۹=V`3C9۳hAY@ rL-Y~ӫۃp6Liog0mezAt4v o;!̬L& +0?/f!Vn]XߟlOˢ%%/L&6NV/oec* 6)aݠ7݋hA4|?+?firM6q+EN/W{ 3+g:(crr)[9Z)? RsXl?\`S;0@ݑ/Bbx XvN/)v7 `mqXA<7/Eo`QXA/#^n?i7xA/Oa1d_0|k/R_?/lO'////_: vrF п_韀ZN?/j]l/~}A/q:C /?b d8gg.Fȕiw\pj}" !:3`r#꒣upASǺuvR<2Wl)Z#JϿd*$k-kzs7i̜g2x$h"O Y u6nJ|kIjO9yҢuh,nئmǮ-Ҁj[62jU&<#|EnM#Rճ w=*2n}N-N}%Nr=3UN=5ZXC4ޚޠ*vc /$-:WUu!ٙ 90mzv]{cfjZs$"qHox?FS$g~foTF4ԯ=F˨>hthLY2'Q!6:tsW&f\XmHޫΫ3&s:MNRt^ 'oC_ɻVz8RHAϞ}ဥP9Iu_xBn)u*_hO}ۭP uZ`qkVIY4k^yw_-=}}lg\OGsRCp-8|`RΠx,|&Nf&QͺʡI#\iXs %\ d2K7tξ&zLgbRLTAF,0QyҏBUBpqH꧅sM)Ƈe'Ą_9tn4۱l\Fsx?' D[>Z\(O)"T\] kNMeh[C~ʽ+Fݯ?CT@nO˵ o̳K# =L Xp1Ғ~p4a/v=*<`Qbt&Z\7i\f{͋|h)VS2q?a1SFǃL&"Kޜl+nf6_t@\ :t@Fom[.;^4.{<E5Gg% +.&i#SV쳨h&* q9j&ԩƆ߉0Mqb$23vz?w"}D/g")&[ٟ+LQP 72fH4 MǪІKmf|7,ӹtđlhH߲iWlA=o/"n7Fگ!dHR0Z=wS5 ?!{$U,5OBP4Tzc*4ndg(#vfWcdFS4S n.cZ!u‘s$|My9qԟ9. [n XK k 5ј]2qQ&&^uHmS1BnWB$w]v'[ ?{P%#UuIr~nWgQk~%0*"˜l> ?PQ .9u%VJ_ٟTB5!5" fFT„*<$?\-Hۑ͊[VlF?=$jl^];wsmER~VQ5Ha *nD -uȧ2jS$p:g:f g%\ -H %rt\xFQ4+Dp%K aFzqG)A+$Jhs8^TK7k+rwKU~ȸ0^'aHߨaȅsEBp}Ț^~v:nd剨9#^4h`NlHұAq2ʶ[3JhoeJW(gA4ksLɏ\vi 7ltr!ND|lENDR]nNkڤ`cA=< *MD?H14ÚWDCP'Xqm#2{u7C0Ji/>pLaE!q}Ifd}ȠQl0#ίB[ aB\:2 a5VҴXX>&f#?B!"I;jF9!5HL΀#6] DV_9 (&|JuwHP~jQb^/˄pn)6\{67pI Yf:Ϣ3m)K}et` OCFU׻(bFYC"=ʸob5r;uϻ.ZH8clq`9Lw:o ɲ |pc͖YBi%MCdȫfe/|*[۵'I[<I+vi)ڋpk8[Ŀ"fۏɂST5jeo`ЎQ7o$Zy)1K򺚨A:~CۜKj oLg8.{*},SGr5FjzMڰhSxֻX>k2UτWGVH R 0: 3| sC ?aHO@']i>W1}gtFV$w1O^35 w[*7^>z듼hGzSk[ksRqՑATT^u{X\+nrzBnf\3}:UgK%]`{aT #랰GeFk-gE1tW1x_4ߗDkq̀ҵڮX|oDzOiyYO;;ia?~8H_ASw*Snv!v|-/, P+}DtQޢÒ~UƧB3קUroc.j)4<H$f8\ =6~)_Mz/<<8=+ÏIJ<\`όM'ZGvC~ = -_\ٶj"}b,Rm/X3:Y\lde>t2lb+U[V xl?OLIT: Ntȉ !tXdl4n9~H3Jyr5zdEQkOKNϥOmsn%]3GI斞 (_fKZ6رZdȟIMAu+e-7Ϣ`5d=U<\TMt^D&yYϔK M?ս'=6+D %\^NYge8r *媐a!tF6Bwo`W?QDX:_CQw |=CukVʗƐ7PQ9 owZZ4d">&\/4FJ/qFo?T*~g_#^_2W mvWjUccP0z0zGϴfڥ&4[= P4?L Hj"l&P]d08Mޗ2k,G_K/PUˢV= -0Eʾy/ƠhvvJ Q:A=o|ZGQ1@dw' ݾT$3'{i!@6YR5obuZړ+H0Ó/ɋJ>]j*@(1>D,wVFR11\:u'"_ e4ĂYw-`ejֆv{Mi1ߵUə^q4"fLoLO pElƏ@ftx!<jxI,ykE8}߁ 6i$Ih{qE ̉XѬD0< *NODYU:eaT8Ȇpt@ vv%R&b<.t`=k鞧Hea{ʅI?a9 q,iP}DJ~"$\h=ut6,52on89t+dikcVj 昨gZL4pD7|B&߲JHUa~>Q!ymwPv{V_z/QqQcҼYoBθ 笯Yyͣ'P{O92(`a;eudH8$Q ٸ63LҳAH{T=ТUn64vBci0Sb#%EԴ.4T27;k4>߈V7 ]x-ӧ]>& (L$F#ȓWsL[jSer;ZC[UTmήG1Px'UQNn;OyJQ 4cib4h5Hi-7פ+n=LW^ʬb7ZYhiRZ*s#[$2;4ls)9^:4}F j3:k>mՎ!5 'cScf+UT|̳+&fF'ڍZċx?m("Ҭ3 ~+Φvn=j& =;Ji\7Q/  Z|*TWܧHsU_U&`+tU|IEA]ɧݳ}zzπ.XaAH|J@f&_pbTs00aH>PNuЅsj #W|XI!Y7z_ϙfSk(F{ӈrϬs8v,ۡ}gSPUuD#~ R9  9BtxMg,7Igz"㖙a (D%oGF{:Fu3)augyReǁ\͜t/]H~ }l-*>XMQ6Jb4p> V~C7 `bQ̺2JymY\&*yyou1GHI[爢"O܆Ymj֝ EFc V"=Y芡G+-/T ھIi,~泍Xk.PmUY2>,;q`sy]|6nP4 0Sr̠]K2Kutq<;Ľp8i~߾ jSKM 0Fx9"8V L럸Uҿӣ%Ű H{zV]5f(^].~g|ϬOI$_ };fc96gʈC+': OSk테CLMgsҙgåEvy-/ƌY^S3dU},4&q@c}U-7~V΁-Y%>MR7$N_ AרQv#x^h҆F4ښ(^ m^$Hu!K~ jn܇$͵;"Eǭ?f?'Ж? Үx E馓ʶW/ϰ3|^\/HK{; ٰkh&y`!GQ5`Hs 'Tu ~L|cZL53$;N?ܣ!ĢgpRک2K7D|,c;3 rt+`h!tձW8e|tzH:^p޿0ϐgeNݷXǝPm}^=ޡ$?kSpzN>%ME< GIqq#ВR&3НXV7A,5AЭ)lb;EDW,a!9xgy/|#S pEX4#`W9.>;s+!'U)& Y\ⱆ!Ely޷moM[nԷ_-O]_IX ZVrLoU9h7T.Vg` uї=$[/0g?,KlSnUN=bEM+K6V0!|=Z!_گʩ2zaS͎hDh5WKHۑx>_%sƽʺc=/GW[{q{1-u+ſ0@|9Q yp{-?gp'C 9yj;p PWԪJ,+lūOeVbJ^r@sREpFq- FqF#nq/=8Ύ0|:JQ60:[%<3}g1 QL'0ߠ~CT+p /I.|r@V v]2P"7 HjsJTv=C\(sqb3Pѵ؉4٘Ζ>,pbJP|6iX?xvg!]dӮL6̩MDb_?rzNM/WhXL۬z 0ߛyvUxQ2j9ˆiAgs4CXex:H/L6%Cn^Y:GZw凶 6HlU=V;u |,؀6c1Y \5 Fz˨k#>5W>~YFqg/QJTS`l3.ЖDGuMftY\ׯ~&@<\o%0lS(֧ʂGgj?lᅤ0d&·3Ԅ0̉wѸ|ONPB^G1z'71Β@# s3;)^{W"a7YtpۇWƩeDQ7F \0RƤ ?Hbn䠣_gG he  aR%@6?},F'eVm 0OcKuX _?'/˘x98?3\^uG`yݑJ\H,_JV)i ^c t<<ж@ ףiv7 _71"z)WFe.;B/#^)6DU;u~avySiK@b}gI۱km>-/&@Nsq_n۫> q6FOd xZ?Ձ> stream xڍTk6%C)P1t7  1CttJ4t#H tɇzsZ߷f}gh4$,Y8̕(ip@nv A jˌΠqva"H9C]l<Ptpr8_r . P?D @j 0 :jm`&p 6@6M8 q6.pgkQ&Vq8C,;@tƎвk­\=̝!= +h\n܅u3y;uI-7> -_ƈFv%j{)Pis CC!ɍ[ңGγP̦/0n&bc-IhQ\(јDzJ(cSȺ@7#>>βڤk<\j|8]RE͢M~ a; _jnFuޔm̎{ȵ%chVS/|μ+8$#.E/4BSNn3{L.S*x8b $ Hsog|w@~z [Ю1~l`]Ԭ|̪U;Mm l}@ 550SmON͘:\ky$#l&ZnS T^2PJ#vu[j.[B[=e4ғO;} ŭ>`g%|`W"0t+Vi ,xzzMme4/GRcJi>7I QrQW8"sl?7FqӍɖI_Չ"R 7?: *p!ɞ^B#e2yL@C/-㿂)ضC&iLGo+ ©qeیFO{ɯ^GxЌ&˓2 &hWKĜ]e*NZEJגArgmc\($TB4}n=jO5g0U2@3G.2^7 +x]#rZ7! 6R\x3 JdcƄv]99|V܎F 4Qj{ j6])yNqrYUQ Սz5ٮi9l7[^xku/gAef"g[fxgOg˪9x4߮Q]=7q~%X3J&- 䠝@XBnxeQ2TL<Wȧ VИ*ʃݲvB3F>p+ԋڏ6 uJaZ!rc' Zv(|DYj)T=.e%^ ^Z$7 4yI=dEp$#M" NǚrY|G[:j)|:yxwkBӡ=ʙjj4(ހS6I7BLK= ?j@sɅ4tG]W$ZKpjz]B] :q RETc_b=sry ǑE^*뗈|rR&oBWHцIq"[ ,My>k9@ ܫ߷.w;+Dc")RxBx}}Sa7~~x)XB#'0 r_3XfG}i-;&$xt9b!s  FMޙnHx;aJ$,Kt.GMnI.Z6 +TƖ0y *E~~8q7"?2+FZ~s5MƌCe\s-RHz&|f|}~rI\vz(@|b( PDI-uΰZľyFsGk~"Q TF3;VV1jI*/7gMį8;NUI UqHbaI#pR$&P$Z]#ۓbtxai^Qe'eg&޽TFn \OyS4m1C:߀ 5r*JnÉ:Bm-5[FRiG|IC<:5qy>sm"P/֜߯;f9TCW3.RӰF)cy;Q y2: kj3z yTJkȗ9O~CVު*Ҥ`ә~PK! {t7/L@"ϔ}f ϕ"diT]AilY6;ؑswѿO#4D>*~v(pJ0K ஞV`RԚ$bdUTxŴWK3B̰ݺa,k4mfʗi#7.CT^/t{URwCR SQ74$R4;;R (#VYA7N qMM渪nIH}X> }`37Ih-"^sq/0.Q$6brX'TT2w_S&c9H+2sπ i(fƔDzZ C-]H DD*"Ï<b8'O vSVVYKY>o˟u7HQEDilH;UqwN vu+5{rFKjf1upXtS.LMbJV8X?@FzKYa>PO+ۀnI%x70xkZ{E9"d>@N-z 1.l]5"#̵`u!dY #5Dϯ тu@ٻc z' NXN5V8&/\`8~̌\^,׌u/Y:kS_Oj36"*㱮6b KT EU PN|MUn๢+Vvt+͗}2eQr}~k6[5: ^p>YPE꾵2ȓJHĈ eX(K_fk>/!9tQggdp/&ѬNm]Fl6U]H51Ӿ(V(Qx4At ~kt{J~4 k~alJ%9p?\ Ң*K\w@aa2|~FJSt&nnd|}}al&6Ns=s=HJˆ"3y/(`R=˝D},"wĭ+5'Q wɰٰ8onՀGʈְA5)E"{WG$*SaFxJ?򿜰x^74Y+P5ܨ!;03AAX, t{W~? D] fnDJ?\>%{>p t󦧴YUcJlצ2:FX爾c"T4fLVp'8u5017 MC&#2ߏ`{mFQia7> )ێR3. fֱfhJCL&"a]1}S F-ZHBߜ'IﷃL 8%g\y  $ZA>ٷ6gL|7.8,vJ^EM)Zd3ʜhkc OV@`PИi,QVv>9=1EC,NƊ\MTkP!PQk~5%hvc>tdz˯}$yBV)'wǡ|zT|\4%,"/T0&X $a;}=ZEA[j1/mf5#żq~VV^C@zb_5dıS)K]i xšod]q(Sۣ렱o^v~P|p>_EʎҧͨJpcK1YwҐkAbRNZ:AsFlm|`qSYk '&RSn ܩ~iJ2 t˵#_1!y[s(\_eyv$n9ٙm-e3@y;7D #e0}as|~|pWvԆwT" VT93n0}SkX(^+ƶTcH6o:l-X&m} kg*v .Ҏ$*Wu )E`F~"|f|5Aao 9л.nlǝ9#VppièȔtz4}\dߣÇj]j̈|):th4cq9S7]O1t*ʲ~x=aV:hN@hqz>ssT'h1[m{N}5ѿa;2_)'|IʥA͞#Y7S18P=f',5D[R4۰a FQ|ٔ=q\n=oEo8픕f1}~޺t * :Z{*};kNPJT@TyN3JqWy.#`Ҿ]LXtt0vOU5vwi*'f~2P[/묐~Š5LK,~_ 5ɜaU%2>@G߻Zk,xҍƻꇶ;ӣcD |M9fd逯M33qOtp])U-iD<[3~?|-^fza/4 PRD1߭v mtgYjF5s\x|ԠATtP*=v|t/1ް7޷p|]]CaI@P3YXUQbĤO^Z>&{:Y[ؑ:ߦ#+4!>Q:s@a-Mn! {f$Ȋ 5Qdž,0n$q>ǘ0Qh7)=kXOI~~ `=; 1iHD^,ۺǀύ1E3uje ~{2ecճ+>`3E"NZJz"TS恥oa ݷ7Bċ0 +;=q!MOg-IkcDVr~<.-Dcy\[(B)Mx.~_uQQաsn)R>2XY뻨BR$w[J*N$;DY*iې)FmMaw}t^>-Mׁ>zQF8z+5rKJQfBҫi[sey<2:9s_jY$un}OYholc^ NZ2WЮ\HU%1kLC,՘wvQqf25LiEu¬?}x8j:<Z3.3ѫ(WR\JI]ºc8ъyT^M{zI\X|EUlL^i(ZGC?Zџ&Z kKR)̐Vhz4>sS>Ѿzeۑ-a\iȨf7V 'nїV*>>1$;<ݡ"y1&E{[Atx~j)@䤃v7Ur%[' QJؤ1b`ZH۰c 'JVf"Qo+N}1̽hJ%wǞ(dNT-pzriS(CJ! *f5 G ]? GA4SdG-FB 0X/vpM:M1`]>gғk<ەvj5e-;AZ񩪈i%vOѢkgo3F|y㫙#ʸuElozTJOE endstream endobj 375 0 obj << /Length1 1511 /Length2 7479 /Length3 0 /Length 8495 /Filter /FlateDecode >> stream xڍT6LH(0H %% 030 )-]4HHt"4ߨsoZ3~v;5@z-]Nik%DCrpD: %HGhAB0" `$ #Qfp@  Qj PaW, Cnb v V`@8n;tVP_!XHgQnn.+a+":Wb U.@]gum`V+ f APwtc?Z;_޿AaVVp'g0 @!M5.'Y2;Q`w0l28 :W+ uU!0&ìeNNҕW~rP u/cu=`>6PͯݜaP7_(@ !a\[ F wؠJAm W;DA|[o` B,!P?Q0揌< 0}2CqspTuJF 8y@>(Z`_YU"Eu? 5}Xpc!n Yxiݿ_(9:ֲR`'_z_ݐ(Q_SCȟuUXCݜWv@fw POie*p_ A_ jP+UJyv ؋5b$A57\08@#~$p@Q$Ep7?o_ /u7+fyH;|@(OLa7WVnjSՏȿ_bE0? m;~Qbn3hw$Ma ^EJ ["rdgyk۟W :o (F ?{{kقީuq&'=U_!|f]{ZPl3V?4d g=MɀcI2*f}^">MS|rJqd^9G|1pTL9:fU)ѩ>?`IeSP+f"VQb~ÒųՍ񆏜[D|%H1Eu1CwE)?iJi]v\s?4F0!sONbm3j7 X}c8I'ݟz|=ب GVfQf%&lO ܽz%mjf5 GW >K?Kz+Æт2nuCQBw&T("x;l+e_AANZb!ORY_'FϧIK\h0Ns$+:xj|-Z/>eTBf۔ R]gzO.\Wsuhxi^)W(w#k= ̻L P4&J4=2*oTbVIn H-`aEZ6t7CRZx:=7$SL7hf_t>7?C4?+ Uy&7b1'TAw2lDWj9HzuJ*}r0"!8xzhPG[8Xw5Ғ» X|elz/_z'kkg˭f:^r{vjӬ[ނHo[457SoPeOa7yW#>6ǐi;A: ,ew?B^og \*EE{|}{3[VM[-@Og"9$x;jKXȔ8b$'Žcq6$c05!p7TzTވ|[_#=v-/H)@ݗRe{k؏` l%KXꨕq֎&UvId^ORGr,߇0&E]!Ta:υ>\[(-we5 λ2?&_@?$$_-ULNNLǓ&0l҃6oHqJi  -k2 %h+n.evkHjZ)`mz1;>mGco`K-@ [+KLuO63]4.=Yk=5'mh,y38\}C)sj+ifʯWMup6܉r\q]pFn|o1} VVe@Gg+ YmAaͷi߈l3ܙVkXv~J`P|(m~2bLMAjg o@JAPj:qtZڝT~#ծ*1VōS^Z!$$ܽ|_RhGccSpwl"a3UP löpPg)$OX]riS8k~欵}8.-ʅ?={gmpH=@pgΑ!3ځ4z{4II9!@ˋܣd{IGOTEs` FzS:5Aw mYLc;X|[2|3^( SNkqpy{l6~͜#(tK+H`@ut{5\W%?XQBE;WOWf>46z7uxZ Ao}W~oZУH*>PwH8v|#cМ -&3%_:2Ώ,Ed^sP* t,%F>ۃqn%KamT ƿLrǥVkQ\v~:II-1Il$2eb\b3V_f"cN>jK.6A.gO&fʳJ/ѩ1EfS.3lm@2ۑl>F%|6#V:ľ~%T:5NPaVO^m n>vA`+ $m|Nx2RQW-L4K*~+I6A/DsG=X!|'cۮMY~x80C\*1Yb3:0_$FM'܊[eRpȺazH)#or )=!QZ&hܱuyMUk M9DCaJlk3`u{M+?%Yal_Yr9ldެ 2/~bW@)z 8F>oяKhN;nL(s-ZeQO*/Eo[A5~Ǯ 77%DyK6>PԷ\O+~;!/t/17l%"lSF Z,J ;o/PhniV'$S.k гQ?}D}CQgqEWWE҄@Sbh`A}]vCZ]j-'>-'$ɺc%z;y^'tęG.=8m (=ݯP#cYg>蓓%.o:#-du女fI]'hf)rtD;׽+׏Y3Nq*_z>5`M,bt[]5˙~t{BĂV;|!h?pq\F8UIMl-Wt=]:ks_9tM̲Sslͼ$>g&Ubz_+C}1:NU~/GD˾,:و,/ A#"-I.a\ *gUSPZOphe#k%VR=噆}Q\674bvvKByŪe:.aϤK\eq2'84€MIUUtXװ{`22>}B47'D|/} "bq 2zlnH{plptM ՘㦞I*y L*sY~QC@E 9/5B{u"[;!7~!O'BwTx׊.i`zqyR͡oāԃČqDɒ+<[ߺ#ͿTTZ7#))1mm:y"^o@YcH8T+xfͭ0άpl >p6/] F_zFVȐFg,Q1P5ť][rW^K,El]?%;+WDܥjlyӣӛYm#X6o:)Î_rbGBYGK:L*iʵuD-Z3 W%Xr|V^=pM,Rcl$ h@qg& %&,_7Xj IїtulFbSw›U:Jy10f^w7M#;N)y&\'p132jT"}.Q'UF7xn)SM%b+t(ĊZ3Ah˭1ǭڳդv?sMi uЅX=֏ A[sx |f9)ERo#Оt ZUM-5X>κ D%m,Fedz4Q/nYQ HDOӎn?# l:݅;t }V)l hBp,$>xYS YWCz-HHz4j0]'ϟ;-]Bd+bFiٸYb'#sI:f^ڏw)Lm}YIk$Yb>s+Hݕn6t˞q*/tYN7W+$w7!4M*AaW2_2*_@˾^8:5B0rđv K'~)W*,W K# "3啕ؤ%S9C/,+qmkv,]dpʑJ;d:(ntV3:)+k\aS_sEy@zwnN|m0QKp 犂9ka S }sYgϊT=[1rєsU 9Ơzw1+JD·au$@]^g mD8|*2&m3Aj{ў\a֜\IKֲZ#maJk;UϼT^d7RYZi!|e => WV yW\ol=}Sabzщ;i/8z $o;j WyPsN%Y~;*؜LlO(&رyEϯD|2ajc̛7DY%YT`#@nLc;W4²[%?V{mߩ/y3pn7z:xtg}ph&}`POyP >ˈ/yR'ʶz~FsP--5i}uSsG ǷW Vo3 >`E!JS WY} B?L)O '2M`պOiBT=1uEOG> _%J0r=?DfWe2 =\}A:Y/gQOFb_/unJ-Mdyk\\пstJ>"~F|jOHLQ7q׺anu؁ZDV ^ TU $Þg_px`Evn5g/b~5 EZ! m$;2^ؖ[O rЇ8~)qsf+hdQnCԀ'cB?U:İ[ ."AsB3߁ rTSw>Ȳ?lI7x yD.H[m2]9wfo ۻ[4nG&9O _P1t~`-J#6?ra endstream endobj 377 0 obj << /Length1 1511 /Length2 7485 /Length3 0 /Length 8503 /Filter /FlateDecode >> stream xڍTk6Lw Ctw4 1-]ҍ ! 7yyk}ߚ, :ܲPk5D||<||8,,`3b@Vp`GiB!5gPc<Mrap-9m8@11Y lchZ@.mP0p8/;f ;@ '\ wa<8,Xjl#< q7@_U 1ci@ lecuq!;3s ݡ+O+5wV%Y]s]<`_ xdE<O  ^݇w[ P/ߟbk[W'HU/ fDĀm++7? C ہ8~V  oſ% ` A`?0< 0Cd-j)iip.o- D"CXʂ_U 'Y+'aϿ`pK `, >gvc(o>Jο /=p5 SПqق=\W B̀,G+A:`0g0uZ(n SeX>VC+!6P_/$ |p-FHB? b mA޿ @'?%!? ?zDDvb^ɈyA7"@l[x0!/?1E _%x`MI{G]@ o +,}mnhImHқn8I?QU@f0 S%C@ҫWٻby4|~[wFXb;I쳐Y|9JF 87#coٳjI8q~&?|W ݻL(PHFXv_=X++^Qmw}.a{?YY&٩(yQTcbZT]J1s?yivNk;XOg K}IIohx7puzE # WatXHI%Ge,->ë3tzIc`,NRzp!0(_5BFMX[Z=I%Ą(/)>quspH|vA*,Zql'KXq&=i])D0<=}Fx-#$t|:MK2e㎅\%QPЉDXn3U6[v"[%?ƨ  w_{dNY(IDp^/[5ѮiyIi7jP_lL{4y% mv:Qh UD}CudpوVIꮰϒX(.khqe_^&&VhLɾG_c)19XM۸؜*Q4Im0*P(z`3%I. mRa a0)ilX?"; 7H &8io]s}ЪLxzhP\v?tLPGa7)ijٳ#Go"g9Z%d4IG ֪;P|TΛEF N_cL='oSI'MG7|8b >|~fXl3!ބWA V򤅨u.Af1یpD*"#=I-85T3{,֙,m(={ m/Ghr'8CGNSJw;-͇| ox8Ş&^,/m66ߍ͔S?5p/\7G}I,b%<^cVi˼Zl]Ɯ%Zp92/(r5=9tvFgp;#kFҶk5Fmz5Y~[rˑE]9n TR.Yl`|]{ zmѺ(pӑ^yX oVTX;9(f_KqIZ18̞O{i1l@LYp˩*^ͱ30h%ko@fSSK_&y*df?̢^"2Ә|2R &)S]z̟5殮̓↾@XΒ 0 Ls%syEmo+G%TFCs1t1K{/>{`DŽ>ږ(I/Yo 9V_Nq:~{axc}_M"bpl[H)Ȱg֒;ExΚp KѤpLPV)a_vn ;_5iDa{8oWZknvDcj%|IY |X?r-85=.LA\{e8Wa7lG} Kk~wwhz/I E= 123 ̏Ϲ c}˚IِpŒsx)XQ].ʆKJ$ 8śCF8]Y3ɷϵۀo \=z{1cO3r9ny''QtHmRȯ4i"|k|fcFa%#I[,<̯ؤ?a:(.w1JjI`IYUcˆ,n s3v@6TXE,rK)+Knv>7g=䛮? B Qß,l%O' UNtB ';ijGd#\ˎf%G'+#~ibװ ۢ]Bn{N  IJ@x"2&Oz;xemZM"v?Кk?̿A:Ҩ^b0 !o\Q=D}Ħw%K,1WB6< ^$RJO'uk܋h"eh,G1~AK0q1sњ>M=YXbj&SXrPTփsv7݁H随OVv L6^S`Xr*21NsS<|8+jˁ*V_5QYC϶qZךq/8A0F\Bՙ?ŞsEIݢ*>}'NM-x5br x:tLp+p-Mpo9 Q\)áH"$@ߖRK8Mn~s}m}d퉬o@9ӑڨ)Y l*+K'bYhϲv>I.PEů nTMH^^H D'%-qOM 0L&: ݊XqTaa7@JG@(@v^˒ qdDFEMn `I. ?MJOE 9ՓfRn\ TEӲb)찜&#-;XX[l?Xƨ$ jwF?ܩz;TֵƤ=K/zmHF,ZE:[xvjQj`KB9~hKzF1ZpdLB0nҔzkB:3efۃDlD +5ū*0)`/./Jc]cI^QR\̓焋L ߡ kV+!5}g#їW^V63CpJ܍f؛0Ǐّl@z܄q<$04lj']^M?F<6>?48:J*Cn6ff1a&%n1uwB tRk=}]11V{2H}̯GK}w=RFh1%O:bEqhW"^16=nV-M<yʀ<>SErOQIs; X VpMˮgXc])\8VKdiX3PYS1i6ٯVh#FGgwedZ=GYӎ/Ge$bYïa(6O:.Ҧ`zI7ۍBcsOPNPˀiSo3+IwNkdA gfa`-62aǯ_/4B5x}Ǔ-EGT%D;j4lSo~OGnZiX'bP<(tD%sjt,sJEiR_xٝb^<޸[ ]RUaKucvTP֖C~^&d`*f)k&Cظoe*#f%miFLm!=|.^ՑL~oiN~(X-EWCKbױocRSI YbD-6z+ MפH{fdoҥ#^?oZK.8fy/ r0mC&acB)Pڋ6l{r*m^"UN G'>YjoD"~/p'iR0!ٟt${ OcwԽ",WpO/8MhU=Z^ܞK9'/܂ZגLv,w4|:Oݛ8'1O+X7v{`nۯjsB:vl _Pmc^ AvfE bz>o#.*8Væydm姜h>!kᨒ+!0h7UZbBefNG ZO) ؎z<r&16L?Y]QjF_.,!IyTUL|+fCH >RGKri?>mb3I$$5E9yݴ7~܅!Qy_hKwYb1WRgl4/GȚ7N,TwtF>ჺhT΍6ulf=7x&$kTOJg^oɝ [gOЖCqi=,'>c8XwT2c ZpؼK)Zㄥ3Nc W! J=}0^zNA?|r{>6U\6U=ɏh,4'm!&#)}hf%#n[yn^;jn(Ty7+Xq!ś26x%LO.=~2A&IkHn=]& (^ Aug *w߾v،X_Z֟dE3?-U.\ \앝kRiun8e*m:ų2Cg#h Ջd1m Zvay5[A|L)gbkoFgI>)~r_c*V˖ŪtdbC0ű /6%:Dވ;ہ_ڐgӶ5P;!uex)Cu($nq){C"[rXgzD┆ M4oTqu*c\3PokK3ԁC\g7;@t`L@_޺c]/o!AY.CQf|(K|6?d<P i٨T($/k'{jm~(UJ[cu)N19 FvH&nE-h/ J(-jek:>%OW$ПYDGT<$!lu5CaL%.([t}Q}?[) w/Ǜ[F~i̕<)b֙k$zpL}Ќ'QS (r kAUvswj|+E^8AjO}|/ t@őŗdrw]x455ӇLˉ0Xj@;dXsO· Uۖ7՗;ѓ2 _>kxz4ZT@\bǏ}3t[~"9RƑRCUdxEpAqi gi}jecn˒ =&ò;IL~LrMJ7I@[C 2vzstdVqḯ:g'jE*w)&-9Ѕ{hO"f /S Jm(C\GEmJ;\csH=Ϥ, &p'‹ ~p&SiQwv8d@Rן/O.=ڟ9M~'-Q̴+`:RaI?f4Ƭ[P]h\g4ILiKxݍTd(E&S:QCJ\[F`pㆷ}fFF+M1N8drPH91^twk.1P><;~YO:HﶖtOSw%{Ǭ OQLϾ]e^:":NPbU+QѻSHGglbW-UFIIy*Bi4&x+sykG^= a75a]o׃C;p< x{[HucF=,MK v ՕW .OB}`/ |sXeZ4D#E@tZk鹢pwfda>pAҎ'MRe[Ikc&Z$XkŪemOSGhW ;Sij_9|Q a Lj a1IJ|F_ruqT=+߸Ś6lfL'0$9fD'&Z7DTɥɜ9'VkCJj䆀ZI7~IrA&huhr_|yzӵ6: endstream endobj 379 0 obj << /Length1 2190 /Length2 17130 /Length3 0 /Length 18440 /Filter /FlateDecode >> stream xڌt/jĶ8l;ilVc6缧߷ֽk֚y~YCJ(D+hdcvec(r`II-’l;~D?dlNFf##;m"fF:5T<( )4f}GSՇGC}KLP::rӻ[9؛Q\M@3WY}+߉MEV1vtѷ>f@k'k#=7@IB g h. ?!3뿕 ml̬Mf@4# @/A}K}}g}3K} *?wvftfeH"Z XY`OhQu7jambgc3k#R0rW6sJ[ft200s2v)_ƕl3"akc 0Hef pw흀^d7ed: &fְ7sh1| #?fͥWRRQ;l\̜Z&V#3뿭; ?6Q ݧbPۖ+7Y Go._Wyur} ߢj s%?v@?E4s3sɛ9kTEWk,ͬ6f-#}lpǿYoֆ6Fm+@^ F@׿'@OgmH `lcW?XB;^ЋAz vF >lJA6eЇM  ^TjЇ? 3>b1bqȬH+zh ӇH?_4!Y̲ŷq??Y>*afkqH|?J`Q"X) Yۏ%݄?FoTz7Gt9#:GQ:8~]3nLC'DmKt.r>T ΐ%Qz,ٷ9=!@SVn u#X&x8n 88"XVY`SS$i|Kkm_h^%K4mJ7Yl9L"HGZ`bH̷Wzkr(~V9ʣkɻ>6%![esI.H ihwL9l)YɗXҼiy5,LAy$6TPvX9Y\3u+*^7W4*9zNFXGFnKw}g[l!-5J:Y_fGn(ڿ`!#4wt, QLIA t#g! Ju!iz !*)D5v>0aФof~>gWL>0^ bv/hopAV~r7aZ볮2O}CLpWrŽ5hi!x֟NDAȘR"GH6 S<ʖXi[ڄk +|#Mrgyp$85ɲUѕ4FlȻ50  |T~˽\QvzǃJ kei Y4m1ڬ;>bt:&* *M zx=V;}ƏOEx#Vvn{4W8ij6#J+*^>T sh)Vv+`A ְ[EFKd^tɖLT7rx2*ؾx}6~HNhP" 3h{WuK=`xdhZۊN4]>Ec@.$hh)4UXWFl5ReDYѲUE'.r-Cb1i@#YpX øhi{{ =#_eW1QxL4>N6fqJaL~ːN&C^_ĨYǑ lH۔9piH<$T, S33~A-8ACde ~H(C'Sdxn]X*ZYʧ&lL(R2!S_J dvZ?`p6CO )2:㦓%ƪbx qĩr̂461y_ &gu;@H)l&RF0z v;z/kkrR͜_7l Z/OzPm8Կ!.pTaJ#`Q7;|}3I5u;_ G+@hv$4EY8EK'n-M2O<01$ev?@QvfTyAj|ZA` YWV/߳n3װMu7uÂcqڔ`OԸj2N.0r葍/e5ZG J#pPS@<>n.vs`of6: V'2f6htkV-\9 +SWF XIgٕٷ__p5 `8Ϯ{)2y@58(t'굮h3z9) xҦA;j~djLkunhHO_Yf2Wf|O'tE9)Ge)>' QkV.Ӆ~ ]l_5qC=.1U&H'0v_hp|y\*Ujfߤ_P%د+Cg) Vפ[DcAjudX0U/i&ޓޛYok8!_vmS P3/y0(8GQM6܋wI8p%1ŠOAː΀]b)ԫMB4onL7A+w=EpU|-L81^eM&Z0;:alۆ XDaXl9_z(a6ȮC碟oSR($#ךnjL hͮ?)qN4hP7A]<̙aJh*Z8Q]7 'e #\oj/ uC3':Dx8h>5m K: S(8 tGH쪕J ~OqS( y*Ŕ}0Tb#_QQ;i` |xiHX ܏w, ,.p%E6uM֕:Dgcnj_4pq!%.9B}}0.ZѮ|Kم.4 ȻqSA reOhǕF(2L,Q3{l4/]e 6N07[Ц^Mo®`ߥe[(U nkֈSnBf/{]Rnec5%`BU]XĻ(Ʒ2j+1oY@xlu Y_v.e77|ˁ%EWThhF4.Y۪VYuQ[f)O<%vSp0`s~ F0Xx"EpKpx.fK4(v %Ɏ-L ְE0\Pg)046|h0G"O"z-l&(~*JLPsnƋ6 O) rHD0 DeK~٨Ei5^pȒH@)++{=<דBju:Bj }*ЏmN}"=rRhLK5 V9<>$.r,0ֳVQUƞ ƈ<ԥ<│Ncg,wp]]5)}jjm] m)ӥEΉJv04=]5wkGP2eՂ\MR $ b[h)tl|%t3V˨5XQ:[a{˪k<$ptz/V*܍ o8ӵ*B57JPS<5Xy5g6;O">|'ת]lAPk}f2mh t^ > τB ,rOvyn5h";O`U#T,Ģx'zKѬFMׂ\ Ê]NƓ 1o8ޖU_:@X-w?$dhX*G-dD)8MKįdnaӭb1ػNlՑ"c폟 pLZ|\3V*Y;ne(~Rx=\JL+ݱtUkoF^Q=f~ &`~Ga͒TDtjG 9 ù 2-ya`-b|N/D]lCN;s.~ɼt[jrS#ޏ{bRЎ,$3[d^obi秊_HghYR;P3b؜YA;NRG&~koR z)?x4–ۈ{;nŴ4P{"M~/I^['lZ;@_XEv`ڽX(}zrYgp,&L'T4~tXgTPPl\pWOߒ $󔓥?@R5hB$/.wdDo:Өn ۓܒΰx}^s!6:7ftGa|պ^$ȉ0w*jleQLrj;Bo{ϯp- hsaA'Ef]Cd y<*mNZPPA*]Nnw~69kd@49#i ٣XvwԜ&X>>hFnh3iB[ț|\ j$ :_""/0h7MӃ0}3Ky_F=,I#qJXS#=: IBSwY*iZeoȐ1rDEdbEËOZmIcw.Yp刺|q(':(B( ,~Y/}\g62N0m5s+۽{^m?KO+!NU  9&Vu{CAX(|H"XZƄdM%ּ2C=_K{eG#_yĄx7xFdmŇiN@No@EŹu{F fV-ȮS:e2|u˴n3|-*o1^~bz=CD q=p} sxz,=E%nj;#TΏe pwoaH2]?"LILSw-15?2aXJ$'3!-x;oeiIP¬$7[56Aβ;| o *|,v3J("n>Ze %=KerИD FV_(͎&D:䂅~j!J+u~7> onEF5LdBYxQ)>W=|ȑ}?q^5M.\ݷ+W%t1C_R h =5~Z ˵C2 HMi0RɴPLeTj/ m.8axD 彩< ߨs%;qtl8(M`Sg1+{l*c0^J?| {%Yِl:(# dWKDjTJl]Ɔc[̹<L[Jqy:!'dx٥5+}w1dذmKx:CmӎEq^E__9:1LL id^  z.}Ns/Ú׶g=8#s"6+q:ؾ+)?=έ+I?D"v)k`$Vv&%.O_I/)}}g\d(`P]LsRa|ӕ;'˨N;z'NEcHBF3繕̳DQ s Dr0udQW֗'vNm[[\ j2Fm=ìJ-MXeֆtKR_S&ҭe= fwյ׬)@/cb_S+53FbLϾKoez-I0HN"(B onG>c-uۗ凳^'d , LѮ*Ny^ba&ȳ}ּiw<$ A@A$ulT#9,%e9?;`/ /^A9u,.7zO^  4rI&n/H4K{9"ӓ-s;Y@l 'ZFJ:P/v>"I܍5c 03bX!o#rE0s~cjߠ֕Nzqmt]j̓\Gr wo1]-Ry U"IئN[%""p'P"*"#/.:e]t44mAs80;2͕0;A՗[_ YBZD_AG L>;$F&gc_]9QpݡHmdSi(3X5 ]'r?h8 Gׁ#f}U!&y]-+1&=U{`/c>jhÅo)Xn1SC_84o1D`+<ٱ|TLʉ]>f,EQ*zPP0C1b e)s=)WxTvr⧬dl-PBuxJ"Aۘ^&ML rENQ]\ԋQ7Eӟ>wPXicvf÷WrU%v\cv3 ,8ߓa]^\ې'Y* %fX&a wЂ7th.qR#\&iPJFi PJ).#e_{9l|#Yqo8_)R4i5*fȍA0@+X2=)v(̓"Tug1HK4J:|v#c !,#WC=Iõ Oj[XХЮgHp# hn+OKޥ}_%ܱx/!++ u|c!H o j 7_dT%j_wD2$t03rF~E0~ /Nl%*),L,C[VE3޶*PU )3DX6[>SYEvr-VfDZN.: H"i`W HW~ROq{+mBOҭHT ݙ& 37eߡarZj3؃|vltíKrȂԕGu_@3@ C/쟿R?+@],s`jm5H5]vtNڒߥnhGU0CI]LI<Pԝ<@EJ LJw8Q?i,+pL$$:sb{pOLóe۪2'C1ooh?kwmۑ^QZrdBLyάbㆹ;mS-B^XYR j|S.ܺ9idE?ޔ ckRܘUg\0{m6B0APY~nyY5?E8ɨ~a4hNR8Rp7* PBqW᭠[hC: O(^[f:l0kGS}WeL?YҗFK",Wm-:$8A}'=wt"U/MŤE֪-DsyA&/ȊGig3QYYɰxx3, |9RT=頄הz<VV׍ͺvIkQV{At `U@:ts R)_;bd;Dё8,)z] Դr/D@5 M q'b3O#߀Z_EZ{*ۣ5T Ѻ2YH MrD#*\urJF p[c`O,i?@PH؆pFfTrV|+9|b~5L}fAHܵҐIWka=$0vGvFL]'/,x?Fk!6jq 4 x pAj@cap',`ք(P!.8NMj87S! ϠOkV91Ft os4be=Q[26]$VW^zˀϱ."?E t^Rg.vU|4CQ67d|gbT^ǓGD q_Qלwӕ.iPR湐&BD=ZgKBz-ZdsZ#rړFGA>g _zh )O>O2'.AwHuS|C@JEhGpA 'P ϫ7h bЍ-%PˉrU# x@֪Zd `V 3C3LA=Xd^j"tlDύܭܙ+g!J1q,z#i8U'Vh_>PtsN(Nk7Փ 숨n:nJݵFν~i$D};xӅ4A54N-F)(ȖtTw?g <Ԁm̹.U/lc)GEpjxf1y\ؼAc@_xM!12ң*ݶ5뷜 tA|5=G[ʚ"w֬c5s-WQ[uᜰ wp˶^{TLg0.$i74[iLa냇ɱ=x1p=н!8΂~? ^u\pߴzT[cO/3j{AJy[bF^vŷ{zO34yΒ$sPa(U 1[N%Jb K# D3̙&" ]Tn~\'$Dpff.p? ?΍fLeBlqӿkl+"_Ņw_;NlQ_{7mRa\ 9 MPTnXzGI )>;>j(3)Z}llJ(zXK1Ozeyz]^Bݥ<R_oOLקtLg8ߧ`R7KV֟zEsGsa=]9n^yPq$D(I~<_ {5Q%ctęn}תK7A7g<$l6z9N-Ƒ; Jrr|b@V(]׌J1;6%QłؘJ, BK}KI>J|k#lbZI|FP\8Om%H&s[w f}XoS3erHcl@D7ޏAm] gv^h=fDtFǰy!&+D3:5YI~qh_Sq_]T gAzWآ$B~9vOί7f7ʌHxL6&}#Ty7kV ErOs>wsʵ.5swUo-*4* KȪ^?aYl܉4+mAxyN=DKs; '䂩MQ:9{;-#$HDA7#xYv2q&*W`_S 20SOT2y[.O; .{u_^tRNs(1`|<\M%o4UTYPl&6na3WlF[lq<ȮvRKFvҢr:1TE QRݺ%!}RaVl@t]q{d-y.ҙ27B͛] 0p$/kF3S&YWHr$}RNsfr&r=ghEInl@~*@[y2&Eymq%,:O8_CPeOyٗ?ͳzt b}s b]Vkxk'fNhp/wMehJ2tֈ''B"3]'WX}6j%8|rT-s-91)"}Rc~e/xg'} s9h7[~ɐ;{IfA&:zzc=X AYy;m؂Χ]x tR1}[-i|RإN(_yJ,":CVny&; 4E{ތ\X^E:lm(G cnM>5y[S(Tw@k]f>6KΪ%݉2( ٕ wfI!/,N<6sj]/:tEX4նfX'ް ZLФ&w[3O{'m돵}i~U2Db9+HMdلeV1 q5: _vs|N|/ 5Zcb J3|WaѻBܝ'`W{K\%|kV:j"Wu!7Hɽ%JH 52fBT|g|Hk;:/w4=vZ_j8^l90k~)ߝfK5FljmCf{}2xt&죚:!VCY`UP~i72V_ױOC;9r:6βZj6?:#ߡqm0 Bx@4i?~)ʭuC=1NbKMm=PpO0PYxiYd`uIᄑ6"8÷6:ty j #M`iѰpt2{G(E!uJImМEa8V{W༺rzn7[RX$&[ɷ#"oj ׹R39HCevwZoZ3p$xi+ JkWA)a&m*NxߌdEx0@pc9DpIL"c\ bSqq;QG2o7.# #fz/waT{B|_dEnFY[jDy2 2|E<ǚү ;ܴX*kҿin.0A Ύ> stream xڍPZ.Bqw+Kq,h w+ŊK)v9Ng$YZϞ :9(wadeb++XXؙXX4@.N =N@ˋ" j `errXXxcvH|r`{3"8 di?G-/w dfbP4qڽd43@@ A#`dbve\j@g9w%;?1!R4@+.n&N@dw~qq7:^e@6`s9V& @ Mv& {KPR`r0L:_M>lML_ * % 0y͜@.L =2r͒`;;3$@N@{wgg6`7{ 6]5A@Yl^D,.Nn^Y1NK[҃`d|At68=T7Bde\@K=_@@{ce5bfey9UuuZdb0qXY/b?|e-޿} ~\ Egd1{b^\w\mmmћ؁lx\W(_`MSWhrZY6[l4#/b4WY45dT;~?0FV{ᘙ#/ﴒf`\c89#q5.X^J cc&F .d]H(Zl?vWS?w~RƀE5~!FI)TjHEi!5peA+L=8;?PkЉ̸e/k!%` 5N:ŻmD@5U-s7՞{|un>=j(ۓڑKchn XOzMIwX -aj/T ?C?mT/)!,mt HMMj*z `曵dBP+?~IGKZH{kڭ'g^Y^CӐ`uYOw)L7z\Lh^Yޏ;-$hEyJPI<fuQУd 9r9915-zmYsQe>ȍ(a Vp?sW?C I~p1(Nt{[ax('ACv]w.L%DPCGllHh `!gƸÉ@SgܰyA>Ih7GFofw+?C,j+((ȀS ߝ|JZKFѧ8jd,& He@9 -Z>o7<m*mkyF 4s{&"ޜ#TH 9=);ScO8 i-nj?F|ZSYi1R9AsVb-m7Zֳi P,9Cǩ+ҚbKCJyu-NY-ú޴iZ%D4ƃ_FB&[F%%l4>!piN@um]~\JS}\G.2Q{E~*H?#!#_z Ck tSXE &r]>k'`E fqV+Qܯ8ڭR`L%)V ,XFlǃi CַӵXfXe@nB"|,jzi_k-I-^rumӜqQzmH-L/Q3j?3[mlҽI==ҙt( { gےQ;V''Й~%Uǔю5n%-nϢ7GFIߚ8 IIvR$ 9hAmG=0A2]L!Y3hUIc)t Fyc*6#$+>ոP&ane"-SVԥ2jj7qH5y|Pmz'H@}Z1Ft4g_h"ѽ͈ At|p]7&)!3YG5 $ [#p8~Qr_v{ bd&iB9`DFlF×CviHhAE[f$l'»Oip^gL1v=q+c쎪_"l[wh)?va."W+ƚi ytY* 5v&a'5߶w5;@JaI^֪u5>wjpڣڰm>߬N%Hċ7>or=9j ѩ (CC`D~ljb Ah[gS/rl3U[՝GיGA\m5 dÏc>5ot|waTr42/VΆS6Tz/߯9st2G/57JN5^ȁN8,=ZUNWHr\76{"h(\ c#t/1'P;ˆ7A)A'O 0'jCEHjG"$ Ny=΋"zsbÎCi!Yqxb9+<6;~g.ܑUDJaG5b=agKI^n¼][ŷ'zb!Wno΅B{NT'YL߮qġ\3?9YnmƢmdps _k;h_Yc&GG zC'4@>SBS* PZ2 Q"4Sc#Ee]MW@E󂮹0-!ɀ$ܽ(_jTh; !u&)_DY:T2ҰØ5\ti/:U@à g&9Nѥʢ벍g?fb@߽ jW^յt"|a^hKh W'mPW{3˲E]9ҕ8߄&&^c'q]tM22S5kq?ֵa/sElΒ?,I_sNƿ]TFHlܔ9o覱*|9r^2HIZ d}mTy<y6yJrⰛBeMpASi'D tXtz`ieO24#lyu!dF~V%J3F F/Qg>آ1\ d<&yoF;9{%%Lt9 䱉qT(24&)38c’v3'*_iM?mI*}J5$8>,M+nD0b'e5b$2X`-"' :{ Fe't`pb mA)Ta0yz睈zp }7+$?5e'f)snt8RrǴt|5xW2;XdT)b(ed=c=m{qQ^oaM0O{sy>ل<][ O~0NhlޯaB:*QD V$ "*ԉߥ^o؞2myrmnxھ4l1E7)dƖ[KB9O1;7/׫:HY'}c>q#x i{4pQ2n\jsAħ&&e`8iO;[u.9wTZC,Qx\ >:%HXU?Ǧ n-o|r<aPF[tW )& /)-:Q oh?>^qPJM#:J&rhbdtwT! AګwGY՞`|1ɝ0Vd}I\3'b&zژSZ\rkKyskeݢ`z.w(`>2Tl){/YLc7R]<(lr׶i='}DlHqrG~Cf0⪶Zf'&s"ʨ<2$R"fn {]J1%_'ƥ0bl{5vn豻]w2 ϹA2aН iʂ;pǹO6&uI/ ;@BTOяH c)SZq0Ԭv)'ǝ)sHre C<'K?gD+5[+՚Qk&3(;' d)2.G~w[Aqq%h;6!+]{W[3\%ElަS 0LuxTfۓܷr)6.+3dgCX17ebL|ҁϞ`X6AnQ Qgb KhAvj0Lu̔5+6֤@J1!Vsc$K^1.<;ZHOaKQymҫ_[T[wC2uņn3Ʋ{s*3yTTXm$8RpЍ ѕ imj+R1~R*߾Gx52YOڔ.EE~c0=1)3rp+llele }FZ xMB3?fmg0-S3w*~CD0>}GXFyU3@4锦)@0eqsu"UyC{N=yvۑgd5-(>s1']f?aG)g0!?Y~f5,^/Dy!<*û)߇ K; <44Ve.y0,k nsUM%@e.o*YPBOXU;veڔlyv*US65pC m{p$#9kܪŷ0:}#\3B^6:0J;WR11܂\5% paSm'1>Fџw39 F\'ޔ.#1kTWEL{ve|&h5B.^>Oϛ< ƆUjݷK?1"%8o8٠Kuۺg4NkA cT˯m5_tnt7G - bu1-檺HiHxyz<[RإP>RZ& q+ծh ^n=koL#`k Re2A0œͯEa67zdX|JQ ј Z ]f3fipӶ(=؞sSh[zへieAdqqUYhD7ږe 2=9Kk&KKlܲ{؝uQb/4isYm{S4ԥ2CO3ɗۀCwH wڶ+~'1{Twton+[ʰ6#S0mSKDMc+OZ&HHITouz0-PMٗ "?lqSv;; \ C&2;lBa4@ddt,q}99*< pOwF'ˁg),3s*~yHOnG}~XD`nQe|UÛ86kƕJavLg\w&|1_ӳbYc@#iO*Q;]Y} rx"?t\$$_y:տ qp֤l::K-7=W ]ڝ AP*Ʒ߲,4x9(ɿb%o=R=/V wuW pY2qԮIKI\߅^;RF?Qf>Y~N5=ȢaE ŴB5kGhѻ$g?B➼-$ C_j5{XA2Mp/㕦׳d U'W]Fa7 Sl0~%#g5x@u>ōZNhnȷWbb !%M9%gYór#xŰ g(;oGGг1O'DKy(4oؐn9qUYCMf;q-Me*t/yd;c|^'ΥSv|kfr8q"̊ȪlŸJBTGa.:"(k(Q;cIXgpvһ?ߔnΏF~Nɽ6HWI<%k^9mΗV4CGq>.JVoG.ɇ7[|>W冡n^?j/h\.[;N$L٦jZ""k9_F4xyz^ӵt =%C?t-?!8+Ǘ׆2ȅ+"bVbYuR՛H/[Ub(, N%&bw8ʍ~I&oOƓ؎wĴ䙾^Y^)Ԫ>$eWa_Ghg@;Dm&N]ҒDkmF+ԇr-TvA J'em"i}) <fM|UIKC߬:'ԯxu # ,̵Օg4,؊;Y0K=fm= m6Mlh%Rei;ѡ:-T,AN Ulߡ@IUQ>__j4y3:~Eӌ.wY&>Kppe!*־6ww41Z׋[}[6ύTEp!j27gYF'S璦 *Q\fFܴN'K;sU*J!i6n)pc-A2a0Ingvv9ʥRCRm"8NrY&8VteRzc7?m\G5Sjx'~* cS8+(,y,jAxʯx#BIֆQ!s^s;*%\)zY}MM"1?`HщV@zsB4J<[+u<' naėSbT ؍EJ:.?uu:B͢j˼أ֌ȗ)K6kIQ[;9:J'/GTu4ې:q+%Y-w ENMH;]EO4nf7K)VtPX#~|nr5-1-ZќZnxy Ҷ53"'޸nܩXq~ab;a?q6:i/@єąuo׷7cS@w<_?&nMF71qrDqĹ~Si3Xh7fG7Oh!m6t!Ԉ,2r}a)*"Wz%I, ąSq KEڏLFw Dh@ئGP|ֲ˕#΋i1aO"o]vB*W 15lv0$h>^w{H7'.\D 7{ ۿUlK/Ϋ>sL;Acn\,ԏx6 MVUHpL6c}$_$[8x9餉K *+P:ZHZ\W*:' '6}'X ^vp)@Ş6mt `aX,q4M)=œ[#$Sݙ,l"L+;}ux"mTj.4leBv, Eg͕P(}Re($UM ݫZI8Nbҹv-p@xDQвtsm+NqH{LO5-']*owE)Î_7dn)ˊ)]:s{BwRp`n 9KBV]aE aG7 tv0uX-m#Q %n6" ,BxS^kP-y"z)$25[) FrP+ ՞wXa` _(ْn"uMz aޑ,w{?MQo0vUyW%; 8b3߬P+1 `- A_HC m\iGR>X%R84e;aJy(fL&||ͥ3Vp:EB%:@曆DER{V?,gMƜsENI%LL!Ə ?טj&HQ~%7. k7Qٷ= ~UL&"}Zc=ҪyPUk6)Dʈ i"N{6$K92mo|uD8}` -pdQ)(I^.{%_}qb}Mp j|5,&x^F*40VP]`*E݇~O: Q"\@|J(afqLR,S͛Wkw k1u&uK öN[h֌F,.VjEKrm ZU_)" 3bb2J^(z瘽X?ԎsV$bud)+`ĐMvf5O1s07EKZX endstream endobj 383 0 obj << /Length1 1696 /Length2 8568 /Length3 0 /Length 9648 /Filter /FlateDecode >> stream xڍT.L⥸wPhq$Hp+R(Zhq+)ZHqwҙ93suZl}~u-)+XspsE2ZZ@ `00hC1t.T_ 0(0(@ <@0,bP(`W  ?fK )G `Lj { f1[8Ià s`ax@M+l]2Wi m[ -5<  `룉 xRT9U$jowYva 9:^ ɫp=7 {  GRcjqrB~cV20GG0;?Y ^\=@aĥ8e<0ـ~ (`OK[(kq9A?> w077 b Xm P?wx d8aV0??KWMKG_VJK<>~ @XX / o7 _iTj c_#~+̹1h< o/9ߌ3IA\U*@ssUV7*A qWy'Js^4s[@p}?TrPK5\\@^Yp?1pqBaGcy~k 3pI\ A?H%7p@Gw\V.?e e/nj9 //_/oX_Fn:K7;z[6>Kzx=iܙ G]>9SYl#מiP!1܇ vnUlls28 /ho hWx1.F)nڊ:c? 1WҭѤ7^kF1߿g&)wW ='%Vz0.CQR$h!ghubB\#3) RlO>Z1LH&!n lA.kNz6,=KԦUPl&zꪏg E1h̺O[Ct39 w:#h|~pc U Ifı#0$("x ޖ*㶰`AN}l{'R3}h2W :Xb]p$Sx*@.䳇$BݼdY,4Vau4O'QU^ )OmBLPXO[5+i+AWFl,;U OԘF?̦}Gc9$ng9φڻ?Ѵhè[}=t(`GorسNbB3 rlF^nynsM>4Qo6es %-9;GgJSΌݘ|T ۍӰ,QMgP _Y}=w7klm?j{hV5'7n­u-"씊k>~ Ӳws {ZqtW<]*nEk.+`N&ģ!,x)@PkmM:/)Z% \v"._A^bwib]lܴ8IDh<OVy 1⛚ 㬗)9B`zE ѳ>H…l\/|])AXdٗuzYZ'gP[<[c}1ȥ5ΊJB&nBiWΚ;me ՙ2j羣ڼև &T*:}]{@q ?5屁BhK1ƨf}GaݳfJA~";e4(KGS+¬.صZ:aߕ?D9bs] %HֱD6Fqycm0 oh ~`IHiޗ|q]*]FWص$ƛ?J"\K$%X#`VDI^Gi͇6r& spsDǁ}7;wu7R (]XH-)EsS΅mWKHL&Mm.> x`KAyvxp*眻>MzA`Y$X3\IA0I,jRR?CIL:%CIR+'HKkӾ,7[E%^\_dFzQ6 8 DRsģrϟZ1(M15 3`?^Jw7w=WtbZOJ'sg$-x{RkʶD1DC.\?\pwݠ|A!f۶$}M8>84}lڔAk9ГԹSts?i92,[iZHdnl7*W'a^+-H [m'/eӡ"4V8 ~@nZhY!qYT\R 1kj$)gggx?;+ ^HX }~P|I@-ŖuiS|h\LUe7_ڗe@y5'}~rxG]-%>jӯ0+BhmDf2':M_ÿR`ED`*E4|~BP} ֖9'Gc.fbۼڱ\[5u$b.uցJ {[F+e Lu>1݃tq_MM8t#vk'HI`\fȞh` ewYX(Otɳ)KF[^xC~KZ=^n6j  t+3_}$R0TdbƤýx.Sb'a]A b6vn_߫H2zulq&y*󭢅~ gzG)s,C*c@UdIh!XrW`uOGsr2v\u;-IݖnDIr[7Y(O?Uj\G^շ'KAZgc‰5ߢ}T섙$(M|IPHoldx !|d2M/̫ xFǥO> GI1lh!"ps{N! Bm:9@ZmW8Q0$Ҥ C~3ͨ}QWz~Nd ڗѳF8s4q2Iƭsg$@C ? =s09 fCs¸,{<óakN,'.©̑˱XI&ֱ6Ja92w*;ĉDZ7ߓSywΕ]:Ax3KXVXFurd|>)n &^-ڧϴw_% @gZe:bHUfT )5QEKeN4r6x#$ٮj_Yd9MrtɨW [ܒ?.Ζ$[tf:0UCr$W) 6R$eM$ӃxTljbc:1=R}(yhO)ո)1R\֧Z'* H0;'Q+UQkey1Cc%r8K0|+ uY |5 W]~`_tޓjp'F4k7w`Q~6wUTyo3߉yX'FVOnΤB[Lz-OhQ9Ns#Og#zf}hkEb/,&S=1ZU7ZayzCfSRQd]5).k_K58SM {ߠgǩC"k_]@m'/;p.`CM*fR4_^:ȶ%H&toyc#꽧``lt}j7ڟA0U qzz46 S'ß΂iV./ʃ~MTSjpmW_a2NH3̞Z_#ly>ry%78\{9/y~x/t %ݳkL ۞Bo"F2RL{]o_yP~H-v}D!6EmwM7PC.h C 吾] ƳiB!ӸoJ^HSȍ^TCDԊh W;koGjtg/bd0`+A~N&O1iFPeZVkDc.MxmoBݢ6n*WluDj* tuxW[5c޻j0ϊ3ӧviXe8dUÚX5fH"F4iV #fJ~Λ;1ߕ砫qy;\e[5'T:?O@E˝N~6?l4C9On9U]QD'@Ī ڏi{:̤P[isS ݲ]&.2\4;/iKؽ0ddc$}=#|'D34b䚄rqeui;i,TZ%v4]۸7D7Y+T4̙[+{THбs\yT9Pg /#93yjg{d??AX: ޾46{MXeܴ>ƈ;[uW] 0'-K/7)Ѯ5;+o%]KX~^v=l[34ePX&yz[Q>JJy.яBRޙkJֱ]tN  l@ek<4JNv.?Qh <>rکϝ33N//b1q453w:*$QM^MZa ɏEXh(Å)MBwϟ3MH;JB7_˜Eith&Wy xJʤ&xEZY@ M&d%٫{_7M>fJkfA ύ4s)(dp7W(he2ˉwD<VQDia{_kʫ/?EE[]}^6)!_T޼hdF;;Z(a8S4a2`D#=͗sv%.7QۤIb%Q[hj| D:F_g"o J$^92@0e'(aק5"/jP z"lZшJJ[Gp sd)ދN=C[y :4 W\ ~{R̸ (u1K^`@5ϭkkb4bdETJg0":p`}ps˺sH~¹g0{,v K>|wi!cwM;*KMҳ:ة̓d8a>1{GNqɯzˆNߵ2/ྦDC aqn4 yB*rtAS\>RT[iOqKj&UxixNNusψ,چ_0)k]Dز]aCPRSE/o o:r[`"йqQiZlB)tKdKr]<2˿Gkl \w-˙ؕ ^4_lh" г*9Ð>YOBϑWΥn7D- f?x* M&4P ](CܕJaJC[fob.IiJzYk"ߍùG}L` 0,4A*ף:86 q{8q>3;ޚJgz@(KHUR%&naqȄInQ/2ƦyMgl}$|k,iu?y ;[^mBXxnV$Dí.2}AfhC(ӏ_vtЄnxf{hX'/xga,C0z/&[Pɺ\  4xÓHQIWK&/Qd{5 _7W&_{i1|^Jm"pYWp=:1)1{דqwuȁl8Y]#]tD!ť.tSVǞXyKvD`uag E ',77.wIez:w1i?WW G iݽqsX1f69|'.KeoSuwdW{,1x7[1m jy3w< .pyh{p J`46=!UU وHDvV7q::k"2sd WחM"֦ץCn!+NʼnpHg(bͺ)MDK7nsL`16*wZ\z{6"EѰE\"Vix+!OxE|j9{vB9؝Ex(#oQػzbA2 %9q|G -%~%Yֲܒu}wU$w4%@^t:6\b!͋wV=( endstream endobj 385 0 obj << /Length1 1401 /Length2 6196 /Length3 0 /Length 7156 /Filter /FlateDecode >> stream xڍxTT6 )5 HwwH  ] ҍtI+Hw{y}kڳz3k2"l 8W(P20@!> PAC\ݠ \! $ʦBZ8@ A Po U8 U w@} sDy~!P0! Ψ` `C!Ht@"]===@n|W{iN'ЇA\= _#Aΐ? n9 vHO+2` Pj/_ +ݟ_ 0{C;( QCz!y / @Ń<@P:,&3ts~+ j gg?E+wo?Gx}^Avưuw7CC`P&!H0PLDDXy x0vv6fuAPc@v@C} Fl P8֨wź( >@1yU u4/< +(DAjp;@vQw8G F pO@0"e_)`? @1RCM IW b uwoRh^|١nP/. v5ٍ~ Ctn_OT_>N]YW F G5j% @~>8 f!\Porema3eG=+J|joC ^0,&F֓wk {u3*?R6A'KemHBYԜ-ד9A+iyH4 So!  ғD=zbksLsd0ۅn;΀K4Zd\ns3&5{jFϡqW1_72?~|3П.tV[-RNF}G)w$i<1G M^R,59mZtL@[⠐{B]gu9ܞ3:lïTIQ<5,նh'B^L v]ODI镙&Rc γ!IkجDAT)أOEta .#v&K72V2]5 m&5<|_^C+Lڇ{"N,A Y}Mj—ID.+\LݶNDzb B;hxfar3$DdNe*EF_J7K> >[( V~CW'~Swrg;&OiZ#7ώ*j nX ܭj)C PzMSgjwkC^_~3fRJ9+>lAΖcTI$@]A5r µh7nm7AupXsD2WYWn[;oj M1ݍy3}V̮ʑ\%d3w^m|R.av?¬)F&ȕTK1-L ThbK_h=LKaHɩ :QRkcjBBf>5ьO Hq=X;؎ڵ%zy]bYڐJ({CPСZx٘MYu{ ͚:!$Wt_,x$ 3;h\Ȭ%pͅzSJ- o'j' [ Fn=k xGpVEgYBU %";?󍘴$Utp!Y.:?{`1MЎ]{ejkY 0ãZ8S;7t(~TJ?x>"Pn;"}aĄ}xi|aw -r-f̂,5~ɭ-4-%gV_ }xqn"À9_"~7 _N,SD^ti[_;6uUFf=950$7. Jt w-o|-'. F;q`uZw @k_.ܪ4^ eY\ a$"?u"=zJF GLz.WxohZ\EJ=NX`s"&hPMvQ$;R LZT~̶QQaf |,dڭM)enjs#Nn-{eV-oK#;A4~~8.ژ#aՏoh 4Mt_,ƂG&+5U޷j|8o4{~l?V}Jk4֚Wx"gv iP:THl+֔#,$IۤHyArW޿.mϩngUcivRp.ws{چ3NsA̼;,{HJ^/9~Ƀ <p7IZUȅ0UHVB?A!1N^E@eBwL N fhJh}<#*̾GM]T'>}5{D)axKu tM[ZD%ndݻ5f͔HXgm9a۸V}nWK,خi)ZUS4;{_T_k,w/|@_WOGoìؠc5% ԉ' ݭYw|ڶ #VZ3±J\Gb1jFGd^|xe5Oc]5g쒓fCk<Ѡ.% qi ,?0|&#^!Zfj:+B=Գ%`IF7b砖@8Ż7΄aqB | meVt4.ݗq 88nI|!tc9?o_ h8UTF;~ (}(U^ӯ1>j?PiY0-)By:_a<7O~PH@}pK2WEڕ Wq(n!4XW5,qMz;X^$6P7/y0srI.ɾFk?T}ٸg'rnݬa{ iof²*ٞ"ּTMŇfW"e=*lz`7eT7fOgLLn/[8ͭd.|zn{@R~¤ C_f NҪHKiiZFiHht>f:O unK朳ٱz^v=-tPɺ^<3S1VG)2XVBWE3]u_gnfʕV[xftq{eaN4CDak];x!7wj9~|%m9yXvFAdyXAuţNX9Ҏ~tv}Q_$L IE'5q@AOExMp,6vf,[)e`" XxꆭiOru0ar0QU`d3ovC7L 1&N/*'kXDcݎB>2GRaw:lO)m8q>s*FG_}Gn+z\[t&ؾUJ".}HIBn@̹qbqrbxxPMy kVMҦi&{6r]e #LevfZ)9tO;aZ#MY#!9ە|a?yiRv6WLЙ3wd(umF5o9-I SC?mիnGr9rj^G.V77Ri> 9I,i҈gfXUzi2r%l_e` tPwS&!#STدpbVq^bȱb"-ଝh]pWK.[cꖐ6Zc:OC]wD ։kܼ/򍞧*1enh6너+8R/qYN8boq&_9%ٖUrLF aMuз3dPl*%r4U3c3+Rm=ؗ* uϴ͛1Ն#pO )|Vv$gRbnX?D*+ ̩߮}d&Y xRH-dW:G  ٯ?XX6њY-:*nB-qԃ1!$t]+T1 /Ĕ,OwMMB&ɰ0wɍbuHԔi􏻷IсZHiop g~Z9|{uq'W yCtA!lH$1åX&wN:o Rz<:FNo(6d7M%V=ʹyoq?gܶ8"[ffi?=.d{LJ}/DeT}bgUo_Č/]H[% }Ⓙ+To`iZU g a1{:؟W\hK+vphɡ&Eti^~վX7&!|"6Z=Gl!VZ!a;$| M T20P8ږ]YdBX5߱<׏~8a?opȜ|F3!=yBXԉ|Gդ'h<^~nn^GE XcG%w[LR9L9<O1NTs5,US{EV.r#k5fXaܚjNiC…Yǰx/IhVa h#O{ø%.Iͫj" i 5/T|6xZ;ÔEyb3W'ާb0l,6g̡Jc~֘Y ͏s'hft# PS׬^"coo m_p XU{}b<1}@ҥC6.^®8s|?A=Kb9!JuljF;>߶ W?޷yp}<{"i"P4+n/wh& m"u)-z[vg7߯zU%i6e0&6S,ٲ'Ozз3ݏșc){_YξNm҉oљ&H_SOn1RS~2q-7ymsz#R=Di~kA,lPjw8 ipJtĹ?x]L%I[q+y|N{KƧH745{yjj4g|d>OGl\Q(l@I(dyƟ ŧi"%3w陴 ѹ2K{+Ravaaa,p_@^Uf}9aڪrt*htȍ^l:íj0Bo#n@5w/BA50+]IC] nvqikO!YZ<Ӈe5-S,Pr~D|JX\Ml\JySX24:ٶVy gaȸwJ+NF}Q7B8ro {΢ʻKÇc]:oRd|vT]Yl9Z6paD~@B;1pf#[*~Tp+\J!% Ad'B[u6x~ j1'kBV,Ąvs4І QW e&der0٥k]!Hbckzllg2*&KmcJASyݾm*;BYRF&~B颉/^{Q³*B ZR7+%zsNs/7Ɂ]w+4luX^ ,sD>X8l ~:7jչX-˥|U?l@@am(YXym|[Pnōڙ`y#gs4#`ڲKsE}?7 endstream endobj 387 0 obj << /Length1 1401 /Length2 6228 /Length3 0 /Length 7184 /Filter /FlateDecode >> stream xڍuTo6RiPF:#6FwH(!"R"HK t<9{vOߟDPA!" aY4PXX $,, 4E`]a9AA `q:G!:@10PTXX_(,P⅀A@p}G',̿X  qŠp/bs9xG w< pb@~ݲrs#h8wB6Dy#Hï!`BfH'\[ sc22@u( Mr:"?bў@m "!X=';;9㖏F8}d t YZ6UU_PL((#!JIۆb(̟nq8xuc-KCq_"Tc,/wCw<]]y~3 GZO,N( j#Z}8 Vm,'#̂" a?8s"P?+ 7Da-(au?08^6qg] $3Q I qt_'H7B $ f :Ѐ_k ٣!P+ Y/uh4Nk_b}P * ]Hz]V8t߆G2b)?4E~L~d1u)%VZtюY)XәT7X9>cZP$Rf##epb7}b5UQ 4~:y) su0x\jeil ܢ ݳ`XCiJn>7J%-&r:]g2]21`@\(uoQb9 Y>܇fNg6GX {pl@ĜXf?#/bZx%cKiTM%S{tFls _k} th=yw7wz7܈Зm)t@lso5 Pnb%BS<(~XRٙҷ˻fygM?`.Ӄۃ>OY7I\fJMon1M0XhGhW Aɚ%T_ *a27رK=G8.%E}c@.w,\?B+œE{奷D߾z6XiKS}ԗm[~adD${2qd6 _c 칃|5u% "pOJr[ʝ%)&(nBla l?w YӺ}~V%ǧ0uPftzrL6!)i!?RzlZ.X`mNܲ%bJb\ )e?SJDIH¾JM0 ʟy|fN<Y' 7%Q!OMfWHmvNGGHM ݴCq!p~/|\s UX:yH\>g !X͛= L!AcG$ATYK+"ˉ%y )"C͔$ EC<cIuq~}|t3/|K-oxpX;fɃ̕6%}.-—ߙrMrjbp#+cg-٬@ g~ ܁ϒ`-|aMƆ y~HG0^Crh݉Ƅ52"QRJzg@*r9Z r)-SNz4j6l|`K"o[oˌ_T9o={?N[{;{CSʚc[1Ԁ <&<'X^KZBp@zVY|닯|&^~GZ7%FxRN?LSdP|CxK(/m tnMmb6r!7r,ΫXFXct_u4SktGZE|*C4Iɛ/яU&3+0] "t5OSgİmG5rRk X{抶;Wت f\˧.8"aPnxߧJGL%Iig^ي#qQi EF_ ~\I] I*hPEw&cHCmu٠Dyz$r#|U2@M es禳Oz)>AKQ$>z*E缬nC~BYOӽt[PXJAr@@󛾍}zvcuVO L95%=zʲ_s5БI=c^^#Q·irD(fMȓ{> `306AvrՌ'kΧrPUzYԋe\2IkjgӔvx2yҚ-ESgٻIX]*)ȍ; Y[1Q(0iK85=zv酗-Ky^.sE7~ټ #[`.V3T`@S_pl&vPRqn ~QL)pĚZábogVɗז{@J" _ȞA'*G[i.F6-'KEh\-Gԩma9O?=dw7USNZ`%?)na[PNʼCzّ3 Wo2j T_n~8c8ׁr@![E,) mCLla)kMLIї^d}b j PUhd;OI  7սW (ك%}D˜pLXGg4xi\š B.$A,`h\Twm< r]”D&a (00rFx%b`MB@aoWG15rE8*r37̿\h9*y@ETlCHDXAkNnŒ@-k&j(l}+ĺRI2ڂ}|=e z } = 7U}liL$;|CNgdډ Nޮk͞@6l1%dz)fQR+|vgWI=m:Oqb,BebK`vU@dlI5Xr2Ư# "=Ji/ƄiHUsON۹GUd{"o`&^7]ENMefxm}M k/wFGloŇoT2^0.ֶg>@܎csf[ݷ*VUc (}&4lmVc0ȫ0dP}#-!@zm?ZlT`ۓe7]B]h+YS؈6&Sĸ3&$\>0缲KY8ng Fr0-ŧdd-H܏7:f<*!]+1l/0jVqː5"lﭷc V~י\7 tHF3eiS┐-gí4ͱTJwBNZ G!@1[(yfuFz-?{fi?|~z]7kcI=MRɫv^ #ٱiow6ʔ BXW" 1x)p^ g׏fIS=+ .2AJlLR+52*qƔZicbHyLمՖ^ (Hw^5a>E/QB T:P*t;낻%v}!1$QuDE$]jxjnv SԽsR[v.IⶽSIC o\Wik,!˺nƆkxObq@ܹkϜYO^ ~mu4M:?No^4`؊R|vasc[Ri?O9Z8KΜ; ^5Jg+dvqnއ|^/` Vn/]ߎe"qDOCrpeċ;r_d5(n{D* _F)p<=h76hHv2_ZM]F2vy5U|ƇXyP2UU79:iTqscl:g~9tZNAkzAynHH0GG'wƴφlT=+vIl"wsxaU1~$UT>>&h}CG#mg+nsu, 5KPF>bSn*H}r թrn~0{#zl\sRIWd7^ĺFI5ŎЭ7ׅ3m1<4Q!;Ś`b>@;QǎKJWxG Yh[H&zv$xsenb޲xF*}Mw>H0V{i._iQhlkk84Bڬ﾿Eܔzc6?+R.'zYЗH&-m V DqDs-gmm/Kd#;f!H|SCȎ]w#3%5K(EGm_e/*Qn㥛RdJ"&!gj64+z Qd،I[ g"LRWv2{}"3P 6}Zfߏ2oMaU[2ez_r endstream endobj 389 0 obj << /Length1 1377 /Length2 5930 /Length3 0 /Length 6874 /Filter /FlateDecode >> stream xڍTTT]&A@ЏANffCACB$D@I;S;]u:}y6*D!qB 9,||&p 3apR100o8=ED@ $/ #{¡@=a Qh /_PTVVZW8P CH sW@c#3aQ'@/8xa ZPoۀ$AKM_!fH iz  v#|Psopjx!"dIñpo8oO!H! y@qX&}s8fbsz:}J%}RZQ*Ƹa[ә&q;Zš^ZfE\oTiJE N)oCkk*fho(cS♲ Nu{o_>-3qcYʛdmt*.>{ǩQdbNPpL{7[8=>X.З%*'3I\q~۱N[tA=>“`̝5]j_Jp=#JHki{wnG.{v *[Di. ;Q`偲6W95\ׯĻDۯznϸU;1cV0+BaV2jj0:4鼐4CRkpD25m; ?>{rKYv,0n!I.ܒ)ڟ_F +.P'SYr-%vye4FE}l\dJX-GT;u:A)J0՝А+IA{RUQnb۹X< 8gIf $ú|.awM:!%\*eQ\zYe@%HQNX˧FG/T?.͎ ]ݙvkja.N՚\}eq2"Gs1-1ŖHr$hOCWeckVFyL$,Y j6KI%鈚;|_y&+)J?o{_4_(iD|7!}+ņU^oֹPPwRgb['9 }z{m.e`JQlE^'d /b^A~/'P)V^=}xI?mT{#/짣9),b|`es[KKKuQE6;ϸ[ A~FmM*B("[Xj_>Ec>ZNW@%O^Lk/R hwF+{u)ݜNd6x2w]{2p CM5϶Wi9},3jS73مJq\4|@XD`n0fnӧu ̵7CgFSݑZK="<7+CB6=YY}XeabJYq9ɝ&RP<ڲNu}ײ2}}赇K5[>8O'OiWX>>P@%{sЧuln>PT^s/_~ݗ553 ^[@;KŸ>(ٸ0Np8-V5NdH!1T 7r<]S|ޕJN٭ &rYMӎUi1Pz)SZ0Fy;J{l֮?X [Xra`>r|R }mE)@2+vv_Ґ}4@77FaM?5S1}bfh,H,8G5CMx9yz"-/ y,иqV؃lQ8M顫%ٟi\닻YHԜǼM1I{u[b#z6=2\pkI2=2%;Qhg'-7~JNqWAV@4k! Oe֙w 3fI]M/:.y8OIPZZ3;j`^3iiW*b(UC,&ޮkUyr-:3Tho9iן7*}1((ocGńyVLP+tFKk S\EmTvUzٝYj,{_McCi0ddh~Z'tW0OȑF2jҔ^B\gsʓ.u룢 MlrMs|XBS.v-~%OJ5Z?WO\1?u>޻[{?^a``ѱ ꉄéC>]/pQXXQqàːEy3A=jpDSm?YЮΫ!!iWϻ[\igAXoY~1v{2<ȭ3J(6Q5Ud> ,x9ým_#_\)B~w{̸ljyj/2MW՚Upm! ܏%z] u@V#w,/'T^tITar]|7W122XmT,)uC?#)[-G8\ͯj|tv]DxZ*$+-CT9J`#&+lmt1JH Q&VAWg|&a+pW/7.T+\--RxOgk,T|{r}bKN 8uv࠹32wS.ó(G&Kgt8+'{L>ty l~˸Ԓ=5I/ Sy Eͯ. $ ";z0ܿVgBKD93#yDvmbUlugt޷o~$ fڜ\(1Q.//‰9̃F2G=c1?8&ӫLlNA'e, 5RGHOU؝ÍR|OCV-蒞 ?v {?EaM;?9x󂜧]r 2fJPtuƐdܐwmg (w] ~ 'š׏ :fzulKS: mU&~Ě,a3zaQjl3*;=T|(͵O+a7x>>p\fP5*_w0j&bNT~Οh?s LH5i,rzRMLR[0y3e5,+/FL9yiJj,_jrEGë'dCiWӧJ4MV nJ&=Z'}t{{mO3M߫ us)-Si >;`wԓdORZ[&Z՟JуLw$"aYC93gYc=踞>0+E}~~1 BӨgb^Wc%9Lx׶zN5t""KLſqt| 2s[yAQ!z'G Õ݀[zT;oI #*{cңt+qݴA( iK+$enׁ"P|oÕ@BﯦIx+T` $uv"Mqbw_S;PL&S`+Φѳ%RLUB JU=^Lg1íК%B65Ѝm T-'ɽ,qoVpBKF"%R}giXFM$>h.dʿWZpx18._3N!z)(RjߵKiTgr% q>&p TQw=3kfJDx jH/!a]ѹɶaD`Ļ~#Ph!MrPT^Ҏuhd 1`I[q#P %92ʘu}p3] P21F|ij:#)s%64Cx?]Yv*5$% z%28KӭGؚGa|wh`Z >C癯dIfL)Pկ$Kܨ< %,t^<1[o"yuqo]t/jߣKS stɸzf\7\۽z@e 9-iА:ѓzz6.랓m-Ҧgt q }MHd}{A}g$> stream xڍP\րq ޸6kp ,[pw,e9{{f}ǚc̪EM^(~PҔccr0#QSkڂ#QkAnNo2I3𛡒@`gge4(1䝝nH. [k[<,l||Oa9\iF|xpq(eHt0C#E.-ۨ@Nu&t*'MDl/sڟ -K)>\=ee2B҈}SCk15R2g FұT5.}ئ,GbB@qLہ!Yv &kj^tYdjrwG$~'2|,m,?Y O{-r.tFbLd"zP<)\̠5>/."ȳk_nҤL\gF!aNZ<7oD BE;EY9w{dȸ?V{@~Mw;w{)ǔ᭘ͱ.f~mʼAi<*!wB,k!4 `&f\бr#'IEȪOG5~0AĠ-HeɩFEKߌGwp 7^)gOvSs =[H~#W8c9Eor`< R6MjoeoA@޾FǤehjSɊMƈ8דe' %O}=1i(oOLe p&Ihy\|9ŨD?Mm^N[AeY_}f&hE4C.A3n/X` \fzoqNv e~qPU?r]RYOl|`&#FQM00J1es*ZÃUiCBI91 FQ|g9ۢ̑dos9CLI!͔hޫ2?a>{uƲdR{˨$_Xc"x:Ԉ)5ׂ=3x|͔ TmX? s|*R2Zi~i<_S]}QYm~|GDroU Q8s'BͲʄCR({2Šx[s "Dˣ$lG4h<0 EiNw""W,vA6{u8uR[l@ާI65=s7zRq#)<5=p`ldL;yJ7zki_gVoSZL8J4҈9<[}AJ\ǦbqHWn1gvwO_4.aj _<ۯ$f<:oYfLdz'ݚ*|ˑ.쐶oBN"pt( ;B]SQAK>\OXD(hӗL#T,8VEܹdkKv%9!d#Rj%P>+4ξJ~7,R}&[;kUTOaўݪDXa|[­! ;? ^%v.¶ah.2~$1A/e_>/C h-HUbi]x se'rj\7TM'P^z|x5~.!F-eՠ#}JL(jNHѻ滴_gNZV馺4ECƘqPa<Fme+^n)%bߛZ WZ#i&HɄ>FܥpBEgҺJȃ&e@Tٗ;]w8I6Gv$$w'U=~~ (%,ew_hUngg $6S>fq ÝnH%1&j8S 呤q8yT3[P \١F6O':AC_"7!hyiY $6Ax5% 8`:"YQ.Do͌wP@Ȩ} 7$?v1qc/ =g".c1.ˆ6Vxﴸ MfpB[MlPGM#;+Xo-wWCn"]m5DF}\I+WTLym4ag Q^[KDhI׸緛VKQ&MR^&PUK]Ϙ_-fJ9G,y'$q]ˬ0ՂB1Maa(qYi=cʍtj 3"HRN h!ua/ϯ5uAV"Q _}b&;ca}f#O)i^C>Hv2SolcJD!g6^ՍYnj)N}:ѭk)6nO%77bKΓ: {e0c< 'ٗ"[l ͣ_|21҂xНsHyD]2Ňi7vQAc:7:Zy6-co1~u[Wr?`!!fO5NǕ'{$|6rWGTTư1䜍9m{7!|H(!&Ծgŵ44>$rt5lbO f~H']\?g1R7rX;'9n/ QbN.,KM4qCk+qL!ae/%'K}~mMn-|ϮveML?pa>#Mlb.gЂt^uI AV/7Rf2 "< E=Kg͎u{&1D$(1[nkEX,,RY6 Մ`R`T4D J]^XT 1_4֕}^ Ҍ~EZS 1Ŏ|4!mWSüC`TrdD2O^T>`6:1yp㍹A{)g(蚱S> !A=i<5uۣ ?ф[ñם.dMѼeaY()ͽNKFJ'm= I}Q%P$b&;*1[Sx v2_4.ڿțt$OXJ~EЕ}0\LZvzu@t*=T9qp OZp0M=lZhLbE{B ΄Yl'iJ(SYk>cR(03HhT,˪êMVz@8yU/jM͏ʄݫXgk kp}BքhZk=B0\ݾw3.]%!hyjI%td5i)^S@=\k=w%p`Qv |FcE9p(<u ?7r[\-KJPw͆VQwIBZ<1'pxi}5/'wGeH6ܧv$^gEkU8Q֯~ԾłRgg$y7Dh0=}Ck~<:# W pAy"e>RquH'fu~A0ìL)tᶯ-ABɔ7F3O1҉&Y]fuL,XS 1_pCꇤ Z _2DTH~74&v6+Pu8f́ڑ¾FOo] sc{Sy=& W@7Ayr$>i̚lӁ_WqO<7fE*72؈+)ݏ]D~rplPur:i'Bh d֬Kz9)eS" qg"ybWxM!ǫ S]d17 2oVE7_GW͎?I/n@Jw_#Ix-Q7M*<']Ǯeѳv0r]{  [h@@TkďZVRRv_ J8ʦ6sH8&M=J-W~ 0 F9[Vĕ8[%;pK:mH!NNVW!(u+㢛5sc"JN6Dn4Nx HOz*$673}}"::$'s <3&?Gȅ?laLl5g=2ʵOWs_]0W/R9haVhCVk7`ò&!'"ӂO(qҊޭD? 5ȱMC'|UW9&b8j73vch[x.w1$(]ZT-mpJOc1ojxi܇D,/].:͘OB㧭>ю3Z㔷c<8_Ai%ǸS =ľH@}UĜ"϶E(X ?Kׅ>,h[ x- /(ZNi&KǧbV vhs%tןNa/ࣶH?U!Zy< _cN?Qһ 1-w;X寯f+'dbRؔ b#ʮ&~-F[H,nGRY: & @Ss'A\k Bw ueDi˼lۻOdjh:Cec/kX8H҄ gȴ+BKTqR1TnrТ=J,dag2b ![᷁u\]n^(TQXTl}\#Q j0Ub&:x +cmKXx]µbA* HLJvvB{X$g6< K.'mKkl;@CK+tu݊zSܼ8x7FDPE('rp0./y9#̇o0`@ ^&cey\駑iduoL-$Wփ @&ƆT>;5Jζ1է}̙*RIs tA ?qEU' &*DZȥ7Ěj]krtx}I<7ϧ:`R<tV[bɆ c4 ڧz(W21[JiWiﵯ1TbiD&ZDց_yI1`n<#7DDp Jưl\}͖[FY4#/cDn}fʩmOPp=`զ㷷A} ].Co M!KP`i%jd%v];JS_|G_͕02{ l¥M0_Ju5~" j/ M ?}˜w1&Txra;+J Tr IN ѣМ "H3}y%FŚV#~UuPdd3|Q}nF4z5`+tMz [Oa3$vf]ν/Tq[!ԕgaG)s*!\m Şb\hJU!觰 mgv8en?biv>IE(9R=^vێ=.uUQKΨrjgE oaL7SM2AXd{lX<~Hmh6.UMpE[YxE.0g;k7<\ cN޼W8,aɸK-+WnVKT@zA " vP<s"8Z$xƒ@+. B5^ hl$xET11|'j5H}ĮUS6{ϴxL+br>QNPA-BGkx7|d$靭$]g`.k܀8l]+g̙8+Cթm c|khB)}n=Z#)6:$u#HN0# `_`hhA1۠F[Rkǩo]e+ Yk1gC?Ө:'oOVv |r*O>-f|3hA,JBorj 5LO<\d1&ۙRF$Y%.&$Ey)<_!137!)5ALvKHn"TIs!!5&VP] y))=hx А2a0Θ ]D]=Yn]Nb9>ܻ|۞"v&$``QJFr(\go1u.&B%iP q|iof,O;]AiK";/Svgb sQ}5EFxjx" 0WbnA[(=B4ݘ>aUХ8wlU!n@( g\˪¥zB<;5Z3$+$$[FPߋ |vgˬ鵉  kS2qa4]ߧiqkh\0 ^RXx3z>INp9{pyQ]*2sH:prM 0 q^)N4eQ-mStCZ>*Ŧq*c*aכ53 =SKdMDv Oe~ P;dN1r6Y UN:BGeaTGy/*X=(@Ɍ[O8<Kn5g;'hU L<%kʑ_6(ծ aa册\{XOK+Bdiq7]u=>n?U KC@ɜ\#s`{k-> 2UܠIפGK,/˖]{]Q,^7)*Zq8cL37HJ닚{;UY:*$K*Or٧MUؓKV=|(>T _:-a9}h8qy&@=wi=ǚlĒ1T\:?@1Ğ" ltn˙4r:|b4ddPcq"Y$0+@r͏x*g$R[MP >ax~pBpjA)h!y2J׫^νBM6-ה{HB9ìSw8;PiV*N ӎG>m}gxI45S U3UNKr䋡3$@U ir:*%[A3f >0N#)icڄc{=O5L5R۸QqKIH+ YoD-cfh(#5GU m1׏% $pܜ^@6i;4 e6d8Z<A8*a9?"8E_\Ҍe9j߸YxS mHsZ¦Ҋ%=uY`)I$[Z7jr勮i])HtPfCKiOk[Wp~2KRm?@kH(ӊ)E;Mݪ<&)qbV)Vɮb_.c R!AM=K2AIFcYk'1?:`~\CdΦhT#yPLo;&#EgT-$(!}|H}8aVpFKЧzpo-5 .+@`gqEctǾk8kpO@ܑ%;#Ozynp+K؇O:V4?wJqXtފ )I4Gat}( '?Ῠn<3FZf}7A&7K,}gqNZO3pD+eDWU %ZPe\Ca9 t_Ș/4oG7 .U)R٬~)dLgd>cGe!WZ+GUq>Uy_lXeR>2fgio]'ѩiu6LU03핶l HFCu}w#CJYm!gZBRB_6Xk;^XO="el=yCU/} Krɢ\Nw!m!TR sIrqOENL} $$ k(VBꗶ\ a54,ࣖᯁB hD&'iKl3\*ݞ!iN iZ8\(? F.Y׀#T+6DXRI>t-L jmK ~іOͱhR2v3[oIN7q]*[˖"85:~A ˤ P']д>E ,u7Y?e@.6xW%'J_I gǘK"fͲl}'Uf]1':tE2<q-zLVi=.<Q#֞|h^@eZZggM'Bq{w;AJ,P6d;)b؛+X2MBaT'ThMk/­)᫏~H5*Z_aCE~l%i,.xw;Ɲ)x.xT ^SP?b4=T[|{~ud"o8j`|;2aAr#+_0 B,?45t"|gɆ!ՆחS{Q_zs$ň{wa|`#x~hp&)X+N*y2INK\仧KzX:>0qE 5 qJ{ d2h¢ n2%c!PGTWA8?;6e?ϰ)uU~X-kTxж(!I>U^)|34g:0}T;zQx0\=hAg#@/d,XUwtT!d۸BuD/׋G$\Qǔ+FGH> gvF#I3;kT|3銿x@ Pux U8ؕUiT>,T&vU'2?/gs &9hf/*âx="Q)!;Ck)M33c" ʉi<A:XI46^IeY1VmwA,shY$G-I$]|y=f*2'lzV.&WXAl$ \D;}slp]L݈lUEಿn">7,U~:Hür6fO@7mۅRcqx4,x)^YpZWꋐ;wX#&v64ͰfvQXÙeӅ-ϦLe7NonQ{3\"i8D`-f!jתɸ}}pՍ;8)'@Cl]zE<]~c0n7gv?{3]L7o7 6/&_D:U{v4U@2켝!G-Mq J')>e5~y&^俻i0Lf$ SDQ]8LV8,ckiS)6jR A8'׌@l Qe[5ˑbysFHc>th;X,l[/t&_2-uS {Q_p 3DQ]$TRf_ +e#}! ~OZELBE֣rUUeD0K-bZ.x43}\n endstream endobj 393 0 obj << /Length1 1457 /Length2 7300 /Length3 0 /Length 8288 /Filter /FlateDecode >> stream xڍtT>(0H#5Cw J90 5 ! ݍt {{}ky~>{ʤ#EX( /8@A,QF07$,7ukSnyg#( E ~~nE !aHVuͿkNPLLw8@ 84!(;G>Cy# " qB"l9p@y_  N? ?v} 0gm3h5 w%;X[#\ pg[ VEyg/"x@[!e9]CZ]PH^$W|ܞ3TsF! ~էwY7ߟupFx:lP_M@] 0_[6[ / \0/k;_ ]`_}].&`p/a'"P5 `; o/ 0gG豑?'/x@B PP rg2; b=U8N?si!nU p-r3~!~,!? Rvwt'_[Ѻn@q;M5ZM^0 r;rζb Ñp/T#?v_w _om?n@ v;>W5g !a Mp{ӷH H(뷒|mG ׵ Lx:>@A[(C~kv;eu̿GY %Z+h=y>{ON7=tC$/ FʽڌX!48w-~joTrTooDj{QTvtƶ$[cY!.{/Hl4.FX\Fk|Ty";H}3Z/FfH|Q2dT#%, 9/, ;Q=وA")O~˹uw`L1ED|aMnϘRz{V!>mܕa-j& U[V[O2v%}_a_Gz[xJJaNVsCx?Mv|x~_4;+j;Lv;K2~IΪX ?$*nL~8}1ǣ1(Xf֦vacm!W}_t"sI>ߺ#вż1@lpa(C6y:vЬp|pi\OϯD&}H|HcEO-81Ϝ] r0 lJ2`=MF(0 i/fV"zU%}A߇7Jl9 }ǀt}{~j!N3&b2.C=iu)y#.pl,b[Mh&Ϲ~%Lۦ\Z[UyӹLf]\wͧj_4:Q@E_&5]JFkdi?4Hnzl`XFJRSS tB"+c_'  /,I<)k0, #/z_{gN!N^z_R5B5M`fÛb`60]WA#r>X8;u@7t-CGyA694A7Aͦ>DKMwO>0Xh)m0t1ę6SUzCoX|0:KRhF؃7֠k HyU{T#23ў R 7d;GN3ȏ4=ulq"; WC^,z?'=@n2xg k-!LʠQxA^h᛼rAx@I9 Uv곡-vGq mAG<"Xuy3-T~arJ4:>Ah}ݷp5@"{vQ}fxa){lC^*e(laxwt6<1jBCk=jYzC,6k"(!i#om {7qҗ]ZV`Sj}'ԆZ*EL/1 4N\t*z=9bvF!kI\#'"9^:NVZu]chML`E{(M$A͏ӟ % EA =Gc,3/;`W'+%Yµgd,Mnڒ}p+! 5}/CPun>͋ܞZLeQLfT"rl1Q#٧peM3)L(3Ґ!>6w8~4!ѺE~Z&["Ջbo>ND v`7W 1u>~VVH—C=}X/7$WeApæ{@8 p] Q}|FIoLo({6ӗG+;t(qN $ 쟥cG]K_Jw5?.h㘹YSճGEeG'_zzm,"ʇRδQ$a`/ALR4)=W`o\v;|?dG͊{uQgʙ3Q@网VCF3 {Y zƽf!q2[k0)"MhP YKQ%is{ci S aD,ۚXL8]n4/^>o 1`WCTKk-⁻3xjoX9-T뢤=9v}~Tw܆lDYrI6tciCͻ'ٖEOL td:5<|RS[O; %Mr>X%\<}ҽJ.mv!.FWxO- S D)a?, $xעNB(݅jn ̊0<<пtjCxia-OtAV=% V*5?+J4F#{W*?) T&ϵMTi Q7wC\Ι!ɗdXM27P@vg]=Ԗξ }Vl]WY1ʡ^W,*K,%]A-dI"= &>QnB,,:F+YD ֫ o9!Q7ö3c^OJ.Әʍ~P3-yB2WXd̨؆Oxq@`Z PM9۫ݯW_;d*&-I3ݩU0'Glt63:]`xڱ{`CU8Ʀkנ}scfhy0FjE6&=T "$,_#} Mb9'wIؐ.d,${Xzwx1E|\^MG~I<+hw+wwita4mMpJݾiNlw˴G?J" z˓,VIl$^'l+I]?elx/[ӭ9ɩ]2:k*~iEKq͜rlvYRsҥd+]DŽmS,8Zm>UYOD‚DQ? u1wf+h %cqP3:~>_2hZv{^j[.},2Oc$yǤƒ1蛛ocMy $Lɬ Jw L1_7^#_ {5%,g)|aY&^uH u?MX(OydRKW r>\6xXgr>X#7-j<1;K%|p餍b} Ƿ3W]:(u6V/:u򕢢o*4O,iiTm:w *Kf{:3hLaϘ<$f-^(ky\]W~$s`){2(Ցq}e* F+z!RѮ2>w*{= A(~jMu+H}ur)KR.Q;Q'LAn?& i+E I"IS%-cګ~ILíK)L`оIT9[e&-_AδnjP |3~EN}65>R_{-Z5:;* YZbY9Q&Uֱ|5r-;4CnWEաʈF͇`+䒀=7Ftr"n1]AӬ#Pݤ k~g 5b[ƻ@Tϫ6zUp<-JS>lX3MfN^6~qrlt2Ul^/r=8J,yU|u0afH{5yl4D/ O0B[/s 0C#Z3w;wHw#ƝQ:M8u͛f\'U;=^.RHeDfo!A|q|mDkx*ؙVbōi8Z}FYeOkSő]6nrM:fQ~6'oݳLϰŵYfEbyXk%27sg-VvAۓ9TA~ބid>,wyxPw[KbaDCJBoslXߕKQqrj0dL&5iȪ~Ѻ9{BLlASk | 1|&S3I}J!b,L̞^=΢: 3@nVM }M}wҮ:-", MaS{i2o2B@l?ۻ O7uJrF^hf}-lz敛 G|RtO"S?=hS ^k5(Dhϳ4u9:O xtszzMnObwfu&u/Ks\&墔ч@wvGUcWttXk>&Sj$B '9thw2e%I-`}mIbnco.fiRj0vk;g +}G=8Cƌ>J#v-3zPp1f z)RcQl9k+\gm:WAk(Uz„:fp4QJ3omQRe^_yRGxseݒ1Z6MH IKɎ'SFv=qQ`0Gmn(¸BAY_93+kǷ&ԖoIָF>,v>])׺{xڃE$Jbڷ{ }6R|\C5ޫoJՉ Bom!R=ze=maȯ,s,xӍUk 6>,PO2uh C2>CĝG!F2spN?㒽>a43[W"5D;g)$iGŝ&=N5Ю/eq/,RA2jPי2`xr?u7+-/ܐDvR6ǻC9M'ѣ<_|xYIȔ=C٫oZf ~XF ~lx!b8m1 'ԪlAk>dѼ~؃h5ҕ^_Z 'ڒ\{[f`{ Km%rzL+uѧ;//lgT3uG DlA%?̟r.9V?Ϥ\կHdC;?˂#fAQ`"ϋ̐SVjZZ_nS 剘1w6K&${O\<jbE>2PvM$iXtU(}~Zb`U@C˫G2'h$no$ ڔ L$mǙ6K*(!{gU&=ƭ4 hM j[5|})}L5Rz>Ve~${y:5x!OBf75v 8T>XO?j2mE=kNOY5|9e:@$)wc endstream endobj 395 0 obj << /Length1 2702 /Length2 19399 /Length3 0 /Length 20954 /Filter /FlateDecode >> stream xڌP u.]gpwwwwww!xp79ܓszYww=P*2%lXybjj,ff6FffVJJ5 gkNvs:d Cy;[5 `ef#/@ :!P{8Z;#1 /w  ole46[='{~sgg{^&&777FC'F;G3Az9@tt~ P0]#%@? U;Sg7CG $0:\\lMPv@hc> #?/gCcc;{C[ [35(!L05mhhd7t564E ! 0Uw}NƎNNֿkdtlMllN[8AwsllL-lMLabϤnk$B#3:8X@؜w5{_JbP >^vSP@ S + `4E$ha ?tAfbgk3iJJ+]?JQQ;w; o%CYSS/a׿'AX vOƠ_,/3;_F.Gohcahn]A; okM,\lV "f;DXY[,~,f-p_* hw7[c;K 0tt4@`M+&@hk r9"n)'I?$q n`b0IA,&?$ Pv?]e@ Pv7(ʮA;IqQ@\>A .YXXAa -@6#gg- WPX?dbdhldmdG *$,S?rٸ v P c;kаÄ_ASd/J9hȘ\@MZ+o@&f"fQM@D;Y@Yd X NcNPֿtn6 >e@m]l~_fŴ P?jP{sl?eg[}L@Gг/Sοdv:X{kOlB;gѿ,mtW8@A@?@eS`r6wkz@f/P ?w'c;5 nSPPAPVAP$ ׀MO !G v2NNE%\H JㅇZtNhH`uH8>=dثd9cZ^hB!PPzǕe;r`xy]8|KRsdz?uvɶ5јњ}-#@1'v%4qP݂|"ķ9&HFXS_do]@L&z;TY^"N;DBt1<4oL 0R%Y\s5Xƒ~ 8; ^r ) uRzH@խHm*vWz |`.t6K;Z:JB4'~209PGat&4w[| 'eu8o<VR`$ɅϣU;#3UקܰIrVO 1M %e<3JQӦXK!?YSˠ6xgB8~ 9u40~Z> 6k9z;k|(YrcY4s6X{⾝E5;ӔdR[eXT3SH}7"*-sGyH}@. @$FSO4~%-n!Y)lXtO#0=$J9?\8T+6mzã"q$S#Dcۋ =j?i'w;"Tj>3`\P#D3/l_cfb ŏ0^F =tI: j줙13Z`M/!jNGU(FA R^5KU:F-e? B2b5D3 MN ico,? ɲAIbgyB^8(ۣwSsQiʻv)pCq3cBWguD' Qi v%]ΑVlפImҐdBY ;F9Sϋޫ+Skڤl`Y7jI4'a0sYHx7[аɉ6([ĝ#U:9 9Mʣ %c\pb0덧KaQ|{ c!2 /˭p,G&`{Zg!4U73Бg]I躈*jV2,͌L"lWd2FOCP;t_ bU z/{O:flsU76 W:K%L-t(0=ZELVRP$|ho(hP0M3<<rHNmXL*1#wtIt/qoH^U!\b5jN@TrMy9Ӽm` IkeKDUe=b7EˮN}FX Sǔ(䫞Mr c܍',=/0&2r,Bޑ d+k55nqlA79OЪPݻ=6A/ׇ嘗r |YxՌ[}"?74}!.n:\f*Y [CCѴ~$b_hFTa%^jN6%+1-<8 q%'A5TO rFsX=5fX#Uդ8B^CXa;~xWڃ[I#dnX ,w |7ЍzSϯ{8$hz$&)tjd^WCcMar̓6̘jfNgY.0*0|aeuމ(*YYi%"o;O*+ [UĬ8AL9,T/͜bv*1QyyAs"K+Fqbmn\EXYʞ -Ɂ)Ώ/F,G0!:]J q 7pيl ~n)_\7^o#\PK+@o s,HA|>[O5Ochh1Jj:Qgڻ˱J7R+ 3IwC=9}ä,1BWQq hPQ D7_-y A$õk4̑3g, 6h 6 8#obxC֧n.<#4"99E΃'&4j^NƮƸR6p nhipIqyɣLQ!U7-YDRn#Hv7SM.BDzv 5M zCt(6m$[]c<̘yKɈYO?U'+":J5GϹ^b,6[ZSxWYܝ0;DPvqۑzToHs8 _`bP:4,3KmH]c vk~(7J~OL:?:;c:SƤX>@wQ'9=~RbZuyttiWD300L 34/!u_iEJV%4lMB}T\Ҍ \80w KsBlJ =h:A˭L1хY25燁a=L !+d{&~o> 0]CGΝy`zH00E-}њMb9wH|#SC]]rwCF]x)^Fv3v-nfDl=1q*UP?>.I/|kf6ݤbJX]QXSJ*N K5!r,eo+oJ A ] 0iA_v4m78=lS1V@D-u&r[ز8ДA!ML,Omԕ{ADGk.0~w Q~=-ܾKVnJGM:|R ۊX#Ư># C=35^'w- a`k`<0MdF_FS)<>t5q{ 0Cf(7ki fD*f37~i \nS Lc^bɠi2*=а [^6sK>dž]= 1\/22=F%Y!kkFk!|luhI@Ӑ~,2nF*i /QRrz)ft]=Mgu! l@hu*(]&ФdlaCRMR,?]\ P\*ͶDE!x2^0ׂS6AtpRVn<]X Xy 16nGԑtC-Lp .]ǹ54= ,՗d4!vr.~;IU\Oֶբ8dwD0޻^|\$̔|g8N6jn >-_w<E  ߱czjr`h5*vcʢUXU5^ڥ~s Mޑj^jC6AmTp7U$ү%nz{tav +x xާSrFVBF*pU^Muq$ܟ_RǴTڒ\!=U$UN)ltQk:!ubr RBN3FX|< Sm4!ʖN#ת3\Z )D]!D&!.Ө\Q:׬=zABGψal&,cYN|Gm3=KSI>ץSV=5 k7G醠1"=t7;g^ .GOEv="^M+3ŴLո˒'KV֪)gJ(ܶcq^:)RI&%t!$jw9"ӌ;z8ѺUJu7߱) dEzF5t1+-xxW'٧:Z91_t}"p D|^p0OoW .]KbDg"1)z^$byV)_S \?ƆM ./r#(w F¡~J arۡh!s!D.BȁƵWbJa S38jֿBTbA+^*Q!$h+|1inQtV I6v+#T/-lr >?ƎYJ-ĿTƭ!۔e2t$TћK3J *,b~j;a)C>F~ xy:^XRN0f*da#6}u37\ÕMʞy$V<}ʣ8~KSYҤ,V96rKEۯ&fxq)O_FrwIiko6q(?NJM3um%_ zo)YT!H 1#cb5Rl GP~-rh6& 2p4ԷG4mg/nA)vJk\Jf`fߋVK7^9A " :AlQ5WR#OlfRD/vR~ }M:g/[]ei4==IH.6!|hΘ͉7;]W9-nu{Ye`tl1b*.ĸu̝t}2LefZJX\<;L1@pli,¶{+Ҙm%+at`ؐj|c:IFm($XaPvБ|L޻k\]֩7#xInaX76^du !訲7~ӠC}LYy4#h/xAWnIؾp !j@ %pµd>-D! :W~vt|!uMHb 83 ,ϐפ]@ [<1m%eR\Et s*'2Lpcj(g.?šp))Օv-ypc>~^u'"Q2B{C>8Yúi\'%uYUn~etƗ_G[gggn x0ꘛyyayڀo~MD/'DD;K?[&Ɠ9) :ڐx[+hlOB!EW=Ƕ\ ĵfWBy &T|"k퇙WV_GSyP;ПGp$o;ίWJ{Tq>+ŷRK,WE1&#O\MI[E,pu0,/)c@WrRo\Z ]E k T :͑5G1յNuݏ́՝]c9CF&0Ce13 %Z!;p>]O&*@%֏i(y}xњ,;edísU&|`i[,VDJ A\]|Ȳh80Ŕg|}K*Lacͮ>V#_gF3/M,g>#͆ص-5`m@;n6Iz3sL/&gw֦5ENlMWJ5J[Y+ZHYllw"B]"8Pi"JV=Z<9q#V/HG;,$qÊ5_YUa%u~Yzy,R!BXRZLnj2aD2 A,l?/CZo}/Y\R /dha)L]λ$mV3-EF/f κFnILj@nd4zܦGx*A+N =4 d1X ?dű/r w%a3\>k I;{ QYPZ䟌j>*54Y$iH 3^Lb[d7ЙxizE >)VXno6Ϥe!^sbY'e)ꥨkJF@1dUrؿkk흌DY&wԳX=6oU] v;J ^po8JԮ=\0%j ML|VwlNJ%ibo nEv'y \ܧ%{/A9+tTfx}p~h#׺zNyKpRIZ 44w08AD]׽{mFGKVq~].&1"hW wl'Xq¹W( 8?/wVu-_eC%t {d3Bm"פiљcet)dnͳFO[ ˲&~ZJ#=d_~fimw.h&J`W>CIC5@2 8ƋExoqTk/]mcݤi۱'@*T_M۳NM(EJq]hu!S.؛mfkāhyi]/Ʋ ࡮M> vIjdK$Ow{Nxs*ܧE"KuibOY KzVwak{7P#9E},ј?3 QNb<<24o=tPu:u;88 Q|ʱ&  _1`)O0!Onf']0D*<į$1hfxӟ4M0}f\tI6ە,ҜI)BԤX Y5#+Vu=&LA{wekC:=H5>^Oivt71iw0r BN]@>$9jOB+A]4#Õиglj}4aĒBa`aTA)WwJ> :Dz@K&`yH !k%5H&UϒO$qaEe>x7R0y<,++)BKDv-+ !,frܾlR:Tcp[B?4ֻ٨u];SM͂vS{!xj s0uw~}&ffOj(B>sY_|1ٲfΤ&û-$;s}AvE^;Uf|x+W!j؟{Oi̊BH~凬*%c42M:BiGctF7U|Rz 2>Gχ\G3Y%Xls߇~.AW[jŢ_f|a{7*ꌚߙ%#z2'c-Wk,cmx v\k{FY%LQ6UG!E.xYp+H3LӘ<7S-}Uw,͟[]Y2=v rݩ9B!̻B[=c+.y`}yGҙt;bѷڢĴO'AA̎ā7K@zY(6똥 = V,c0!#EŒF~Oi̭n =0hE8wl;174hk)Xdm>-lhG[hU[¦Y=k>,}ג fh]~aځݝ&>XŶ196%' \X'1u.Uhȵ!6W޽+sN 9DD1QoTUGɥl3c'(qwNȇ‡ŘGP~ ɯJ Hݯ;S1F30us 幫-\4!c"~MZ^m2@O𠆝0KLv1'=69*jlIJ\g- BxnJ\I)x}w%ApeQ綜5 =OFxlYl!LnФVkDZ P̈3_[0'vY}[~E'>[zbDjYP3e'c Η3ɻ.m86'uA[`j)ָmj^foAEKH٭=!.NV+/SEąI߯=,X vdzYU: D)\F_ngE;ë |nÐqC}'ͩg([SS PAa d辸N-A>TY~h ҃/˻=+[zҐԤl -$EG,MABY_⌧[mCV^k/Tz8&$J_{yC_x+[ {C1"+]E"BB;iu* 1NQzwlqr8q+(U[{}qdhCPI1۴خWTiGN1j>z}`} Yt.꠫ךb2o\M+YwmV8QQo-=E7^KE!=o.;Zp{Jh(T<QAEٴjW;r Px0NʬzS6α2p`iun!xҗY%S4Ss6=!צ[C, tޠ.1be լq$Gf,?Cj6xn[-&6]^naufV+EdD?;}b6hb+l՟ѱyvv1>)nmP }AR-xf;4ȥϪ(.%iP7˙鶔Ъ/8aF:5TErB!wU4Ul |6™uZ2 =!5D)rp'Di%\v/r}u"6YƘ1/~qVumT< nÝ5 skժ|dS-u d=A^r…ێ:0u6Ƈ,fijwݱv[7 `pS1Rq} t""8W^ E]ٜ}ڏ9lԌP!{xYn[~*{ 4]mq:°ӓ[rRMd:P.]FE-?!UNBjJwWoYN3ȉ`c=Z+(FN}aH+zQBok$"nv%[+7B&C!_3W=iBF`HK$`)GEv< فy%(ˎ;"/8~ZI?y&( P!G骲&hUZ\+ǹ%筺lmAws@Y2^]}K<4މp6(@@:#+yˬ&|'!޼`oMn3K!9{n~bx&c0/`d/y ԝ^Qvj/U-vH#SZ4L.i m FI0GD>??OCoxF2"{&B²0;06yM6) J圤uYԗ|H6NE ${gF;Ry^CÏҪ6V~࿪ap%WDIV XVM\:#M& f'^];;6{Z:&g%.x [Xis->)1HrT(ޙzZg*ih`U֎b A+> %psfXFWBbecC֏ѫ;5syQbC4c$:H z\DvyyUEYODVStMC n'6vjK.7PhGb(H{Ig_ 18m w E8eYz-\K3g7dEZ}kxF&m RgaѢ7'X4K9<闎~XgNUuG&0&iаDpj;W]c/MۆkuۮJiV@. rOvWKЧ2jhpwiDE?pM#zBa*1z+gŇz{S/) n"IgΤMe&j]XEA B ȴjċ׬YSsBǂ),Bʧͥ 1~ᴎ!䍊CJpbzBS~=-Bv~)b%pmT>I 3[ngtCc+t;E?,HVB#m<Ҧ ~0;6SS/QGp-WlVJc5Ҝ\l}o!Zh0XOHLq'[0a@zNZc欂9 }%iϑ[`p#+aN;nCcc@|k1ͣ؋joU_6}X ;QtAOG*u>*(^b/׼GfXVȚC<>E0E5j_8d {$BD}҇ڿd_=)Q}mn_ҫ>JCE{Yj9}d]xݠEbv̵4@OsE6le t7Բ,j$vuDoYF=ӷrf (aLDD`^h` sCOm >a ? j TzY@¼ȅkȾٓTRaWga50-:X)]0 <}$ݬ|5>%?,9WF}B8&jYl Gһ$N_mJmnpd%߭Y&- 1'T⚎6*#TбdXa3,3#KM3&dz΀)(#w5xQ<&vVc1DXvKoU,f͘3. !MĸwLx뉼,a+ ru䢷;(!FԮ sSAI6uaCRE @,-k jDC9,qH~vqI` >#iry(<}. O1HlC%'ߌ xh B&GI[с13; ]BbxK\/B($s֢ rZ3-}(,Rt$HڏQ/` >*CD;PL%-iJ%6\&||aǁc zeZmoHQ! 12(јگݐ1֨.A5Iq9Lڳs#e0!=(&a0. E*]Ra;{@C³+{5Hv:e$@ `y5Mys4v \LH RnwPg X˿o^oKAR201ʦIDxjQޝx8$xɾ ZWmg NJm^sެ&Q2&Tj#9A.b&(it@:1Ŗ *r,!pKi"b7K!wM%|Xg’0G*8J*m߻ Dyæ–nff@zВ,rEpAٛ*R-wA(6WX}U,|uJ7M. vsŌբ71[`zYwna,Vj Nl<աcܓ# 1?͸'4J)x*V+QLz Mr MvmTˉ^oAld ;@ILO 4vhLfU\b2V!Da*$yVT #>ԂHPR)=ubYLK8Svs||B'iRW*/81 JvIUp)7q^sKD7'PFk`캖s' -o-yQ^+6O9 y@Mc//UW/JVTʆѾ[.7J4@ySEr\-4hJX[EH.;zo}4d[.! H\G OB GRH G Y$"vG_גaq#DPUx^pu13NaLvK _q:+&kck#%,M,+_=fbyT(szЂ v[XHUn1ꔘx VB7ZYȏaI) u!2D.z~VE͒K &g7M.{4"?7yMtG $0/z8ԑ𗛴!eGvԺ*ۋv+;1+)G ;q̛bM>i(_$rR僌,%jˤy~哳OjzaKJy۱D1ClGv)jM5= |M|UD4&Fݱtb>M!A OPf2**Ao._yǒ zƂ?|#dQ$q"k0M!|H3ːመAR,\=oL"C^<&HjT v0,a!o 8cGɟչoU[i]d Txypާ kS?z\es%iskniN4yfB`"g 3`jG- PvZ>L+)J^ދ~R@\rСU&)= + b!A"ȧX i&]vZ>ҵMع̮iBWzK\0c%\hXUF#q> stream xڍt 8mvUR!Уafݐf1fa0]/]Z^iTvF&KdB?;8f漮n1 +YS) YJ 1F(FGYC 2Î;CMπT `$h VRC+P< HxFT HGPi/ IЪ2A<03@O"OdB`x!rxO)%B 74 =!k7aE%1|4 dRpBi\24̽@77 pgk z0@zz) Ad07c1dO6E@Q^PRUbwiH!Qo§a R̨nA@P(?}=,ۑ>L^K~#?~'D΀ud;`J7_q⚂D_!Jy]ථof=#CЂJ^@B/~=$] ;Vԣĵ%WT4$m$~"r*XRUe_3#%1~BUUIаoP@BA8oP@AXHoP@z J0@%ƀ[b  µ< @#0i4XW7|?c~ JP?^rb>_ّg XsLJ}F.~\yx8=)sÖqMPr_݇$!6nI Squ g 7SnwN]jHgڸVS)ll٫vVY}Qe(Jgi=GH|1\}^siIcuJm@p  t?pMAd*4?p6V>]2|5/_~9k)ҮGvvhsɗr\|Ջl;ZµZW mg%|e&) F(zL[vGBW/ν.f}Zz奕ndpteGxY5-o,KdwKBfݛ h'$-'LiUpg38oĩ/_rx,|]osʃB)V K!3z|wW%b\“)S(q~*@zL=?$k0|[i\|8x%a1DKOߨ(n|7]_S?Q%hIt} ĴdoiDuܙ鈴] }eoXsX%F[(K3uGvEfRu.܌.٨qDEXԾ&7\5ĥ|=c@,F"D|mw{R+WF֦w]9X0Jg /Ҋwz41grvFO˞\k" SoYU}hOۥ6L* ^uI9W7V~ACNVSdq\|jd[9[oɋ{m8rO;%["/Zޜ;ϱtm׺0kP:%N62=Fv5wn`b Ċ!>`xgqd_^U4q߉VsoTW$NGZ5 ّ΍y괯ȢC;&+(JiܨY-಻ts=CGNv@>8x|$7`yCۗq(2#y\zES(:xclb{^0Y-a$hw)O _wo7(ebq1:]iTՔyL([F5fuE0^mAʂDseЎ>}K{1B^Sq)0W:xd>fOs' …K/Xhh3 ":#^~c;aWcʌ Xհ@Qv]OLu$WU[liT2S},i[?["nQ꼡bqƈܬo)"}sLAJt,4RHO<ˡckXh ȑ^u1PC%?l[>n5kZL~4+1qLcz%]4czc-NVZNNӈKu ˝85}p[Ar#&4395.M×41ؖ叿D+Zo)|,|8"W{㵸v.G>-D}Ѽ\6wwR0KTk51vwcrӽQ>R;l Η8?^" W)ka{b|x36s9ȰRQ^2^~ok6(8*R@L uS~+:걘(;5n^m./2bkmGI[ÅOQٷvDү?h (`-5ψ,; Ks!ȘV}ˇ$ȧ,M 9'.k7Ez4i铎5á85D[Q>lT`hzLQ6́w g8㼺0GۮQ!ϫ~"[V[_.Ǭ7PS~U;.iw\x3+x)vϴt'[JqamġNs|I),^drg_̇ 6eNܗs,#fv!Ll/fMɤϞ?dë7{HM% #PI:oެA wr->8n#Zrq]ytCm8oK=U.#"ҙDZ߉u)´ە'gؽz`ƻ+^=X`J \+cʴo4do|dv+yuRg4cٶnKfY MBg d d t#{O}}BOlK3X$ ѫ8ѲA9t7w`懿wiٽn~kKZU.ؠ">7{(2"qVXyGdNJM}g~$*ly"T0qw~U#~eՈDb ;fp4Uў"umemz\-Cm m)>#1 (RRĎxhT WFzl*3͂h)oe6EOzy cI=xf4mLt,yX\zoobXl,kp K? Pw1D451x6M:o .kZ.DrUh1}VQ3%3l[Kb;)e!j|ޜy b8'ѯr/_X endstream endobj 399 0 obj << /Length1 2602 /Length2 12031 /Length3 0 /Length 13511 /Filter /FlateDecode >> stream xڍTk6LH4"tww#- C 1twwtw#ݠHw7sރopRUI b AؘYJVVfVVv4 0F a 2d&P l`qYY4q;la t@z_1[#hbP2Zla&6u '%jlb qg5d]0@weh4 Kru9 l@ %)TAv+m76f;/g bkobm@iEf`bg 7q1ۘ bn{0OyN@G=ԉ lDa`]3ڂNhIA@XY>Yk;?lgf3g{M;3HNQfXYYy9X  h;=/%o1oO{=VlAt2q o?Ehll30 0Y 1n=VXl v6/%%5i+W'.qx2q9\\n>>!)gg֤Rf{q}V.V 7߿FvKM6۸cYg(l %ߦڠWV dvZ9 l ,lm#I2SC b+fB+ h 7` [fB~;76F\\O6"`  sC~(7Eo `D<G `|D|+EXd;EqX,#eW|DJ]xaU,Gˮ`'Eh>"G`\t#8a\L`v~43}D0&@k%2>9O*`ف".X0 6L-}d{XA[ [GX!.0n`?bVCpXIә:& \?g|\S;R BUAr{sJDHk9͔E, , EOfEjGUrcV eML-ݷDϏev:702QG{$^:࢟&_I5BW!L`9ld%sU D|[xY/+iZdkz*S |"+%e%K ZJ9oUt~b~Hnhr}gD-gv7,ɦBC:$p}ۻ_d%эLu:S)!j`D| wj ;SJ]XT7s \lp1wÚUI2aZ}`QO8xvZQ$もx38KÈb(<|ME@,tU;[ɸ57pI/tpbӁrl g0R ^ ~ iCj)HٺGWCȳAz z1sU|SG>cl1mG$A783;}D&C:6*֦KI w%md85aGAM#@Bbf0Wxr3@:d2uǮ Q-W; +#Q|=2rd_s54}cR2H-tP^:_ǯ=םfCɔ+?8}5}_6ƱW q/v+ )BCF5h>q 5\$$Fghs$Cy=e6, 7uacW@MSyj CTE[2'LɈϿkĺ $IPׂPnʹ4 aD4I\=*+B0ٹ~KޕwhKdB ﺴlB$C>1S'L!NJ[o_t"/`W;J8cqQV39 ]B%R[T [Jv.r+5gzd:?Ā28&UR}DruJvW<7dWn[IJ0)ͰUc:/wՎDm+3[m)~/VtGG:( &ՙxЅp{g[ѮVXVVah!VbO|o3ϩzw1ϙiq/֙n>$H4&N+}4WqXZ(D}bhگAN+K/7Ú|= |(q18 C7K%W"~V-I4elyvN?*)cz+1[}Xf BDӞOZ"d RTi=SS8[ls*< oX+>#,MG)Ya43*0B~W]ml | qv|ŷJT5z/?IGFi Ӣ r8öDh']lijD8wM̄ ̗3byѳ/qf'r]^G|~ibށdE+H٣JJ6%$`ZXUVbz!{R<o06-_АN3K<Ϩ2Ƿ[gUXбb[B`nFPPȥe.kCD)&LS6Z):lKZ?/kfX+36T*G=8}cII>3|eBGk<ǯ^j>Ő+~k #$X(а%"w_Gᵜ,QɊR$ 5t@f,rbα '2zL֟>\B{y#/#D NBjM,Md[[@Mtg15P{Z#m\"BX CH6hi[?IGF]dh3f*4+o;JG>EtJ9{A2 1AI9 YδEhmi"? )b(ι}9&ڭRʇN'9UJ1Y.v_G@E $"Mdp&H?fBc(?"#l=d,y@l  \bìXw{ PE}ʻr ԷΧhcRʰA=B}iq@kϱuV^'3m$퐆e$I R4іU*k;C4ٳ1U<ґ>U>o;4@[;>x=gT'UQXVH>7Aʿ]6vqTs_5t/m^#[’hb1q\hh']EPNV\1s5݇N"w?D>pb t!p6yҪUlTM >]i 4丹}dE}4~r^r6_U?M3j.X ;?)$&SI&\VQwԋ^Z疯x Bz7fٯap epYrs?zD؎o^LZ)(u/.4~|i]/ӷM<'57,<ݼK[>oL}$hP%)ωP&I?YKpk!H.Zx۹"FTR@9usу~?U(De0 /3,<䣟A {9X|"v_h;buOZŖZfܪn)EV 涻9x)@:G-rIjy4a#3ĎI6arWk5xӬZZ >b.0i HTa_?jػʼnINcdzR5Pr/ho̪t?nݲe1ʬC_m5ԼIz*&X0M8U ~1'"ct](.~癌]h< IoXS:hgQZ\vq=SXmu ݥsCo+-|LNQ_͈#C>a4cV5}a݆*1-/f/Ze"mP~_Žǻp+143B_oc6* ٽU+ .Em^ Y^st_֬-ngZ8O5w']UDryK뼓MȁrVRœ/HJktia0[X" 8>]:󘩷cǤlxU_ K"ìs.sHsxw[gο}^[qѾGYv3[BN a"15+8M1?Ex+H{ΐA߰-HަM;0t/B,pn}^;Fΐ><]E13'^: Pv0BvvrjQ$4L ^f4x&X#0/@U{NzeIr]~]bݚ ેJYz6y*ydjk0>.K4L#H{U+YO"ac.[ViF2 ,A֪W Bm +fI خZ\F\U\-Z/i^ _ l\{ 'ϕ~8XwOط Y)Cmu;8mnN i NTY~d%%9IMHua8+Isz^®yjti:+v:q Xb9)fI}OKẉsݣaUk\3M6|,ܶtÍ-02OG ƪ'REotg$27ʞlYDxn_mY=!|p+Q8 Pzp(>H{^&FV D+ShO.Yp*\mhSIev,\ ڎ鹣Dnz% yF]Dr˪tq_{~>͍GI0;T1=w=D K\BḀ<,j+@g>ܲ,xu." sďwL=h-7m-aM2:0-ծژϯvV}3SOkyY/JW3NP& |#яNkbO%v $be͑P^lnvȹw$ץjKub1f9V+2vꇎl ;7)<~uJfqmPAl=m@d6t9DZg')L*~08kpybpJd7Z)Q;Li\Pؓ0*N)F-5 믉† X64Y~U) dGrraFű!1YZvXhABQa{!"4 ;=O'M vDkmiP1NPq -u1$?ʟY䅮itHpGOYV:.Z+}:fjMeRÞ2`ȜmㅿAS>彘Ijd~5MW/l1TV::rc!F/ZфhC[<~zW6HtܙY6g&s.lꛑSmЃ=ԄZk  =pG^d㷸) doy;ApPa Nb9yr33ӓ_bcM|8Oݭt~~z6?*6>V!egF-mx[0Dl4aNj"_1tkaxWfiM2H('gϳYٳs>o%Ѕ56]?;KUPDY(JMEU6#)vet.j̧?dvգT}efCݗg@_~j/˶(eލJC+;F{+Bf>6M߶'HpJBKj; ;2=Uu oy¼bs.%k Epu8{G}3H@0mcl=t/[!meÛn_A6>6B! !2 }'?RMdҕN=GgDhއ4G7v[H| vm XY2 ,9+S״0z JIa@e>f3:ݑFK@'יzQp9܊7&GYzoJl7rHƙg zY(TbL#Zde5ޞŇ¼El$eO }&(Fv9"e&eHh8~dHb.XumL";ś $M]g`Ʃw*}уѴ) _NtCp S%[2/Up%6҄^T:S7b_3&姍^ uˍum*Lޢ *7t}ez9r=(:3zZfƆY^\nLJ;򎭿 :1H'xZ05=5 e}1fGH(rk`k#\M̟J?Vx&ӤNzakҲ`[nΣ()fk}`?-CLf9Gge 1P ?AonO*'K6Բ}_g+`9V[8ӊ >yg5;jg+{6-AfIIvNmzic$%QUK!~bt \岌?m)^N<4ڳF %|&:e*EDgvas{;=WSӿE~r΢Ѯ4S=bCϾNrʝw5Hۺ';$/]W RsO6Y3d(u^ad`bQEtNYJ%n}؃gtWE{e\?cqL^ӎ526p:^ӏ'M M(큜q[<_Cv{OmkG{@5J\7B9M0'Qk,cpDQ=׻@1 'Ѿe*אWwhtvM,A$BZ uΤ9>s |6pѬjKgl_v~L!iU 7@&=ɂ߽|ZGDgA;ˠ+F>Q {=IZ>b[S3\ó5aؼC9$V>'Yu!ײ&Ϥ7L sYcoFy`}6qI8BǗX%[k?J4.2O b* =t A[7ꓑf4*jo&ʝ槀d6c ]JK??:Ů &=?+{ynuEk@9鵕7EP>s#Qcns1 ]MAyvWη{Պ~C}m {aqj5>f"cwZ~?m- E d6N*7{tuG).zɛF\-x!LyupL]bS|v%dx cֶzw+nkdچyiJRE8=MkK726 Bά puSR~iىVzKrnJO>0=CF󏀚\O'AQi{d;6" M5%B&fzg.dR9H\ v/}`Zٟ*LU)2D։[:_6k1M%}_>sLsRu<8fKf!hy~vKܪEZ _%sh;w Z_fspG,wVI"Ff@5 ?{:>>/-곱KK}p3:OibTk+a`ȿdv[ŜQW2ڍAMgQ&&)7+Yz{'CnC(9~-)Fuh11O D & [EOyf#|Jt`XbAQiNc~9~y*e$oә70 |*m=I_Ц2KdC6sC@Q:> stream xڍPٶw˂5.[p n%;]{\{Nyޢ 9ǘ?92PDD UQ02322ÓX8Y#'W:8Z؂0v:D dmA)gk ?C ,=@t'sw03wzK?(L\\mƆ 9-5@_!(y͝\]] mmhN%#ha *ȕmM\ 71 2:ޒ%ev@?2s6&z@ mm A 35 /&CD 0ehhhobhamhfw1AE[iɑ vʢ a[ D,oZl]AS _M81,읁"1yl,L=flWxw;ʿoxyLߚzY{8N@/?MLL c';h]@mx؂} j4tNH Acfa2ع8^D?E0^\?V ߱lf=:loo+mwAb)Ԇ61xYg}[6U@ gt2|[Ah(f4Qp26{0b _o p|ǿU c[``6FllE4=zӛ ;/_`K~A7qD~A_`0&&ob0H&oz.޲|r-O7SMo~[> `PMo~[-3 -bVb[W_b{ flk6}?-|_d-vMXo [oXoF(mc*Yߎmmh`UGLo9M,PGkC?ZazKT^'sz[%'?+|55ݿyoZKcg ݀Kmy-k]&fS<ڝa*37{PWwD)o?-x7+>y>*M/Na L Щ||Tl"϶wDVŸww/Y}Oq]d.R5Bǯh<(s!,5,z/bXxHM樇ke*̎]dZ8cBIR Ņ| _AݹB&zw $t 4WF`{ W0G۔-r[ )(jc3Uj25w#4& fG$:_7yh5)V|lkR; %/ G1l3&K'>9&Cڑ,$t>t:ݜs ^CIy'N4F`-be u%tW+v)SCLjQ|3tBroqP_Ş<1֞QhySzTAgnٔ2hȸ6 {ʌ 'M/O+Iw",eՆ'TWPD/4r(w}Pg5= IQIi)r-/3gP,~h9O43ZJ :F4\F4Pқs'Vduo ZBCluP4-pQ9oV;?<wvwuoA {G؉feڸlfWӿ>c8`e3*3ޥ .\0<5pНx7-:SJ;LhkĔCÅIgS1ۦ:}eGؼr~CωIᦟI>i9mi퓪g=߿݀}jyհd}2IAP:BVHU& `wќYF8.,s1qBQCY{Eu=#V7-WJ } }p6pIMMﯶRl "Oݮ0f{t7h!,NzO"j:x^x*&*>E'_ F ߢ_=H"5Hkf;!¢Yɰ$1-˘tq.f9dm5Ono$-@G=)9PpA|9capˡ_pR^:M`?,s{<b~Cj kKJ>0ϵцn$#)A[X.jP ' =y॰vWt;m|u "8F@GͶ[ FItW*͊~!Q,俙ƛ>S)\=?3Y/V7^.uͦvȡWvo1(tX\wJN} ɼ!|OXyq)#08;"ͯ^)O[E0T/fCJ&f`-Ybyλeۘwst+6#Əp9jLQFB'f2& HDv쟟1yxȩt&oe?o:J/ϪB摻AryTw?_ϯO/6<6m4,3PCY~+jK"^иǪ-s7V~[{n33Um>0jl6D:sв*M_ J+gɵMŦ91JCV8X_D8+8Y;`4GF|.^xy!wq3t:/D2*l2$K@aW8gsarη2h)PR*;%АHѕ(/'?daRBNVbε}9_0̥$s[N "wgrnT}YΘf.a$i:xpKЩ0U߶7NY8XPƵc)fvE^zV *n Ku>5FN07yfC;CMQD14o&T02M3gDebCgȚTEJ4&2.\,7 o,%梏HIoL#*ݝKz}v] N%W{ XFV'馿GOqIqڛ[W1Z T!$ 4Qm`M({->?ڑCU=q[1q:Yfj\!t^HҾT2o>)RacL{ͱ}f\Lb--­G 1%nz-~RϚO[P~WtOܬ+)f ^u P"z̒a hܹBl/ 7 9AqɁIXK}Q\{ +8,g?@Y>0=K$S.A@UͶQU>o a"Sg>rBapOG˭Ui?Ԯb(hT/&zk]|"^R" 1]k9u)[<՘虓p+!)[i5=V~QV̼J$EB* r/N%@Ć1&$ xuO[=0V!AT uw9Cn5D!,A0i;HaӞ~ FtbIӺIJ "xwD7EuEz*zdRroPo˫ o)Ho=+T4S-KS85}\^b`Z5.11ƵX I++釻NjR~Ť5ا9"ߕ:2ʋ==c,j1-Ԅ.?0h0!*5Sp8_Bߨ u>?loy;C0@@S=-$z\ܛ>2/TG'5ڲSmx( %ihXd x^Dž0Bfj}7>% FUy hh1ȇJJ@[55" JE껳@{yb:a#=GbBn0}Y@)+EABLfH=@7Q!NacE5J_Q)Wi,ȅ2⃆f*:m{B:=_fNftM"m:^>֫S><*Κ$Xܨ,sCiJ{S-tZ.c{P^08 b `:?D#ۼ%; Ϥ|#'|IfxO2yKFSH#9lRX~Y-ŗx? 痨ᖁLvAʢi$:ASkNdq'(jnxaӋu.y";y;>ABCUvAk^nSl2Eog[.Q^u QAΠEY6|>qVnnŦ_ un./!DE䄛Ǿ K1Cpg߶'e8b%@5M?-z$a#$f3ւ }<0<7 04+50ϩ!boeeuacY@LNAO)Х鮈E% LXY܎\:Ɂ~,D>ԟ8[<ԤkVFҰL~Q-LdT*ycSPDᚸP'״f*Ήu{}9p7H1Un E4p*$E:Tv|l=2'՘ʾaN"]LlcedHB_vpMF g:ZlX9Mv*\?aD`>)jsA7V[h O2a>c.-4~0rԚX4g z2T;Dauaq6Lx|!GQHN3e_kLhw'ЦBΜb7j&ѵ Es4=_6FK o^coٝmO i- 3)BbFߙHGx,ve 7U"Jփa$C3 <4Tq9Zb0ՃӄWe^WK悚m&ʗ} py<LnN=uИMec9x,s),+)yC/p}sq-'&VC{x' 9-s R]˄*||ɯWgl4#VdHS_3=աV4pi2 6K%*rNvҕ<}H&(1=D;YVk BGq0 #ĝwm 4H땴/ϾcMC hU |{\Dzce ţWTlDf=<>J6^ZPth=)岼p`\Q[pdwP!;|x b#{w\bW4gxsW!,fƱ+IN"C'ڲs;9Bo3|4.TFm^MZ>KH0u"+ঊfA0eLfr<(TwwE=g7j.5)%$ibddCz=+MJQ۪Vtl<ƸdDЦelaվ?eb,k.˨ ©)d$y'AӫL8CHDZs{^PUA\|YU%; x"(!j&Pϡ-=@/ t-Tw <ҥ%ӒS74KLC0jd^U8͆,hgcHB~Δ!P]bRwv-Z X64-Yey(t^&PYY^&YŹ'O$B-\ɠ+ƨ3iv)]q':Cv!L\HΌjjdN;he_=^A ?fֶK H6s.1?oSof^_t+$..nfE,, vM6fKE)I:]8di_iCfZB=qcdޏ͒q1;JˠUDRm @sڕvQR9slQ-vaXsK'^O,b&`(w=#57ۨde%"iݍ~QCma!?EZI+#r5zMc)ὲϰ^:9l2Td#ۋڍhް] Dן1=Y=V.\'$%7G UO@u|K~r(ڏyY Z xѝCE)M@ݎF OEA]⽄rS!bqJ-B>zzΖ/vT tG隱zFݓ9X*A `޲-Ue7lh?DF].F19=v~\NlgMMgAmri;QV$f]i>UQeZ$hoN`qK!6\C?-}9r0Rj6;;nIZ W0hl(c91Im Zڻ ,šJq+SmEgpe* ,=+\M$L /Ӟ2x}d\Jl x-8Ah+BӼ2.jy׈IrIe^`0'1r+:xɅ]7MSr4F֩a >a DpXGANw̧q[~'F}R񌖲C(q5 oNL1KL#U;>إ΄ѢLd_Ȣݣ۲[R7W<q3sGk/p̂ɗ'i,iMd.#sogV !l/cuJTza9il]P7ݣ: +=D&~+R~kDF%uHYp3+#uPPPoѸeU7&: -( oeP>sͩGcPvz &*D;||)7LJ#B͓̐+l?.ρ" * $7=t$po]joҔOr' Y)Kysf,28=W!2~蠉'MloP\֭H:g>FyHqP0{ˊFSZ§ )͕mX~FwTLYxilt|PC]-KBWE;l'˼;J}&ӄFXA>P;1ߙ=~($xCj$h;Pb[RQbgR"{dƬ3(f}s wk:Ȼ8^h^'sf:k.:7VeJujg+/OR}eh`Qdl+ᯤjVȨxJBպguҿ;H=[O~V `LooR )Љz7׻KTi><"~HOŶJ]p QF,,|X) R}qm7FG:)xк*r27&q~fP{_UQ=^o|7:(i]N'|I28ߖSryBjԪ-i7Uވbp h_qȑ}U;x<2٘N◍dK&6op`kC\!.74~'piBϼ6D?ôG%6e4 'iPJXgJL‡GjO["Q w* ԓPoG}+6}^K Y-/8Yڃ8^2'e;ӶYN$t3yxZGx.jxCTNï7{3 6Z~ (f` O' .R6LC7w`E9ΚGd_Gu iҫ,@~XߚcUA[rZ}hU꡻/LǠᔶE$3Fpd AӸ|`14(%Y>I.Cu1ŷ<6 ʻ#SB %dq8TATۈxXr m{%)r7*RA&ww$W5{CKm3 |U]=qlϷ3/8d(,ԋ ɡO6íl. ~5锯lCK'50(ʁP?ό7#3nMH/J6˺: eqsQ XU˜~?rIfA5jΤM"CM .]q%u5#ƿ@ msأW%Õpz wjpL͆EDΗ6"EѰ+׽.͍1S m:l.\a=Q\-I"vXૈFC|yD^}%%LqY;a%<5.cWE/T rL=:Vt3X037`^-Y He>*D U5P[_8298"^m9j qDvrvIe%ɢ_վ]|sS3+"&h&nKY! &Ze& aG2o UE&:6wyKrāő R8K58=֜1aRH-x-ٕaLA@m[7 ,7T6bQǦc"M<441>Hpl/dzzuӏCn8XvN@ wg2ex x{B Raǣw0X˟ntWYr~HŇ8=%j_B뢝}w xW#ZFT RV@c@+,gd'#$"Y ċj*aT/ :(gzs `qiĹIw6?Οbnfraly~Z'DN^\Ձם/rWB!J>+?Wⶠ$ T؏ŽX*"t/$>U'Sz4{y((׀j1FO=Dʋ#Zĝ Ybv xowAr0q#jVXt,{JW/FqK`}"*sgr?pBLY`y_BGDerztC݊5R,D~@yٖQ-OV[|I|FRdbJ_0MWVfƫ5e.}E&Z!eei,Ģ0bQ&r$("YxLW}8T`PW0CV$tQ 48!xlf9c= Zn`B1FG m*RcF'C: {$]AU9b1TP9 k~4ĀWzssoc'_,هi< H6RӃoF%sC})Vߙ S*[5)$t09H6uՎR DM`I}j)ƎN@h}^||yq2Viɢl,1FJ:D+;Qaʣ{%q]:w|agkS >*3Ï<߰yIi< |2KM0S"xѿ9m؟ rޢ;\{o<=s2!XNޥd5۬13t<ݝ}܇y>7N9 +@+ }EHfD 0z%ڪQ6Z\fm>ό>ܮt߿W_h>6A t{#H[RosORFWp 9]츑w-mYo><"#m7W}OۋvLv 7%Qm]ߥ(zk ob6y!T3{bЕ+8I&K IsoThUȮ戀r&Ky$2s1nЀv7l\+yu 5݃lij߶W4Kڹ8D'c0Yn?e׭'/?CU:-Au8^#btU+6J!lAZyGq>JY󡔛8K]f d{"ၬVZ-ԃ=*ɺz9\EqXc 珺C%鯇H-p \P7EPXp$VSƽݐ-H5zQWJ>u')7n^]=L?ZN—4a)ې8̛zJY%2{-J-JaGeD e;jėp_.-)ؽ;~Dg,7 Qs=gnL>/#L 2%ع!*##FN푀0Y([EAV --qGic"uI+Op#7 O"Tqh:I4L98T'Sɔ b(87\DY" WRG38 ٺwEsPqR>2QYDAcݘlD@dne+C#y|L:e.}$H ؿהF){9ؙYE|]LÂxzW٢|KR&*8.5; IJlIw*ɌCQ |Bc 0PQn`ߏ亸YreSrcA:97Щ QPz)Z=hzA’nDpm<c9Լl}_WjU[."*%! ֎L,el}"n9$.>ʥfoܭ85ЂQyc0gP4R1,ᒯ(=_N |ӣY[!24fN8z|:b"$WLY"ycU,X FudJ'7[`bc _,֭*p,$BgTw$jԵǧJ:"Zg]P?FYvb"(z'93g~CG\sFjeV40 M;Q߹Ӣ0Mׯ|& lC="$Jɩ! W^^>[{c'Gb"H#dَRK]wm FLb%E#%"v@ms㹍Gp(jz~aݽ Feb3vAQr'@ >U:+$㹸ѿ@ob[KHjl)k7-p^*MCIO]MvjdS|H(k64A"8zλ x W>ϪV} o^9H/#<Ayt%ޟ}UD,P;*ӳr1?#.5͂/SqPˣ1)@Iwq6ǿF["GȠlJiCۯji28:"W ݊]VGSB} zjm3z\LV IPUK36q".(dNN g{H D ':BYJbE8 وk߭;n}CsםېajsT0\E]Wl[q-PCಝaQ Ov)[=Fϗ ªkU".;~!K;<'^`O6V1pA Z01}B(_e#Y^~cTۘm'9ؽ{FU|^W&fQ1sC}+PL>OjK&.5n%||70vSieZnzjzm5̷ג%ufn K3{ 3FL *G|Rk{ _|KToVM^ 6/.<ߡMhho|&`)ec5ԃu't jӘ]sqA% "<k5$a^ZK)߉`cC׾(;ZVTԟzMe[(wߖZ ܼu7Rxa؝V |*n'?p;LŇa\M 6C5Hjr:k Jy~Lk g7ѲhM+SvjP߯+GBju$Q@I K~65U[|'%8Rxn\Q) #pű|i9vH[fRzD.AT#{)teď.˞dyVs/Ӻ+ bH- HY>JQZhu:QjSz1 pOHZ=,VjںuH4XQۓefǗ%wᡓ崼N*tW>-ipH!>l4@H ^ Pػf #ș1]zzH~F^h)-k!UOu{<c؊!bo^SW|2mI142G\nS F̾KFTi!DlƓ?w / in)n$+,"׾_Tѫ{jܠ=;N_[kWf{:TO E?5\cSӵԵ(iےkz\aKNne endstream endobj 403 0 obj << /Length1 721 /Length2 6909 /Length3 0 /Length 7498 /Filter /FlateDecode >> stream xmwuTk5R5t 30 2tJ ]t4 HJIy}}׻ַ~>g?g=k8X5'TD@DPX`a/",##PCAAh,  " !!=Q0W4ۉo`A`0 G>9>}G( ]g P3Zih5 P>`8 s"<g$ '8!_x EsF!=*u5!S5iiGeN("U? sBPH/ߴH?0Ax@}pACQ}$B Ŀ, C s@0o X oϽC!0s$?G􍍁f|-euCL  ? >lZ῾#e"Dbqq hBA 3˿ߋAfNrn!E|㣎f|"s#G6^WS|_0I(Jy85nᲘ%jڨ6Ϝ(ݭ*Us,k'_y5?u̴M{G>tFrAZX5TIfuYx*h6h'gg~ʧd(MK~ 2@4KZ*,bfIvjA:7"I쮿eW3}ݔ0`o~ϔiRm.*2ua-ɗ!FYicD'jz>+dDBKx|'V6_x_w'ȽiB&Jw'M* {b#"߼p7)T)M¹hkXw6=Y,* ׷]ٌq or>+'~\"&3P"><_{3z `<,G/oM >+f4h,h3Ʈ V=6dEMo1dnhe>/ȍrf SN`f]ȃ)%IFڪڕEi,n]t!T>sffVx]ͭ](pxu8^\Efa }0iOO nMl: 9]%iL #ǥdOxԓ4Vu|K* eOtn>ʿ1ډ6fWqiڄ︯OBٛn0?tZUc7$GdXP*=kDɠyBe/r-r8wlt9*[ /{#NI53~rݡ0&xͮ >،}*6qDg%ҿG@j3KC 'eԩ 6짹3 '0wτ-}0|KH)'QAɸ nGCK=vrȐ޷?6j `#i9Iݝ“0u ^iV)g=qAp-`j*ǔAoS5ѝۆ>F:!jkTOTwq7OS7KD]a =Hh"xS#%o~+#+R:иa T<.l3_|V{{4.9jV Q^C)}RWG͖ P$a6]mM_42TUjj͆m~KNT]16RR q->hlsFcs~ ~OAɳ<z*}oLsGKa[@h;U1o9Uxqeb~gf/^$@:W=CZ J";K 8 EAgzE.M/1!ݑmН=<2+gեrPɛQh4c|& Ͼ'|aׇeޤ/ZEԌYk>!wn?Zʡ9l e/2@g;?z2$铵ЦO4~C.iJؔrIkRDP4*PWw+TO8!CՓ$S&O,o]ULUh2v͐N9Ռs&вĭMhc&WwڌRlu'~p晻 1g2p˒>(+4v$ pie`"!\3okWɥUT|NS?j K&?Rf ߠIeS[b[}{\w_SG'!Q31~XWΪwqjV cOtg[}i*`Aw9nd!.b :pr3oX!S1Qyez1H1;ۗ3>NN+ᭆld 6Ufi YB3VMZⷀga%ڵwL^O88 xP̷w-7;kKj},cv&ub:qD{qӦ95"  \YH${#)s`AXKn6Kݝ;c804rdYA74MAѡQ]$AJ'ݸ!􄕝M[KXeI͉tE"Tr}~is :u<1x=CmVyn25:A7|%55@x=dǍH>`ϱvBA}csoTur>KmY0s0G\ K-o9evVb*>䢻pKrZAf,LF ݄IՖ4;S)!Q޼񣮍@X=ah>c`"](umX^A"1Y2%L@ z߯wMK'ԎP&+b QLK /pb1Kk^1aaO145gZS瞍Q:Lc7slT6 Ҁ,1k3;KY6PvŷJY,L] D^\}K*̍bWQp [GCYgm9U2sd% FO;P/w wo"6{^Bgʨ$e%XP<֦mx4;5 ɱJռHg?:S0k.O=Œ7&I} +1{]o}yHwwK: wlyzMtg؏jx6[݆)Qƾ5-JzVansf8Gfϥaos/Q=e}ւc1T1˨ ߏ1`hWg@FLuyn %T]|,J9? -fZY0$atӫMG7<MNX2 +t0jАUU@5%)r`%6.tY29=E/wlaE ӤY&(Zuj>Y"l_я 1b}Tϓ)Ks,И nUoDnJTl~H 7z2UaӬm'a^kn~Yz?#4n.E/zMGR^Od,JJZΊ؉C-ا H5wk?\sutVrlm ;gפj 8߅}@9 (]jG2Ucًq|*1YݾfdE5läkFZ{1mDɝWjs3Ud4f5rv_JJi ď/<7ewt$|x >n{Ł#٥ 2?Z_iy\q^(P'6Х{+a8sY|:0Lx@ p}l^4)dh>`6A<3]oVŊ}%+ӟ=y[0 ." 3M-IY)^߫G{|+q"IbYLpp @Z-^: %4d L߉mcדm*}r<KwZ*_{f=uF\e&G'WfE ;R(nkK=$J0}]BuU~ ἅuֵiU;r .COvIM=*GE+ xOW-n"~_{z ?7 :Oԍ>~ZMMف9H~+yo* ƒ0n;)o.B춬u^# 8P˶8':wDO*3~6U'gs)>hN.{4|~Nc0FVhՎh&NB MٻȚl.cg+U1C,44#'`Lk)u*T/MFeIu:i8HQV$ 'ށOI@eBEwK2G?Z}N!V5W{ٟrf(Cm%ɧ Q v o%5akeO(kR![{Ma`s4s~L鲲>YQmyq3F6˒>v?eoJ]kfdU5  `7&b]rBYOm_Kv_Y}~7fŖ'‘Y S69v2~hu"^nRSm]7ٔ|޵ *Օ?ڱyg&mb|u_&> ӣfDt6rW\{t9Iܐt̺u_Uo nbVsnG թ9 C0]_ !<=ۼ a:q1aa7 T{Ү(kF3 2J,B*Kn> 3䑆Z-ZSGFJS endstream endobj 405 0 obj << /Length1 725 /Length2 15972 /Length3 0 /Length 16502 /Filter /FlateDecode >> stream xmc&ͺ-Z.۶m۶]oٶefm]mXwܑ?3$#sQt013r2r222ҳ@8\,D\܄SB!3!3##4 ! տ6FN6n&nnnnήN$.B3K!ddCjlciB(kisP;G!43&gs8ޖPNLUH\A^PLAUΔPVt;g&..-J6F+^'HLL&.sK;h&egfO>B8"4jc#od upu8ٛŽ? 5 R.F!dg}1Y:[zL-]?c#0tO:NUS{;?]w{ 2jj4[vٙ؛ZڙçV4O(B8Yz0Du=阙XXظX9٘| ߤӗ]Lzmބ'*%OhfnPf xeFr ^;o6ИorG꾙({<9MZBRig]>BLDKZ"kVi2>$ h~pՅG; *= LoX>M EhᵱHx~. EaEa2jT@dqGj *}uh\+׌;1taZnf+,/k\TxDv7]@mKZX,zH0FOE+D%(,'~CTt/6UWqهw([ݍUuRٻEIm=V).}lYԸUr:,"k[4(Z d\2SE? $}jP4 ݡ#k$צˬSSWƬ,UUGXrGm[/@<B)F~CL8.BrzvZ*+|AFt8_de8yMv0.R[%NI/DV:ФNPC$C}EC :ͥZ_H]'_9FZbn6SvnP[Xx6<76b+G~-(z\DF2댑ts`(0xObaG7 ``1R+OyL?\yc5yIy-F3, H!p3 V~4R>?N# >U^Ri`JHnѼ(pB ~7iπq(3ɶj sXwb /36?,֑F5ͦ$ul H2S&^a>&`[i_˼naF=PgT^\C]6$FEՏ̏@-|(t̲4}f~NNCtTE3G[ױ U<02vj &ȓ{bXHe\pSZWϷ7zW)_"?]Fvj~V !ŏ#GDpՌq*Ȓr/O!&gRnڅ $ޑnV4pAwW4R-~\l-} [RیQJW|}IGfUݗByda,ֶj,Y4>/xG(9ݒJ)=-/_ ɊBcLPͦ>Q>Qϊ&V-fHw !2p#g\[0F+2d1NkD**԰b~GkZubwE O1:}L⧐ gNCll?Z,x0Tc ?* %ѫ$9̜x= oN؝)~{Hm0;e ǐ 4gsZÝW "g˛"ָ\* OD#2yyH[`s℩IMTfR;`@Vy9)vW}dδ- V6G/e(Q6˯e{_K%wTSRL-1H")~{ۤS" X@}oc}jpg;juxmB$+Th,SoH7 ӺyL?쐎ƍt^D0H`lj:ҕᓓGSw/6NF)D&ju5tLvo.}ߴj L^@~J8Қ\s[pYڍSyun!C.Ȋb&n`5 Nu__.~N=L2熉A|'eAK׫ &V]3&FkSYL@ u$!>vUM^RosK

eU>@)&&0"aycD'up-5LMPYxG_',mF0}ŇߵUo@C)&wNtLxP 8zkSvg, *Zd raFh s0׌3n)Ak/S@VJjJ uj fd keXףm26AJr#0g1GMiEi>mOh߈Ӳ$b NI p-)RZ嫐Yݖrt{zΊwKth+n,FiZ82ѐ}S9B41ޟSڔ2$G=ɧ|]JҚȏ0E&$`48￲yĖ8[AC|aX'po>:?"ЁMH *IoD&1Bv󚣻*NFUh Nk*Oi(k49BZ H<8$;,Bd3+4qJ;*MRLo ~kc\udT*Cẍm=z^ =Q-LχZxny%2od (j3i~ (S 峓/!1Q(sFU^/֠?˵åd7BQz5=iٟY83lgy7hQU)Z0Ҷh;?N3~l(!2uc &.`C OTaY3Zq^%{l(#6[Tgn$%]WehX!ث_nPŽʳؔA)ظE2itӋ>!kqqWA{U\d:(h߅L[;v_Ȅwpd+BpJSښG"MI'?TZ֯iPG!tD7NO|ZY%Q[maSoGq lP&G|Z=B@an(cKڮvX) mЃ*NŲ杖ͪ <%VakG [e̤ h%$t La׿,E:5r^N`f;Ġbap(kc{%t}ɱNY̿0˜x)4W0:"% O/@@ߧ/%0VIFp̳!ßPABˊ'>t/ p<0Ns,g4S32F0B^^d˅]:υ秐΄%EvsPey#%6A@3ssX7Cp A@=-IIf ]VLaXvw8Tdj@,n[u$kՒ;z8dfp&p-9{B"~RZ3mu4Ak &ꁧ!y9[naZtUk[ ~mRڈ7 ϑz #ϙO97K}Iq YtU/h gnCC>Q׺mjE# lRVhm&|m?4m8'*ZjH3uqp N;<8ȵTlrXAc6vG2P|菊b4_q@P?8j+_~% N#K$`\$5\w(D,12Ί;bgc-' LBt j |Od>*80W+a]z-;n+5w Ƌm}kbl%,}?Y%a( ]4B߁l*|w.O4VVag p{ PFd^oAcҌ*VJ0sz:ڿktpOBQb^n(Ӭ$VH',W)Hf-8g$ݽK!F+ǞO;ĶԻxY5iy nv.uZǿd_QX.\l^d~*p)ICC[D57OS%5($C=_@BԔx$g/jhNA]v;baP%kЏlM,T&s(;!Js6}wMEibnjpN̒-mߤI:Ta U0~xϗv] nW:{~ag>gh2^7Y 1~;Հn󶦦O>9}FECx ^; aGE+/kGob+]KƻZ׹Ϛ o;v$܃3F4X L(䫐ߋ=R#UE£\D̗.⑟6V [`EAfZFt<e~9kyw":.$}"0| *ok6Q3˖ N.%C ƬÝQA}Z 0>rˁ+7TNZa"[;EޥCΊaO_Xj˒1~>]oD4y\ѷx%DA)4iǩ1tI ZNZ],8C#YGm9a_T3݉۲nȷMI=$Dsny~|=J]2J qw qjA)̍76A9 c8ӗj|\XgW)O҃`V^bJgWpҐQ4ڠв|H 2quCU-5Ε'V>¸٭|1QfLjUO\uȿa)~ʜ sf|80 ,88_p]m:~ݺz*snhݗٚY2|1aF&RvmZfƄ.l<:iPA`mNqâ8BVq:8dbdL]60H8uq+LWx^]Vދ$@w<7i+ڰ_2sCFKt41GB=3[rW S']F33zݖr_mAqy̮]qӚ4v0^x &%LbS0+D@esE7/u@/bL)\C@(imuצ A?j}@ÐDt8ms ]C44oLr/LO Y'^ (GfI9I dga"Qd]&/m۵\#C}T9,:yiCd-2O]Z/4*VPo;QS|@'I2OTw*Z8!Ht9?{$;sMY.uʆDR <{ lғ@l'?`%*:D>T:GlXx[,yWX"`e@^7h5ݐN>ҮCP"?!m1C_ UW+(* 7|MPҧ2q2An9 AظF #5"9=(jamJyrS߈&ID|@U|8h.ٛ45:Rί_R9S6xQ/SїDN4IZʫ7uy$E>0ؠ,{Vcw﫵W@j-1|v?GyM&-@Jxq˜8HylDo|\\[P40i79°ALfp'&|JΡO㱣.*czѯg?7zEr%IPyn?4Y.Z&i4e'_# TL&} gy HNN$oHZ1r|L% Mo*mL pG6Z3~&\@8)üwD]1*G*}KEs9.d-rʤlӅHRo@*s/ȓ\˧?t>n<s!eiqʗR*B4-4)iFf>䂉CX#\|-W!S葉44V -Y:OΦq VBr: ,yEDQ`E g>rc@\#@s@_'AOQ!ȏu*ӍA1J S @!Ä(j:x?W6*%* .IcR|#a~6 's|f["@`Νr@b_DIIUY0ռIdmO?L9D{UɎue}2M|[b)Yo_g`Ӈt,XsQY]WJ֥Zas'6!2 T9!nׯ9#+lz5BS|"eL5y$F!+$NNpB {Qa ĝuu</hEXuMSFb/Ziƭɹg8+w[R,J=q^]Ԣi<9tL-㚞 .=|Qbe~b99" pHaz:|HBk"7ʈW/psQEJ|)*dS k7h?d+w}E\'ɤ~tt?;q!([^M\ $ JD;Ǐ"?b~ZyNUSZ'ݍ tkȈ6T:-5)}ۋD Q&enRARY2q,Zz?\2TC3U!d-=l:-6+H켐0ȃҳ0v5v+{iΑԺ8tmy_[Os$mWNj ?)uv%Em{F?#?qB-'X@j m`r_h]ՍyҚ2\p ĞOucMJOh*Z+L5kQ-Jz} ^Z3Ҕ vtkY!.fkp?cdJƧ*C2U'nٱQ50J~.I؏x aDW)j$ ;4:ҞC'_N{S`7kܐz0tkhGM=2wEgT{YlQT-*@ i<$B=fGMj)0G#,C'g-S>;< ]N[e/֬>HPS׬Q*,|'{oU 6lM}v> iSsRΊ(7e<ў .L< b _ʭT9)Pig_C*.1O*ge_OrK}d65]"Aj?Yբc3+w9Fcysv9ѻF55༟lXr@:r܆Wy`lr55I{`C@0.z_\(M6'3LgUȊ 0rmBZ;aGX娲ƴ\`\3}rك!:}Ww$!E")pV˼O79X砨X'3-%6 T֘|x趠53{A[ &< i mT :PYZszo9#.!10R}~#>> j[ɃӨgg~Kڽ& ㇻ F@> p$Sb݁(-~]BEV'КOjĿgC}e}G .UYz.O;yo*3x[F+6x!/)"f=󽫜:~L5y2m: $O.^k6_U^”UEɑlݰT.4k!$Pd qjQ`^ҡ{ ydn b8]lR_~ Fa`4\LI-ŽvһJPDoyy _f3%?ԞaCy|QpA\WK؟ jTA$>D}k[HB.M*N tNF88r4J%I)Z:=11EEkjyo?Um+\ՂC)*UIPE-UmbAo2;(+zA. ntãqlvUoz亃K4YzA󘩅²4feԬK"T3c BY#{Q/0rM2͠a|q\&L,'q$eZM"^Xq I6{8:OA]5enC'6FHo͋X4;‛TPTmɖ~dC!}3-{+cbM7#03c͕ʁyߜL7GT`艕j8KQW'XN~[C'G~dHMD9;) y͘ǹD1; yBE :5h*yiOO˃sm>e6jɗgį}Y'ins3#B-zy;g%fMBs7C'ecBcd/,o~-V/ ̾?Km~Dg=ғ໵P%2KE(f~YvtX]V1-Vi AEՑ@q#;Z6Z0Q=UÔBWIVqV/L{iv͗fMIH@=_П+TWS+qF%^n#_x\h]Idg<=h l4Md?l0F7ET)_SVJmE ՘fB3p؄H&a̘ [70q># g9`!{A[.(\F-!6#*ĭyjDWOv/ M>(X"`̨?0`#2RS0 f{v?Ow& 葜di bg'ғͰg]2#v,KS#^dD~,1BH!2=pJWVɢ#T\?kq(&nꛦ>{wR{#QL8 `Y+wn88yY4cpNrZ:z2F[;l|[,=d&'Eԏn𧓃b3@d46aYHu&ޒu ~dN\8OqJ od({u^L+ob@6Oǵ썫v.*[(fl]UM0vϞ3{^la|%a}|FϚrCj*!+y!vĵX! $3Tn ƃ)zfpJʷ%mj2f&}atC1M@u]by諮\\iogJ٤?;!< [N욿vt  p`5>z'}ifu|tk3wb/Ւ9Nc]\­-jI0c bq}7XȎw*ye6u^ctRVUQC}Mԑ`d}/S†r- hcr".|G)N8/P~S T̷~o-|Cm/dʨ>Q<^d֦tH 3JW|K굅F5(q`o9>Q.mF%/C5gs0}M+I:ys G:PNDLgQWm4e9ѱeffFo>NG-:g@Uzmzw3S2f6糜 ɨGT.y?ZȸgH `Ʉ }~2 6Jxt&/0Vp v42}\8X,jsgP(Aq[M(/vATc]f 933%|5윁Y]}MIFk?>_WDXF)(?H+l쏇{|bw~L!ҤіzLˇk*Nd >qe˓k&&X$ _15X6vޑHNbY]&nAwE=~UW.H5O^&mepԇ V݄ATX)Mb!j X" ~e[ |A8xyYl9 wJXCq p/5*'^9`G΄jR(τteE3O'ƆJ\IPA*8q3δ<7Y{2̉;PEdh]ruZoӬR]؅jf 7b+E!f̄D}|y.϶ }?{}2Nc S~7uFٕ!Oby*5 ( Zscj")N!HV̈b= eD.^GB{LAz?a9O R{{LHO_鼐\sӨ=_!65{-gpВL h& =OlޞLnuvfjd#j`Kt>> ,.=dL FCBi8 *hHeXER ohZ5'B k~\=[LYa&`xfϲ T2 +q\\+8miŜ8u?gꏗ,}~ڈl* K`ڥwR42jIxIa)IHMi`֖_`Q,1I} "OTu~W17Aw >n'\6̞LvPQS#?Jqvtt%Nň;Gˈv\X()Uy.ҋ WEznLY 9-*Nٻ3և;㌉<3Idx"R}; ,[hz ,Oz^3C== [.q O߁Q g`-g.f)viIfW6=w{9F W i_=U ?[אƻ?ފI'.*~QֽE2EmhslVuF4i;A9r)~ KӴ7\Y:^0 vD~w4ʾe.oz-ݏK:Iw8-ԭa[.?t䚢;1<%IL+z.Z!ykxv4N"Xz}k:," Kυ.ZȌ^9F y&ډ8/HZIjϐ(S43"M*gᩎK-QՋû 13RmHjS1=bh2Q+ #SPbvXEy)u?\[fd~9Rwr$磖݅?5Zwd|g4 nc3*7_ʑ;p6 a%ѸDžzƻ/xw_ϯ(ʖ;_뽕Bڳ.7HIIfc X_1 :I0T>DmGlWƽޙU{Mf=+}+]r F@Q{zxBC*Bj82xiٹL>z817^jDQXͷHdKfS1r*6+<u ~|IГ +۔C`*Rpw$, !幰.-z/ o8/:KZ1JyoT$4NeUgYNwȨA5!EU Yg:^33ҟ-)=!?s\.mJZwbDQ]v=_$:Ȓjs-U5C~?F}IfΘK&hLE4i8ծdQACF9p> stream xlctn6XqrǶm۶m8+vb۶m۶mg;g?Uգ{1I \T<Lib** :fRRa'SCK{;CS. @`b``!;x:Y[()XZ:m,-uҬEpHh]R,}P++amM9N ,,m@+=MwC\y|m~Y<[.O Ոح'^iuurirmyQ"@6C=u% q΍Uu*2x_D篝ߝxmvHR!\6L.A6LrNdOCGO[[ʘ߁ F`b-nL9;YG-cYퟫՃ_Ю"K\S%{W>&R64}Fme.$'(T^/ky&qgd!ܩT:r&/"M{)0QZȃ`8(,&0z@hwԣ,jHO/Dιx9F6Xk|)w.o *pݺ&EtGUXj`z9A>B* 8?*sr/:m]ud>]^Vl.d9*n 6م] uҚ(4:V ro=Эmi{,*Z[3k<}=PЦĎAR/ndia5v%)`PMk`D˂Me{X35#r }_ \HMf2uX XRsUN0k>?6rwNc4?¼{/;sY3P𡆜F6 c~/_}զMnkr(K=&pwhꉠ NL?1KJ};{tK*ڹ_ps}MEsJhZe*S~V=k'؛NU6Vn3MM 8S|w\P*1* ȽO[ږ|c^HP_-o8vf'O_~ )q$-ՙn+Kq?A6a`])f6EQۖ^،%$1(辘$F QvlcdyΨOChB(BxON{gT'TF\(DQB4 C {]ٻT>o_J0kecO~HbYbfJ1#!yL]yW42Y0ƛ. :  ĥ_`!u0%z,Es9'vEsZ(vWʽm#Q+stUBFR +ǥxޚR.r6>(txH_0FzʪR 5K8C롌ZSuFjo&RhYtjPCBv+N ?^ z[&]_OE]уPg74T H^5`HnW> E3|ڊ-~g{,93Η*Þ_bw}R&kI~ UjXZF=*聾*+X}>u)ʃty{e3xs~+F"ph_/HJv8g,E[BF\6 3ڒFnmd, WGw9rL&?iV:R2]UjS;ӡ~Z@. 'h7 ȵ) 7 q hOFZwEզ3R-=)G D'9D|ިJc3h~"sBKx9}TWP lmkqp'.+@Q,M* P"f&菛 !Ah Ӕs3vڣۤ&cqaR7y6V- ΁"r&QQX)!m&Uo(mO6iWg.ml W Z\` ^\ $;̈́v_}e3,50Ï{#m:]?I^SP$!$φy;9Np@{+C˿pay$ٔogج ) 88bc{uiXLfg, .^m &H`b1s¥>ڎ]|6HWӑ=e Q=.aηRɫkߪ|sx$em9m_m$ce8K!T\"&!VA]iw$Rp @>qwu曏 Xhh5=+ިz)nJQ_3x%cpBAQGjT."z~^"h\VJ"Q ggJf;_ A#D_{ZrdR/WG-\; 9B!Wz$+o>Y2Z# ?@pǬ Ӻ`: p"!Xd2Ym! x2z)a]IFe,$,V5rWf׈N6niX4w9"8i{O@Q>Z1kTJSWcf ۋ`^\rD W :Z flXde)_#'%F2Ʋȏ&]ޘغR<3Ji0oGi`úߩmQQP`=7:;8CFKizJoU3Ukt Z 2czfi&MSZԬ6"870<9L~`'[.m`ii 0)V=JQ7IYQ żf:=*P cEI?ɔmΤr5*e 1Rv%~A`9>2tĖX@C ? /$G?0"Wz a˜b,JI?-V^Ukڀy(x׹T\M0zɶ]8(x G^) qGr"+_$f﫚IG `=򳎈*3BK:@A<0|JJV%f{Z|;s$n(~M\8AK5nYɯ'``d {KcH//~sױV{fՖXV'RŢ4CC$\mX+ (0mO&ygn':&{Y:MIS'Q4 8pA|0 k{_"̈́ O֪"ud\n#4w$GLH('y=:B. S_^(@Pye߉+ & r}nczEF/ոf[t獩w٭-krح˻ =nBZiGsu'|G^A=%6:j˟ݑ˓z\g9mku g"HG5*]C-FE.{bBE7¼J2Ne>w.-(z_= ~Jxpޜ \3b-OlI"?Fj@|7b^8ӑ֘/F(\E40FH?D$:;AF#sfфL/$V!5VDzzOex1oq33 Hi\ˎT;>SlB\I(_?Vf1ΜޡOg x: h%[9lBDb@xP" Wq/#:]fX+nQWo KΜaQNYsbx=<$uDR-CO1'+_3\{{TڴAK,Gu3yR$.'@Gws&J_Z՜U:9|Z )"?1'>֚rd1 _YwFa!z:CVAu~,/,ߞx>1" J>7!s7C]0ZX69gAuc!ߎߒ+#)PӁ+Y7 dDb5U +Z$ou%TY-H\ ioQh_vmɑsiO jT37 }CB+0J'Y:"|`ϙ&#;`?^bw%i5]?\*MK}_?N@aKq'x.s!\1G9҂ :=¼?iMumB<ڿ#uNE-V0Zk+[ŏq/e42\"a0#ӑW2ϡ'zT Z ]_Lq.TR΋ pR{Ekk IKo4BP,}yp}!lpَ{5|,kvϡJ"c4[u/>A%NUO@o1&tkIn<1,M\U|&y76UMt@vQӰaj鲧,\s dv:Lvg?UoXקL%|SS`EwF̭ ʦ% i8,NQ2o?ݷrLBkfZxBy-_d:Jk y&MZά'իr*VF_x]k]EO41ޯMx *J~ſK\h ˩+llX6=^d*VL %%pDajdmmN~͐(Zy+=O駁k+B$IÜg_(.񠓦-8Y6Pa_t7 (RRcQY]ޚ"q ,l6NqdAG$:5!wvw"F7>(Zj(&$;Ře&oy<tD\ƲMX[q8`Vu snnՓޘ +hRWn"ÑruYi6 By?q09fAt&/WP^0xREkLX4x2ZX2gz(,^[T4.Z.I"p"Xk%܃&:@UˢoRW5LL1*gd݉`oXR"Bhs:ت/sR518ʔl^УiJ҄˚i!R1b^pJXaVs)]fpu#!$H[؍S@]gOj/?'H:B(o"_෸(0]Dy.wUӴkLg6U$- Ll׿WZ80j: PH>#[`,kӧ-O_E]-OR Wky _r`|}Oe'V:(\S¢oze[J 'V֮vR@ umCTCRhpU$wcjD;O/b@A[rW#YpMǸH޵PDwG Qhr ?2S63,2?#yaj\h{:)=qCܼT;J_hڦ;@P5 (M6NCvxM8):zn+;4lGiXNgJB™+E5?xݱuo@-Ndg W6t%2.)8N۳pt%cmM=n@7JA  TI2'>& =[j<+ FzM{ P8Oxϗ-elQ"b,5q}h衊|&AKʍ SKwD\=he MJ~n '*&g{wͤ 6|ǶHk$IYԟVPHޟzd!B 3hPrnt4BRj̖op)gHm Ps:zuѦfd/.Ke\?e (OȞt}YT@y/t5'1 u=gZxhG|"Af҂{PT ` 1go"!Nt|!WB}4`nLhnTӁhPUOM.?EhZjڜoabՌU3 f}3&31UtZs"rTe7Kx]j%oMa#pU01UytgQ-7?$ɩz)S(UR cGͼ\Mh0@8g >4.A L^+TBisۨF>s &|WQHbnET̗3̜>,KQ3yftvJBTOÒŔ}!mc=_N>sd>*>蹭6귺s YZJs~HHM a #~}Z UF]<'mYLB< !X>;W5鷐[G@$x¾ o!Ui$5#;ڰP94]Pb}* F.(6~7ɀȍX;( "yb15/^;(,8!{zf⡮vT!b?k6reQ GqV4j&(PP E7K!H##pW 6ȅ~rS ,Hv9i9Si"p6Q;K*6%~j`6L4.,}:h8FAM2a*[St" ^?mlDB⴪O]_α&']^[TiTңUpIV7Vh bʌ=li2U^뽾h"~$V)IXy V'z) 0tE@6LU7O-ƭ"!DYΠB`|4'OS x&k⨁+vseسKBn7PZ^-SGC:/yʆ27Q;%{|лT&B5 zY-Www#|\^mprP6t ~:ͺ)wF~{Hbea5%jp_tu@lyehgFrKEK: tx&\ 8nEi]4QYY&>X*)ALr咑آADHh%FRw bc^m i_x֤eF?{>B5Gjs~g3g=uWYU1@,1 0*9㰆?4bJ2;fy7ËA|&AOl,-Qr4etR8,/H0JQ$$jaW Ÿ]` ȄFꃰ8}]<6"95oo3l8;%9G̸v1]t`_W}g-4ժ/Kw) }|W݆JqJBetnYYB5ow݋AfԂ׭3D)و.j(~JOK2V EC@qDoOS8[;tk4gp_=b5=^="b4EJϬnj!7V༛eL j* *FK+Hf[Lt C )#0;m/EOI̾>phX~~ GT5Hزr⃼u=Sv:Y3^ B0̚p,K)*cisbtǃ]~i<"yN(A;f}rYsH-,!S.Sdr뚢d <sX`AG gCכ-,}Al"DUP܅Oy 4T"2Wh# c%ݴۚ=Hq78aTJ}tyQm\!912 pMn>e1;8_)~aT)hz02VnkFDt[0AHYl 5)iiͽ87x:šn ҽ "+-}Hg7bP:QlkaIW4h&rKja4/ۚы@{mMXA/$B *D]}KS/PYxvR $,dvg!0&AE"` uM*3JrLR_kYx2UKtRfPz$8@Šo= >~$+Bx1ba^)ONaJn4nL2!HO;^8#lP[Yy 7#Jp;(8$VU&Om@KMn;pJ^T0Q}GrȗêU%YCw޼gGx=KK t/?@-Po,WR1`ܮ 2M;M1> ^H\ !;~6)j;z"xGqkHQm7{ Q3IR+H}-Л8VW؋ :88V%%- QJz[CFjCTu>-:،9.3yqvȏ{(kk%G:ϱP`p#EFt=.K#bQy:a4Kͣ6 nܺ AaԨbgHur |PZ9ǀq%ȅ%~n ۮf&踂) Ex_Ά!av Lz0֠~ JiODSh3#.7RDyGS}BijXV>0?=''A3(nk v>\Z+|\iV}4*aP_ixc1Q`C运d]i4V { :U>߮,8u@9u"S|i&)ѯtah9!)89'[Uxsޜ49Z9~90en.8FHɳ.IwÎ#Ĭ:P"hk3/i `?U`Y* KrDcg!ZȞp4V8 %^\_z6 S*2ZݸRb4 2%DG$'bTyff7vʜQT,hHk]]ϢF<>EoLHO' >A_="ej7L@J2ZԱ]ve9Zy'2|HH`4݈S^йp/^7ϭ <&&Ćrj]1g8s舵 ٩S=rT ~Z@P&м8?H;ĎOlUl4ȁ[x*sS?W9U2ts^A{٢~ɜ \1DIZHQu_8? {NH8\ͽ8gT[T+1xcwsY47aYn$\;-/c;nnb17+DʅĨ̤7W<zR‰ÒMjg}h߆x/ڞa9A.  EoYT4o>iϸ43Yъ%A" W @婡,emfά;(Vj5|ysLs+,v#Պ'cP7r=<ޒ# ~ ymDfl<& J >(xK6U|±-r$1YV cDHW(~;J륬OURV;'!0 y N}35Z>q L #&Tw&Gvyy5C.9Ig /fet:9l?jsjzWNn} 3FR,I,%=aYMp3C+r p^^U ͝'R,qK\޽\9 J?JN ߑ Q()wbYxE HBw${Hy(<4'32%%|ƀaȭ~:kP)gQm.wR¢:``ʵqԿKkdU]rsw11͜!&cl%r\l@(63$Oy+#Cˠ˥Iw'_jxk&m+a+<[LgBitؙ5J i7MkaQ"k\xmº 35awY(y7Ei'Sy3ʵU+–}M OG q֍D1[.Gur_5W˻_xb"`6reVV7Kao̖l4]>\ܱ3#hggt5't>w7 !x=~GktSIr`fSIh9Q ֓ck>D&8 3ua%jɌB`z3Oz'o "}(e?Rcy.v ר(''2NFNҩZ6O t3ZS%CF>;BSF,~|oeSEk{=2kU| ~Q&T.if*ŐM4YzJvs1T endstream endobj 409 0 obj << /Length1 725 /Length2 16161 /Length3 0 /Length 16663 /Filter /FlateDecode >> stream xlc.]-\ze۶m۶mۮe۶˶97g2XcȘ3V&)#-#@YLE@ CF&djbio'bbP75(:L 0da{O'Ks 1տ5CK[K'Mٕɕ$eSS) ,))'Sڙ:\l,2ƦvΦT3{'09?̜m*br*Qaza @Ft;gM]\_l W2_N`&.#SsK;&igf`\r&fDښ(m\]L&NvqdB m-m<O?dڙCLb& .jF?pϩxʿףQ"[N&k[??XW5tqh3D=iXlFfVF35vur2s71ƪ1wUzkXh|8**#L6尅5΃ N;\ɇbxSUR*s; z7`jضr`.A ,yyc *:v֗ĩt)P~Lhj-Bn7@ nɰ-*µ 5%0Evwݪㆷ!2Wt G!oywe syTwyY|#^fu(\f)twEa`l6W\d'9&Q+-O1ۣo΋>ym )e@l]ځmڝAK%U2=1['",ݚκpv8R [2g5 y &\5_Ү#K\TEzW<2ҷJ5< UxKʠzS!O,>8c;Oz^W/MrBFN*A81u_oݭ2̽췸ڪDP0 !e 3-GK^eGqsGx^䀍^R\D K$}u󾃬?FDsuVw(BVŏbqz6+?1w~*eM^n@wתJ.ޖD:cqtzgz -U<8#)-{íAi\y-!wY}ɖX7nkK Fvg(KI N94ġBFhvvyRC8EWW2?c}aagQxb]c~E990RFD4>:+=(s qwtUm[<8"\cX`FyCrPܪsmgSiTB'vk?q';-4^ܑ&l dr1CwDwPڋ.hutJ9Ro,eE Em\9͕Z%W OIo=2=Qg9'>cn G `1L7~&96zv3CCHl ȊFg-N"}РQDU*eԢB~Jmp!%+NIiAnWO%iwI0[9^<91N/ʏ,[<,gScjEj=Z9]= Ͳcsg呇Vz 9ۋoضUK(j0p0%$9uyV |ė֙2P)M:bswmc=N̩@^t{#2FF,8$Y;(>.A>I#ūN9_L}T(qGMhѧYu۷k^م|:u,RNoXXgQdt8|cAt${ A]c -(*n&@rwaP[O+o2\7:^uaBߘR2ͭt ܪ 5ߚ#S?j7L$IK3;SAsaɃ!fES%p3iid6aKu0U˙Yg*.MR?g&O'2sʻ!A]icԸ!Ʊ${r:\i_@torڏ&cf"쑫~5']>oF(G #C+_o&װ-9n ]LͫJ^]:$4{+]^$ +ug!guCK6I3(hցAzk~jp{G*TvJ@olR'תyN&x41q@L8 4\ڠ}C$`agY$ p{lr>֫-ҩbPL;&,^Up$cu K0JMȓig4ÚoR W?hY/[Ь&UOxOkh!=P7GeûQt.>ԕgd!P\ -@?' OP_v@HH:eY,P+{P?aM|}P+jo e[ BW3f!83Ecs^ʊ,RMr?%ˠiQw'X7zwMStBufNH6G[.(fVAng*~afɦ !ƨ;EuKoUH BCp,eZoy DODeAcCCf&T= @L>`';ͩ^7n45߹&.gt@[O ق&(DSDIP*:LB}eJܕdƯ*Hehq՚[pPe(=hejP'/ [XR@0'd}>,-BΉ{p3_tc.L[=ڣx!q :U >mx&܂EC)tk2U[-zaZ(k2nT 4^w%3K3̉{4!kjJ"nۦp2qo`k/?zH.T"*=2c4q&x2SOCb^Bq$t&ʃAZ̻N_,V/ty4~>2L+/{sRJ&/MK%/۳GBfKq)*XϪkGK8][LY/W~M>T^1gޟ!ø s$Ï22g"v|˔H 瘡܂YB$\ZXAs× pec(D g"Rmg۵J3 8+{KԒ~ O^FǓ::%*{bJw܂!.)O2~k{14f܋qy\'Zj*N:jnNelZ&VdC)tRޚh{fNLjܷ/B&a68={UXY q@F\ys\qa]sޞWihvP?9r@8K#=s?U3a3uA4<+dډB>'c8XTOPŀ14"c캱o kG@,K/t[*, W b͏KkvL-%DHqRe[]&sQr> thO&)U޸Fnsm4#GT.Ljkܑ/w%&"]#:F~$ o1 Uٓ_'`- AJl}~V|x.8슴vh/@Lq{E\V|HA[tsMf%0e65VxW P ^]g3!3źt r;NNjNFV[`Q Z,o1n0b>a?PtRձ%H坫}] ϫH.(9&o@K Sj<_$q_g!sI8nⅣRcf2+DT @*O"ѿFo!p6ST^”J:Ϙ4M88 ~M9|<1A F'h&r\S#K #޸jz^cY9ҝ,|=OB^0T!eq_"S4]ίSNdk8 !EBth㯎 ۪?0Gד-1t`,x្d;<$?65l\k<ۂ.c,L¿_?˱eӼSk/Rzs@Ҥ*H{u^2Е=m\Noµ--$R}ǒYxNHdRrlЃ]uaе!8&MQ,[ߜ3/}3)M65H"RvE$71IΟ6;7u][H} z!Mփ;H]_WQ@+OrjPU 1Re\Èe]qTдϟ*8WkaoM|DsDE8,{SPq=+:ÅmĚ~ö'ttMh,@_~ud[p *Ga3wP887;S޿FR`> LF헣正e!=.e_ yVRdxoqV}7P4P^vmt!ƥsMQL.6rYb[9^=xǪmeAqJP@CcXI`VqMv1΁;KZ52a$U[9G׆qN`F^䎥Th?:;n<9Ļ a& j$!d2jԇaZ,G)EL c kpIb(&{2":$<Ņ/ `r&_Q-l|tu{hf۪=.|pԶ*|U.# 0u臜bI>9G@'2;xˢd2z|*QabSUgM^Ò{Tp]1@AުiuXpٟ'?M-lwK!+gB1?LcJ,hƙ+B#^^.Iv]LO֟|Wa]}_H 7㖲5܏XV^P^ C{xt'ܳYb] m-Zrn7c]{Dj`O/X/~[-m'.s Gl]z(SriЮA̚Ź21\,fg~ⶤxb~6N*PY0'uU%|O QpϘ`=3h'Gj9ރ#6&H^Rݘ]t> æb`6  'nYL^55ӈQ:]ҍ֢L=r2,mf\ҷOړ,Ncyb"CHnpԛpqnaoUrsK+,-R Z-gohG=Bv!-ߔ/FZ>yo:ird,mO]Q&ri?1I bRI\Iłx5Ʒ)n.6j}%&4s6Bf'~UoCyLtR9lՠQ 12^˸,߈g SbJcv/)w 7pmA÷f&A.Ye#.'0&MBа,ƑkIne_Bˠy%W^q7 |L%*{meu RERxIfLsû块e[VxޗTOtk RtuY ATBj18O^S"9L__[)jYbM}V˹`W}X-f{aϺ\jͶbْnjϬTӚ|6o|cO%x!|ǹR$[tH*_~@e*"`;I KT>B`5IwlRz7dRDM8ږ17]fA!AĄ#NEH C#F/f`t ^>?ɓ\N"v x."r]U6vG;ԘmbaMY0(Nks9iE;^I(y)[ % q줦 e\yT]{xҊz]ن=_yB~܄e%Wj#$;"ߋs-jӽ@lLbl挵8h e?{_I |s^x/4rf;vEO_|_P]MH'3ZT@0K3';KyBNWtwC<;HXih/A)yc: gBT_&/#jxJMEw/F(h Rf#yYIrZvV^*+PivLǣIx y= ,r[Co3M#&F-}T*KM^45QjRЌE<;O'r[FpO{؄qfIHPDV&ErwQ<s#3cBuz9=s-7D~Q!V%m%s=N]4h52zxOĔ)S jK_8rFqZ_t[-%F݉dy˝>1 лUƷav$zjoĺn$"1h}95 #R]<32"%c#׵P~>4+k^-WY(gjNB%^oZ+?'鳯AB@t`cz.4;,>TT=x|;nl g$lY/1e{=xr_İ%9<}&%{lre1<7i4ʎUďs]Y.6\zD8̄ yn:'!͖EGѻX5:El.'KJ1j"Kc.a[uMk,G Yb^b7Gm8Ub f 9Ԏ|; w<~$ [V%ȑ~hnQ.A $yݱjeMkM?/xۻH~8кH,V808~>:A]R)78WNWBh4r7X }AM?:Ug-3vb@zv5XDPT'|K{kZIlGr&v1K⅞%!pVq3(xT[gu~G! <̨ys6uF2$ ȗk!3fpjUE_vTPԊ>~AW> ā;돉c[ǹr>1%lc:k dN@B8NpT@eq'x%sfw-G#P'q!ZfA  :d9w)K_s!-++,2{s3 Ԇ8lm=+}B>{ZoV`DKA#L9&%[V/5muC@-&]%%bgc1Yfc?ي+,)3(e7}.ʳqQN{kr}j.6GլҏGݟuDŽr!'S ٯqx,q͂=)ioyA<اxۂC]aU+˖}HJ&Ø\4u_w߿\v0uiwZ0zm85u\l2mَiđ58ȩ9R{ySTm+Z^9Ow򴥉2f+һb]obͦ>%] 2R5X3%z󙮴0)^\M]@S3=,Cro3tá٘ߐA3t<ȁh")gxB0~Or:,R*bD{srF͵ڍ&[I ,P\HWե֝]x/G} Zm|j r"'rQbⲄTA̜hq1OeYr^5Vط#Gd.tk׸tw">,Z,9'#d, cddGVOYJ˅Ey٣ptK 5m3}C-#Mi)EK³{ L,PӶI =D- ``Xx6>!LF]YQ23<`l ga:e`}3+o"}/FtR6vZ 8WGY:S6-07,%Ke2au?,V؞:i\K{Np&awN}sG$][8*8#yif\ji>WN/_g?ҁ3<aio?XMİDrc)@ zl}Ob؎ [؂SцͷN)=%h$]m=a,M]DK*E:! [yMKԸFd$F\ 1 0aYu6߁"W+zs &ۃUᴍ&5zٯKcuq+AuͩdDJ#A<:6'ZW 8705gnHN>4x[ yN-_d Gk&Q.|[K$l${"*5!qSNKOeKk׭1>cll!2 d398)-e-9x[Yz5(@_ɜL} 7Q`syl-wJw 6"/hGA/@Òάo=4Wt c?~;}ت뤍=3EAlq%~ ˡ2hA:S=$9d\`>\IUf}X(ŵA13eA0%Kcu5]Q}\{ث6ș1 WkXKjm__ޡ$fkD?m 7e. >`.}U8Fai!apww8h’ާK sRyXlu%fr~!.U-qIr] ro񻮊 #MX,1^  ʺg45WcFQ-JXܐ7z Fᚢ ƁzlV=x҄X/[!Skrw~N]8UDCcg\kr"z)[Ml{M]%iTxFL@r괛j5 W֫{y c[=g#m %;ۥWsF-T(t\Ae/A<s$QO IGQQ'H+Ri8aM]>):wvVE#GKڎ&&dH@V{"qù@Cw ;N"1= Dm֮{kavzY ~JDlCiK* ?ـ" }%Yto=$ ^o]7U9|2oZƒ >˚_X))ˠ h0$P}:/7w-!i/IbTV!)?@DLlrنb@G<CSU v(FbQ tmPGE^'?/fރy+?^+Q*zw]4h-~t+9ݮ[ zpn3j"5Y(S,kvmu9#X ä9À \#HYd5HDbԿԣhL`y"*iH34e)<Δ Zn(}?E;7_U{w]>[-Μ~c~)Lz>3> 6?/P}pMv\ hu,'%Be_$nJ' 'mer 5:FH@fOIhYHy)lM\-$LCi0:=s`+4ӈCz%v΀oJLMn:rpkP,}~͸eeWPv5c{D&[7硼fs刀~q~c}}*y-7-jv8⢜LyOvUKF+h>wyShQPeP}m?ҟ\AIAv[B$=#Cfׅ\gH{=:&Fӄ?X[_L8RU."`kF#'Da&[|U 4ץkdM}AM 4+"%[j;c;5 jQXlS(nfwZցgw aYL6ZU̢Upܱ/Ęc}b&Dqy{ 粖?m7?ඹe^ҿ9D(.j竼T9o6-,}H2SL((eMU+qQ6TGp4CPEp MA!YAEW#:PMg ] :OCnV:W=L ~9DnSt4hVU/& pE?˝i4#[K j=4> stream x\[S;~WnmţVX' 9To αM6_}=c@vkR B#Z[n*BXxYh1چBEQϲ0Mጄ߮ڣ/|[*"hϱ@,* *0JPH#B*^[` fCz@jKK40 aZAzax0J1C %40*tJ [ @aZ V! t9\6T0rPa% ̠ BWxiv $!BAXQb1 +JlT`x8,v4ت[ނdQ vPl-m]2#. #40vjw)9Z0-HG0BIB*QE&ӓ  IQ#) 0 ) !P,b)5X4уeX MZ Jp,ڟaC33h.@Fy4P0GAF>N  43,qXH2x;NQ0dTmVyKU{aBϯwoEyPUVW❕;A+8yoE-ٰ(w8N`#_} ?~! 뀅!wTǺؿUaxDqZo/"; ~0xF 2&v\XP MH=0~L!j`\Ѧ:v&,qtENd$3ؾR),OLg4#=*˓[dw(Ϫo}S'jaɸPJxx?Isaumd6*N@;鍀E 345%y܈[1ϰE.?n%E j y2͊iB YC;M6NaQsӋ)Jp{4(- E3hQv˳Qn]}/ʝn[}_U۰b2j0LY-ZGױ/LBoDR/@A\m7h F¹f5~XVB*{f0>`@Z$J<@%0]y?|<'/vzځAUK,<UXm cKz4L"r"t z( sQ&[+/b'ئ܆2\, V{ E'N!ھVKj#=魇(Y+2W4y: -dHK%R$Gj6Ӻ?*A`%(i,ñE!"&,o& O'^\7o-`A|&mC"jHVb]XYk'CZ6ď[|G\jLԁ&S;ڒ2'C3o~sKޮU3g`h-WP[_]ZDV}>$ ʓ&jh@ } @' E/p|`-U^@ KH>ؤmen\[\F8c8*\C]+%q 9tpfSyBT8ܿVb ( mˎ!~YKu7떌~fr)6Qf[&\̵͖%Ǖ/.y6Qe:ԡ !JY.0AotA~Za H?28;,OYZ; 9&e ȏgo?<"Bho\rK /@hh/`YHio€R">hdIA"8xp61;݀d͠) LIetwFs\sTruFz=%gmleͱd?%gK֣\i q$0I'ƌK-y9rRJV]{H7Ic>/XӨ|1+z+չmoJPH.AY2k#J2񰏠QO%'kEOх%Ě"BHEL\#3?xӫ kf 55l7k1f5E9\O# }u i@4/z:ZC7QON mT| ={zţS=J\FzX7ʐ-YZ-Gu]y|?ӤNN[WilΓh5tkη䦦 :ﳷ|__&9?BOۓӿnK͸0LMAL_=:~hb|]ʝޗU<U,Lb7_=TN7i" G <>F*/vS_y {} SD:>8@.d.$yy@WuY7/__Q9.'})D,j_4*?OxUGI<ŏ6ʇ 1(?kU~ޏX}5/ը?&W O*'_忛M@=8@=f.AwoWFfaf [pl@ aڸ\qN+@OO@ʦ9]-NM7Itړ9nHyvC>;:< {-j‹'ܻ%F~{O"x np鞟 9q?ɁM7/WR=j=3ۏ^13Bwɯ.)k;Qi 6 VDdrÆױ`lyL ǐ`O7 Ao}>~ E&oX@6gk2~,4>FVM6o_n%ڜ)"|SN?zWUQzSդ)FsLK 7#~OYnFUg2}m#g{yD7m>&A"p0 UW݃$W)aP. SjhHaǏj\..WDW[ɠdaʾ쌍{㊾:Ү*#^4X3U/=p}':Z5fK%|[ӻ*>l>1ȤO?fnv/M&| /^,׼>w??Yiٝ7/X g֛sH endstream endobj 434 0 obj << /Author(B. D. Ripley)/Title(ODBC Connectivity for R)/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.17)/Keywords() /CreationDate (D:20170413080048+01'00') /ModDate (D:20170413080048+01'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.17 (TeX Live 2016) kpathsea version 6.2.2) >> endobj 411 0 obj << /Type /ObjStm /N 62 /First 524 /Length 1899 /Filter /FlateDecode >> stream xڭXn7}W1jъ/ I\bv}PbZ%wfɥH-Bݝ9sfxY) B P`x3 uBFh@a%{#֢YrZxDC"3P(\X%F7ۨqT~ 1J:JR,d3Y4 ?hYPސ p^8"h;), oRQ " ҚhCEΝNzE9rRI"rk(b& *!EC)GKtPr(#n qCrM(*iȌJ;h g qLQ+acbz?4]0׋`4yj٨W߈d||yq3hgϏE}\9}$izv璄 ? _/&P}x؄^5kx瓫2 Wn N^_0*݄Keχxq>~tK^KeoE _鼦yȞ}>/j7/:_e7gW[Zk\|VzGxs4b//:Oc|o(a |n~/NOǯ[~㣔Hiim]6tFo~::~z|hO/z`s_?/nwԍ{p9z8]^J/eSR3MH*^"|c7'ãȨV7%wjT0ѻl9,{7}ۥ͵#iER 2\uwu> #j1\]t>\m&`b  t >M|8셡c1kLP[Z&qd,D `O/{׶;C@9_} VK⠔Ϗ+!o0TrPk"SıM]q0ScM,87zc8؏cfDJ٥ΘtRnd+`Ra\XIXa ԻL'r픈Ao%u7Tr$*jޜwX!#=DbsR,5t$:PEJT*QnqQI]%kQځҾUb!kuu:ƄK HmΦh~qd5}\ ۋ,j>=$sܝr3{~ sr&sjN&-r(C0Cǒ9|fG榟9'i6ɗ Yc9RR7iTέ Z;7*/_ݴx[1{zl .L5qki|Ci E\d+L,MEj>̰k!)r~k^2N'&{fe0yYpJk 1 ] 䖆Wܕ -m ^u^ ዀVh-O["cc䵅/Pް%$PPK^[rډ)7\ 7KvKdmVn {<s0yuoy s28Sr`iJm&RS(Il6,وK4 R|yj]P}Pzi}V [{S[;ӗp}78%>|b\A0Jqؾ;ǜRJ0~c\;0J0]ܮmbfqC ׋r8[ LW/AaF{Avm[u.ngl97^ο^ endstream endobj 435 0 obj << /Type /XRef /Index [0 436] /Size 436 /W [1 3 1] /Root 433 0 R /Info 434 0 R /ID [<23D931FA04EE67E30123C7A415E50312> <23D931FA04EE67E30123C7A415E50312>] /Length 1103 /Filter /FlateDecode >> stream x%IlVU@i -J tb(t-1ą+IsƁčlLԅiAH75&FYqv=w~=Bx!,̾P:>2@%A&ֈJ4 րʀ,'`>TfEbPۋ*e`X=T9b{hn ѬۈMs;A.`'jiGTgF}x"1'4-Jm } Ezj*8!ptXZVpQ EhfQ:MQ3qb,}UhmNB z)p~r 0P:A0F9p\`BOzbpLZhz]]9xZhR]k` [Tbg1}LcjwA7 uuP>5AcjgrUrM\R endstream endobj startxref 651091 %%EOF RODBC/inst/tests.R0000644000176000001440000004105613013621651013401 0ustar ripleyusers# These tests are only for BDR's Windows & Linux systems library(RODBC) library(MASS) USArrests[1,2] <- NA hills <- hills[1:15,] row.names(hills)[12] <- "Dollar ('$')" set.seed(1) # MySQL ## testdb3 is ODBC/Connector 3.51.x, testdb5 is 5.1.x channel <- odbcConnect("testdb3") odbcGetInfo(channel) sqlTypeInfo(channel) sqlTables(channel) sqlDrop(channel, "USArrests", errors = FALSE) sqlSave(channel, USArrests, rownames = "state", addPK = TRUE) sqlTables(channel) sqlColumns(channel, "USArrests") sqlColumns(channel, "USArrests", special = TRUE) sqlPrimaryKeys(channel, "USArrests") sqlFetch(channel, "USArrests", rownames = "state") sqlQuery(channel, "select state, murder from USArrests where rape > 30 order by murder") foo <- cbind(state=row.names(USArrests), USArrests)[1:3, c(1,3)] foo[1,2] <- 236 sqlUpdate(channel, foo, "USArrests") sqlFetch(channel, "USArrests", rownames = "state", max = 5) sqlFetchMore(channel, rownames = "state", max = 8) sqlDrop(channel, "USArrests") Btest <- Atest <- data.frame(x = c(paste(1:100, collapse="+"), letters[2:4]), rn=1:4) Btest[,1] <- Atest[c(4,1:3),1] sqlDrop(channel, "Atest", errors = FALSE) colspec <- list(character="mediumtext", double="double", integer="integer", logical="varchar(5)") sqlSave(channel, Atest, typeInfo = colspec) sqlColumns(channel, "Atest") sqlFetch(channel, "Atest") sqlUpdate(channel, Btest, "Atest", index = "rn") sqlFetch(channel, "Atest") sqlDrop(channel, "Atest") varspec <- "mediumtext"; names(varspec) <- "x" sqlSave(channel, Atest, varTypes = varspec) sqlColumns(channel, "Atest") sqlFetch(channel, "Atest") sqlDrop(channel, "Atest") dates <- as.character(seq(as.Date("2004-01-01"), by="week", length=10)) times <- paste(1:10, "05", "00", sep=":") dt <- as.POSIXct(paste(dates, times)) Dtest <- data.frame(dates, times, dt, logi=c(TRUE, NA, FALSE, FALSE, FALSE)) varspec <- c("date", "time", "timestamp", "varchar(5)") names(varspec) <- names(Dtest) sqlSave(channel, Dtest, varTypes = varspec, verbose=TRUE) sqlColumns(channel, "Dtest") sqlFetch(channel, "Dtest") sqlDrop(channel, "Dtest") sqlDrop(channel, "hills test", errors = FALSE) sqlSave(channel, hills, "hills test", verbose=TRUE) sqlUpdate(channel, hills[11:15,], "hills test", verbose=TRUE, fast=TRUE) sqlFetch(channel, "hills test") sqlDrop(channel, "hills test") sqlSave(channel, hills, "hills test", verbose=TRUE, fast=FALSE) sqlUpdate(channel, hills[11:15,], "hills test", verbose=TRUE, fast=FALSE) sqlDrop(channel, "hills test") close(channel) # Access channel <- odbcConnect("testacc") odbcGetInfo(channel) sqlTypeInfo(channel) sqlTables(channel) sqlDrop(channel, "USArrests", errors = FALSE) sqlSave(channel, USArrests) sqlTables(channel) sqlColumns(channel, "USArrests") sqlFetch(channel, "USArrests") query <- paste("select rownames, murder from USArrests", "where Rape > 30", "order by Murder") sqlQuery(channel, query) sqlCopy(channel, query, "HighRape", rownames = FALSE) sqlFetch(channel, "HighRape", max = 5) sqlTables(channel) sqlDrop(channel, "HighRape") foo <- USArrests[1:3, 2, drop = FALSE] foo[1,1] <- 236 sqlUpdate(channel, foo, "USArrests") sqlFetch(channel, "USArrests", max = 5) sqlFetchMore(channel, max = 8) sqlDrop(channel, "USArrests") dates <- as.character(seq(as.Date("2004-01-01"), by="week", length=10)) Dtest <- data.frame(dates) sqlDrop(channel, "Dtest", errors = FALSE) varspec <- "DATETIME"; names(varspec) <- names(Dtest) sqlSave(channel, Dtest, varTypes = varspec, verbose=TRUE, fast=FALSE) # fast = TRUE crashes sqlColumns(channel, "Dtest") sqlFetch(channel, "Dtest") sqlDrop(channel, "Dtest") sqlDrop(channel, "hills test", errors = FALSE) sqlSave(channel, hills, "hills test", verbose=TRUE) sqlUpdate(channel, hills[11:15,], "hills test", verbose=TRUE, fast=TRUE) sqlFetch(channel, "hills test") sqlDrop(channel, "hills test") sqlSave(channel, hills, "hills test", verbose=TRUE, fast=FALSE) sqlUpdate(channel, hills[11:15,], "hills test", verbose=TRUE, fast=FALSE) sqlDrop(channel, "hills test") close(channel) # Excel channel <- odbcConnectExcel("hills.xls") ## list the spreadsheets and marked ranges sqlTables(channel) sqlColumns(channel, "hills") ## two ways to retrieve the contents of hills sqlFetch(channel, "hills") hills2 <- sqlQuery(channel, "select * from [hills$]") sqlFetch(channel, "testit") close(channel) # The Excel driver maps ' ' to '_'. channel <- odbcConnectExcel("/bdr/hills.xls", readOnly=FALSE) sqlSave(channel, hills, "hills_test", verbose=TRUE, fast=FALSE) sqlUpdate(channel, hills[11:15,], "hills_test", verbose=TRUE, fast=FALSE) sqlFetch(channel, "hills_test") sqlSave(channel, hills, "hills_test2", verbose=TRUE) sqlUpdate(channel, hills[11:15,], "hills_test2", verbose=TRUE) sqlFetch(channel, "hills_test2") close(channel) # DBase: maps table/column names to u/case, max length 8 dbf <- system.file("files", "sids.dbf", package="foreign") channel <- odbcConnectDbase(dbf) (sids <- sqlFetch(channel, "sids")) sqlUpdate(channel, sids[1:2, ], "sids", index="NAME", verbose=TRUE, fast=FALSE) close(channel) channel <- odbcConnectDbase(dbf, case="toupper") sqlSave(channel, hills, "HILLS 2", verbose=TRUE) sqlUpdate(channel, hills[11:15,], "HILLS 2", verbose=TRUE) sqlDrop(channel, "HILLS 2") close(channel) # SQL Server 2008 Express Edition channel <- odbcConnect("SQLServer") odbcGetInfo(channel) sqlTypeInfo(channel) sqlTables(channel) sqlDrop(channel, "USArrests", errors = FALSE) sqlSave(channel, USArrests, addPK = TRUE) sqlTables(channel) sqlColumns(channel, "USArrests") sqlPrimaryKeys(channel, "USArrests") sqlFetch(channel, "USArrests") query <- paste("select rownames, murder from USArrests", "where Rape > 30", "order by Murder") sqlQuery(channel, query) sqlCopy(channel, query, "HighRape", rownames = FALSE) sqlFetch(channel, "HighRape", max = 5) sqlTables(channel) sqlDrop(channel, "HighRape") foo <- USArrests[1:3, 2, drop = FALSE] foo[1,1] <- 236 sqlUpdate(channel, foo, "USArrests") sqlFetch(channel, "USArrests", max = 5) sqlFetchMore(channel, max = 8) sqlDrop(channel, "USArrests") dates <- as.character(seq(as.Date("2004-01-01"), by="week", length=10)) times <- paste(1:10, "05", "00", sep=":") Dtest <- data.frame(dates, times, logi=c(TRUE, NA, FALSE, FALSE, FALSE)) sqlDrop(channel, "Dtest", errors = FALSE) varspec <- c("smalldatetime", "smalldatetime", "varchar(5)") names(varspec) <- names(Dtest) # fast = TRUE fails, claims data is invalid sqlSave(channel, Dtest, varTypes = varspec, verbose=TRUE, fast=FALSE) sqlColumns(channel, "Dtest") sqlFetch(channel, "Dtest") # This retrieves TRUE as " TRUE" and so returns a factor. sqlDrop(channel, "Dtest") sqlDrop(channel, "hills test", errors = FALSE) sqlSave(channel, hills, "hills test", verbose=TRUE) sqlUpdate(channel, hills[11:15,], "hills test", verbose=TRUE, fast=TRUE) sqlFetch(channel, "hills test") sqlDrop(channel, "hills test") sqlSave(channel, hills, "hills test", verbose=TRUE, fast=FALSE) sqlUpdate(channel, hills[11:15,], "hills test", verbose=TRUE, fast=FALSE) sqlDrop(channel, "hills test") close(channel) # PostgreSQL 8.x on Windows channel <- odbcConnect("testpg") odbcGetInfo(channel) sqlTypeInfo(channel) sqlTables(channel) sqlDrop(channel, "USArrests", errors = FALSE) sqlSave(channel, USArrests, rownames = "state", addPK = TRUE) sqlTables(channel) sqlColumns(channel, "USArrests") sqlColumns(channel, "USArrests", special = TRUE) sqlPrimaryKeys(channel, "USArrests") sqlFetch(channel, "USArrests", rownames = "state") sqlQuery(channel, "select state, murder from USArrests where rape > 30 order by murder") foo <- cbind(state=row.names(USArrests), USArrests)[1:3, c(1,3)] foo[1,2] <- 236 sqlUpdate(channel, foo, "USArrests", index = "state") sqlFetch(channel, "USArrests", rownames = "state", max = 5) sqlFetchMore(channel, rownames = "state", max = 8) sqlDrop(channel, "USArrests") dates <- as.character(seq(as.Date("2004-01-01"), by="week", length=10)) times <- paste(1:10, "05", "00", sep=":") Dtest <- data.frame(dates, times, logi=c(TRUE, NA, FALSE, FALSE, FALSE)) sqlDrop(channel, "Dtest", errors = FALSE) varspec <- c("date", "time", "varchar(5)"); names(varspec) <- names(Dtest) sqlSave(channel, Dtest, varTypes = varspec, verbose=TRUE) sqlColumns(channel, "Dtest") sqlFetch(channel, "Dtest") sqlDrop(channel, "Dtest") sqlDrop(channel, "hills test", errors = FALSE) sqlSave(channel, hills, "hills test", verbose=TRUE) sqlUpdate(channel, hills[11:15,], "hills test", verbose=TRUE, fast=TRUE) sqlFetch(channel, "hills test") sqlDrop(channel, "hills test") sqlSave(channel, hills, "hills test", verbose=TRUE, fast=FALSE) sqlUpdate(channel, hills[11:15,], "hills test", verbose=TRUE, fast=FALSE) sqlDrop(channel, "hills test") Btest <- Atest <- data.frame(x = c(paste(1:100, collapse="+"), letters[2:4]), rn=1:4) Btest[,1] <- Atest[c(4,1:3),1] sqlDrop(channel, "Atest", errors = FALSE) # sqlSave(channel, Atest, addPK = TRUE) colspec <- list(character="text", double="double", integer="integer", logical="varchar(5)") sqlSave(channel, Atest, typeInfo = colspec) sqlColumns(channel, "Atest") sqlFetch(channel, "Atest") sqlUpdate(channel, Btest, "Atest", index = "rn") sqlFetch(channel, "Atest") sqlDrop(channel, "Atest") varspec <- "text"; names(varspec) <- "x" sqlSave(channel, Atest, varTypes = varspec) sqlColumns(channel, "Atest") sqlFetch(channel, "Atest") sqlDrop(channel, "Atest") close(channel) # SQLite 3.x.y channel <- odbcConnect("sqlite3") odbcGetInfo(channel) sqlTypeInfo(channel) sqlTables(channel) sqlDrop(channel, "USArrests", errors = FALSE) sqlSave(channel, USArrests) sqlTables(channel) sqlColumns(channel, "USArrests") sqlFetch(channel, "USArrests") sqlQuery(channel, "select rownames, Murder from USArrests where Rape > 30 order by Murder") foo <- USArrests[1:3, 2, drop = FALSE] foo[1,1] <- 236 sqlUpdate(channel, foo, "USArrests") sqlFetch(channel, "USArrests", max = 5) sqlFetchMore(channel, max = 8) sqlDrop(channel, "USArrests") sqlDrop(channel, "hills test", errors = FALSE) sqlSave(channel, hills, "hills test", verbose=TRUE) sqlUpdate(channel, hills[11:15,], "hills test", verbose=TRUE, fast=TRUE) sqlFetch(channel, "hills test") sqlDrop(channel, "hills test") sqlSave(channel, hills, "hills test", verbose=TRUE, fast=FALSE) sqlUpdate(channel, hills[11:15,], "hills test", verbose=TRUE, fast=FALSE) sqlDrop(channel, "hills test") dates <- as.character(seq(as.Date("2004-01-01"), by="week", length=10)) times <- paste(1:10, "05", "00", sep=":") dt <- paste(dates, times) Dtest <- data.frame(dates, times, dt, logi=c(TRUE, NA, FALSE, FALSE, FALSE)) sqlDrop(channel, "Dtest", errors = FALSE) varspec <- c("date", "time", "timestamp", "varchar(5)") names(varspec) <- names(Dtest) sqlSave(channel, Dtest, varTypes = varspec, fast=FALSE) # fast=TRUE fails sqlColumns(channel, "Dtest") sqlFetch(channel, "Dtest") # This retrieves TRUE as " TRUE" and so returns a factor. sqlDrop(channel, "Dtest") close(channel) ###--------------------------------------------------------------------- # MySQL on Unix channel <- odbcConnect("test") odbcGetInfo(channel) sqlTypeInfo(channel) sqlTables(channel) sqlDrop(channel, "USArrests", errors = FALSE) sqlSave(channel, USArrests, rownames = "State", addPK = TRUE) sqlTables(channel) sqlColumns(channel, "USArrests") sqlColumns(channel, "USArrests", special = TRUE) sqlPrimaryKeys(channel, "USArrests") sqlFetch(channel, "USArrests", rownames = "State") sqlQuery(channel, "select State, Murder from USArrests where Rape > 30 order by Murder") foo <- cbind(State=row.names(USArrests), USArrests)[1:3, c(1,3)] foo[1,2] <- 236 sqlUpdate(channel, foo, "USArrests") sqlFetch(channel, "USArrests", rownames = "State", max = 5) sqlDrop(channel, "USArrests") Btest <- Atest <- data.frame(x = c(paste(1:100, collapse="+"), letters[2:4]), rn=1:4) Btest[,1] <- Atest[c(4,1:3),1] sqlDrop(channel, "Atest", errors = FALSE) # sqlSave(channel, Atest, addPK = TRUE) colspec <- list(character="mediumtext", double="double", integer="integer", logical="varchar(5)") sqlSave(channel, Atest, typeInfo = colspec) sqlColumns(channel, "Atest") sqlFetch(channel, "Atest") sqlUpdate(channel, Btest, "Atest", index = "rn") sqlFetch(channel, "Atest") sqlDrop(channel, "Atest") varspec <- "mediumtext"; names(varspec) <- "x" sqlSave(channel, Atest, varTypes = varspec) sqlColumns(channel, "Atest") sqlFetch(channel, "Atest") sqlDrop(channel, "Atest") dates <- as.character(seq(as.Date("2004-01-01"), by="week", length=10)) times <- paste(1:10, "05", "00", sep=":") dt <- as.POSIXct(paste(dates, times)) Dtest <- data.frame(dates, times, dt, logi=c(TRUE, NA, FALSE, FALSE, FALSE)) sqlDrop(channel, "Dtest", errors = FALSE) varspec <- c("date", "time", "timestamp", "varchar(5)") names(varspec) <- names(Dtest) sqlDrop(channel, "Dtest", errors = FALSE) sqlSave(channel, Dtest, varTypes = varspec, verbose=TRUE) sqlColumns(channel, "Dtest") sqlFetch(channel, "Dtest") sqlDrop(channel, "Dtest") sqlDrop(channel, "hills test", errors = FALSE) sqlSave(channel, hills, "hills test", verbose=TRUE) sqlUpdate(channel, hills[11:15,], "hills test", verbose=TRUE, fast=TRUE) sqlFetch(channel, "hills test") sqlDrop(channel, "hills test") sqlSave(channel, hills, "hills test", verbose=TRUE, fast=FALSE) sqlUpdate(channel, hills[11:15,], "hills test", verbose=TRUE, fast=FALSE) sqlDrop(channel, "hills test") close(channel) # sqlite on Unix channel <- odbcConnect("sqlite3") odbcGetInfo(channel) sqlTypeInfo(channel) sqlTables(channel) sqlDrop(channel, "USArrests", errors = FALSE) sqlSave(channel, USArrests) sqlTables(channel) sqlColumns(channel, "USArrests") sqlFetch(channel, "USArrests") sqlQuery(channel, "select rownames, Murder from USArrests where Rape > 30 order by Murder") foo <- USArrests[1:3, 2, drop = FALSE] foo[1,1] <- 236 sqlUpdate(channel, foo, "USArrests") sqlFetch(channel, "USArrests", max = 5) sqlDrop(channel, "USArrests") sqlDrop(channel, "hills test", errors = FALSE) sqlSave(channel, hills, "hills test", verbose=TRUE) sqlUpdate(channel, hills[11:15,], "hills test", verbose=TRUE, fast=TRUE) sqlFetch(channel, "hills test") sqlDrop(channel, "hills test") sqlSave(channel, hills, "hills test", verbose=TRUE, fast=FALSE) sqlUpdate(channel, hills[11:15,], "hills test", verbose=TRUE, fast=FALSE) sqlDrop(channel, "hills test") A <- data.frame(a="Latin-1 accented chars: < <") sqlDrop(channel, "A", errors = FALSE) sqlSave(channel, A, verbose=TRUE) sqlFetch(channel, "A") ## close the connection close(channel) # PostgreSQL on Unix channel <- odbcConnect("testpg") odbcGetInfo(channel) sqlTypeInfo(channel) sqlTables(channel) sqlDrop(channel, "USArrests", errors = FALSE) sqlSave(channel, USArrests, rownames = "state", addPK = TRUE) sqlTables(channel) sqlColumns(channel, "USArrests") sqlColumns(channel, "USArrests", special = TRUE) sqlPrimaryKeys(channel, "USArrests") sqlFetch(channel, "USArrests", rownames = "state") sqlQuery(channel, "select state, murder from USArrests where rape > 30 order by murder") foo <- cbind(state=row.names(USArrests), USArrests)[1:3, c(1,3)] foo[1,2] <- 236 sqlUpdate(channel, foo, "USArrests", index = "state") sqlFetch(channel, "USArrests", rownames = "state", max = 5) sqlDrop(channel, "USArrests") sqlDrop(channel, "hills test", errors = FALSE) sqlSave(channel, hills, "hills test", verbose=TRUE) sqlUpdate(channel, hills[11:15,], "hills test", verbose=TRUE, fast=TRUE) sqlFetch(channel, "hills test") sqlDrop(channel, "hills test") sqlSave(channel, hills, "hills test", verbose=TRUE, fast=FALSE) sqlUpdate(channel, hills[11:15,], "hills test", verbose=TRUE, fast=FALSE) sqlDrop(channel, "hills test") ## close the connection close(channel) channel <- odbcConnect("testpg") dates <- as.character(seq(as.Date("2004-01-01"), by="week", length=10)) times <- paste(1:10, "05", "00", sep=":") dt <- paste(dates, " ", times, ".", round(1000*runif(10)), sep="") Dtest <- data.frame(dates, times, dt, logi=c(TRUE, NA, FALSE, FALSE, FALSE)) sqlDrop(channel, "Dtest", errors = FALSE) varspec <- c("date", "time", "timestamp", "varchar(5)") names(varspec) <- names(Dtest) sqlSave(channel, Dtest, varTypes = varspec, verbose=TRUE) sqlColumns(channel, "Dtest") sqlFetch(channel, "Dtest") sqlDrop(channel, "Dtest") close(channel) channel <- odbcConnect("testpg") Btest <- Atest <- data.frame(x = c(paste(1:100, collapse="+"), letters[2:4]), rn=1:4) Btest[,1] <- Atest[c(4,1:3),1] sqlDrop(channel, "Atest", errors = FALSE) colspec <- list(character="text", double="double", integer="integer", logical="varchar(5)") sqlSave(channel, Atest, typeInfo = colspec) sqlColumns(channel, "Atest") sqlFetch(channel, "Atest") sqlUpdate(channel, Btest, "Atest", index = "rn") sqlFetch(channel, "Atest") sqlDrop(channel, "Atest") varspec <- "text"; names(varspec) <- "x" sqlSave(channel, Atest, varTypes = varspec) sqlColumns(channel, "Atest") sqlFetch(channel, "Atest") sqlDrop(channel, "Atest") close(channel) RODBC/configure.ac0000644000176000001440000000551413013621651013424 0ustar ripleyusers# original by Friedrich Leisch, much changed by BDR AC_INIT([RODBC], 1.3, [ripley@stats.ox.ac.uk]) dnl A user-specifiable option odbc_mgr="" AC_ARG_WITH([odbc-manager], AC_HELP_STRING([--with-odbc-manager=MGR], [specify the ODBC manager, e.g. odbc or iodbc]), [odbc_mgr=$withval]) if test "$odbc_mgr" = "odbc" ; then AC_PATH_PROGS(ODBC_CONFIG, odbc_config) fi dnl Select an optional include path, from a configure option dnl or from an environment variable. AC_ARG_WITH([odbc-include], AC_HELP_STRING([--with-odbc-include=INCLUDE_PATH], [the location of ODBC header files]), [odbc_include_path=$withval]) RODBC_CPPFLAGS="-I." if test [ -n "$odbc_include_path" ] ; then RODBC_CPPFLAGS="-I. -I${odbc_include_path}" else if test [ -n "${ODBC_INCLUDE}" ] ; then RODBC_CPPFLAGS="-I. -I${ODBC_INCLUDE}" else if test -n "${ODBC_CONFIG}"; then RODBC_CPPFLAGS=`odbc_config --cflags` RODBC_CPPFLAGS="-I. ${RODBC_CPPFLAGS}" fi fi fi dnl ditto for a library path AC_ARG_WITH([odbc-lib], AC_HELP_STRING([--with-odbc-lib=LIB_PATH], [the location of ODBC libraries]), [odbc_lib_path=$withval]) if test [ -n "$odbc_lib_path" ] ; then LIBS="-L${odbc_lib_path} ${LIBS}" else if test [ -n "${ODBC_LIBS}" ] ; then LIBS="-L${ODBC_LIBS} ${LIBS}" else if test -n "${ODBC_CONFIG}"; then odbc_lib_path=`odbc_config --libs | sed s/-lodbc//` LIBS="${odbc_lib_path} ${LIBS}" fi fi fi dnl Now find the compiler and compiler flags to use : ${R_HOME=`R RHOME`} if test -z "${R_HOME}"; then echo "could not determine R_HOME" exit 1 fi CC=`"${R_HOME}/bin/R" CMD config CC` CPP=`"${R_HOME}/bin/R" CMD config CPP` CFLAGS=`"${R_HOME}/bin/R" CMD config CFLAGS` CPPFLAGS=`"${R_HOME}/bin/R" CMD config CPPFLAGS` CPPFLAGS="${CPPFLAGS} ${RODBC_CPPFLAGS}" dnl Check the headers can be found AC_CHECK_HEADERS(sql.h sqlext.h) if test "${ac_cv_header_sql_h}" = no || test "${ac_cv_header_sqlext_h}" = no; then AC_MSG_ERROR("ODBC headers sql.h and sqlext.h not found") fi dnl search for a library containing an ODBC function if test [ -n "${odbc_mgr}" ] ; then AC_SEARCH_LIBS(SQLTables, ${odbc_mgr}, , AC_MSG_ERROR("ODBC driver manager '${odbc_mgr}' not found")) else AC_SEARCH_LIBS(SQLTables, odbc odbc32 iodbc, , AC_MSG_ERROR("no ODBC driver manager found")) fi dnl for 64-bit ODBC need SQL[U]LEN, and it is unclear where they are defined. AC_CHECK_TYPES([SQLLEN, SQLULEN], , , [# include ]) dnl for unixODBC header AC_CHECK_SIZEOF(long, 4) dnl substitute RODBC_CPPFLAGS and LIBS AC_SUBST(RODBC_CPPFLAGS) AC_SUBST(LIBS) AC_CONFIG_HEADERS([src/config.h]) dnl and do subsitution in the src/Makevars.in and src/config.h AC_CONFIG_FILES([src/Makevars]) AC_OUTPUT RODBC/tests/0000755000176000001440000000000013013621651012273 5ustar ripleyusersRODBC/tests/postgresql.RR0000644000176000001440000000612113013621651014743 0ustar ripleyusers##-*- R -*- library(RODBC) library(MASS) USArrests[1,2] <- NA hills <- hills[1:15,] row.names(hills)[12] <- "Dollar ('$')" set.seed(1) options(digits.secs = 3) channel <- odbcConnect("testpg") if(!inherits(channel, "RODBC")) q("no") odbcGetInfo(channel) sqlTables(channel) sqlDrop(channel, "USArrests", errors = FALSE) sqlSave(channel, USArrests, rownames = "state", addPK = TRUE) sqlTables(channel) sqlColumns(channel, "USArrests")[, 1:6] sqlColumns(channel, "USArrests", special = TRUE) sqlPrimaryKeys(channel, "USArrests") sqlFetch(channel, "USArrests", rownames = "state") sqlQuery(channel, "select state, murder from USArrests where rape > 30 order by murder") foo <- cbind(state=row.names(USArrests), USArrests)[1:3, c(1,3)] foo[1,2] <- 236 sqlUpdate(channel, foo, "USArrests") sqlFetch(channel, "USArrests", rownames = "state", max = 5) sqlFetchMore(channel, rownames = "state", max = 8) sqlDrop(channel, "USArrests") Btest <- Atest <- data.frame(x = c(paste(1:100, collapse="+"), letters[2:4]), rn=1:4) Btest[,1] <- Atest[c(4,1:3),1] sqlDrop(channel, "Atest", errors = FALSE) colspec <- list(character="text", double="double", integer="integer", logical="varchar(5)") sqlSave(channel, Atest, typeInfo = colspec) sqlColumns(channel, "Atest")[, 1:6] sqlFetch(channel, "Atest") sqlUpdate(channel, Btest, "Atest", index = "rn") sqlFetch(channel, "Atest") sqlDrop(channel, "Atest") varspec <- "text"; names(varspec) <- "x" sqlSave(channel, Atest, varTypes = varspec) sqlColumns(channel, "Atest")[, 1:6] sqlFetch(channel, "Atest") sqlDrop(channel, "Atest") dates <- as.character(seq(as.Date("2004-01-01"), by="week", length=10)) times <- paste(1:10, "05", "00", sep=":") dt <- as.POSIXct(paste(dates, times)) Dtest <- data.frame(dates, times, dt, logi=c(TRUE, NA, FALSE, FALSE, FALSE)) varspec <- c("date", "time", "timestamp", "varchar(5)") names(varspec) <- names(Dtest) sqlDrop(channel, "Dtest", errors = FALSE) sqlSave(channel, Dtest, varTypes = varspec) sqlColumns(channel, "Dtest")[, 1:6] sqlFetch(channel, "Dtest") sqlDrop(channel, "Dtest") ## needs fast = FALSE for fractional seconds. dt <- dt + round(runif(10), 3) Dtest <- data.frame(dates, times, dt, logi=c(TRUE, NA, FALSE, FALSE, FALSE)) varspec <- c("date", "time", "timestamp", "varchar(5)") names(varspec) <- names(Dtest) sqlDrop(channel, "Dtest", errors = FALSE) sqlSave(channel, Dtest, varTypes = varspec, fast = FALSE) sqlColumns(channel, "Dtest")[, 1:6] sqlFetch(channel, "Dtest") sqlDrop(channel, "Dtest") sqlDrop(channel, "hills test", errors = FALSE) sqlSave(channel, hills, "hills test", verbose=TRUE) sqlUpdate(channel, hills[11:15,], "hills test", verbose=TRUE, fast=TRUE) sqlFetch(channel, "hills test") sqlDrop(channel, "hills test") sqlSave(channel, hills, "hills test", verbose=TRUE, fast=FALSE) sqlUpdate(channel, hills[11:15,], "hills test", verbose=TRUE, fast=FALSE) sqlDrop(channel, "hills test") # sqlQuery(channel, "create schema test2") sqlTables(channel, catalog="", schema="", tableName="", tableType="%") sqlTables(channel, catalog="%", schema="", tableName="") sqlTables(channel, catalog="", schema="%", tableName="") close(channel) RODBC/tests/sqlite3.RR0000644000176000001440000000504213013621651014125 0ustar ripleyusers##-*- R -*- library(RODBC) library(MASS) USArrests[1,2] <- NA hills <- hills[1:15,] row.names(hills)[12] <- "Dollar ('$')" channel <- odbcConnect("sqlite3") if(!inherits(channel, "RODBC")) q("no") odbcGetInfo(channel) sqlTables(channel) sqlDrop(channel, "USArrests", errors = FALSE) sqlSave(channel, USArrests, addPK = TRUE) sqlTables(channel) sqlColumns(channel, "USArrests") sqlColumns(channel, "USArrests", special=TRUE) sqlPrimaryKeys(channel, "USArrests") sqlFetch(channel, "USArrests") sqlQuery(channel, "select rownames, Murder from USArrests where Rape > 30 order by Murder") foo <- USArrests[1:3, 2, drop = FALSE] foo[1,1] <- 236 sqlUpdate(channel, foo, "USArrests") sqlFetch(channel, "USArrests", max = 5) sqlFetchMore(channel, max = 8) sqlDrop(channel, "USArrests") Btest <- Atest <- data.frame(x = c(paste(1:100, collapse="+"), letters[2:4]), rn=1:4) Btest[,1] <- Atest[c(4,1:3),1] sqlDrop(channel, "Atest", errors = FALSE) colspec <- list(character="varchar(1000)", double="double", integer="integer", logical="varchar(5)") sqlSave(channel, Atest, typeInfo = colspec) sqlColumns(channel, "Atest")[, 1:6] sqlFetch(channel, "Atest") sqlUpdate(channel, Btest, "Atest", index = "rn") sqlFetch(channel, "Atest") sqlDrop(channel, "Atest") varspec <- "varchar(1000)"; names(varspec) <- "x" sqlSave(channel, Atest, varTypes = varspec) sqlColumns(channel, "Atest")[, 1:6] sqlFetch(channel, "Atest") sqlDrop(channel, "Atest") dates <- as.character(seq(as.Date("2004-01-01"), by="week", length=10)) times <- paste(1:10, "05", "00", sep=":") dt <- as.POSIXct(paste(dates, times)) Dtest <- data.frame(dates, times, dt, logi=c(TRUE, NA, FALSE, FALSE, FALSE)) varspec <- c("date", "time", "timestamp", "varchar(5)") names(varspec) <- names(Dtest) sqlDrop(channel, "Dtest", errors = FALSE) sqlSave(channel, Dtest, varTypes = varspec) sqlColumns(channel, "Dtest") sqlFetch(channel, "Dtest") sqlDrop(channel, "Dtest", errors = FALSE) sqlSave(channel, Dtest, varTypes = varspec, fast = FALSE) sqlColumns(channel, "Dtest") sqlFetch(channel, "Dtest") sqlDrop(channel, "Dtest") sqlDrop(channel, "hills test", errors = FALSE) sqlSave(channel, hills, "hills test", verbose=TRUE) sqlUpdate(channel, hills[11:15,], "hills test", verbose=TRUE, fast=TRUE) sqlFetch(channel, "hills test") sqlDrop(channel, "hills test") sqlSave(channel, hills, "hills test", verbose=TRUE, fast=FALSE) sqlUpdate(channel, hills[11:15,], "hills test", verbose=TRUE, fast=FALSE) sqlDrop(channel, "hills test") sqlTables(channel, catalog = "", schema = "", tableName = "", tableType = "%") close(channel) RODBC/tests/mimer.Rout.save0000644000176000001440000006342213013621651015223 0ustar ripleyusers R version 2.9.1 Patched (2009-07-27 r49006) Copyright (C) 2009 The R Foundation for Statistical Computing ISBN 3-900051-07-0 R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > ##-*- R -*- > library(RODBC) > library(MASS) > USArrests[1,2] <- NA > hills <- hills[1:15,] > row.names(hills)[12] <- "Dollar ('$')" > set.seed(1) > > channel <- odbcConnect("mimdb", uid="DEVUSER", pwd=Sys.getenv("DB_PWD")) > if(!inherits(channel, "RODBC")) q("no") > sqlTables(channel, schema="DEVUSER") [1] TABLE_CAT TABLE_SCHEM TABLE_NAME TABLE_TYPE REMARKS <0 rows> (or 0-length row.names) > sqlDrop(channel, "USArrests", errors = FALSE) > sqlSave(channel, USArrests, rownames = "State", addPK = TRUE) > sqlTables(channel, schema="DEVUSER") TABLE_CAT TABLE_SCHEM TABLE_NAME TABLE_TYPE REMARKS 1 DEVUSER USArrests TABLE > sqlColumns(channel, "USArrests") TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME 1 DEVUSER USArrests State 12 CHARACTER VARYING 2 DEVUSER USArrests Murder 8 DOUBLE PRECISION 3 DEVUSER USArrests Assault 4 INTEGER 4 DEVUSER USArrests UrbanPop 4 INTEGER 5 DEVUSER USArrests Rape 8 DOUBLE PRECISION COLUMN_SIZE BUFFER_LENGTH DECIMAL_DIGITS NUM_PREC_RADIX NULLABLE REMARKS 1 255 255 NA NA 0 2 16 8 NA 10 1 3 10 4 0 10 1 4 10 4 0 10 1 5 16 8 NA 10 1 COLUMN_DEF SQL_DATA_TYPE SQL_DATETIME_SUB CHAR_OCTET_LENGTH ORDINAL_POSITION 1 12 NA 255 1 2 8 NA NA 2 3 4 NA NA 3 4 4 NA NA 4 5 8 NA NA 5 IS_NULLABLE 1 NO 2 YES 3 YES 4 YES 5 YES > sqlColumns(channel, "USArrests", special = TRUE) SCOPE COLUMN_NAME DATA_TYPE TYPE_NAME COLUMN_SIZE BUFFER_LENGTH 1 2 State 12 CHARACTER VARYING 255 255 DECIMAL_DIGITS PSEUDO_COLUMN 1 NA 1 > sqlPrimaryKeys(channel, "USArrests") TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME KEY_SEQ PK_NAME 1 DEVUSER USArrests State 1 SQL_PRIMARY_KEY_510 > sqlFetch(channel, "USArrests", rownames = "State") Murder Assault UrbanPop Rape Alabama 13.2 NA 58 21.2 Alaska 10.0 263 48 44.5 Arizona 8.1 294 80 31.0 Arkansas 8.8 190 50 19.5 California 9.0 276 91 40.6 Colorado 7.9 204 78 38.7 Connecticut 3.3 110 77 11.1 Delaware 5.9 238 72 15.8 Florida 15.4 335 80 31.9 Georgia 17.4 211 60 25.8 Hawaii 5.3 46 83 20.2 Idaho 2.6 120 54 14.2 Illinois 10.4 249 83 24.0 Indiana 7.2 113 65 21.0 Iowa 2.2 56 57 11.3 Kansas 6.0 115 66 18.0 Kentucky 9.7 109 52 16.3 Louisiana 15.4 249 66 22.2 Maine 2.1 83 51 7.8 Maryland 11.3 300 67 27.8 Massachusetts 4.4 149 85 16.3 Michigan 12.1 255 74 35.1 Minnesota 2.7 72 66 14.9 Mississippi 16.1 259 44 17.1 Missouri 9.0 178 70 28.2 Montana 6.0 109 53 16.4 Nebraska 4.3 102 62 16.5 Nevada 12.2 252 81 46.0 New Hampshire 2.1 57 56 9.5 New Jersey 7.4 159 89 18.8 New Mexico 11.4 285 70 32.1 New York 11.1 254 86 26.1 North Carolina 13.0 337 45 16.1 North Dakota 0.8 45 44 7.3 Ohio 7.3 120 75 21.4 Oklahoma 6.6 151 68 20.0 Oregon 4.9 159 67 29.3 Pennsylvania 6.3 106 72 14.9 Rhode Island 3.4 174 87 8.3 South Carolina 14.4 279 48 22.5 South Dakota 3.8 86 45 12.8 Tennessee 13.2 188 59 26.9 Texas 12.7 201 80 25.5 Utah 3.2 120 80 22.9 Vermont 2.2 48 32 11.2 Virginia 8.5 156 63 20.7 Washington 4.0 145 73 26.2 West Virginia 5.7 81 39 9.3 Wisconsin 2.6 53 66 10.8 Wyoming 6.8 161 60 15.6 > sqlQuery(channel, "select State, Murder from USArrests where Rape > 30 order by Murder") STATE MURDER 1 Colorado 7.9 2 Arizona 8.1 3 California 9.0 4 Alaska 10.0 5 New Mexico 11.4 6 Michigan 12.1 7 Nevada 12.2 8 Florida 15.4 > foo <- cbind(State=row.names(USArrests), USArrests)[1:3, c(1,3)] > foo[1,2] <- 236 > sqlUpdate(channel, foo, "USArrests") > sqlFetch(channel, "USArrests", rownames = "State", max = 5) Murder Assault UrbanPop Rape Alabama 13.2 236 58 21.2 Alaska 10.0 263 48 44.5 Arizona 8.1 294 80 31.0 Arkansas 8.8 190 50 19.5 California 9.0 276 91 40.6 > sqlFetchMore(channel, rownames = "State", max = 8) Murder Assault UrbanPop Rape Colorado 7.9 204 78 38.7 Connecticut 3.3 110 77 11.1 Delaware 5.9 238 72 15.8 Florida 15.4 335 80 31.9 Georgia 17.4 211 60 25.8 Hawaii 5.3 46 83 20.2 Idaho 2.6 120 54 14.2 Illinois 10.4 249 83 24.0 > sqlDrop(channel, "USArrests") > > Btest <- Atest <- + data.frame(x = c(paste(1:100, collapse="+"), letters[2:4]), rn=1:4) > Btest[,1] <- Atest[c(4,1:3),1] > sqlDrop(channel, "Atest", errors = FALSE) > ## max is 15000 for varchar and char > colspec <- list(character="varchar(1000)", double="double", + integer="integer", logical="varchar(5)") > sqlSave(channel, Atest, typeInfo = colspec) > sqlColumns(channel, "Atest") TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME 1 DEVUSER Atest rownames 12 CHARACTER VARYING 2 DEVUSER Atest x 12 CHARACTER VARYING 3 DEVUSER Atest rn 4 INTEGER COLUMN_SIZE BUFFER_LENGTH DECIMAL_DIGITS NUM_PREC_RADIX NULLABLE REMARKS 1 1000 1000 NA NA 1 2 1000 1000 NA NA 1 3 10 4 0 10 1 COLUMN_DEF SQL_DATA_TYPE SQL_DATETIME_SUB CHAR_OCTET_LENGTH ORDINAL_POSITION 1 12 NA 1000 1 2 12 NA 1000 2 3 4 NA NA 3 IS_NULLABLE 1 YES 2 YES 3 YES > sqlFetch(channel, "Atest") x 1 1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20+21+22+23+24+25+26+27+28+29+30+31+32+33+34+35+36+37+38+39+40+41+42+43+44+45+46+47+48+49+50+51+52+53+54+55+56+57+58+59+60+61+62+63+64+65+66+67+68+69+70+71+72+73+74+75+76+77+78+79+80+81+82+83+84+85+86+87+88+89+90+91+92+93+94+95+96+97+98+99+100 2 b 3 c 4 d rn 1 1 2 2 3 3 4 4 > sqlUpdate(channel, Btest, "Atest", index = "rn") > sqlFetch(channel, "Atest") x 1 d 2 1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20+21+22+23+24+25+26+27+28+29+30+31+32+33+34+35+36+37+38+39+40+41+42+43+44+45+46+47+48+49+50+51+52+53+54+55+56+57+58+59+60+61+62+63+64+65+66+67+68+69+70+71+72+73+74+75+76+77+78+79+80+81+82+83+84+85+86+87+88+89+90+91+92+93+94+95+96+97+98+99+100 3 b 4 c rn 1 1 2 2 3 3 4 4 > sqlDrop(channel, "Atest") > varspec <- "character(500)"; names(varspec) <- "x" > sqlSave(channel, Atest, varTypes = varspec) > sqlColumns(channel, "Atest") TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME 1 DEVUSER Atest rownames 12 CHARACTER VARYING 2 DEVUSER Atest x 1 CHARACTER 3 DEVUSER Atest rn 4 INTEGER COLUMN_SIZE BUFFER_LENGTH DECIMAL_DIGITS NUM_PREC_RADIX NULLABLE REMARKS 1 255 255 NA NA 1 2 500 500 NA NA 1 3 10 4 0 10 1 COLUMN_DEF SQL_DATA_TYPE SQL_DATETIME_SUB CHAR_OCTET_LENGTH ORDINAL_POSITION 1 12 NA 255 1 2 1 NA 500 2 3 4 NA NA 3 IS_NULLABLE 1 YES 2 YES 3 YES > sqlFetch(channel, "Atest") x 1 1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20+21+22+23+24+25+26+27+28+29+30+31+32+33+34+35+36+37+38+39+40+41+42+43+44+45+46+47+48+49+50+51+52+53+54+55+56+57+58+59+60+61+62+63+64+65+66+67+68+69+70+71+72+73+74+75+76+77+78+79+80+81+82+83+84+85+86+87+88+89+90+91+92+93+94+95+96+97+98+99+100 2 b 3 c 4 d rn 1 1 2 2 3 3 4 4 > sqlDrop(channel, "Atest") > > dates <- as.character(seq(as.Date("2004-01-01"), by="week", length=10)) > times <- paste(1:10, "05", "00", sep=":") > dt <- as.POSIXct(paste(dates, times)) > Dtest <- data.frame(dates, dt, logi=c(TRUE, NA, FALSE, FALSE, FALSE)) > varspec <- c("date", "timestamp", "varchar(5)") > names(varspec) <- names(Dtest) > sqlDrop(channel, "Dtest", errors = FALSE) > sqlSave(channel, Dtest, varTypes = varspec) > sqlColumns(channel, "Dtest") TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME 1 DEVUSER Dtest rownames 12 CHARACTER VARYING 2 DEVUSER Dtest dates 91 DATE 3 DEVUSER Dtest dt 93 TIMESTAMP 4 DEVUSER Dtest logi 12 CHARACTER VARYING COLUMN_SIZE BUFFER_LENGTH DECIMAL_DIGITS NUM_PREC_RADIX NULLABLE REMARKS 1 255 255 NA NA 1 2 10 6 NA NA 1 3 26 16 6 NA 1 4 5 5 NA NA 1 COLUMN_DEF SQL_DATA_TYPE SQL_DATETIME_SUB CHAR_OCTET_LENGTH ORDINAL_POSITION 1 12 NA 255 1 2 9 1 NA 2 3 9 3 NA 3 4 12 NA 5 4 IS_NULLABLE 1 YES 2 YES 3 YES 4 YES > sqlFetch(channel, "Dtest") dates dt logi 1 2004-01-01 2004-01-01 01:05:00 TRUE 2 2004-01-08 2004-01-08 02:05:00 NA 3 2004-01-15 2004-01-15 03:05:00 FALSE 4 2004-01-22 2004-01-22 04:05:00 FALSE 5 2004-01-29 2004-01-29 05:05:00 FALSE 6 2004-02-05 2004-02-05 06:05:00 TRUE 7 2004-02-12 2004-02-12 07:05:00 NA 8 2004-02-19 2004-02-19 08:05:00 FALSE 9 2004-02-26 2004-02-26 09:05:00 FALSE 10 2004-03-04 2004-03-04 10:05:00 FALSE > sqlDrop(channel, "Dtest", errors = FALSE) > sqlSave(channel, Dtest, varTypes = varspec, fast = FALSE) > sqlColumns(channel, "Dtest") TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME 1 DEVUSER Dtest rownames 12 CHARACTER VARYING 2 DEVUSER Dtest dates 91 DATE 3 DEVUSER Dtest dt 93 TIMESTAMP 4 DEVUSER Dtest logi 12 CHARACTER VARYING COLUMN_SIZE BUFFER_LENGTH DECIMAL_DIGITS NUM_PREC_RADIX NULLABLE REMARKS 1 255 255 NA NA 1 2 10 6 NA NA 1 3 26 16 6 NA 1 4 5 5 NA NA 1 COLUMN_DEF SQL_DATA_TYPE SQL_DATETIME_SUB CHAR_OCTET_LENGTH ORDINAL_POSITION 1 12 NA 255 1 2 9 1 NA 2 3 9 3 NA 3 4 12 NA 5 4 IS_NULLABLE 1 YES 2 YES 3 YES 4 YES > sqlFetch(channel, "Dtest") dates dt logi 1 2004-01-01 2004-01-01 01:05:00 TRUE 2 2004-01-08 2004-01-08 02:05:00 NA 3 2004-01-15 2004-01-15 03:05:00 FALSE 4 2004-01-22 2004-01-22 04:05:00 FALSE 5 2004-01-29 2004-01-29 05:05:00 FALSE 6 2004-02-05 2004-02-05 06:05:00 TRUE 7 2004-02-12 2004-02-12 07:05:00 NA 8 2004-02-19 2004-02-19 08:05:00 FALSE 9 2004-02-26 2004-02-26 09:05:00 FALSE 10 2004-03-04 2004-03-04 10:05:00 FALSE > sqlDrop(channel, "Dtest") > > sqlDrop(channel, "hills test", errors = FALSE) > sqlSave(channel, hills, "hills test", verbose=TRUE) Query: CREATE TABLE "hills test" ("rownames" VARCHAR(255), "dist" DOUBLE PRECISION, "climb" INTEGER, "time" DOUBLE PRECISION) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( ?,?,?,? ) Binding: 'rownames' DataType 12, ColSize 255 Binding: 'dist' DataType 8, ColSize 16 Binding: 'climb' DataType 4, ColSize 10 Binding: 'time' DataType 8, ColSize 16 Parameters: no: 1: rownames Greenmantle/***/no: 2: dist 2.5/***/no: 3: climb 650/***/no: 4: time 16.083/***/ no: 1: rownames Carnethy/***/no: 2: dist 6/***/no: 3: climb 2500/***/no: 4: time 48.35/***/ no: 1: rownames Craig Dunain/***/no: 2: dist 6/***/no: 3: climb 900/***/no: 4: time 33.65/***/ no: 1: rownames Ben Rha/***/no: 2: dist 7.5/***/no: 3: climb 800/***/no: 4: time 45.6/***/ no: 1: rownames Ben Lomond/***/no: 2: dist 8/***/no: 3: climb 3070/***/no: 4: time 62.267/***/ no: 1: rownames Goatfell/***/no: 2: dist 8/***/no: 3: climb 2866/***/no: 4: time 73.217/***/ no: 1: rownames Bens of Jura/***/no: 2: dist 16/***/no: 3: climb 7500/***/no: 4: time 204.617/***/ no: 1: rownames Cairnpapple/***/no: 2: dist 6/***/no: 3: climb 800/***/no: 4: time 36.367/***/ no: 1: rownames Scolty/***/no: 2: dist 5/***/no: 3: climb 800/***/no: 4: time 29.75/***/ no: 1: rownames Traprain/***/no: 2: dist 6/***/no: 3: climb 650/***/no: 4: time 39.75/***/ no: 1: rownames Lairig Ghru/***/no: 2: dist 28/***/no: 3: climb 2100/***/no: 4: time 192.667/***/ no: 1: rownames Dollar ('$')/***/no: 2: dist 5/***/no: 3: climb 2000/***/no: 4: time 43.05/***/ no: 1: rownames Lomonds/***/no: 2: dist 9.5/***/no: 3: climb 2200/***/no: 4: time 65/***/ no: 1: rownames Cairn Table/***/no: 2: dist 6/***/no: 3: climb 500/***/no: 4: time 44.133/***/ no: 1: rownames Eildon Two/***/no: 2: dist 4.5/***/no: 3: climb 1500/***/no: 4: time 26.933/***/ > sqlUpdate(channel, hills[11:15,], "hills test", verbose=TRUE, fast=TRUE) Query: UPDATE "hills test" SET "dist"=?, "climb"=?, "time"=? WHERE "rownames"=? Binding: 'dist' DataType 8, ColSize 16 Binding: 'climb' DataType 4, ColSize 10 Binding: 'time' DataType 8, ColSize 16 Binding: 'rownames' DataType 12, ColSize 255 Parameters: no: 1: dist 28/***/no: 2: climb 2100/***/no: 3: time 192.667/***/no: 4: rownames Lairig Ghru/***/ no: 1: dist 5/***/no: 2: climb 2000/***/no: 3: time 43.05/***/no: 4: rownames Dollar ('$')/***/ no: 1: dist 9.5/***/no: 2: climb 2200/***/no: 3: time 65/***/no: 4: rownames Lomonds/***/ no: 1: dist 6/***/no: 2: climb 500/***/no: 3: time 44.133/***/no: 4: rownames Cairn Table/***/ no: 1: dist 4.5/***/no: 2: climb 1500/***/no: 3: time 26.933/***/no: 4: rownames Eildon Two/***/ > sqlFetch(channel, "hills test") dist climb time Greenmantle 2.5 650 16.083 Carnethy 6.0 2500 48.350 Craig Dunain 6.0 900 33.650 Ben Rha 7.5 800 45.600 Ben Lomond 8.0 3070 62.267 Goatfell 8.0 2866 73.217 Bens of Jura 16.0 7500 204.617 Cairnpapple 6.0 800 36.367 Scolty 5.0 800 29.750 Traprain 6.0 650 39.750 Lairig Ghru 28.0 2100 192.667 Dollar ('$') 5.0 2000 43.050 Lomonds 9.5 2200 65.000 Cairn Table 6.0 500 44.133 Eildon Two 4.5 1500 26.933 > sqlDrop(channel, "hills test") > sqlSave(channel, hills, "hills test", verbose=TRUE, fast=FALSE) Query: CREATE TABLE "hills test" ("rownames" VARCHAR(255), "dist" DOUBLE PRECISION, "climb" INTEGER, "time" DOUBLE PRECISION) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Greenmantle', 2.5, 650, 16.083 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Carnethy', 6.0, 2500, 48.350 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Craig Dunain', 6.0, 900, 33.650 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Ben Rha', 7.5, 800, 45.600 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Ben Lomond', 8.0, 3070, 62.267 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Goatfell', 8.0, 2866, 73.217 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Bens of Jura', 16.0, 7500, 204.617 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Cairnpapple', 6.0, 800, 36.367 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Scolty', 5.0, 800, 29.750 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Traprain', 6.0, 650, 39.750 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Lairig Ghru', 28.0, 2100, 192.667 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Dollar (''$'')', 5.0, 2000, 43.050 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Lomonds', 9.5, 2200, 65.000 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Cairn Table', 6.0, 500, 44.133 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Eildon Two', 4.5, 1500, 26.933 ) > sqlUpdate(channel, hills[11:15,], "hills test", verbose=TRUE, fast=FALSE) Query: UPDATE "hills test" SET "dist"=28.0, "climb"=2100, "time"=192.667 WHERE "rownames"='Lairig Ghru' Query: UPDATE "hills test" SET "dist"= 5.0, "climb"=2000, "time"= 43.050 WHERE "rownames"='Dollar (''$'')' Query: UPDATE "hills test" SET "dist"= 9.5, "climb"=2200, "time"= 65.000 WHERE "rownames"='Lomonds' Query: UPDATE "hills test" SET "dist"= 6.0, "climb"= 500, "time"= 44.133 WHERE "rownames"='Cairn Table' Query: UPDATE "hills test" SET "dist"= 4.5, "climb"=1500, "time"= 26.933 WHERE "rownames"='Eildon Two' > sqlDrop(channel, "hills test") > > sqlTables(channel, catalog="", schema="", tableName="", tableType="%") TABLE_CAT TABLE_SCHEM TABLE_NAME TABLE_TYPE REMARKS 1 SYNONYM 2 SYSTEM TABLE 3 TABLE 4 VIEW > > # sqlQuery(channel, "create schema test2") > sqlQuery(channel, "SELECT * FROM information_schema.schemata") CATALOG_NAME SCHEMA_NAME SCHEMA_OWNER DEFAULT_CHARACTER_SET_CATALOG 1 NA DEVUSER DEVUSER NA 2 NA TEST2 DEVUSER NA DEFAULT_CHARACTER_SET_SCHEMA DEFAULT_CHARACTER_SET_NAME SQL_PATH 1 INFORMATION_SCHEMA ISO8BIT NA 2 INFORMATION_SCHEMA ISO8BIT NA > sqlSave(channel, women, "test2.women") > sqlTables(channel, tableType="TABLE") TABLE_CAT TABLE_SCHEM TABLE_NAME TABLE_TYPE REMARKS 1 TEST2 WOMEN TABLE > sqlTables(channel, schema="test2") TABLE_CAT TABLE_SCHEM TABLE_NAME TABLE_TYPE REMARKS 1 TEST2 WOMEN TABLE > sqlDrop(channel, "test2.women") > > close(channel) > RODBC/tests/Notes0000644000176000001440000000115213013621651013305 0ustar ripleyusersThese tests are intended to be run as-is only on BDR's machines. Others will need to set up suitable DSNs or change the scripts to point to existing DSNs. They will only be run by R CMD check if RODBC_TESTING is set. I don't currently run MySQL as a service on Windows, so it is started by d:/packages/mysql/bin/mysqld --standalone & PostgreSQL, SQL Server, Oracle, DB2 and Mimer run as services, but may need to be started. The shell used to run these tests must have the Oracle binaries (e:/Oracle/bin) in the path. The Oracle and Mimer tests need DB_PWD set. sqlite3 worked with sqliteodbc 0.83 but not 0.91. RODBC/tests/Oracle.Rout.save0000644000176000001440000006351213013621651015317 0ustar ripleyusers R version 2.9.1 Patched (2009-07-09 r48925) Copyright (C) 2009 The R Foundation for Statistical Computing ISBN 3-900051-07-0 R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > ##-*- R -*- > library(RODBC) > library(MASS) > USArrests[1,2] <- NA > hills <- hills[1:15,] > row.names(hills)[12] <- "Dollar ('$')" > set.seed(1) > > channel <- odbcConnect("Oracle", pwd = Sys.getenv("DB_PWD")) > if(!inherits(channel, "RODBC")) q("no") > sqlTables(channel, schema = "RIPLEY") [1] TABLE_CAT TABLE_SCHEM TABLE_NAME TABLE_TYPE REMARKS <0 rows> (or 0-length row.names) > sqlDrop(channel, "USArrests", errors = FALSE) > sqlSave(channel, USArrests, rownames = "State", addPK = TRUE) > sqlTables(channel, schema = "RIPLEY") TABLE_CAT TABLE_SCHEM TABLE_NAME TABLE_TYPE REMARKS 1 RIPLEY USArrests TABLE > sqlColumns(channel, "USArrests") TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME 1 RIPLEY USArrests State 12 VARCHAR2 2 RIPLEY USArrests Murder 6 BINARY_DOUBLE 3 RIPLEY USArrests Assault 3 DECIMAL 4 RIPLEY USArrests UrbanPop 3 DECIMAL 5 RIPLEY USArrests Rape 6 BINARY_DOUBLE COLUMN_SIZE BUFFER_LENGTH DECIMAL_DIGITS NUM_PREC_RADIX NULLABLE REMARKS 1 255 255 NA NA 0 2 38 8 NA NA 1 3 38 40 0 10 1 4 38 40 0 10 1 5 38 8 NA NA 1 COLUMN_DEF SQL_DATA_TYPE SQL_DATETIME_SUB CHAR_OCTET_LENGTH ORDINAL_POSITION 1 12 0 255 1 2 6 0 0 2 3 3 0 0 3 4 3 0 0 4 5 6 0 0 5 IS_NULLABLE 1 NO 2 YES 3 YES 4 YES 5 YES > sqlColumns(channel, "USArrests", special = TRUE) SCOPE COLUMN_NAME DATA_TYPE TYPE_NAME COLUMN_SIZE BUFFER_LENGTH 1 2 ROWID 1 ROWID NA 18 DECIMAL_DIGITS PSEUDO_COLUMN 1 NA 2 > sqlPrimaryKeys(channel, "USArrests") [1] TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME KEY_SEQ PK_NAME <0 rows> (or 0-length row.names) > sqlFetch(channel, "USArrests", rownames = "State") Murder Assault UrbanPop Rape Alabama 13.2 NA 58 21.2 Alaska 10.0 263 48 44.5 Arizona 8.1 294 80 31.0 Arkansas 8.8 190 50 19.5 California 9.0 276 91 40.6 Colorado 7.9 204 78 38.7 Connecticut 3.3 110 77 11.1 Delaware 5.9 238 72 15.8 Florida 15.4 335 80 31.9 Georgia 17.4 211 60 25.8 Hawaii 5.3 46 83 20.2 Idaho 2.6 120 54 14.2 Illinois 10.4 249 83 24.0 Indiana 7.2 113 65 21.0 Iowa 2.2 56 57 11.3 Kansas 6.0 115 66 18.0 Kentucky 9.7 109 52 16.3 Louisiana 15.4 249 66 22.2 Maine 2.1 83 51 7.8 Maryland 11.3 300 67 27.8 Massachusetts 4.4 149 85 16.3 Michigan 12.1 255 74 35.1 Minnesota 2.7 72 66 14.9 Mississippi 16.1 259 44 17.1 Missouri 9.0 178 70 28.2 Montana 6.0 109 53 16.4 Nebraska 4.3 102 62 16.5 Nevada 12.2 252 81 46.0 New Hampshire 2.1 57 56 9.5 New Jersey 7.4 159 89 18.8 New Mexico 11.4 285 70 32.1 New York 11.1 254 86 26.1 North Carolina 13.0 337 45 16.1 North Dakota 0.8 45 44 7.3 Ohio 7.3 120 75 21.4 Oklahoma 6.6 151 68 20.0 Oregon 4.9 159 67 29.3 Pennsylvania 6.3 106 72 14.9 Rhode Island 3.4 174 87 8.3 South Carolina 14.4 279 48 22.5 South Dakota 3.8 86 45 12.8 Tennessee 13.2 188 59 26.9 Texas 12.7 201 80 25.5 Utah 3.2 120 80 22.9 Vermont 2.2 48 32 11.2 Virginia 8.5 156 63 20.7 Washington 4.0 145 73 26.2 West Virginia 5.7 81 39 9.3 Wisconsin 2.6 53 66 10.8 Wyoming 6.8 161 60 15.6 > sqlQuery(channel, 'select "State", "Murder" from "USArrests" where "Rape" > 30 order by "Murder"') State Murder 1 Colorado 7.9 2 Arizona 8.1 3 California 9.0 4 Alaska 10.0 5 New Mexico 11.4 6 Michigan 12.1 7 Nevada 12.2 8 Florida 15.4 > foo <- cbind(State=row.names(USArrests), USArrests)[1:3, c(1,3)] > foo[1,2] <- 236 > sqlUpdate(channel, foo, "USArrests", index = "State") > sqlFetch(channel, "USArrests", rownames = "State", max = 5) Murder Assault UrbanPop Rape Alabama 13.2 236 58 21.2 Alaska 10.0 263 48 44.5 Arizona 8.1 294 80 31.0 Arkansas 8.8 190 50 19.5 California 9.0 276 91 40.6 > sqlFetchMore(channel, rownames = "State", max = 8) Murder Assault UrbanPop Rape Colorado 7.9 204 78 38.7 Connecticut 3.3 110 77 11.1 Delaware 5.9 238 72 15.8 Florida 15.4 335 80 31.9 Georgia 17.4 211 60 25.8 Hawaii 5.3 46 83 20.2 Idaho 2.6 120 54 14.2 Illinois 10.4 249 83 24.0 > sqlDrop(channel, "USArrests") > > Btest <- Atest <- + data.frame(x = c(paste(1:100, collapse="+"), letters[2:4]), rn=1:4) > Btest[,1] <- Atest[c(4,1:3),1] > sqlDrop(channel, "Atest", errors = FALSE) > ## max for varchar is 4000, for char 2000, half that for nchar, nvarchar > colspec <- list(character="varchar(1000)", double="binary_double", + integer="decimal", logical="varchar(5)") > sqlSave(channel, Atest, typeInfo = colspec) > sqlColumns(channel, "Atest") TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME COLUMN_SIZE 1 RIPLEY Atest rownames 12 VARCHAR2 1000 2 RIPLEY Atest x 12 VARCHAR2 1000 3 RIPLEY Atest rn 3 DECIMAL 38 BUFFER_LENGTH DECIMAL_DIGITS NUM_PREC_RADIX NULLABLE REMARKS COLUMN_DEF 1 1000 NA NA 1 2 1000 NA NA 1 3 40 0 10 1 SQL_DATA_TYPE SQL_DATETIME_SUB CHAR_OCTET_LENGTH ORDINAL_POSITION IS_NULLABLE 1 12 0 1000 1 YES 2 12 0 1000 2 YES 3 3 0 0 3 YES > sqlFetch(channel, "Atest") x 1 1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20+21+22+23+24+25+26+27+28+29+30+31+32+33+34+35+36+37+38+39+40+41+42+43+44+45+46+47+48+49+50+51+52+53+54+55+56+57+58+59+60+61+62+63+64+65+66+67+68+69+70+71+72+73+74+75+76+77+78+79+80+81+82+83+84+85+86+87+88+89+90+91+92+93+94+95+96+97+98+99+100 2 b 3 c 4 d rn 1 1 2 2 3 3 4 4 > sqlUpdate(channel, Btest, "Atest", index = "rn") > sqlFetch(channel, "Atest") x 1 d 2 1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20+21+22+23+24+25+26+27+28+29+30+31+32+33+34+35+36+37+38+39+40+41+42+43+44+45+46+47+48+49+50+51+52+53+54+55+56+57+58+59+60+61+62+63+64+65+66+67+68+69+70+71+72+73+74+75+76+77+78+79+80+81+82+83+84+85+86+87+88+89+90+91+92+93+94+95+96+97+98+99+100 3 b 4 c rn 1 1 2 2 3 3 4 4 > sqlDrop(channel, "Atest") > varspec <- "varchar(1000)"; names(varspec) <- "x" > sqlSave(channel, Atest, varTypes = varspec) > sqlColumns(channel, "Atest") TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME COLUMN_SIZE 1 RIPLEY Atest rownames 12 VARCHAR2 255 2 RIPLEY Atest x 12 VARCHAR2 1000 3 RIPLEY Atest rn 3 DECIMAL 38 BUFFER_LENGTH DECIMAL_DIGITS NUM_PREC_RADIX NULLABLE REMARKS COLUMN_DEF 1 255 NA NA 1 2 1000 NA NA 1 3 40 0 10 1 SQL_DATA_TYPE SQL_DATETIME_SUB CHAR_OCTET_LENGTH ORDINAL_POSITION IS_NULLABLE 1 12 0 255 1 YES 2 12 0 1000 2 YES 3 3 0 0 3 YES > sqlFetch(channel, "Atest") x 1 1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20+21+22+23+24+25+26+27+28+29+30+31+32+33+34+35+36+37+38+39+40+41+42+43+44+45+46+47+48+49+50+51+52+53+54+55+56+57+58+59+60+61+62+63+64+65+66+67+68+69+70+71+72+73+74+75+76+77+78+79+80+81+82+83+84+85+86+87+88+89+90+91+92+93+94+95+96+97+98+99+100 2 b 3 c 4 d rn 1 1 2 2 3 3 4 4 > sqlDrop(channel, "Atest") > > dates <- as.character(seq(as.Date("2004-01-01"), by="week", length=10)) > times <- paste(1:10, "05", "00", sep=":") > dt <- as.POSIXct(paste(dates, times)) > Dtest <- data.frame(dates, dt, logi=c(TRUE, NA, FALSE, FALSE, FALSE)) > varspec <- c("date", "timestamp", "varchar(5)") > names(varspec) <- names(Dtest) > sqlDrop(channel, "Dtest", errors = FALSE) > sqlSave(channel, Dtest, varTypes = varspec) > sqlColumns(channel, "Dtest") TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME 1 RIPLEY Dtest rownames 12 VARCHAR2 2 RIPLEY Dtest dates 93 DATE 3 RIPLEY Dtest dt 93 TIMESTAMP(6) 4 RIPLEY Dtest logi 12 VARCHAR2 COLUMN_SIZE BUFFER_LENGTH DECIMAL_DIGITS NUM_PREC_RADIX NULLABLE REMARKS 1 255 255 NA NA 1 2 19 16 NA NA 1 3 19 11 6 NA 1 4 5 5 NA NA 1 COLUMN_DEF SQL_DATA_TYPE SQL_DATETIME_SUB CHAR_OCTET_LENGTH ORDINAL_POSITION 1 12 0 255 1 2 9 3 0 2 3 9 3 0 3 4 12 0 5 4 IS_NULLABLE 1 YES 2 YES 3 YES 4 YES > sqlFetch(channel, "Dtest") dates dt logi 1 2004-01-01 2004-01-01 01:05:00 TRUE 2 2004-01-08 2004-01-08 02:05:00 NA 3 2004-01-15 2004-01-15 03:05:00 FALSE 4 2004-01-22 2004-01-22 04:05:00 FALSE 5 2004-01-29 2004-01-29 05:05:00 FALSE 6 2004-02-05 2004-02-05 06:05:00 TRUE 7 2004-02-12 2004-02-12 07:05:00 NA 8 2004-02-19 2004-02-19 08:05:00 FALSE 9 2004-02-26 2004-02-26 09:05:00 FALSE 10 2004-03-04 2004-03-04 10:05:00 FALSE > sqlDrop(channel, "Dtest") > > sqlQuery(channel, "alter session set NLS_DATE_FORMAT='yyyy-mm-dd hh:mi:ss'") character(0) > sqlDrop(channel, "Dtest", errors = FALSE) > sqlSave(channel, Dtest[-1], "Dtest", fast = FALSE, + varTypes = c(dt = "date", logi = "varchar(5)")) > sqlColumns(channel, "Dtest") TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME COLUMN_SIZE 1 RIPLEY Dtest rownames 12 VARCHAR2 255 2 RIPLEY Dtest dt 93 DATE 19 3 RIPLEY Dtest logi 12 VARCHAR2 5 BUFFER_LENGTH DECIMAL_DIGITS NUM_PREC_RADIX NULLABLE REMARKS COLUMN_DEF 1 255 NA NA 1 2 16 NA NA 1 3 5 NA NA 1 SQL_DATA_TYPE SQL_DATETIME_SUB CHAR_OCTET_LENGTH ORDINAL_POSITION IS_NULLABLE 1 12 0 255 1 YES 2 9 3 0 2 YES 3 12 0 5 3 YES > sqlFetch(channel, "Dtest") dt logi 1 2004-01-01 01:05:00 TRUE 2 2004-01-08 02:05:00 NA 3 2004-01-15 03:05:00 FALSE 4 2004-01-22 04:05:00 FALSE 5 2004-01-29 05:05:00 FALSE 6 2004-02-05 06:05:00 TRUE 7 2004-02-12 07:05:00 NA 8 2004-02-19 08:05:00 FALSE 9 2004-02-26 09:05:00 FALSE 10 2004-03-04 10:05:00 FALSE > sqlDrop(channel, "Dtest") > > sqlDrop(channel, "hills test", errors = FALSE) > sqlSave(channel, hills, "hills test", verbose=TRUE) Query: CREATE TABLE "hills test" ("rownames" varchar(255), "dist" binary_double, "climb" decimal, "time" binary_double) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( ?,?,?,? ) Binding: 'rownames' DataType 12, ColSize 255 Binding: 'dist' DataType 6, ColSize 38 Binding: 'climb' DataType 3, ColSize 38 Binding: 'time' DataType 6, ColSize 38 Parameters: no: 1: rownames Greenmantle/***/no: 2: dist 2.5/***/no: 3: climb 650/***/no: 4: time 16.083/***/ no: 1: rownames Carnethy/***/no: 2: dist 6/***/no: 3: climb 2500/***/no: 4: time 48.35/***/ no: 1: rownames Craig Dunain/***/no: 2: dist 6/***/no: 3: climb 900/***/no: 4: time 33.65/***/ no: 1: rownames Ben Rha/***/no: 2: dist 7.5/***/no: 3: climb 800/***/no: 4: time 45.6/***/ no: 1: rownames Ben Lomond/***/no: 2: dist 8/***/no: 3: climb 3070/***/no: 4: time 62.267/***/ no: 1: rownames Goatfell/***/no: 2: dist 8/***/no: 3: climb 2866/***/no: 4: time 73.217/***/ no: 1: rownames Bens of Jura/***/no: 2: dist 16/***/no: 3: climb 7500/***/no: 4: time 204.617/***/ no: 1: rownames Cairnpapple/***/no: 2: dist 6/***/no: 3: climb 800/***/no: 4: time 36.367/***/ no: 1: rownames Scolty/***/no: 2: dist 5/***/no: 3: climb 800/***/no: 4: time 29.75/***/ no: 1: rownames Traprain/***/no: 2: dist 6/***/no: 3: climb 650/***/no: 4: time 39.75/***/ no: 1: rownames Lairig Ghru/***/no: 2: dist 28/***/no: 3: climb 2100/***/no: 4: time 192.667/***/ no: 1: rownames Dollar ('$')/***/no: 2: dist 5/***/no: 3: climb 2000/***/no: 4: time 43.05/***/ no: 1: rownames Lomonds/***/no: 2: dist 9.5/***/no: 3: climb 2200/***/no: 4: time 65/***/ no: 1: rownames Cairn Table/***/no: 2: dist 6/***/no: 3: climb 500/***/no: 4: time 44.133/***/ no: 1: rownames Eildon Two/***/no: 2: dist 4.5/***/no: 3: climb 1500/***/no: 4: time 26.933/***/ > sqlUpdate(channel, hills[11:15,], "hills test", verbose=TRUE, fast=TRUE) Query: UPDATE "hills test" SET "dist"=?, "climb"=?, "time"=? WHERE "rownames"=? Binding: 'dist' DataType 6, ColSize 38 Binding: 'climb' DataType 3, ColSize 38 Binding: 'time' DataType 6, ColSize 38 Binding: 'rownames' DataType 12, ColSize 255 Parameters: no: 1: dist 28/***/no: 2: climb 2100/***/no: 3: time 192.667/***/no: 4: rownames Lairig Ghru/***/ no: 1: dist 5/***/no: 2: climb 2000/***/no: 3: time 43.05/***/no: 4: rownames Dollar ('$')/***/ no: 1: dist 9.5/***/no: 2: climb 2200/***/no: 3: time 65/***/no: 4: rownames Lomonds/***/ no: 1: dist 6/***/no: 2: climb 500/***/no: 3: time 44.133/***/no: 4: rownames Cairn Table/***/ no: 1: dist 4.5/***/no: 2: climb 1500/***/no: 3: time 26.933/***/no: 4: rownames Eildon Two/***/ > sqlFetch(channel, "hills test") dist climb time Greenmantle 2.5 650 16.083 Carnethy 6.0 2500 48.350 Craig Dunain 6.0 900 33.650 Ben Rha 7.5 800 45.600 Ben Lomond 8.0 3070 62.267 Goatfell 8.0 2866 73.217 Bens of Jura 16.0 7500 204.617 Cairnpapple 6.0 800 36.367 Scolty 5.0 800 29.750 Traprain 6.0 650 39.750 Lairig Ghru 28.0 2100 192.667 Dollar ('$') 5.0 2000 43.050 Lomonds 9.5 2200 65.000 Cairn Table 6.0 500 44.133 Eildon Two 4.5 1500 26.933 > sqlDrop(channel, "hills test") > sqlSave(channel, hills, "hills test", verbose=TRUE, fast=FALSE) Query: CREATE TABLE "hills test" ("rownames" varchar(255), "dist" binary_double, "climb" decimal, "time" binary_double) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Greenmantle', 2.5, 650, 16.083 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Carnethy', 6.0, 2500, 48.350 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Craig Dunain', 6.0, 900, 33.650 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Ben Rha', 7.5, 800, 45.600 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Ben Lomond', 8.0, 3070, 62.267 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Goatfell', 8.0, 2866, 73.217 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Bens of Jura', 16.0, 7500, 204.617 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Cairnpapple', 6.0, 800, 36.367 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Scolty', 5.0, 800, 29.750 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Traprain', 6.0, 650, 39.750 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Lairig Ghru', 28.0, 2100, 192.667 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Dollar (''$'')', 5.0, 2000, 43.050 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Lomonds', 9.5, 2200, 65.000 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Cairn Table', 6.0, 500, 44.133 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Eildon Two', 4.5, 1500, 26.933 ) > sqlUpdate(channel, hills[11:15,], "hills test", verbose=TRUE, fast=FALSE) Query: UPDATE "hills test" SET "dist"=28.0, "climb"=2100, "time"=192.667 WHERE "rownames"='Lairig Ghru' Query: UPDATE "hills test" SET "dist"= 5.0, "climb"=2000, "time"= 43.050 WHERE "rownames"='Dollar (''$'')' Query: UPDATE "hills test" SET "dist"= 9.5, "climb"=2200, "time"= 65.000 WHERE "rownames"='Lomonds' Query: UPDATE "hills test" SET "dist"= 6.0, "climb"= 500, "time"= 44.133 WHERE "rownames"='Cairn Table' Query: UPDATE "hills test" SET "dist"= 4.5, "climb"=1500, "time"= 26.933 WHERE "rownames"='Eildon Two' > sqlDrop(channel, "hills test") > > ## dropping tables in Oracle does not delete them. > sqlQuery(channel, "PURGE recyclebin") character(0) > > sqlTables(channel, catalog="", schema="", tableName="", tableType="%") TABLE_CAT TABLE_SCHEM TABLE_NAME TABLE_TYPE REMARKS 1 TABLE 2 VIEW > sqlTables(channel, catalog="", schema="%", tableName="") TABLE_CAT TABLE_SCHEM TABLE_NAME TABLE_TYPE REMARKS 1 CTXSYS 2 DMSYS 3 EXFSYS 4 MDSYS 5 OLAPSYS 6 ORDSYS 7 SYS 8 SYSTEM 9 WMSYS 10 XDB > sqlSave(channel, women) > sqlFetch(channel, "SYSTEM.TAB") TNAME TABTYPE CLUSTERID 1 women TABLE NA > sqlFetch(channel, "SYSTEM.COL") TNAME COLNO CNAME COLTYPE WIDTH SCALE PRECISION NULLS DEFAULTVAL 1 women 3 weight BINARY_DOUBLE 8 NA NA NULL NA 2 women 2 height BINARY_DOUBLE 8 NA NA NULL NA 3 women 1 rownames VARCHAR2 255 NA NA NULL NA CHARACTER_SET_NAME 1 2 3 CHAR_CS > sqlColumns(channel, schema="SYSTEM", "TAB") TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME 1 SYSTEM TAB TNAME 12 VARCHAR2 2 SYSTEM TAB TABTYPE 12 VARCHAR2 3 SYSTEM TAB CLUSTERID 8 DOUBLE PRECISION COLUMN_SIZE BUFFER_LENGTH DECIMAL_DIGITS NUM_PREC_RADIX NULLABLE REMARKS 1 30 30 NA NA 0 2 7 7 NA NA 1 3 15 22 NA 10 1 COLUMN_DEF SQL_DATA_TYPE SQL_DATETIME_SUB CHAR_OCTET_LENGTH ORDINAL_POSITION 1 12 0 0 1 2 12 0 0 2 3 8 0 0 3 IS_NULLABLE 1 NO 2 YES 3 YES > sqlDrop(channel, "women") > > ## dropping tables in Oracle does not delete them. > sqlQuery(channel, "PURGE recyclebin") character(0) > close(channel) > RODBC/tests/mysql-win.Rout.save0000644000176000001440000006025713013621651016055 0ustar ripleyusers R version 2.9.1 Patched (2009-07-09 r48925) Copyright (C) 2009 The R Foundation for Statistical Computing ISBN 3-900051-07-0 R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > ##-*- R -*- > ## MySQL is not case-honouring on Windows > library(RODBC) > library(MASS) > USArrests[1,2] <- NA > hills <- hills[1:15,] > row.names(hills)[12] <- "Dollar ('$')" > > ## testdb3 is ODBC/Connector 3.51.x, testdb5 is 5.1.x > channel <- odbcConnect("testdb5") > if(!inherits(channel, "RODBC")) q("no") > sqlTables(channel) [1] TABLE_CAT TABLE_SCHEM TABLE_NAME TABLE_TYPE REMARKS <0 rows> (or 0-length row.names) > sqlDrop(channel, "USArrests", errors = FALSE) > sqlSave(channel, USArrests, rownames = "state", addPK = TRUE) > sqlTables(channel) TABLE_CAT TABLE_SCHEM TABLE_NAME TABLE_TYPE REMARKS 1 usarrests TABLE > sqlColumns(channel, "USArrests") TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME COLUMN_SIZE 1 usarrests state 12 varchar 255 2 usarrests murder 8 double 15 3 usarrests assault 4 integer 10 4 usarrests urbanpop 4 integer 10 5 usarrests rape 8 double 15 BUFFER_LENGTH DECIMAL_DIGITS NUM_PREC_RADIX NULLABLE REMARKS COLUMN_DEF 1 255 NA NA 0 '' 2 8 NA NA 1 3 4 0 10 1 4 4 0 10 1 5 8 NA NA 1 SQL_DATA_TYPE SQL_DATETIME_SUB CHAR_OCTET_LENGTH ORDINAL_POSITION IS_NULLABLE 1 12 NA 255 1 NO 2 8 NA NA 2 YES 3 4 NA NA 3 YES 4 4 NA NA 4 YES 5 8 NA NA 5 YES > sqlColumns(channel, "USArrests", special = TRUE) SCOPE COLUMN_NAME DATA_TYPE TYPE_NAME COLUMN_SIZE BUFFER_LENGTH 1 2 state 12 varchar 255 255 DECIMAL_DIGITS PSEUDO_COLUMN 1 NA 1 > sqlPrimaryKeys(channel, "USArrests") TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME KEY_SEQ PK_NAME 1 usarrests state 1 PRIMARY > sqlFetch(channel, "USArrests", rownames = "state") murder assault urbanpop rape Alabama 13.2 NA 58 21.2 Alaska 10.0 263 48 44.5 Arizona 8.1 294 80 31.0 Arkansas 8.8 190 50 19.5 California 9.0 276 91 40.6 Colorado 7.9 204 78 38.7 Connecticut 3.3 110 77 11.1 Delaware 5.9 238 72 15.8 Florida 15.4 335 80 31.9 Georgia 17.4 211 60 25.8 Hawaii 5.3 46 83 20.2 Idaho 2.6 120 54 14.2 Illinois 10.4 249 83 24.0 Indiana 7.2 113 65 21.0 Iowa 2.2 56 57 11.3 Kansas 6.0 115 66 18.0 Kentucky 9.7 109 52 16.3 Louisiana 15.4 249 66 22.2 Maine 2.1 83 51 7.8 Maryland 11.3 300 67 27.8 Massachusetts 4.4 149 85 16.3 Michigan 12.1 255 74 35.1 Minnesota 2.7 72 66 14.9 Mississippi 16.1 259 44 17.1 Missouri 9.0 178 70 28.2 Montana 6.0 109 53 16.4 Nebraska 4.3 102 62 16.5 Nevada 12.2 252 81 46.0 New Hampshire 2.1 57 56 9.5 New Jersey 7.4 159 89 18.8 New Mexico 11.4 285 70 32.1 New York 11.1 254 86 26.1 North Carolina 13.0 337 45 16.1 North Dakota 0.8 45 44 7.3 Ohio 7.3 120 75 21.4 Oklahoma 6.6 151 68 20.0 Oregon 4.9 159 67 29.3 Pennsylvania 6.3 106 72 14.9 Rhode Island 3.4 174 87 8.3 South Carolina 14.4 279 48 22.5 South Dakota 3.8 86 45 12.8 Tennessee 13.2 188 59 26.9 Texas 12.7 201 80 25.5 Utah 3.2 120 80 22.9 Vermont 2.2 48 32 11.2 Virginia 8.5 156 63 20.7 Washington 4.0 145 73 26.2 West Virginia 5.7 81 39 9.3 Wisconsin 2.6 53 66 10.8 Wyoming 6.8 161 60 15.6 > sqlQuery(channel, "select state, murder from USArrests where rape > 30 order by murder") state murder 1 Colorado 7.9 2 Arizona 8.1 3 California 9.0 4 Alaska 10.0 5 New Mexico 11.4 6 Michigan 12.1 7 Nevada 12.2 8 Florida 15.4 > foo <- cbind(state=row.names(USArrests), USArrests)[1:3, c(1,3)] > foo[1,2] <- 236 > sqlUpdate(channel, foo, "USArrests") > sqlFetch(channel, "USArrests", rownames = "state", max = 5) murder assault urbanpop rape Alabama 13.2 236 58 21.2 Alaska 10.0 263 48 44.5 Arizona 8.1 294 80 31.0 Arkansas 8.8 190 50 19.5 California 9.0 276 91 40.6 > sqlFetchMore(channel, rownames = "state", max = 8) murder assault urbanpop rape Colorado 7.9 204 78 38.7 Connecticut 3.3 110 77 11.1 Delaware 5.9 238 72 15.8 Florida 15.4 335 80 31.9 Georgia 17.4 211 60 25.8 Hawaii 5.3 46 83 20.2 Idaho 2.6 120 54 14.2 Illinois 10.4 249 83 24.0 > sqlDrop(channel, "USArrests") > > Btest <- Atest <- + data.frame(x = c(paste(1:100, collapse="+"), letters[2:4]), rn=1:4) > Btest[,1] <- Atest[c(4,1:3),1] > sqlDrop(channel, "Atest", errors = FALSE) > colspec <- list(character="text", double="double", + integer="integer", logical="varchar(5)") > sqlSave(channel, Atest, typeInfo = colspec) > sqlColumns(channel, "Atest") TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME COLUMN_SIZE 1 atest rownames -1 text 65535 2 atest x -1 text 65535 3 atest rn 4 integer 10 BUFFER_LENGTH DECIMAL_DIGITS NUM_PREC_RADIX NULLABLE REMARKS COLUMN_DEF 1 65535 NA NA 1 2 65535 NA NA 1 3 4 0 10 1 SQL_DATA_TYPE SQL_DATETIME_SUB CHAR_OCTET_LENGTH ORDINAL_POSITION IS_NULLABLE 1 -1 NA 65535 1 YES 2 -1 NA 65535 2 YES 3 4 NA NA 3 YES > sqlFetch(channel, "Atest") x 1 1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20+21+22+23+24+25+26+27+28+29+30+31+32+33+34+35+36+37+38+39+40+41+42+43+44+45+46+47+48+49+50+51+52+53+54+55+56+57+58+59+60+61+62+63+64+65+66+67+68+69+70+71+72+73+74+75+76+77+78+79+80+81+82+83+84+85+86+87+88+89+90+91+92+93+94+95+96+97+98+99+100 2 b 3 c 4 d rn 1 1 2 2 3 3 4 4 > sqlUpdate(channel, Btest, "Atest", index = "rn") > sqlFetch(channel, "Atest") x 1 d 2 1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20+21+22+23+24+25+26+27+28+29+30+31+32+33+34+35+36+37+38+39+40+41+42+43+44+45+46+47+48+49+50+51+52+53+54+55+56+57+58+59+60+61+62+63+64+65+66+67+68+69+70+71+72+73+74+75+76+77+78+79+80+81+82+83+84+85+86+87+88+89+90+91+92+93+94+95+96+97+98+99+100 3 b 4 c rn 1 1 2 2 3 3 4 4 > sqlDrop(channel, "Atest") > varspec <- "text"; names(varspec) <- "x" > sqlSave(channel, Atest, varTypes = varspec) > sqlColumns(channel, "Atest") TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME COLUMN_SIZE 1 atest rownames 12 varchar 255 2 atest x -1 text 65535 3 atest rn 4 integer 10 BUFFER_LENGTH DECIMAL_DIGITS NUM_PREC_RADIX NULLABLE REMARKS COLUMN_DEF 1 255 NA NA 1 2 65535 NA NA 1 3 4 0 10 1 SQL_DATA_TYPE SQL_DATETIME_SUB CHAR_OCTET_LENGTH ORDINAL_POSITION IS_NULLABLE 1 12 NA 255 1 YES 2 -1 NA 65535 2 YES 3 4 NA NA 3 YES > sqlFetch(channel, "Atest") x 1 1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20+21+22+23+24+25+26+27+28+29+30+31+32+33+34+35+36+37+38+39+40+41+42+43+44+45+46+47+48+49+50+51+52+53+54+55+56+57+58+59+60+61+62+63+64+65+66+67+68+69+70+71+72+73+74+75+76+77+78+79+80+81+82+83+84+85+86+87+88+89+90+91+92+93+94+95+96+97+98+99+100 2 b 3 c 4 d rn 1 1 2 2 3 3 4 4 > sqlDrop(channel, "Atest") > > dates <- as.character(seq(as.Date("2004-01-01"), by="week", length=10)) > times <- paste(1:10, "05", "00", sep=":") > dt <- as.POSIXct(paste(dates, times)) > Dtest <- data.frame(dates, times, dt, logi=c(TRUE, NA, FALSE, FALSE, FALSE)) > varspec <- c("date", "time", "timestamp", "varchar(5)") > names(varspec) <- names(Dtest) > sqlDrop(channel, "Dtest", errors = FALSE) > sqlSave(channel, Dtest, varTypes = varspec) > sqlColumns(channel, "Dtest") TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME COLUMN_SIZE 1 dtest rownames 12 varchar 255 2 dtest dates 91 date 10 3 dtest times 92 time 8 4 dtest dt 93 timestamp 19 5 dtest logi 12 varchar 5 BUFFER_LENGTH DECIMAL_DIGITS NUM_PREC_RADIX NULLABLE REMARKS COLUMN_DEF 1 255 NA NA 1 2 6 NA NA 1 3 6 0 10 1 4 16 0 10 1 5 5 NA NA 1 SQL_DATA_TYPE SQL_DATETIME_SUB CHAR_OCTET_LENGTH ORDINAL_POSITION IS_NULLABLE 1 12 NA 255 1 YES 2 9 91 NA 2 YES 3 9 92 NA 3 YES 4 9 93 NA 4 YES 5 12 NA 5 5 YES > sqlFetch(channel, "Dtest") dates times dt logi 1 2004-01-01 01:05:00 2004-01-01 01:05:00 TRUE 2 2004-01-08 02:05:00 2004-01-08 02:05:00 NA 3 2004-01-15 03:05:00 2004-01-15 03:05:00 FALSE 4 2004-01-22 04:05:00 2004-01-22 04:05:00 FALSE 5 2004-01-29 05:05:00 2004-01-29 05:05:00 FALSE 6 2004-02-05 06:05:00 2004-02-05 06:05:00 TRUE 7 2004-02-12 07:05:00 2004-02-12 07:05:00 NA 8 2004-02-19 08:05:00 2004-02-19 08:05:00 FALSE 9 2004-02-26 09:05:00 2004-02-26 09:05:00 FALSE 10 2004-03-04 10:05:00 2004-03-04 10:05:00 FALSE > sqlDrop(channel, "Dtest", errors = FALSE) > sqlSave(channel, Dtest, varTypes = varspec, fast = FALSE) > sqlColumns(channel, "Dtest") TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME COLUMN_SIZE 1 dtest rownames 12 varchar 255 2 dtest dates 91 date 10 3 dtest times 92 time 8 4 dtest dt 93 timestamp 19 5 dtest logi 12 varchar 5 BUFFER_LENGTH DECIMAL_DIGITS NUM_PREC_RADIX NULLABLE REMARKS COLUMN_DEF 1 255 NA NA 1 2 6 NA NA 1 3 6 0 10 1 4 16 0 10 1 5 5 NA NA 1 SQL_DATA_TYPE SQL_DATETIME_SUB CHAR_OCTET_LENGTH ORDINAL_POSITION IS_NULLABLE 1 12 NA 255 1 YES 2 9 91 NA 2 YES 3 9 92 NA 3 YES 4 9 93 NA 4 YES 5 12 NA 5 5 YES > sqlFetch(channel, "Dtest") dates times dt logi 1 2004-01-01 01:05:00 2004-01-01 01:05:00 TRUE 2 2004-01-08 02:05:00 2004-01-08 02:05:00 NA 3 2004-01-15 03:05:00 2004-01-15 03:05:00 FALSE 4 2004-01-22 04:05:00 2004-01-22 04:05:00 FALSE 5 2004-01-29 05:05:00 2004-01-29 05:05:00 FALSE 6 2004-02-05 06:05:00 2004-02-05 06:05:00 TRUE 7 2004-02-12 07:05:00 2004-02-12 07:05:00 NA 8 2004-02-19 08:05:00 2004-02-19 08:05:00 FALSE 9 2004-02-26 09:05:00 2004-02-26 09:05:00 FALSE 10 2004-03-04 10:05:00 2004-03-04 10:05:00 FALSE > sqlDrop(channel, "Dtest") > > sqlDrop(channel, "hills test", errors = FALSE) > sqlSave(channel, hills, "hills test", verbose=TRUE) Query: CREATE TABLE `hills test` (`rownames` varchar(255), `dist` double, `climb` integer, `time` double) Query: INSERT INTO `hills test` ( `rownames`, `dist`, `climb`, `time` ) VALUES ( ?,?,?,? ) Binding: 'rownames' DataType 12, ColSize 255 Binding: 'dist' DataType 8, ColSize 15 Binding: 'climb' DataType 4, ColSize 10 Binding: 'time' DataType 8, ColSize 15 Parameters: no: 1: rownames Greenmantle/***/no: 2: dist 2.5/***/no: 3: climb 650/***/no: 4: time 16.083/***/ no: 1: rownames Carnethy/***/no: 2: dist 6/***/no: 3: climb 2500/***/no: 4: time 48.35/***/ no: 1: rownames Craig Dunain/***/no: 2: dist 6/***/no: 3: climb 900/***/no: 4: time 33.65/***/ no: 1: rownames Ben Rha/***/no: 2: dist 7.5/***/no: 3: climb 800/***/no: 4: time 45.6/***/ no: 1: rownames Ben Lomond/***/no: 2: dist 8/***/no: 3: climb 3070/***/no: 4: time 62.267/***/ no: 1: rownames Goatfell/***/no: 2: dist 8/***/no: 3: climb 2866/***/no: 4: time 73.217/***/ no: 1: rownames Bens of Jura/***/no: 2: dist 16/***/no: 3: climb 7500/***/no: 4: time 204.617/***/ no: 1: rownames Cairnpapple/***/no: 2: dist 6/***/no: 3: climb 800/***/no: 4: time 36.367/***/ no: 1: rownames Scolty/***/no: 2: dist 5/***/no: 3: climb 800/***/no: 4: time 29.75/***/ no: 1: rownames Traprain/***/no: 2: dist 6/***/no: 3: climb 650/***/no: 4: time 39.75/***/ no: 1: rownames Lairig Ghru/***/no: 2: dist 28/***/no: 3: climb 2100/***/no: 4: time 192.667/***/ no: 1: rownames Dollar ('$')/***/no: 2: dist 5/***/no: 3: climb 2000/***/no: 4: time 43.05/***/ no: 1: rownames Lomonds/***/no: 2: dist 9.5/***/no: 3: climb 2200/***/no: 4: time 65/***/ no: 1: rownames Cairn Table/***/no: 2: dist 6/***/no: 3: climb 500/***/no: 4: time 44.133/***/ no: 1: rownames Eildon Two/***/no: 2: dist 4.5/***/no: 3: climb 1500/***/no: 4: time 26.933/***/ > sqlUpdate(channel, hills[11:15,], "hills test", verbose=TRUE, fast=TRUE) Query: UPDATE `hills test` SET `dist`=?, `climb`=?, `time`=? WHERE `rownames`=? Binding: 'dist' DataType 8, ColSize 15 Binding: 'climb' DataType 4, ColSize 10 Binding: 'time' DataType 8, ColSize 15 Binding: 'rownames' DataType 12, ColSize 255 Parameters: no: 1: dist 28/***/no: 2: climb 2100/***/no: 3: time 192.667/***/no: 4: rownames Lairig Ghru/***/ no: 1: dist 5/***/no: 2: climb 2000/***/no: 3: time 43.05/***/no: 4: rownames Dollar ('$')/***/ no: 1: dist 9.5/***/no: 2: climb 2200/***/no: 3: time 65/***/no: 4: rownames Lomonds/***/ no: 1: dist 6/***/no: 2: climb 500/***/no: 3: time 44.133/***/no: 4: rownames Cairn Table/***/ no: 1: dist 4.5/***/no: 2: climb 1500/***/no: 3: time 26.933/***/no: 4: rownames Eildon Two/***/ > sqlFetch(channel, "hills test") dist climb time Greenmantle 2.5 650 16.083 Carnethy 6.0 2500 48.350 Craig Dunain 6.0 900 33.650 Ben Rha 7.5 800 45.600 Ben Lomond 8.0 3070 62.267 Goatfell 8.0 2866 73.217 Bens of Jura 16.0 7500 204.617 Cairnpapple 6.0 800 36.367 Scolty 5.0 800 29.750 Traprain 6.0 650 39.750 Lairig Ghru 28.0 2100 192.667 Dollar ('$') 5.0 2000 43.050 Lomonds 9.5 2200 65.000 Cairn Table 6.0 500 44.133 Eildon Two 4.5 1500 26.933 > sqlDrop(channel, "hills test") > sqlSave(channel, hills, "hills test", verbose=TRUE, fast=FALSE) Query: CREATE TABLE `hills test` (`rownames` varchar(255), `dist` double, `climb` integer, `time` double) Query: INSERT INTO `hills test` ( `rownames`, `dist`, `climb`, `time` ) VALUES ( 'Greenmantle', 2.5, 650, 16.083 ) Query: INSERT INTO `hills test` ( `rownames`, `dist`, `climb`, `time` ) VALUES ( 'Carnethy', 6.0, 2500, 48.350 ) Query: INSERT INTO `hills test` ( `rownames`, `dist`, `climb`, `time` ) VALUES ( 'Craig Dunain', 6.0, 900, 33.650 ) Query: INSERT INTO `hills test` ( `rownames`, `dist`, `climb`, `time` ) VALUES ( 'Ben Rha', 7.5, 800, 45.600 ) Query: INSERT INTO `hills test` ( `rownames`, `dist`, `climb`, `time` ) VALUES ( 'Ben Lomond', 8.0, 3070, 62.267 ) Query: INSERT INTO `hills test` ( `rownames`, `dist`, `climb`, `time` ) VALUES ( 'Goatfell', 8.0, 2866, 73.217 ) Query: INSERT INTO `hills test` ( `rownames`, `dist`, `climb`, `time` ) VALUES ( 'Bens of Jura', 16.0, 7500, 204.617 ) Query: INSERT INTO `hills test` ( `rownames`, `dist`, `climb`, `time` ) VALUES ( 'Cairnpapple', 6.0, 800, 36.367 ) Query: INSERT INTO `hills test` ( `rownames`, `dist`, `climb`, `time` ) VALUES ( 'Scolty', 5.0, 800, 29.750 ) Query: INSERT INTO `hills test` ( `rownames`, `dist`, `climb`, `time` ) VALUES ( 'Traprain', 6.0, 650, 39.750 ) Query: INSERT INTO `hills test` ( `rownames`, `dist`, `climb`, `time` ) VALUES ( 'Lairig Ghru', 28.0, 2100, 192.667 ) Query: INSERT INTO `hills test` ( `rownames`, `dist`, `climb`, `time` ) VALUES ( 'Dollar (''$'')', 5.0, 2000, 43.050 ) Query: INSERT INTO `hills test` ( `rownames`, `dist`, `climb`, `time` ) VALUES ( 'Lomonds', 9.5, 2200, 65.000 ) Query: INSERT INTO `hills test` ( `rownames`, `dist`, `climb`, `time` ) VALUES ( 'Cairn Table', 6.0, 500, 44.133 ) Query: INSERT INTO `hills test` ( `rownames`, `dist`, `climb`, `time` ) VALUES ( 'Eildon Two', 4.5, 1500, 26.933 ) > sqlUpdate(channel, hills[11:15,], "hills test", verbose=TRUE, fast=FALSE) Query: UPDATE `hills test` SET `dist`=28.0, `climb`=2100, `time`=192.667 WHERE `rownames`='Lairig Ghru' Query: UPDATE `hills test` SET `dist`= 5.0, `climb`=2000, `time`= 43.050 WHERE `rownames`='Dollar (''$'')' Query: UPDATE `hills test` SET `dist`= 9.5, `climb`=2200, `time`= 65.000 WHERE `rownames`='Lomonds' Query: UPDATE `hills test` SET `dist`= 6.0, `climb`= 500, `time`= 44.133 WHERE `rownames`='Cairn Table' Query: UPDATE `hills test` SET `dist`= 4.5, `climb`=1500, `time`= 26.933 WHERE `rownames`='Eildon Two' > sqlDrop(channel, "hills test") > > sqlTables(channel, catalog="%") TABLE_CAT TABLE_SCHEM TABLE_NAME TABLE_TYPE REMARKS 1 information_schema 2 test > sqlTables(channel, catalog="test", tableName="%") [1] TABLE_CAT TABLE_SCHEM TABLE_NAME TABLE_TYPE REMARKS <0 rows> (or 0-length row.names) > > close(channel) > RODBC/tests/excel.Rout.save0000644000176000001440000003614213013621651015211 0ustar ripleyusers R version 2.9.1 Patched (2009-07-09 r48925) Copyright (C) 2009 The R Foundation for Statistical Computing ISBN 3-900051-07-0 R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > ##-*- R -*- > library(RODBC) > library(MASS) > USArrests[1,2] <- NA > hills <- hills[1:15,] > row.names(hills)[12] <- "Dollar ('$')" > > > # DBase: maps table/column names to u/case, max length 8 > dbf <- system.file("files", "sids.dbf", package="foreign") > unlink("sids.dbf") > file.copy(dbf, "sids.dbf") [1] TRUE > channel <- odbcConnectDbase("sids.dbf") > str(sids <- sqlFetch(channel, "sids")) 'data.frame': 100 obs. of 14 variables: $ AREA : num 0.114 0.061 0.143 0.07 0.153 0.097 0.062 0.091 0.118 0.124 ... $ PERIMETER: num 1.44 1.23 1.63 2.97 2.21 ... $ CNTY_ : num 1825 1827 1828 1831 1832 ... $ CNTY_ID : num 1825 1827 1828 1831 1832 ... $ NAME : Factor w/ 100 levels "Alamance","Alexander",..: 5 3 86 27 66 46 15 37 93 85 ... $ FIPS : int 37009 37005 37171 37053 37131 37091 37029 37073 37185 37169 ... $ FIPSNO : num 37009 37005 37171 37053 37131 ... $ CRESS_ID : num 5 3 86 27 66 46 15 37 93 85 ... $ BIR74 : num 1091 487 3188 508 1421 ... $ SID74 : num 1 0 5 1 9 7 0 0 4 1 ... $ NWBIR74 : num 10 10 208 123 1066 ... $ BIR79 : num 1364 542 3616 830 1606 ... $ SID79 : num 0 3 6 2 3 5 2 2 2 5 ... $ NWBIR79 : num 19 12 260 145 1197 ... > sqlUpdate(channel, sids[1:2, ], "sids", index="NAME", verbose=TRUE, fast=FALSE) Query: UPDATE [sids] SET "AREA"=0.114, "PERIMETER"=1.442, "CNTY_"=1825, "CNTY_ID"=1825, "FIPS"='37009', "FIPSNO"=37009, "CRESS_ID"=5, "BIR74"=1091, "SID74"=1, "NWBIR74"=10, "BIR79"=1364, "SID79"=0, "NWBIR79"=19 WHERE "NAME"='Ashe' Query: UPDATE [sids] SET "AREA"=0.061, "PERIMETER"=1.231, "CNTY_"=1827, "CNTY_ID"=1827, "FIPS"='37005', "FIPSNO"=37005, "CRESS_ID"=3, "BIR74"= 487, "SID74"=0, "NWBIR74"=10, "BIR79"= 542, "SID79"=3, "NWBIR79"=12 WHERE "NAME"='Alleghany' > close(channel) > > channel <- odbcConnectDbase("sids.dbf", case="toupper") > sqlDrop(channel, "HILLS 2", errors=FALSE) > sqlSave(channel, hills, "HILLS 2", verbose=TRUE) Query: CREATE TABLE [HILLS 2] ("rownames" Char(254), "DIST" Numeric, "CLIMB" Numeric, "TIME" Numeric) Query: INSERT INTO [HILLS 2] ( "ROWNAMES", "DIST", "CLIMB", "TIME" ) VALUES ( ?,?,?,? ) Binding: 'ROWNAMES' DataType 12, ColSize 254 Binding: 'DIST' DataType 8, ColSize 53 Binding: 'CLIMB' DataType 8, ColSize 53 Binding: 'TIME' DataType 8, ColSize 53 Parameters: no: 1: ROWNAMES Greenmantle/***/no: 2: DIST 2.5/***/no: 3: CLIMB 650/***/no: 4: TIME 16.083/***/ no: 1: ROWNAMES Carnethy/***/no: 2: DIST 6/***/no: 3: CLIMB 2500/***/no: 4: TIME 48.35/***/ no: 1: ROWNAMES Craig Dunain/***/no: 2: DIST 6/***/no: 3: CLIMB 900/***/no: 4: TIME 33.65/***/ no: 1: ROWNAMES Ben Rha/***/no: 2: DIST 7.5/***/no: 3: CLIMB 800/***/no: 4: TIME 45.6/***/ no: 1: ROWNAMES Ben Lomond/***/no: 2: DIST 8/***/no: 3: CLIMB 3070/***/no: 4: TIME 62.267/***/ no: 1: ROWNAMES Goatfell/***/no: 2: DIST 8/***/no: 3: CLIMB 2866/***/no: 4: TIME 73.217/***/ no: 1: ROWNAMES Bens of Jura/***/no: 2: DIST 16/***/no: 3: CLIMB 7500/***/no: 4: TIME 204.617/***/ no: 1: ROWNAMES Cairnpapple/***/no: 2: DIST 6/***/no: 3: CLIMB 800/***/no: 4: TIME 36.367/***/ no: 1: ROWNAMES Scolty/***/no: 2: DIST 5/***/no: 3: CLIMB 800/***/no: 4: TIME 29.75/***/ no: 1: ROWNAMES Traprain/***/no: 2: DIST 6/***/no: 3: CLIMB 650/***/no: 4: TIME 39.75/***/ no: 1: ROWNAMES Lairig Ghru/***/no: 2: DIST 28/***/no: 3: CLIMB 2100/***/no: 4: TIME 192.667/***/ no: 1: ROWNAMES Dollar ('$')/***/no: 2: DIST 5/***/no: 3: CLIMB 2000/***/no: 4: TIME 43.05/***/ no: 1: ROWNAMES Lomonds/***/no: 2: DIST 9.5/***/no: 3: CLIMB 2200/***/no: 4: TIME 65/***/ no: 1: ROWNAMES Cairn Table/***/no: 2: DIST 6/***/no: 3: CLIMB 500/***/no: 4: TIME 44.133/***/ no: 1: ROWNAMES Eildon Two/***/no: 2: DIST 4.5/***/no: 3: CLIMB 1500/***/no: 4: TIME 26.933/***/ > sqlUpdate(channel, hills[11:15,], "HILLS 2", verbose=TRUE) Query: UPDATE [HILLS 2] SET "DIST"=?, "CLIMB"=?, "TIME"=? WHERE "ROWNAMES"=? Binding: 'DIST' DataType 8, ColSize 53 Binding: 'CLIMB' DataType 8, ColSize 53 Binding: 'TIME' DataType 8, ColSize 53 Binding: 'ROWNAMES' DataType 12, ColSize 254 Parameters: no: 1: DIST 28/***/no: 2: CLIMB 2100/***/no: 3: TIME 192.667/***/no: 4: ROWNAMES Lairig Ghru/***/ no: 1: DIST 5/***/no: 2: CLIMB 2000/***/no: 3: TIME 43.05/***/no: 4: ROWNAMES Dollar ('$')/***/ no: 1: DIST 9.5/***/no: 2: CLIMB 2200/***/no: 3: TIME 65/***/no: 4: ROWNAMES Lomonds/***/ no: 1: DIST 6/***/no: 2: CLIMB 500/***/no: 3: TIME 44.133/***/no: 4: ROWNAMES Cairn Table/***/ no: 1: DIST 4.5/***/no: 2: CLIMB 1500/***/no: 3: TIME 26.933/***/no: 4: ROWNAMES Eildon Two/***/ > sqlDrop(channel, "HILLS 2") > close(channel) > > > # Excel 2003 > channel <- odbcConnectExcel("hills.xls") > ## list the spreadsheets and marked ranges > sqlTables(channel) TABLE_CAT TABLE_SCHEM TABLE_NAME TABLE_TYPE 1 d:\\R\\svn\\Rpkgs\\RODBC\\tests\\hills hills$ SYSTEM TABLE 2 d:\\R\\svn\\Rpkgs\\RODBC\\tests\\hills women$ SYSTEM TABLE 3 d:\\R\\svn\\Rpkgs\\RODBC\\tests\\hills women TABLE REMARKS 1 2 3 > sqlColumns(channel, "hills") TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME 1 d:\\R\\svn\\Rpkgs\\RODBC\\tests\\hills hills$ dist 2 d:\\R\\svn\\Rpkgs\\RODBC\\tests\\hills hills$ climb 3 d:\\R\\svn\\Rpkgs\\RODBC\\tests\\hills hills$ ttime DATA_TYPE TYPE_NAME COLUMN_SIZE BUFFER_LENGTH DECIMAL_DIGITS NUM_PREC_RADIX 1 8 NUMBER 53 8 NA 2 2 8 NUMBER 53 8 NA 2 3 8 NUMBER 53 8 NA 2 NULLABLE REMARKS COLUMN_DEF SQL_DATA_TYPE SQL_DATETIME_SUB CHAR_OCTET_LENGTH 1 1 8 NA NA 2 1 8 NA NA 3 1 8 NA NA ORDINAL_POSITION IS_NULLABLE ORDINAL 1 1 YES 1 2 2 YES 2 3 3 YES 3 > ## two ways to retrieve the contents of hills > sqlFetch(channel, "hills") dist climb ttime 1 2.5 650 16.083 2 6.0 2500 48.350 3 6.0 900 33.650 4 7.5 800 45.600 5 8.0 3070 62.267 6 8.0 2866 73.217 7 16.0 7500 204.617 8 6.0 800 36.367 9 5.0 800 29.750 10 6.0 650 39.750 11 28.0 2100 192.667 12 5.0 2000 43.050 13 9.5 2200 65.000 14 6.0 500 44.133 15 4.5 1500 26.933 16 10.0 3000 72.250 17 14.0 2200 98.417 18 3.0 350 78.650 19 4.5 1000 17.417 20 5.5 600 32.567 21 3.0 300 15.950 22 3.5 1500 27.900 23 6.0 2200 47.633 24 2.0 900 17.933 25 3.0 600 18.683 26 4.0 2000 26.217 27 6.0 800 34.433 28 5.0 950 28.567 29 6.5 1750 50.500 30 5.0 500 20.950 31 10.0 4400 85.583 32 6.0 600 32.383 33 18.0 5200 170.250 34 4.5 850 28.100 35 20.0 5000 159.833 > sqlQuery(channel, "select * from [hills$]") dist climb ttime 1 2.5 650 16.083 2 6.0 2500 48.350 3 6.0 900 33.650 4 7.5 800 45.600 5 8.0 3070 62.267 6 8.0 2866 73.217 7 16.0 7500 204.617 8 6.0 800 36.367 9 5.0 800 29.750 10 6.0 650 39.750 11 28.0 2100 192.667 12 5.0 2000 43.050 13 9.5 2200 65.000 14 6.0 500 44.133 15 4.5 1500 26.933 16 10.0 3000 72.250 17 14.0 2200 98.417 18 3.0 350 78.650 19 4.5 1000 17.417 20 5.5 600 32.567 21 3.0 300 15.950 22 3.5 1500 27.900 23 6.0 2200 47.633 24 2.0 900 17.933 25 3.0 600 18.683 26 4.0 2000 26.217 27 6.0 800 34.433 28 5.0 950 28.567 29 6.5 1750 50.500 30 5.0 500 20.950 31 10.0 4400 85.583 32 6.0 600 32.383 33 18.0 5200 170.250 34 4.5 850 28.100 35 20.0 5000 159.833 > > sqlFetch(channel, "women") height weight 1 58 115 2 59 117 3 60 120 4 61 123 5 62 126 6 63 129 7 64 132 8 65 135 9 66 139 10 67 142 11 68 146 12 69 150 13 70 154 14 71 159 15 72 164 > close(channel) > > # The Excel driver maps ' ' to '_'. > channel <- odbcConnectExcel("hills.xls", readOnly=FALSE) > sqlSave(channel, hills, "hills_test", verbose=TRUE, fast=FALSE) Query: CREATE TABLE [hills_test] ("rownames" VARCHAR(255), "dist" NUMBER, "climb" NUMBER, "time" NUMBER) Query: INSERT INTO [hills_test] ( "rownames", "dist", "climb", "time" ) VALUES ( 'Greenmantle', 2.5, 650, 16.083 ) Query: INSERT INTO [hills_test] ( "rownames", "dist", "climb", "time" ) VALUES ( 'Carnethy', 6.0, 2500, 48.350 ) Query: INSERT INTO [hills_test] ( "rownames", "dist", "climb", "time" ) VALUES ( 'Craig Dunain', 6.0, 900, 33.650 ) Query: INSERT INTO [hills_test] ( "rownames", "dist", "climb", "time" ) VALUES ( 'Ben Rha', 7.5, 800, 45.600 ) Query: INSERT INTO [hills_test] ( "rownames", "dist", "climb", "time" ) VALUES ( 'Ben Lomond', 8.0, 3070, 62.267 ) Query: INSERT INTO [hills_test] ( "rownames", "dist", "climb", "time" ) VALUES ( 'Goatfell', 8.0, 2866, 73.217 ) Query: INSERT INTO [hills_test] ( "rownames", "dist", "climb", "time" ) VALUES ( 'Bens of Jura', 16.0, 7500, 204.617 ) Query: INSERT INTO [hills_test] ( "rownames", "dist", "climb", "time" ) VALUES ( 'Cairnpapple', 6.0, 800, 36.367 ) Query: INSERT INTO [hills_test] ( "rownames", "dist", "climb", "time" ) VALUES ( 'Scolty', 5.0, 800, 29.750 ) Query: INSERT INTO [hills_test] ( "rownames", "dist", "climb", "time" ) VALUES ( 'Traprain', 6.0, 650, 39.750 ) Query: INSERT INTO [hills_test] ( "rownames", "dist", "climb", "time" ) VALUES ( 'Lairig Ghru', 28.0, 2100, 192.667 ) Query: INSERT INTO [hills_test] ( "rownames", "dist", "climb", "time" ) VALUES ( 'Dollar (''$'')', 5.0, 2000, 43.050 ) Query: INSERT INTO [hills_test] ( "rownames", "dist", "climb", "time" ) VALUES ( 'Lomonds', 9.5, 2200, 65.000 ) Query: INSERT INTO [hills_test] ( "rownames", "dist", "climb", "time" ) VALUES ( 'Cairn Table', 6.0, 500, 44.133 ) Query: INSERT INTO [hills_test] ( "rownames", "dist", "climb", "time" ) VALUES ( 'Eildon Two', 4.5, 1500, 26.933 ) > sqlUpdate(channel, hills[11:15,], "hills_test", verbose=TRUE, fast=FALSE) Query: UPDATE [hills_test] SET "dist"=28.0, "climb"=2100, "time"=192.667 WHERE "rownames"='Lairig Ghru' Query: UPDATE [hills_test] SET "dist"= 5.0, "climb"=2000, "time"= 43.050 WHERE "rownames"='Dollar (''$'')' Query: UPDATE [hills_test] SET "dist"= 9.5, "climb"=2200, "time"= 65.000 WHERE "rownames"='Lomonds' Query: UPDATE [hills_test] SET "dist"= 6.0, "climb"= 500, "time"= 44.133 WHERE "rownames"='Cairn Table' Query: UPDATE [hills_test] SET "dist"= 4.5, "climb"=1500, "time"= 26.933 WHERE "rownames"='Eildon Two' > sqlFetch(channel, "hills_test") dist climb time Greenmantle 2.5 650 16.083 Carnethy 6.0 2500 48.350 Craig Dunain 6.0 900 33.650 Ben Rha 7.5 800 45.600 Ben Lomond 8.0 3070 62.267 Goatfell 8.0 2866 73.217 Bens of Jura 16.0 7500 204.617 Cairnpapple 6.0 800 36.367 Scolty 5.0 800 29.750 Traprain 6.0 650 39.750 Lairig Ghru 28.0 2100 192.667 Dollar ('$') 5.0 2000 43.050 Lomonds 9.5 2200 65.000 Cairn Table 6.0 500 44.133 Eildon Two 4.5 1500 26.933 > sqlSave(channel, hills, "hills_test2", verbose=TRUE) Query: CREATE TABLE [hills_test2] ("rownames" VARCHAR(255), "dist" NUMBER, "climb" NUMBER, "time" NUMBER) Query: INSERT INTO [hills_test2] ( "rownames", "dist", "climb", "time" ) VALUES ( ?,?,?,? ) Binding: 'rownames' DataType 12, ColSize 255 Binding: 'dist' DataType 8, ColSize 53 Binding: 'climb' DataType 8, ColSize 53 Binding: 'time' DataType 8, ColSize 53 Parameters: no: 1: rownames Greenmantle/***/no: 2: dist 2.5/***/no: 3: climb 650/***/no: 4: time 16.083/***/ no: 1: rownames Carnethy/***/no: 2: dist 6/***/no: 3: climb 2500/***/no: 4: time 48.35/***/ no: 1: rownames Craig Dunain/***/no: 2: dist 6/***/no: 3: climb 900/***/no: 4: time 33.65/***/ no: 1: rownames Ben Rha/***/no: 2: dist 7.5/***/no: 3: climb 800/***/no: 4: time 45.6/***/ no: 1: rownames Ben Lomond/***/no: 2: dist 8/***/no: 3: climb 3070/***/no: 4: time 62.267/***/ no: 1: rownames Goatfell/***/no: 2: dist 8/***/no: 3: climb 2866/***/no: 4: time 73.217/***/ no: 1: rownames Bens of Jura/***/no: 2: dist 16/***/no: 3: climb 7500/***/no: 4: time 204.617/***/ no: 1: rownames Cairnpapple/***/no: 2: dist 6/***/no: 3: climb 800/***/no: 4: time 36.367/***/ no: 1: rownames Scolty/***/no: 2: dist 5/***/no: 3: climb 800/***/no: 4: time 29.75/***/ no: 1: rownames Traprain/***/no: 2: dist 6/***/no: 3: climb 650/***/no: 4: time 39.75/***/ no: 1: rownames Lairig Ghru/***/no: 2: dist 28/***/no: 3: climb 2100/***/no: 4: time 192.667/***/ no: 1: rownames Dollar ('$')/***/no: 2: dist 5/***/no: 3: climb 2000/***/no: 4: time 43.05/***/ no: 1: rownames Lomonds/***/no: 2: dist 9.5/***/no: 3: climb 2200/***/no: 4: time 65/***/ no: 1: rownames Cairn Table/***/no: 2: dist 6/***/no: 3: climb 500/***/no: 4: time 44.133/***/ no: 1: rownames Eildon Two/***/no: 2: dist 4.5/***/no: 3: climb 1500/***/no: 4: time 26.933/***/ > sqlUpdate(channel, hills[11:15,], "hills_test2", verbose=TRUE) Query: UPDATE [hills_test2] SET "dist"=?, "climb"=?, "time"=? WHERE "rownames"=? Binding: 'dist' DataType 8, ColSize 53 Binding: 'climb' DataType 8, ColSize 53 Binding: 'time' DataType 8, ColSize 53 Binding: 'rownames' DataType 12, ColSize 255 Parameters: no: 1: dist 28/***/no: 2: climb 2100/***/no: 3: time 192.667/***/no: 4: rownames Lairig Ghru/***/ no: 1: dist 5/***/no: 2: climb 2000/***/no: 3: time 43.05/***/no: 4: rownames Dollar ('$')/***/ no: 1: dist 9.5/***/no: 2: climb 2200/***/no: 3: time 65/***/no: 4: rownames Lomonds/***/ no: 1: dist 6/***/no: 2: climb 500/***/no: 3: time 44.133/***/no: 4: rownames Cairn Table/***/ no: 1: dist 4.5/***/no: 2: climb 1500/***/no: 3: time 26.933/***/no: 4: rownames Eildon Two/***/ > sqlFetch(channel, "hills_test2") dist climb time Greenmantle 2.5 650 16.083 Carnethy 6.0 2500 48.350 Craig Dunain 6.0 900 33.650 Ben Rha 7.5 800 45.600 Ben Lomond 8.0 3070 62.267 Goatfell 8.0 2866 73.217 Bens of Jura 16.0 7500 204.617 Cairnpapple 6.0 800 36.367 Scolty 5.0 800 29.750 Traprain 6.0 650 39.750 Lairig Ghru 28.0 2100 192.667 Dollar ('$') 5.0 2000 43.050 Lomonds 9.5 2200 65.000 Cairn Table 6.0 500 44.133 Eildon Two 4.5 1500 26.933 > close(channel) RODBC/tests/SQLServer.RR0000644000176000001440000000612513013621651014372 0ustar ripleyusers##-*- R -*- library(RODBC) library(MASS) USArrests[1,2] <- NA hills <- hills[1:15,] row.names(hills)[12] <- "Dollar ('$')" # SQL Server 2008 Express Edition channel <- odbcConnect("SQLServer") if(!inherits(channel, "RODBC")) q("no") odbcGetInfo(channel) # sqlTables(channel, schema="dbo") sqlTables(channel, tableType="TABLE") sqlDrop(channel, "USArrests", errors = FALSE) sqlSave(channel, USArrests, addPK = TRUE) sqlTables(channel, tableType="TABLE") sqlColumns(channel, "USArrests") sqlPrimaryKeys(channel, "USArrests") sqlFetch(channel, "USArrests") query <- paste("select rownames, murder from USArrests", "where Rape > 30", "order by Murder") sqlQuery(channel, query) sqlCopy(channel, query, "HighRape", rownames = FALSE) sqlFetch(channel, "HighRape", max = 5) # sqlTables(channel) sqlDrop(channel, "HighRape") foo <- USArrests[1:3, 2, drop = FALSE] foo[1,1] <- 236 sqlUpdate(channel, foo, "USArrests") sqlFetch(channel, "USArrests", max = 5) sqlFetchMore(channel, max = 8) sqlDrop(channel, "USArrests") Btest <- Atest <- data.frame(x = c(paste(1:100, collapse="+"), letters[2:4]), rn=1:4) Btest[,1] <- Atest[c(4,1:3),1] sqlDrop(channel, "Atest", errors = FALSE) ## char and varchar max is 8000 colspec <- list(character="varchar(1000)", double="float", integer="int", logical="varchar(5)") sqlSave(channel, Atest, typeInfo = colspec) sqlColumns(channel, "Atest") sqlFetch(channel, "Atest") sqlUpdate(channel, Btest, "Atest", index = "rn") sqlFetch(channel, "Atest") sqlDrop(channel, "Atest") varspec <- "varchar(1000)"; names(varspec) <- "x" sqlSave(channel, Atest, varTypes = varspec) sqlColumns(channel, "Atest") sqlFetch(channel, "Atest") sqlDrop(channel, "Atest") dates <- as.character(seq(as.Date("2004-01-01"), by="week", length=10)) times <- paste(1:10, "05", "00", sep=":") Dtest <- data.frame(dates, times, logi=c(TRUE, NA, FALSE, FALSE, FALSE)) sqlDrop(channel, "Dtest", errors = FALSE) varspec <- c("smalldatetime", "smalldatetime", "varchar(5)") names(varspec) <- names(Dtest) # fast = TRUE fails, claims data is invalid sqlSave(channel, Dtest, varTypes = varspec, verbose=TRUE, fast=FALSE) sqlColumns(channel, "Dtest") sqlFetch(channel, "Dtest") sqlDrop(channel, "Dtest") sqlDrop(channel, "hills test", errors = FALSE) sqlSave(channel, hills, "hills test", verbose=TRUE) sqlUpdate(channel, hills[11:15,], "hills test", verbose=TRUE, fast=TRUE) sqlFetch(channel, "hills test") sqlDrop(channel, "hills test") sqlSave(channel, hills, "hills test", verbose=TRUE, fast=FALSE) sqlUpdate(channel, hills[11:15,], "hills test", verbose=TRUE, fast=FALSE) sqlDrop(channel, "hills test") sqlTables(channel, catalog="", schema="", tableName="", tableType="%") sqlTables(channel, catalog="%", schema="", tableName="") # sqlQuery(channel, "create schema test2") ## only list schemas which contain objects sqlTables(channel, catalog="", schema="%", tableName="") ## list all schema sqlQuery(channel, "select * from sys.schemas") sqlSave(channel, women, "test2.women") sqlTables(channel, catalog="", schema="%", tableName="") sqlTables(channel, tableType="TABLE") sqlDrop(channel, "test2.women") close(channel) RODBC/tests/access.Rout.save0000644000176000001440000003663313013621651015357 0ustar ripleyusers R version 2.9.1 Patched (2009-07-09 r48925) Copyright (C) 2009 The R Foundation for Statistical Computing ISBN 3-900051-07-0 R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > ##-*- R -*- > library(RODBC) > library(MASS) > USArrests[1,2] <- NA > hills <- hills[1:15,] > row.names(hills)[12] <- "Dollar ('$')" > > channel <- odbcConnect("testacc") > if(!inherits(channel, "RODBC")) q("no") > sqlTables(channel) TABLE_CAT TABLE_SCHEM TABLE_NAME TABLE_TYPE REMARKS 1 D:\\bdr\\testacc MSysACEs SYSTEM TABLE 2 D:\\bdr\\testacc MSysObjects SYSTEM TABLE 3 D:\\bdr\\testacc MSysQueries SYSTEM TABLE 4 D:\\bdr\\testacc MSysRelationships SYSTEM TABLE > sqlDrop(channel, "USArrests", errors = FALSE) > sqlSave(channel, USArrests) > sqlTables(channel) TABLE_CAT TABLE_SCHEM TABLE_NAME TABLE_TYPE REMARKS 1 D:\\bdr\\testacc MSysACEs SYSTEM TABLE 2 D:\\bdr\\testacc MSysObjects SYSTEM TABLE 3 D:\\bdr\\testacc MSysQueries SYSTEM TABLE 4 D:\\bdr\\testacc MSysRelationships SYSTEM TABLE 5 D:\\bdr\\testacc USArrests TABLE > sqlColumns(channel, "USArrests") TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME 1 D:\\bdr\\testacc USArrests rownames 12 VARCHAR 2 D:\\bdr\\testacc USArrests Murder 8 DOUBLE 3 D:\\bdr\\testacc USArrests Assault 4 INTEGER 4 D:\\bdr\\testacc USArrests UrbanPop 4 INTEGER 5 D:\\bdr\\testacc USArrests Rape 8 DOUBLE COLUMN_SIZE BUFFER_LENGTH DECIMAL_DIGITS NUM_PREC_RADIX NULLABLE REMARKS 1 255 510 NA NA 1 2 53 8 NA 2 1 3 10 4 0 10 1 4 10 4 0 10 1 5 53 8 NA 2 1 COLUMN_DEF SQL_DATA_TYPE SQL_DATETIME_SUB CHAR_OCTET_LENGTH ORDINAL_POSITION 1 12 NA 510 1 2 8 NA NA 2 3 4 NA NA 3 4 4 NA NA 4 5 8 NA NA 5 IS_NULLABLE ORDINAL 1 YES 1 2 YES 2 3 YES 3 4 YES 4 5 YES 5 > sqlPrimaryKeys(channel, "USArrests") # reports none > sqlFetch(channel, "USArrests") Murder Assault UrbanPop Rape Alabama 13.2 NA 58 21.2 Alaska 10.0 263 48 44.5 Arizona 8.1 294 80 31.0 Arkansas 8.8 190 50 19.5 California 9.0 276 91 40.6 Colorado 7.9 204 78 38.7 Connecticut 3.3 110 77 11.1 Delaware 5.9 238 72 15.8 Florida 15.4 335 80 31.9 Georgia 17.4 211 60 25.8 Hawaii 5.3 46 83 20.2 Idaho 2.6 120 54 14.2 Illinois 10.4 249 83 24.0 Indiana 7.2 113 65 21.0 Iowa 2.2 56 57 11.3 Kansas 6.0 115 66 18.0 Kentucky 9.7 109 52 16.3 Louisiana 15.4 249 66 22.2 Maine 2.1 83 51 7.8 Maryland 11.3 300 67 27.8 Massachusetts 4.4 149 85 16.3 Michigan 12.1 255 74 35.1 Minnesota 2.7 72 66 14.9 Mississippi 16.1 259 44 17.1 Missouri 9.0 178 70 28.2 Montana 6.0 109 53 16.4 Nebraska 4.3 102 62 16.5 Nevada 12.2 252 81 46.0 New Hampshire 2.1 57 56 9.5 New Jersey 7.4 159 89 18.8 New Mexico 11.4 285 70 32.1 New York 11.1 254 86 26.1 North Carolina 13.0 337 45 16.1 North Dakota 0.8 45 44 7.3 Ohio 7.3 120 75 21.4 Oklahoma 6.6 151 68 20.0 Oregon 4.9 159 67 29.3 Pennsylvania 6.3 106 72 14.9 Rhode Island 3.4 174 87 8.3 South Carolina 14.4 279 48 22.5 South Dakota 3.8 86 45 12.8 Tennessee 13.2 188 59 26.9 Texas 12.7 201 80 25.5 Utah 3.2 120 80 22.9 Vermont 2.2 48 32 11.2 Virginia 8.5 156 63 20.7 Washington 4.0 145 73 26.2 West Virginia 5.7 81 39 9.3 Wisconsin 2.6 53 66 10.8 Wyoming 6.8 161 60 15.6 > query <- paste("select rownames, murder from USArrests", + "where Rape > 30", "order by Murder") > sqlQuery(channel, query) rownames murder 1 Colorado 7.9 2 Arizona 8.1 3 California 9.0 4 Alaska 10.0 5 New Mexico 11.4 6 Michigan 12.1 7 Nevada 12.2 8 Florida 15.4 > sqlCopy(channel, query, "HighRape", rownames = FALSE) > sqlFetch(channel, "HighRape", max = 5) murder Colorado 7.9 Arizona 8.1 California 9.0 Alaska 10.0 New Mexico 11.4 > sqlTables(channel) TABLE_CAT TABLE_SCHEM TABLE_NAME TABLE_TYPE REMARKS 1 D:\\bdr\\testacc MSysACEs SYSTEM TABLE 2 D:\\bdr\\testacc MSysObjects SYSTEM TABLE 3 D:\\bdr\\testacc MSysQueries SYSTEM TABLE 4 D:\\bdr\\testacc MSysRelationships SYSTEM TABLE 5 D:\\bdr\\testacc HighRape TABLE 6 D:\\bdr\\testacc USArrests TABLE > sqlDrop(channel, "HighRape") > foo <- USArrests[1:3, 2, drop = FALSE] > foo[1,1] <- 236 > sqlUpdate(channel, foo, "USArrests") > sqlFetch(channel, "USArrests", max = 5) Murder Assault UrbanPop Rape Alabama 13.2 236 58 21.2 Alaska 10.0 263 48 44.5 Arizona 8.1 294 80 31.0 Arkansas 8.8 190 50 19.5 California 9.0 276 91 40.6 > sqlFetchMore(channel, max = 8) Murder Assault UrbanPop Rape Colorado 7.9 204 78 38.7 Connecticut 3.3 110 77 11.1 Delaware 5.9 238 72 15.8 Florida 15.4 335 80 31.9 Georgia 17.4 211 60 25.8 Hawaii 5.3 46 83 20.2 Idaho 2.6 120 54 14.2 Illinois 10.4 249 83 24.0 > sqlDrop(channel, "USArrests") > > dates <- as.character(seq(as.Date("2004-01-01"), by="week", length=10)) > Dtest <- data.frame(dates) > sqlDrop(channel, "Dtest", errors = FALSE) > varspec <- "DATETIME"; names(varspec) <- names(Dtest) > ## fast = TRUE crashes > sqlSave(channel, Dtest, varTypes = varspec, verbose=TRUE, fast=FALSE) Query: CREATE TABLE "Dtest" ("rownames" VARCHAR(255), "dates" DATETIME) Query: INSERT INTO "Dtest" ( "rownames", "dates" ) VALUES ( '1', #2004-01-01# ) Query: INSERT INTO "Dtest" ( "rownames", "dates" ) VALUES ( '2', #2004-01-08# ) Query: INSERT INTO "Dtest" ( "rownames", "dates" ) VALUES ( '3', #2004-01-15# ) Query: INSERT INTO "Dtest" ( "rownames", "dates" ) VALUES ( '4', #2004-01-22# ) Query: INSERT INTO "Dtest" ( "rownames", "dates" ) VALUES ( '5', #2004-01-29# ) Query: INSERT INTO "Dtest" ( "rownames", "dates" ) VALUES ( '6', #2004-02-05# ) Query: INSERT INTO "Dtest" ( "rownames", "dates" ) VALUES ( '7', #2004-02-12# ) Query: INSERT INTO "Dtest" ( "rownames", "dates" ) VALUES ( '8', #2004-02-19# ) Query: INSERT INTO "Dtest" ( "rownames", "dates" ) VALUES ( '9', #2004-02-26# ) Query: INSERT INTO "Dtest" ( "rownames", "dates" ) VALUES ( '10', #2004-03-04# ) > sqlColumns(channel, "Dtest") TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME 1 D:\\bdr\\testacc Dtest rownames 12 VARCHAR 2 D:\\bdr\\testacc Dtest dates 93 DATETIME COLUMN_SIZE BUFFER_LENGTH DECIMAL_DIGITS NUM_PREC_RADIX NULLABLE REMARKS 1 255 510 NA NA 1 2 19 16 0 NA 1 COLUMN_DEF SQL_DATA_TYPE SQL_DATETIME_SUB CHAR_OCTET_LENGTH ORDINAL_POSITION 1 12 NA 510 1 2 9 3 NA 2 IS_NULLABLE ORDINAL 1 YES 1 2 YES 2 > sqlFetch(channel, "Dtest") dates 1 2004-01-01 2 2004-01-08 3 2004-01-15 4 2004-01-22 5 2004-01-29 6 2004-02-05 7 2004-02-12 8 2004-02-19 9 2004-02-26 10 2004-03-04 > sqlDrop(channel, "Dtest") > > sqlDrop(channel, "hills test", errors = FALSE) > sqlSave(channel, hills, "hills test", verbose=TRUE) Query: CREATE TABLE "hills test" ("rownames" VARCHAR(255), "dist" DOUBLE, "climb" INTEGER, "time" DOUBLE) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( ?,?,?,? ) Binding: 'rownames' DataType 12, ColSize 255 Binding: 'dist' DataType 8, ColSize 53 Binding: 'climb' DataType 4, ColSize 10 Binding: 'time' DataType 8, ColSize 53 Parameters: no: 1: rownames Greenmantle/***/no: 2: dist 2.5/***/no: 3: climb 650/***/no: 4: time 16.083/***/ no: 1: rownames Carnethy/***/no: 2: dist 6/***/no: 3: climb 2500/***/no: 4: time 48.35/***/ no: 1: rownames Craig Dunain/***/no: 2: dist 6/***/no: 3: climb 900/***/no: 4: time 33.65/***/ no: 1: rownames Ben Rha/***/no: 2: dist 7.5/***/no: 3: climb 800/***/no: 4: time 45.6/***/ no: 1: rownames Ben Lomond/***/no: 2: dist 8/***/no: 3: climb 3070/***/no: 4: time 62.267/***/ no: 1: rownames Goatfell/***/no: 2: dist 8/***/no: 3: climb 2866/***/no: 4: time 73.217/***/ no: 1: rownames Bens of Jura/***/no: 2: dist 16/***/no: 3: climb 7500/***/no: 4: time 204.617/***/ no: 1: rownames Cairnpapple/***/no: 2: dist 6/***/no: 3: climb 800/***/no: 4: time 36.367/***/ no: 1: rownames Scolty/***/no: 2: dist 5/***/no: 3: climb 800/***/no: 4: time 29.75/***/ no: 1: rownames Traprain/***/no: 2: dist 6/***/no: 3: climb 650/***/no: 4: time 39.75/***/ no: 1: rownames Lairig Ghru/***/no: 2: dist 28/***/no: 3: climb 2100/***/no: 4: time 192.667/***/ no: 1: rownames Dollar ('$')/***/no: 2: dist 5/***/no: 3: climb 2000/***/no: 4: time 43.05/***/ no: 1: rownames Lomonds/***/no: 2: dist 9.5/***/no: 3: climb 2200/***/no: 4: time 65/***/ no: 1: rownames Cairn Table/***/no: 2: dist 6/***/no: 3: climb 500/***/no: 4: time 44.133/***/ no: 1: rownames Eildon Two/***/no: 2: dist 4.5/***/no: 3: climb 1500/***/no: 4: time 26.933/***/ > sqlUpdate(channel, hills[11:15,], "hills test", verbose=TRUE, fast=TRUE) Query: UPDATE "hills test" SET "dist"=?, "climb"=?, "time"=? WHERE "rownames"=? Binding: 'dist' DataType 8, ColSize 53 Binding: 'climb' DataType 4, ColSize 10 Binding: 'time' DataType 8, ColSize 53 Binding: 'rownames' DataType 12, ColSize 255 Parameters: no: 1: dist 28/***/no: 2: climb 2100/***/no: 3: time 192.667/***/no: 4: rownames Lairig Ghru/***/ no: 1: dist 5/***/no: 2: climb 2000/***/no: 3: time 43.05/***/no: 4: rownames Dollar ('$')/***/ no: 1: dist 9.5/***/no: 2: climb 2200/***/no: 3: time 65/***/no: 4: rownames Lomonds/***/ no: 1: dist 6/***/no: 2: climb 500/***/no: 3: time 44.133/***/no: 4: rownames Cairn Table/***/ no: 1: dist 4.5/***/no: 2: climb 1500/***/no: 3: time 26.933/***/no: 4: rownames Eildon Two/***/ > sqlFetch(channel, "hills test") dist climb time Greenmantle 2.5 650 16.083 Carnethy 6.0 2500 48.350 Craig Dunain 6.0 900 33.650 Ben Rha 7.5 800 45.600 Ben Lomond 8.0 3070 62.267 Goatfell 8.0 2866 73.217 Bens of Jura 16.0 7500 204.617 Cairnpapple 6.0 800 36.367 Scolty 5.0 800 29.750 Traprain 6.0 650 39.750 Lairig Ghru 28.0 2100 192.667 Dollar ('$') 5.0 2000 43.050 Lomonds 9.5 2200 65.000 Cairn Table 6.0 500 44.133 Eildon Two 4.5 1500 26.933 > sqlDrop(channel, "hills test") > sqlSave(channel, hills, "hills test", verbose=TRUE, fast=FALSE) Query: CREATE TABLE "hills test" ("rownames" VARCHAR(255), "dist" DOUBLE, "climb" INTEGER, "time" DOUBLE) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Greenmantle', 2.5, 650, 16.083 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Carnethy', 6.0, 2500, 48.350 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Craig Dunain', 6.0, 900, 33.650 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Ben Rha', 7.5, 800, 45.600 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Ben Lomond', 8.0, 3070, 62.267 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Goatfell', 8.0, 2866, 73.217 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Bens of Jura', 16.0, 7500, 204.617 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Cairnpapple', 6.0, 800, 36.367 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Scolty', 5.0, 800, 29.750 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Traprain', 6.0, 650, 39.750 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Lairig Ghru', 28.0, 2100, 192.667 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Dollar (''$'')', 5.0, 2000, 43.050 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Lomonds', 9.5, 2200, 65.000 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Cairn Table', 6.0, 500, 44.133 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Eildon Two', 4.5, 1500, 26.933 ) > sqlUpdate(channel, hills[11:15,], "hills test", verbose=TRUE, fast=FALSE) Query: UPDATE "hills test" SET "dist"=28.0, "climb"=2100, "time"=192.667 WHERE "rownames"='Lairig Ghru' Query: UPDATE "hills test" SET "dist"= 5.0, "climb"=2000, "time"= 43.050 WHERE "rownames"='Dollar (''$'')' Query: UPDATE "hills test" SET "dist"= 9.5, "climb"=2200, "time"= 65.000 WHERE "rownames"='Lomonds' Query: UPDATE "hills test" SET "dist"= 6.0, "climb"= 500, "time"= 44.133 WHERE "rownames"='Cairn Table' Query: UPDATE "hills test" SET "dist"= 4.5, "climb"=1500, "time"= 26.933 WHERE "rownames"='Eildon Two' > sqlDrop(channel, "hills test") > > close(channel) RODBC/tests/Oracle.RR0000644000176000001440000000650013013621651013746 0ustar ripleyusers##-*- R -*- library(RODBC) library(MASS) USArrests[1,2] <- NA hills <- hills[1:15,] row.names(hills)[12] <- "Dollar ('$')" set.seed(1) channel <- odbcConnect("Oracle", pwd = Sys.getenv("DB_PWD")) if(!inherits(channel, "RODBC")) q("no") odbcGetInfo(channel) sqlTables(channel, schema = "RIPLEY") sqlDrop(channel, "USArrests", errors = FALSE) sqlSave(channel, USArrests, rownames = "State", addPK = TRUE) sqlTables(channel, schema = "RIPLEY") sqlColumns(channel, "USArrests") sqlColumns(channel, "USArrests", special = TRUE) sqlPrimaryKeys(channel, "USArrests") sqlFetch(channel, "USArrests", rownames = "State") sqlQuery(channel, 'select "State", "Murder" from "USArrests" where "Rape" > 30 order by "Murder"') foo <- cbind(State=row.names(USArrests), USArrests)[1:3, c(1,3)] foo[1,2] <- 236 sqlUpdate(channel, foo, "USArrests", index = "State") sqlFetch(channel, "USArrests", rownames = "State", max = 5) sqlFetchMore(channel, rownames = "State", max = 8) sqlDrop(channel, "USArrests") Btest <- Atest <- data.frame(x = c(paste(1:100, collapse="+"), letters[2:4]), rn=1:4) Btest[,1] <- Atest[c(4,1:3),1] sqlDrop(channel, "Atest", errors = FALSE) ## max for varchar is 4000, for char 2000, half that for nchar, nvarchar colspec <- list(character="varchar(1000)", double="binary_double", integer="decimal", logical="varchar(5)") sqlSave(channel, Atest, typeInfo = colspec) sqlColumns(channel, "Atest") sqlFetch(channel, "Atest") sqlUpdate(channel, Btest, "Atest", index = "rn") sqlFetch(channel, "Atest") sqlDrop(channel, "Atest") varspec <- "varchar(1000)"; names(varspec) <- "x" sqlSave(channel, Atest, varTypes = varspec) sqlColumns(channel, "Atest") sqlFetch(channel, "Atest") sqlDrop(channel, "Atest") dates <- as.character(seq(as.Date("2004-01-01"), by="week", length=10)) times <- paste(1:10, "05", "00", sep=":") dt <- as.POSIXct(paste(dates, times)) Dtest <- data.frame(dates, dt, logi=c(TRUE, NA, FALSE, FALSE, FALSE)) varspec <- c("date", "timestamp", "varchar(5)") names(varspec) <- names(Dtest) sqlDrop(channel, "Dtest", errors = FALSE) sqlSave(channel, Dtest, varTypes = varspec) sqlColumns(channel, "Dtest") sqlFetch(channel, "Dtest") sqlDrop(channel, "Dtest") sqlQuery(channel, "alter session set NLS_DATE_FORMAT='yyyy-mm-dd hh:mi:ss'") sqlDrop(channel, "Dtest", errors = FALSE) sqlSave(channel, Dtest[-1], "Dtest", fast = FALSE, varTypes = c(dt = "date", logi = "varchar(5)")) sqlColumns(channel, "Dtest") sqlFetch(channel, "Dtest") sqlDrop(channel, "Dtest") sqlDrop(channel, "hills test", errors = FALSE) sqlSave(channel, hills, "hills test", verbose=TRUE) sqlUpdate(channel, hills[11:15,], "hills test", verbose=TRUE, fast=TRUE) sqlFetch(channel, "hills test") sqlDrop(channel, "hills test") sqlSave(channel, hills, "hills test", verbose=TRUE, fast=FALSE) sqlUpdate(channel, hills[11:15,], "hills test", verbose=TRUE, fast=FALSE) sqlDrop(channel, "hills test") ## dropping tables in Oracle does not delete them. sqlQuery(channel, "PURGE recyclebin") sqlTables(channel, catalog="", schema="", tableName="", tableType="%") sqlTables(channel, catalog="", schema="%", tableName="") sqlSave(channel, women) sqlFetch(channel, "SYSTEM.TAB") sqlFetch(channel, "SYSTEM.COL") sqlColumns(channel, schema="SYSTEM", "TAB") sqlDrop(channel, "women") ## dropping tables in Oracle does not delete them. sqlQuery(channel, "PURGE recyclebin") close(channel) RODBC/tests/DB2.RR0000644000176000001440000000641213013621651013112 0ustar ripleyusers##-*- R -*- library(RODBC) library(MASS) USArrests[1,2] <- NA hills <- hills[1:15,] row.names(hills)[12] <- "Dollar ('$')" set.seed(1) options(digits.secs = 3) channel <- odbcConnect("DB2") if(!inherits(channel, "RODBC")) q("no") odbcGetInfo(channel) sqlTables(channel, schema="RIPLEY") sqlDrop(channel, "USArrests", errors = FALSE) sqlSave(channel, USArrests, rownames = "State", addPK = TRUE) sqlTables(channel, schema="RIPLEY") sqlColumns(channel, "USArrests") sqlColumns(channel, "USArrests", special = TRUE) sqlPrimaryKeys(channel, "USArrests") sqlFetch(channel, "USArrests", rownames = "State") sqlQuery(channel, 'select "State", "Murder" from "USArrests" where "Rape" > 30 order by "Murder"') foo <- cbind(State=row.names(USArrests), USArrests)[1:3, c(1,3)] foo[1,2] <- 236 sqlUpdate(channel, foo, "USArrests") sqlFetch(channel, "USArrests", rownames = "State", max = 5) sqlFetchMore(channel, rownames = "State", max = 8) sqlDrop(channel, "USArrests") Btest <- Atest <- data.frame(x = c(paste(1:100, collapse="+"), letters[2:4]), rn=1:4) Btest[,1] <- Atest[c(4,1:3),1] sqlDrop(channel, "Atest", errors = FALSE) ## max for varchar is 32672, 254 for char colspec <- list(character="varchar(1000)", double="double", integer="integer", logical="varchar(5)") sqlSave(channel, Atest, typeInfo = colspec) sqlColumns(channel, "Atest") sqlFetch(channel, "Atest") sqlUpdate(channel, Btest, "Atest", index = "rn") sqlFetch(channel, "Atest") sqlDrop(channel, "Atest") varspec <- "varchar(1000)"; names(varspec) <- "x" sqlSave(channel, Atest, varTypes = varspec) sqlColumns(channel, "Atest") sqlFetch(channel, "Atest") sqlDrop(channel, "Atest") dates <- as.character(seq(as.Date("2004-01-01"), by="week", length=10)) times <- paste(1:10, "05", "00", sep=":") dt <- as.POSIXct(paste(dates, times)) dt <- dt + round(runif(10), 3) Dtest <- data.frame(dates, times, dt, logi=c(TRUE, NA, FALSE, FALSE, FALSE)) varspec <- c("date", "time", "timestamp", "varchar(5)") names(varspec) <- names(Dtest) sqlDrop(channel, "Dtest", errors = FALSE) sqlSave(channel, Dtest, varTypes = varspec) sqlColumns(channel, "Dtest") sqlFetch(channel, "Dtest") sqlDrop(channel, "Dtest") Dtest <- data.frame(dates, times, dt, logi=c(TRUE, NA, FALSE, FALSE, FALSE)) varspec <- c("date", "time", "timestamp", "varchar(5)") names(varspec) <- names(Dtest) sqlDrop(channel, "Dtest", errors = FALSE) sqlSave(channel, Dtest, varTypes = varspec, fast = FALSE) sqlColumns(channel, "Dtest") sqlFetch(channel, "Dtest") sqlDrop(channel, "Dtest") sqlDrop(channel, "hills test", errors = FALSE) sqlSave(channel, hills, "hills test", verbose=TRUE) sqlUpdate(channel, hills[11:15,], "hills test", verbose=TRUE, fast=TRUE) sqlFetch(channel, "hills test") sqlDrop(channel, "hills test") sqlSave(channel, hills, "hills test", verbose=TRUE, fast=FALSE) sqlUpdate(channel, hills[11:15,], "hills test", verbose=TRUE, fast=FALSE) sqlDrop(channel, "hills test") sqlTables(channel, catalog="", schema="", tableName="", tableType="%") ## case matters here # sqlQuery(channel, "create schema TEST2") sqlTables(channel, catalog="", schema="%", tableName="") sqlSave(channel, women, "TEST2.WOMEN") sqlTables(channel, catalog="", schema="%", tableName="") sqlTables(channel, tableType="TABLE") sqlTables(channel, schema="TEST2") sqlDrop(channel, "TEST2.WOMEN") close(channel) RODBC/tests/sqlite3.Rout.save0000644000176000001440000005462313013621651015501 0ustar ripleyusers R version 2.9.1 Patched (2009-07-08 r48919) Copyright (C) 2009 The R Foundation for Statistical Computing ISBN 3-900051-07-0 R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > ##-*- R -*- > library(RODBC) > library(MASS) > USArrests[1,2] <- NA > hills <- hills[1:15,] > row.names(hills)[12] <- "Dollar ('$')" > > channel <- odbcConnect("sqlite3") > if(!inherits(channel, "RODBC")) q("no") > sqlTables(channel) [1] TABLE_CAT TABLE_SCHEM TABLE_NAME TABLE_TYPE REMARKS <0 rows> (or 0-length row.names) > sqlDrop(channel, "USArrests", errors = FALSE) > sqlSave(channel, USArrests, addPK = TRUE) > sqlTables(channel) TABLE_CAT TABLE_SCHEM TABLE_NAME TABLE_TYPE REMARKS 1 USArrests TABLE > sqlColumns(channel, "USArrests") TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME 1 USArrests rownames 12 varchar(255) 2 USArrests Murder 8 double 3 USArrests Assault 4 integer 4 USArrests UrbanPop 4 integer 5 USArrests Rape 8 double COLUMN_SIZE BUFFER_LENGTH DECIMAL_DIGITS NUM_PREC_RADIX NULLABLE REMARKS 1 255 255 10 0 0 2 53 54 10 0 1 3 9 10 10 0 1 4 9 10 10 0 1 5 53 54 10 0 1 COLUMN_DEF SQL_DATA_TYPE SQL_DATETIME_SUB CHAR_OCTET_LENGTH ORDINAL_POSITION 1 NULL 12 NA 16384 1 2 NULL 8 NA 16384 2 3 NULL 4 NA 16384 3 4 NULL 4 NA 16384 4 5 NULL 8 NA 16384 5 IS_NULLABLE 1 NO 2 YES 3 YES 4 YES 5 YES > sqlColumns(channel, "USArrests", special=TRUE) SCOPE COLUMN_NAME DATA_TYPE TYPE_NAME COLUMN_SIZE BUFFER_LENGTH 1 2 rownames 12 varchar(255) 0 255 DECIMAL_DIGITS PSEUDO_COLUMN NULLABLE 1 255 1 1 > sqlPrimaryKeys(channel, "USArrests") TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME KEY_SEQ 1 USArrests rownames 1 PK_NAME 1 sqlite_autoindex_USArrests_1 > sqlFetch(channel, "USArrests") Murder Assault UrbanPop Rape Alabama 13.2 NA 58 21.2 Alaska 10.0 263 48 44.5 Arizona 8.1 294 80 31.0 Arkansas 8.8 190 50 19.5 California 9.0 276 91 40.6 Colorado 7.9 204 78 38.7 Connecticut 3.3 110 77 11.1 Delaware 5.9 238 72 15.8 Florida 15.4 335 80 31.9 Georgia 17.4 211 60 25.8 Hawaii 5.3 46 83 20.2 Idaho 2.6 120 54 14.2 Illinois 10.4 249 83 24.0 Indiana 7.2 113 65 21.0 Iowa 2.2 56 57 11.3 Kansas 6.0 115 66 18.0 Kentucky 9.7 109 52 16.3 Louisiana 15.4 249 66 22.2 Maine 2.1 83 51 7.8 Maryland 11.3 300 67 27.8 Massachusetts 4.4 149 85 16.3 Michigan 12.1 255 74 35.1 Minnesota 2.7 72 66 14.9 Mississippi 16.1 259 44 17.1 Missouri 9.0 178 70 28.2 Montana 6.0 109 53 16.4 Nebraska 4.3 102 62 16.5 Nevada 12.2 252 81 46.0 New Hampshire 2.1 57 56 9.5 New Jersey 7.4 159 89 18.8 New Mexico 11.4 285 70 32.1 New York 11.1 254 86 26.1 North Carolina 13.0 337 45 16.1 North Dakota 0.8 45 44 7.3 Ohio 7.3 120 75 21.4 Oklahoma 6.6 151 68 20.0 Oregon 4.9 159 67 29.3 Pennsylvania 6.3 106 72 14.9 Rhode Island 3.4 174 87 8.3 South Carolina 14.4 279 48 22.5 South Dakota 3.8 86 45 12.8 Tennessee 13.2 188 59 26.9 Texas 12.7 201 80 25.5 Utah 3.2 120 80 22.9 Vermont 2.2 48 32 11.2 Virginia 8.5 156 63 20.7 Washington 4.0 145 73 26.2 West Virginia 5.7 81 39 9.3 Wisconsin 2.6 53 66 10.8 Wyoming 6.8 161 60 15.6 > sqlQuery(channel, "select rownames, Murder from USArrests where Rape > 30 order by Murder") rownames Murder 1 Colorado 7.9 2 Arizona 8.1 3 California 9.0 4 Alaska 10.0 5 New Mexico 11.4 6 Michigan 12.1 7 Nevada 12.2 8 Florida 15.4 > foo <- USArrests[1:3, 2, drop = FALSE] > foo[1,1] <- 236 > sqlUpdate(channel, foo, "USArrests") > sqlFetch(channel, "USArrests", max = 5) Murder Assault UrbanPop Rape Alabama 13.2 236 58 21.2 Alaska 10.0 263 48 44.5 Arizona 8.1 294 80 31.0 Arkansas 8.8 190 50 19.5 California 9.0 276 91 40.6 > sqlFetchMore(channel, max = 8) Murder Assault UrbanPop Rape Colorado 7.9 204 78 38.7 Connecticut 3.3 110 77 11.1 Delaware 5.9 238 72 15.8 Florida 15.4 335 80 31.9 Georgia 17.4 211 60 25.8 Hawaii 5.3 46 83 20.2 Idaho 2.6 120 54 14.2 Illinois 10.4 249 83 24.0 > sqlDrop(channel, "USArrests") > > Btest <- Atest <- + data.frame(x = c(paste(1:100, collapse="+"), letters[2:4]), rn=1:4) > Btest[,1] <- Atest[c(4,1:3),1] > sqlDrop(channel, "Atest", errors = FALSE) > colspec <- list(character="varchar(1000)", double="double", + integer="integer", logical="varchar(5)") > sqlSave(channel, Atest, typeInfo = colspec) > sqlColumns(channel, "Atest")[, 1:6] TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME 1 Atest rownames -1 varchar(1000) 2 Atest x -1 varchar(1000) 3 Atest rn 4 integer > sqlFetch(channel, "Atest") x 1 1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20+21+22+23+24+25+26+27+28+29+30+31+32+33+34+35+36+37+38+39+40+41+42+43+44+45+46+47+48+49+50+51+52+53+54+55+56+57+58+59+60+61+62+63+64+65+66+67+68+69+70+71+72+73+74+75+76+77+78+79+80+81+82+83+84+85+86+87+88+89+90+91+92+93+94+95+96+97+98+99+100 2 b 3 c 4 d rn 1 1 2 2 3 3 4 4 > sqlUpdate(channel, Btest, "Atest", index = "rn") > sqlFetch(channel, "Atest") x 1 d 2 1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20+21+22+23+24+25+26+27+28+29+30+31+32+33+34+35+36+37+38+39+40+41+42+43+44+45+46+47+48+49+50+51+52+53+54+55+56+57+58+59+60+61+62+63+64+65+66+67+68+69+70+71+72+73+74+75+76+77+78+79+80+81+82+83+84+85+86+87+88+89+90+91+92+93+94+95+96+97+98+99+100 3 b 4 c rn 1 1 2 2 3 3 4 4 > sqlDrop(channel, "Atest") > varspec <- "varchar(1000)"; names(varspec) <- "x" > sqlSave(channel, Atest, varTypes = varspec) > sqlColumns(channel, "Atest")[, 1:6] TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME 1 Atest rownames 12 varchar(255) 2 Atest x -1 varchar(1000) 3 Atest rn 4 integer > sqlFetch(channel, "Atest") x 1 1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20+21+22+23+24+25+26+27+28+29+30+31+32+33+34+35+36+37+38+39+40+41+42+43+44+45+46+47+48+49+50+51+52+53+54+55+56+57+58+59+60+61+62+63+64+65+66+67+68+69+70+71+72+73+74+75+76+77+78+79+80+81+82+83+84+85+86+87+88+89+90+91+92+93+94+95+96+97+98+99+100 2 b 3 c 4 d rn 1 1 2 2 3 3 4 4 > sqlDrop(channel, "Atest") > > dates <- as.character(seq(as.Date("2004-01-01"), by="week", length=10)) > times <- paste(1:10, "05", "00", sep=":") > dt <- as.POSIXct(paste(dates, times)) > Dtest <- data.frame(dates, times, dt, logi=c(TRUE, NA, FALSE, FALSE, FALSE)) > varspec <- c("date", "time", "timestamp", "varchar(5)") > names(varspec) <- names(Dtest) > sqlDrop(channel, "Dtest", errors = FALSE) > sqlSave(channel, Dtest, varTypes = varspec) > sqlColumns(channel, "Dtest") TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME 1 Dtest rownames 12 varchar(255) 2 Dtest dates 91 date 3 Dtest times 92 time 4 Dtest dt 93 timestamp 5 Dtest logi 12 varchar(5) COLUMN_SIZE BUFFER_LENGTH DECIMAL_DIGITS NUM_PREC_RADIX NULLABLE REMARKS 1 255 255 10 0 1 2 0 10 10 0 1 3 0 8 10 0 1 4 0 32 10 0 1 5 5 5 10 0 1 COLUMN_DEF SQL_DATA_TYPE SQL_DATETIME_SUB CHAR_OCTET_LENGTH ORDINAL_POSITION 1 NULL 12 NA 16384 1 2 NULL 91 NA 16384 2 3 NULL 92 NA 16384 3 4 NULL 93 NA 16384 4 5 NULL 12 NA 16384 5 IS_NULLABLE 1 YES 2 YES 3 YES 4 YES 5 YES > sqlFetch(channel, "Dtest") dates times dt logi 1 2004-01-01 1:05:00 2004-01-01 01:05:00 TRUE 2 2004-01-08 2:05:00 2004-01-08 02:05:00 NA 3 2004-01-15 3:05:00 2004-01-15 03:05:00 FALSE 4 2004-01-22 4:05:00 2004-01-22 04:05:00 FALSE 5 2004-01-29 5:05:00 2004-01-29 05:05:00 FALSE 6 2004-02-05 6:05:00 2004-02-05 06:05:00 TRUE 7 2004-02-12 7:05:00 2004-02-12 07:05:00 NA 8 2004-02-19 8:05:00 2004-02-19 08:05:00 FALSE 9 2004-02-26 9:05:00 2004-02-26 09:05:00 FALSE 10 2004-03-04 10:05:00 2004-03-04 10:05:00 FALSE > sqlDrop(channel, "Dtest", errors = FALSE) > sqlSave(channel, Dtest, varTypes = varspec, fast = FALSE) > sqlColumns(channel, "Dtest") TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME 1 Dtest rownames 12 varchar(255) 2 Dtest dates 91 date 3 Dtest times 92 time 4 Dtest dt 93 timestamp 5 Dtest logi 12 varchar(5) COLUMN_SIZE BUFFER_LENGTH DECIMAL_DIGITS NUM_PREC_RADIX NULLABLE REMARKS 1 255 255 10 0 1 2 0 10 10 0 1 3 0 8 10 0 1 4 0 32 10 0 1 5 5 5 10 0 1 COLUMN_DEF SQL_DATA_TYPE SQL_DATETIME_SUB CHAR_OCTET_LENGTH ORDINAL_POSITION 1 NULL 12 NA 16384 1 2 NULL 91 NA 16384 2 3 NULL 92 NA 16384 3 4 NULL 93 NA 16384 4 5 NULL 12 NA 16384 5 IS_NULLABLE 1 YES 2 YES 3 YES 4 YES 5 YES > sqlFetch(channel, "Dtest") dates times dt logi 1 2004-01-01 1:05:00 2004-01-01 01:05:00 TRUE 2 2004-01-08 2:05:00 2004-01-08 02:05:00 NA 3 2004-01-15 3:05:00 2004-01-15 03:05:00 FALSE 4 2004-01-22 4:05:00 2004-01-22 04:05:00 FALSE 5 2004-01-29 5:05:00 2004-01-29 05:05:00 FALSE 6 2004-02-05 6:05:00 2004-02-05 06:05:00 TRUE 7 2004-02-12 7:05:00 2004-02-12 07:05:00 NA 8 2004-02-19 8:05:00 2004-02-19 08:05:00 FALSE 9 2004-02-26 9:05:00 2004-02-26 09:05:00 FALSE 10 2004-03-04 10:05:00 2004-03-04 10:05:00 FALSE > sqlDrop(channel, "Dtest") > > sqlDrop(channel, "hills test", errors = FALSE) > sqlSave(channel, hills, "hills test", verbose=TRUE) Query: CREATE TABLE "hills test" ("rownames" varchar(255), "dist" double, "climb" integer, "time" double) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( ?,?,?,? ) Binding: 'rownames' DataType 12, ColSize 255 Binding: 'dist' DataType 8, ColSize 53 Binding: 'climb' DataType 4, ColSize 9 Binding: 'time' DataType 8, ColSize 53 Parameters: no: 1: rownames Greenmantle/***/no: 2: dist 2.5/***/no: 3: climb 650/***/no: 4: time 16.083/***/ no: 1: rownames Carnethy/***/no: 2: dist 6/***/no: 3: climb 2500/***/no: 4: time 48.35/***/ no: 1: rownames Craig Dunain/***/no: 2: dist 6/***/no: 3: climb 900/***/no: 4: time 33.65/***/ no: 1: rownames Ben Rha/***/no: 2: dist 7.5/***/no: 3: climb 800/***/no: 4: time 45.6/***/ no: 1: rownames Ben Lomond/***/no: 2: dist 8/***/no: 3: climb 3070/***/no: 4: time 62.267/***/ no: 1: rownames Goatfell/***/no: 2: dist 8/***/no: 3: climb 2866/***/no: 4: time 73.217/***/ no: 1: rownames Bens of Jura/***/no: 2: dist 16/***/no: 3: climb 7500/***/no: 4: time 204.617/***/ no: 1: rownames Cairnpapple/***/no: 2: dist 6/***/no: 3: climb 800/***/no: 4: time 36.367/***/ no: 1: rownames Scolty/***/no: 2: dist 5/***/no: 3: climb 800/***/no: 4: time 29.75/***/ no: 1: rownames Traprain/***/no: 2: dist 6/***/no: 3: climb 650/***/no: 4: time 39.75/***/ no: 1: rownames Lairig Ghru/***/no: 2: dist 28/***/no: 3: climb 2100/***/no: 4: time 192.667/***/ no: 1: rownames Dollar ('$')/***/no: 2: dist 5/***/no: 3: climb 2000/***/no: 4: time 43.05/***/ no: 1: rownames Lomonds/***/no: 2: dist 9.5/***/no: 3: climb 2200/***/no: 4: time 65/***/ no: 1: rownames Cairn Table/***/no: 2: dist 6/***/no: 3: climb 500/***/no: 4: time 44.133/***/ no: 1: rownames Eildon Two/***/no: 2: dist 4.5/***/no: 3: climb 1500/***/no: 4: time 26.933/***/ > sqlUpdate(channel, hills[11:15,], "hills test", verbose=TRUE, fast=TRUE) Query: UPDATE "hills test" SET "dist"=?, "climb"=?, "time"=? WHERE "rownames"=? Binding: 'dist' DataType 8, ColSize 53 Binding: 'climb' DataType 4, ColSize 9 Binding: 'time' DataType 8, ColSize 53 Binding: 'rownames' DataType 12, ColSize 255 Parameters: no: 1: dist 28/***/no: 2: climb 2100/***/no: 3: time 192.667/***/no: 4: rownames Lairig Ghru/***/ no: 1: dist 5/***/no: 2: climb 2000/***/no: 3: time 43.05/***/no: 4: rownames Dollar ('$')/***/ no: 1: dist 9.5/***/no: 2: climb 2200/***/no: 3: time 65/***/no: 4: rownames Lomonds/***/ no: 1: dist 6/***/no: 2: climb 500/***/no: 3: time 44.133/***/no: 4: rownames Cairn Table/***/ no: 1: dist 4.5/***/no: 2: climb 1500/***/no: 3: time 26.933/***/no: 4: rownames Eildon Two/***/ > sqlFetch(channel, "hills test") dist climb time Greenmantle 2.5 650 16.083 Carnethy 6.0 2500 48.350 Craig Dunain 6.0 900 33.650 Ben Rha 7.5 800 45.600 Ben Lomond 8.0 3070 62.267 Goatfell 8.0 2866 73.217 Bens of Jura 16.0 7500 204.617 Cairnpapple 6.0 800 36.367 Scolty 5.0 800 29.750 Traprain 6.0 650 39.750 Lairig Ghru 28.0 2100 192.667 Dollar ('$') 5.0 2000 43.050 Lomonds 9.5 2200 65.000 Cairn Table 6.0 500 44.133 Eildon Two 4.5 1500 26.933 > sqlDrop(channel, "hills test") > sqlSave(channel, hills, "hills test", verbose=TRUE, fast=FALSE) Query: CREATE TABLE "hills test" ("rownames" varchar(255), "dist" double, "climb" integer, "time" double) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Greenmantle', 2.5, 650, 16.083 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Carnethy', 6.0, 2500, 48.350 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Craig Dunain', 6.0, 900, 33.650 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Ben Rha', 7.5, 800, 45.600 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Ben Lomond', 8.0, 3070, 62.267 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Goatfell', 8.0, 2866, 73.217 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Bens of Jura', 16.0, 7500, 204.617 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Cairnpapple', 6.0, 800, 36.367 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Scolty', 5.0, 800, 29.750 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Traprain', 6.0, 650, 39.750 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Lairig Ghru', 28.0, 2100, 192.667 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Dollar (''$'')', 5.0, 2000, 43.050 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Lomonds', 9.5, 2200, 65.000 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Cairn Table', 6.0, 500, 44.133 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Eildon Two', 4.5, 1500, 26.933 ) > sqlUpdate(channel, hills[11:15,], "hills test", verbose=TRUE, fast=FALSE) Query: UPDATE "hills test" SET "dist"=28.0, "climb"=2100, "time"=192.667 WHERE "rownames"='Lairig Ghru' Query: UPDATE "hills test" SET "dist"= 5.0, "climb"=2000, "time"= 43.050 WHERE "rownames"='Dollar (''$'')' Query: UPDATE "hills test" SET "dist"= 9.5, "climb"=2200, "time"= 65.000 WHERE "rownames"='Lomonds' Query: UPDATE "hills test" SET "dist"= 6.0, "climb"= 500, "time"= 44.133 WHERE "rownames"='Cairn Table' Query: UPDATE "hills test" SET "dist"= 4.5, "climb"=1500, "time"= 26.933 WHERE "rownames"='Eildon Two' > sqlDrop(channel, "hills test") > > sqlTables(channel, catalog = "", schema = "", tableName = "", tableType = "%") TABLE_CAT TABLE_SCHEM TABLE_NAME TABLE_TYPE REMARKS 1 TABLE 2 VIEW > > close(channel) > RODBC/tests/postgresql.Rout.save0000644000176000001440000005066713013621651016324 0ustar ripleyusers R version 2.13.1 (2011-07-08) Copyright (C) 2011 The R Foundation for Statistical Computing ISBN 3-900051-07-0 Platform: i386-pc-mingw32/i386 (32-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > ##-*- R -*- > library(RODBC) > library(MASS) > USArrests[1,2] <- NA > hills <- hills[1:15,] > row.names(hills)[12] <- "Dollar ('$')" > set.seed(1) > options(digits.secs = 3) > > channel <- odbcConnect("testpg") > if(!inherits(channel, "RODBC")) q("no") > odbcGetInfo(channel) > sqlTables(channel) [1] TABLE_QUALIFIER TABLE_OWNER TABLE_NAME TABLE_TYPE [5] REMARKS <0 rows> (or 0-length row.names) > sqlDrop(channel, "USArrests", errors = FALSE) > sqlSave(channel, USArrests, rownames = "state", addPK = TRUE) > sqlTables(channel) TABLE_QUALIFIER TABLE_OWNER TABLE_NAME TABLE_TYPE REMARKS 1 ripley public usarrests TABLE > sqlColumns(channel, "USArrests")[, 1:6] TABLE_QUALIFIER TABLE_OWNER TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME 1 ripley public usarrests state 12 varchar 2 ripley public usarrests murder 6 float8 3 ripley public usarrests assault 4 int4 4 ripley public usarrests urbanpop 4 int4 5 ripley public usarrests rape 6 float8 > sqlColumns(channel, "USArrests", special = TRUE) [1] SCOPE COLUMN_NAME DATA_TYPE TYPE_NAME PRECISION [6] LENGTH SCALE PSEUDO_COLUMN <0 rows> (or 0-length row.names) > sqlPrimaryKeys(channel, "USArrests") TABLE_QUALIFIER TABLE_OWNER TABLE_NAME COLUMN_NAME KEY_SEQ PK_NAME 1 ripley public usarrests state 1 usarrests_pkey > sqlFetch(channel, "USArrests", rownames = "state") murder assault urbanpop rape Alabama 13.2 NA 58 21.2 Alaska 10.0 263 48 44.5 Arizona 8.1 294 80 31.0 Arkansas 8.8 190 50 19.5 California 9.0 276 91 40.6 Colorado 7.9 204 78 38.7 Connecticut 3.3 110 77 11.1 Delaware 5.9 238 72 15.8 Florida 15.4 335 80 31.9 Georgia 17.4 211 60 25.8 Hawaii 5.3 46 83 20.2 Idaho 2.6 120 54 14.2 Illinois 10.4 249 83 24.0 Indiana 7.2 113 65 21.0 Iowa 2.2 56 57 11.3 Kansas 6.0 115 66 18.0 Kentucky 9.7 109 52 16.3 Louisiana 15.4 249 66 22.2 Maine 2.1 83 51 7.8 Maryland 11.3 300 67 27.8 Massachusetts 4.4 149 85 16.3 Michigan 12.1 255 74 35.1 Minnesota 2.7 72 66 14.9 Mississippi 16.1 259 44 17.1 Missouri 9.0 178 70 28.2 Montana 6.0 109 53 16.4 Nebraska 4.3 102 62 16.5 Nevada 12.2 252 81 46.0 New Hampshire 2.1 57 56 9.5 New Jersey 7.4 159 89 18.8 New Mexico 11.4 285 70 32.1 New York 11.1 254 86 26.1 North Carolina 13.0 337 45 16.1 North Dakota 0.8 45 44 7.3 Ohio 7.3 120 75 21.4 Oklahoma 6.6 151 68 20.0 Oregon 4.9 159 67 29.3 Pennsylvania 6.3 106 72 14.9 Rhode Island 3.4 174 87 8.3 South Carolina 14.4 279 48 22.5 South Dakota 3.8 86 45 12.8 Tennessee 13.2 188 59 26.9 Texas 12.7 201 80 25.5 Utah 3.2 120 80 22.9 Vermont 2.2 48 32 11.2 Virginia 8.5 156 63 20.7 Washington 4.0 145 73 26.2 West Virginia 5.7 81 39 9.3 Wisconsin 2.6 53 66 10.8 Wyoming 6.8 161 60 15.6 > sqlQuery(channel, "select state, murder from USArrests where rape > 30 order by murder") state murder 1 Colorado 7.9 2 Arizona 8.1 3 California 9.0 4 Alaska 10.0 5 New Mexico 11.4 6 Michigan 12.1 7 Nevada 12.2 8 Florida 15.4 > foo <- cbind(state=row.names(USArrests), USArrests)[1:3, c(1,3)] > foo[1,2] <- 236 > sqlUpdate(channel, foo, "USArrests") > sqlFetch(channel, "USArrests", rownames = "state", max = 5) murder assault urbanpop rape Arkansas 8.8 190 50 19.5 California 9.0 276 91 40.6 Colorado 7.9 204 78 38.7 Connecticut 3.3 110 77 11.1 Delaware 5.9 238 72 15.8 > sqlFetchMore(channel, rownames = "state", max = 8) murder assault urbanpop rape Florida 15.4 335 80 31.9 Georgia 17.4 211 60 25.8 Hawaii 5.3 46 83 20.2 Idaho 2.6 120 54 14.2 Illinois 10.4 249 83 24.0 Indiana 7.2 113 65 21.0 Iowa 2.2 56 57 11.3 Kansas 6.0 115 66 18.0 > sqlDrop(channel, "USArrests") > > Btest <- Atest <- + data.frame(x = c(paste(1:100, collapse="+"), letters[2:4]), rn=1:4) > Btest[,1] <- Atest[c(4,1:3),1] > sqlDrop(channel, "Atest", errors = FALSE) > colspec <- list(character="text", double="double", + integer="integer", logical="varchar(5)") > sqlSave(channel, Atest, typeInfo = colspec) > sqlColumns(channel, "Atest")[, 1:6] TABLE_QUALIFIER TABLE_OWNER TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME 1 ripley public atest rownames -1 text 2 ripley public atest x -1 text 3 ripley public atest rn 4 int4 > sqlFetch(channel, "Atest") x 1 1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20+21+22+23+24+25+26+27+28+29+30+31+32+33+34+35+36+37+38+39+40+41+42+43+44+45+46+47+48+49+50+51+52+53+54+55+56+57+58+59+60+61+62+63+64+65+66+67+68+69+70+71+72+73+74+75+76+77+78+79+80+81+82+83+84+85+86+87+88+89+90+91+92+93+94+95+96+97+98+99+100 2 b 3 c 4 d rn 1 1 2 2 3 3 4 4 > sqlUpdate(channel, Btest, "Atest", index = "rn") > sqlFetch(channel, "Atest") x 1 d 2 1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20+21+22+23+24+25+26+27+28+29+30+31+32+33+34+35+36+37+38+39+40+41+42+43+44+45+46+47+48+49+50+51+52+53+54+55+56+57+58+59+60+61+62+63+64+65+66+67+68+69+70+71+72+73+74+75+76+77+78+79+80+81+82+83+84+85+86+87+88+89+90+91+92+93+94+95+96+97+98+99+100 3 b 4 c rn 1 1 2 2 3 3 4 4 > sqlDrop(channel, "Atest") > varspec <- "text"; names(varspec) <- "x" > sqlSave(channel, Atest, varTypes = varspec) > sqlColumns(channel, "Atest")[, 1:6] TABLE_QUALIFIER TABLE_OWNER TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME 1 ripley public atest rownames 12 varchar 2 ripley public atest x -1 text 3 ripley public atest rn 4 int4 > sqlFetch(channel, "Atest") x 1 1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20+21+22+23+24+25+26+27+28+29+30+31+32+33+34+35+36+37+38+39+40+41+42+43+44+45+46+47+48+49+50+51+52+53+54+55+56+57+58+59+60+61+62+63+64+65+66+67+68+69+70+71+72+73+74+75+76+77+78+79+80+81+82+83+84+85+86+87+88+89+90+91+92+93+94+95+96+97+98+99+100 2 b 3 c 4 d rn 1 1 2 2 3 3 4 4 > sqlDrop(channel, "Atest") > > dates <- as.character(seq(as.Date("2004-01-01"), by="week", length=10)) > times <- paste(1:10, "05", "00", sep=":") > dt <- as.POSIXct(paste(dates, times)) > Dtest <- data.frame(dates, times, dt, logi=c(TRUE, NA, FALSE, FALSE, FALSE)) > varspec <- c("date", "time", "timestamp", "varchar(5)") > names(varspec) <- names(Dtest) > sqlDrop(channel, "Dtest", errors = FALSE) > sqlSave(channel, Dtest, varTypes = varspec) > sqlColumns(channel, "Dtest")[, 1:6] TABLE_QUALIFIER TABLE_OWNER TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME 1 ripley public dtest rownames 12 varchar 2 ripley public dtest dates 91 date 3 ripley public dtest times 92 time 4 ripley public dtest dt 93 timestamp 5 ripley public dtest logi 12 varchar > sqlFetch(channel, "Dtest") dates times dt logi 1 2004-01-01 01:05:00 2004-01-01 01:05:00 TRUE 2 2004-01-08 02:05:00 2004-01-08 02:05:00 NA 3 2004-01-15 03:05:00 2004-01-15 03:05:00 FALSE 4 2004-01-22 04:05:00 2004-01-22 04:05:00 FALSE 5 2004-01-29 05:05:00 2004-01-29 05:05:00 FALSE 6 2004-02-05 06:05:00 2004-02-05 06:05:00 TRUE 7 2004-02-12 07:05:00 2004-02-12 07:05:00 NA 8 2004-02-19 08:05:00 2004-02-19 08:05:00 FALSE 9 2004-02-26 09:05:00 2004-02-26 09:05:00 FALSE 10 2004-03-04 10:05:00 2004-03-04 10:05:00 FALSE > sqlDrop(channel, "Dtest") > ## needs fast = FALSE for fractional seconds. > dt <- dt + round(runif(10), 3) > Dtest <- data.frame(dates, times, dt, logi=c(TRUE, NA, FALSE, FALSE, FALSE)) > varspec <- c("date", "time", "timestamp", "varchar(5)") > names(varspec) <- names(Dtest) > sqlDrop(channel, "Dtest", errors = FALSE) > sqlSave(channel, Dtest, varTypes = varspec, fast = FALSE) > sqlColumns(channel, "Dtest")[, 1:6] TABLE_QUALIFIER TABLE_OWNER TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME 1 ripley public dtest rownames 12 varchar 2 ripley public dtest dates 91 date 3 ripley public dtest times 92 time 4 ripley public dtest dt 93 timestamp 5 ripley public dtest logi 12 varchar > sqlFetch(channel, "Dtest") dates times dt logi 1 2004-01-01 01:05:00 2004-01-01 01:05:00.371 TRUE 2 2004-01-08 02:05:00 2004-01-08 02:05:00.572 NA 3 2004-01-15 03:05:00 2004-01-15 03:05:00.907 FALSE 4 2004-01-22 04:05:00 2004-01-22 04:05:00.200 FALSE 5 2004-01-29 05:05:00 2004-01-29 05:05:00.898 FALSE 6 2004-02-05 06:05:00 2004-02-05 06:05:00.944 TRUE 7 2004-02-12 07:05:00 2004-02-12 07:05:00.661 NA 8 2004-02-19 08:05:00 2004-02-19 08:05:00.628 FALSE 9 2004-02-26 09:05:00 2004-02-26 09:05:00.062 FALSE 10 2004-03-04 10:05:00 2004-03-04 10:05:00.206 FALSE > sqlDrop(channel, "Dtest") > > sqlDrop(channel, "hills test", errors = FALSE) > sqlSave(channel, hills, "hills test", verbose=TRUE) Query: CREATE TABLE "hills test" ("rownames" varchar(255), "dist" float8, "climb" int4, "time" float8) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( ?,?,?,? ) Binding: 'rownames' DataType 12, ColSize 255 Binding: 'dist' DataType 6, ColSize 15 Binding: 'climb' DataType 4, ColSize 10 Binding: 'time' DataType 6, ColSize 15 Parameters: no: 1: rownames Greenmantle/***/no: 2: dist 2.5/***/no: 3: climb 650/***/no: 4: time 16.083/***/ no: 1: rownames Carnethy/***/no: 2: dist 6/***/no: 3: climb 2500/***/no: 4: time 48.35/***/ no: 1: rownames Craig Dunain/***/no: 2: dist 6/***/no: 3: climb 900/***/no: 4: time 33.65/***/ no: 1: rownames Ben Rha/***/no: 2: dist 7.5/***/no: 3: climb 800/***/no: 4: time 45.6/***/ no: 1: rownames Ben Lomond/***/no: 2: dist 8/***/no: 3: climb 3070/***/no: 4: time 62.267/***/ no: 1: rownames Goatfell/***/no: 2: dist 8/***/no: 3: climb 2866/***/no: 4: time 73.217/***/ no: 1: rownames Bens of Jura/***/no: 2: dist 16/***/no: 3: climb 7500/***/no: 4: time 204.617/***/ no: 1: rownames Cairnpapple/***/no: 2: dist 6/***/no: 3: climb 800/***/no: 4: time 36.367/***/ no: 1: rownames Scolty/***/no: 2: dist 5/***/no: 3: climb 800/***/no: 4: time 29.75/***/ no: 1: rownames Traprain/***/no: 2: dist 6/***/no: 3: climb 650/***/no: 4: time 39.75/***/ no: 1: rownames Lairig Ghru/***/no: 2: dist 28/***/no: 3: climb 2100/***/no: 4: time 192.667/***/ no: 1: rownames Dollar ('$')/***/no: 2: dist 5/***/no: 3: climb 2000/***/no: 4: time 43.05/***/ no: 1: rownames Lomonds/***/no: 2: dist 9.5/***/no: 3: climb 2200/***/no: 4: time 65/***/ no: 1: rownames Cairn Table/***/no: 2: dist 6/***/no: 3: climb 500/***/no: 4: time 44.133/***/ no: 1: rownames Eildon Two/***/no: 2: dist 4.5/***/no: 3: climb 1500/***/no: 4: time 26.933/***/ > sqlUpdate(channel, hills[11:15,], "hills test", verbose=TRUE, fast=TRUE) Query: UPDATE "hills test" SET "dist"=?, "climb"=?, "time"=? WHERE "rownames"=? Binding: 'dist' DataType 6, ColSize 15 Binding: 'climb' DataType 4, ColSize 10 Binding: 'time' DataType 6, ColSize 15 Binding: 'rownames' DataType 12, ColSize 255 Parameters: no: 1: dist 28/***/no: 2: climb 2100/***/no: 3: time 192.667/***/no: 4: rownames Lairig Ghru/***/ no: 1: dist 5/***/no: 2: climb 2000/***/no: 3: time 43.05/***/no: 4: rownames Dollar ('$')/***/ no: 1: dist 9.5/***/no: 2: climb 2200/***/no: 3: time 65/***/no: 4: rownames Lomonds/***/ no: 1: dist 6/***/no: 2: climb 500/***/no: 3: time 44.133/***/no: 4: rownames Cairn Table/***/ no: 1: dist 4.5/***/no: 2: climb 1500/***/no: 3: time 26.933/***/no: 4: rownames Eildon Two/***/ > sqlFetch(channel, "hills test") dist climb time Greenmantle 2.5 650 16.083 Carnethy 6.0 2500 48.350 Craig Dunain 6.0 900 33.650 Ben Rha 7.5 800 45.600 Ben Lomond 8.0 3070 62.267 Goatfell 8.0 2866 73.217 Bens of Jura 16.0 7500 204.617 Cairnpapple 6.0 800 36.367 Scolty 5.0 800 29.750 Traprain 6.0 650 39.750 Lairig Ghru 28.0 2100 192.667 Dollar ('$') 5.0 2000 43.050 Lomonds 9.5 2200 65.000 Cairn Table 6.0 500 44.133 Eildon Two 4.5 1500 26.933 > sqlDrop(channel, "hills test") > sqlSave(channel, hills, "hills test", verbose=TRUE, fast=FALSE) Query: CREATE TABLE "hills test" ("rownames" varchar(255), "dist" float8, "climb" int4, "time" float8) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Greenmantle', 2.5, 650, 16.083 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Carnethy', 6.0, 2500, 48.350 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Craig Dunain', 6.0, 900, 33.650 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Ben Rha', 7.5, 800, 45.600 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Ben Lomond', 8.0, 3070, 62.267 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Goatfell', 8.0, 2866, 73.217 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Bens of Jura', 16.0, 7500, 204.617 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Cairnpapple', 6.0, 800, 36.367 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Scolty', 5.0, 800, 29.750 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Traprain', 6.0, 650, 39.750 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Lairig Ghru', 28.0, 2100, 192.667 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Dollar (''$'')', 5.0, 2000, 43.050 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Lomonds', 9.5, 2200, 65.000 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Cairn Table', 6.0, 500, 44.133 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Eildon Two', 4.5, 1500, 26.933 ) > sqlUpdate(channel, hills[11:15,], "hills test", verbose=TRUE, fast=FALSE) Query: UPDATE "hills test" SET "dist"=28.0, "climb"=2100, "time"=192.667 WHERE "rownames"='Lairig Ghru' Query: UPDATE "hills test" SET "dist"= 5.0, "climb"=2000, "time"= 43.050 WHERE "rownames"='Dollar (''$'')' Query: UPDATE "hills test" SET "dist"= 9.5, "climb"=2200, "time"= 65.000 WHERE "rownames"='Lomonds' Query: UPDATE "hills test" SET "dist"= 6.0, "climb"= 500, "time"= 44.133 WHERE "rownames"='Cairn Table' Query: UPDATE "hills test" SET "dist"= 4.5, "climb"=1500, "time"= 26.933 WHERE "rownames"='Eildon Two' > sqlDrop(channel, "hills test") > > # sqlQuery(channel, "create schema test2") > sqlTables(channel, catalog="", schema="", tableName="", tableType="%") TABLE_QUALIFIER TABLE_OWNER TABLE_NAME TABLE_TYPE REMARKS 1 TABLE 2 VIEW > sqlTables(channel, catalog="%", schema="", tableName="") TABLE_QUALIFIER TABLE_OWNER TABLE_NAME TABLE_TYPE REMARKS 1 ripley > sqlTables(channel, catalog="", schema="%", tableName="") TABLE_QUALIFIER TABLE_OWNER TABLE_NAME TABLE_TYPE REMARKS 1 pg_toast_temp_1 2 public 3 test2 > > close(channel) RODBC/tests/access.RR0000644000176000001440000000325613013621651014007 0ustar ripleyusers##-*- R -*- library(RODBC) library(MASS) USArrests[1,2] <- NA hills <- hills[1:15,] row.names(hills)[12] <- "Dollar ('$')" channel <- odbcConnect("testacc") if(!inherits(channel, "RODBC")) q("no") odbcGetInfo(channel) sqlTables(channel) sqlDrop(channel, "USArrests", errors = FALSE) sqlSave(channel, USArrests) sqlTables(channel) sqlColumns(channel, "USArrests") sqlPrimaryKeys(channel, "USArrests") # reports none sqlFetch(channel, "USArrests") query <- paste("select rownames, murder from USArrests", "where Rape > 30", "order by Murder") sqlQuery(channel, query) sqlCopy(channel, query, "HighRape", rownames = FALSE) sqlFetch(channel, "HighRape", max = 5) sqlTables(channel) sqlDrop(channel, "HighRape") foo <- USArrests[1:3, 2, drop = FALSE] foo[1,1] <- 236 sqlUpdate(channel, foo, "USArrests") sqlFetch(channel, "USArrests", max = 5) sqlFetchMore(channel, max = 8) sqlDrop(channel, "USArrests") dates <- as.character(seq(as.Date("2004-01-01"), by="week", length=10)) Dtest <- data.frame(dates) sqlDrop(channel, "Dtest", errors = FALSE) varspec <- "DATETIME"; names(varspec) <- names(Dtest) ## fast = TRUE crashes sqlSave(channel, Dtest, varTypes = varspec, verbose=TRUE, fast=FALSE) sqlColumns(channel, "Dtest") sqlFetch(channel, "Dtest") sqlDrop(channel, "Dtest") sqlDrop(channel, "hills test", errors = FALSE) sqlSave(channel, hills, "hills test", verbose=TRUE) sqlUpdate(channel, hills[11:15,], "hills test", verbose=TRUE, fast=TRUE) sqlFetch(channel, "hills test") sqlDrop(channel, "hills test") sqlSave(channel, hills, "hills test", verbose=TRUE, fast=FALSE) sqlUpdate(channel, hills[11:15,], "hills test", verbose=TRUE, fast=FALSE) sqlDrop(channel, "hills test") close(channel) RODBC/tests/Master.R0000644000176000001440000000236513013621651013657 0ustar ripleyusersif(!nzchar(Sys.getenv("RODBC_TESTING"))) q("no") runone <- function(f) { message(" Running ", sQuote(f)) infile <- paste(f, "RR", sep = ".") outfile <- paste(f, "Rout", sep = ".") cmd <- paste(shQuote(file.path(R.home("bin"), "R")), "CMD BATCH --vanilla", shQuote(infile), shQuote(outfile)) res <- system(cmd) if (res) { cat(readLines(outfile), sep="\n") file.rename(outfile, paste(outfile, "fail", sep=".")) return(1L) } savefile <- paste(outfile, "save", sep = "." ) if (file.exists(savefile)) { message(" Comparing ", sQuote(outfile), " to ", sQuote(savefile), " ...", appendLF = FALSE) res <- tools:::Rdiff(outfile, savefile, TRUE) if (!res) message(" OK") } 0L } res <- if(.Platform$OS.type == "windows") runone("mysql-win") else runone("mysql") res <- res + runone("sqlite3") res <- res + runone("postgresql") if(.Platform$OS.type == "windows") { res <- res + runone("access") res <- res + runone("excel") res <- res + runone("SQLServer") res <- res + runone("mimer") res <- res + runone("DB2") res <- res + runone("Oracle") } proc.time() if(res) stop(gettextf("%d tests failed", res)) RODBC/tests/SQLServer.Rout.save0000644000176000001440000007071013013621651015736 0ustar ripleyusers R version 2.9.1 Patched (2009-07-27 r49006) Copyright (C) 2009 The R Foundation for Statistical Computing ISBN 3-900051-07-0 R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > ##-*- R -*- > library(RODBC) > library(MASS) > USArrests[1,2] <- NA > hills <- hills[1:15,] > row.names(hills)[12] <- "Dollar ('$')" > > # SQL Server 2008 Express Edition > channel <- odbcConnect("SQLServer") > if(!inherits(channel, "RODBC")) q("no") > # sqlTables(channel, schema="dbo") > sqlTables(channel, tableType="TABLE") [1] TABLE_CAT TABLE_SCHEM TABLE_NAME TABLE_TYPE REMARKS <0 rows> (or 0-length row.names) > sqlDrop(channel, "USArrests", errors = FALSE) > sqlSave(channel, USArrests, addPK = TRUE) > sqlTables(channel, tableType="TABLE") TABLE_CAT TABLE_SCHEM TABLE_NAME TABLE_TYPE REMARKS 1 tempdb dbo USArrests TABLE > sqlColumns(channel, "USArrests") TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME COLUMN_SIZE 1 tempdb dbo USArrests rownames 12 varchar 255 2 tempdb dbo USArrests Murder 6 float 53 3 tempdb dbo USArrests Assault 4 int 10 4 tempdb dbo USArrests UrbanPop 4 int 10 5 tempdb dbo USArrests Rape 6 float 53 BUFFER_LENGTH DECIMAL_DIGITS NUM_PREC_RADIX NULLABLE REMARKS COLUMN_DEF 1 255 NA NA 0 2 8 NA 2 1 3 4 0 10 1 4 4 0 10 1 5 8 NA 2 1 SQL_DATA_TYPE SQL_DATETIME_SUB CHAR_OCTET_LENGTH ORDINAL_POSITION IS_NULLABLE 1 12 NA 255 1 NO 2 6 NA NA 2 YES 3 4 NA NA 3 YES 4 4 NA NA 4 YES 5 6 NA NA 5 YES SS_UDT_CATALOG_NAME SS_UDT_SCHEMA_NAME SS_UDT_ASSEMBLY_TYPE_NAME 1 2 3 4 5 SS_XML_SCHEMACOLLECTION_CATALOG_NAME SS_XML_SCHEMACOLLECTION_SCHEMA_NAME 1 2 3 4 5 SS_XML_SCHEMACOLLECTION_NAME SS_DATA_TYPE 1 39 2 109 3 38 4 38 5 109 > sqlPrimaryKeys(channel, "USArrests") TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME KEY_SEQ 1 tempdb dbo USArrests rownames 1 PK_NAME 1 PK__USArrest__BAA0EDC303317E3D > sqlFetch(channel, "USArrests") Murder Assault UrbanPop Rape Alabama 13.2 NA 58 21.2 Alaska 10.0 263 48 44.5 Arizona 8.1 294 80 31.0 Arkansas 8.8 190 50 19.5 California 9.0 276 91 40.6 Colorado 7.9 204 78 38.7 Connecticut 3.3 110 77 11.1 Delaware 5.9 238 72 15.8 Florida 15.4 335 80 31.9 Georgia 17.4 211 60 25.8 Hawaii 5.3 46 83 20.2 Idaho 2.6 120 54 14.2 Illinois 10.4 249 83 24.0 Indiana 7.2 113 65 21.0 Iowa 2.2 56 57 11.3 Kansas 6.0 115 66 18.0 Kentucky 9.7 109 52 16.3 Louisiana 15.4 249 66 22.2 Maine 2.1 83 51 7.8 Maryland 11.3 300 67 27.8 Massachusetts 4.4 149 85 16.3 Michigan 12.1 255 74 35.1 Minnesota 2.7 72 66 14.9 Mississippi 16.1 259 44 17.1 Missouri 9.0 178 70 28.2 Montana 6.0 109 53 16.4 Nebraska 4.3 102 62 16.5 Nevada 12.2 252 81 46.0 New Hampshire 2.1 57 56 9.5 New Jersey 7.4 159 89 18.8 New Mexico 11.4 285 70 32.1 New York 11.1 254 86 26.1 North Carolina 13.0 337 45 16.1 North Dakota 0.8 45 44 7.3 Ohio 7.3 120 75 21.4 Oklahoma 6.6 151 68 20.0 Oregon 4.9 159 67 29.3 Pennsylvania 6.3 106 72 14.9 Rhode Island 3.4 174 87 8.3 South Carolina 14.4 279 48 22.5 South Dakota 3.8 86 45 12.8 Tennessee 13.2 188 59 26.9 Texas 12.7 201 80 25.5 Utah 3.2 120 80 22.9 Vermont 2.2 48 32 11.2 Virginia 8.5 156 63 20.7 Washington 4.0 145 73 26.2 West Virginia 5.7 81 39 9.3 Wisconsin 2.6 53 66 10.8 Wyoming 6.8 161 60 15.6 > query <- paste("select rownames, murder from USArrests", + "where Rape > 30", "order by Murder") > sqlQuery(channel, query) rownames murder 1 Colorado 7.9 2 Arizona 8.1 3 California 9.0 4 Alaska 10.0 5 New Mexico 11.4 6 Michigan 12.1 7 Nevada 12.2 8 Florida 15.4 > sqlCopy(channel, query, "HighRape", rownames = FALSE) > sqlFetch(channel, "HighRape", max = 5) murder Colorado 7.9 Arizona 8.1 California 9.0 Alaska 10.0 New Mexico 11.4 > # sqlTables(channel) > sqlDrop(channel, "HighRape") > foo <- USArrests[1:3, 2, drop = FALSE] > foo[1,1] <- 236 > sqlUpdate(channel, foo, "USArrests") > sqlFetch(channel, "USArrests", max = 5) Murder Assault UrbanPop Rape Alabama 13.2 236 58 21.2 Alaska 10.0 263 48 44.5 Arizona 8.1 294 80 31.0 Arkansas 8.8 190 50 19.5 California 9.0 276 91 40.6 > sqlFetchMore(channel, max = 8) Murder Assault UrbanPop Rape Colorado 7.9 204 78 38.7 Connecticut 3.3 110 77 11.1 Delaware 5.9 238 72 15.8 Florida 15.4 335 80 31.9 Georgia 17.4 211 60 25.8 Hawaii 5.3 46 83 20.2 Idaho 2.6 120 54 14.2 Illinois 10.4 249 83 24.0 > sqlDrop(channel, "USArrests") > > Btest <- Atest <- + data.frame(x = c(paste(1:100, collapse="+"), letters[2:4]), rn=1:4) > Btest[,1] <- Atest[c(4,1:3),1] > sqlDrop(channel, "Atest", errors = FALSE) > ## char and varchar max is 8000 > colspec <- list(character="varchar(1000)", double="float", + integer="int", logical="varchar(5)") > sqlSave(channel, Atest, typeInfo = colspec) > sqlColumns(channel, "Atest") TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME COLUMN_SIZE 1 tempdb dbo Atest rownames 12 varchar 1000 2 tempdb dbo Atest x 12 varchar 1000 3 tempdb dbo Atest rn 4 int 10 BUFFER_LENGTH DECIMAL_DIGITS NUM_PREC_RADIX NULLABLE REMARKS COLUMN_DEF 1 1000 NA NA 1 2 1000 NA NA 1 3 4 0 10 1 SQL_DATA_TYPE SQL_DATETIME_SUB CHAR_OCTET_LENGTH ORDINAL_POSITION IS_NULLABLE 1 12 NA 1000 1 YES 2 12 NA 1000 2 YES 3 4 NA NA 3 YES SS_UDT_CATALOG_NAME SS_UDT_SCHEMA_NAME SS_UDT_ASSEMBLY_TYPE_NAME 1 2 3 SS_XML_SCHEMACOLLECTION_CATALOG_NAME SS_XML_SCHEMACOLLECTION_SCHEMA_NAME 1 2 3 SS_XML_SCHEMACOLLECTION_NAME SS_DATA_TYPE 1 39 2 39 3 38 > sqlFetch(channel, "Atest") x 1 1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20+21+22+23+24+25+26+27+28+29+30+31+32+33+34+35+36+37+38+39+40+41+42+43+44+45+46+47+48+49+50+51+52+53+54+55+56+57+58+59+60+61+62+63+64+65+66+67+68+69+70+71+72+73+74+75+76+77+78+79+80+81+82+83+84+85+86+87+88+89+90+91+92+93+94+95+96+97+98+99+100 2 b 3 c 4 d rn 1 1 2 2 3 3 4 4 > sqlUpdate(channel, Btest, "Atest", index = "rn") > sqlFetch(channel, "Atest") x 1 d 2 1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20+21+22+23+24+25+26+27+28+29+30+31+32+33+34+35+36+37+38+39+40+41+42+43+44+45+46+47+48+49+50+51+52+53+54+55+56+57+58+59+60+61+62+63+64+65+66+67+68+69+70+71+72+73+74+75+76+77+78+79+80+81+82+83+84+85+86+87+88+89+90+91+92+93+94+95+96+97+98+99+100 3 b 4 c rn 1 1 2 2 3 3 4 4 > sqlDrop(channel, "Atest") > varspec <- "varchar(1000)"; names(varspec) <- "x" > sqlSave(channel, Atest, varTypes = varspec) > sqlColumns(channel, "Atest") TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME COLUMN_SIZE 1 tempdb dbo Atest rownames 12 varchar 255 2 tempdb dbo Atest x 12 varchar 1000 3 tempdb dbo Atest rn 4 int 10 BUFFER_LENGTH DECIMAL_DIGITS NUM_PREC_RADIX NULLABLE REMARKS COLUMN_DEF 1 255 NA NA 1 2 1000 NA NA 1 3 4 0 10 1 SQL_DATA_TYPE SQL_DATETIME_SUB CHAR_OCTET_LENGTH ORDINAL_POSITION IS_NULLABLE 1 12 NA 255 1 YES 2 12 NA 1000 2 YES 3 4 NA NA 3 YES SS_UDT_CATALOG_NAME SS_UDT_SCHEMA_NAME SS_UDT_ASSEMBLY_TYPE_NAME 1 2 3 SS_XML_SCHEMACOLLECTION_CATALOG_NAME SS_XML_SCHEMACOLLECTION_SCHEMA_NAME 1 2 3 SS_XML_SCHEMACOLLECTION_NAME SS_DATA_TYPE 1 39 2 39 3 38 > sqlFetch(channel, "Atest") x 1 1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20+21+22+23+24+25+26+27+28+29+30+31+32+33+34+35+36+37+38+39+40+41+42+43+44+45+46+47+48+49+50+51+52+53+54+55+56+57+58+59+60+61+62+63+64+65+66+67+68+69+70+71+72+73+74+75+76+77+78+79+80+81+82+83+84+85+86+87+88+89+90+91+92+93+94+95+96+97+98+99+100 2 b 3 c 4 d rn 1 1 2 2 3 3 4 4 > sqlDrop(channel, "Atest") > > dates <- as.character(seq(as.Date("2004-01-01"), by="week", length=10)) > times <- paste(1:10, "05", "00", sep=":") > Dtest <- data.frame(dates, times, logi=c(TRUE, NA, FALSE, FALSE, FALSE)) > sqlDrop(channel, "Dtest", errors = FALSE) > varspec <- c("smalldatetime", "smalldatetime", "varchar(5)") > names(varspec) <- names(Dtest) > # fast = TRUE fails, claims data is invalid > sqlSave(channel, Dtest, varTypes = varspec, verbose=TRUE, fast=FALSE) Query: CREATE TABLE "Dtest" ("rownames" varchar(255), "dates" smalldatetime, "times" smalldatetime, "logi" varchar(5)) Query: INSERT INTO "Dtest" ( "rownames", "dates", "times", "logi" ) VALUES ( '1', '2004-01-01', '1:05:00', 'TRUE' ) Query: INSERT INTO "Dtest" ( "rownames", "dates", "times", "logi" ) VALUES ( '2', '2004-01-08', '2:05:00', NULL ) Query: INSERT INTO "Dtest" ( "rownames", "dates", "times", "logi" ) VALUES ( '3', '2004-01-15', '3:05:00', 'FALSE' ) Query: INSERT INTO "Dtest" ( "rownames", "dates", "times", "logi" ) VALUES ( '4', '2004-01-22', '4:05:00', 'FALSE' ) Query: INSERT INTO "Dtest" ( "rownames", "dates", "times", "logi" ) VALUES ( '5', '2004-01-29', '5:05:00', 'FALSE' ) Query: INSERT INTO "Dtest" ( "rownames", "dates", "times", "logi" ) VALUES ( '6', '2004-02-05', '6:05:00', 'TRUE' ) Query: INSERT INTO "Dtest" ( "rownames", "dates", "times", "logi" ) VALUES ( '7', '2004-02-12', '7:05:00', NULL ) Query: INSERT INTO "Dtest" ( "rownames", "dates", "times", "logi" ) VALUES ( '8', '2004-02-19', '8:05:00', 'FALSE' ) Query: INSERT INTO "Dtest" ( "rownames", "dates", "times", "logi" ) VALUES ( '9', '2004-02-26', '9:05:00', 'FALSE' ) Query: INSERT INTO "Dtest" ( "rownames", "dates", "times", "logi" ) VALUES ( '10', '2004-03-04', '10:05:00', 'FALSE' ) > sqlColumns(channel, "Dtest") TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME 1 tempdb dbo Dtest rownames 12 varchar 2 tempdb dbo Dtest dates 93 smalldatetime 3 tempdb dbo Dtest times 93 smalldatetime 4 tempdb dbo Dtest logi 12 varchar COLUMN_SIZE BUFFER_LENGTH DECIMAL_DIGITS NUM_PREC_RADIX NULLABLE REMARKS 1 255 255 NA NA 1 2 16 16 0 NA 1 3 16 16 0 NA 1 4 5 5 NA NA 1 COLUMN_DEF SQL_DATA_TYPE SQL_DATETIME_SUB CHAR_OCTET_LENGTH ORDINAL_POSITION 1 12 NA 255 1 2 9 3 NA 2 3 9 3 NA 3 4 12 NA 5 4 IS_NULLABLE SS_UDT_CATALOG_NAME SS_UDT_SCHEMA_NAME SS_UDT_ASSEMBLY_TYPE_NAME 1 YES 2 YES 3 YES 4 YES SS_XML_SCHEMACOLLECTION_CATALOG_NAME SS_XML_SCHEMACOLLECTION_SCHEMA_NAME 1 2 3 4 SS_XML_SCHEMACOLLECTION_NAME SS_DATA_TYPE 1 39 2 111 3 111 4 39 > sqlFetch(channel, "Dtest") dates times logi 1 2004-01-01 1900-01-01 01:05:00 TRUE 2 2004-01-08 1900-01-01 02:05:00 NA 3 2004-01-15 1900-01-01 03:05:00 FALSE 4 2004-01-22 1900-01-01 04:05:00 FALSE 5 2004-01-29 1900-01-01 05:05:00 FALSE 6 2004-02-05 1900-01-01 06:05:00 TRUE 7 2004-02-12 1900-01-01 07:05:00 NA 8 2004-02-19 1900-01-01 08:05:00 FALSE 9 2004-02-26 1900-01-01 09:05:00 FALSE 10 2004-03-04 1900-01-01 10:05:00 FALSE > sqlDrop(channel, "Dtest") > > sqlDrop(channel, "hills test", errors = FALSE) > sqlSave(channel, hills, "hills test", verbose=TRUE) Query: CREATE TABLE "hills test" ("rownames" varchar(255), "dist" float, "climb" int, "time" float) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( ?,?,?,? ) Binding: 'rownames' DataType 12, ColSize 255 Binding: 'dist' DataType 6, ColSize 53 Binding: 'climb' DataType 4, ColSize 10 Binding: 'time' DataType 6, ColSize 53 Parameters: no: 1: rownames Greenmantle/***/no: 2: dist 2.5/***/no: 3: climb 650/***/no: 4: time 16.083/***/ no: 1: rownames Carnethy/***/no: 2: dist 6/***/no: 3: climb 2500/***/no: 4: time 48.35/***/ no: 1: rownames Craig Dunain/***/no: 2: dist 6/***/no: 3: climb 900/***/no: 4: time 33.65/***/ no: 1: rownames Ben Rha/***/no: 2: dist 7.5/***/no: 3: climb 800/***/no: 4: time 45.6/***/ no: 1: rownames Ben Lomond/***/no: 2: dist 8/***/no: 3: climb 3070/***/no: 4: time 62.267/***/ no: 1: rownames Goatfell/***/no: 2: dist 8/***/no: 3: climb 2866/***/no: 4: time 73.217/***/ no: 1: rownames Bens of Jura/***/no: 2: dist 16/***/no: 3: climb 7500/***/no: 4: time 204.617/***/ no: 1: rownames Cairnpapple/***/no: 2: dist 6/***/no: 3: climb 800/***/no: 4: time 36.367/***/ no: 1: rownames Scolty/***/no: 2: dist 5/***/no: 3: climb 800/***/no: 4: time 29.75/***/ no: 1: rownames Traprain/***/no: 2: dist 6/***/no: 3: climb 650/***/no: 4: time 39.75/***/ no: 1: rownames Lairig Ghru/***/no: 2: dist 28/***/no: 3: climb 2100/***/no: 4: time 192.667/***/ no: 1: rownames Dollar ('$')/***/no: 2: dist 5/***/no: 3: climb 2000/***/no: 4: time 43.05/***/ no: 1: rownames Lomonds/***/no: 2: dist 9.5/***/no: 3: climb 2200/***/no: 4: time 65/***/ no: 1: rownames Cairn Table/***/no: 2: dist 6/***/no: 3: climb 500/***/no: 4: time 44.133/***/ no: 1: rownames Eildon Two/***/no: 2: dist 4.5/***/no: 3: climb 1500/***/no: 4: time 26.933/***/ > sqlUpdate(channel, hills[11:15,], "hills test", verbose=TRUE, fast=TRUE) Query: UPDATE "hills test" SET "dist"=?, "climb"=?, "time"=? WHERE "rownames"=? Binding: 'dist' DataType 6, ColSize 53 Binding: 'climb' DataType 4, ColSize 10 Binding: 'time' DataType 6, ColSize 53 Binding: 'rownames' DataType 12, ColSize 255 Parameters: no: 1: dist 28/***/no: 2: climb 2100/***/no: 3: time 192.667/***/no: 4: rownames Lairig Ghru/***/ no: 1: dist 5/***/no: 2: climb 2000/***/no: 3: time 43.05/***/no: 4: rownames Dollar ('$')/***/ no: 1: dist 9.5/***/no: 2: climb 2200/***/no: 3: time 65/***/no: 4: rownames Lomonds/***/ no: 1: dist 6/***/no: 2: climb 500/***/no: 3: time 44.133/***/no: 4: rownames Cairn Table/***/ no: 1: dist 4.5/***/no: 2: climb 1500/***/no: 3: time 26.933/***/no: 4: rownames Eildon Two/***/ > sqlFetch(channel, "hills test") dist climb time Greenmantle 2.5 650 16.083 Carnethy 6.0 2500 48.350 Craig Dunain 6.0 900 33.650 Ben Rha 7.5 800 45.600 Ben Lomond 8.0 3070 62.267 Goatfell 8.0 2866 73.217 Bens of Jura 16.0 7500 204.617 Cairnpapple 6.0 800 36.367 Scolty 5.0 800 29.750 Traprain 6.0 650 39.750 Lairig Ghru 28.0 2100 192.667 Dollar ('$') 5.0 2000 43.050 Lomonds 9.5 2200 65.000 Cairn Table 6.0 500 44.133 Eildon Two 4.5 1500 26.933 > sqlDrop(channel, "hills test") > sqlSave(channel, hills, "hills test", verbose=TRUE, fast=FALSE) Query: CREATE TABLE "hills test" ("rownames" varchar(255), "dist" float, "climb" int, "time" float) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Greenmantle', 2.5, 650, 16.083 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Carnethy', 6.0, 2500, 48.350 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Craig Dunain', 6.0, 900, 33.650 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Ben Rha', 7.5, 800, 45.600 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Ben Lomond', 8.0, 3070, 62.267 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Goatfell', 8.0, 2866, 73.217 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Bens of Jura', 16.0, 7500, 204.617 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Cairnpapple', 6.0, 800, 36.367 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Scolty', 5.0, 800, 29.750 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Traprain', 6.0, 650, 39.750 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Lairig Ghru', 28.0, 2100, 192.667 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Dollar (''$'')', 5.0, 2000, 43.050 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Lomonds', 9.5, 2200, 65.000 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Cairn Table', 6.0, 500, 44.133 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Eildon Two', 4.5, 1500, 26.933 ) > sqlUpdate(channel, hills[11:15,], "hills test", verbose=TRUE, fast=FALSE) Query: UPDATE "hills test" SET "dist"=28.0, "climb"=2100, "time"=192.667 WHERE "rownames"='Lairig Ghru' Query: UPDATE "hills test" SET "dist"= 5.0, "climb"=2000, "time"= 43.050 WHERE "rownames"='Dollar (''$'')' Query: UPDATE "hills test" SET "dist"= 9.5, "climb"=2200, "time"= 65.000 WHERE "rownames"='Lomonds' Query: UPDATE "hills test" SET "dist"= 6.0, "climb"= 500, "time"= 44.133 WHERE "rownames"='Cairn Table' Query: UPDATE "hills test" SET "dist"= 4.5, "climb"=1500, "time"= 26.933 WHERE "rownames"='Eildon Two' > sqlDrop(channel, "hills test") > > sqlTables(channel, catalog="", schema="", tableName="", tableType="%") TABLE_CAT TABLE_SCHEM TABLE_NAME TABLE_TYPE REMARKS 1 SYSTEM TABLE 2 TABLE 3 VIEW > sqlTables(channel, catalog="%", schema="", tableName="") TABLE_CAT TABLE_SCHEM TABLE_NAME TABLE_TYPE REMARKS 1 master 2 msdb 3 tempdb > # sqlQuery(channel, "create schema test2") > ## only list schemas which contain objects > sqlTables(channel, catalog="", schema="%", tableName="") TABLE_CAT TABLE_SCHEM TABLE_NAME TABLE_TYPE REMARKS 1 INFORMATION_SCHEMA 2 sys > ## list all schema > sqlQuery(channel, "select * from sys.schemas") name schema_id principal_id 1 dbo 1 1 2 guest 2 2 3 INFORMATION_SCHEMA 3 3 4 sys 4 4 5 test2 5 1 6 db_owner 16384 16384 7 db_accessadmin 16385 16385 8 db_securityadmin 16386 16386 9 db_ddladmin 16387 16387 10 db_backupoperator 16389 16389 11 db_datareader 16390 16390 12 db_datawriter 16391 16391 13 db_denydatareader 16392 16392 14 db_denydatawriter 16393 16393 > sqlSave(channel, women, "test2.women") > sqlTables(channel, catalog="", schema="%", tableName="") TABLE_CAT TABLE_SCHEM TABLE_NAME TABLE_TYPE REMARKS 1 INFORMATION_SCHEMA 2 sys 3 test2 > sqlTables(channel, tableType="TABLE") TABLE_CAT TABLE_SCHEM TABLE_NAME TABLE_TYPE REMARKS 1 tempdb test2 women TABLE > sqlDrop(channel, "test2.women") > > close(channel) > RODBC/tests/mysql.RR0000644000176000001440000000521413013621651013707 0ustar ripleyusers##-*- R -*- library(RODBC) library(MASS) USArrests[1,2] <- NA hills <- hills[1:15,] row.names(hills)[12] <- "Dollar ('$')" set.seed(1) channel <- odbcConnect("test") if(!inherits(channel, "RODBC")) q("no") odbcGetInfo(channel) sqlTables(channel) sqlDrop(channel, "USArrests", errors = FALSE) sqlSave(channel, USArrests, rownames = "State", addPK = TRUE) sqlTables(channel) sqlColumns(channel, "USArrests") sqlColumns(channel, "USArrests", special = TRUE) sqlPrimaryKeys(channel, "USArrests") sqlFetch(channel, "USArrests", rownames = "State") sqlQuery(channel, "select State, Murder from USArrests where Rape > 30 order by Murder") foo <- cbind(State=row.names(USArrests), USArrests)[1:3, c(1,3)] foo[1,2] <- 236 sqlUpdate(channel, foo, "USArrests") sqlFetch(channel, "USArrests", rownames = "State", max = 5) sqlFetchMore(channel, rownames = "State", max = 8) sqlDrop(channel, "USArrests") Btest <- Atest <- data.frame(x = c(paste(1:100, collapse="+"), letters[2:4]), rn=1:4) Btest[,1] <- Atest[c(4,1:3),1] sqlDrop(channel, "Atest", errors = FALSE) colspec <- list(character="text", double="double", integer="integer", logical="varchar(5)") sqlSave(channel, Atest, typeInfo = colspec) sqlColumns(channel, "Atest") sqlFetch(channel, "Atest") sqlUpdate(channel, Btest, "Atest", index = "rn") sqlFetch(channel, "Atest") sqlDrop(channel, "Atest") varspec <- "text"; names(varspec) <- "x" sqlSave(channel, Atest, varTypes = varspec) sqlColumns(channel, "Atest") sqlFetch(channel, "Atest") sqlDrop(channel, "Atest") dates <- as.character(seq(as.Date("2004-01-01"), by="week", length=10)) times <- paste(1:10, "05", "00", sep=":") dt <- as.POSIXct(paste(dates, times)) Dtest <- data.frame(dates, times, dt, logi=c(TRUE, NA, FALSE, FALSE, FALSE)) varspec <- c("date", "time", "timestamp", "varchar(5)") names(varspec) <- names(Dtest) sqlDrop(channel, "Dtest", errors = FALSE) sqlSave(channel, Dtest, varTypes = varspec) sqlColumns(channel, "Dtest") sqlFetch(channel, "Dtest") sqlDrop(channel, "Dtest", errors = FALSE) sqlSave(channel, Dtest, varTypes = varspec, fast = FALSE) sqlColumns(channel, "Dtest") sqlFetch(channel, "Dtest") sqlDrop(channel, "Dtest") sqlDrop(channel, "hills test", errors = FALSE) sqlSave(channel, hills, "hills test", verbose=TRUE) sqlUpdate(channel, hills[11:15,], "hills test", verbose=TRUE, fast=TRUE) sqlFetch(channel, "hills test") sqlDrop(channel, "hills test") sqlSave(channel, hills, "hills test", verbose=TRUE, fast=FALSE) sqlUpdate(channel, hills[11:15,], "hills test", verbose=TRUE, fast=FALSE) sqlDrop(channel, "hills test") sqlTables(channel, catalog="%") sqlTables(channel, catalog="ripley") sqlTables(channel, catalog="test") close(channel) RODBC/tests/excel.RR0000644000176000001440000000264713013621651013651 0ustar ripleyusers##-*- R -*- library(RODBC) library(MASS) USArrests[1,2] <- NA hills <- hills[1:15,] row.names(hills)[12] <- "Dollar ('$')" # DBase: maps table/column names to u/case, max length 8 dbf <- system.file("files", "sids.dbf", package="foreign") unlink("sids.dbf") file.copy(dbf, "sids.dbf") channel <- odbcConnectDbase("sids.dbf") str(sids <- sqlFetch(channel, "sids")) sqlUpdate(channel, sids[1:2, ], "sids", index="NAME", verbose=TRUE, fast=FALSE) close(channel) channel <- odbcConnectDbase("sids.dbf", case="toupper") sqlDrop(channel, "HILLS 2", errors=FALSE) sqlSave(channel, hills, "HILLS 2", verbose=TRUE) sqlUpdate(channel, hills[11:15,], "HILLS 2", verbose=TRUE) sqlDrop(channel, "HILLS 2") close(channel) # Excel 2003 channel <- odbcConnectExcel("hills.xls") ## list the spreadsheets and marked ranges sqlTables(channel) sqlColumns(channel, "hills") ## two ways to retrieve the contents of hills sqlFetch(channel, "hills") sqlQuery(channel, "select * from [hills$]") sqlFetch(channel, "women") close(channel) # The Excel driver maps ' ' to '_'. channel <- odbcConnectExcel("hills.xls", readOnly=FALSE) sqlSave(channel, hills, "hills_test", verbose=TRUE, fast=FALSE) sqlUpdate(channel, hills[11:15,], "hills_test", verbose=TRUE, fast=FALSE) sqlFetch(channel, "hills_test") sqlSave(channel, hills, "hills_test2", verbose=TRUE) sqlUpdate(channel, hills[11:15,], "hills_test2", verbose=TRUE) sqlFetch(channel, "hills_test2") close(channel) RODBC/tests/mysql.Rout.save0000644000176000001440000006103013013621651015250 0ustar ripleyusers R version 2.10.0 Under development (unstable) (2009-07-16 r48939) Copyright (C) 2009 The R Foundation for Statistical Computing ISBN 3-900051-07-0 R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > ##-*- R -*- > library(RODBC) > library(MASS) > USArrests[1,2] <- NA > hills <- hills[1:15,] > row.names(hills)[12] <- "Dollar ('$')" > set.seed(1) > > channel <- odbcConnect("test") > if(!inherits(channel, "RODBC")) q("no") > sqlTables(channel) [1] TABLE_CAT TABLE_SCHEM TABLE_NAME TABLE_TYPE REMARKS <0 rows> (or 0-length row.names) > sqlDrop(channel, "USArrests", errors = FALSE) > sqlSave(channel, USArrests, rownames = "State", addPK = TRUE) > sqlTables(channel) TABLE_CAT TABLE_SCHEM TABLE_NAME TABLE_TYPE REMARKS 1 ripley USArrests TABLE > sqlColumns(channel, "USArrests") TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME COLUMN_SIZE 1 ripley USArrests State 12 varchar 255 2 ripley USArrests Murder 8 double 15 3 ripley USArrests Assault 4 integer 10 4 ripley USArrests UrbanPop 4 integer 10 5 ripley USArrests Rape 8 double 15 BUFFER_LENGTH DECIMAL_DIGITS NUM_PREC_RADIX NULLABLE REMARKS COLUMN_DEF 1 255 NA NA 0 '' 2 8 NA NA 1 3 4 0 10 1 4 4 0 10 1 5 8 NA NA 1 SQL_DATA_TYPE SQL_DATETIME_SUB CHAR_OCTET_LENGTH ORDINAL_POSITION IS_NULLABLE 1 12 NA 255 1 NO 2 8 NA NA 2 YES 3 4 NA NA 3 YES 4 4 NA NA 4 YES 5 8 NA NA 5 YES > sqlColumns(channel, "USArrests", special = TRUE) SCOPE COLUMN_NAME DATA_TYPE TYPE_NAME COLUMN_SIZE BUFFER_LENGTH 1 2 State 12 varchar 255 255 DECIMAL_DIGITS PSEUDO_COLUMN 1 NA 1 > sqlPrimaryKeys(channel, "USArrests") TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME KEY_SEQ PK_NAME 1 USArrests State 1 PRIMARY > sqlFetch(channel, "USArrests", rownames = "State") Murder Assault UrbanPop Rape Alabama 13.2 NA 58 21.2 Alaska 10.0 263 48 44.5 Arizona 8.1 294 80 31.0 Arkansas 8.8 190 50 19.5 California 9.0 276 91 40.6 Colorado 7.9 204 78 38.7 Connecticut 3.3 110 77 11.1 Delaware 5.9 238 72 15.8 Florida 15.4 335 80 31.9 Georgia 17.4 211 60 25.8 Hawaii 5.3 46 83 20.2 Idaho 2.6 120 54 14.2 Illinois 10.4 249 83 24.0 Indiana 7.2 113 65 21.0 Iowa 2.2 56 57 11.3 Kansas 6.0 115 66 18.0 Kentucky 9.7 109 52 16.3 Louisiana 15.4 249 66 22.2 Maine 2.1 83 51 7.8 Maryland 11.3 300 67 27.8 Massachusetts 4.4 149 85 16.3 Michigan 12.1 255 74 35.1 Minnesota 2.7 72 66 14.9 Mississippi 16.1 259 44 17.1 Missouri 9.0 178 70 28.2 Montana 6.0 109 53 16.4 Nebraska 4.3 102 62 16.5 Nevada 12.2 252 81 46.0 New Hampshire 2.1 57 56 9.5 New Jersey 7.4 159 89 18.8 New Mexico 11.4 285 70 32.1 New York 11.1 254 86 26.1 North Carolina 13.0 337 45 16.1 North Dakota 0.8 45 44 7.3 Ohio 7.3 120 75 21.4 Oklahoma 6.6 151 68 20.0 Oregon 4.9 159 67 29.3 Pennsylvania 6.3 106 72 14.9 Rhode Island 3.4 174 87 8.3 South Carolina 14.4 279 48 22.5 South Dakota 3.8 86 45 12.8 Tennessee 13.2 188 59 26.9 Texas 12.7 201 80 25.5 Utah 3.2 120 80 22.9 Vermont 2.2 48 32 11.2 Virginia 8.5 156 63 20.7 Washington 4.0 145 73 26.2 West Virginia 5.7 81 39 9.3 Wisconsin 2.6 53 66 10.8 Wyoming 6.8 161 60 15.6 > sqlQuery(channel, "select State, Murder from USArrests where Rape > 30 order by Murder") State Murder 1 Colorado 7.9 2 Arizona 8.1 3 California 9.0 4 Alaska 10.0 5 New Mexico 11.4 6 Michigan 12.1 7 Nevada 12.2 8 Florida 15.4 > foo <- cbind(State=row.names(USArrests), USArrests)[1:3, c(1,3)] > foo[1,2] <- 236 > sqlUpdate(channel, foo, "USArrests") > sqlFetch(channel, "USArrests", rownames = "State", max = 5) Murder Assault UrbanPop Rape Alabama 13.2 236 58 21.2 Alaska 10.0 263 48 44.5 Arizona 8.1 294 80 31.0 Arkansas 8.8 190 50 19.5 California 9.0 276 91 40.6 > sqlFetchMore(channel, rownames = "State", max = 8) Murder Assault UrbanPop Rape Colorado 7.9 204 78 38.7 Connecticut 3.3 110 77 11.1 Delaware 5.9 238 72 15.8 Florida 15.4 335 80 31.9 Georgia 17.4 211 60 25.8 Hawaii 5.3 46 83 20.2 Idaho 2.6 120 54 14.2 Illinois 10.4 249 83 24.0 > sqlDrop(channel, "USArrests") > > Btest <- Atest <- + data.frame(x = c(paste(1:100, collapse="+"), letters[2:4]), rn=1:4) > Btest[,1] <- Atest[c(4,1:3),1] > sqlDrop(channel, "Atest", errors = FALSE) > colspec <- list(character="text", double="double", + integer="integer", logical="varchar(5)") > sqlSave(channel, Atest, typeInfo = colspec) > sqlColumns(channel, "Atest") TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME COLUMN_SIZE 1 ripley Atest rownames -1 text 65535 2 ripley Atest x -1 text 65535 3 ripley Atest rn 4 integer 10 BUFFER_LENGTH DECIMAL_DIGITS NUM_PREC_RADIX NULLABLE REMARKS COLUMN_DEF 1 65535 NA NA 1 2 65535 NA NA 1 3 4 0 10 1 SQL_DATA_TYPE SQL_DATETIME_SUB CHAR_OCTET_LENGTH ORDINAL_POSITION IS_NULLABLE 1 -1 NA 65535 1 YES 2 -1 NA 65535 2 YES 3 4 NA NA 3 YES > sqlFetch(channel, "Atest") x 1 1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20+21+22+23+24+25+26+27+28+29+30+31+32+33+34+35+36+37+38+39+40+41+42+43+44+45+46+47+48+49+50+51+52+53+54+55+56+57+58+59+60+61+62+63+64+65+66+67+68+69+70+71+72+73+74+75+76+77+78+79+80+81+82+83+84+85+86+87+88+89+90+91+92+93+94+95+96+97+98+99+100 2 b 3 c 4 d rn 1 1 2 2 3 3 4 4 > sqlUpdate(channel, Btest, "Atest", index = "rn") > sqlFetch(channel, "Atest") x 1 d 2 1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20+21+22+23+24+25+26+27+28+29+30+31+32+33+34+35+36+37+38+39+40+41+42+43+44+45+46+47+48+49+50+51+52+53+54+55+56+57+58+59+60+61+62+63+64+65+66+67+68+69+70+71+72+73+74+75+76+77+78+79+80+81+82+83+84+85+86+87+88+89+90+91+92+93+94+95+96+97+98+99+100 3 b 4 c rn 1 1 2 2 3 3 4 4 > sqlDrop(channel, "Atest") > varspec <- "text"; names(varspec) <- "x" > sqlSave(channel, Atest, varTypes = varspec) > sqlColumns(channel, "Atest") TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME COLUMN_SIZE 1 ripley Atest rownames 12 varchar 255 2 ripley Atest x -1 text 65535 3 ripley Atest rn 4 integer 10 BUFFER_LENGTH DECIMAL_DIGITS NUM_PREC_RADIX NULLABLE REMARKS COLUMN_DEF 1 255 NA NA 1 2 65535 NA NA 1 3 4 0 10 1 SQL_DATA_TYPE SQL_DATETIME_SUB CHAR_OCTET_LENGTH ORDINAL_POSITION IS_NULLABLE 1 12 NA 255 1 YES 2 -1 NA 65535 2 YES 3 4 NA NA 3 YES > sqlFetch(channel, "Atest") x 1 1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20+21+22+23+24+25+26+27+28+29+30+31+32+33+34+35+36+37+38+39+40+41+42+43+44+45+46+47+48+49+50+51+52+53+54+55+56+57+58+59+60+61+62+63+64+65+66+67+68+69+70+71+72+73+74+75+76+77+78+79+80+81+82+83+84+85+86+87+88+89+90+91+92+93+94+95+96+97+98+99+100 2 b 3 c 4 d rn 1 1 2 2 3 3 4 4 > sqlDrop(channel, "Atest") > > dates <- as.character(seq(as.Date("2004-01-01"), by="week", length=10)) > times <- paste(1:10, "05", "00", sep=":") > dt <- as.POSIXct(paste(dates, times)) > Dtest <- data.frame(dates, times, dt, logi=c(TRUE, NA, FALSE, FALSE, FALSE)) > varspec <- c("date", "time", "timestamp", "varchar(5)") > names(varspec) <- names(Dtest) > sqlDrop(channel, "Dtest", errors = FALSE) > sqlSave(channel, Dtest, varTypes = varspec) > sqlColumns(channel, "Dtest") TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME COLUMN_SIZE 1 ripley Dtest rownames 12 varchar 255 2 ripley Dtest dates 91 date 10 3 ripley Dtest times 92 time 8 4 ripley Dtest dt 93 timestamp 19 5 ripley Dtest logi 12 varchar 5 BUFFER_LENGTH DECIMAL_DIGITS NUM_PREC_RADIX NULLABLE REMARKS COLUMN_DEF 1 255 NA NA 1 2 6 NA NA 1 3 6 0 10 1 4 16 0 10 1 5 5 NA NA 1 SQL_DATA_TYPE SQL_DATETIME_SUB CHAR_OCTET_LENGTH ORDINAL_POSITION IS_NULLABLE 1 12 NA 255 1 YES 2 9 91 NA 2 YES 3 9 92 NA 3 YES 4 9 93 NA 4 YES 5 12 NA 5 5 YES > sqlFetch(channel, "Dtest") dates times dt logi 1 2004-01-01 01:05:00 2004-01-01 01:05:00 TRUE 2 2004-01-08 02:05:00 2004-01-08 02:05:00 NA 3 2004-01-15 03:05:00 2004-01-15 03:05:00 FALSE 4 2004-01-22 04:05:00 2004-01-22 04:05:00 FALSE 5 2004-01-29 05:05:00 2004-01-29 05:05:00 FALSE 6 2004-02-05 06:05:00 2004-02-05 06:05:00 TRUE 7 2004-02-12 07:05:00 2004-02-12 07:05:00 NA 8 2004-02-19 08:05:00 2004-02-19 08:05:00 FALSE 9 2004-02-26 09:05:00 2004-02-26 09:05:00 FALSE 10 2004-03-04 10:05:00 2004-03-04 10:05:00 FALSE > sqlDrop(channel, "Dtest", errors = FALSE) > sqlSave(channel, Dtest, varTypes = varspec, fast = FALSE) > sqlColumns(channel, "Dtest") TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME COLUMN_SIZE 1 ripley Dtest rownames 12 varchar 255 2 ripley Dtest dates 91 date 10 3 ripley Dtest times 92 time 8 4 ripley Dtest dt 93 timestamp 19 5 ripley Dtest logi 12 varchar 5 BUFFER_LENGTH DECIMAL_DIGITS NUM_PREC_RADIX NULLABLE REMARKS COLUMN_DEF 1 255 NA NA 1 2 6 NA NA 1 3 6 0 10 1 4 16 0 10 1 5 5 NA NA 1 SQL_DATA_TYPE SQL_DATETIME_SUB CHAR_OCTET_LENGTH ORDINAL_POSITION IS_NULLABLE 1 12 NA 255 1 YES 2 9 91 NA 2 YES 3 9 92 NA 3 YES 4 9 93 NA 4 YES 5 12 NA 5 5 YES > sqlFetch(channel, "Dtest") dates times dt logi 1 2004-01-01 01:05:00 2004-01-01 01:05:00 TRUE 2 2004-01-08 02:05:00 2004-01-08 02:05:00 NA 3 2004-01-15 03:05:00 2004-01-15 03:05:00 FALSE 4 2004-01-22 04:05:00 2004-01-22 04:05:00 FALSE 5 2004-01-29 05:05:00 2004-01-29 05:05:00 FALSE 6 2004-02-05 06:05:00 2004-02-05 06:05:00 TRUE 7 2004-02-12 07:05:00 2004-02-12 07:05:00 NA 8 2004-02-19 08:05:00 2004-02-19 08:05:00 FALSE 9 2004-02-26 09:05:00 2004-02-26 09:05:00 FALSE 10 2004-03-04 10:05:00 2004-03-04 10:05:00 FALSE > sqlDrop(channel, "Dtest") > > sqlDrop(channel, "hills test", errors = FALSE) > sqlSave(channel, hills, "hills test", verbose=TRUE) Query: CREATE TABLE `hills test` (`rownames` varchar(255), `dist` double, `climb` integer, `time` double) Query: INSERT INTO `hills test` ( `rownames`, `dist`, `climb`, `time` ) VALUES ( ?,?,?,? ) Binding: 'rownames' DataType 12, ColSize 255 Binding: 'dist' DataType 8, ColSize 15 Binding: 'climb' DataType 4, ColSize 10 Binding: 'time' DataType 8, ColSize 15 Parameters: no: 1: rownames Greenmantle/***/no: 2: dist 2.5/***/no: 3: climb 650/***/no: 4: time 16.083/***/ no: 1: rownames Carnethy/***/no: 2: dist 6/***/no: 3: climb 2500/***/no: 4: time 48.35/***/ no: 1: rownames Craig Dunain/***/no: 2: dist 6/***/no: 3: climb 900/***/no: 4: time 33.65/***/ no: 1: rownames Ben Rha/***/no: 2: dist 7.5/***/no: 3: climb 800/***/no: 4: time 45.6/***/ no: 1: rownames Ben Lomond/***/no: 2: dist 8/***/no: 3: climb 3070/***/no: 4: time 62.267/***/ no: 1: rownames Goatfell/***/no: 2: dist 8/***/no: 3: climb 2866/***/no: 4: time 73.217/***/ no: 1: rownames Bens of Jura/***/no: 2: dist 16/***/no: 3: climb 7500/***/no: 4: time 204.617/***/ no: 1: rownames Cairnpapple/***/no: 2: dist 6/***/no: 3: climb 800/***/no: 4: time 36.367/***/ no: 1: rownames Scolty/***/no: 2: dist 5/***/no: 3: climb 800/***/no: 4: time 29.75/***/ no: 1: rownames Traprain/***/no: 2: dist 6/***/no: 3: climb 650/***/no: 4: time 39.75/***/ no: 1: rownames Lairig Ghru/***/no: 2: dist 28/***/no: 3: climb 2100/***/no: 4: time 192.667/***/ no: 1: rownames Dollar ('$')/***/no: 2: dist 5/***/no: 3: climb 2000/***/no: 4: time 43.05/***/ no: 1: rownames Lomonds/***/no: 2: dist 9.5/***/no: 3: climb 2200/***/no: 4: time 65/***/ no: 1: rownames Cairn Table/***/no: 2: dist 6/***/no: 3: climb 500/***/no: 4: time 44.133/***/ no: 1: rownames Eildon Two/***/no: 2: dist 4.5/***/no: 3: climb 1500/***/no: 4: time 26.933/***/ > sqlUpdate(channel, hills[11:15,], "hills test", verbose=TRUE, fast=TRUE) Query: UPDATE `hills test` SET `dist`=?, `climb`=?, `time`=? WHERE `rownames`=? Binding: 'dist' DataType 8, ColSize 15 Binding: 'climb' DataType 4, ColSize 10 Binding: 'time' DataType 8, ColSize 15 Binding: 'rownames' DataType 12, ColSize 255 Parameters: no: 1: dist 28/***/no: 2: climb 2100/***/no: 3: time 192.667/***/no: 4: rownames Lairig Ghru/***/ no: 1: dist 5/***/no: 2: climb 2000/***/no: 3: time 43.05/***/no: 4: rownames Dollar ('$')/***/ no: 1: dist 9.5/***/no: 2: climb 2200/***/no: 3: time 65/***/no: 4: rownames Lomonds/***/ no: 1: dist 6/***/no: 2: climb 500/***/no: 3: time 44.133/***/no: 4: rownames Cairn Table/***/ no: 1: dist 4.5/***/no: 2: climb 1500/***/no: 3: time 26.933/***/no: 4: rownames Eildon Two/***/ > sqlFetch(channel, "hills test") dist climb time Greenmantle 2.5 650 16.083 Carnethy 6.0 2500 48.350 Craig Dunain 6.0 900 33.650 Ben Rha 7.5 800 45.600 Ben Lomond 8.0 3070 62.267 Goatfell 8.0 2866 73.217 Bens of Jura 16.0 7500 204.617 Cairnpapple 6.0 800 36.367 Scolty 5.0 800 29.750 Traprain 6.0 650 39.750 Lairig Ghru 28.0 2100 192.667 Dollar ('$') 5.0 2000 43.050 Lomonds 9.5 2200 65.000 Cairn Table 6.0 500 44.133 Eildon Two 4.5 1500 26.933 > sqlDrop(channel, "hills test") > sqlSave(channel, hills, "hills test", verbose=TRUE, fast=FALSE) Query: CREATE TABLE `hills test` (`rownames` varchar(255), `dist` double, `climb` integer, `time` double) Query: INSERT INTO `hills test` ( `rownames`, `dist`, `climb`, `time` ) VALUES ( 'Greenmantle', 2.5, 650, 16.083 ) Query: INSERT INTO `hills test` ( `rownames`, `dist`, `climb`, `time` ) VALUES ( 'Carnethy', 6.0, 2500, 48.350 ) Query: INSERT INTO `hills test` ( `rownames`, `dist`, `climb`, `time` ) VALUES ( 'Craig Dunain', 6.0, 900, 33.650 ) Query: INSERT INTO `hills test` ( `rownames`, `dist`, `climb`, `time` ) VALUES ( 'Ben Rha', 7.5, 800, 45.600 ) Query: INSERT INTO `hills test` ( `rownames`, `dist`, `climb`, `time` ) VALUES ( 'Ben Lomond', 8.0, 3070, 62.267 ) Query: INSERT INTO `hills test` ( `rownames`, `dist`, `climb`, `time` ) VALUES ( 'Goatfell', 8.0, 2866, 73.217 ) Query: INSERT INTO `hills test` ( `rownames`, `dist`, `climb`, `time` ) VALUES ( 'Bens of Jura', 16.0, 7500, 204.617 ) Query: INSERT INTO `hills test` ( `rownames`, `dist`, `climb`, `time` ) VALUES ( 'Cairnpapple', 6.0, 800, 36.367 ) Query: INSERT INTO `hills test` ( `rownames`, `dist`, `climb`, `time` ) VALUES ( 'Scolty', 5.0, 800, 29.750 ) Query: INSERT INTO `hills test` ( `rownames`, `dist`, `climb`, `time` ) VALUES ( 'Traprain', 6.0, 650, 39.750 ) Query: INSERT INTO `hills test` ( `rownames`, `dist`, `climb`, `time` ) VALUES ( 'Lairig Ghru', 28.0, 2100, 192.667 ) Query: INSERT INTO `hills test` ( `rownames`, `dist`, `climb`, `time` ) VALUES ( 'Dollar (''$'')', 5.0, 2000, 43.050 ) Query: INSERT INTO `hills test` ( `rownames`, `dist`, `climb`, `time` ) VALUES ( 'Lomonds', 9.5, 2200, 65.000 ) Query: INSERT INTO `hills test` ( `rownames`, `dist`, `climb`, `time` ) VALUES ( 'Cairn Table', 6.0, 500, 44.133 ) Query: INSERT INTO `hills test` ( `rownames`, `dist`, `climb`, `time` ) VALUES ( 'Eildon Two', 4.5, 1500, 26.933 ) > sqlUpdate(channel, hills[11:15,], "hills test", verbose=TRUE, fast=FALSE) Query: UPDATE `hills test` SET `dist`=28.0, `climb`=2100, `time`=192.667 WHERE `rownames`='Lairig Ghru' Query: UPDATE `hills test` SET `dist`= 5.0, `climb`=2000, `time`= 43.050 WHERE `rownames`='Dollar (''$'')' Query: UPDATE `hills test` SET `dist`= 9.5, `climb`=2200, `time`= 65.000 WHERE `rownames`='Lomonds' Query: UPDATE `hills test` SET `dist`= 6.0, `climb`= 500, `time`= 44.133 WHERE `rownames`='Cairn Table' Query: UPDATE `hills test` SET `dist`= 4.5, `climb`=1500, `time`= 26.933 WHERE `rownames`='Eildon Two' > sqlDrop(channel, "hills test") > > sqlTables(channel, catalog="%") TABLE_CAT TABLE_SCHEM TABLE_NAME TABLE_TYPE REMARKS 1 information_schema 2 mysql 3 ripley 4 test > sqlTables(channel, catalog="ripley") [1] TABLE_CAT TABLE_SCHEM TABLE_NAME TABLE_TYPE REMARKS <0 rows> (or 0-length row.names) > sqlTables(channel, catalog="test") TABLE_CAT TABLE_SCHEM TABLE_NAME TABLE_TYPE REMARKS 1 test A TABLE 2 test B TABLE 3 test D TABLE 4 test I TABLE 5 test M TABLE 6 test Meta TABLE 7 test Q TABLE 8 test S TABLE 9 test T TABLE 10 test U TABLE 11 test W TABLE > > close(channel) > RODBC/tests/DB2.Rout.save0000644000176000001440000006673113013621651014467 0ustar ripleyusers R version 2.13.1 (2011-07-08) Copyright (C) 2011 The R Foundation for Statistical Computing ISBN 3-900051-07-0 Platform: i386-pc-mingw32/i386 (32-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > ##-*- R -*- > library(RODBC) > library(MASS) > USArrests[1,2] <- NA > hills <- hills[1:15,] > row.names(hills)[12] <- "Dollar ('$')" > set.seed(1) > options(digits.secs = 3) > > channel <- odbcConnect("DB2") > if(!inherits(channel, "RODBC")) q("no") > sqlTables(channel, schema="RIPLEY") [1] TABLE_CAT TABLE_SCHEM TABLE_NAME TABLE_TYPE REMARKS <0 rows> (or 0-length row.names) > sqlDrop(channel, "USArrests", errors = FALSE) > sqlSave(channel, USArrests, rownames = "State", addPK = TRUE) > sqlTables(channel, schema="RIPLEY") TABLE_CAT TABLE_SCHEM TABLE_NAME TABLE_TYPE REMARKS 1 RIPLEY USArrests TABLE > sqlColumns(channel, "USArrests") TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME COLUMN_SIZE 1 RIPLEY USArrests State 12 VARCHAR 255 2 RIPLEY USArrests Murder 8 DOUBLE 53 3 RIPLEY USArrests Assault 4 INTEGER 10 4 RIPLEY USArrests UrbanPop 4 INTEGER 10 5 RIPLEY USArrests Rape 8 DOUBLE 53 BUFFER_LENGTH DECIMAL_DIGITS NUM_PREC_RADIX NULLABLE REMARKS COLUMN_DEF 1 255 NA NA 0 2 8 NA 2 1 3 4 0 10 1 4 4 0 10 1 5 8 NA 2 1 SQL_DATA_TYPE SQL_DATETIME_SUB CHAR_OCTET_LENGTH ORDINAL_POSITION IS_NULLABLE 1 12 NA 255 1 NO 2 8 NA NA 2 YES 3 4 NA NA 3 YES 4 4 NA NA 4 YES 5 8 NA NA 5 YES > sqlColumns(channel, "USArrests", special = TRUE) [1] SCOPE COLUMN_NAME DATA_TYPE TYPE_NAME COLUMN_SIZE [6] BUFFER_LENGTH DECIMAL_DIGITS PSEUDO_COLUMN <0 rows> (or 0-length row.names) > sqlPrimaryKeys(channel, "USArrests") TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME KEY_SEQ PK_NAME 1 RIPLEY USArrests State 1 SQL090709102101900 > sqlFetch(channel, "USArrests", rownames = "State") Murder Assault UrbanPop Rape Alabama 13.2 NA 58 21.2 Alaska 10.0 263 48 44.5 Arizona 8.1 294 80 31.0 Arkansas 8.8 190 50 19.5 California 9.0 276 91 40.6 Colorado 7.9 204 78 38.7 Connecticut 3.3 110 77 11.1 Delaware 5.9 238 72 15.8 Florida 15.4 335 80 31.9 Georgia 17.4 211 60 25.8 Hawaii 5.3 46 83 20.2 Idaho 2.6 120 54 14.2 Illinois 10.4 249 83 24.0 Indiana 7.2 113 65 21.0 Iowa 2.2 56 57 11.3 Kansas 6.0 115 66 18.0 Kentucky 9.7 109 52 16.3 Louisiana 15.4 249 66 22.2 Maine 2.1 83 51 7.8 Maryland 11.3 300 67 27.8 Massachusetts 4.4 149 85 16.3 Michigan 12.1 255 74 35.1 Minnesota 2.7 72 66 14.9 Mississippi 16.1 259 44 17.1 Missouri 9.0 178 70 28.2 Montana 6.0 109 53 16.4 Nebraska 4.3 102 62 16.5 Nevada 12.2 252 81 46.0 New Hampshire 2.1 57 56 9.5 New Jersey 7.4 159 89 18.8 New Mexico 11.4 285 70 32.1 New York 11.1 254 86 26.1 North Carolina 13.0 337 45 16.1 North Dakota 0.8 45 44 7.3 Ohio 7.3 120 75 21.4 Oklahoma 6.6 151 68 20.0 Oregon 4.9 159 67 29.3 Pennsylvania 6.3 106 72 14.9 Rhode Island 3.4 174 87 8.3 South Carolina 14.4 279 48 22.5 South Dakota 3.8 86 45 12.8 Tennessee 13.2 188 59 26.9 Texas 12.7 201 80 25.5 Utah 3.2 120 80 22.9 Vermont 2.2 48 32 11.2 Virginia 8.5 156 63 20.7 Washington 4.0 145 73 26.2 West Virginia 5.7 81 39 9.3 Wisconsin 2.6 53 66 10.8 Wyoming 6.8 161 60 15.6 > sqlQuery(channel, 'select "State", "Murder" from "USArrests" where "Rape" > 30 order by "Murder"') State Murder 1 Colorado 7.9 2 Arizona 8.1 3 California 9.0 4 Alaska 10.0 5 New Mexico 11.4 6 Michigan 12.1 7 Nevada 12.2 8 Florida 15.4 > foo <- cbind(State=row.names(USArrests), USArrests)[1:3, c(1,3)] > foo[1,2] <- 236 > sqlUpdate(channel, foo, "USArrests") > sqlFetch(channel, "USArrests", rownames = "State", max = 5) Murder Assault UrbanPop Rape Alabama 13.2 236 58 21.2 Alaska 10.0 263 48 44.5 Arizona 8.1 294 80 31.0 Arkansas 8.8 190 50 19.5 California 9.0 276 91 40.6 > sqlFetchMore(channel, rownames = "State", max = 8) Murder Assault UrbanPop Rape Colorado 7.9 204 78 38.7 Connecticut 3.3 110 77 11.1 Delaware 5.9 238 72 15.8 Florida 15.4 335 80 31.9 Georgia 17.4 211 60 25.8 Hawaii 5.3 46 83 20.2 Idaho 2.6 120 54 14.2 Illinois 10.4 249 83 24.0 > sqlDrop(channel, "USArrests") > > Btest <- Atest <- + data.frame(x = c(paste(1:100, collapse="+"), letters[2:4]), rn=1:4) > Btest[,1] <- Atest[c(4,1:3),1] > sqlDrop(channel, "Atest", errors = FALSE) > ## max for varchar is 32672, 254 for char > colspec <- list(character="varchar(1000)", double="double", + integer="integer", logical="varchar(5)") > sqlSave(channel, Atest, typeInfo = colspec) > sqlColumns(channel, "Atest") TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME COLUMN_SIZE 1 RIPLEY Atest rownames 12 VARCHAR 1000 2 RIPLEY Atest x 12 VARCHAR 1000 3 RIPLEY Atest rn 4 INTEGER 10 BUFFER_LENGTH DECIMAL_DIGITS NUM_PREC_RADIX NULLABLE REMARKS COLUMN_DEF 1 1000 NA NA 1 2 1000 NA NA 1 3 4 0 10 1 SQL_DATA_TYPE SQL_DATETIME_SUB CHAR_OCTET_LENGTH ORDINAL_POSITION IS_NULLABLE 1 12 NA 1000 1 YES 2 12 NA 1000 2 YES 3 4 NA NA 3 YES > sqlFetch(channel, "Atest") x 1 1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20+21+22+23+24+25+26+27+28+29+30+31+32+33+34+35+36+37+38+39+40+41+42+43+44+45+46+47+48+49+50+51+52+53+54+55+56+57+58+59+60+61+62+63+64+65+66+67+68+69+70+71+72+73+74+75+76+77+78+79+80+81+82+83+84+85+86+87+88+89+90+91+92+93+94+95+96+97+98+99+100 2 b 3 c 4 d rn 1 1 2 2 3 3 4 4 > sqlUpdate(channel, Btest, "Atest", index = "rn") > sqlFetch(channel, "Atest") x 1 d 2 1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20+21+22+23+24+25+26+27+28+29+30+31+32+33+34+35+36+37+38+39+40+41+42+43+44+45+46+47+48+49+50+51+52+53+54+55+56+57+58+59+60+61+62+63+64+65+66+67+68+69+70+71+72+73+74+75+76+77+78+79+80+81+82+83+84+85+86+87+88+89+90+91+92+93+94+95+96+97+98+99+100 3 b 4 c rn 1 1 2 2 3 3 4 4 > sqlDrop(channel, "Atest") > varspec <- "varchar(1000)"; names(varspec) <- "x" > sqlSave(channel, Atest, varTypes = varspec) > sqlColumns(channel, "Atest") TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME COLUMN_SIZE 1 RIPLEY Atest rownames 12 VARCHAR 255 2 RIPLEY Atest x 12 VARCHAR 1000 3 RIPLEY Atest rn 4 INTEGER 10 BUFFER_LENGTH DECIMAL_DIGITS NUM_PREC_RADIX NULLABLE REMARKS COLUMN_DEF 1 255 NA NA 1 2 1000 NA NA 1 3 4 0 10 1 SQL_DATA_TYPE SQL_DATETIME_SUB CHAR_OCTET_LENGTH ORDINAL_POSITION IS_NULLABLE 1 12 NA 255 1 YES 2 12 NA 1000 2 YES 3 4 NA NA 3 YES > sqlFetch(channel, "Atest") x 1 1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20+21+22+23+24+25+26+27+28+29+30+31+32+33+34+35+36+37+38+39+40+41+42+43+44+45+46+47+48+49+50+51+52+53+54+55+56+57+58+59+60+61+62+63+64+65+66+67+68+69+70+71+72+73+74+75+76+77+78+79+80+81+82+83+84+85+86+87+88+89+90+91+92+93+94+95+96+97+98+99+100 2 b 3 c 4 d rn 1 1 2 2 3 3 4 4 > sqlDrop(channel, "Atest") > > dates <- as.character(seq(as.Date("2004-01-01"), by="week", length=10)) > times <- paste(1:10, "05", "00", sep=":") > dt <- as.POSIXct(paste(dates, times)) > dt <- dt + round(runif(10), 3) > Dtest <- data.frame(dates, times, dt, logi=c(TRUE, NA, FALSE, FALSE, FALSE)) > varspec <- c("date", "time", "timestamp", "varchar(5)") > names(varspec) <- names(Dtest) > sqlDrop(channel, "Dtest", errors = FALSE) > sqlSave(channel, Dtest, varTypes = varspec) > sqlColumns(channel, "Dtest") TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME COLUMN_SIZE 1 RIPLEY Dtest rownames 12 VARCHAR 255 2 RIPLEY Dtest dates 91 DATE 10 3 RIPLEY Dtest times 92 TIME 8 4 RIPLEY Dtest dt 93 TIMESTAMP 26 5 RIPLEY Dtest logi 12 VARCHAR 5 BUFFER_LENGTH DECIMAL_DIGITS NUM_PREC_RADIX NULLABLE REMARKS COLUMN_DEF 1 255 NA NA 1 2 6 NA NA 1 3 6 0 NA 1 4 16 6 NA 1 5 5 NA NA 1 SQL_DATA_TYPE SQL_DATETIME_SUB CHAR_OCTET_LENGTH ORDINAL_POSITION IS_NULLABLE 1 12 NA 255 1 YES 2 9 1 NA 2 YES 3 9 2 NA 3 YES 4 9 3 NA 4 YES 5 12 NA 5 5 YES > sqlFetch(channel, "Dtest") dates times dt logi 1 2004-01-01 01:05:00 2004-01-01 01:05:00.371 TRUE 2 2004-01-08 02:05:00 2004-01-08 02:05:00.572 NA 3 2004-01-15 03:05:00 2004-01-15 03:05:00.907 FALSE 4 2004-01-22 04:05:00 2004-01-22 04:05:00.200 FALSE 5 2004-01-29 05:05:00 2004-01-29 05:05:00.898 FALSE 6 2004-02-05 06:05:00 2004-02-05 06:05:00.944 TRUE 7 2004-02-12 07:05:00 2004-02-12 07:05:00.661 NA 8 2004-02-19 08:05:00 2004-02-19 08:05:00.628 FALSE 9 2004-02-26 09:05:00 2004-02-26 09:05:00.062 FALSE 10 2004-03-04 10:05:00 2004-03-04 10:05:00.206 FALSE > sqlDrop(channel, "Dtest") > Dtest <- data.frame(dates, times, dt, logi=c(TRUE, NA, FALSE, FALSE, FALSE)) > varspec <- c("date", "time", "timestamp", "varchar(5)") > names(varspec) <- names(Dtest) > sqlDrop(channel, "Dtest", errors = FALSE) > sqlSave(channel, Dtest, varTypes = varspec, fast = FALSE) > sqlColumns(channel, "Dtest") TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME COLUMN_SIZE 1 RIPLEY Dtest rownames 12 VARCHAR 255 2 RIPLEY Dtest dates 91 DATE 10 3 RIPLEY Dtest times 92 TIME 8 4 RIPLEY Dtest dt 93 TIMESTAMP 26 5 RIPLEY Dtest logi 12 VARCHAR 5 BUFFER_LENGTH DECIMAL_DIGITS NUM_PREC_RADIX NULLABLE REMARKS COLUMN_DEF 1 255 NA NA 1 2 6 NA NA 1 3 6 0 NA 1 4 16 6 NA 1 5 5 NA NA 1 SQL_DATA_TYPE SQL_DATETIME_SUB CHAR_OCTET_LENGTH ORDINAL_POSITION IS_NULLABLE 1 12 NA 255 1 YES 2 9 1 NA 2 YES 3 9 2 NA 3 YES 4 9 3 NA 4 YES 5 12 NA 5 5 YES > sqlFetch(channel, "Dtest") dates times dt logi 1 2004-01-01 01:05:00 2004-01-01 01:05:00.371 TRUE 2 2004-01-08 02:05:00 2004-01-08 02:05:00.572 NA 3 2004-01-15 03:05:00 2004-01-15 03:05:00.907 FALSE 4 2004-01-22 04:05:00 2004-01-22 04:05:00.200 FALSE 5 2004-01-29 05:05:00 2004-01-29 05:05:00.898 FALSE 6 2004-02-05 06:05:00 2004-02-05 06:05:00.944 TRUE 7 2004-02-12 07:05:00 2004-02-12 07:05:00.661 NA 8 2004-02-19 08:05:00 2004-02-19 08:05:00.628 FALSE 9 2004-02-26 09:05:00 2004-02-26 09:05:00.062 FALSE 10 2004-03-04 10:05:00 2004-03-04 10:05:00.206 FALSE > sqlDrop(channel, "Dtest") > > sqlDrop(channel, "hills test", errors = FALSE) > sqlSave(channel, hills, "hills test", verbose=TRUE) Query: CREATE TABLE "hills test" ("rownames" VARCHAR(255), "dist" DOUBLE, "climb" INTEGER, "time" DOUBLE) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( ?,?,?,? ) Binding: 'rownames' DataType 12, ColSize 255 Binding: 'dist' DataType 8, ColSize 53 Binding: 'climb' DataType 4, ColSize 10 Binding: 'time' DataType 8, ColSize 53 Parameters: no: 1: rownames Greenmantle/***/no: 2: dist 2.5/***/no: 3: climb 650/***/no: 4: time 16.083/***/ no: 1: rownames Carnethy/***/no: 2: dist 6/***/no: 3: climb 2500/***/no: 4: time 48.35/***/ no: 1: rownames Craig Dunain/***/no: 2: dist 6/***/no: 3: climb 900/***/no: 4: time 33.65/***/ no: 1: rownames Ben Rha/***/no: 2: dist 7.5/***/no: 3: climb 800/***/no: 4: time 45.6/***/ no: 1: rownames Ben Lomond/***/no: 2: dist 8/***/no: 3: climb 3070/***/no: 4: time 62.267/***/ no: 1: rownames Goatfell/***/no: 2: dist 8/***/no: 3: climb 2866/***/no: 4: time 73.217/***/ no: 1: rownames Bens of Jura/***/no: 2: dist 16/***/no: 3: climb 7500/***/no: 4: time 204.617/***/ no: 1: rownames Cairnpapple/***/no: 2: dist 6/***/no: 3: climb 800/***/no: 4: time 36.367/***/ no: 1: rownames Scolty/***/no: 2: dist 5/***/no: 3: climb 800/***/no: 4: time 29.75/***/ no: 1: rownames Traprain/***/no: 2: dist 6/***/no: 3: climb 650/***/no: 4: time 39.75/***/ no: 1: rownames Lairig Ghru/***/no: 2: dist 28/***/no: 3: climb 2100/***/no: 4: time 192.667/***/ no: 1: rownames Dollar ('$')/***/no: 2: dist 5/***/no: 3: climb 2000/***/no: 4: time 43.05/***/ no: 1: rownames Lomonds/***/no: 2: dist 9.5/***/no: 3: climb 2200/***/no: 4: time 65/***/ no: 1: rownames Cairn Table/***/no: 2: dist 6/***/no: 3: climb 500/***/no: 4: time 44.133/***/ no: 1: rownames Eildon Two/***/no: 2: dist 4.5/***/no: 3: climb 1500/***/no: 4: time 26.933/***/ > sqlUpdate(channel, hills[11:15,], "hills test", verbose=TRUE, fast=TRUE) Query: UPDATE "hills test" SET "dist"=?, "climb"=?, "time"=? WHERE "rownames"=? Binding: 'dist' DataType 8, ColSize 53 Binding: 'climb' DataType 4, ColSize 10 Binding: 'time' DataType 8, ColSize 53 Binding: 'rownames' DataType 12, ColSize 255 Parameters: no: 1: dist 28/***/no: 2: climb 2100/***/no: 3: time 192.667/***/no: 4: rownames Lairig Ghru/***/ no: 1: dist 5/***/no: 2: climb 2000/***/no: 3: time 43.05/***/no: 4: rownames Dollar ('$')/***/ no: 1: dist 9.5/***/no: 2: climb 2200/***/no: 3: time 65/***/no: 4: rownames Lomonds/***/ no: 1: dist 6/***/no: 2: climb 500/***/no: 3: time 44.133/***/no: 4: rownames Cairn Table/***/ no: 1: dist 4.5/***/no: 2: climb 1500/***/no: 3: time 26.933/***/no: 4: rownames Eildon Two/***/ > sqlFetch(channel, "hills test") dist climb time Greenmantle 2.5 650 16.083 Carnethy 6.0 2500 48.350 Craig Dunain 6.0 900 33.650 Ben Rha 7.5 800 45.600 Ben Lomond 8.0 3070 62.267 Goatfell 8.0 2866 73.217 Bens of Jura 16.0 7500 204.617 Cairnpapple 6.0 800 36.367 Scolty 5.0 800 29.750 Traprain 6.0 650 39.750 Lairig Ghru 28.0 2100 192.667 Dollar ('$') 5.0 2000 43.050 Lomonds 9.5 2200 65.000 Cairn Table 6.0 500 44.133 Eildon Two 4.5 1500 26.933 > sqlDrop(channel, "hills test") > sqlSave(channel, hills, "hills test", verbose=TRUE, fast=FALSE) Query: CREATE TABLE "hills test" ("rownames" VARCHAR(255), "dist" DOUBLE, "climb" INTEGER, "time" DOUBLE) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Greenmantle', 2.5, 650, 16.083 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Carnethy', 6.0, 2500, 48.350 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Craig Dunain', 6.0, 900, 33.650 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Ben Rha', 7.5, 800, 45.600 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Ben Lomond', 8.0, 3070, 62.267 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Goatfell', 8.0, 2866, 73.217 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Bens of Jura', 16.0, 7500, 204.617 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Cairnpapple', 6.0, 800, 36.367 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Scolty', 5.0, 800, 29.750 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Traprain', 6.0, 650, 39.750 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Lairig Ghru', 28.0, 2100, 192.667 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Dollar (''$'')', 5.0, 2000, 43.050 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Lomonds', 9.5, 2200, 65.000 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Cairn Table', 6.0, 500, 44.133 ) Query: INSERT INTO "hills test" ( "rownames", "dist", "climb", "time" ) VALUES ( 'Eildon Two', 4.5, 1500, 26.933 ) > sqlUpdate(channel, hills[11:15,], "hills test", verbose=TRUE, fast=FALSE) Query: UPDATE "hills test" SET "dist"=28.0, "climb"=2100, "time"=192.667 WHERE "rownames"='Lairig Ghru' Query: UPDATE "hills test" SET "dist"= 5.0, "climb"=2000, "time"= 43.050 WHERE "rownames"='Dollar (''$'')' Query: UPDATE "hills test" SET "dist"= 9.5, "climb"=2200, "time"= 65.000 WHERE "rownames"='Lomonds' Query: UPDATE "hills test" SET "dist"= 6.0, "climb"= 500, "time"= 44.133 WHERE "rownames"='Cairn Table' Query: UPDATE "hills test" SET "dist"= 4.5, "climb"=1500, "time"= 26.933 WHERE "rownames"='Eildon Two' > sqlDrop(channel, "hills test") > > sqlTables(channel, catalog="", schema="", tableName="", tableType="%") TABLE_CAT TABLE_SCHEM TABLE_NAME TABLE_TYPE REMARKS 1 ALIAS 2 HIERARCHY TABLE 3 INOPERATIVE VIEW 4 MATERIALIZED QUERY TABLE 5 NICKNAME 6 SYSTEM TABLE 7 TABLE 8 TYPED TABLE 9 TYPED VIEW 10 VIEW > ## case matters here > # sqlQuery(channel, "create schema TEST2") > sqlTables(channel, catalog="", schema="%", tableName="") TABLE_CAT TABLE_SCHEM TABLE_NAME TABLE_TYPE REMARKS 1 NULLID 2 RIPLEY 3 SQLJ 4 SYSCAT 5 SYSFUN 6 SYSIBM 7 SYSIBMADM 8 SYSIBMINTERNAL 9 SYSIBMTS 10 SYSPROC 11 SYSPUBLIC 12 SYSSTAT 13 SYSTOOLS 14 TEST2 > sqlSave(channel, women, "TEST2.WOMEN") > sqlTables(channel, catalog="", schema="%", tableName="") TABLE_CAT TABLE_SCHEM TABLE_NAME TABLE_TYPE REMARKS 1 NULLID 2 RIPLEY 3 SQLJ 4 SYSCAT 5 SYSFUN 6 SYSIBM 7 SYSIBMADM 8 SYSIBMINTERNAL 9 SYSIBMTS 10 SYSPROC 11 SYSPUBLIC 12 SYSSTAT 13 SYSTOOLS 14 TEST2 > sqlTables(channel, tableType="TABLE") TABLE_CAT TABLE_SCHEM TABLE_NAME TABLE_TYPE REMARKS 1 SYSTOOLS HMON_ATM_INFO TABLE 2 SYSTOOLS HMON_COLLECTION TABLE 3 SYSTOOLS POLICY TABLE 4 TEST2 WOMEN TABLE > sqlTables(channel, schema="TEST2") TABLE_CAT TABLE_SCHEM TABLE_NAME TABLE_TYPE REMARKS 1 TEST2 WOMEN TABLE > sqlDrop(channel, "TEST2.WOMEN") > > close(channel) RODBC/tests/mysql-win.RR0000644000176000001440000000531513013621651014504 0ustar ripleyusers##-*- R -*- ## MySQL is not case-honouring on Windows library(RODBC) library(MASS) USArrests[1,2] <- NA hills <- hills[1:15,] row.names(hills)[12] <- "Dollar ('$')" ## testdb3 is ODBC/Connector 3.51.x, testdb5 is 5.1.x channel <- odbcConnect("testdb5") if(!inherits(channel, "RODBC")) q("no") odbcGetInfo(channel) sqlTables(channel) sqlDrop(channel, "USArrests", errors = FALSE) sqlSave(channel, USArrests, rownames = "state", addPK = TRUE) sqlTables(channel) sqlColumns(channel, "USArrests") sqlColumns(channel, "USArrests", special = TRUE) sqlPrimaryKeys(channel, "USArrests") sqlFetch(channel, "USArrests", rownames = "state") sqlQuery(channel, "select state, murder from USArrests where rape > 30 order by murder") foo <- cbind(state=row.names(USArrests), USArrests)[1:3, c(1,3)] foo[1,2] <- 236 sqlUpdate(channel, foo, "USArrests") sqlFetch(channel, "USArrests", rownames = "state", max = 5) sqlFetchMore(channel, rownames = "state", max = 8) sqlDrop(channel, "USArrests") Btest <- Atest <- data.frame(x = c(paste(1:100, collapse="+"), letters[2:4]), rn=1:4) Btest[,1] <- Atest[c(4,1:3),1] sqlDrop(channel, "Atest", errors = FALSE) colspec <- list(character="text", double="double", integer="integer", logical="varchar(5)") sqlSave(channel, Atest, typeInfo = colspec) sqlColumns(channel, "Atest") sqlFetch(channel, "Atest") sqlUpdate(channel, Btest, "Atest", index = "rn") sqlFetch(channel, "Atest") sqlDrop(channel, "Atest") varspec <- "text"; names(varspec) <- "x" sqlSave(channel, Atest, varTypes = varspec) sqlColumns(channel, "Atest") sqlFetch(channel, "Atest") sqlDrop(channel, "Atest") dates <- as.character(seq(as.Date("2004-01-01"), by="week", length=10)) times <- paste(1:10, "05", "00", sep=":") dt <- as.POSIXct(paste(dates, times)) Dtest <- data.frame(dates, times, dt, logi=c(TRUE, NA, FALSE, FALSE, FALSE)) varspec <- c("date", "time", "timestamp", "varchar(5)") names(varspec) <- names(Dtest) sqlDrop(channel, "Dtest", errors = FALSE) sqlSave(channel, Dtest, varTypes = varspec) sqlColumns(channel, "Dtest") sqlFetch(channel, "Dtest") sqlDrop(channel, "Dtest", errors = FALSE) sqlSave(channel, Dtest, varTypes = varspec, fast = FALSE) sqlColumns(channel, "Dtest") sqlFetch(channel, "Dtest") sqlDrop(channel, "Dtest") sqlDrop(channel, "hills test", errors = FALSE) sqlSave(channel, hills, "hills test", verbose=TRUE) sqlUpdate(channel, hills[11:15,], "hills test", verbose=TRUE, fast=TRUE) sqlFetch(channel, "hills test") sqlDrop(channel, "hills test") sqlSave(channel, hills, "hills test", verbose=TRUE, fast=FALSE) sqlUpdate(channel, hills[11:15,], "hills test", verbose=TRUE, fast=FALSE) sqlDrop(channel, "hills test") sqlTables(channel, catalog="%") sqlTables(channel, catalog="test", tableName="%") close(channel) RODBC/tests/mimer.RR0000644000176000001440000000573513013621651013663 0ustar ripleyusers##-*- R -*- library(RODBC) library(MASS) USArrests[1,2] <- NA hills <- hills[1:15,] row.names(hills)[12] <- "Dollar ('$')" set.seed(1) channel <- odbcConnect("mimdb", uid="DEVUSER", pwd=Sys.getenv("DB_PWD")) if(!inherits(channel, "RODBC")) q("no") odbcGetInfo(channel) sqlTables(channel, schema="DEVUSER") sqlDrop(channel, "USArrests", errors = FALSE) sqlSave(channel, USArrests, rownames = "State", addPK = TRUE) sqlTables(channel, schema="DEVUSER") sqlColumns(channel, "USArrests") sqlColumns(channel, "USArrests", special = TRUE) sqlPrimaryKeys(channel, "USArrests") sqlFetch(channel, "USArrests", rownames = "State") sqlQuery(channel, "select State, Murder from USArrests where Rape > 30 order by Murder") foo <- cbind(State=row.names(USArrests), USArrests)[1:3, c(1,3)] foo[1,2] <- 236 sqlUpdate(channel, foo, "USArrests") sqlFetch(channel, "USArrests", rownames = "State", max = 5) sqlFetchMore(channel, rownames = "State", max = 8) sqlDrop(channel, "USArrests") Btest <- Atest <- data.frame(x = c(paste(1:100, collapse="+"), letters[2:4]), rn=1:4) Btest[,1] <- Atest[c(4,1:3),1] sqlDrop(channel, "Atest", errors = FALSE) ## max is 15000 for varchar and char colspec <- list(character="varchar(1000)", double="double", integer="integer", logical="varchar(5)") sqlSave(channel, Atest, typeInfo = colspec) sqlColumns(channel, "Atest") sqlFetch(channel, "Atest") sqlUpdate(channel, Btest, "Atest", index = "rn") sqlFetch(channel, "Atest") sqlDrop(channel, "Atest") varspec <- "character(500)"; names(varspec) <- "x" sqlSave(channel, Atest, varTypes = varspec) sqlColumns(channel, "Atest") sqlFetch(channel, "Atest") sqlDrop(channel, "Atest") dates <- as.character(seq(as.Date("2004-01-01"), by="week", length=10)) times <- paste(1:10, "05", "00", sep=":") dt <- as.POSIXct(paste(dates, times)) Dtest <- data.frame(dates, dt, logi=c(TRUE, NA, FALSE, FALSE, FALSE)) varspec <- c("date", "timestamp", "varchar(5)") names(varspec) <- names(Dtest) sqlDrop(channel, "Dtest", errors = FALSE) sqlSave(channel, Dtest, varTypes = varspec) sqlColumns(channel, "Dtest") sqlFetch(channel, "Dtest") sqlDrop(channel, "Dtest", errors = FALSE) sqlSave(channel, Dtest, varTypes = varspec, fast = FALSE) sqlColumns(channel, "Dtest") sqlFetch(channel, "Dtest") sqlDrop(channel, "Dtest") sqlDrop(channel, "hills test", errors = FALSE) sqlSave(channel, hills, "hills test", verbose=TRUE) sqlUpdate(channel, hills[11:15,], "hills test", verbose=TRUE, fast=TRUE) sqlFetch(channel, "hills test") sqlDrop(channel, "hills test") sqlSave(channel, hills, "hills test", verbose=TRUE, fast=FALSE) sqlUpdate(channel, hills[11:15,], "hills test", verbose=TRUE, fast=FALSE) sqlDrop(channel, "hills test") sqlTables(channel, catalog="", schema="", tableName="", tableType="%") # sqlQuery(channel, "create schema test2") sqlQuery(channel, "SELECT * FROM information_schema.schemata") sqlSave(channel, women, "test2.women") sqlTables(channel, tableType="TABLE") sqlTables(channel, schema="test2") sqlDrop(channel, "test2.women") close(channel) RODBC/tests/hills.xls0000644000176000001440000003700013013621651014136 0ustar ripleyusersࡱ>  s \pRipley Ba==x<L;%8X@"1TArial1TArial1TArial1TArial1TArial""#,##0;\-""#,##0""#,##0;[Red]\-""#,##0""#,##0.00;\-""#,##0.00#""#,##0.00;[Red]\-""#,##0.005*0_-""* #,##0_-;\-""* #,##0_-;_-""* "-"_-;_-@_-,)'_-* #,##0_-;\-* #,##0_-;_-* "-"_-;_-@_-=,8_-""* #,##0.00_-;\-""* #,##0.00_-;_-""* "-"??_-;_-@_-4+/_-* #,##0.00_-;\-* #,##0.00_-;_-* "-"??_-;_-@_-[$-809]dd\ mmmm\ yyyyyyyy\-mm\-dd;@ dd/mm/yyyy;@ hh:mm:ss;@                + ) , *    ` hills 2women,V  hills2;#  hills3; #  hills4; #  hills5;## new_hills; " newhills; ## newhills1;# newhills2;# newhills3;# newhills4;## newhills5; # tests;2 women; womwn;`i~distclimbttimerownamesheightweight123456789101112131415\ Hicc s  $   dMbP?_*+%"??U$        @P@h|?0@@@@@ @J@@@б@ @@V-"O@ @d@SMR@0@L@9vi@@@".B@ @@=@ @P@C@ <@h@ MbXh@ @@@Ѱ@ #@0@@P@@@@/$F@@p@+:@$@p@R@,@0@ X@@u@@@@@nj1@@@jtH@@@r@@ @p@̥@@0@/$G@@ @+1@@@+ٮ2@@@@d;O7:@@@Cl7A@@@x&<@@X@@I@@@@^@$@0@Zd;OeU@Dl*((((((((((((((((( !"# @@ /$1@@!2@P@He@"@@@#4@@#-c@ <(>@7 s    dMbP?_*+%&A Page &P"P??U         M@\@ M@@]@ N@^@  N@^@  O@_@  O@ `@  P@`@  @P@`@  P@`a@  P@a@  Q@@b@  @Q@b@  Q@@c@ Q@c@ R@d@$,*$$$$$$$$$$$$$$>@7 Oh+'0@H`p Brian RipleyRipleyMicrosoft Excel@LTW)@ ,՜.+,0 PXx  University of Oxford' hillswomenwomen  Worksheets Named Ranges Root Entry FWorkbookSummaryInformation( DocumentSummaryInformation8RODBC/src/0000755000176000001440000000000013073621042011720 5ustar ripleyusersRODBC/src/config.h.win0000644000176000001440000000311213013621651014127 0ustar ripleyusers/* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the header file. */ #define HAVE_SQLEXT_H 1 /* Define to 1 if the system has the type `SQLLEN'. */ #define HAVE_SQLLEN 1 /* Define to 1 if the system has the type `SQLULEN'. */ #define HAVE_SQLULEN 1 /* Define to 1 if you have the header file. */ #define HAVE_SQL_H 1 /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the version of this package. */ #undef PACKAGE_VERSION /* The size of a `long', as computed by sizeof. */ #define SIZEOF_LONG 8 /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS RODBC/src/config.h.in0000644000176000001440000000320013013621651013736 0ustar ripleyusers/* src/config.h.in. Generated from configure.ac by autoheader. */ /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the header file. */ #undef HAVE_SQLEXT_H /* Define to 1 if the system has the type `SQLLEN'. */ #undef HAVE_SQLLEN /* Define to 1 if the system has the type `SQLULEN'. */ #undef HAVE_SQLULEN /* Define to 1 if you have the header file. */ #undef HAVE_SQL_H /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the version of this package. */ #undef PACKAGE_VERSION /* The size of a `long', as computed by sizeof. */ #undef SIZEOF_LONG /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS RODBC/src/RODBC.c0000644000176000001440000013255313073621042012726 0ustar ripleyusers/* * RODDC/src/RODBC.c * M. Lapsley Copyright (C) 1999-2002 * B. D. Ripley Copyright (C) 2002-2017 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * A copy of the GNU General Public License is available at * http://www.r-project.org/Licenses/ */ /* RODBC low level interface * */ #include "config.h" #include #include #include #include #include #include #ifdef WIN32 # include # undef ERROR /* enough of the internals of graphapp objects to allow us to find the handle of the RGui main window */ typedef struct objinfo { int kind, refcount; HANDLE handle; } *window; __declspec(dllimport) window RConsole; #else # include #endif #include #include /* for INT_MAX */ #define MAX_CHANNELS 1000 #include #include #include #include #ifdef ENABLE_NLS #include #define _(String) dgettext ("RODBC", String) #define gettext_noop(String) String #else #define _(String) (String) #define gettext_noop(String) String #endif #define my_min(a,b) ((a < b)?a:b) #define COLMAX 256 #ifndef SQL_NO_DATA # define SQL_NO_DATA_FOUND /* for iODBC */ #endif #define NCOLS thisHandle->nColumns /* save some column space for typing*/ #define NROWS thisHandle->nRows /* For 64-bit ODBC, Microsoft did some redefining, see http://msdn.microsoft.com/library/default.asp?url=/library/en-us/odbc/htm/dasdkodbcoverview_64bit.asp Some people think this corresponded to increasing the version to 3.52, but none of MinGW, unixODBC or iodbc seem to have done so. Given that, how do we know what these mean? MinGW[-w64]: if _WIN64 is defined, they are 64-bit, otherwise (unsigned) long. unixODBC: if SIZEOF_LONG == 8 && BUILD_REAL_64_BIT_MODE they are 64-bit. In applications, SIZEOF_LONG == 8 is determined by if defined(__alpha) || defined(__sparcv9) || defined(__LP64__) We have no way of knowing if BUILD_REAL_64_BIT_MODE was defined, but Debian which does define also modifies the headers. iobdc: if _WIN64 is defined, they are 64-bit Otherwise, they are (unsigned) long. */ #ifndef HAVE_SQLLEN #define SQLLEN SQLINTEGER #endif #ifndef HAVE_SQLULEN #define SQLULEN SQLUINTEGER #endif /* Note that currently we will allocate large buffers for long char types whatever rows_at_time is. */ #define MAX_ROWS_FETCH 1024 typedef struct cols { SQLCHAR ColName[256]; SQLSMALLINT NameLength; SQLSMALLINT DataType; SQLULEN ColSize; SQLSMALLINT DecimalDigits; SQLSMALLINT Nullable; char *pData; int datalen; SQLDOUBLE RData [MAX_ROWS_FETCH]; SQLREAL R4Data[MAX_ROWS_FETCH]; SQLINTEGER IData [MAX_ROWS_FETCH]; SQLSMALLINT I2Data[MAX_ROWS_FETCH]; SQLLEN IndPtr[MAX_ROWS_FETCH]; } COLUMNS; typedef struct mess { SQLCHAR *message; struct mess *next; } SQLMSG; typedef struct rodbcHandle { SQLHDBC hDbc; /* connection handle */ SQLHSTMT hStmt; /* statement handle */ SQLLEN nRows; /* number of rows and columns in result set */ SQLSMALLINT nColumns; int channel; /* as stored on the R-level object */ int id; /* ditto */ int useNRows; /* value of believeNRows */ /* entries used to bind data for result sets and updates */ COLUMNS *ColData; /* this will be allocated as an array */ int nAllocated; /* how many cols were allocated */ SQLUINTEGER rowsFetched; /* use to indicate the number of rows fetched */ SQLUINTEGER rowArraySize; /* use to indicate the number of rows we expect back */ SQLUINTEGER rowsUsed; /* for when we fetch more than we need */ SQLMSG *msglist; /* root of linked list of messages */ SEXP extPtr; /* address of external pointer for this channel, so we can clear it */ } RODBCHandle, *pRODBCHandle; static unsigned int nChannels = 0; /* number of channels opened in session */ static pRODBCHandle opened_handles[MAX_CHANNELS+1]; static SQLHENV hEnv=NULL; /* forward declarations */ static void geterr(pRODBCHandle thisHandle); static void errorFree(SQLMSG *node); static void errlistAppend(pRODBCHandle thisHandle, const char *string); static int cachenbind(pRODBCHandle thisHandle, int nRows); /* Error messages */ static char err_SQLAllocStmt[]=gettext_noop("[RODBC] ERROR: Could not SQLAllocStmt"); /* called at first connection or first listing of data sources */ static void odbcInit(void) { SQLRETURN retval; if(!hEnv) { retval = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv); if(retval == SQL_SUCCESS || retval == SQL_SUCCESS_WITH_INFO) { SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER) SQL_OV_ODBC3, SQL_IS_INTEGER); } else error(_("[RODBC] ERROR: Could not SQLAllocEnv")); } } /* called from .onUnload */ SEXP RODBCTerm(void) { if(!hEnv) SQLFreeHandle(SQL_HANDLE_ENV, hEnv); return R_NilValue; } /* called before SQL queries (indirect and direct) */ static void clearresults(pRODBCHandle thisHandle) { if(thisHandle->hStmt) { (void)SQLFreeStmt(thisHandle->hStmt, SQL_CLOSE); (void)SQLFreeHandle(SQL_HANDLE_STMT, thisHandle->hStmt); thisHandle->hStmt = NULL; } errorFree(thisHandle->msglist); thisHandle->msglist=NULL; } SEXP RODBCclearresults(SEXP chan) { clearresults(R_ExternalPtrAddr(chan)); return R_NilValue; } /********************************************** * CONNECT * returns channel no in stat * or -1 on error * saves connect data in handles[channel] * * ***************************************/ static void chanFinalizer(SEXP ptr); #define buf1_len 8096 SEXP RODBCDriverConnect(SEXP connection, SEXP id, SEXP useNRows, SEXP ReadOnly) { SEXP ans; SQLSMALLINT tmp1; SQLRETURN retval; SQLCHAR buf1[buf1_len]; pRODBCHandle thisHandle; PROTECT(ans = allocVector(INTSXP, 1)); INTEGER(ans)[0] = -1; if(!isString(connection)) { warning(_("[RODBC] ERROR:invalid connection argument")); UNPROTECT(1); return ans; } thisHandle = Calloc(1, RODBCHandle); ++nChannels; odbcInit(); retval = SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &thisHandle->hDbc); if(retval == SQL_SUCCESS || retval == SQL_SUCCESS_WITH_INFO) { if(asLogical(ReadOnly)) SQLSetConnectAttr(thisHandle->hDbc, SQL_ATTR_ACCESS_MODE, (SQLPOINTER) SQL_MODE_READ_ONLY, 0); retval = SQLDriverConnect(thisHandle->hDbc, #ifdef WIN32 RConsole ? RConsole->handle : NULL, #else NULL, #endif /* This loses the const, but although the declaration is not (const SQLCHAR *), it should be. */ (SQLCHAR *) translateChar(STRING_ELT(connection, 0)), SQL_NTS, (SQLCHAR *) buf1, (SQLSMALLINT) buf1_len, &tmp1, #ifdef WIN32 RConsole ? SQL_DRIVER_COMPLETE : SQL_DRIVER_NOPROMPT #else SQL_DRIVER_NOPROMPT #endif ); if(retval == SQL_SUCCESS || retval == SQL_SUCCESS_WITH_INFO) { SEXP constr, ptr; ptr = R_MakeExternalPtr(thisHandle, install("RODBC_channel"), R_NilValue); PROTECT(ptr); R_RegisterCFinalizerEx(ptr, chanFinalizer, TRUE); PROTECT(constr = allocVector(STRSXP, 1)); SET_STRING_ELT(constr, 0, mkChar((char *)buf1)); thisHandle->nColumns = -1; thisHandle->channel = nChannels; thisHandle->useNRows = asInteger(useNRows); thisHandle->id = asInteger(id); thisHandle->extPtr = ptr; /* return the channel no */ INTEGER(ans)[0] = nChannels; /* and the connection string as an attribute */ setAttrib(ans, install("connection.string"), constr); setAttrib(ans, install("handle_ptr"), ptr); /* Rprintf("opening %d (%p, %p)\n", nChannels, ptr, thisHandle); */ if(nChannels <= MAX_CHANNELS) opened_handles[nChannels] = thisHandle; UNPROTECT(3); return ans; } else { if (retval == SQL_ERROR) { SQLCHAR state[6], msg[1000]; SQLSMALLINT buffsize=1000, msglen, i=1; SQLINTEGER code; while(1) { retval = SQLGetDiagRec(SQL_HANDLE_DBC, thisHandle->hDbc, i++, state, &code, msg, buffsize, &msglen); if(retval == SQL_NO_DATA_FOUND) break; warning(_("[RODBC] ERROR: state %s, code %d, message %s"), state, code, msg); } } else warning(_("[RODBC] ERROR: Could not SQLDriverConnect")); (void)SQLFreeHandle(SQL_HANDLE_DBC, thisHandle->hDbc); } } else { warning(_("[RODBC] ERROR: Could not SQLAllocConnect")); } UNPROTECT(1); return ans; } /********************************************************** * * QUERY * run the query on channel pointed to by chan * cache rols and cols returned in handles[channel] * cache col descriptor data in handles[channel].ColData * return -1 in stat on error or 1 * *****************************************************/ SEXP RODBCQuery(SEXP chan, SEXP query, SEXP sRows) { pRODBCHandle thisHandle = R_ExternalPtrAddr(chan); SQLRETURN res; int nRows = asInteger(sRows), stat = 1; const char *cquery; if(nRows == NA_INTEGER || nRows < 1) nRows = 1; clearresults(thisHandle); res = SQLAllocHandle(SQL_HANDLE_STMT, thisHandle->hDbc, &thisHandle->hStmt); if( res != SQL_SUCCESS && res != SQL_SUCCESS_WITH_INFO ) { errlistAppend(thisHandle, err_SQLAllocStmt); stat = -1; } else { cquery = translateChar(STRING_ELT(query, 0)); /* another case of a missing 'const' */ res = SQLExecDirect(thisHandle->hStmt, (SQLCHAR *) translateChar(STRING_ELT(query, 0)), SQL_NTS); if( res != SQL_SUCCESS && res != SQL_SUCCESS_WITH_INFO ) { char *message = Calloc(strlen(cquery)+50, char); sprintf(message, "[RODBC] ERROR: Could not SQLExecDirect '%s'", cquery); geterr(thisHandle); errlistAppend(thisHandle, message); (void)SQLFreeHandle(SQL_HANDLE_STMT, thisHandle->hStmt); thisHandle->hStmt = NULL; stat = -1; } else stat = cachenbind(thisHandle, nRows); } return ScalarInteger(stat); } #define success_or_failure(message) \ if( res != SQL_SUCCESS && res != SQL_SUCCESS_WITH_INFO ) {\ geterr(thisHandle);\ (void)SQLFreeHandle(SQL_HANDLE_STMT, thisHandle->hStmt);\ thisHandle->hStmt = NULL;\ errlistAppend(thisHandle, message);\ stat = -1;\ } else stat = cachenbind(thisHandle, 1); /**************************************************** * * get primary key * * *************************************************/ SEXP RODBCPrimaryKeys(SEXP chan, SEXP table, SEXP cat, SEXP schem) { int stat = 1; pRODBCHandle thisHandle = R_ExternalPtrAddr(chan); SQLRETURN res; const char *catalog = NULL, *schema = NULL; SQLSMALLINT len1 = 0, len2 = 0; clearresults(thisHandle); res = SQLAllocHandle(SQL_HANDLE_STMT, thisHandle->hDbc, &thisHandle->hStmt); if( res != SQL_SUCCESS && res != SQL_SUCCESS_WITH_INFO ) { errlistAppend(thisHandle, err_SQLAllocStmt); stat = -1; } else { if(TYPEOF(cat) == STRSXP && LENGTH(cat)) { catalog = translateChar(STRING_ELT(cat, 0)); len1 = (SQLSMALLINT) strlen(catalog); } if(TYPEOF(schem) == STRSXP && LENGTH(schem)) { schema = translateChar(STRING_ELT(schem, 0)); len2 = (SQLSMALLINT) strlen(schema); } /* another case of a missing 'const' */ res = SQLPrimaryKeys( thisHandle->hStmt, (SQLCHAR *) catalog, len1, (SQLCHAR *) schema, len2, (SQLCHAR *) translateChar(STRING_ELT(table, 0)), SQL_NTS); success_or_failure(_("[RODBC] ERROR: Failure in SQLPrimary keys")); } return ScalarInteger(stat); } /******************************************** * * Get column data * * ********************************/ SEXP RODBCColumns(SEXP chan, SEXP table, SEXP cat, SEXP schem, SEXP sLiteral) { int stat = 1; pRODBCHandle thisHandle = R_ExternalPtrAddr(chan); SQLRETURN res; const char *catalog = NULL, *schema = NULL; int literal; SQLSMALLINT len1 = 0, len2 = 0; clearresults(thisHandle); res = SQLAllocHandle(SQL_HANDLE_STMT, thisHandle->hDbc, &thisHandle->hStmt); if( res != SQL_SUCCESS && res != SQL_SUCCESS_WITH_INFO ) { errlistAppend(thisHandle, err_SQLAllocStmt); stat = -1; } else { if(TYPEOF(cat) == STRSXP && LENGTH(cat)) { catalog = translateChar(STRING_ELT(cat, 0)); len1 = (SQLSMALLINT) strlen(catalog); } if(TYPEOF(schem) == STRSXP && LENGTH(schem)) { schema = translateChar(STRING_ELT(schem, 0)); len2 = (SQLSMALLINT) strlen(schema); } literal = asLogical(sLiteral); if(literal == NA_LOGICAL) literal = 0; if(literal) res = SQLSetStmtAttr(thisHandle->hStmt, SQL_ATTR_METADATA_ID, (SQLPOINTER) SQL_TRUE, SQL_IS_UINTEGER); /* another case of a missing 'const' */ res = SQLColumns( thisHandle->hStmt, (SQLCHAR *) catalog, len1, (SQLCHAR *) schema, len2, (SQLCHAR *) translateChar(STRING_ELT(table, 0)), SQL_NTS, NULL, 0); success_or_failure(_("[RODBC] ERROR: Failure in SQLColumns")); } return ScalarInteger(stat); } SEXP RODBCSpecialColumns(SEXP chan, SEXP table, SEXP cat, SEXP schem) { int stat = 1; pRODBCHandle thisHandle = R_ExternalPtrAddr(chan); SQLRETURN res; const char *catalog = NULL, *schema = NULL; SQLSMALLINT len1 = 0, len2 = 0; clearresults(thisHandle); res = SQLAllocHandle(SQL_HANDLE_STMT, thisHandle->hDbc, &thisHandle->hStmt); if( res != SQL_SUCCESS && res != SQL_SUCCESS_WITH_INFO ) { errlistAppend(thisHandle, err_SQLAllocStmt); stat = -1; } else { if(TYPEOF(cat) == STRSXP && LENGTH(cat)) { catalog = translateChar(STRING_ELT(cat, 0)); len1 = (SQLSMALLINT) strlen(catalog); } if(TYPEOF(schem) == STRSXP && LENGTH(schem)) { schema = translateChar(STRING_ELT(schem, 0)); len2 = (SQLSMALLINT) strlen(schema); } /* another case of a missing 'const' */ res = SQLSpecialColumns( thisHandle->hStmt, SQL_BEST_ROWID, (SQLCHAR *) catalog, len1, (SQLCHAR *) schema, len2, (SQLCHAR *) translateChar(STRING_ELT(table, 0)), SQL_NTS, SQL_SCOPE_TRANSACTION, SQL_NULLABLE); success_or_failure(_("[RODBC] ERROR: Failure in SQLSpecialColumns")); } return ScalarInteger(stat); } /***************************************************** * * get Table data * * ***************************************/ SEXP RODBCTables(SEXP chan, SEXP cat, SEXP schem, SEXP name, SEXP type, SEXP sLiteral) { pRODBCHandle thisHandle = R_ExternalPtrAddr(chan); SQLRETURN res; const char *catalog = NULL, *schema = NULL, *tName = NULL, *tType = NULL; int stat = 1, literal; SQLSMALLINT len1 = 0, len2 = 0, len3 = 0, len4 = 0; clearresults(thisHandle); res = SQLAllocHandle(SQL_HANDLE_STMT, thisHandle->hDbc, &thisHandle->hStmt); if( res != SQL_SUCCESS && res != SQL_SUCCESS_WITH_INFO ) { errlistAppend(thisHandle, err_SQLAllocStmt); stat = -1; } else { if(TYPEOF(cat) == STRSXP && LENGTH(cat)) { catalog = translateChar(STRING_ELT(cat, 0)); len1 = (SQLSMALLINT) strlen(catalog); } if(TYPEOF(schem) == STRSXP && LENGTH(schem)) { schema = translateChar(STRING_ELT(schem, 0)); len2 = (SQLSMALLINT) strlen(schema); } if(TYPEOF(name) == STRSXP && LENGTH(name)) { tName = translateChar(STRING_ELT(name, 0)); len3 = (SQLSMALLINT) strlen(tName); } if(TYPEOF(type) == STRSXP && LENGTH(type)) { tType = translateChar(STRING_ELT(type, 0)); len4 = (SQLSMALLINT) strlen(tType); } literal = asLogical(sLiteral); if(literal == NA_LOGICAL) literal = 0; if(literal) res = SQLSetStmtAttr(thisHandle->hStmt, SQL_ATTR_METADATA_ID, (SQLPOINTER) SQL_TRUE, SQL_IS_UINTEGER); res = SQLTables(thisHandle->hStmt, (SQLCHAR *) catalog, len1, (SQLCHAR *) schema, len2, (SQLCHAR *) tName, len3, (SQLCHAR *) tType, len4); success_or_failure(_("[RODBC] ERROR: SQLTables failed")); } return ScalarInteger(stat); } /***************************************************** * * get Type Info * * ***************************************/ SEXP RODBCTypeInfo(SEXP chan, SEXP ptype) { pRODBCHandle thisHandle = R_ExternalPtrAddr(chan); short type; SQLRETURN res; int stat = TRUE; clearresults(thisHandle); res = SQLAllocHandle(SQL_HANDLE_STMT, thisHandle->hDbc, &thisHandle->hStmt); if( res != SQL_SUCCESS && res != SQL_SUCCESS_WITH_INFO ) { errlistAppend(thisHandle, err_SQLAllocStmt); stat = FALSE; } else { switch(asInteger(ptype)){ case 0: type = SQL_ALL_TYPES; break; /* all */ case 1: type = SQL_CHAR; break; case 2: type = SQL_VARCHAR; break; case 3: type = SQL_REAL; break; case 4: type = SQL_DOUBLE; break; case 5: type = SQL_INTEGER; break; case 6: type = SQL_SMALLINT; break; case 7: type = SQL_TYPE_TIMESTAMP; break; case 8: type = SQL_FLOAT; break; case 9: type = SQL_BIT; break; case 10: type = SQL_WCHAR; break; case 11: type = SQL_WVARCHAR; break; case 12: type = SQL_DATE; break; case 13: type = SQL_TIME; break; case 14: type = SQL_BINARY; break; case 15: type = SQL_VARBINARY; break; case 16: case 17: type = SQL_LONGVARBINARY; break; default: type = SQL_ALL_TYPES; } res = SQLGetTypeInfo(thisHandle->hStmt, type); success_or_failure(_("[RODBC] ERROR: SQLTables failed")); } return ScalarLogical(stat); } SEXP RODBCGetInfo(SEXP chan) { SEXP ans; int i; pRODBCHandle thisHandle = R_ExternalPtrAddr(chan); char buf[1000]; SQLSMALLINT nbytes; SQLRETURN retval; SQLSMALLINT InfoTypes[] = {SQL_DBMS_NAME, SQL_DBMS_VER, SQL_DRIVER_ODBC_VER, SQL_DATA_SOURCE_NAME, SQL_DRIVER_NAME, SQL_DRIVER_VER, SQL_ODBC_VER, SQL_SERVER_NAME}; /* Rprintf("using (%p, %p)\n", chan, thisHandle); */ PROTECT(ans = allocVector(STRSXP, 8)); for (i = 0; i < LENGTH(ans); i++) { retval = SQLGetInfo(thisHandle->hDbc, InfoTypes[i], buf, (SQLSMALLINT)1000, &nbytes); if( retval != SQL_SUCCESS && retval != SQL_SUCCESS_WITH_INFO ) { geterr(thisHandle); SET_STRING_ELT(ans, i, mkChar("error")); break; } else SET_STRING_ELT(ans, i, mkChar(buf)); } UNPROTECT(1); return ans; } static void cachenbind_free(pRODBCHandle thisHandle) { SQLUSMALLINT i; if(thisHandle->ColData) { for (i = 0; i < thisHandle->nAllocated; i++) if(thisHandle->ColData[i].pData) Free(thisHandle->ColData[i].pData); Free(thisHandle->ColData); thisHandle->ColData = NULL; /* to be sure */ } } #define BIND(type, buf, size) \ retval = SQLBindCol(thisHandle->hStmt, i+1, type,\ thisHandle->ColData[i].buf, size,\ thisHandle->ColData[i].IndPtr);\ break; /* ******************************************* * * Common column cache and bind for query-like routines * This is used to bind the columns for all queries that * produce a result set, which is uses by RODBCFetchRows. * * *******************************************/ /* returns 1 for success, -1 for failure */ static int cachenbind(pRODBCHandle thisHandle, int nRows) { SQLUSMALLINT i; SQLRETURN retval; /* Now cache the number of columns, rows */ retval = SQLNumResultCols(thisHandle->hStmt, &NCOLS); if( retval != SQL_SUCCESS && retval != SQL_SUCCESS_WITH_INFO ) { /* assume this is not an error but that no rows found */ NROWS = 0; return 1 ; } retval = SQLRowCount(thisHandle->hStmt, &NROWS); if( retval != SQL_SUCCESS && retval != SQL_SUCCESS_WITH_INFO ) { geterr(thisHandle); errlistAppend(thisHandle, _("[RODBC] ERROR: SQLRowCount failed")); goto error; } /* Allocate storage for ColData array, first freeing what was there before */ cachenbind_free(thisHandle); thisHandle->ColData = Calloc(NCOLS, COLUMNS); /* this allocates Data as zero */ thisHandle->nAllocated = NCOLS; /* attempt to set the row array size */ thisHandle->rowArraySize = my_min(nRows, MAX_ROWS_FETCH); /* passing unsigned integer values via casts is a bad idea. But here double casting works because long and a pointer are the same size on all relevant platforms (since Win64 is not relevant). */ retval = SQLSetStmtAttr(thisHandle->hStmt, SQL_ATTR_ROW_ARRAY_SIZE, (SQLPOINTER) (unsigned long) thisHandle->rowArraySize, 0 ); if (retval != SQL_SUCCESS) thisHandle->rowArraySize = 1; thisHandle->rowsUsed = 0; /* Set pointer to report number of rows fetched */ if (thisHandle->rowArraySize != 1) { retval = SQLSetStmtAttr(thisHandle->hStmt, SQL_ATTR_ROWS_FETCHED_PTR, &thisHandle->rowsFetched, 0); if (retval != SQL_SUCCESS) { thisHandle->rowArraySize = 1; SQLSetStmtAttr(thisHandle->hStmt, SQL_ATTR_ROW_ARRAY_SIZE, (SQLPOINTER) 1, 0 ); } } nRows = thisHandle->rowArraySize; /* step through each col and cache metadata: cols are numbered from 1! */ for (i = 0; i < NCOLS; i++) { retval = SQLDescribeCol(thisHandle->hStmt, i+1, thisHandle->ColData[i].ColName, 256, &thisHandle->ColData[i].NameLength, &thisHandle->ColData[i].DataType, &thisHandle->ColData[i].ColSize, &thisHandle->ColData[i].DecimalDigits, &thisHandle->ColData[i].Nullable); if( retval != SQL_SUCCESS && retval != SQL_SUCCESS_WITH_INFO ) { geterr(thisHandle); errlistAppend(thisHandle, _("[RODBC] ERROR: SQLDescribeCol failed")); goto error; } /* now bind the col to its data buffer */ /* MSDN say the BufferLength is ignored for fixed-size types, but this is not so for UnixODBC */ /* We could add other types here, in particular SQL_C_USHORT SQL_C_ULONG (map to double) SQL_C_BIT SQL_C_WCHAR (map to UTF-8) */ switch(thisHandle->ColData[i].DataType) { case SQL_DOUBLE: BIND(SQL_C_DOUBLE, RData, sizeof(double)); case SQL_REAL: BIND(SQL_C_FLOAT, R4Data, sizeof(float)); case SQL_INTEGER: BIND(SQL_C_SLONG, IData, sizeof(int)); case SQL_SMALLINT: BIND(SQL_C_SSHORT, I2Data, sizeof(short)); case SQL_BINARY: case SQL_VARBINARY: case SQL_LONGVARBINARY: { /* should really use SQLCHAR (unsigned) */ SQLLEN datalen = thisHandle->ColData[i].ColSize; thisHandle->ColData[i].datalen = datalen; thisHandle->ColData[i].pData = Calloc(nRows * (datalen + 1), char); BIND(SQL_C_BINARY, pData, datalen); } default: { SQLLEN datalen = thisHandle->ColData[i].ColSize; if (datalen <= 0 || datalen < COLMAX) datalen = COLMAX; /* sanity check as the reports are sometimes unreliable */ if (datalen > 65535) datalen = 65535; thisHandle->ColData[i].pData = Calloc(nRows * (datalen + 1), char); thisHandle->ColData[i].datalen = datalen; BIND(SQL_C_CHAR, pData, datalen); } } if( retval != SQL_SUCCESS && retval != SQL_SUCCESS_WITH_INFO ) { geterr(thisHandle); errlistAppend(thisHandle, _("[RODBC] ERROR: SQLBindCol failed")); goto error; } } return 1; error: (void)SQLFreeStmt(thisHandle->hStmt, SQL_CLOSE); (void)SQLFreeHandle(SQL_HANDLE_STMT, thisHandle->hStmt); thisHandle->hStmt = NULL; return -1; } /***************************************/ SEXP RODBCNumCols(SEXP chan) { pRODBCHandle thisHandle = R_ExternalPtrAddr(chan); if(NCOLS == -1) errlistAppend(thisHandle, _("[RODBC] No results available")); return ScalarInteger((int) NCOLS); } #define ROWSNA (SQLLEN) -1 static SEXP mkRaw(char *ptr, unsigned int len) { SEXP ans = allocVector(RAWSXP, len); memcpy(RAW(ans), ptr, len); return ans; } SEXP RODBCFetchRows(SEXP chan, SEXP max, SEXP bs, SEXP nas, SEXP believeNRows) { int stat = 1, i, j, blksize, nc, n, row; int maximum = asInteger(max); pRODBCHandle thisHandle = R_ExternalPtrAddr(chan); int useNRows = asLogical(believeNRows) != 0; int buffsize = asInteger(bs); SEXP data, names, ans; SQLRETURN retval; nc = NCOLS; PROTECT(ans = allocVector(VECSXP, 2)); /* create answer [0] = data, [1]=stat */ if(!useNRows || !thisHandle->useNRows) NROWS = ROWSNA; if(nc == 0) stat = -2; if(nc == -1) { errlistAppend(thisHandle, _("[RODBC] No results available")); stat = -1; } if(stat < 0 || nc == 0) { if(NROWS == 0) errlistAppend(thisHandle, _("No Data")); PROTECT(data = allocVector(VECSXP, 0)); } else { /* NCOLS > 0 */ PROTECT(data = allocVector(VECSXP, nc)); if(NROWS == ROWSNA) { if(maximum) blksize = maximum; else { maximum = INT_MAX; blksize = (buffsize < 100) ? 100: buffsize; } } else { if(!maximum || maximum > NROWS) maximum = NROWS; blksize = maximum; } for(i = 0; i < nc; i++) { switch(thisHandle->ColData[i].DataType) { case SQL_DOUBLE: case SQL_REAL: SET_VECTOR_ELT(data, i, allocVector(REALSXP, blksize)); break; case SQL_INTEGER: case SQL_SMALLINT: SET_VECTOR_ELT(data, i, allocVector(INTSXP, blksize)); break; case SQL_BINARY: case SQL_VARBINARY: case SQL_LONGVARBINARY: SET_VECTOR_ELT(data, i, allocVector(VECSXP, blksize)); break; default: SET_VECTOR_ELT(data, i, allocVector(STRSXP, blksize)); } } for(j = 1; j <= maximum; ) { if(j > blksize) { blksize *= 2; for (i = 0; i < nc; i++) SET_VECTOR_ELT(data, i, lengthgets(VECTOR_ELT(data, i), blksize)); } if(thisHandle->rowsUsed == 0L || thisHandle->rowsUsed >= thisHandle->rowsFetched) { if (thisHandle->rowArraySize == 1) { retval = SQLFetch(thisHandle->hStmt); thisHandle->rowsFetched = 1; } else /* this will update thisHandle->rowsFetched */ retval = SQLFetchScroll(thisHandle->hStmt, SQL_FETCH_NEXT, 0); if(retval != SQL_SUCCESS && retval != SQL_SUCCESS_WITH_INFO) break; thisHandle->rowsUsed = 0; /* SQL_SUCCESS_WITH_INFO if char column(s) truncated */ if(retval == SQL_SUCCESS_WITH_INFO) { SQLCHAR sqlstate[6], msg[SQL_MAX_MESSAGE_LENGTH]; SQLINTEGER NativeError; SQLSMALLINT MsgLen; if(SQLError(hEnv, thisHandle->hDbc, thisHandle->hStmt, sqlstate, &NativeError, msg, (SQLSMALLINT)sizeof(msg), &MsgLen) == SQL_SUCCESS) { if(strcmp((char *)sqlstate, "O1004") == 0) warning(_("character data truncated in column '%s'"), (char *)thisHandle->ColData[i].ColName); } } } for(row = thisHandle->rowsUsed; row < thisHandle->rowsFetched && j <= maximum; j++, row++) { thisHandle->rowsUsed++; if(j > blksize) { blksize *= 2; for (i = 0; i < nc; i++) SET_VECTOR_ELT(data, i, lengthgets(VECTOR_ELT(data, i), blksize)); } for (i = 0; i < nc; i++) { SQLLEN len = thisHandle->ColData[i].IndPtr[row]; switch(thisHandle->ColData[i].DataType) { case SQL_DOUBLE: REAL(VECTOR_ELT(data, i))[j-1] = len == SQL_NULL_DATA ? NA_REAL : thisHandle->ColData[i].RData[row]; break; case SQL_REAL: REAL(VECTOR_ELT(data, i))[j-1] = len == SQL_NULL_DATA ? NA_REAL : (double) thisHandle->ColData[i].R4Data[row]; break; case SQL_INTEGER: INTEGER(VECTOR_ELT(data, i))[j-1] = len == SQL_NULL_DATA ? NA_INTEGER : thisHandle->ColData[i].IData[row]; break; case SQL_SMALLINT: INTEGER(VECTOR_ELT(data, i))[j-1] = len == SQL_NULL_DATA ? NA_INTEGER : (int) thisHandle->ColData[i].I2Data[row]; break; case SQL_BINARY: case SQL_VARBINARY: case SQL_LONGVARBINARY: { SEXP this = (len == SQL_NULL_DATA) ? allocVector(RAWSXP, 0) : mkRaw(thisHandle->ColData[i].pData + (thisHandle->ColData[i].datalen * row), len); SET_VECTOR_ELT(VECTOR_ELT(data, i), j-1, this); break; } default: SET_STRING_ELT(VECTOR_ELT(data, i), j-1, len == SQL_NULL_DATA ? STRING_ELT(nas, 0) : mkChar(thisHandle->ColData[i].pData + (thisHandle->ColData[i].datalen * row))); } } } } n = --j; if (n > 0 && !(maximum && n >= maximum)) { /* means 'no further results available' */ NCOLS = -1; thisHandle->rowsUsed = 0; /* safety */ /* so we can free the buffers */ cachenbind_free(thisHandle); } if (n < blksize) { /* need to trim vectors */ for (i = 0; i < nc; i++) SET_VECTOR_ELT(data, i, lengthgets(VECTOR_ELT(data, i), n)); } } SET_VECTOR_ELT(ans, 0, data); SET_VECTOR_ELT(ans, 1, ScalarInteger(stat)); PROTECT(names = allocVector(STRSXP, 2)); SET_STRING_ELT(names, 0, mkChar("data")); SET_STRING_ELT(names, 1, mkChar("stat")); SET_NAMES(ans, names); UNPROTECT(3); /* ans data names */ return ans; } /**********************************************************************/ SEXP RODBCColData(SEXP chan) { SEXP ans, names, type, ansnames; pRODBCHandle thisHandle = R_ExternalPtrAddr(chan); int i, nc; PROTECT(ans = allocVector(VECSXP, 2)); if(NCOLS == -1) errlistAppend(thisHandle, _("[RODBC] No results available")); nc = NCOLS; if(nc < 0) nc = 0; SET_VECTOR_ELT(ans, 0, names = allocVector(STRSXP, nc)); SET_VECTOR_ELT(ans, 1, type = allocVector(STRSXP, nc)); PROTECT(ansnames = allocVector(STRSXP, 2)); SET_STRING_ELT(ansnames, 0, mkChar("names")); SET_STRING_ELT(ansnames, 1, mkChar("type")); setAttrib(ans, R_NamesSymbol, ansnames); for (i = 0; i < nc; i++) { SET_STRING_ELT(names, i, mkChar((char *)thisHandle->ColData[i].ColName)); /* at the moment we only need to know if it is a date, datetime or other */ switch(thisHandle->ColData[i].DataType) { case SQL_CHAR: SET_STRING_ELT(type, i, mkChar("char")); break; case SQL_NUMERIC: SET_STRING_ELT(type, i, mkChar("numeric")); break; case SQL_DECIMAL: SET_STRING_ELT(type, i, mkChar("decimal")); break; case SQL_INTEGER: SET_STRING_ELT(type, i, mkChar("int")); break; case SQL_SMALLINT: SET_STRING_ELT(type, i, mkChar("smallint")); break; case SQL_FLOAT: SET_STRING_ELT(type, i, mkChar("float")); break; case SQL_REAL: SET_STRING_ELT(type, i, mkChar("real")); break; case SQL_DOUBLE: SET_STRING_ELT(type, i, mkChar("double")); break; case SQL_DATE: case SQL_TYPE_DATE: SET_STRING_ELT(type, i, mkChar("date")); break; case SQL_TIME: case SQL_TYPE_TIME: SET_STRING_ELT(type, i, mkChar("time")); break; case SQL_TIMESTAMP: case SQL_TYPE_TIMESTAMP: SET_STRING_ELT(type, i, mkChar("timestamp")); break; case SQL_VARCHAR: SET_STRING_ELT(type, i, mkChar("varchar")); break; case SQL_BINARY: case SQL_VARBINARY: case SQL_LONGVARBINARY: SET_STRING_ELT(type, i, mkChar("varchar")); break; case SQL_UNKNOWN_TYPE: default: SET_STRING_ELT(type, i, mkChar("unknown")); } } UNPROTECT(2); return ans; } /*********************************************************/ SEXP RODBCUpdate(SEXP chan, SEXP query, SEXP data, SEXP dataseq, SEXP params, SEXP test) { pRODBCHandle thisHandle = R_ExternalPtrAddr(chan); int rows, i, j, k, stat = 1, vtest = asInteger(test), nparams; int *sequence = INTEGER(dataseq); const char *cquery = translateChar(STRING_ELT(query, 0)); SQLRETURN res = 0; /* -Wall */ SEXP paramnames = VECTOR_ELT(params, 0); nparams = length(paramnames); NCOLS = nparams; clearresults(thisHandle); res = SQLAllocHandle(SQL_HANDLE_STMT, thisHandle->hDbc, &thisHandle->hStmt); if( res != SQL_SUCCESS && res != SQL_SUCCESS_WITH_INFO ) { errlistAppend(thisHandle, err_SQLAllocStmt); stat = -1; goto end; } res = SQLPrepare( thisHandle->hStmt, (SQLCHAR *) cquery, strlen(cquery) ); if( res != SQL_SUCCESS && res != SQL_SUCCESS_WITH_INFO ) { char *message = Calloc(strlen(cquery)+50, char); sprintf(message, "[RODBC] ERROR: Could not SQLPrepare '%s'", cquery); geterr(thisHandle); errlistAppend(thisHandle, message); (void)SQLFreeHandle(SQL_HANDLE_STMT, thisHandle->hStmt); thisHandle->hStmt = NULL; stat = -1; goto end; } /* Allocate storage for ColData array, first freeing what was there last */ cachenbind_free(thisHandle); thisHandle->ColData = Calloc(NCOLS, COLUMNS); /* this allocates Data as zero */ thisHandle->nAllocated = NCOLS; /* extract the column data */ for(j = 0; j < nparams; j++) { int tmp; strcpy((char *) thisHandle->ColData[j].ColName, translateChar(STRING_ELT(paramnames, j))); thisHandle->ColData[j].DataType = INTEGER(VECTOR_ELT(params, 1))[j]; thisHandle->ColData[j].ColSize = INTEGER(VECTOR_ELT(params, 2))[j]; /* I don't think this would be NA, but the code was here */ tmp = INTEGER(VECTOR_ELT(params, 3))[j]; thisHandle->ColData[j].DecimalDigits = (tmp == NA_INTEGER) ? 0 : tmp; if(vtest) Rprintf("Binding: '%s' DataType %d, ColSize %d\n", (char *) thisHandle->ColData[j].ColName, thisHandle->ColData[j].DataType, thisHandle->ColData[j].ColSize); switch(TYPEOF(VECTOR_ELT(data, sequence[j]))) { case REALSXP: /* It is possible that we are sending data to a DECIMAL or NUMERIC data type, when DecimalDigits would be relevant */ res = SQLBindParameter(thisHandle->hStmt, j+1, SQL_PARAM_INPUT, SQL_C_DOUBLE, thisHandle->ColData[j].DataType, thisHandle->ColData[j].ColSize, thisHandle->ColData[j].DecimalDigits, thisHandle->ColData[j].RData, 0, thisHandle->ColData[j].IndPtr); break; case INTSXP: res = SQLBindParameter(thisHandle->hStmt, j+1, SQL_PARAM_INPUT, SQL_C_SLONG, thisHandle->ColData[j].DataType, thisHandle->ColData[j].ColSize, thisHandle->ColData[j].DecimalDigits, thisHandle->ColData[j].IData, 0, thisHandle->ColData[j].IndPtr); break; default: { int datalen = thisHandle->ColData[j].ColSize; /* Why change here but not when sending the data? */ if (datalen <= 0) datalen = 1024; thisHandle->ColData[j].pData = Calloc(datalen+1, char); res = SQLBindParameter(thisHandle->hStmt, j+1, SQL_PARAM_INPUT, SQL_C_CHAR, thisHandle->ColData[j].DataType, datalen, thisHandle->ColData[j].DecimalDigits, thisHandle->ColData[j].pData, 0, thisHandle->ColData[j].IndPtr); } } if(res != SQL_SUCCESS && res != SQL_SUCCESS_WITH_INFO) { geterr(thisHandle); errlistAppend(thisHandle, _("[RODBC] SQLBindParameter failed")); geterr(thisHandle); stat = -1; goto end; } } /* now send the data */ if(vtest) Rprintf("Parameters:\n"); rows = LENGTH(VECTOR_ELT(data, 0)); for(i = 0; i < rows; i++) { for(j = 0; j < LENGTH(data); j++) { k = sequence[j]; /* get the right column */ switch(TYPEOF(VECTOR_ELT(data, k))) { case REALSXP: thisHandle->ColData[j].RData[0] = REAL(VECTOR_ELT(data, k))[i]; if(vtest) Rprintf("no: %d: %s %g/***/", j + 1, (char *) thisHandle->ColData[j].ColName, REAL(VECTOR_ELT(data, k))[i]); if(ISNAN(REAL(VECTOR_ELT(data, k))[i])) thisHandle->ColData[j].IndPtr[0] = SQL_NULL_DATA; else thisHandle->ColData[j].IndPtr[0] = SQL_NTS; break; case INTSXP: thisHandle->ColData[j].IData[0] = INTEGER(VECTOR_ELT(data, k))[i]; if(vtest) Rprintf("no: %d: %s %d/***/", j + 1, (char *) thisHandle->ColData[j].ColName, INTEGER(VECTOR_ELT(data, k))[i]); if(INTEGER(VECTOR_ELT(data, k))[i] == NA_INTEGER) thisHandle->ColData[j].IndPtr[0] = SQL_NULL_DATA; else thisHandle->ColData[j].IndPtr[0] = SQL_NTS; break; default: { const char *cData = translateChar(STRING_ELT(VECTOR_ELT(data, k), i)); int datalen = thisHandle->ColData[j].ColSize; strncpy(thisHandle->ColData[j].pData, cData, datalen); thisHandle->ColData[j].pData[datalen] = '\0'; if(strlen(cData) > datalen) warning(_("character data '%s' truncated to %d bytes in column '%s'"), cData, datalen, (char *) thisHandle->ColData[j].ColName); if(vtest) Rprintf("no: %d: %s %s/***/", j + 1, (char *) thisHandle->ColData[j].ColName, cData); if(STRING_ELT(VECTOR_ELT(data, k), i) == NA_STRING) thisHandle->ColData[j].IndPtr[0] = SQL_NULL_DATA; else thisHandle->ColData[j].IndPtr[0] = SQL_NTS; } } } if(vtest) Rprintf("\n"); if(vtest < 2) { res = SQLExecute(thisHandle->hStmt); if( res != SQL_SUCCESS && res != SQL_SUCCESS_WITH_INFO ) { errlistAppend(thisHandle, _("[RODBC] Failed exec in Update")); geterr(thisHandle); stat = -1; goto end; } } } end: /* free the buffers */ cachenbind_free(thisHandle); (void)SQLFreeStmt(thisHandle->hStmt, SQL_RESET_PARAMS); (void)SQLFreeHandle(SQL_HANDLE_STMT, thisHandle->hStmt); thisHandle->hStmt = NULL; return ScalarInteger(stat); } /************************************************ * * DISCONNECT * * **********************************************/ static int inRODBCClose(pRODBCHandle thisHandle) { int success = 1; SQLRETURN retval; /* Rprintf("closing %p\n", thisHandle); */ if(thisHandle->channel <= MAX_CHANNELS) opened_handles[thisHandle->channel] = NULL; retval = SQLDisconnect( thisHandle->hDbc ); if( retval != SQL_SUCCESS && retval != SQL_SUCCESS_WITH_INFO ) { /* was errlist_append, but errorlist is squashed before return! */ warning(_("[RODBC] Error in SQLDisconnect")); success = -1; } retval = SQLFreeHandle(SQL_HANDLE_DBC, thisHandle->hDbc); if( retval != SQL_SUCCESS && retval != SQL_SUCCESS_WITH_INFO ) { warning(_("[RODBC] Error in SQLFreeconnect")); success = -1; } cachenbind_free(thisHandle); errorFree(thisHandle->msglist); R_ClearExternalPtr(thisHandle->extPtr); Free(thisHandle); return success; } SEXP RODBCClose(SEXP chan) { return ScalarInteger( inRODBCClose(R_ExternalPtrAddr(chan))); } static void chanFinalizer(SEXP ptr) { if(!R_ExternalPtrAddr(ptr)) return; /* Rprintf("finalizing %p\n", R_ExternalPtrAddr(ptr)); */ warning(_("closing unused RODBC handle %d\n"), ((pRODBCHandle )R_ExternalPtrAddr(ptr))->channel); inRODBCClose(R_ExternalPtrAddr(ptr)); R_ClearExternalPtr(ptr); /* not really needed */ } SEXP RODBCCloseAll(void) { int i; for(i = 1; i <= my_min(nChannels, MAX_CHANNELS); i++) if(opened_handles[i]) inRODBCClose(opened_handles[i]); return R_NilValue; } /********************************************************** * * Some utility routines to build, count, read and free a linked list * of diagnostic record messages * This is implemented as a linked list against the possibility * of using SQLGetDiagRec which returns an unknown number of messages. * * Don't use while !SQL_NO_DATA 'cause iodbc does not support it *****************************************/ static void geterr(pRODBCHandle thisHandle) { SQLCHAR sqlstate[6], msg[SQL_MAX_MESSAGE_LENGTH]; SQLINTEGER NativeError; SQLSMALLINT i = 1, MsgLen; char message[SQL_MAX_MESSAGE_LENGTH+16]; SQLRETURN retval; while(1) { /* exit via break */ retval = SQLGetDiagRec(SQL_HANDLE_STMT, thisHandle->hStmt, i++, sqlstate, &NativeError, msg, sizeof(msg), &MsgLen); if(retval != SQL_SUCCESS && retval != SQL_SUCCESS_WITH_INFO) break; sprintf(message,"%s %d %s", sqlstate, (int)NativeError, msg); errlistAppend(thisHandle, message); // i++; } } /**************************************** * append to list */ /* Can't mix strdup and R's memory allocation */ static char *mystrdup(const char *s) { char *s2; s2 = Calloc(strlen(s) + 1, char); strcpy(s2, s); return s2; } static void errlistAppend(pRODBCHandle thisHandle, const char *string) { SQLMSG *root; SQLCHAR *buffer; /* do this strdup so that all the message chain can be freed*/ if((buffer = (SQLCHAR *) mystrdup(string)) == NULL) { REprintf("RODBC.c: Memory Allocation failure for message string\n"); return; } root = thisHandle->msglist; if(root) { while(root->message) { if(root->next) root = root->next; else break; } root->next = Calloc(1, SQLMSG); root = root->next; } else { root = thisHandle->msglist = Calloc(1, SQLMSG); } root->next = NULL; root->message = buffer; } /***************************************/ /* currently unused */ SEXP RODBCErrMsgCount(SEXP chan) { int i = 0; pRODBCHandle thisHandle = R_ExternalPtrAddr(chan); SQLMSG *root; root = thisHandle->msglist; if(root) { while(root->message) { i++; if(root->next) root=root->next; else break; } } return ScalarInteger(i); } /******************************/ SEXP RODBCGetErrMsg(SEXP chan) { SEXP ans; int i, num; pRODBCHandle thisHandle = R_ExternalPtrAddr(chan); SQLMSG *root; /* count the messages */ i = 0; root = thisHandle->msglist; if(root) { while(root->message) { i++; if(root->next) root = root->next; else break; } } num = i; i = 0; PROTECT(ans = allocVector(STRSXP, num)); root = thisHandle->msglist; if(root) { while(root->message) { SET_STRING_ELT(ans, i++, mkChar((char *)root->message)); if(root->next) root = root->next; else break; } } UNPROTECT(1); return ans; } /********/ SEXP RODBCClearError(SEXP chan) { pRODBCHandle thisHandle = R_ExternalPtrAddr(chan); errorFree(thisHandle->msglist); thisHandle->msglist = NULL; return R_NilValue; } /*********************/ static void errorFree(SQLMSG *node) { if(!node) return; if(node->next) errorFree(node->next); if(node) { Free(node->message); Free(node); node = NULL; } } /********************** * Check for valid channel since invalid * will cause segfault on most functions */ SEXP RODBCcheckchannel(SEXP chan, SEXP id) { SEXP ptr = getAttrib(chan, install("handle_ptr")); pRODBCHandle thisHandle = R_ExternalPtrAddr(ptr); return ScalarLogical(thisHandle && TYPEOF(ptr) == EXTPTRSXP && thisHandle->channel == asInteger(chan) && thisHandle->id == asInteger(id)); } /*********************** * Set connection auto-commit mode */ SEXP RODBCSetAutoCommit(SEXP chan, SEXP autoCommit) { pRODBCHandle thisHandle = R_ExternalPtrAddr(chan); int iAutoCommit = asLogical(autoCommit) != 0; int rc; if (!iAutoCommit) rc = SQLSetConnectAttr(thisHandle->hDbc, SQL_ATTR_AUTOCOMMIT, (SQLPOINTER) (unsigned long) SQL_AUTOCOMMIT_OFF, 0); else rc = SQLSetConnectAttr(thisHandle->hDbc, SQL_ATTR_AUTOCOMMIT, (SQLPOINTER) (unsigned long) SQL_AUTOCOMMIT_ON, 0); return ScalarInteger(rc); } /*********************** * Commit or rollback a transaction */ SEXP RODBCEndTran(SEXP chan, SEXP sCommit) { pRODBCHandle thisHandle = R_ExternalPtrAddr(chan); int rc; rc = SQLEndTran(SQL_HANDLE_DBC, thisHandle->hDbc, (asLogical(sCommit) != 0) ? SQL_COMMIT : SQL_ROLLBACK); return ScalarInteger(rc); } SEXP RODBCListDataSources(SEXP stype) { SEXP ans, nm; PROTECT_INDEX pidx, nidx; UWORD fDirection = SQL_FETCH_FIRST; SQLRETURN retval; SQLCHAR szDSN[SQL_MAX_DSN_LENGTH+1]; SQLCHAR szDescription[100]; char message[SQL_MAX_DSN_LENGTH+101]; int i = 0, ni = 100, type = asInteger(stype); odbcInit(); switch(type) { case 2: fDirection = SQL_FETCH_FIRST_USER; break; case 3: fDirection = SQL_FETCH_FIRST_SYSTEM; break; default: fDirection = SQL_FETCH_FIRST; break; } PROTECT_WITH_INDEX(ans = allocVector(STRSXP, ni), &pidx); PROTECT_WITH_INDEX(nm = allocVector(STRSXP, ni), &nidx); do { retval = SQLDataSources(hEnv, fDirection, (UCHAR *)szDSN, sizeof(szDSN), NULL, (UCHAR *)szDescription, sizeof(szDescription), NULL); if(retval == SQL_NO_DATA) break; if(retval != SQL_SUCCESS && retval != SQL_SUCCESS_WITH_INFO) { sprintf(message, "SQLDataSources returned: %d", retval); SET_STRING_ELT(ans, i, mkChar(message)); } else { SET_STRING_ELT(nm, i, mkChar((char *)szDSN)); SET_STRING_ELT(ans, i, mkChar((char *)szDescription)); } fDirection = SQL_FETCH_NEXT; i++; if(i >= ni - 1) { ni *= 2; REPROTECT(ans = lengthgets(ans, ni), pidx); REPROTECT(nm = lengthgets(nm, ni), nidx); } } while(retval == SQL_SUCCESS || retval == SQL_SUCCESS_WITH_INFO); REPROTECT(ans = lengthgets(ans, i), pidx); REPROTECT(nm = lengthgets(nm, i), nidx); setAttrib(ans, R_NamesSymbol, nm); UNPROTECT(2); return ans; } #include static const R_CallMethodDef CallEntries[] = { {"RODBCGetErrMsg", (DL_FUNC) &RODBCGetErrMsg, 1}, {"RODBCClearError", (DL_FUNC) &RODBCClearError, 1}, {"RODBCDriverConnect", (DL_FUNC) &RODBCDriverConnect, 4}, {"RODBCQuery", (DL_FUNC) &RODBCQuery, 3}, {"RODBCUpdate", (DL_FUNC) &RODBCUpdate, 6}, {"RODBCTables", (DL_FUNC) &RODBCTables, 6}, {"RODBCColumns", (DL_FUNC) &RODBCColumns, 5}, {"RODBCSpecialColumns", (DL_FUNC) &RODBCSpecialColumns, 4}, {"RODBCPrimaryKeys", (DL_FUNC) &RODBCPrimaryKeys, 4}, {"RODBCColData", (DL_FUNC) &RODBCColData, 1}, {"RODBCNumCols", (DL_FUNC) &RODBCNumCols, 1}, {"RODBCClose", (DL_FUNC) &RODBCClose, 1}, {"RODBCCloseAll", (DL_FUNC) &RODBCCloseAll, 0}, {"RODBCFetchRows", (DL_FUNC) &RODBCFetchRows, 5}, {"RODBCGetInfo", (DL_FUNC) &RODBCGetInfo, 1}, {"RODBCcheckchannel", (DL_FUNC) &RODBCcheckchannel, 2}, {"RODBCclearresults", (DL_FUNC) &RODBCclearresults, 1}, {"RODBCSetAutoCommit", (DL_FUNC) &RODBCSetAutoCommit, 2}, {"RODBCEndTran", (DL_FUNC) &RODBCEndTran, 2}, {"RODBCTypeInfo", (DL_FUNC) &RODBCTypeInfo, 2}, {"RODBCListDataSources", (DL_FUNC) &RODBCListDataSources, 1}, {"RODBCTerm", (DL_FUNC) &RODBCTerm, 0}, {NULL, NULL, 0} }; void R_init_RODBC(DllInfo *dll) { R_registerRoutines(dll, NULL, CallEntries, NULL, NULL); R_useDynamicSymbols(dll, FALSE); R_forceSymbols(dll, TRUE); } RODBC/src/Makevars.in0000644000176000001440000000005713073621042014023 0ustar ripleyusersPKG_CPPFLAGS=@RODBC_CPPFLAGS@ PKG_LIBS=@LIBS@ RODBC/src/Makevars.win0000644000176000001440000000004313073621042014205 0ustar ripleyusersPKG_CPPFLAGS=-I. PKG_LIBS=-lodbc32 RODBC/NAMESPACE0000644000176000001440000000150413013621651012350 0ustar ripleyusersuseDynLib(RODBC, .registration = TRUE, .fixes = "C_") importFrom(stats, runif) importFrom(utils, type.convert) export(getSqlTypeInfo, odbcClearError, odbcClose, odbcCloseAll, odbcConnect, odbcDataSources, odbcDriverConnect, odbcEndTran, odbcFetchRows, odbcGetErrMsg, odbcGetInfo, odbcQuery, odbcReConnect, odbcSetAutoCommit, odbcTables, odbcUpdate, setSqlTypeInfo, sqlClear, sqlColumns, sqlCopy, sqlCopyTable, sqlDrop, sqlFetch, sqlFetchMore, sqlGetResults, sqlPrimaryKeys, sqlQuery, sqlSave, sqlTables, sqlTypeInfo, sqlUpdate) S3method(close, RODBC) S3method(print, RODBC) S3method(format, "ODBC_binary") S3method(print, "ODBC_binary") if(tools:::.OStype() == "windows") { export(odbcConnectAccess, odbcConnectAccess2007, odbcConnectDbase, odbcConnectExcel, odbcConnectExcel2007) } RODBC/GPL-20000644000176000001440000004313313013621651011641 0ustar ripleyusers GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. RODBC/R/0000755000176000001440000000000013013621651011332 5ustar ripleyusersRODBC/R/win.R0000644000176000001440000000725513013621651012263 0ustar ripleyusers# file RODBC/R/win.R # copyright (C) 2002-2009 B. D. Ripley # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 or 3 of the License # (at your option). # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # http://www.r-project.org/Licenses/ # if(.Platform$OS.type == "windows") { ## FIXME: use grepl for is.abs in due course (R >= 2.9.0) full.path <- function(filename) { fn <- gsub("\\", "/", filename, fixed = TRUE) is.abs <- length(grep("^[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz]:|/", fn)) > 0L gsub("/", "\\", if(!is.abs) file.path(getwd(), filename) else filename, fixed = TRUE) } ## originally based on suggestions from xiao.gang.fan1@libertysurf.fr odbcConnectExcel <- function(xls.file, readOnly = TRUE, ...) { if (.Machine$sizeof.pointer > 4) stop("odbcConnectExcel is only usable with 32-bit Windows") con <- if(missing(xls.file)) "Driver={Microsoft Excel Driver (*.xls)};DriverId=790;Dbq=" else { fp <- full.path(xls.file) paste("Driver={Microsoft Excel Driver (*.xls)};DriverId=790;Dbq=", fp, ";DefaultDir=", dirname(fp), ";", sep = "") } if(!readOnly) con = paste(con, "ReadOnly=False", sep=";") odbcDriverConnect(con, tabQuote=c("[", "]"), ...) } odbcConnectExcel2007 <- function(xls.file, readOnly = TRUE, ...) { con <- if(missing(xls.file)) "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};Dbq=" else { fp <- full.path(xls.file) paste("Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};Dbq=", fp, ";DefaultDir=", dirname(fp), ";", sep = "") } if(!readOnly) con = paste(con, "ReadOnly=False", sep=";") odbcDriverConnect(con, tabQuote=c("[", "]"), ...) } odbcConnectAccess <- function(access.file, uid = "", pwd = "", ...) { if (.Machine$sizeof.pointer > 4) stop("odbcConnectAccess is only usable with 32-bit Windows") con <- if(missing(access.file)) "Driver={Microsoft Access Driver (*.mdb)};Dbq=" else paste("Driver={Microsoft Access Driver (*.mdb)};Dbq=", full.path(access.file), ";Uid=", uid, ";Pwd=", pwd, ";", sep="") odbcDriverConnect(con, ...) } odbcConnectAccess2007 <- function(access.file, uid = "", pwd = "", ...) { con <- if(missing(access.file)) "Driver={Microsoft Access Driver (*.mdb, *.accdb)};Dbq=" else paste("Driver={Microsoft Access Driver (*.mdb, *.accdb)};Dbq=", full.path(access.file), ";Uid=", uid, ";Pwd=", pwd, ";", sep="") odbcDriverConnect(con, ...) } odbcConnectDbase <- function(dbf.file, ...) { if (.Machine$sizeof.pointer > 4) warning("odbcConnectDbase is probably only usable with 32-bit Windows") con <- if(missing(dbf.file)) "Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=" else paste("Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=", dirname(full.path(dbf.file)), ";", sep="") odbcDriverConnect(con, tabQuote=c("[", "]"), ...) } } RODBC/R/RODBC.R0000644000176000001440000002461213013621651012313 0ustar ripleyusers# file RODBC/R/RODBC.R # copyright (C) 1999-2002 M. Lapsley # copyright (C) 2002-2016 B. D. Ripley # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 or 3 of the License # (at your option). # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # http://www.r-project.org/Licenses/ # # Low level wrappers for odbc driver # # # .onLoad <- function(libname, pkgname) { if(is.null(getOption("dec"))) options(dec = Sys.localeconv()["decimal_point"]) } .onUnload <- function(libpath) { odbcCloseAll() .Call(C_RODBCTerm) library.dynam.unload("RODBC", libpath) } odbcGetErrMsg <- function(channel) { if(!odbcValidChannel(channel)) stop("first argument is not an open RODBC channel") err <- .Call(C_RODBCGetErrMsg, attr(channel, "handle_ptr")) .Call(C_RODBCClearError, attr(channel, "handle_ptr")) return(err) } odbcClearError <- function(channel) { if(!odbcValidChannel(channel)) stop("first argument is not an open RODBC channel") .Call(C_RODBCClearError, attr(channel, "handle_ptr")) invisible() } odbcReConnect <- function(channel, ...) { if(!inherits(channel, "RODBC")) stop("Argument 'channel' must inherit from class RODBC") Call <- attr(channel, "call") dots <- list(...) if("uid" %in% names(dots)) { uid <- dots$uid; dots$uid <- NULL Call$Connection <- sub("UID=[^;]+($|;)", paste("UID=", uid, ";", sep=""), Call$connection) } if("pwd" %in% names(dots)) { pwd <- dots$pwd; dots$pwd <- NULL Call$connection <- sub("PWD=[^;]+($|;)", paste("PWD=", pwd, ";", sep=""), Call$connection) } if(length(dots)) Call[names(dots)] <- dots eval.parent(Call) } odbcConnect <- function (dsn, uid = "", pwd = "", ...) { Call <- match.call(); Call$uid <- Call$pwd <- NULL Call[[1]] <- quote(RODBC::odbcDriverConnect) st <- paste("DSN=", dsn, sep="") if(nchar(uid)) st <- paste(st, ";UID=", uid, sep="") if(nchar(pwd)) st <- paste(st, ";PWD=", pwd, sep="") Call[[2]] <- st; names(Call)[2] <- "" eval.parent(Call) } odbcDriverConnect <- function (connection = "", case = "nochange", believeNRows = TRUE, colQuote, tabQuote = colQuote, interpretDot = TRUE, DBMSencoding = "", rows_at_time = 100, readOnlyOptimize = FALSE) { id <- as.integer(1 + runif(1, 0, 1e5)) stat <- .Call(C_RODBCDriverConnect, as.character(connection), id, as.integer(believeNRows), as.logical(readOnlyOptimize)) if(stat < 0L) { warning("ODBC connection failed") return(stat) } Call <- match.call() res <- .Call(C_RODBCGetInfo, attr(stat, "handle_ptr")) isMySQL <- res[1L] == "MySQL" if(missing(colQuote)) colQuote <- ifelse(isMySQL, "`", '"') if(missing(case)) case <- switch(res[1L], "MySQL" = "mysql", "PostgreSQL" = "postgresql", "nochange") switch(case, toupper = case <- 1L, tolower = case <- 2L, postgresql = case <- 2L, nochange = case <- 0L, msaccess = case <- 0L, mysql = case <- ifelse(.Platform$OS.type == "windows", 2L, 0L), stop("Invalid case parameter: nochange | toupper | tolower | common db names") ) case <- switch(case+1L, "nochange", "toupper", "tolower") rows_at_time <- max(1, min(1024, rows_at_time)) cs <- attr(stat, "connection.string") if(grepl("PWD=", cs)) { attr(stat, "connection.string") <- sub("PWD=[^;]+($|;)", "PWD=******;", cs) Call$connection <- sub("PWD=[^;]+($|;)", "PWD=******;", connection) } structure(stat, class = "RODBC", case = case, id = id, believeNRows = believeNRows, colQuote = colQuote, tabQuote = tabQuote, interpretDot = interpretDot, encoding = DBMSencoding, rows_at_time = rows_at_time, isMySQL = isMySQL, call = Call) } odbcQuery <- function(channel, query, rows_at_time = attr(channel, "rows_at_time")) { if(!odbcValidChannel(channel)) stop("first argument is not an open RODBC channel") if(nchar(enc <- attr(channel, "encoding"))) query <- iconv(query, to=enc) .Call(C_RODBCQuery, attr(channel, "handle_ptr"), as.character(query), as.integer(rows_at_time)) } odbcUpdate <- function(channel, query, data, params, test = FALSE, verbose = FALSE, nastring = NULL) { if(!odbcValidChannel(channel)) stop("first argument is not an open RODBC channel") ## sanity checks! if(length(params) == 0L || nrow(params) == 0L) stop("no parameters, so nothing to update") if(nchar(enc <- attr(channel, "encoding"))) query <- iconv(query, to=enc) vflag <- 0 if(verbose) vflag <- 1 if(test) vflag <- 2 ## apply the name mangling that was applied when the table was created cnames <- mangleColNames(names(data)) cnames <- switch(attr(channel, "case"), nochange = cnames, toupper = toupper(cnames), tolower = tolower(cnames)) for(i in seq_along(data)) if(!is.numeric(data[[i]])) { data[[i]] <- as.character(data[[i]]) if(nchar(enc)) data[[i]] <- iconv(data[[i]], to = enc) } ## now map names: ds[i] is the data col to go with param i. ds <- match(params[[1]], cnames) if(any(is.na(ds))) stop("missing columns in 'data'") ## but pass 0-indexed version of ds .Call(C_RODBCUpdate, attr(channel, "handle_ptr"), as.character(query), data, ds-1L, params, as.integer(vflag)) } ## catalog, schema, tableName are 'pattern-value's ## IBM says % is special, and asks for all schemas or tableTypes to be listed. ## MSDN says there are values SQL_ALL_CATALOGS, SQL_ALL_SCHEMAS, ## SQL_ALL_TABLE_TYPES, but the headers define these as "%". ## tableType is a character vector containing one of more of ## "TABLE" "VIEW" "SYSTEM TABLE" "ALIAS" "SYNONYM" (may be single-quoted). ## http://publib.boulder.ibm.com/infocenter/dzichelp/v2r2/index.jsp?topic=/com.ibm.db29.doc.odbc/db2z_fntables.htm odbcTables <- function(channel, catalog = NULL, schema = NULL, tableName = NULL, tableType = NULL, literal = FALSE) { if(!odbcValidChannel(channel)) stop("first argument is not an open RODBC channel") tableType <- if(is.character(tableType) && length(tableType)) paste(tableType, collapse=",") else NULL .Call(C_RODBCTables, attr(channel, "handle_ptr"), catalog, schema, tableName, tableType, as.logical(literal)) } odbcColumns <- function(channel, table, catalog = NULL, schema = NULL, literal = FALSE) { if(!odbcValidChannel(channel)) stop("first argument is not an open RODBC channel") .Call(C_RODBCColumns, attr(channel, "handle_ptr"), as.character(table), catalog, schema, as.logical(literal)) } odbcSpecialColumns <- function(channel, table, catalog = NULL, schema = NULL) { if(!odbcValidChannel(channel)) stop("first argument is not an open RODBC channel") .Call(C_RODBCSpecialColumns, attr(channel, "handle_ptr"), as.character(table), catalog, schema) } odbcPrimaryKeys <- function(channel, table, catalog = NULL, schema = NULL) { if(!odbcValidChannel(channel)) stop("first argument is not an open RODBC channel") .Call(C_RODBCPrimaryKeys, attr(channel, "handle_ptr"), as.character(table), catalog, schema) } close.RODBC <- function(con, ...) invisible(ifelse(odbcClose(con), 0L, 1L)) odbcClose <- function(channel) { if(!odbcValidChannel(channel)) stop("argument is not an open RODBC channel") res <- .Call(C_RODBCClose, attr(channel, "handle_ptr")) if(res > 0) invisible(FALSE) else { warning(paste(odbcGetErrMsg(channel), sep="\n")) FALSE } invisible(TRUE) } odbcCloseAll <- function() { .Call(C_RODBCCloseAll) invisible() } odbcFetchRows <- function(channel, max = 0, buffsize = 1000, nullstring = NA_character_, believeNRows = TRUE) { if(!odbcValidChannel(channel)) stop("first argument is not an open RODBC channel") .Call(C_RODBCFetchRows, attr(channel, "handle_ptr"), max, buffsize, as.character(nullstring), believeNRows) } odbcCaseFlag <- function (channel) { if(!odbcValidChannel(channel)) stop("first argument is not an open RODBC channel") attr(channel, "case") } odbcGetInfo <- function(channel) { if(!odbcValidChannel(channel)) stop("argument is not an open RODBC channel") res <- .Call(C_RODBCGetInfo, attr(channel, "handle_ptr")) names(res) <- c("DBMS_Name", "DBMS_Ver", "Driver_ODBC_Ver", "Data_Source_Name", "Driver_Name", "Driver_Ver", "ODBC_Ver", "Server_Name") res } odbcValidChannel <- function(channel) { inherits(channel, "RODBC") && is.integer(channel) && .Call(C_RODBCcheckchannel, channel, attr(channel, "id")) > 0 } odbcClearResults <- function(channel) { if(!odbcValidChannel(channel)) stop("first argument is not an open RODBC channel") .Call(C_RODBCclearresults, attr(channel, "handle_ptr")) invisible() } print.RODBC <- function(x, ...) { con <- strsplit(attr(x, "connection.string"), ";", fixed = TRUE)[[1L]] case <- paste("case=", attr(x, "case"), sep="") cat("RODBC Connection ", as.vector(x), "\nDetails:\n ", sep = "") cat(case, con, sep="\n ") invisible(x) } odbcSetAutoCommit <- function(channel, autoCommit = TRUE) { if(!odbcValidChannel(channel)) stop("first argument is not an open RODBC channel") .Call(C_RODBCSetAutoCommit, attr(channel, "handle_ptr"), autoCommit) } odbcEndTran <- function(channel, commit = TRUE) { if(!odbcValidChannel(channel)) stop("first argument is not an open RODBC channel") .Call(C_RODBCEndTran, attr(channel, "handle_ptr"), commit) } odbcDataSources <- function(type = c("all", "user", "system")) { type <- match.arg(type) type <- match(type, c("all", "user", "system")) .Call(C_RODBCListDataSources, type) } RODBC/R/sql.R0000644000176000001440000010274713013621651012267 0ustar ripleyusers# file RODBC/R/sql.R # copyright (C) 1999-2002 M. Lapsley # copyright (C) 2002-2009 B. D. Ripley # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 or 3 of the License # (at your option). # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # http://www.r-project.org/Licenses/ # # high level functions for sql database access # ########################################### sqlClear <- function(channel, sqtable, errors = TRUE) { if(!odbcValidChannel(channel)) stop("first argument is not an open RODBC channel") if(missing(sqtable)) stop("missing argument 'sqtable'") dbname <- odbcTableExists(channel, sqtable, abort = errors) if(!length(dbname)) { if(errors) stop("table ", sQuote(sqtable), " not found"); return(invisible(-1L)); } res <- sqlQuery(channel, paste ("TRUNCATE TABLE", dbname), errors = errors) ## res <- sqlQuery(channel, paste ("DELETE FROM", dbname), errors = errors) if(errors && (!length(res) || identical(res, "No Data") )) invisible() else invisible(res) } sqlDrop <- function(channel, sqtable, errors = TRUE) { if(!odbcValidChannel(channel)) stop("first argument is not an open RODBC channel") if(missing(sqtable)) stop("missing argument 'sqtable'") dbname <- odbcTableExists(channel, sqtable, abort = errors) if(!length(dbname)) { if(errors) stop("table ", sQuote(sqtable), " not found"); return(invisible(-1L)); } res <- sqlQuery(channel, paste ("DROP TABLE", dbname), errors = errors) ## Windows and SQLite were returning character(0) if(errors && (!length(res) || identical(res, "No Data") )) invisible() else invisible(res) } sqlFetch <- function (channel, sqtable, ..., colnames = FALSE, rownames = TRUE) { if(!odbcValidChannel(channel)) stop("first argument is not an open RODBC channel") if(missing(sqtable)) stop("missing argument 'sqtable'") dbname <- odbcTableExists(channel, sqtable) ans <- sqlQuery(channel, paste("SELECT * FROM", dbname), ...) if(is.data.frame(ans)) { if(is.logical(colnames) && colnames) { colnames(ans) <- as.character(as.matrix(ans[1L, ])) ans <- ans[-1L, ] } ## FIXME case-mangling? if(is.logical(rownames) && rownames) rownames <- "rownames" if(is.character(rownames)) { cn <- names(ans) if (!is.na(rn <- match(rownames, cn))) { row.names(ans) <- as.character(ans[, rn]) ans <- ans[, -rn, drop = FALSE] } } } ans } sqlFetchMore <- function (channel, ..., colnames = FALSE, rownames = TRUE) { if(!odbcValidChannel(channel)) stop("first argument is not an open RODBC channel") ans <- sqlGetResults(channel, ...) if(is.data.frame(ans)) { if(is.logical(colnames) && colnames) { colnames(ans) <- as.character(as.matrix(ans[1L, ])) ans <- ans[-1L, ] } ## FIXME case-mangling? if(is.logical(rownames) && rownames) rownames <- "rownames" if(is.character(rownames)) { cn <- names(ans) if (!is.na(rn <- match(rownames, cn))) { row.names(ans) <- as.character(ans[, rn]) ans <- ans[, -rn, drop = FALSE] } } } ans } sqlCopy <- function(channel, query, destination, destchannel = channel, verbose = FALSE, errors = TRUE, ...) { if(!odbcValidChannel(channel)) stop("first argument is not an open RODBC channel") if(!odbcValidChannel(destchannel)) stop("destination argument is not an open RODBC channel") if( missing(query) || missing(destination)) stop("missing parameter") if(length(destination) != 1L) stop("destination should be a name") dataset <- sqlQuery(channel, query, errors = errors) sqlSave(destchannel, dataset, destination, verbose=verbose, ...) } sqlCopyTable <- function (channel, srctable, desttable, destchannel = channel, verbose = FALSE, errors = TRUE) { if(!odbcValidChannel(channel)) stop("first argument is not an open RODBC channel") if(!odbcValidChannel(destchannel)) stop("destination argument is not an open RODBC channel") if(missing(srctable) || missing(desttable)) stop("missing parameter") dtablename <- as.character(desttable) if(length(dtablename) != 1L) stop(sQuote(dtablename), " should be a name") stablename <- as.character(srctable) if(!length(odbcTableExists(channel, stablename, abort = errors))) return(invisible(-1L)); query <- sqltablecreate(channel, dtablename, coldata = sqlColumns(channel, stablename), keys = sqlPrimaryKeys(channel, stablename)) if(verbose) cat("Query: ", query, "\n", sep = "") sqlQuery(destchannel, query, errors=errors) } ###################################################### # sqlSave # save into table if exists # if table not compatible delete it # create new table. sqlSave <- function(channel, dat, tablename = NULL, append = FALSE, rownames = TRUE, colnames = FALSE, verbose = FALSE, safer = TRUE, addPK = FALSE, typeInfo, varTypes, fast = TRUE, test = FALSE, nastring = NULL) { if(!odbcValidChannel(channel)) stop("first argument is not an open RODBC channel") if(missing(dat)) stop("missing parameter") if(!is.data.frame(dat)) stop("should be a data frame") if(is.null(tablename)) tablename <- if(length(substitute(dat)) == 1) as.character(substitute(dat)) else as.character(substitute(dat)[[2L]]) if(length(tablename) != 1L) stop(sQuote(tablename), " should be a name") switch(attr(channel, "case"), nochange = {}, toupper={tablename <- toupper(tablename) colnames(dat) <- toupper(colnames(dat))}, tolower={tablename <- tolower(tablename) colnames(dat) <- tolower(colnames(dat))} ) keys <- -1 ## move row labels into data frame ## FIXME case-mangling? if(is.logical(rownames) && rownames) rownames <- "rownames" if(is.character(rownames)) { dat <- cbind(row.names(dat), dat) names(dat)[1L] <- rownames if(addPK) { keys <- vector("list", 4L) keys[[4L]] <- rownames } } ## ? move col names into dataframe (needed to preserve case) if(is.logical(colnames) && colnames) { ## this is to deal with type conversions as.data.frame(rbind(colnames(dat), as.matrix(dat)))->dat } ## find out if table already exists dbname <- odbcTableExists(channel, tablename, abort = FALSE) if(length(dbname)) { if(!append) { if(safer) stop("table ", sQuote(tablename), " already exists") ## zero table, return if no perms query <- paste ("DELETE FROM", dbname) if(verbose) cat("Query: ", query, "\n", sep = "") res <- sqlQuery(channel, query, errors = FALSE) if(is.numeric(res) && res == -1L) # No Data is fine stop(paste(odbcGetErrMsg(channel), collapse="\n")) } if(sqlwrite(channel, tablename, dat, verbose=verbose, fast=fast, test=test, nastring=nastring) == -1) { ##cannot write: try dropping table query <- paste("DROP TABLE", dbname) if(verbose) { cat("sqlwrite returned ", odbcGetErrMsg(channel), "\n", sep = "\n") cat("Query: ", query, "\n", sep = "") } if(safer) stop("unable to append to table ", sQuote(tablename)) res <- sqlQuery(channel, query, errors = FALSE) if(is.numeric(res) && res == -1L) # No Data is fine stop(paste(odbcGetErrMsg(channel), collapse="\n")) } else { #success return (invisible(1L)) } } # we get here if: # - no table # - table with invalid columns # No permissions for existing table should have aborted above types <- sapply(dat, typeof) facs <- sapply(dat, is.factor) isreal <- (types == "double") isint <- (types == "integer") & !facs islogi <- (types == "logical") colspecs <- rep("varchar(255)", length(dat)) if(!missing(typeInfo) || !is.null(typeInfo <- typesR2DBMS[[odbcGetInfo(channel)[1L]]])) { colspecs <- rep(typeInfo$character[1L], length(dat)) colspecs[isreal] <- typeInfo$double[1L] colspecs[isint] <- typeInfo$integer[1L] colspecs[islogi] <- typeInfo$logical[1L] } else { typeinfo <- sqlTypeInfo(channel, "all", errors = FALSE) if(is.data.frame(typeinfo)) { ## Now change types as appropriate. if(any(isreal)) { realinfo <- sqlTypeInfo(channel, "double")[, 1L] if(length(realinfo) > 0L) { if(length(realinfo) > 1L) { # more than one match nm <- match("double", tolower(realinfo)) if(!is.na(nm)) realinfo <- realinfo[nm] } colspecs[isreal] <- realinfo[1L] } else { realinfo <- sqlTypeInfo(channel, "float")[, 1L] if(length(realinfo) > 0L) { if(length(realinfo) > 1L) { # more than one match nm <- match("float", tolower(realinfo)) if(!is.na(nm)) realinfo <- realinfo[nm] } colspecs[isreal] <- realinfo[1L] } } } if(any(isint)) { intinfo <- sqlTypeInfo(channel, "integer")[, 1L] if(length(intinfo) > 0L) { if(length(intinfo) > 1) { # more than one match nm <- match("integer", tolower(intinfo)) if(!is.na(nm)) intinfo <- intinfo[nm] } colspecs[isint] <- intinfo[1L] } } } } names(colspecs) <- names(dat) if(!missing(varTypes)) { if(!length(nm <- names(varTypes))) warning("argument 'varTypes' has no names and will be ignored") OK <- names(colspecs) %in% nm colspecs[OK] <- varTypes[names(colspecs)[OK]] notOK <- !(nm %in% names(colspecs)) if(any(notOK)) warning("column(s) ", paste(nm[notOK], collapse=", "), " 'dat' are not in the names of 'varTypes'") } ## CREATE TABLE does not allow sheet names, so cannot make an ## exception for Excel here query <- sqltablecreate(channel, tablename, colspecs = colspecs, keys = keys) if(verbose) cat("Query: ", query, "\n", sep = "") ##last chance: let it die if fails res <- sqlQuery(channel, query, errors = FALSE) if(is.numeric(res) && res == -1) # No Data is fine stop(paste(odbcGetErrMsg(channel), collapse="\n")) if(sqlwrite(channel, tablename, dat, verbose=verbose, fast=fast, test=test, nastring=nastring) < 0) { err <- odbcGetErrMsg(channel) msg <- paste(err, collapse="\n") if("missing column name" %in% err) msg <- paste(msg, "Check case conversion parameter in odbcConnect", sep="\n") stop(msg) } invisible(1L) } mangleColNames <- function(colnames) gsub("[^[:alnum:]_]+", "", colnames) quoteColNames <- function(channel, colnames) { quotes <- attr(channel, "colQuote") if(length(quotes) >= 2L) paste(quotes[1L], colnames, quotes[2L], sep="") else if(length(quotes) == 1L) paste(quotes, colnames, quotes, sep="") else colnames } quoteTabNames <- function(channel, tablename) { if(attr(channel, "interpretDot") && grepl(".", tablename, fixed = TRUE)) return(tablename) quotes <- attr(channel, "tabQuote") if(length(quotes) >= 2L) paste(quotes[1L], tablename, quotes[2L], sep="") else if(length(quotes) == 1L) paste(quotes, tablename, quotes, sep="") else tablename } ################################################ # utility function # write to table with name data ############################################## sqlwrite <- function (channel, tablename, mydata, test = FALSE, fast = TRUE, nastring = NULL, verbose = FALSE) { if(!odbcValidChannel(channel)) stop("first argument is not an open RODBC channel") colnames <- as.character(sqlColumns(channel, tablename)[4L][, 1L]) ## match the transform in tablecreate (get rid of invalid chars in col names) colnames <- mangleColNames(colnames) cnames <- paste(quoteColNames(channel, colnames), collapse = ", ") dbname <- quoteTabNames(channel, tablename) if(!fast) { ## this doesn't do a good enough job with logicals. for(i in seq_along(mydata)) if(is.logical(mydata[[i]])) mydata[[i]] <- as.character(mydata[[i]]) data <- as.matrix(mydata) if(nchar(enc<- attr(channel, "encoding")) && is.character(data)) data <- iconv(data, to = enc) colnames(data) <- colnames ## quote character and date columns cdata <- sub("\\([[:digit:]]*\\)", "", sqlColumns(channel, tablename)[, "DATA_TYPE"]) tdata <- sqlTypeInfo(channel) nr <- match(cdata, tdata[, 2L]) tdata <- as.matrix(tdata[nr, 4:5]) ## quote all unkown types. tdata[is.na(nr), ] <- "'" for(cn in seq_along(cdata)) { td <- as.vector(tdata[cn,]) if(is.na(td[1L])) next if(identical(td, rep("'", 2L))) data[, cn] <- gsub("'", "''", data[, cn]) data[, cn] <- paste(td[1L], data[, cn], td[2L], sep = "") } data[is.na(mydata)] <- if(is.null(nastring)) "NULL" else nastring[1L] for (i in 1L:nrow(data)) { query <- paste("INSERT INTO", dbname, "(", cnames, ") VALUES (", paste(data[i, colnames], collapse = ", "), ")") if(verbose) cat("Query: ", query, "\n", sep = "") if(odbcQuery(channel, query) < 0) return(-1L) } } else { query <- paste("INSERT INTO", dbname, "(", cnames, ") VALUES (", paste(rep("?", ncol(mydata)), collapse=","), ")") if(verbose) cat("Query: ", query, "\n", sep = "") coldata <- sqlColumns(channel, tablename)[c(4L,5L,7L,9L)] if(any(is.na(m <- match(colnames, coldata[, 1])))) return(-1L) ## sometimes drivers get this wrong e.g. sqliteodbc if(any(notOK <- (coldata[,3L] == 0L))) { types <- coldata[notOK, 2] tdata <- sqlTypeInfo(channel) coldata[notOK, 3L] <- tdata[match(types, tdata[, 2L]), 3L] } if(odbcUpdate(channel, query, mydata, coldata[m, ], test = test, verbose = verbose, nastring = nastring) < 0) return(-1L) } return(invisible(1L)) } # # Generate create statement # parameter coldata is output from sqlColumns # parameter keys is output from sqlPrimaryKeys (and might be -1) # NB: some systems do not support sqlPKs ############################################## sqltablecreate <- function (channel, tablename, coldata = NULL, colspecs, keys = -1) { create <- paste("CREATE TABLE", quoteTabNames(channel, tablename), " (") if(!is.null(coldata)) { # called from sqlCopyTable j <- nrow(coldata) colnames <- as.character(coldata[, 4L]) for (i in 1L:j) { ## 4 =rowname, 6 coltype, 7 col size, 11 ? nullable if(coldata[i, 11] == 1) { null <- " NULL" null <- "" # Kludge for Oracle till bug fixed } else { null <- " NOT NULL" } colsize <- if(coldata[i, 7L] == 65535) " " else paste("(", coldata[i,7], ") ", sep="") create <- paste(create, quoteColNames(channel, mangleColNames(colnames[i])), " ", coldata[i, 6L], colsize, null, sep="") if(!is.numeric(keys)) { if(as.character(keys[[4L]]) == colnames[i]) create <- paste(create, "PRIMARY KEY") } if(i < j) create <- paste(create, ", ") } } else { # called from sqlSave colnames <- quoteColNames(channel, mangleColNames(names(colspecs))) entries <- paste(colnames, colspecs) if(is.list(keys)) { keyname <- as.character(keys[[4L]]) key <- match(keyname, names(colspecs)) entries[key] <- paste(entries[key], "NOT NULL PRIMARY KEY") } create <- paste(create, paste(entries, collapse = ", "), sep="") } create <- paste(create, ")", sep="") create } ############################################### # ##### Query Functions # Return a data frame according to as.is # ############################################### sqlTables <- function(channel, errors = FALSE, as.is = TRUE, catalog = NULL, schema = NULL, tableName = NULL, tableType = NULL, literal = FALSE) { if(!odbcValidChannel(channel)) stop("first argument is not an open RODBC channel") stat <- odbcTables(channel, catalog = catalog, schema = schema, tableName = tableName, tableType = tableType, literal = literal) if(stat < 0L) { if(errors) { if(stat == -2L) stop("invalid channel") else return(odbcGetErrMsg(channel)) } else return(invisible(-1L)) } else return(sqlGetResults(channel, as.is = as.is)) } sqlColumns <- function (channel, sqtable, errors = FALSE, as.is = TRUE, special = FALSE, catalog = NULL, schema = NULL, literal = FALSE) { if(!odbcValidChannel(channel)) stop("first argument is not an open RODBC channel") if(length(sqtable) != 1) stop(sQuote(sqtable), " should be a name") if(is.null(catalog) && is.null(schema)) { dbname <- odbcTableExists(channel, sqtable, FALSE, FALSE) if(!length(dbname)) { caseprob <- "" if(is.data.frame(nm <- sqlTables(channel)) && tolower(sqtable) %in% tolower(nm[,3])) caseprob <- "\nCheck case parameter in odbcConnect" stop(sQuote(sqtable), ": table not found on channel", caseprob) } if(grepl(".", dbname, fixed = TRUE)) { parts <- strsplit(dbname, ".", fixed = TRUE)[[1]] if(length(parts) > 2) stop("dot.dot.dot names are not supported") if(attr(channel, "isMySQL")) { ## This does not work for current drivers catalog <- parts[1] dbname <- parts[2] } else { schema <- parts[1] dbname <- parts[2] } } } else dbname <- switch(attr(channel, "case"), nochange = sqtable, toupper = toupper(sqtable), tolower = tolower(sqtable)) stat <- if(special) odbcSpecialColumns(channel, dbname, catalog, schema) else odbcColumns(channel, dbname, catalog, schema, literal) if(stat < 0L) { if(errors) { if(stat == -2L) stop("invalid channel") else return(odbcGetErrMsg(channel)) } else return(invisible(-1L)) } else return(sqlGetResults(channel, as.is = as.is)) } sqlPrimaryKeys <- function(channel, sqtable, errors = FALSE, as.is = TRUE, catalog = NULL, schema = NULL) { if(!odbcValidChannel(channel)) stop("first argument is not an open RODBC channel") if(length(sqtable) != 1) stop(sQuote(sqtable), " should be a name") if(is.null(catalog) && is.null(schema)) { dbname <- odbcTableExists(channel, sqtable, FALSE, FALSE) if(!length(dbname)) { caseprob <- "" if(is.data.frame(nm <- sqlTables(channel)) && tolower(sqtable) %in% tolower(nm[, 3L])) caseprob <- "\nCheck case parameter in odbcConnect" stop(sQuote(sqtable), ": table not found on channel", caseprob) } if(grepl(".", dbname, fixed = TRUE)) { parts <- strsplit(dbname, ".", fixed = TRUE)[[1]] if(length(parts) > 2) stop("dot.dot.dot names are not supported") if(attr(channel, "isMySQL")) { ## This does not work for current drivers catalog <- parts[1] dbname <- parts[2] } else { schema <- parts[1] dbname <- parts[2] } } } else dbname <- switch(attr(channel, "case"), nochange = sqtable, toupper = toupper(sqtable), tolower = tolower(sqtable)) stat <- odbcPrimaryKeys(channel, dbname, catalog, schema) if(stat < 0L) { if(errors) { if(stat == -2L) stop("invalid channel") else return(odbcGetErrMsg(channel)) } else return(invisible(-1L)) } else return(sqlGetResults(channel, as.is = as.is)) } sqlQuery <- function(channel, query, errors = TRUE, ..., rows_at_time) { if(!odbcValidChannel(channel)) stop("first argument is not an open RODBC channel") if(missing(query)) stop("missing argument 'query'") ## could argue that 'max' should restrict rows_at_time rows_at_time <- if(missing(rows_at_time)) attr(channel, "rows_at_time") else max(1, min(1024, rows_at_time)) stat <- odbcQuery(channel, query, rows_at_time) if(stat == -1L) { if(errors) return(odbcGetErrMsg(channel)) else return(invisible(stat)) } else return(sqlGetResults(channel, errors = errors, ...)) } sqlGetResults <- function (channel, as.is = FALSE, errors = FALSE, max = 0, buffsize = 1000, nullstring = NA_character_, na.strings = "NA", believeNRows = TRUE, dec = getOption("dec"), stringsAsFactors = default.stringsAsFactors()) { if(!odbcValidChannel(channel)) stop("first argument is not an open RODBC channel") as.df <- function(value, colnames) { for(i in seq_along(value)) if(is.list(value[[i]])) class(value[[i]]) <- "ODBC_binary" ## convert list to data frame class(value) <- "data.frame" names(value) <- make.unique(colnames) row.names(value) <- seq(along=value[[1L]]) value } cols <- .Call(C_RODBCNumCols, attr(channel, "handle_ptr")) ## FIXME: should this be <= 0L? if(cols < 0L) { if(errors) return("No data") else return(invisible(-1L)) } cData <- .Call(C_RODBCColData, attr(channel, "handle_ptr")) dbdata <- odbcFetchRows(channel, max = max, buffsize = buffsize, nullstring = nullstring, believeNRows = believeNRows) if(dbdata$stat < 0L) { if(errors) return(odbcGetErrMsg(channel)) else return(invisible(dbdata$stat)) } data <- as.df(dbdata$data, cData$names) if(nrow(data) > 0L) { cols <- ncol(data) enc <- attr(channel, "encoding") if(length(na.strings)) for (i in 1L:cols) if(is.character(data[,i])) data[data[,i] %in% na.strings, i] <- NA if(is.logical(as.is)) { as.is <- rep(as.is, length = cols) } else if(is.numeric(as.is)) { if(any(as.is < 1 | as.is > cols)) stop("invalid numeric 'as.is' expression") i <- rep(FALSE, cols) i[as.is] <- TRUE as.is <- i } else if(length(as.is) != cols) stop("'as.is' has the wrong length ", length(as.is), " != cols = ", cols) for (i in seq_len(cols)) { if(is.character(data[[i]]) && nchar(enc)) data[[i]] <- iconv(data[[i]], from = enc) if(as.is[i] || is.list(data[[i]])) next if(is.numeric(data[[i]])) next if(cData$type[i] == "date") data[[i]] <- as.Date(data[[i]]) else if(cData$type[i] == "timestamp") data[[i]] <- as.POSIXct(data[[i]]) else data[[i]] <- type.convert(as.character(data[[i]]), na.strings = na.strings, as.is = !stringsAsFactors, dec = dec) } } data } format.ODBC_binary <- print.ODBC_binary <- function(x, ...) sapply(x, function(x) paste(as.character(x), collapse="")) ################################################# sqlUpdate <- function(channel, dat, tablename = NULL, index = NULL, verbose = FALSE, test = FALSE, nastring = NULL, fast = TRUE) { if(!odbcValidChannel(channel)) stop("first argument is not an open RODBC channel") if(missing(dat)) stop("missing parameter") if(!is.data.frame(dat)) stop("should be a data frame or matrix") if(is.null(tablename)) tablename <- if(length(substitute(dat)) == 1L) as.character(substitute(dat)) else as.character(substitute(dat)[[2L]]) if(length(tablename) != 1L) stop(sQuote(tablename), " should be a name") dbname <- odbcTableExists(channel, tablename) ## test for missing values. cnames <- colnames(dat) ## match the transform in tablecreate (get rid of inval chars in col names) cnames <- mangleColNames(cnames) cnames <- switch(attr(channel, "case"), nochange = cnames, toupper = toupper(cnames), tolower = tolower(cnames)) ## get the column descriptor data for the rest of the table. ## This may or may not include the unique column depending ## on whether or not it is a special column. cdata <- sqlColumns(channel,tablename) coldata <- cdata[c(4L,5L,7L,9L)] if(is.character(index)) { intable <- index %in% coldata[ ,1L] if(any(!intable)) stop("index column(s) ", paste(index[!intable], collapse=" "), " not in database table") intable <- index %in% cnames if(any(!intable)) stop("index column(s) ", paste(index[!intable], collapse=" "), " not in data frame") indexcols <- index } else { haveKey <- FALSE ## identify the column(s) that is a unique row specifier along with ## its descriptor data. First try a primary key indexcols <- sqlPrimaryKeys(channel, tablename) if(!(is.numeric(indexcols) || nrow(indexcols) == 0L)) { ## have primary key(s) index <- as.character(indexcols[, 4L]) intable <- index %in% cnames if(any(intable)) { indexcols <- index[intable][1L] haveKey <- TRUE } } if(!haveKey){ ## try special columns indexcols <- sqlColumns(channel, tablename, special = TRUE) if(!(is.numeric(indexcols) || nrow(indexcols) == 0L)) { indexcols <- indexcols[c(2L,3L,5L,7L)] ## check that the unique column(s) are present in the dataframe indexflags <- indexcols[, 1L] %in% cnames if(all(indexflags)) { ## if a unique column is not in coldata bind it on incoldata <- indexcols[, 1L] %in% coldata[, 1L] if(any(!incoldata)) coldata <- rbind(coldata, indexcols[!incoldata]) indexcols <- as.character(indexcols[, 1L]) haveKey <- TRUE } } } if(!haveKey){ ## can we use a column 'rownames' as index column? m <- match("rownames", tolower(coldata[, 1L])) if(is.na(m)) stop("cannot update ", sQuote(tablename), " without unique column") indexcols <- coldata[m, 1L] dat <- cbind(row.names(dat), dat) names(dat)[1L] <- indexcols cnames <- c(indexcols, cnames) } } ## check that no columns are present in the df that are not in the table intable <- cnames %in% coldata[, 1L] if(any(!intable)) stop("data frame column(s) ", paste(cnames[!intable], collapse=" "), " not in database table") cn1 <- cnames[!cnames %in% indexcols] cn2 <- quoteColNames(channel, cn1) if(fast) { query <- paste("UPDATE", dbname, "SET") query <- paste(query, paste(paste(cn2, "=?", sep =""), collapse = ", ")) paramnames <- c(cn1, indexcols) if (length(indexcols)) { ind <- quoteColNames(channel, indexcols) query <- paste(query, "WHERE", paste(paste(ind, "=?", sep =""), collapse = " AND ")) } row.names(coldata) <- coldata[, 1L] paramdata <- coldata[paramnames, ] if(test | verbose) cat("Query: ", query, "\n", sep = "") stat <- odbcUpdate(channel, query, dat, paramdata, test = test, verbose = verbose, nastring = nastring) } else { data <- as.matrix(dat) if(nchar(enc <- attr(channel, "encoding")) && is.character(data)) data[] <- iconv(data, to = enc) ## we might have mangled and case-folded names on the database. colnames(data) <- cnames ## quote character etc columns cdata <- sub("\\([[:digit:]]*\\)", "", sqlColumns(channel, tablename)[, "TYPE_NAME"]) tdata <- sqlTypeInfo(channel) tdata <- as.matrix(tdata[match(cdata, tdata[, 1]), c(4,5)]) for(cn in seq_along(cdata)) { td <- as.vector(tdata[cn,]) if(is.na(td[1L])) next if(identical(td, rep("'", 2L))) data[, cn] <- gsub("'", "''", data[, cn]) data[, cn] <- paste(td[1L], data[, cn], td[2L], sep = "") } data[is.na(dat)] <- if(is.null(nastring)) "NULL" else nastring for (i in 1L:nrow(data)) { query <- paste("UPDATE", dbname, "SET") query <- paste(query, paste(paste(cn2, "=", data[i, cn1], sep =""), collapse = ", ")) if (length(indexcols)) { # will always be true. ind <- quoteColNames(channel, indexcols) query <- paste(query, "WHERE", paste(paste(ind, "=", data[i, indexcols], sep =""), collapse = " AND ")) } if(verbose) cat("Query: ", query, "\n", sep = "") if((stat <- odbcQuery(channel, query)) < 0L) break } } if(stat < 0L) stop(paste(odbcGetErrMsg(channel), sep="\n")) invisible(stat) } odbcTableExists <- function(channel, tablename, abort = TRUE, forQuery = TRUE, allowDot = attr(channel, "interpretDot")) { if(!odbcValidChannel(channel)) stop("first argument is not an open RODBC channel") if(length(tablename) != 1) stop(sQuote(tablename), " should be a name") tablename <- as.character(tablename) switch(attr(channel, "case"), nochange = {}, toupper = tablename <- toupper(tablename), tolower = tablename <- tolower(tablename) ) isExcel <- odbcGetInfo(channel)[1L] == "EXCEL" hasDot <- grepl(".", tablename, fixed = TRUE) if(allowDot && hasDot) { parts <- strsplit(tablename, ".", fixed = TRUE)[[1]] ## FIXME if(length(parts) > 2) ans <- FALSE else { res <- if(attr(channel, "isMySQL")) sqlTables(channel, catalog = parts[1], tableName = parts[2]) else sqlTables(channel, schema = parts[1], tableName = parts[2]) ans <- is.data.frame(res) && nrow(res) > 0 } } else if(!isExcel) { ## just ask about this name res <- sqlTables(channel, tableName = tablename) ans <- is.data.frame(res) && nrow(res) > 0 } else { res <- sqlTables(channel) tables <- stables <- if(is.data.frame(res)) res[, 3] else "" ## Excel appends a $ to worksheets, single-quotes non-standard names if(isExcel) { tables <- sub("^'(.*)'$", "\\1", tables) tables <- unique(c(tables, sub("\\$$", "", tables))) } ans <- tablename %in% tables } if(abort && !ans) stop(sQuote(tablename), ": table not found on channel") enc <- attr(channel, "encoding") if(nchar(enc)) tablename <- iconv(tablename, to = enc) if(ans && isExcel) { dbname <- if(tablename %in% stables) tablename else paste(tablename, "$", sep = "") if(forQuery) paste("[", dbname, "]", sep="") else dbname } else if(ans) { ## we don't in general want to quote dotted names if(forQuery && !hasDot) quoteTabNames(channel, tablename) else tablename } else character(0L) } RODBC/R/TypeInfo.R0000644000176000001440000000753013013621651013217 0ustar ripleyusers# file RODBC/R/TypeInfo.R # copyright (C) 2004-2011 B. D. Ripley # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 or 3 of the License # (at your option). # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # http://www.r-project.org/Licenses/ # sqlTypeInfo <- function(channel, type = "all", errors = TRUE, as.is = TRUE) { if(!odbcValidChannel(channel)) stop("first argument is not an open RODBC channel") type <- match(type, c("all", "char", "varchar", "real", "double", "integer", "smallint", "timestamp", "float", "bit", "wchar", "wvarchar", "date", "time", "binary", "varbinary", "longvarbinary", "blob"), nomatch = 1L) - 1L stat <- .Call(C_RODBCTypeInfo, attr(channel, "handle_ptr"), as.integer(type), PACKAGE = "RODBC") if(!stat) { if(errors) return(odbcGetErrMsg(channel)) else return(invisible(-1L)) } else { ## Several MySQL drivers failed to set the number of rows ## correctly here, including 3.51.26 and 5.1.5 return(sqlGetResults(channel, as.is = as.is, errors = errors, believeNRows = FALSE)) } } typesR2DBMS <- list2env(list( MySQL = list(double="double", integer="integer", character="varchar(255)", logical="varchar(5)"), ACCESS = list(double="DOUBLE", integer="INTEGER", character="VARCHAR(255)", logical="varchar(5)"), ## float is double, real is single "Microsoft SQL Server" = list(double="float", integer="int", character="varchar(255)", logical="varchar(5)"), PostgreSQL = list(double="float8", integer="int4", character="varchar(255)", logical="varchar(5)"), ## was double="double precision", integer="integer" Oracle = list(double="binary_double", integer="decimal", character="varchar(255)", logical="varchar(5)"), SQLite = list(double="double", integer="integer", character="varchar(255)", logical="varchar(5)"), EXCEL = list(double="NUMBER", integer="NUMBER", character="VARCHAR(255)", logical="LOGICAL"), DBASE = list(double="Numeric", integer="Numeric", character="Char(254)", logical="Logical"), "DB2/NT" = list(double="DOUBLE", integer="INTEGER", character="VARCHAR(255)", logical="VARCHAR(5)"), "Mimer SQL Engine" = list(double="DOUBLE PRECISION", integer="INTEGER", character="VARCHAR(255)", logical="VARCHAR(5)") )) getSqlTypeInfo <- function(driver) { if(missing(driver)) { res <- t(data.frame(lapply(typesR2DBMS, as.character), check.names=FALSE)) colnames(res) <- c("double", "integer", "character", "logical") as.data.frame(res) } else typesR2DBMS[[driver]] } setSqlTypeInfo <- function(driver, value) { if(!is.character(driver) || length(driver) != 1L) stop("argument 'driver' must be a character string") if(!is.list(value) || length(value) < 4L || is.null(names(value)) ) stop("argument 'value' must be a named list of length >= 4") typesR2DBMS[[driver]] <<- value[c("double", "integer", "character", "logical")] } RODBC/vignettes/0000755000176000001440000000000013073621042013141 5ustar ripleyusersRODBC/vignettes/Access.png0000644000176000001440000003276713013621651015067 0ustar ripleyusersPNG  IHDRiJ pHYs+tIME*]љatEXtAuthorH tEXtDescription !# tEXtCopyright:tEXtCreation time5 tEXtSoftware]p: tEXtDisclaimertEXtWarningtEXtSourcetEXtComment̖tEXtTitle'IDATxye>筪$!T@T$ ê.j?f(Y6 .˲ʢ + & $d2Lzꩩ5 뭞~-!DSBU]'{ t:l.t]: M#5PUWSu ( 耳Ԓ?ôwԐ7` K\sXpMOa;G+@$Ѓ^tupIDATIVoL ɸ.1o=VdC5蘿Sz)[1y19 ą Q~`&׃}#m_/vq'~ }Z*54!@i06I0x),Nx̂^S&# 9#gԥdIʂB@A@i.\S=5)eARsq-CJ"ҁIhۅA.;x =1W>n_GPpYXivrŖ~wxHҶeB`f5vq/f8Snc0!o >/_NBph7 _P`$pKҒ{i"y{SiTa9$P`Zuap\H ˑAɔ%vv9U3 v:ʿgf )]--86".IDATYa{hΝs}$"~ly&&J+B–RrHӄͯDԺvsg ]!K RBJ)5& Mttiwa7W:tC9t%lKJ]RjRHHA+ϣݯ6gzP>mbtV ah޿ % ͢Ow<Ъ"v a.=%LO|3fc941 9UIDAT=( Cei,iJ˔%mKL@J˄cIےMt9X}2-]ԑj )k b>E2~@&^˴10$u CE qȾ=vL .wԄ"ih34{>,ӵLi`Y.ux HW MFd-@6lt!Nto<&̝{O5Ӯ?gh~0-]IDAT[`ccWϸn>_tg;]BYtxGlA鲓S} bxTuKYtxϱr{(<}lWH ?{i]s).;쟽GJ }_H ?MJ4-&,#NW۶+m[z rP>%D-\rMSLiY/Kpw~ dž pÇut=Nළ N2^b}IDATƞݥSοWSƉ;5{L-yS)|^k^9I*>6axʫy(3o_hlSxƦ㳎ls]kp>ґ#2z~ؙ?qf}kMaТ{ӿ3ϟ:ϛYp5t/%mWG붙bW=Ov IDAT]{>壷CwyYoy-0woo%>4T֧,|\1 dluƟxҫ Kv3Zù71P_•' c,>u}#/?A),Eہ+!u &ӮZV8 yr58G怡ۮ%KEXHRnLhR WRXpȉrsBn=!5:IDAT~bxg^ir/87[۟GNk{==]`ZpTe'9pf_v3zDl]x>o}IDAT[BCVk[\c<Ʈ%?]?Q%~PP`ڰ]Y>^&4̛%Ԇrip)\^J,I˄kKJ)gO?ח{0_^-lS@+FzVΛt.p}ϳr\qa{u'vv[wLͿN;Ym~ōW{ ͽW+ܾ%X#7IDAT䕇f1GK/>oS|+M_ֿ}w_tC[ ==rmZY.y[}9=)}/KB%r\䌴\߲}f &OͯGF׼׽/`$9ʄzeڲd!4]{}( t%\ ˻bai*IÀ6껽??7=.M>҅Ǒ ˤ"8B_>hE'm/I͸t}n⯯/]iSIDAT9o O<;/0~ t4v S_0~x~;,H't{q"G[^_XoU_?3?ѭK7u9>?%_*\nz/!¯=vڶϙ;f_w8CŶWc+^vsw/>h=%j|瓅\#a4pfGy򗞃t7i~X(<#NYCIDAT?~[؂eIہDž |_K}(H…\,[ڎSs,e?ֿ<+qFZcJۂ#ӐcB=0 sP0քYﺴt5GopS*sy CVM~=7q'Ͳ=/}HxK?c{֛_+^p˶ _rW^p]Ⱥ[v|?惮|Kʿݗۇ.gIDATfOܩ[o<?կG;]x %/?[psn8/7itSqOzduڽXx\ۏ~ ݓ'^X׿P=5V?2 o}H^ӡ]pu Z}о|g|?u5?ك__p}R䯉 CR+p_>O;#w)l*0> itJIDATT`{ǽRu:u~o{x:Ҷ,Jpz`;7 z1AGB9CCwk;6p/z3o3Hg{\WR?efzO7Leuqpug\$vʾ~ap>?;nud {`Xh>: olѵ  kV sO^9\IDATdJ&V/3>1#Խ֗dt5GE{ ̙g\\#;7I:URݹoy6}^aC_W}X0%LE[4kPnY>P @~?q}&ZG ]{CHKK1a0498%?'@ZJ4NRX4!{)R@ '>;0滪)!j@[IDATw5bӷOB.G-`A+L Ӕ鸻|9y}"_!4!m͵6]liߍݰl`> tlGBh!\{uC:Х,1_sMDws&n i M !])&\[+mG86ii>CS[aI=_nB pXuc ۖc[r1p^),-|:Gp越IDATꮄѳTr4dmaws!0_I+wme B\WBB8R8Wj8.\Ҷjwaw ޹|ΐBB.:tDž5:~rCx)<::,Хv)puK[{RP>-ZTphԯ,t䳷6nwz-ּXK|;+oeeC9OcdIDATLVD0?\":iC=7w#'9JK -[oOӒla;p$ׅC\J ׅ v+6,aiXX_ȢClކ.6z8JN{*Tb VoDZDB: MoJh8@(mysyFFԬm;/;!=b*׏DoE91ò C37baZ(爉[w)5YIDATm+0 5Nq6DD*1Tb &"R)LDSH%0J֬^ D xɲ-XpC^ֱbҋ*d ٣= D jŵ,>8^5i)_2ʫnT]F=F-s.5&"RIc )i Gboۼ+Vp+M a,#%s]qD`$7 u1JO,9(ǭ^"%plaIDAT~T*ѹmqZhoHly *9[ Οrh'Fm{\TT%*l_3.i)%TI+-J`8sfiاw!Z1'%$է*U#+Tޙhs5i/&}JՒ>= zm&%@ujR8H8AL`ְYΦ؀S71IDATVkgN:'$T,5!E}k]Ӆk߇JC9}Ԇ~}W{Μ}R v)`*k)cc}EI~haYVbgFj54[_Ft}%O&$HE%Ob`BJFZaRe[i)kI%-eU $Z}{;u̥W$v) >לe)*XIiӂA|CdiZI_ aDZuqcE$&IDATMDKp=Uw3."fLa"jZ֩D$+/U]V&&F &"R=fZU jKt:b ٣= D jŪiwU7Qк$8 9""RxO7Z$DD0F[ػQoٔ4ru=|<"Uep"_?]B[ujT >{엄gNS k=`u*EIDATG}l21+DyLشm[L). f4gCTWV,_ZНcp d%.]$OM %x50߉K^]=DR8%Mz}'i@zeY*^LDf3ö0J_VS? V?S/Y D,qSx3.fS:@j2:z B &7_)cAuS^t,La"joVmIDAT[[ Q1]Jmma"j˲`Aǚ)LD$61+v1ȚFJ6KD /LDV=u3;$"]5maFcȹxDD,&(E=ϑLۿ0:)cI]MDUl*&׬^-\1 9"II%c^TU"jKU7|K^EOqOޔk9/Qu U/[ݍ;^bDu)rg;vP8|tt'08IDAT­v7QUst.(Y4.] )It%xhֹ蛈*N,vFK\ݲWy5`&"RIk@Dԍ&"R)LDSH%0JLa""DD*1T=I8Duh &ؠ QLa"j*V]~a""4DD]IBJ-LDSUjl)La""?G"R]0z:"Wәj&),6ui;]}ݲ9b;|qm*IDATfjUO!c'e,Iu^M"jn+ iH G7z3褤`cF0Q,4-\Ѥy䍶ҵwpqR<&pDतr ѭ5N?(\i &T?DJS(X'iJG爨 pJE'%}Ů$e+!" iͬDD*1Tb ;QrN&&Y|*"05Iu7xUԷ`Y%R0IDAT}W]nW}[xp`C\EU}'jꑰzգp߻S7;5T#"R)LD&̇VߦedN 5o;j\[+z][Z4/SW [\UԼv6}OZU\FM~o2R\ڹhg[-ՉOJv-.i7C;eJ奠XK;A%uSDNm7_^!cޚ;M/Uܐ;#w_5-^IDAT;sʍ;mr#,3*nmꯠkHz3u՛,宦ѿÎyeܑJ#tw5HT4Cz9ZّFT;hYRoDqplalyRI,Elѻfc׭KCHK{o9+ц)*4ĊK響[ݲjS =⡣)*;w6:w?IYJU%R谡Ptph Mtj;-ۨ׸IDATvk.T^FDSZE&s9DD*UtoZ}NݼMJKT+/o=;u+I#ːOEj~2b/<2Fҥ+YFSx8&V&P],V݆mg0)Vш]5kDԢΩyG .մDXb UQcVvjH%M DD݋ma""DD*5a Qp8(0_6IDAT5Oշ`La"jֹhJmn "N1)xɲ׃;ŤpͯQwb0JRu(Ƕ0JLa""DD*1Tb &"R)LDSHjF6s ۪esfzDԚ*n {#2}+6*j 5H4=څ]\#+1*'ɲRRQI DDu/fhႅ{ Ҥxriʤ}IJT@lʨIDATUc_nx2[GG_h<)Z.UeJhh+DO%#Qg]9,eP[5yBuVDTw՜#-+)\cs5HhSCD8//lEtWq+vh\n%i%IsD8\%R:pLqH[/Xx|t11j{$z Їp7IExIDATUlś*@3;^:S!,<>hxi?x2bMgI쪂Ф`Ihï4U)(cHsE=EatR0ǽRV2_h sh,U" p-:ߜ Mۤ5 U3NJ'TzUAgzhpCĞwS{P Jz),MIDATy8JSQ'S?4 -XAt[EϓJJ_g1_1nwyĝΕc'͐^*VxuU%"` 7M IDa 7(JGGi#La"j9$zM{HQ+Gb/SJ{P]G]qhJ-\QsvSG0,XO' LZXTuHtYUKQLZvDM 4 ӛT qág2IDAT b Q u}~yx`lI0~PnI $-;IءC+w%+`05%L58ɂ1 a#ײFɧ3E%`&YHgRE&6Ҧ(c Q;ik1Tb t.vDD+Q1)̻Q#pЕX1)yD 8J, &"R)LDSH%0JLa""&"R)LDSH%0J&.IDATLa""DD*1Tb T=͜?޶y] DDUq #&"ʮmDDT O9K<Q[@lĚk ?*"c$vDԂ/YQ|p^gW-Go^wGYXG+uOJ 5C ֲ]"Q͙j~VtRZ FD8/9)QDD*1Tb &"R)LD&T׀Oh- IDATKI b &"R)LDSH%0JLa""DD*1Tb &"R)LD&!UׁH !0ZLa""DD*1Tb &"R)LDSH%Cu̚klwe[+4Bأ=-ZuqH ŷ1qU76ss9jȧ u "N<:GDV=f>ݶy]핈]紙bRrt:;~6IDAT4]%~P;_8;8ou{@#dǪ#8r V)eTL RMJc O9yWZ$iI%IVabD]FIR~[ƕv{ lvjz$b{B_B_e0ǖ^ ~1lhm{/Ko>]o׆+zxU~a_FG(lx U7H_y~S62wۚh~=j)5%33IDATp|8*K-_fnGRstɍ5j|Th1l YRU~umYJrr[hm)%N䪱{A2*,} :8Yo*:L)~+҃-ѣYzPsT/cecW&Ԉ}P;jh>ٯ""flL&(#"R Wlժ9Z+Ղo! b Wfe@o! a Ww-D!&"R)LDSH%0EIDATJLa""DD*Uvښkǜge|._"/CT86ӣ=2uժkN;+@Du !QUW^ucҤ2c gP]4k -qJDEk\KYL QKvxtH%)>~bg,LMݚE+dubW)XFK*Ҽ1{s.Ό9gsvV2TR3JD~-ǜ9whauIJ֥L^Ю#[fr[$Q.ǺIDAT!FP/xpRS- ^"QHEylq" eI+l)J&}82f˾D]YI`B1FM]^:g,I]?5U¼eV[Y@QU_/Q sDDH)LDSH~n "N1)֧n Tb &"R)LDSH%0J5nƬ;9aeJBjFDԱb <jIDATm?DylcPmիc7˶D 5β,{.ZeLuM1uۧ&ZD~M|ׇtk0n.u""Rq'|;IENDB`RODBC/vignettes/MySQL.png0000644000176000001440000006214213013621651014621 0ustar ripleyusersPNG  IHDR:+ pHYs+tIMEtEXtAuthorH tEXtDescription !# tEXtCopyright:tEXtCreation time5 tEXtSoftware]p: tEXtDisclaimertEXtWarningtEXtSourcetEXtComment̖tEXtTitle'IDATx}yՙZ@la FhԘh2(&癗Q8ɛ<żL2Y3@DG#KWl,-4;MݷUuǹUun6"ϒ:wsί~9eDE"84]@טC8c'ڻmCXݶ#>b3O0a r:l @,U|=i +Iy, zIH8 q1"IDATF07bT>RBOplho!!}Dݰ}nazV5FO؆cJM@_,]cSϝd 1*2*2R]'G^i70nCe&͸́vEkfAb;w-*YurQ::zH#@!1@1cdcJDhTp,Q46rEL8҉X 6 r\\tґJt!t g'iunhx%IDAT YMK=ܰ-؀$.lfk>;A}TF\F_N2ȍ\Ma B# R()OƐ0dS&^rc?L7|[3!r]b{thXkfTw?*L|;[Ge+(`B``[:߃c)%#s2 $G0b \Ũ0*2*G$ހlߞ%`OH R&MIDATEV @48Ȧ@yݒz}`)؃܏&T$Xþ5l#G! Q;VB,h;{a`-ÛL@C YMl,e3Nك={~R`z8Iǀr,&F`1!M\ʲ>٣^بʨ q$1eu&1M3݀pHlHc#4\7[g@6~}yMIDATY>p &$<윳qc(|dTg;y@uJ(3D edeɲȶH8de"+ ""\4`9a&4DVAppCL`1@H8ߨ{eMsldade@FC^3?\++,X1V=ؽV8gRM yT.Trt7\p;iecFpIDATJ/pR=*iX>>]B\{[)F6KeyQdô-yOÝVxypZ6vۏ(Y g>_XYdgʎ .c$a "nb07,8!{T?pǛp=ycg}?d˿ZX{NWWU:QIDAT xٓ켧aW>dۮl ۮ*#ȸhnCzԷ U;#%cn=aNv]j(skɘ[na_eRH۬T_0F+rT;Xxb|p;bK_vm?CPOlbǰBVFdɒe 2pcC8p[+w}b:HޮNx*wԂ}8gN{03rnFLIDAThޡ:4pV W_ͭ_;s㓷]UV]}d}']}レ"a?<?^{ٟ[ [xOMn//iEszR;H?=^Nz=/.9*IOgXpfclßF,t .<1y3]Lƣ.G na <ɗdfoe$tq}q5ʤE&M"t*"go_.9=IDAT9IGG>DAנS&jZ&VO6:8xKR8yV#cPnfR0ۿY/U~|(YIec~1;Eg&<6k♀&9&;)6̻⏯[fS03/&w^[%};ӲZu=lL Kʷ^睐٥C;n&^m}}k>Ѥ[vg jhѥYNCNm QN-IDATnR\m/>!^Becd֯df_RCvӸ/)iڡF`@9pM2N!evHbO&wsde9'fV(#^,7a48:H4\ێk.?_:;v Yu2GZn{j,yw8 Sۮ.na_[XNO/ĨIDATg^Y'*Ͳ\\zWoT؍L,lO'&赗av|1&W5LV/{ϊX "^6(neuK>[ {JRLֺwt?YxblK+: FQU]t w5q zvU򺅉+m :,Rme|;_KK>[퉉nw=?T))&sYR{PIDATw=~Kcs?Ǐ_vϩNwZ|imsߘIf[IʺcyĈ~/+g1NgK#娟=nWT(smyNfeDҚJO|F^Ö|<Փ0~]^zP;:B嵃HV:-';S?*BFiirI!qsaf}["+Jޔ,|FGqN)-y'Ļs!mpIDAT7OO{0򍗮I]idnxY{4}ߛR&Υ5_& +m>3ngSl݊\2=k̜j"bvH{ͶuZEKXi:@ADdagMS6kg})~䛂]da+ c_Ť},㌑1AcN q'l0mY'ݞ=*jlȎR-_dWG l5քmIDATd>i9J{ 'Jc8p qa2; Vxs,k}Am840A6~{OQI%5L=2WlTBQy_Ғ3Jw?/#*m> ß$cif0` FńCllǶ3!\x4~4NZn7hIDAT۳ϣ*8*?(nQ?vwT9wЉ188c#G# ph$ <ݲt%yΗ%UDb L͐{ ԸkCG-#c"ϝ컾RV(St_=ͬ cO#Wx HL4"oC34F6Ec'wldt7c%6k8@BVFA;&:x.IDATۆE0tV3J!cL$8`bwt84 )5*~(+1hܱs / pGBs A ̘q lS"-7_gwycɨCQ92X;q"6ES _&ܓt>鱱%'ut-kfCFeTFeT/y8Ȏ ʨ|eFeTF(7*2*D9Oʨ.׼EsUM/IDAT{ظsޔ/86gThvڷ]Pѳ FA{=#|VeFiX9su W3҅3GAXE9VW?*mD)m> + t;::`눪K+u M&$;98T[mSl恮큙cػmV+7Is,Ema `IDATX~Vǎ:c` `ʺ`Pˆ7TO7ni+:tJ,vꖊk} ew=/~"\Ufڊ׶Wl)Mﶁ)&)TaTAdGgD_0qqZ 4LeųVxuہAkϞ8v-'4ɟg``xsM}wn8ؤN8ΜRTmIg{e{_E߮"x]PIDATkߗt ţrGN~ k"1@QüjCݰ }X,Stl1 d+͎ ">Fw}}qNxi/<~rE"N+؞'6w OpM/-O7N_{APe_y_9 nW/Ep\Ј%/h5Bl /S ZK_ Ԣ`)ET7<֯y󅔝Pw3lu}eIDATϜ2^,c +A |;K/w׳mۡ3vҘiO8ʳfUl`}>)g'۰ЬZ5{z^bqk{JBQIDAT?5*2l'PGҰ@H4*4=&e1*' h(4((`YJbA9:i J\~/O}1xDnBCUT"Wۤ!mY?{v[+>tP:Rے]رCQtZcՆ=N_0|iyGEB7 +RJD,P~݆gjSAK(2) UEDݧ|]hX1%IDAT YD 2XPÝދf8;7+QO?8 CnI3tڞ'ha %w[f'~m3wXUEp3 I"Fh⩊`hZ@ L*5H,rpiy?uzϛ:?uJbD{LzIDAT-Ϟ:[W.L+:"UKu~lBIЛ?u$Ն˰m|x# H?2sΤq 3sgs0f@=!U/woxd닥9%lBY,) 'dκd]Y" ޟ^ža$g_4ѰabS}5yM.hA"3("yaS)*0`8 y"AD ! /K^y_[Z[͹V—-S3BNl3ڹ6' W=aT%>>#$M! `EIIǯ< ch^yA*T=q^xkjN1yuߧs^Q/]a"ϻ7\|yx(-d;T<1(Cv嵧.NA%VM緾4v#itD:qks&;AnrG9AB-p9aLm[gߋ{7Ol,IDAT:6#ӌkJfR[UHE2v*ϟ9!sN&o?B*k\pPb+N!Bհ)D (|yJ sC?!(_DԩPAD"P /9]QQ!9#g0kBS]EYV K"s -i^960^G##"YGdUM]:ufI}%ذ%dIDATRcGO;{;m|+15o_,'^pĥ7?X(EA'h7%FFJH><P-B5"Tٛ`H 9=yL.( [w_W dC\]0]g1H"X) 87u4S:q3Θ-`lK9@0fdYea;rD}Yξ;Lm64XL{c*m=WIDATW>rKߗyhVs.C` O @gG-"T5@<Ȇt$Fp\ȀQV Ǽ[J\! >qe!vb,fcш`:cDFc,fq]zc5S ט7  H۠eeG1Sc:g6rrM㺮oٻ{x~bߊ׶=}KOzP/m83ˊ ~QdH}IDAT@)>vώ'67g{^6g{__0p ^u1;ZD2".#ArȜjcfW7LɢxEgQOm|#Ut<[Rn"}! |#}]ZV e9 [3i1t3td228L`3t]B?Y0smT:sp1A45{2ޞ`L+nNNdиsIDAT__v~_,wڰ߯>{Xm y[dX*i-_|/ms G8J EFwBOSfS5 L`/AB#Od'dR:׏I~I~.F9S1FIDATp˽@d2ɅR$9 &H"2wȼ9(jr5WF ra>Ktut" z$x1]`ޙ ܕ@k"$%7龘aXmUes]ڪ檲ѶgχO<_ʒʻ 9l޵w|uy}UejqCrP\vB 1vu#ُEbߟ~mWܖ1l,==Bk0~I]?Qn5쇫9#RRħ|4eo_a3Ruxv B/XY@G`K{~K\̝~.=K.1DZ8BE*LF-'Trc@v6U xϷ( J3b 3 iY4MlX ;v5L4'_Q^05nh[IDAT[ƍѾMij|kT&=?k¸}Cc^ݱ7^f"Cd9q Lj׸GO3-?ۦU^zLvDJb./evAAB`yab\xW s~eu.<&(iV$Һ#:Aٹ-Hr˒mNx]Fp]NkW9b рH[3 IDATL8;qP5l(b =L a@V[6eL]B >y1k1C@]'6p즪d^oo`m{|~ɥ`:yE༙SI-kSr2!Al"!x>N#ƾOϙz]iG m0tCMnNaz m_#}k0JH8*BSgQu IDAT?`jAPA#+{?*JstL59  pn^wzӍlQF,:#rpR`]?7d!gl똻t>/7|6bO\Bzsu {3mڲg q@W\ygߨ֠ݵKNVќqijӊw9_!rbl‡9vڼB ·TكoAt. 5އ@-irQPDoDdoa7`mHtNn w0uF:7WtiҹpkViL`h(5͡Peii 7t ^BmAISlk``lUYMI5Ad Gcݱ㌙܀_( Nx o8wvuI|%'M_% Wَ5t;Pݟlٵo0k9B؂,G;%XDޞwBIDATFSÏ<)ujΘ^x,yopO2n(k?I_9v960WOgo9Ӵ#*Sy$?\-g0C z s=T@R:A4y|Eyy[=CY0 е5}L>|i7_pQW;*G E=^4h,}.r}R`77bV @=B cw_`z݅B^xue^z *TEB^NuPز[0UcpI?kSRxVr |ZFmIDATTzӾ/FԺʦ3ZMojٳ} q C'!B82d+{\myuIcʓΡΙc'.^m]hXP}U8\As_'c9}PxpoSأZߜJJ3,uy|\Vy xuMdʭ2׍4J"}$%R8%~2/>0Ҧta.o7lT em'e9X@(IDATܛq@Nm8i\}cEi:g:\̘.Sƻ2{{dMeIea"8Yج75c˻2vw:87H[:ʍDMb6Ԩ_ĥ$!_|,(E*,0\qI/|ۜA|{{>ZO)-Huq#]EQhMPVPzwIDATb3Y,A4z'07.⦦VHNPmEnb;"k v2c؎WXVo*{*k`F,{vҖ=&^m{$'L< cCmJbs@Xih9&;tҭ;sklr0|  Fr@` f^GP-8(读 zT/#gEؑ?cZLүBv@oꆘ@:jCDC^ȷ*0$ wIDAT/L=7KOUBdnky|wE' Mp`LM33=5Cuw_]ܝ !wga$'vfTؔL&cq}%+.]]*_4/WHձ7tҋL=`4{ͫ<_޺kiyߥ/[HϜ92Ud-Z<[,YJk59So:ԨwRG@IDATE*.h4 zn`$r̂0!ȕ׵%o & V3⻵s;`JN7!wl~(D=z,ARnp قȕw8h$ h_>=#9Ap `J4]***f߬Zz9 f4W%cnYzCKmMw7۲jS憣}0Q{|IDATVxs5KVR[!ny떶CWMot}NsCUI @[GokKWoX<VhU5YۡޛWY>%cpoVhnh;Իu-ݩ,'@+  e+5^ņ \2{WSR=)e3S.?V($~^:xGnS؝w~+P&#XR/?OjYԪh?7 J<;AlfLgLq rBn IDATGD G6#lƸ#^2#p@äF{3UuUD\2B>uo)ϻyExE^VmjU%ubʵ 7KymzeWlʵ7XjS{k9 6K !]W/Xr t*PD%'`,Ϲ2]k (P* wP<\wQIDATU6╊GVń #aUuv4L :']K# c+qf 02ؗ )%:BABXVRיHשּׂSQQ"m.&Qw*d+nt |q^XyŚNjs-p8[ܼb͜憪dsC[w*t/Vt L47tKla7XSx SZ.|H=`Y^uS-o `ќJ#IDATK_ `qmzWmj_H'/,YJȫO0%ʔ!İd?2DzA":A^^NĪ\tqWɩ@6iҔ% 7*00DS^ &U .P{5̓J0%v~V34d9H#(kd; p3oIu2/I0Fi`6"IDATL,liQ׺`w* |!347Hjy]VX}զdO@v5U32Vf_<niy`_dd\fNe$vx^ 7KP} JImmz%HKVmj$NJۡ^i2yx,^M矺dTzզvu|OCK]%F H/ ? 5ޟ| Pt}%y AIDATݩM矶GԮ6KܢS.KWoP͙ڋ%R$SK,DH$È~AȖ8.ۤb#,'&"%錛OBN`g&z}ڰ@hG ߣ󻊏ݞj+(KtOV> Q} 5U&|T3 W!PT%节09zz6-4wlA-A o A$HD1oN/οD HGIDATef8]iǍTUUǴEԾ({`CUCP%+.oa-?K:~ɸ*'ۚܰhqKWoX]ܠhU2^刘!XΏO]0=;e?߼UUN )Ry@? -#1kS8$wpᄠ'^jY]3R冋 JRm4_! 'y@DQkz)ޢm0’xmMT"IDATͩcّ2˳& D9J)w@``LbE ;qt+3v„ ee%^,QCςj\0Y5/D]{uLW/>H%6/l/r[(\~ќkR[*qȲXnt4;^} +߼(. (n(yp`@UhR/)O= iNeRcccii^SU͙?|D̿<ԋ#v͂Rwr}o~Cזkުd !KXBB!P)ywppƇ)U\s`֓+NM8P)%dIDATCiƍ:u 凜];v%4:OZ<еi<ƙəΘƘ.aMk8RL>c'MlI׊1R}Zy;X.?kNs\ukk92`Fxcޜ r#Y1,?kyUگ/tnڻ^hqrVd?(so"hX<֒tIoLw*-!x,uY2IDAT~@d'GU'jBxɺS\<@%OVʵżl"hQ! EG祈'! EB.[AgOC0bxT&J^ؙ/cŏXuUƹkm6xhN[gWǁronPԫ8KPȔͲ&Nh@`f΄z\r30rOІ(~@B`P.+PjWݩ[X3U*٪ "_ m#*7MtGMfcq o+7 ѻ$#x ֵH;lؽkΝ;wj?ҭҪ2 MC$" eP S{^-uuuMM&L0AGIDAT4WH^{k0xh]KmEgdciM]t`gsq$18tС{{wGrqz8R$RZ.GMɧ$ ij` /@QsgA`A|2 $jK,@MuW_~_/^zaIlae|k0Zrm=ѷ߽<=><>??}ǫW^v}?nIDATxOo>͕p8k)}G}nsQcQh\4yR2JmZ]}"ݵ]r+ޅݼ'ir`0Fk}zc֭[olvh4 RK6%}k;v:Y}][< `4-//ml>x}pp㓓>DQ4ڽIDATGҵkVWWVoX]qb- Pff\(R*ZGW_[YOOO[XXW\YZZzbsu^t䅅hvrrrz.i0IäDpW\i&%?A#H4G҃߶aI]F:si輜"rR-Xf.nb"Oc9EMKAIDATGd5y| 9sZԥ_Ţ|=XY d6jk.9:Ts?vEQzͺ;3}un:gQ5؜˅}㽕T VasN3o`sg*7xud|ťn#]YB\^4{lz1gsqſv&@aq0R.㾉B @"Dd>}$"HDhе[@oQODdUIDAT>}$"HD @"Dd> 2cELd> [\xSO[^9\|v=\%^DkD'nj'BDwn J[tO7wEf/L-'c-f`=~Oicܹ`\Q9W­ū[Izfk{ןW_NkL-&d+53'dZs63/ZTǼMf5~IDAT郾nU8{jO哑s@o}^Mw3k0>֮Z73UsYc+ VVyBPQý?x/~R?zRYIPu5porb}$"HD @"Dd>}$"H4:/A"~ڼG%jm:Ю@냧Ϟ]5]ȾaUDo^vJ|>}HBVIDAT}=EQMVN4/dfFޡ:}z3)mVgx Β=5YoakQCt(Tхjsְ{V8m*iFl=^f&~N`616z˧˜+cufawT3GoWtl3VYВۭ~f(tՙg)8{[(x{yq. Pgij@>՘=Wl%gfZh՛t:863{.,yIDATV^mD:_H2@+.' 2s8aZati >[>&慂q?̎*;{98TסK{{/+wQ>̭OP@>}$"Hԡk(m2 ÁV c~2p[;mWx{@u @"Dd>}$"HD GOڮD E?/f&ݶ0?}=qö!:˲IDAT @"DdfxSkZ~e 7pU,`>f6ff2ċ\_s2֒6Y 4`ƍhicʘ-CA]➒rE]vky{vspEaQr}e b[ wz?ٗ:i.c)5f‘}u @":zf2 ÁV}i @xȾx{@uIIDAT @"Dd>}$"HD @"Dd>}$"HD @"Dd>}$"HD @"DdmWU=~*ȵۭC _O=o M&mWL+ ;_t}eZpf<$SZgʍ7 oFztWRoK.Ǽ$"HD @"D|ƥ&@U'aIDATJ v&"+E@7 D-hpDd>}$"HD  GOڮ\[;|.Pd_<}*H4]Gۮ8|6h @8VRdXܰ‘}=G^d_;LWȾJz_-l7 gD}>L=TF'bo1";=>7'TQP׊$Z*t7?nY̩u`.2}s{vzxn"`IDATV+oyO~uX_0C-9w<{73)gnȌwn~^%GpDd>}$:oL&~:0/x[;mW<>}$"HD JXq?zv:{Ⱦ>xyUh2m (]q.M8@"Dd>}$"3.ܛ+yM_rIDAT1ys7iċHw+chN\VO;<`^ȾKtdQnySUe*ȾK)u=l=sm2^_~F˒9:(vstido~uf1Ǥ ϺDd>q&]~? 흶 Hf9@"Dd8tG?h eܻ{g?I۵("*7n }{IUѵXIDATkk{'LJ5. Ⱦ>xyUh2m (]z9{C5|}kW~Fk9 |IF߳;P&(㸉&fEՌȸ Fɾ CF"ݢ(RJ%dX?tǘUw ~3nw\ڭLfYA.9/&nB譺^d>v=u1u5S3ǐw^\/GޛOSX[o/kiNIDAT\wU٨Fn+EZRч[K~k_ExO n.ՂaufV=\8pu荀!R!mZR9{IzpC0 K;s޺={vpQb`nȾ i}P3S%>AQdp_g1LvCtGEHX끭흶ܻ{*B@.>@"Dd>}$#I IDAT"HD @AJbı"ELd>}$"HD Q̍tS}$tV}$tH4w J @"Dd>}$jfUhtZ|ܻ{g?I2-57]մ;"y{wwқ_̹2-u7}諭]{rԤurtVC3i1_ N\IDATGTyHE'jцڊ6o}e+=rߴl}bmi66돞7ݏδli/^2|c~K1_95jGEb>Ԁd&V+UN3v+ޭn~t%4+z%Ƙ.p/CFMƸoǹ[\j'rw1(Ny{vmH};cv.m*q;Ani݊|IDATb(zZ#exTO&ڨWUM<]a n+Z'JͶϛNYv8yusJwj;jҝ˚%ĝ؊o]ٗSy ǣ3=.e씴A>R&Ѐw@&D]|j0xE;mWaL9[ZBS')gKˉ~}7_@}$"HDIDAT&V @"Dd>}$"HD @"DK7/g tN団J;Dyb.\D75fϿ|n2Uygo`'+6{ͻWSU+D)5T^w߶]'E 0VAIENDB`RODBC/vignettes/winDSN1.png0000644000176000001440000004437313013621651015105 0ustar ripleyusersPNG  IHDR@ pHYs+tIMEMtEXtAuthorH tEXtDescription !# tEXtCopyright:tEXtCreation time5 tEXtSoftware]p: tEXtDisclaimertEXtWarningtEXtSourcetEXtComment̖tEXtTitle'IDATxy$e}?OUu{q+ñ?5BE B^Z$H xxpfDDgD`cacfxSSSUuuꝭ~y9O=TB˧STQУBSaZT09 GM r1 Ӌp!܇ Xt DA`& h @1pstV9*&MUzzO֋ EJIDATr(Ic9CGG2jcixC`p۷Yö#] UN->O0ѬXɓ -==Pՠ56p? ʌ9:~jzM1ф;8ax :ˎ} SBa3 T4h`ՅP@SD]؁vƄƄ AD\#yTׅP,6vvZL5`YЄ`X0**!,Q 694BHcUc0[W^IDAT/gc&C;_^h+R1 E`*``pM@&31Os4)u(h6N׹\pbT K`),*C`á1wWHSR 3…RsO0΅1:`T٠=(#6F+gݼ ,Qa+zZn#_?dX1 o;oajcâgB`J6:{/`xř`trDD1TidIDAT_wi14"FtM( t,#GtLz3`[p_~paС(0u²},#SvYumfr`Fa`LSjCg{*@oI>}vc=3e`+E:[&ajodCbpu!8aqB]uln:?b`u3U;Z^ a²%L]PIDATu12lmܺume?f`p&^Î =Sj|qư&Q$[v2Ue&,B@ACU%mvۛ*TipKpBe`)Pq㝷Rh,A3ʕ5ԜB+WX]hd2mT1\;Xu[>k KXվe@@ ۘaQ)uhIDATЅaa a²(@ e:+*PP*tUߞ!-++Vx Y1(!W-rA718$TC#3>Xּwb]=(Uup FPTshұ=w0tn¬0YĎLQV RAj& *Sp<87te\[jAiחNđz@=ߎyhIDATu#uk$^~|wugL=_uӯ[4f3-k<.KK֟ 3ۧ2uQ=u,zr014E00mR 2ꆘ.;IGU~ gc#0TEÎ0_X{aԅ~S&Җju4T&?c"VKZ_U`N ;]n|WL1IDATp"Ow{n~[gLwyZ!tÄiSMGL K`v@_3,XBxƳu뢮 Xwځo!,܂e" .OhgǟX a_UIDAT7U4.'L1I]?`Gy3fLG`ݞZzȌ=8qk3o|>w?ꓓgLRڣoّC>zw]o6ulz&/Ioe⧗U}gQf}P%LMA {[2[LE +,n}Ȧ X`L0, |QQaw;p>i}w2`eDIDAT1UV3րZP*>/{T^]8=+=YZ#'O6orxYcCDL!c#ff狻?x̽ggak`'q^~k>,zgvq~K۩n^2݉lm߼dK_m,?qK_}{&؁6ݟCkίw=xLXϸ{˃1?! \\@P4@ř~ _ȹ, dzjGa0-`bnyx뤅" &s&+6$(UT{TX8\ɰB`p ik>'jlFr>kw uqQ}Co_*e\v j^{}Кo#fSe`zoXޞ{>+uca'<8ng}s|W/iIDATa/_w;OMmֿ?:ާXW}NtCWxYeۛ7/t⾳-nn3lh~I!Wc.wͪ^0W{Blc0$Go-~oϭĹ{ٔ?]P{m[׭g{9ʣw=oK^Nr>9}]8Z-IDAT.A01C7`ZO ا=_7IDATk}OוN9' ͫ p V [i/Vco]gsZ~xe/{8]/gː`&?l}۽w}/ ݼt[:ջK=VI{V^U)'0,覰88)8K}eWokT`)lB 1@ 8IDATtwNQ06,qX񬘀ҎQ ۮ՘}yU*B/0 lV<۵ 䆗_^gyMf8{?_O<Ɖ߸k ;GʌI%kBӧioc9pۚ{}|mCo_j>asKOtW7la;i#&5.*#œt⨃o_?>u6IDAT^ Fii*MY ?t&+SA ٷOјCY3 #¨ .  !s)fK-LMf3bb #+ovQV] g_zK@3-1sIEpܻM4L\Ӊ*O뫾;=XIDATep'3ueܝ8#`K!2'#o^:$T~Gc q+3ԟnMSwb18(` pK̰.40)vbg?O S͇,fY¾zEJ 4[d0*vۘ+W6vծx)U22BS~>yKeЮ:yyٕX6>IDATswR5KoOXs].h7}?|㛷_^tv;^|5uNzʟ)ڧ9w:{ߗFyv{#n3w磕`Oͳn?y?Z`=)K!IDATgk񙆰8koW]ybqo7{ɷ];^v#3 _epO{ƞ\aC_Wۋ~O+/؁t]ep[WVyq]dꇞs5v)~r ~+8xG_Ə74+_(MVS @?M1D݄n 5" 2~[[>.#| C=?[z=Mô>LVѣ1Tf\E6k5v\.Dc"p.#gC['8/P+$|4k?s@Tz]0Ƒ6Ek_`Mk1{ @{kϘ:ƈ3ZGy0r%aqƎ-lxMTz5:m#@*uk blIDATBa; C{F+OGRLnjk`FP_.COGS0MrgʶSoִOTћS~S7(c$6Uh*g3< =/tĈt]#}X1ot;WE:MRzzۓL̬3KCnm֚pAۀKx 3me= cBSʠ2U_~IDATU;.W ,f5 ¤DD1X7U4EĪ=L՘f0nҙþ MغفS^0Ll5?7~B(U%3 SL ѐZmLj1B?{DWv ?eۆ:USc & jX\L=g)k7Ŗ 0ZCLp&,,qKXdCIDAT3MaZ!`:tVV-c`\@QYHbLFY: (/~3NZ]0p. ,,( ,CL׼o =V=|ym}jEqsUa `RŸnYR-u6ϰٱ(bn* 0+Vg==lwN`@@c.Q,K-ȏ~YxbZT7 z>M֥ CIDATp 1m""s{-@hjuTRUZ徕P0RrA:[m#e4KYBm< Qp5#>7MM ؗ7 h!LmDUeq6zP5X*TGyOhf ©Ζ FPXf78ky2d)P j/x`UFè8ouDtlr"=+(4C x0' 6h&Y4IDATң̟8)6ly hY')XN[Ad ,ADAd ,ADAd ,ADf<3g4Nش~M.A4h3gm|\I+/^PA\gm5ܼI??}W\yuZ# $ .[o77h_q$3B/FI<,](R?!:BX;pF=(%q ֛{ R(0w"zYsJ5|ve/A%".IDATD>b`Ys&(?Y^Ѵ';R- :ljS鯨idAR$]1tI_g&q͖ٛ`Pb6N$n'3C"9+c?Y.ZZMS fmKȕn' m]ݐa &HTRYKbk'q7y ʏArCwbjo?cD$IDAT?SIHu50՛?$oҟ7g+2v{vE<I0o`{(K7j'/IyrlřLnSI.VFvAѴRoJMDg<2%e7S"%X45xEv#b ${1臟#(O.;5 |IfI'ek (0NӴMЄII>]$Byb#?EOqLZ]%am@dzM~B[V;IDATA2ۉuvXnHveܸ3_Kr/sN%ۅTJLklHD%Pq< 8FQn RkZ xCY|!g!jn [#Cg:yaUaiI+gIDAT&_+q2A"a!,A6y謣AqAV+ٰRI <V!ɜdWFK)&AZ/ \qeW?bͤ9H{@8['0_ga?g`.1JIJ#JŔG';CDWg Y l!%Y l!%ADg⺮GVe SnZFass&/^к4#IDAT>S)Z#XjˢD6F֞C$-S)ߧpkkYvLX gIsd:-ORL2y^U&Qꄢ]h]AD\İD,fY|"AEQWi8ODQR~\gҖ^. %iӪ:Xl]AdD{2˩یE`3g2%, % bFd]B^)A:KDp.z^ADxֿ漛׃Z<傸$?0AUV/g tHM&H^|][s"H 1,Q4o~&b%p^oy9$ w'NUgZͪ lӲOD'nw<D\NO?M7Wu<Vk UUQxU'xpW2So-Dcҧpy"ۓ h0B| WKz(MɡB< z׳NJEjLV,IDATMn%h=_:| ,ѩ)a(1!D'WEiX;H|nDlt؝<$5@t99ݧ׿= {Tq.yrUVEO4Vt77<\X3]9@{oĨpIDATGOyLO!CʑB=nU6)Ht6ӱմb*q5 Y\JAĥ`/q/8ТX4dџC7Q&,F*,i0DozB`LqJX%$i#NDf%$dힸ4-k;'!u5Z30KTEXFoy(nDϴKn6AYMDV #5$%Hg t "[[?jMʖIDATs.{N+ w,{&ÒK\oaya"k:F$<$IZ!n+yǠBB[tȳ[Y e/N%Ȏul@IwINr_gW`.߈)<1Fv֩=$ g49"y.ZDFy] #5,mjMED@AdG=m`W{7IDATBi䴲ڞ%$vR䇊z:m. y,aw/גzo$lU|]uOjdz)m~ߵC5M.5XM7+bG":y]6BJ""Oy]tHD_fꛠsECjKZ.n.;?AtRq@D}z^W)Z.9ɺ"gy]mFUM.UXM7Q(-09IDAT%8g nqfY Cddg-,/NgEjBs|k*^zchz P2?K{lΘL'鐾uޣp[, !._ .g`ZS;,' \. 0U[; ,xz֜/s>t1l~/p%xltH'T7nLKE׮6X`g`P iu8x+pi n=TX{2cx96QNW_?IDAT+e˯~êϝ{$R!}B.sVruלlX&,u@s9g KhmʍD֎ ?UlR{.duMVF,+׮\y0M,[.";Ѫd?ڒ `` X|,9"Ó ,eϚf㌃ E\xEv[ۿܲLӲw %,L;mJ|cGڷ b| 3IDATsl~"K $R!y-U[&p_w]$BOP S´řZ ֶ^PMKZ77.6YK9(JcϿׯ:oŦ=tlr-n p.! 8W9B s&RA L\imP5REtX9_}(=*rOl{r˴ga& ! */1"8Fn6K P w2Qpޕ%}IDATߨ LگZ܄h=g z[1& )c[O=̫.WMhyӎu.MAHu'ݳ[Gv 2t1菧sfTєzN;v>[65o A9S+8-ftS:Mh)fjo 苔`+Ћ i$accHƳ?uiZ :tv5i"$܀ qIDAT"[Hg t "[Hg t "[Hg t "[Hg t "#,AD֤v#2EQ>~T(sQ2At uKZR~,=M Ad ,ADAd ,ADAd ,ADAd ,ADf0t "kQggY+&;7۩i_$5EbZSI۸̚sgF6;u#̚p:8p)6w9f*\IDATkצe*~桄u+sp=;mb ŵ.= (^g[F8ʋ%d&d^"p=k5wgh$N`6. ~*wE m]iFXu&h%=cgyk,joKJN$}GH$8bF#Q Vw*k *_RvFiAyFM7"ÒP΂ JWbŊzIDAT+^v*>0i I]dy55Q$$k381i40}xrP5;00пh vݒڊf׳Ss$m#ܦYQA(F^iZkw:@L%^%O^1~;R  !ZJ&wZ!1ZFn'IH$[4Ҿ(KҪ;|, Įc=tAS6.7 8B;9NIDATNXz7Iu ,NQTMm6AW~L\=vŌaI`=z.6lyóo aQ <:;E+#V7ej Q옏?%_> =gCGN"TskrAN^j[|=]9JAC~Ys\Z m:{Pj+Vx 6"lȮ\iw[zֽIDATdzFlI}uNկ9 zrlU!k=~X'o:,Ƴ3+V`e-`=Q;N|kķ%[ ik١tӥTk$0n2 !l.Z4zgZCհZCgl,-HgE`5GDWJRZO1߿hѢdnoߓL-a8CF?,$ewTs/clLqcTcUzd$ On;,͟IDATibOÊ /c~!? bxAp{׍ȳ:Ia!.1V"E'")$(vHjLЅR%WIIX STOY5;J6:Psje< DO=XCXdg=oZotԊ џu2"z+X.5qB /ZԿzum%Gdķ1xVBv!jfMuO@$!EIDATq5z7tB}ԙ] ώD6669;LWѦJLv8[g|"Zp&OIֱAt"B1x "kHg t "[Ҽ޻nIADg~ԥi"$RYzRAD 4?K-AB:K-AB:K- C,Nё{ t "[Hg t "[Hg~IDAT t "[6"\iYN` <:$.f*5֙W`fWuIDATY^V4-W70s֯: 0z-1(EtY̢{ﺥhG`hѠcD֍sh.'0̜?Ybck{lAA-K:Kt2ntK-\)8hiK 'bsM#NJZ%%x$3dz[@`u`H[6\-[ ctz5] ̬ ,1ΐdEh-98:frMIZtIDATp9_┡wF'\ ڢ3u`Oݶl,eIg0mm-OFWLu0 'ēD6JzՔ,,r Y@$\O=vx^B:KI$H "3@A edKv!ow=Ζv*]BE*X!k˶ [޼( a^{ :ADAd ,ADAd ,B IDATADAd ügzN$mn߶ [>iz' ژ |cxՑMF6`{qSEF^,J#M]IiT'%pdMyEj6o}"X?e{IENDB`RODBC/vignettes/Oracle.png0000644000176000001440000003471713013621651015070 0ustar ripleyusersPNG  IHDR2p- pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_F.IDATx{u}wf\I " hB!_D Hi\RDWJ!jҐbP(Brrٝٝ3gn;;;z>"|g󙙝Q=?Sf[& va)}JDDDED,LYc%]~Ɓ4R8L$5vtt§wDdt밼;ID֖ᗊhq;Qa*XkTkS"bzT~Dv~-J?9ck>iݯMm*jeŶ-ES DLU#!ڒ1DDJd@۞G^-"ˤzԳ 8Q2 -DLy|*NIm[(ACDFǷED툖-"v""ZD"쒶EShQȯ7SHDdX -"GF9og8$D/b_29wZ'螭EDJ""%-Xⰼr_D,"'CUCK1QێJZ2=t2ƫq*']ҕ0q⌉w(x((#R𥳐&($䓶JidKGS%{[T)JP҄ɘIC1$" 5*biJ+r8.ckCL7/=,%R6qDQe_d/23J+FI"JZ,Nr{1BwЕF(ZJd;3U~CjT R9DX2Tbɘ)}8mqdR"L]bw5LAl%b)KtrP93&')|s#u""F_%J"bAʟ|D\v8(.9n=䇗MхC?5MS'ۆI"rß9"~î}=G>rVȦߗ~Q#u! O>||ؒ k3҆giWv'Oa%<7vՎ&Mg rKڔ js 'Cx׆&h%"}㌣_Nɳ1~q!Z䙯4SwMdUSv> ?~ԳEk3b SX54po_p'/̦.ſWgaT)+ϛ<}7KFϻ3Ξ~Hd",C3-FIDTX+7yo[jt>釧O?/W12oB5oNsrX/O1o#[~)?S֎"צiW8Cf}O? ̟,"x'og>Af &-y ߲[""='1Kp/<*>W 1"fͳ?`""gy5rc_&"K"ӏeȪ_.^tsep܁c6}?|2E[OY2PDn[u+i4O8O6zdW5_/_A.sϋ 2("N_,ݯp' [7\?tsۜfo9MӮ9kvL¸~tܓO1VbtT&LL]?"Կky}/|7InI}ӎ92bCDpŒ1_?όg:~?>8zY"rٗ\`񸳣9y9#׈'/9e>ueK<>l|޵uUwhhޜ]{_'Zd;qS84o@DǿSDe_Q3O~GDd=1ϺD Edޙ~P:ⴘ1˷•V.й"]БnM/|&@qX9.;f Eۗ,n4'UrDFdO'yc֦m13 2 o~~9~Nj?w we Wcf7mcPD^/.sN:hmx|M[r#a4o?^D?O\QYeiSibAs== 0}G7BۉYo)yL:hHjJ so' ;OP) Q䦎.IQ'peCrvYW->))'"JW[ZxKy睙z>{uo÷12ܾz9爩o#= O^ro\lnޮ#"Sx=l{~|ۃ3t:K-Ό9/v\Z~j7y̙a]~'?;bM;O{M}n9_IRMD.b~8d^'/-vJY 7u>s̝tfADꏛIƟș~{=bwi)s:vn[m/9ۜs3/_OM-9ώ} JQoܺwlXjV(&J""}rȁIX*od(҈zQ5"͟.K)L /[Ԯzg:szw}#\3o6?`aO_g-tç*ܽӗ1mjaFv jNgym4N=b+"wos?Bu~l6 _2>-^wٵ_aS}n goq "β˥X6BOGՒyrǝOx:kv^«CK/ܵ|¿׭.&i^G[-ȦmU> Ǟz{sĻ?on{^xKoݵYsqlv _\f,s&D(s{eW0"J֢x8ba7[y?v%Ȩ2_9tv9Ȕ~K)S,e*1ڿz~cVqn$"h׉H鏗ڶOWxkNoc=h֙f q&M-"=ymx9Qzf*{߿z>sE~$}"2pߵnΤ'Ǟ.p|?o?2QD쩇N8[4b;F6|6jg6j ~z )҉' v4ط[<إMΫ7<]x{8jr;vbc}??r&)rVx{n]=d)bItQ>+[KjPJ[KP".ǫ%Хr]OƎؙwo}? HJ_p&H$/eW?hml1-(CLQY)Sr2Yɤ,.ɗ I >7O6퐕nwiezQPTPdTβ&6""Ψxtv/r[ac:Z Sw2]mYZbC_%꒛~di3ҩ$,TKq(8շ<+FFm2uQDTq(#pc\ O~$5eۜzC9 5]%*;Wn疂XbX̾皦89_-Vk* ^s{Or֢lqѦ̴Ǒ("T˒/&Shɞ2Ud3RX€Sk2u 5?z({ "bJ1jەgOr0q0qʧ-._p7 2ib$"}zZcՋ^+tY+iŸzoVI￁ #2W͇^ioV!C~{ #XXKKb b @,@,":8B/[j6 ) 3{B[ЃTKűaB8 f̚w|\I;n{مj "dRm8=֬^B2`mϰ%o , +V,Yرuc'LR,qq3NL&-@7sj Іԉ,:fjz,U]^u7؂E\y^kk8vmEYOӚ+,B-=!NL @B$H]pQxɆ41=(WH$wpy]~%$V&ޟu7T^Hk?З5tmTGnM\ow?l|6P9%GW>Kb)PFu[r27<RXzABRM-$gFA 0"%\yn)AX"{Nl,R69\QB!\wW_Bj)yCץ4HĔ{^Xd&yl@,@,r;@y !-b 2 \?" űaB㈥brvKȅX%mϰK,{vt@&\~N 3j :PlziBb MfZr~%Qi݁gFv!Do`!XbyUKJΰ<mny% h\{ꨱKWgDy]/wG/yhOSRJy{RǥIojKD7YFk/1n!|ř}դ˪O=2L&@Wj繥yp ֬ת(*H]KrwkCK ?JW!"[5^6i^ +c%/cܨzv @ Uϸ~d"tL,Eѵ,RT~V= b).rG"jch+H&/[BXn;G^قjdFڶX}?1&ʊڨ86Bh=,b!ysM/nrK4CZ{^( s4Ϛk׭/}q~A~).y,&%\ ؖ)y"¹+Y@,ڹ\UK溗m֭B2bm-Onep> -9K]覛WHbŊ5hąb S-@;<}[E;[[?Q-rwL@̕xLDv <6=4[dj љ mdtJa!rJZ"LZE;"/mme^62.k/ ZJ?wK o*֬CE¥U?mץp?cDUJ>-\WKM+GH5&mwvvX,58B^..Ⴡ &5rވdjm#ZO#%/ ێ+Sɔf}cEeX*$o(/\F&5}Ӗ:)pjω(ZT/[b̄BLꏪ&5M.f~dd6?9/} *Uګ6zV[{,zn)y4cLHܤ::@c)R˕0xB)u[~\ Y}GUK2u!sNC,@{=v#Mx.fAfZ[t,AU_|j1Ä%Ln&ݦ((^64}Os7'4@"mny% h\ n&֜4)-@O[Vgtd{j :@Hox nyj`DSM,@s.)XZiu? 50xOp  J) ZRyeP 60td,h/{H3Ik ZkGۄ +zCIM:FdJN>@U=BX_/ct{olcnou /[BXz@2R)PxF:"^} c)|SB_<O%eV~pSš&wHS6I&Dmw to,%$GM n#H@Cb (kO@TKlw.dW]i*YUI鸞#p%h?VS3nNvYa U$T֡[*4MNr)W\)'/PqWD%c%r𪋥e(^#O&d@RḬl\jFUIWVSFiikvn[RXpwsWdM[['Tli;7جT:=KS@ ZiֱYl<$jڒzR#%]NI}!a8bh)J.PkRYC[%iʡ]jKݫckTsdJkd6]}Ed`4 J-$wLl!MFަ,G,\PnJrU XN,@~Rux:k׭Ж@ŵ>lBK_'xg~;Nz[ܒT-%% XPYzm~,ڹk /b nOWX"bM3Jt;b4O)jd54c%oOKxZG}wLo库f>5rFLRl/M5l7jq5uL޼&GWNBK) ,l`d5cT3ٮ@%uoXMq,i|Œ[Ϙ5_Իo$wOcdc fS%ZukҖ.ap M3#TܴdMYe5}XK5K9Jڴ Z}/dWbk.R0Z ᱧܧs~Qǂ-]DžZ8Ɂ5IS횪4O"۵YEʵw0}J,EpMKu|z{DLٞhoۂݩXS5}̝CM;mbK?UDQR;M""%툒eufYfa6u,-^SWt&D2sC#r5B!nDM޵22_wq*MGwwVgM{r-d5%uZJcȍQ䉍ȳ;iNx]oS8]b9X<ғ)a.ytn)\cãkn^=/g ZDKMIS_&=]qeH#')|5c9ڥ!e<ҧTH>J)5'Km ߱u:6q)s7f]`, 3'{B)Ŋ {oEx5r6~nCt I)ٲ-ZKiFZ*l!at _^WsK uC`H`JqclϮߥWB٥50kUw"GWw2#xZʗ6ց-Wk:[?mܥHXjj<.,3N&2 n!yÝ Ⴡu1i] :<]I@;c)%*YOI*|$%l܁@ 3ŗ<4年=0l+M&2 hu,U= 佮z'Ϻ OF܃ fշnVXތlU~F@-[I@{Nߩoa -X4ir:9tI?wu;+:0Pk^K/Iv b @={-@xXOK%% XX%XXKKb b ,Ytvn{XBZ~ +V, W"XBZ7ݼ=/ԘI낹& zx>1ZG(Wz/f̚{h wO99AaM(2.RBTK;nt%l^mf}֍9 ƷG'ֺ͓I;eE6MR :ՌYs/TGV&zk%F٭-T6? /^ UCYxUqeM2.Bg``: Om䒬:tAhfl(2›P d7lr5KB$O^xzE^Ɉ[2mϤ0.os(:ͅ 0kS.4sD|Ƭ;nt%L'!U;Hx29`S[K9AҴ=شO6)[OO< tLYGE "01 t@/yp ț{_DN~  Лe^k<J_kDW\d6\q̩+78VkUTeYNByʠ%9Ҍ%emWjڄv&/<ԔUU{z -4ݑL: VKWUd5_M>BB;%=7#=weIU\ku%yWB@d"\"w^ZL8埘SttNĝk!k-P\ҧu ?. E&mT(pY> MkcK9Ҍ @fI ъX_eɺTKI2X^dG,,X4B@,!/zc`%% QXP-ӮzA teYvҫ`2ǹ% j b @,@,%% h!k=pgݾ[r~ ˞ߌҮWeLsAujJݮٷ~Zu-T|Uڸki4R]ݬ?{?Ϳ)S,ǒATrBiY @ƒ=IENDB`RODBC/vignettes/SQLserver.png0000644000176000001440000010376713013621651015553 0ustar ripleyusersPNG  IHDRin݉ pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_F}"IDATx}yEYfY $QM  " .?w1 EeQA ((&BdI,}#!]fꮮ陻ͽ|?R3Sgec3F45{Y?0tH@ e D.(z@ n/ߊ?pcN<Y([Vݷmٸt;`8p;4aNX6]t `1b CC >/"= 'x1.:>r;Y [ %>x. iq3 .0ض>|Q M#mW4d;J>8dp2p<7|>BoAF(D B'8#`IB\7Ο? `nށd`#dHcɍ&BB. >fFe:%׽ˇ|"B` 0v7YdPJF9C>p9-9 zHg?s"+C?37}`;[y{:+a^ϋ^gǮacJ^0n od͹Y,d\ikcC@:$DH6} I>zW ];c"r+b^S.;_>)/+Np¦2+ <F CdLyeG@>8 g ɂc[fuͰL+! A'dwmX;aL~"we&?88 0!#}{řl${"D 2m;,v,t`"X*WBcX*_B.@. %ppԏYpr2sPt!w`0+M}|@|&pe|vp\hrY w>"/+@^8EۭAqX& yv'8# 22yK'v$O+3/a{vBKEP*WRq6 `M N?wuw:N/}ȶhۖ}~u`8g=23l>~~ɟ7nh%3:Ow>Q۟f^cX~&Lnww<;xzG36*yl}~-{zs7u#M}7k ۹ EO{rן%/PRiW/'{},Wpp!! _殑0asu-s7w;~u3{/ /=r(~h2 ݧ6X’gG>~=WvG~?®}םBZOW}t#c{Sjz'CGq5/yM˕7ٲ_r'}=}9fn:+oܹbnw<}/_"? π9Ct`=Gݼ=GZ]8qpi[K7\tB~ﱙK~ow xd6C.(6^z.8i5m>| Sr&Nmdmv;oz37x{S/zp4@OG5o? fG&fAq[^|u{g֕VgM_^:k(  >?+۱az|%riCa[Γ̍O+<0.bߢ!oS`VoF=.].[%[Elwp3#uߵPi" ` '`.@Uo_tξعVl n?/p_8'z#WI{O7,6_2/?sydf㵧nawlt%ӺhzOpwmc-񤃲b`'{Hw9+'xŸrO~1[gUo;S93鶳79l [&vL,+d[ۃ<ѧ9md;|.MO"x?y}mK-OO}>qϟwM3w)OiJ?l"B@. #㕰 bG֝s1twg1Y^d;|\wvszs?8nh_:߾*'O8uƜxtT=˟ֆH~طXl[gM O^}.|oXCv;+{8;moOxQyO~tpIaQͬ{mI o(/K>mJcˇ 2|͞Cv~cnЖ{ #M#9psK/??N:z!^}/tDwZu?eo479C׾^y3pcrKHܜ6Lia^}1&[;82/1<@1acd3e0p,kY8wTX{{:YHi:ӛ|O'?`DKcf+3X]teC&QAt0Tݸ77epgƺ[V,ayCЌXДyyB1ȶWz  \?gmLnlcA4׉?ͱ}23ih4=gbxC ʕ?>`!.?o=4.;7'\apҿu ,XRq s/j1󊎴s МpzY0pspp}i+|}5n5~-yr`d]um{󊫶;~_y}~n)fMS<瑉rKv>xd%ugyO+'b#YɲmOr;\ZkMyƆK~z'^pӴk=Zn9,|͹ښ<3w=V:38o&&T+b^}?'ɓpGk6 8C~EJ(aL&XPx rX;E<6Moӎ;\ٙ?={o؄_}Y$Mݺt35;'f~1ª֯~ y޺rs7Tbۻp&r ?';[_=yo[WK {f};GMNkI^ڇ9zݏ̭ |-voKN~ (8$& vE~96?7wm=Qڙ{~o]q#_Xuؔ{>nkK[?/@~y/ T<,nu2lyn_2sR1pZ^e]aG  ?Hl\1D@8Η6>=8OP&˓!06b!~}poP-\uEuw-߄߇۳޻N ࣼտy{'fz:<_0v`ݘS/wٶW:%1m_݆[_~4 #[O=r]ߵ * iNxݶK9zDKvź_Yy=.9 kIiAcUr&wc)GYfgovwou~Ʀ-_ůWw~S<b >>vQĿvk_|L82ɻ}gW̵no_|=hYZ~oFX?_'<`KُȜ`KE,tb&x9#z};t>k>z<j, Py`K{ 4P\0s:w#} ] kOoM-~G@γneV-o'sew@s7l@ yf<5oRE/,[J[m}~=VwM-^SI<ٿ^:Bm[w- 3u4?s_Oo`lzr5fg"gVh䩩_3+4BǠ3#xGᶇ6_ve=[! ,?{6C \ !Cwĸ~yzWwJa-2 ˺2ApNV=C#'(; qe<\цก-@P>@VPW _>uUuu[+y Ja&,#Nd>+z3n.ź*#両 %H߿A)"{GЏd\| +9xw]u{ 2ɣdpq Z6n=baa$]pd4>;/Q  %ۇ{.d|Z8rA d\@@s >!x,XρH~ 5V\t*Flp ۱yۚJ.@`}6/RO@t '~@ @ D@ 'Q?@  @O ^C&=ϟW/`9[7-@ zw]N:<CDD:|KP^Ľfx9+8v`v[m/T0Ұ#unW騲yK/4UHm"1_z*q qmjᜋ?k-rOM`r ~&9$nemH8T5!rڅĐ|)td|i@ կ_T.4!Ѻu`f)8MW83f0p?5sM$Y(tJ\N-UX!'U%k C#HԈh ^TK ԃeҁvSd`Sо~ 2xJ'f[#Ú;\%$53 l^4 Ā={o*[mt-ӬrC9E,q|s7s7u#.ZܹW}Օ؛BUת|vW;yd p}HQYk9'2G:GY͚ڍ?-W[ڷ׾sl}kx I0o&4yߤo&j!bbP#hjön| q_^ɢw}F}87Ggp܎$&̸טT+5]F`Ź[2iǩY E_t/qf&\#` 4[isd5j e,GwqHJO:;ڲq)F}oz6̝MJ79J\a)G Բi:mԃjH%pb 87jLCo->zy ƹ gN8aOMbO04'_G3 qƵ1]87cz1 }iv6#iGd=z8O06{gT]k QdS!`[YO2r LeEzeViAP3kqsXVZ*=Ȫ=1YÁɇn.^ں t' iP97[5QW*bu`ui1s'jmUfƽ~/ ;'ӝ@L]+ivmxThK[U&Us`zѸooO0.pGL?d)N|߹UVZ!,}_vv`qOټWfkR #+Tğ$&{+ 9̟`yZ&Z5o]Hj 8wիzJdͧmKW[)aU4-kH7]If孵z,l͕l#){s^emmגf'{ꓞ{RO͞F jն5GXǣjg)Nǜx M~5bl nY~=^T觏GMռe<+3^-}-=_UKF[h3oGB;(N!GDtO Kv]wu/.W.f֮?X|qN=&qĔn6"Rf}fbf=\.9w'Ey~Ӎ7nذ/e%Q:ejj涪$%49 M{fZY:G>#{wkÇ[+޷~#-[zX8s^37~?!C߿g}A|Ϗ3|d K_{%ͬ_E\=aƌ^yew?<3GeX5N0R"^> 1^2 B?˲9СCO9唿osL:ulTʸ榵k6f{X&u3q7y_|ϔS}߿?l;vHf?{ƍ)S ?яFĉ{WssI&M4zhurIb r3HrZF@|[<{?o} fϡw;Σ=( 7'|u]D^*s܎;7n:s'ryDlll\b"nظw+6jJ`lbaP,z^X,r;J66kF|ŵ|Q_KʶCUr7[T?g' `̝{=~(O}Ba\g0q='ɓ';e~)NGe]ṷgn,ijnm޵~vxW=!C665ein=#-[ƍy:W_k{[ߜ$YYXА ٜV{{O暪oC)QGK\ f|>9_/tv>&Mb#ƍaƣ瞓mqN: _қVr!z\:"^|k׮mhl§u6.6QZKw54a-S{nՃԯQc+Vرccq "qs=,Jk׬rLfoOcuv&Lحq>cX,z7iҤ)Sعsk2qcƌ7X,oi VfM_ՇИZ+JPUM~!/qԯخڵw??qF@5zԗ{k׮w?c[n|>zOqy>to~G]w~ghdqbBFݴqjoI/ծ`Y;i& uGM78q!^}۷ח-7ǂSN9s%[^x^sX,W\ѩQqׯ[+|צ=}ԩk׮ݼysX Jb$~2|WH뺙L}΋- ,dE=r]7˩ulu],`]pk>{-ǧ?NjZߢ0>|{w5Ǿv,Jmmm7pügo^5bضm{-?ٵ]'*{ ym=d_~߯'޵477ō7l6 k׮Eqe2=u]صsg.w\Wp=gMMmmmk֬6lȑ#" pDf;;;;::*x?ߐJq l6[(WZ5naÇJoĉC )3СC]5Kq\'@Wh(@_ٔr߾}lhjnv]wUO?=SlmmQO/^dɒ7d@㶵:;x7j(ڵk{:s;o}}3N7SƷV?{ m~u sO/\xk-#fxg9v֭'p_||'/>|a^\=-gyNZ~cƍ#F_~lٯuMO~eaO}S[ZqfP?@D`jtʸI'ӛoo{{O9r$|Ŋ۷m?cv}b(X(L4iG?Y1c0P>X*޽~S…ַOL6MΛ7m޷ګN?L&#[?ozoO<ҋ/e2YfmXO|2e ??o{Ĉzo|㍎Sd Ͽ.''rcViGM_]w3eݿM>7y۾~啷zw/?<6l/eq ծW]CFZٺ@/'> U 9a̋.swtt~K_SO>lR* dI؄ 㽒qFD@/|ߟ4i7~sG?ιoܺukSSqs]3Mxݿm&~߻ڽ{ٵkא!C8:~ܹcǍfbO;3Z[[x{˖^zO8qfn{{ۓO>}{q̙+VxnjwC2up: bParZc-BΚ=gTTz28|^.T~ss_3O7+V'?2uRsf2#s0  ˯u~q/-]e,Xd`ڵbqݺuM3gmvvӦ_Z[G^~ynGč6xuVex˩6lB 3s$,^xፍ sޞ盛W,_>l!mmmCADg>}L=CF`&zZWRfʣ #7VfJ4W3[rs̘1C^]D_qaĈ+w=֮ȍ1bW_{^{5޼'T,:c΍7[.r衭c|A,9ح[]歷|ͷfr cuݷlٲy֭[wm9$rg|.'xT!|>+;Y\^0pq뺜sƜ„&|}}iÆ[6o B`4 HxH BVزeرcĉϚ5둇Yn}kkޓ'K f„ o",u1n߶-˵pΏ}{9;F!_t̓v1d,Ww"u?{Y/L6mַƌi?ɝcb<׌񆆆eKN;c=vO{^I56mX,: |Lk롇8ΩO~rƍƏ/J"n h?rJd^~kq׾z!M?z:"}on:iIOx~_?ܸqdϟ;=rȏ5jcCzw=>kĉk׮}z@KK_˟x`vkmm]z+Ԓ}:z3;vl!gӟ8 1c<ʓ/]]l~8CgU*&LP(WXĉk֬.KqX֛o}+Whnnnll,MMMvtҳ4'k*ތ ަ~iYurY@d3/b̙3ۯ_v744䲹<#g ι˗: ?}gС?.G!_*zGtA/ {Ĉ9rϙJ^)( d;{ȣgr!}c{go7:_wRT,d2nWzM?я 9q҉e˖='xv?O?9瞻j媿=I{'>~„Rdu˦SF}չ@ {_sYhG}Nq>Î8bSOZ??.'0c۶m7K_Jg{;0ƀ! |koo?î;w :>}ollq{^ysbc1rۯP(JghljB89?Ѓ;wSOnٲ%;uʡ?|wv7N&#qιzi۷o瞟 >C.cvI'y .x\;VZ^>:lXTا*@kP.bsa5tTN8yJd|qR\P(FsxW~c_c{xAZ: Rkq6qZW(6~Pm ŢW*E-3\.BA&gYq@Ooz{4cth6J|j (Nߤl-`^KVAyZj)[m&+th O0U[jk>3Ec82)Mדvr- ޚo1hK !>@ cO\>}h㸯"k.PYN% vmM[Noj/kY+̷1urZ]42H\SR]׆D` ^;mƥq*vyPw_Q{ҌZ5˟07hZu0:"{._̈5?vl_]Z_ NSPKתPfzȣ y.WQ4! n5M׿싢jAL9IQ -Tis6I BY1Wj6)^SC!Y+еdFjG-3S7-zM3OuleRuvyW(v3Ү"J?ZNFn-B}QU̚g䚾I`dYE 23bI5fUf9N t9w]_A4Z9Ѷ[w?dNi.g-pT'MQ+1uTd3F%oZZ*8Uf9Lj݊Ţ9-1[rGӌ [qCi#'ծ?R,sT"1– C\f&hh~8zI훉@ٴ@ВVWAٶG-Ӂj_1z5jJT ohtfƸ"**GH>\7A&+INOFM9n10ΔLc҄q5cqMzT-k~B\/sVKcE@\S lnsOucVíh|u!Z=m32 ڲ'Rũܘ ^ 3lD9sM\ ^;iwA΄SYG珪*_M\UoUu -SlWGjb\Bi._rVKܪnîtYbUtX=]$>4Eރs^ku[=FʓK$PB9RA&$eM,Ee|8!cx5rSH~"Y]r+@ @ׅZUBt7NS}mVƚ9L=Ny5K)ڗ8ÇtBWP]5A%΢.+V!Z\3?ǔu3';/fK:VA8Ѻ@ 1\4.j?Ef1u`7l= PxNcM qq" ,24Z.SZ@`N]Z!=UjG'be-5;蚗03f/9P 4%A-M QuIWntUغ0-wɢh ǦѽyNM?.,s\Ń&Ґ1N-Ϭs@ tW5}\84Y@;J %Xg)Sc[ժ >e|.ZܹWї@ t[5衼:sALgBERIU<7Arj` 4ǷŽfWJhWFmOWO@Yw'qU Ai9hllIq" 7;k=j2>*K'[cqi{Sz*G)=/UT%ib&+'P2jck`ΝfOGMzN1FUef{3;M &*[fv=V:S};qJgIc*[=jh7.+Lq ۊZ)U^ZqIjg3l%Mf.Nx 6L~ȭRx*>0*^S*޹aMOi[kjqƬbZ,Zթ!zkͦ1)Y$w}L?ًMY[ϖ0qVXUuOɼAsSo@ZI"OUq쟱kN@z!I?o /[šv;%tUL^[Uڇ1UOfOj)7Ia4T̎)`LMA֚Ѭ%J@jf<0jGŨuN]UgLS+Z ,bopYxl PÿjX4{UXB]Q|PDBd!ϔ>d5F`뾫ƽ dmF/jvPm756kqvH'T}\5\+ JCC޺c57w?oq'b963$\ \AЦM<3ÿWs_l#G(0ނϰ$@ dͧmKBf+ǕwIl1恲5gW5{Nwy(ك@ O*#q52a*|Yhĭ6T%H-_UR3;S|j3 B@>5`諾,vKzM21f.Vs 6eMk5ucmx@ BRV>ު)k ƕ^T_Ь~SjT7">sX,V1`-轱@V+>a1an.DL8qd>@S<3`6N΋v2-z|*xQ3v@@OO $ }L,ʭMnT٢52zfgo^׎黫? ?nՐ53ۢI2 )jPc Mh[m4&o}fv->ffNm ʪ~i;_F<940WsVTq0'~2kS8~cC zU6rVC8"+,9p " 0 NPeV!+ʝh$%CBzuVkA%AJ}̝jJ~TRnr GI]Pw KGB`1# ٳ${wVLTD -v4܍z2Dntr9MQ`I(:%O4iOU+ѸYi)'j{bqM~&/׶s{CϜS񻔦5B$T+(X|n}I2$>s2'ewlj 7k`N1Gt` w@,2Z<9L6,4!/q:;;|-Ϭsij]:VP_S:zG׃ý1TuTU7^^/? zuti!\#ec=]3802(f@P32ak ٵm4%%RXhq»s^Uï]g|FƓg>yBWR7YID _)0Ow?y× h72C$gٟ-跆®|[[;y+~Gz%Uk;%=Ate<% $DAzηOɋŞ8oY;A٦ZGvĒaDzwE!V&F(  sJ 0Z #}5&05lF68Q.*ݧaY}?Ϊ$<:5rs ^ը9*2cC5EDW'VS.~ԘzC^j@7u]s^f!BKGPya; BǾXD "? с0`{8z"p/ w) v:S,[[[/\8[s#{-K߇`z Y,B{D0 Ps0`D.Il B?t+!B>gK꘩MViZ6!kȴؽ[<߇y듊!k ǽEpE 9#3z`*ľ2 UVYdwYa2׺lϻۣ aUalԲkgBK/K/"z A¹l? HS4yR d-D J ݏ0yl+&-beK" [qEoτɏ ` O\Ki+nzC jCWI9C}A`^28]!١< vMAm0Ubtt8q6Iދ@ tj\O0aBG`&G(z3}(I1DaxE0"J^4\TH@ jIʈ[K=CA)/8 ͰWFrB.r.%{UaQϋ\2ew,'irܫے&`r@omvh2ZWN"WGXK a?p@/s! 0r.tqP.o0=?ʦِjY'k] pF Wl/S'&!À2Qr17LqH ;]DCsmt uԽjҫPA;ByW=zPdTHAqAiL&/gaXJnHh| 0:7a4'kw:fT"UyٜEVu)&s0^B!@Fv}Da'F)CWDrq7`oܨEkM5ڮ(+HE{aQP]ߍieXإC>DˈXPŘ8G  z}D.0eVl'4x*[>^QSut\ZUݴCdsD`a,bBMv|!+%aBY] Cf)ZUٜ#d 59V j)B zG([e EٍXJ`okrCa/b9$LvurwCeg$0d KǍn3$~+a'u">JX}ʽIM A?wa-#+1x?Y__.^9ha+@+BG?|JGҵf PDj/8B98>zņ!e6b 0$N NT#s4 LnQ}_ B=R?G -Sazd}Qc,Pf3h.& #0&2!gDOa Yl0a$Avj 4rw(r>Z=~ Bv:"&GC&)MƁ爜C$#7KTz 95X aE^9;Q+3 A^)zryDR"0*&}D?@Wg62,)ԗ9t?H%ނGDp䜅@s?80lQ#rZCf`Vhp:Mz >a⼈JP=MT[#6*hȐaÃZ*'KxbFH/ P#2S:rI}#`e t',RdWtĝl|?|dr4zEqYa>>qRQ u\_Q~P+i e}YLd w(Q9N.7Sd0ނ̚=T pJ$Cɜ0REz 5/p'ЀPmCY•Tųz񲚭0I~1p1@P'f1&? .ZܹWŽ퍺AԡУW䵍Dk@DɴށN脖4b ®b 3#{,2QGd=d0p  ya$%NةN!"iH4E@ -HhU28y}Pwo{+)?0ǽ#^1OD^ @P*liDda l>ri83)W'ŃmЄ= 9JTME 6sehB _-;k~f=@ԟ L( gX eYX.aa=r1*R!R$dt@FY!a]Y«$lwdU#HUn'`aFO0%W-Fپj_'W3\'< ` Ф#YAGXﺇ:YZ~iA`+#JM a&R0#udAt>]&\Jp6l+0 \DN0۰Бz~hpem "v$tWx{Ӵ.q'3JϲQ(P{@0˛08-rC(=p}侰Eo8D∜3! bD#]c B|>*p7"ǵ.z6C z/t$as | wK 8"'p/<1 *8[AWL2?9: ]OdByY0ndg R((I` 8F+XWLqz4<$HCL8yڌ3s&L]I `C >fmkn*%:ނ>JqVࣇPL8_mN[dDWDZ<߁RGFU))erK3b.]~_ЦYLo{{#*VΟ`yZ&s5o]a x#'߄s3j!m2m8G@C? L I׊`P^ vlgN!c6Pf#ӆ%Lt`eȡ /qq΍@E1unK!F3G1wUqu[U{r OX&䥄<CC#,--ȸnaaF)}J#7<ʉ,k1=0#XJ&뉠F!&#ARaWȓ*~F z=;JgFz8#yIo,-k6} r9k~J,(ےƵ4؅RbAIQ_0%!aDc 8ٴ@$:*` d(DdA~`dSAj)vÊm$ua *w$ɤ`~ 4 !al), ,z9pFn$Buhݓs-QCOйYdEy9NX%P HU3E")z EMTX"$ufK7D 4>rLO  9F( B?_P" #tsCh.ʂ.A#bYņ"S;F^Pq!(TC_,,P[A%K@3)UZȑ97ͺy/0^EHDQtS<4(Œ 9Ma:< h&2&Ji7c 9D,R :PB3#$<(x$ NebԷ@ cPdD34d9tƙp@n`y W>zW9pPhɒ[7G?c.\ 8rtd}@q=':*P(ԦC@?\{`18BmP3Ic "ҭ1j-yx@1'k2@eQ  Ȑ"-VЎ7 Ub ßU A#*v! LPM/RBe7&aA2a-)%5 @PZ@ !5΢mX8A!@ @ >P 9d;2+%3~pBLV+Õ H(=,e V%̽dhb=yh ]BEÔb0+  5j'j DY @ K m\WaB Pmj Vtb0 ABω(iEQ"T9cx(\Z&aPgiLJ!lQImV<"gMTJYQ-xTP_ԏLF<^]:3? ,#f Q *>\8 yB]0G&?e2 jg8Ac% CPٴ2{_:X߯h!ﭼ~5{Œ;{nӺ]{Knjֶܰ1JLj8gL(Sw 9qB;|*]' +XT֨dJg,`Ct(9s1 gS=PII6,9E"_H=p ( 0a  aTi(4\ED:u)JflޕhMk>ɢ'I39hO~Hw}zB,ԏh/{fߩ"AkU\32YE•`塦8RL!+>* H u2EDC|38'5]/ݿk=*YzF9Pw:ؿJBPlӒn 3] ŤFOG]+#P*|t32 ,l0jL]e([D*QAf586r0G.n<V#= #08B1Ԏ !zNoT>i&d ucf dj{-\mʜTz~|QSL?;?}^z[Ô^审 0&ڜS,؉FKr>$n.SN;w>g}56Ȉ"sdkuQo0܈d[``BrdywI_t&/W*z_Rε3!Y:*LWI:=+ʬ{սAn.֢Hw Qkx\{?&Z4=0Q]LuDY:jv,t~r`zşÔztX6 h#ootCcwuj42]!4n}cGx HTKw\/ⅸ~}| nn>n`pPM)XB;9fdj0P5@ nV5˻a<+]34r e%XTՅ (mX޴"]r_R]@Z,7rz݆̟@W~ș"Ni*k/זy *_A0?2p#ðCQΠB,芢 r V 4G}vyrDF~ K .]) ]I!U?ov]9< qL?ڮe돨Nu2I){˧!N5k8|$c֯Q|wHV$Pȱ1&H<>"fWpσG+K՘H^_@T<2F,:zQ?GUH ˴ip $tUO޳D|P}5A@}5xpȲaؼmM?t`7+VXtUWjdy^jz BY{ ~O.eQ@1k*s Gm$˙FB㺿x=?oEIçҡE_=liXDSs5|9Ixf[ 5AYz6IL}nV-5e/ʭufs!P2uP!Ha[ D~}/VF"}8dP3|U1~**GTfG+PJ9B9.Xc8uRLCWˆp$w=nrJ0_ԅ'ǭ͐l.Ҝ^2aNL4끢r-0[۪C mlӺ}T8f2h9(loG5C}(AŹ”N VfJy6 /`%DE1Z0 =_v{V-zKK4kċ(1@TBN~_Q-W;$+?s  EFavDpfسFt8^,d?O F_K1r_3E仑1t쨓QУۆ-尙W(q1bQW4.E0b.qJA(@ ԱGM7?cjũ7gÈMQ_:{y\udj"j̨4N˺D}w#r9HEPuJBQF2O\28U #(e²fJfj-SbJIH~P Y30C? 5 w#r@*> vD^6G)D?`@?_w-3^}"BwT D+ȶqBIp~!LECD @+]ہ9VޔK. xي,3H ʊG67V<ޮx%R~ ^G}!>3__.`'khj>VќAb5eVk[h^Pfs:K߶04/in =0.]q̨p[B״$em |65J@UQ93C5UTTs[6/l+F3́q]Q^%*n -qè fҿ~3Z%#fy?I9NnD@™N%jK!{P񾕩5 㯄/Qݴ ,c+>Kْƍ6W[ޕ-Z.֒;<&M!)5iĘë֓CAAnz,i┖mڅjƠ=Yg1[bX]+VO&M$pxœ]>o=f]U W2!Gє8͌m}HI}5Vg^&yӭC"RF}BeqE.T^>5 :+fēHrm}UsF2S'AjA4[jxd7%yi4'4/fKJjAk,JpOskӨ%k18Mcka|)n;yxbh 9&8^|&iM'0}X{4%VqD*we*Nu@b挙ן!>'G b5G e2;ŵC\rweS#CyuYRѥc-%K֮I&X{ܕъL][WK|Vqb>q_],0VDݵ iq nt+Z#Peȷ+ɠ"]'JS9%=Z4;5o-}0Hߚ噜"LO ' 5Vg''6ɀ~Ml7껚^9%X-YR[>_0kk$5kkO,^tL^ɫV=NB[|JjkfFsM^ռ~RC!cLh"EF x@ :jGknMIξ7ySͩתL4׭VH@ ?A!$̲5Vl5}c&]!c>\3pr~H6 {@ jk`55oʻ}nI_*$`96E !Ec8'L3S|F҇_hq»3U@ Tp@ 9X{1Z+MKb*C)njIx();vl_mu^pqۓG)ێe$jsnHV*?.Fy~* 9hzN$֝19 $p: X;l5zjǝMe!.tQpwA07Պ|@عb 7!,lmujn[r!ҧHIBK@ƖOZJBm\ָUup7T9Z]=c†*L2ڌ8 >Hx?֌JUIsu2km|lOMs{>usLs}~ZMk34@rY@}I JNQr+vN_p-QPm{m؜H_O0iH"#́^w/AT|'w6den)TTR] k5F-$ceiJ܁q:F0UǪ>ǔ¼,ȲؼmM][p>֙S3_wү(0ނϰ]r\7,$m7N2UK龻uߣҔj"yG%䩭bm='.[τ~0yU޷ۛ;5nS@ j*qқ=aW{@ WMB=c@"?0``:u/GGCA?0`ײ"Nϼ_GAZ> Teb;=@ a#C`pB 0x2nR[7lmḍ?Y >ʔgXpєKrd8hZQ/4M3{5<'n_NъϪ7}9U zʝUⳮԛ$X!^ׯ7oAf6[ڂ|XBҨ0_v -CPk/>z'fn_nMD~@* З&0U.^-.˩Ϥ'Km{>釚{k0U̺ܳ[MOcGPFBwy?LHi];O̝}~{(@$4u\"rOB܂v Q?f/~| (yT~@NN*m_{`|HgH»V]w-ϩ;g`v-yWIy}>C{5{GB\)3kXѶlx\];Ҷ!&IJyUO޳'j=g\VX.Uc_}-9ub諕n  .ZL>5]h=lQ:ukh3̟@j]mOu7@m= z ZN`jkkA]sOz!WݍsQVOĝYiV0FO =D8-WZ"'@ '@ @G ml ]L@ .P=iQ?@  0Ш3 D aPZ@ D@ 'Q?@  @O ~@ ר) "0FV?@ J@ @ D@ר-y yBb9[7-f5{=Y@\VɄ@ u~Ԙ@ -;@ N@ @ D@ 'Q?@  @O >CAŨ֩>?/'e^/ox'P?;8'H@FV?RJ|'P'#Џ@l0/@ @;M#1ȸZ}G?cN;z2pi9VOy_QO Rɏ_@V? Ô&JbՍ>5!TY0 _R{]m[Hx13E]Y&]=5Q?8Nj~nd'`1jiOz 5> TI9 p‹>s9ݘ!PCd7op#}55C= '-]N/= ` ,6}̎T"#d`Sо¼0@O D@ 'Q?@  @O ~@ `qMMd5ؼ CV(BBfl ڷd_ٹuGV`CN-ѭ^~ʋtt7Xw>Lq6y}}I_ ?nx 27CN a!"=@T5ľvEIENDB`RODBC/vignettes/linuxDSNsqlite.png0000644000176000001440000007442413013621651016610 0ustar ripleyusersPNG  IHDR?>#x pHYs f IDATxw|հ٦jnU,YUb 1̀i @ $$oR^/@ j `MTpAn;3,7j[{0q @pNc6l=efp+7D~?~k nV dCH3K? 0J&B{0$!rH7Y>U0}0K;'s^vVʼJC ӮIatsެxgłb4hPLKO'3#F\.WhIhu+0B (%)x</K ʑ$,nH AI@H k4chN_cV^[֠d(Xn5um3sI3zI[>FTie,\դ9Bm<檙C5Os  rzEpx5WX&IISos1#lUQ=NZ}#wY[p>ikFmjI b[mt,l|$rB7Wl}[~A#mRꋋtr!)--lv̌ ?*B1FN\:Ә_i z@S6Zt#+F;"(IqzvI&y0Y0'1lbTyLXq|-V$:+]5ZRiF7mYd/y[sY-g'J=-L ]ƺsɬ>6FSJѤ9@ u i#3նKٜ3G\ӷd1#l‰5 1]4C:D䐔f[26ե*>LFPvbbbFiBiGڅt##luw||<8n݊h"y>tH2:HMgh3k를GЭ{w2{$99z8ѽ;EXȝQ!6КAP҃y" %dRBuDISOj7MѸ9Pcˬ1:BcEYV/m#8ɐ(Yjt f332sfؗh+iM[?eCKc4:VЕ7[0hto/mdݰEgn>L׮]'̤ժxNw9BnLmlFm]m`mUύs18<9z8v=zP̂b!##?8?|>lڀva,+;4"@"yž"59޽U.izp8mDeEJ otGƓٸJ"eH-GhVqkTnmڥ&8F] uE-qh7ˣW'k>hP05: kl5@:b#9:]#cZݵVYtΈ].{%W~~T;HIqjrrRΘllF1 lErGa!rQ^^NZjjSTXnu3zdd駟ԩS9vh處k ;{I2fZ@ %y>jѣ;VKb!>.ΑG%77WZ1`fl4KSV06hQG١ta Gh촋R֤Tey73oⴂdkâ?x#M$$I555ګ?wR[[˛o,߻]߷6n܀eԨ'F]q>oÜ̢?H[dhE!m=7m̈G$|>CSHKKڱ2 ,|]l6$鞑2Tdձp{p@@<Ǐ'N`$N'C '77|4A@ukV"גŢjLZz&NH׮]C' 2 J;e_ h5yp)xWI"-5[n5@I]E[ G^hДQd$$I"==۾=dY^wu'?_aРŅ o*zUUVef9K׮ 0bMGG]8(EӜ),S[W sw[mQOPnmm-oEmE֛|˭jۙ55-<5k5jv/М3DCCNC665-t^Gy yrjZGP_OJj*il޴{+7>}yܾ*Kׯ_RStNi²Ђ #y$R\ ݞp{#+;Ձ0i󒜜LkKKԕNV$|l6]Hk{㏸ IM8BC?z.fy|>} f $'Go'r(j~?5rai#%I7| ,/Xe]H ֥b]tIZ5nJQ;q"C]iv%Yfm)+-]POld7d8.I6v0ysZ[Wۼ~:rcƎӱX:t+VRY)S궖е$7J4cjt`JY_ UCc-PULg;@x$%%vpةcݛvرcU;u0ÂzHr:u6VeV^ʼn'֭cƌmUcWs7ZtἈ]$|^/>Z[Zسgƍc-lٺҁlٲVcFfmY{t&QШh6uK7p'h[Jk|<G*c|xϴ0~,V+K T68B--lٺ&k.oߎ"=- &'|,˼~E;v۶r%- 'tZ_KK [VV^EXV >|w~7݌D ywqM;o3nx6oDrJ ]xnիWQYY @^^>&zYf5_WT 3vxV.(`֛o0aD6n@Jj*3fr|TUUaZ).*bԨXm6jjjxL4 r)*,d Xʕ+ꫯ~z.`jjjX0u&M̆ IIM dY<g"CjJۇSPPȄ՛nʦius8Ȳ/_‘Gؼy瑒+/0s9r[cRsʪU+>B}C}!^xa甂b`n(.)ѣGmٻwo~Z-A;:N`1XYٲe33gfjl Az ǃ->>Ol4(0`Uzb- >ױd6t(eeenZVsf0+;q dpp. ʦS`pP58@%Z-}(//]cZuAm P0jrrsX|/ř̬3űzJʘ:u*\0 +ŬYcYj%k׮eڴij$ $%%Ųѭ{w<$| V\} O?-[0d7 hw1;j˿ફfqq5+|\}Hŋٸ~=#FҍLrDecǏ1{U{鲥ج6<}6obj\}͵x}62beXϜ9#I~ ׯgcGk62: ߠ[WVѣiiia_pW㡱1Y( Mcc#iiK˖O(++cر|g8|˭x>U52]v9* :%bIKKc1 3r(fͺ7X-ܪA3_VK.%3#ESs3H3f7`ܛ9jm.fb^ӧ3s,zMν ,Uu%MSSS,_6k'|–-KrcJ02Z0;3:֭+wA$+;+Gp/ȡ]"dF[Z] :;vN语mPm9SY,C}ٲu ׯc(++#5-0û;ܿYŽRӵ5OP'ρj<4Tl)SӰgʱX,oMػw/CSW>F~Y㑢XePve#.$ѧo_ QH1J^b$R^~ES_gѢihh@w=UUV2|v; 2}M096dP VK`EX?#Gp`X޽;(s>Fnj1d`}j0ۣJ_?GbIjÆ fap\쯨`v:l({Q`䈑Xm6:l{Qrƌff1tP5X~X-4xػw/ƍn!Iv.]j%nW{nqq8v UM_3fXl>B)~q褝K,|{0νɓ&EÇ;5駌5nѥK18F;C:lH ] Bz5m4x0LSv3zXu Lyyn үGe~,jǃ_C]3;xV+豣a .YVjkx<8P;n*++2_C ̳ $$餌2vp }-K~^nNKk%I؝vcǏN]wdGZ` kq,2n*bt`)Eݻx= FUKX$hlJ …*yX%(O^\\̦(^ ˆ` .Kw{q޽l߱]}a@JĞ={ؾ}.n V $''3f8Z[ZX[˿`ƌjĤ$DMJrҢۻ^]ג$~,t]Klnn[oJ{Qun;j$x5rRۑXBss&9x'''MAxcAD$I".>!pi)h_i_3p8~Elټ+ӵ[7ƌCFff B'ըDGJ^ /2́UNil'X,t֍.ݺ5yt㒐@}}=64DaA![lv$IM;M6ymθ֙fӝC$lM04ck:|oʪU+ҵ+FG!Y9kNnݢ$ }p0eTvlƚ5ҵ+#"7_$el z=OIM׆l9hF[k͢F3Hg˖$$&RXX)))a}.}:;NPkAv o^8a ޔ!'pSV{6t:щFR ZU]NjŚk8 رc|G;5].֬Yv|ð~֧$@R-IHHHnlj"!!A>eoۥ̣BŘ)T$$$ IW_}M ׆)לtP1︠hjl Y!5q:Ȳusn$7DZlhuS]Í$Wn.yzضu+})s!t"p8HJJ:1(%uC+IA;5fS4kn:ݵmP[[×_~{テ餤EE# ܵLӉᠼ D+#$DZQ}Q jm/1kdeeqQ{]]vldnBp  ;`] ˎYs--\.AϞ=9zXZ Ǖerss,]ٳɌĠ#l ʂfjrrrt $.]XlvT5#^(HۇJk.֯_OQQN֑n ӕ뜊(а^ݵ{}JxPa@'P.:V䰼`KI|NldUvߑe?6Bcn؈b]ec4͗_~={(--d|~,p}޽mljDj8Ϯ_fr IrmVe?.W+;w}x 6lڈ–͛)((DF&))Ne~vJhLCmGٺuxn~GAFnѻ7k֮ l2-8p 064Bcb4S&`vzl}>f6nHQQΰ_CKk 6lIlzJ<7 D:'0 VY n+Wr"IDuurPx^,K+Y% v Xr.Y9ɲf#//kzimif6('JeW^MIMMc̘p\ _d/|޽;cZ:mkV_|Ն0lp`Ջ5xܮV6mܨx8l۶UΌv٢s2BV^BF\&*J8:?Y\˗;:)x_Pnu%^#0ssrYa=~͛6QXXڀkЭ{7?us@v ƌˉ'ҚY)ͦ;7ӦNUB>L:}xB$Ib0p@>\H7j!%ID v}f ԋ&gժU_0BAJm9j$VR@P?~Wb@{{ѽ{wd`+[[o%11~ճgЁ,~5%߶8q"+V7"̞=Y`n A=y$֬Y_񐔔Ār_\bB" `HĄ]xqҤɬY_{M#o Y}~6lXϧ|LzZ:SN S$ϲeKTjy&zj^{?qayYb^z%IIđGuL`w`kHĥ^FjZUUUy%I"?/^p\`aÆdbrsr+^OaÇI&db^yII0G »CbB `߾}HʜʂJKs_L0kX0ڗgfO??oFp'|rnq.e6n_IOKc@ J׿?o$1s  '1!W_FoN4-[P[,E^__Ϝ9sZ^{-tDe*WR]]%^: n@bR" x v0et֠+sVVaƭ66555b4 HoQN+ "!>zcb=-$Ffo9zHԌ99Hc@^ cQ0p8<L['Q]U1ZQUYInn:MUu599TCSc(|.D};r:%AXEʣlQEʣM˲L]]o&z[8X'RD?-qֻQQO>~C [6ov3b!ׯ_9j4pSSSMӷ/YYY 2+*Xz\{]XF\g32ꧽ&-vTivu!]'<2&mX,԰`nn/L/S;2؜\RS>+P[,ꨪYRS{cL[ȫو$ r=øhwN9㞲d0\>/0^/;w"==`p!jkj(*.!-8NbctIm&oXZm(rt]hSŠR_L4y ډmfRէeLnʺeݻS:h0YY!I'N@Hĺ [G3>];˯E 7ha΢,V5=,OUM2Vp~ ~Y&KZKHOK /[t|>_lIKK[˘9kt{zz:t ކ6";xq-Q]U;ݻYd >χfjRPXHv:UzFrtь2"°cu#D23!_Լd#2F䉴)*' "$CIk=(ؾs')dx:ډ\v1:!++lCe9a\,YlV+ :Lud~#8vN/smMIt0:+B,O 3_5rztVVVҠtj!C;hNɨ~Y&gOot/R0%b#Zdg<T|#d!C4 1o*(8Nh;-'TW6>ڱD6>˥x찕.ZThzL yO*ON,Lv"Q(LtXa'0/zEQ16> cEo#f HߍC ~5709#)"E9ֺr~Zx}p;ht>,\xl6[@|^aismgݵue]M^p!,Vkp.RT\46&c-͸Vqq$%%qiliQ=dYDD IVhQZ<]PЋ:5:D7AP:eO5l>1Zi(Ь\DqK6,ǸeȯS3a66zI& "9Yǧkt|ڱֶ/Z=Zxcdp8p:!;|RWg JiKKs38gz6)R_;=ff0f%|w\IXm6|^/nvmjiTnuJCbuwGsS-9VZtGU44NMw؉P҆,A0{Q[/#ݩh4_JSDOa:F. eŽ锕®Ss |.YDHOC'[ie|@ccttgEZݵz-L A5hm14s,\Y#/\P磵ΗYX_h=Q ִ #5^LKsvZ"qeEXQrt#0$6ʊU%:TN@@ k<(pgZ@ F2~xx阝&(o-HP=?$ɅgZ6}is"v;tz ~\pzFiO3 j"&1&uv%j'd/6t)T :?_G_ǞViz[C&; -n5===-/Žg ]}/<>䔌b޺!aW!f歏rڂ<5g*~_1#\}3@ r:;7f-2MSQ]|Y|>?5__}Vc_vcj ]̓q_oenbfyG>+VT:s>wUM$;.;245*nGg&SJoa¤΋xj{9P׊4מ DR8VrnK֥fϺlտQ{j?J/xWC!Yp棴:x_>綿Oؙ `.~%|g9ҊG~OIM+2qxtjcڔ3KtۣqQ!|~#5 ' EG<"vrs |iU5R R:|whrM<U/+'6ɭOoa>yyy>S[˹6=<(,Q:Z-b:ܕr2~o+/֮ ۏ,{Y|=]诋_>f+p]@p$zWaP'#uIzfK~a-fH#@/EV;?Mgvov3?rwM\1999 ͸iClL)F]dm9 HIXlL[4}(^?7q|8X@j^.qXLgzY"{w;ک@ w [p@ ֢?t7 ~JRZ:k֝i5O>Mi逘cN#F$ΧtjkcA8̨#5@@ 8uP@ |kifm:n@z81v@  cu F8~3@ |#?~@pn` MNNy5Hg.cɟ*!ItAMܤCۡTUU#nkØ킝9466ߵ1Za}钒LJJ %#3@ u5l珼|EP敇ocHq>9yvC~I)ܷ2Ts?AybE׫il|WDc/} .;@/fd ͳZw6}r{+K3yeGOɣۛ9R@}}-n?dڙVK N9rc̨b.ɊR߸ʯ27c1\MsNjKbjڇgb۰}tupk_>ݺ]6嶏pnb}lb#3)ॣcY+ڹч_dE%O7}e¾Ȣ8ɤgq4WǯoFWg]{l)l:Nt !nH'9  k|oMd?d%ȓn@ h(@_>r9N;G^r#jĞ/wpً-;#R|y'O>cS (u'u-)6 [b.=}2l3oOR#xd>,ɽ{} y'3`#{#fّuã; -/)PӖp"Ncz/&kڔ]hcc#f=|HW6--8FlIM .\Drn$ZF7G^^%S|{O1e@_˫B7lnts^Z\ĺ9Qu*:w۱c(u I9Aw}~}_I=wKT5l>^ʱf/H6Ru2=?leۥǑV#)5 (s=8 t~ /yi| 5mVDa;=xZb~7XG@MCNPyNx<~vQG<_+F!'';j/=ʘa^緯.PFCJ UMo[iG9,IzO~x17 .!//;ȜeL('do' 8XwC1w4[}Z~ܢxkw;<¤H9_ _d@m:t; Yh"yʔ):ڮLIM;*utjjN^ֽ@[5p,]BW{JO{Gnz{-lnk<Hd}٣p?͎*͋~߽>$u͌/"*1onHa%%/z;I N'|n)x}](ŋ<`G:;@ '(^-o-('x6G@ 8F9ob+T :O#XfݙVC <Ӕ9"00j 0H@ |JK6<͌9]$Sť&@ |1s"<~gZ@ 3|jkkΈ Pt03@ |cꫣaE$xu"SxDB ZN>]U}HOOW~iLOOWJ)x |i\uuum?kc,{G;7\FLj@ t(eqX;wƼ{<'`4No#_Eee~|~vgZ-@ 8evh\Z6WG^"?z<==/Q(z `.(FE+Ɛ|rr{3G9GM`>dg_R5Td_=2 (3_1Sfd =ͳʏG_k\}2IGwvr IDAT-gN&8㩯;í}tv[wG8A]/ީ_ `cdE)oC[Y~so=w*n_n2+ٽi!ڦv;27// .o/S5R 2: ڝGixWגb%&ƥ,?[T1v:&rw_>r9N;G^r#:dˤX%|#^lIy^{yoŖɽ.zD)呗Ga$>]hU/ǁbʀFOWn6abjw\KX2Wp;\@ te$%.1)B^ܙG˝Sp ?]rGWM`ޮr#MJ!WgUj,s1--]ub)I=K*Ȳ,vB -N*tggۇb.gK/7sMaAoNꐬ^r/.Xp@ 8hwC2/W8A@ [_wECCcϾX 9swhzx@ |ӑe>N0==]̚}ZwwNYo1 S?O{P$X]]MUU>ⶱv1y/tOZR sz6H{kL֗.)ɤP2b:>?* S1+?zvEZҲ?ᖗo %7;B.>4>@7 y6;w(l~S@Vv}rLu|LևKJ澕!W!f歏rEG9Q2&==Nw} Ghb5P__;.v@~j@}h ^.˧)42㩯m+ߧ{W37oW]2duu5wd&YFᶏpnb1 pP]]ލKմ ]̓q_oenbfygtML,~t=S΃}z-Aɟ"IPأ =ìw$gաhI}ٕ$gWοd#˿tr҇.`ۿedQOd3ej>WǯoFWg]{l)# 6l')˧X%|#^lIy^g_"iG: T. >&ou7-F ]wH6<κgYpIl?PC3xh:׾ߕ凩;ǟc⏖E7=E p7g(_GccGw T~8kh=5mK({S!W?L.n`1K?N_Ge]v/=+ N=XHV'6ɭOoa>yyy~L,e&ƩR'ns qཧ2ӯUnf(&//< K TJݾҘ3֨յ83y(|_Ot?Y6l =+Ols$=VplO)O)*k67y9{0U/bK`ŖO^z?m/Gd;59{~S[[K}ao|TN,:EG@pjlRrӷ/}pd*'sMP|K+IɿK{Υw3Yc۽Rl+2_Թ﮺e\ː+y? پo/l2\5[M]TTTCN ;?|% G:-a}gjūӦn mk4?|?}HM`+T;FvyCjFS :u nf --4eߍ&Uo*'@ 85C/{}cÂ2^[/۸;T&םT$?;DqEFfKnknde&JH+51AWJSQKP2+FCpY\fyܳsÇsl^?aQ!vA1%akikغ_љi[*/. U! "18rL^d$b^)kbv-5XRo7x*I6o!33SrsstWfMtӧG"Gcڂ63G0>H z=3[Obä́=aKcF?:Cg2{o֨񂡘 LmgVW`߶pOLOY]vBv8cb7{-ciDTkgxֶWQzoN߀\Ti}m'_i{07æANxP@oV'?2$vMiq3OUhڛzhnG~ /=dZsaoi:O*T'8sw8 VZ 'M{݆-A԰%iG{vY8V)k nSdn?V15[nEjȵpB#e#0ڽ5us2{K(#OiH\&kGm} 3F -~|_v̓aj]t[s Wvq6-1h<(|fZ+7ü{'dzCԧO}DT{Jz/^2ӫ#AQdd瞃z(i2;5VTIfԟH$њh)Xipz2OU'5.!\^Ǝ_V;NRg?~/ЮS*މ͏*c_JA{Ǵ_t4kqN;{EDT} =Q9WW Kfe% ]x)ʳ@:zQ(]T^: &$GtL,W'"z($t#"O=Π+{A]AФb,$tc~ 7onP &ů'"`V'""i ؙADX*yUqK(aJ`JDTcb@w 84١DDG ݨhb$"FF-%JCDDDAW3` X[[ JJX$^?Q 7Wl@W*a c1~rrн-6oQ AUxr'(H4>_:yէ6Eg.QVQ]/]1x*,([!X]E!,Rl{~>JFR[b_oϠض7ى_ʓ2DpZQԛ|" Pc%=SplCW3+RE?)8+L^+;v(Br3)qr 莨H7#0hj_q6@وuM͟#ų'o:VDaAp 7;ǖo7DD Q{?Y>6"DsdPXW!7;ʭ9p‘z Hړ-h% iϪzMLsyBطuԛ|"Z}XmӒÛi.M.^uEBB-0gRH+(S͛8AUp54&/_&5* }yZط17}U(?I:'4Mpl*@ &N&!2P}.q~AF28 oAz tln͛"p2.@dc{Xh\KkD\/[~j8[7DD M5Vwܖ14`"]{? v' n=qJ2W|kN8&X/)ސdVfC^^g#Ar}̨7DD MˡFzU-Ww[ffXi/mҝߪ<$׿Vvg#~YegQJ?}Xu~4 [0=V(_DD Q߻Hs}z5!Yuѯ\EnĴS*{>]Ǐ׏ˡDDDuA-A""jMH.oغc+$t#rݯԥVCuPC""'~C.鯋_g~@DDT3t9^%"FCMXU "z,}9j_i֕C*g4g[@@ hBo!"\tL,Tb\G}{R(..6!Q4NA""wL540otx8C]aYD/H =sG6pOyRRmk=􉈈j^i4f3DYT˶*0BL!whjI"?BRT`egӵJ%J%RDf (H$4Ӊ⇗C*J<Z{\p}&p¨lkJ|8 SWfAYH$xIꁗg5K<OOȲ+@7|$]'d_b$"j$L? BRzFފFemEB&"5%[Ðu 'qg'-ׁ՛.{@/"Af¦XX6|$˹bApt#M_DD;w7J7G:&93H3%8ݟtEKjNuVnm΁DAenG+1M[#P\,b#ܷg[ò`0òR4d2d2xwz׿zjucW.Йl~/Ĺwp9<3q/LGT\M(١b@av~ |}\i3K#M>[AADa;Up4̞~ PFPz*9E~^c=i.*[d-%_l{no[Mwj١ x{4+)`yhrntMi_BP[Z 2'Y'`aP\tQ"{񁏏^o^wk÷Gaߝkkcy~^QX{DD&SĘ.'U>1G;1Ti%vJxPLL&öC;<~>pvvFRq`߶pOLOJޯc <ڴFVm!HnYU;4OY#}8O̞7TP!9zIDT~D(22Rݷo_^+֢e>*I$ܽ{פmօ;^-4g3 1գ"R Ezxl\Xȹf 47DD ݈1c^}fd(L:E+VF3.8~QbbNUO.o/GY4bI٠JfDDhr9DD%/R+ ݺr(QecbFlkM4rv(QcbR#/_BUyq^A""j~X QCgk1eE""= Dno7?<\!urF,"M"Ls"uejQ6CW  ]RRTՐ;450*.,2ַxmoD"ݧitHT7""^TؑVX=EH ק{`2" .>ݰl.DHh\"d/Hgrty-:o{~>T TW>GbCxG'H:{b]o;\}aSt:_N>np-e_NCG/78cUYPF{R3ܼjEM/1M541  -Y+($g,8ŚIkKaGFwD]NF(tAKOj]Gz.V(J(Jrʹ $t3RgĖ~ ׮Dc<^S̲gprmccE곈'wŚkrEB&"5%[ÐBcVq(qϣXg[ m1:(|;s i N]Ǹ0]z_?3^Ks7΍sx6m+z?fPDD Z ݕ:]Q bGN_uxg@ |[Lۦ%NEv(VK9mo)[EaNFglݗ'ܦ`+xwt0* c 2 ^ݡ*HO3q3>] D$![pc<]_5۩9E~]c=Ve"8Y!v’/6# lu94!QQ&!Q}9GY:bԢmȹGOXTVu6Ok8 "6|Vʝ7E#}0{=bNB@Rai_BP[Z !YǑ`+ ncvaZBv'IDAT!|yf7t&'Rt1z$VmUXb-X# [$ 内 =_U^:6]QU#:3|qS/|﯑~氵4CA5l]_vn%3Vd$Ԫl[vOzw'iZXfyFCDTU51IO*s%wNc>h .aKeUZNܼ{d"Ue _od2lKYiyxOmΐޛ;A:<~>pvvFRێURg z[FqEbvؿiFq=m#n橠MCks9nCDT#AQddo߾,$lXCzH$Ҝͤ.TH'yo4ran#m+\ cƎý,IƩQ6uV^4ᳫ ǣк5Wd,K27G`/0i׈ѯMw=*_U$H-cG\O#:&+UCy]iTӐ]AЄuP2󉈈*sڨzry{w>M_g~@DDT{5Z ؙADX2r(W}[W^%"LtL,^5Өm P3G&T9;r1P{HoޣAA""w~X޸_BT~mZUS8$"zT#AH;EjtC$T 7ta,6xQݩjQ6C˭oT8]GlK_*[\Xht; H$4?*D"Qt0zQ W ϋ#1OuQ&BFGF S-Ƽa,x+lE 1[&Q۟ɶa|8 SWfAYW Ƌ=:E*/{~>T TP_Wd_bu "z^FaS:ƿ3AؑQ|9 ]oF`ғ̣8%/ɪlcA\;KDsk"T!?ɭaHQABTڕhL+#wV(J(Jr1k;Ga[wf 8:݊CG"HѝSG9 ׾/r$!t<8Z!rDg!Hڳ Phg]q z>g[ m1:(!N 3M[bB.ܾ޸31q_a&~@gnlVĽ$"2+WSur5U 'ܦ`+xwt0*6y)-}K(̉T3M4d`t{/d2d2xz?*Iȿs{L}?yA&ë;Tƞc]H5ۓi.*[v.bk',b3zIDd.&$*4$$*/f$XbІoJ3h?mcSY~~ X< t臾9pcWk_BBsazB5W'yn7,\돊 مTo< ϛDD&T٤@|B2 ^H内 =_U^:6]QsE4l~_48b5.BB>}JZ;]K٢2q?Ű4 a>yXlh}= 4}m-p,3O< [_Swd'Ƙr$mG`L k78%C{ ۮ8|x;;܍ -ciD컔) [3>{F _od2lgCKa!~yb*7 ́uuK"g#E}@,$rlSCzH$Ҝͤ.TH'yo4ran#m+\ cƎý,퉗ƩQ6uV^zڿgW7wDEEiuMk:Y/d&n_aҮ_f`A""w~qH QeHDDP^WU/&4zg4.~|""Ĝ6\^]A٠>hFDDG&vl,n=x9+ ݺr(QecbFlkM4rv(QcbR#/%tyq^A""j~X QCgk""jL540otx8C]aYD1D"T*T*E'7*~zV$"Sբm080BL!whja T*T*z%Η0c< k/5I$}*$i+oOZ8|_-lmmam#oQ?ZelZODŽ6Zm*fDJխl V"@$=0q 3`FSse)%# Knr6C(.~m_EO]}֎gro@À/Hgrty-:o("BbvAY{EwnpKwD"K$\:yէ6Eg.[ڪ,Kзq']1~Q6;;ٸq K.6Z3bM E4χQۑ BRzFȺ)<,ۧ2\3)8YFH?8\"&:/̾]M,qp$.Ė~ ׮Dc<^S([C̓~IJE⅟ %=SplCW3+RE?)8+L^+|$˹!:߯"lk ^焩#nAȫbʎdIaOq*c\޴uX=W!"zTGwnNn2EFFErʱM\uI%!x?3bܣ-} ueĒu% MPEpuWG,K6% fMlX GRo?M*Z<[7ϻkP^~ptwjoA{umS9AHs[Hp$Q.]chw򴾛xB:j2/=WhW}[+Yh[po3nmr3x6ZmդЍ8qht*{j~v}9 Mվ QQQ[E@ 70mHco| }>^$4)2C*GH]B_Tw.|Ł{U>*(Ls1=ڳuҾi{umU"?@ t 턜|+u!EӖ[6<s_G(DC!>ݳ@R6hj^kevqtMHTK_+? -l1j6#q"#oɞzm7/iL>fGIP(HJ]#_ncmWז>yn0PWOL Юi;fC3}&!f?^#&Dƽ;%j/ko&x<*5pjkضkXǓ H;>N;Ӭ)w|'4ߓ8?ϟDž$,àsB1\PbG DHO3_1N^5> v יp~ 3/YZJB-^F'myde+yDW3aowBDTQHF;W_l:U{c{黾^;p__m\ړHjV@Y <9 ʹ:a T[w tQڴ|whqa=;BܼvTqXIPYIߺ^]HY⚲&Yk[OéDDC cG\O#:&+UCyݸ11!׻< u dU.&QZ}0XZm(J_9oŀ/΅ >mcSY~~ X<-O>fGIP(HJ]~U\YcvbpbkW$D DDQA0??_c+Rܰp章KǦ6*Ps氵4CA5l]q1Ð9;naja)Ftf~2*:::jlA{&؝@O/7y)DZK'l v6RgLBf0Wtqw~svKgyn/ ?x ]>^0S|!ɰCQddo>P$' a_wDD,$t#MQQQiDDDA-A""jb4!=cbDDЍ]A"u DDD5O.o/ulj/Q HDD 5Z DDh1Q HDD 5Z DDh1Q HDD= DDXspp1ct1c0c| YA; QQ1 5*@AC c3g̙3}$"Ǟ{DD3& M[""bH,'/"770+,,Z]7'@DDd C`=A+++tEӦMQPPсO>$TEus&DDD& +++aÇ_DDD`K :l Df"LONմWr)Cdf݃E ϑjU -7,,,DDD5%7/bss!V,,, /rA7_u{IDDT5k\-׊zIENDB`RODBC/vignettes/RODBC.Rnw0000644000176000001440000022053113013621651014465 0ustar ripleyusers\documentclass[a4paper,11pt]{article} \usepackage{hyperref,color,url,alltt,parskip} %\usepackage{Sweave} \usepackage{Rd} % mainly for upright quotes. \usepackage{graphicx} %\newcommand{\code}[1]{\texttt{#1}} %\newcommand{\pkg}[1]{\texttt{#1}} %\newcommand{\var}[1]{\emph{#1}} %\newcommand{\link}[1]{#1} %\newcommand{\sQuote}[1]{`#1'} \newenvironment{smallexample}{\begin{alltt}\scriptsize}{\end{alltt}} \newenvironment{example}{\begin{alltt}\small}{\end{alltt}} \setcounter{topnumber}{2} \def\topfraction{1.0} \setcounter{bottomnumber}{1} \def\bottomfraction{.3} \setcounter{totalnumber}{3} \def\textfraction{0} \def\floatpagefraction{0.8} \setcounter{dbltopnumber}{2} \usepackage{color} \definecolor{Blue}{rgb}{0,0,0.8} \hypersetup{% colorlinks,% plainpages=true,% linkcolor=black,% citecolor=black,% urlcolor=Blue,% pdfstartview=FitH,% pdfview={XYZ null null null},% %pdfpagemode=UseNone,% pdftitle={ODBC Connectivity for R},% pdfauthor={B. D. Ripley}% } \begin{document} %\VignetteIndexEntry{ODBC Connectivity} %\VignetteDepends{RODBC} %\VignetteKeywords{databases} %\VignetteKeywords{ODBC} %\VignettePackage{RODBC} %\SweaveOpts{engine=R,eps=FALSE} \title{ODBC Connectivity} \author{by Brian Ripley\\ Department of Statistics, University of Oxford\\ \url{ripley@stats.ox.ac.uk} } \maketitle \sloppy \noindent Package \pkg{RODBC} implements ODBC database connectivity. It was originally written by Michael Lapsley (St George's Medical School, University of London) in the early days of R (1999), but after he disappeared in 2002, it was rescued and since much extended by Brian Ripley. Version 1.0-1 was released in January 2003, and \pkg{RODBC} is nowadays a mature and much-used platform for interfacing R to database systems. Thanks to Marc Schwartz for contributing some of the experiences here. See also the archives of the \code{R-sig-db} mailing list. \section{ODBC Concepts} ODBC aims to provide a common API for access to SQL\footnote{SQL is a language for querying and managing data in databases---see \url{https://en.wikipedia.org/wiki/SQL}.}-based database management systems (DBMSs) such as MySQL\footnote{and its fork, MariaDB}, PostgreSQL, Microsoft Access and SQL Server, DB2, Oracle and SQLite. It originated on Windows in the early 1990s, but ODBC \emph{driver managers} \code{unixODBC} and \code{iODBC} are nowadays available on a wide range of platforms (and \code{iODBC} is used by macOS (aka OS X). The connection to the particular DBMS needs an \emph{ODBC driver}: these may come with the DBMS or the ODBC driver manager or be provided separately by the DBMS developers, and there are third-party\footnote{but there are close links between \code{unixODBC} and Easysoft, and \code{iODBC} and OpenLink.} developers such as Actual Technologies, Easysoft and OpenLink. (This means that for some DBMSs there are several different ODBC drivers available, and they can behave differently.) Microsoft provides drivers on Windows for non-SQL database systems such as DBase and FoxPro, and even for flat files and Excel spreadsheets. Actual Technologies sell a driver for macOS that covers (some) Excel spreadsheets and flat files. A connection to a specific database is called a \emph{Data Source Name} or DSN (see \url{https://en.wikipedia.org/wiki/Database_Source_Name}). See Appendix~B for how to set up DSNs on your system. One of the greatest advantages of ODBC is that it is a cross-platform client-server design, so it is common to run R on a personal computer and access data on a remote server whose OS may not even be known to the end user. This does rely on suitable ODBC drivers being available on the client: they are for the major cross-platform DBMSs, and some vendors provide `bridge' drivers, so that for example a `bridge' ODBC driver is run on a Linux client and talks to the Access ODBC driver on a remote Windows machine. ODBC provides an abstraction that papers over many of the differences between DBMSs. That abstraction has developed over the years, and \pkg{RODBC} works with ODBC version 3. This number describes both the API (most drivers nowadays work with API 3.51 or 3.52) and capabilities. The latter allow ODBC drivers to implement newer features partially or not at all, so some drivers are much more capable than others: in the main \pkg{RODBC} works with basic features. ODBC is a superset of the ISO/IEC 9075-3:1995 SQL/CLI standard. A somewhat biased overview of ODBC on Unix-alikes can be found at \url{https://www.easysoft.com/developer/interfaces/odbc/linux.html}. \section{Basic Usage} Two groups of functions are provided in \pkg{RODBC}. The mainly internal \code{odbc*} commands implement low-level access to C-level ODBC functions with similar\footnote{in most cases with prefix \code{SQL} replacing \code{odbc}.} names. The \code{sql*} functions operate at a higher level to read, save, copy and manipulate data between data frames and SQL tables. The two low-level functions which are commonly used make or break a connection. \subsection{Making a connection} ODBC works by setting up a \emph{connection} or \emph{channel} from the client (here \pkg{RODBC}) to the DBMSs as specified in the DSN. Such connections are normally used throughout a session, but should be closed explicitly at the end of the session---however \pkg{RODBC} will clear up after you if you forget (with a warning that might not be seen in a GUI environment). There can be many simultaneous connections. The simplest way to make a connection is \begin{example} library(RODBC) ch <- odbcConnect("\var{some\_dsn}") \end{example} and when you are done with it, \begin{example} close(ch) # or if you prefer odbcClose(ch) \end{example} The connection object \code{ch} is how you specify one of potentially many open connections, and is the first argument to all other \pkg{RODBC} functions. If you forget the details, printing it will give some summary information. If the DBMS user and password are needed and not stored in the DSN, they can be supplied by e.g.{} \begin{example} ch <- odbcConnect("\var{some\_dsn}", uid = "\var{user}", pwd = "\var{****}") \end{example} Users of the R GUI under Windows\footnote{This does not work from \code{Rterm.exe}.} have another possibility: if an incompletely specified DSN is given, the driver-specific Data Source dialog box will pop up to allow it to be completed. % Something about security here? More flexibility is available \emph{via} function \code{odbcDriverConnect}, which works with a \emph{connection string}. At its simplest it is \begin{example} "DSN=\var{dsn};UID=\var{uid};PWD=\var{pwd}" \end{example} but it can be constructed without a DSN by specifying a driver directly \emph{via} \code{DRIVER=}, and more (in some cases many more) driver-specific parameters can be given. See the documentation for the driver (and Appendix~A) for more details. \subsection{Reading from a database} where `database' can be interpreted very widely, including for example Excel spreadsheets and directories of flat files. The simplest and most common use of \pkg{RODBC} is to extract data from databases held on central database servers. Such access is read-only, and this can be enforced by settings in the DSN or \emph{via} permission settings (also known as \emph{privileges}) on the database. To find out what tables are accessible from a connection \code{ch}, use \begin{example} sqlTables(ch) \end{example} Some drivers will return all visible table-like objects, not just those owned by you. In that case you may want to restrict the scope by e.g.{} \begin{example} sqlTables(ch, tableType = "TABLE") sqlTables(ch, schema = "\var{some\_pattern}") sqlTables(ch, tableName = "\var{some\_pattern}") \end{example} The details are driver-specific but in most cases \code{\var{some\_pattern}} can use wildcards\footnote{these are the SQL wildcards used for example in \code{LIKE} clauses.} with \emph{underscore} matching a single character and \emph{percent} matching zero or more characters. Since underscore is a valid character in a table name it can be handled literally by preceding it by a backslash---but it is rarely necessary to do so. A table can be retrieved as a data frame by \begin{example} res <- sqlFetch(ch, "\var{table\_name}") \end{example} If it has many rows it can be retrieved in sections by \begin{example} res <- sqlFetch(ch, "\var{table\_name}", max = \var{m}) res <- sqlFetchMore(ch, "\var{table\_name}", max = \var{m}) \dots \end{example} It is often necessary to reduce the data to be transferred: we have seen how to subset rows, but it can be more effective to restrict the columns or to return only rows meeting some conditions. To find out what columns are available, use \code{sqlColumns}, for example \begin{smallexample} > sqlColumns(ch, "USArrests") TABLE\_CAT TABLE\_SCHEM TABLE\_NAME COLUMN\_NAME DATA\_TYPE TYPE\_NAME COLUMN\_SIZE 1 ripley USArrests State 12 varchar 255 2 ripley USArrests Murder 8 double 15 3 ripley USArrests Assault 4 integer 10 4 ripley USArrests UrbanPop 4 integer 10 5 ripley USArrests Rape 8 double 15 \dots \end{smallexample} Then an \emph{SQL Query} can be used to return part of the table, for example (MySQL on Linux) \begin{example} > sqlQuery(sh, paste("SELECT State, Murder FROM USArrests", + "WHERE Rape > 30 ORDER BY Murder")) State Murder 1 Colorado 7.9 2 Arizona 8.1 3 California 9.0 4 Alaska 10.0 5 New Mexico 11.4 6 Michigan 12.1 7 Nevada 12.2 8 Florida 15.4 \end{example} Note that although there are standards for SQL, all the major producers of DBMSs have their own dialects, so for example on the Oracle and DB2 systems we tested this query had to be given as \begin{example} > sqlQuery(ch, paste('SELECT "State", "Murder" FROM "USArrests"', + 'WHERE "Rape" > 30 ORDER BY "Murder"')) \end{example} or even in upper case. Describing how to extract data from databases is the \emph{forte} of the SQL language, and doing so efficiently is the aim of many of the DBMSs, so this is a very powerful tool. To learn SQL it is best to find a tutorial specific to the dialect you will use; for example Chapter~3 of the MySQL manual is a tutorial. A basic tutorial which covers some common dialects\footnote{MySQL, Oracle and Microsoft SQL Server.} can be found at \url{http://www.1keydata.com/sql/sql.html}: tutorials on how to perform common tasks in several commonly used DBMSs are available at \url{http://sqlzoo.net/}. % <<>>= % library(RODBC) % channel <- odbcConnect("test") % sqlSave(channel, USArrests, rownames = "State", verbose = TRUE) % sqlQuery(channel, paste("select State, Murder from USArrests", % "where Rape > 30 order by Murder")) % sqlFetch(channel, "USArrests", rownames = "State") % sqlDrop(channel, "USArrests") % close(channel) % @ \subsection{Table Names} SQL-92 expects both table and column names to be alphanumeric plus underscore, and \pkg{RODBC} does not in general support vendor extensions (for example Access allows spaces). There are some system-specific quoting schemes: Access and Excel allow table names to be enclosed in \code{[ ]} in SQL queries, MySQL (by default) quotes \emph{via} backticks, and most other systems use the ANSI SQL standard of double quotes. %More recent SQL standards allow \code{\$} and \code{\#} under some %circumstances. The \code{odbcConnnect} function allows the specification of the quoting rules for names \pkg{RODBC} itself sends, but sensible defaults\footnote{backticks for MySQL, \code{[ ]} for the Access and Excel convenience wrappers, otherwise ANSI double quotes.} are selected. Users do need to be aware of the quoting issue when writing queries for \code{sqlQuery} themselves. Note the underscore is a wildcard character in table names for some of the functions, and so may need to be escaped (by backslash) at times. Normally table names containing a period are interpreted as references to another schema (see below): this can be suppressed by opening the connection with argument \code{interpretDot = FALSE}. \subsection{Types of table} The details are somewhat DBMS-specific, but `tables' usually means `tables, views or similar objects'. In some systems `tables' are physical objects (files) that actually store data---Mimer calls these \emph{base tables}. For these other `tables' can be derived that present information to the user, usually called `views'. The principal distinctions between a (base) table and a view are \begin{itemize} \item Using \code{DROP} on a table removes the data, whereas using it on a view merely removes the convenient access to a representation of the data. \item The access permission (\emph{privilege}) of a view can be very different from those of a table: this is commonly used to hide sensitive information. \end{itemize} A view can contain a subset of the information available in a single table or combine information from two or more tables. Further, some DBMSs distinguish between tables and views generated by ordinary users and \emph{system tables} used by the DBMS itself. Where present, this distinction is reflected in the result of \code{sqlTable()} calls. Some DBMSs support \emph{synonyms} and/or \emph{aliases} which are simply alternative names for an existing table/view/synonym, often those in other schemas (see below). Typically tables, views, synonyms and aliases share a name space and so must have a name that is unique (in the enclosing schema where schemas are implemented). \section{Writing to a Database} To create or update a table in a database some more details need to be considered. For some systems, all table and column names need to be lower case (e.g.{} PostgreSQL, MySQL on Windows) or upper case (e.g.{} some versions of Oracle). To make this a little easier, the \code{odbcConnect} function allows a remapping of table names to be specified, and this happens by default for DBMSs where remapping is known to be needed. The main tool to create a table is \code{sqlSave}. It is safest to use this after having removed any existing table of the same name, which can be done by \begin{example} sqlDrop(ch, "\var{table\_name}", errors = FALSE) \end{example} Then in the simplest usage \begin{example} sqlSave(ch, \var{some\_data\_frame}) \end{example} creates a new table whose name is the name of the data frame (remapped to upper or lower case as needed) and with first column \code{rownames} the row names of the data frame, and remaining columns the columns of the data frame (with names remapped as necessary). For the many options, see the help page. \code{sqlSave} works well when asked to write integer, numeric and reasonable-length\footnote{which of course depends on the DBMS. Almost all have an implementation of \code{varchar} that allows up to 255 bytes or characters, and some have much larger limits. Calling \code{sqlTypeInfo} will tell you about the data type limits.} character strings to the database. It needs some help with other types of columns in mapping to the DBMS-specific types of column. For some drivers it can do a good job with date and date-time columns; in others it needs some hints (and e.g.{} for Oracle dates are stored as date-times). The files in the \code{RODBC/tests} directory in the sources and the installed file \code{tests.R} provide some examples. One of the options is the \code{fast} argument: the default is \code{fast = TRUE} which transfers data in binary format: the alternative is \code{fast = FALSE} which transfer data as character strings a row at a time---this is slower but can work better with some drivers (and worse with others). The other main tool for writing is \code{sqlUpdate} which is used to change rows in an existing table. Note that \pkg{RODBC} only does this in a simple fashion, and on up-market DBMSs it may be better to set cursors and use direct SQL queries, or at least to control transactions by calls to \code{odbcSetAutoCommit} and \code{odbcEndTran}. The basic operation of \code{sqlUpdate} is to take a data frame with the same column names (up to remapping) as some or all of the columns of an existing table: the values in the data frame are then used either to replace entries or to create new rows in the table. Rows in a DBMS table are in principle unordered and so cannot be referred to by number: the sometimes tricky question is to know what rows are to replaced. We can help the process by giving one or more \code{index} columns whose values must match: for a data frame the row names are often a good choice. If no \code{index} argument is supplied, a suitable set of columns is chosen based on the properties of the table. \subsection{Primary keys and indices} When a table is created (or afterwards) it can be given additional information to enable it to be used effectively or efficiently. \emph{Primary keys} are one (usually) or more columns that provide a reliable way to reference rows in the table: values of the primary key must be unique and not \code{NULL} (SQL parlance for `missing'). Primary keys in one table are also used as \emph{foreign keys} in another table: this ensure that e.g.{} values of \code{customer\_id} only take values which are included in the primary key column of that name in table \code{customers}. Support of foreign keys is patchy: some DBMSs (e.g,{} MySQL prior to 6.0) accept specifications but ignore them. \pkg{RODBC} allows primary keys to be set as part of the \code{sqlSave()} function when it creates a table: otherwise they can be set by \code{sqlQuery()} in DBMS-specific ways (usually by \code{ALTER TABLE}). Columns in a table can be declared as \code{UNIQUE}: primary keys and such columns are usually used as the basis for table indices, but other indices (sometimes called \emph{secondary indices}) can be declared by a \code{CREATE INDEX} SQL command. Whether adding primary keys or other indices has any effect on performance depends on the DBMS and the query. \section{Data types} This can be confusing: R has data types (including \code{character}, \code{double}, \code{integer} and various classes including \code{Date} and \code{POSIXct}), ODBC has both C and SQL data types, the SQL standards have data types and so do the various DBMSs \emph{and they all have different names} and different usages of the same names. Double- and single-precision numeric values and 32- and 16-bit integers (only) are transferred as binary values, and all other types as character strings. However, unless \code{as.is = TRUE}, \code{sqlGetResults} (used by all the higher-level functions to return a data frame) converts character data to a date/date-time class or \emph{via} \code{type.convert}. You can find out the DBMS names for the data types used in the columns of a table by a call to \code{sqlColumns}, and further information is given on those types in the result of \code{sqlTypeInfo}. For example in MySQL, \begin{smallexample} TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME COLUMN_SIZE 1 ripley USArrests State 12 varchar 255 2 ripley USArrests Murder 8 double 15 3 ripley USArrests Assault 4 integer 10 4 ripley USArrests UrbanPop 4 integer 10 5 ripley USArrests Rape 8 double 15 BUFFER_LENGTH DECIMAL_DIGITS NUM_PREC_RADIX NULLABLE REMARKS COLUMN_DEF 1 255 NA NA 0 '' 2 8 NA NA 1 3 4 0 10 1 4 4 0 10 1 5 8 NA NA 1 SQL_DATA_TYPE SQL_DATETIME_SUB CHAR_OCTET_LENGTH ORDINAL_POSITION IS_NULLABLE 1 12 NA 255 1 NO 2 8 NA NA 2 YES 3 4 NA NA 3 YES 4 4 NA NA 4 YES 5 8 NA NA 5 YES \end{smallexample} This gives the DBMS data by name and by number (twice, once the number used in the DBMS and once that used by SQL---they agree here). Other things of interest here are the column size, which gives the maximum size of the character representation, and the two columns about `nullable' which indicate if the column is allowed to contain missing values (SQL \code{NULL}s). The result of \code{sqlTypeInfo} has 19 columns and in the version of MySQL used here, 52 types. We show a small subset of the more common types: \begin{smallexample} > sqlTypeInfo(channel)[<...>, c(1:3,7,16)] TYPE_NAME DATA_TYPE COLUMN_SIZE NULLABLE SQL_DATATYPE 1 bit -7 1 1 -7 2 tinyint -6 3 1 -6 6 bigint -5 19 1 -5 18 text -1 65535 1 -1 19 mediumtext -1 16777215 1 -1 20 longtext -1 2147483647 1 -1 22 char 1 255 1 1 23 numeric 2 19 1 2 24 decimal 3 19 1 3 25 integer 4 10 1 4 37 smallint 5 5 1 5 41 double 6 15 1 6 43 float 7 7 1 7 45 double 8 15 1 8 47 date 91 10 1 9 48 time 92 8 1 9 49 year 5 4 1 5 50 datetime 93 21 1 9 51 timestamp 93 14 0 9 52 varchar 12 255 1 12 \end{smallexample} Note that there are both duplicate type names and duplicate type numbers. Most DBMSs started with their own data types and later mapped the standard SQL data types on to them, although these may only be partially implemented. Some DBMSs allow user-defined data types, for example enumerations. Commonly used data types fall into a number of groups: \begin{description} \item[Character types] Character types can be classified three ways: fixed or variable length, by the maximum size and by the character set used. The most commonly used types\footnote{the SQL names for these are \code{CHARACTER VARYING} and \code{CHARACTER}, but these are too cumbersome for routine use.} are \code{varchar} for short strings of variable length (up to some maximum) and \code{char} for short strings of fixed length (usually right-padded with spaces). The value of `short' differs by DBMS and is at least 254, often a few thousand---often other types will be available for longer character strings. There is a sanity check which will allow only strings of up to 65535 bytes when reading: this can be removed by recompiling \pkg{RODBC}. Many other DBMSs have separate types to hold Unicode character strings, often with names like \code{nvarchar} or \code{wvarchar}. Note that currently \pkg{RODBC} only uses the current locale for character data, which could be UTF-8 (and will be on macOS and in many cases on Linux and other Unix-alikes), but is never UCS-2 as used on Windows. So if character data is stored in the database in Unicode, it will be translated (with a possible loss of information) in non-Unicode locales. (This may change in future versions of \pkg{RODBC}.) Some DBMSs such as PostgreSQL and Microsoft SQL Server allow variable-length character strings of length only limited by resources. These do not fit well with the ODBC model that requires buffers to be allocated to transfer character data, and so such types may be subjected (by the ODBC driver) to a fixed limit or not work at all. \item[Integer types] Most DBMSs have types for 32-bit (\code{integer}, synomyn \code{int}) and 16-bit (\code{smallint}) integers. Some, including MySQL, also have unsigned versions and 1-bit, 8-bit and 64-bit integer types: these further types would usually be transferred as character strings and converted on reading to an \code{integer} or \code{double} vector. Type names \code{int2}, \code{int4} and \code{int8} are common as synonyms for the basic type names. The SQL standard does not require \code{integer} and \code{smallint} to be binary (rather than decimal) types, but they almost always are binary. Note that 64-bit integers will be transferred as character strings and read by \code{sqlGetResults} as character vectors or (for $2^{31} \le |x| < 2^{53}$) as \code{double} vectors. \item[Floating-point types] The basic SQL floating-point types are 8 and 7 for double- and single-precision binary types. The SQL names are \code{double precision} and \code{real}, but beware of the variety of names. Type~6 is \code{float} in the standard, but is used by some DBMSs\footnote{In Oracle the \code{FLOAT} type is a decimal and not a binary type.} for single-precision and by some for double-precision: the forms \code{float(24)} and \code{float(53)} are also commonly supported. You should not assume that these types can store \code{Inf}, \code{-Inf} or \code{NaN}, but they often can. \item[Other numeric types] It is common to store decimal quantities in databases (e.g.{} currency amounts) and types 2 and 3 are for decimals. Some DBMSs have specialized types to handle currencies, e.g.{} \code{money} in Microsoft SQL Server. Decimal types have a \emph{precision} (the maximum number of significant decimal digits) and \emph{scale} (the position of the decimal point). \code{numeric} and \code{decimal} are usually synonymous, but the distinction in the standards is that for \code{numeric} the precision is exact whereas for \code{decimal} the DBMS can use a larger value than that specified. % e.g. Mimer Some DBMSs have a type \code{integer(\var{p})} to represent up to \code{\var{p}} decimal digits, and this may or may not be distinct from \code{decimal(\var{p}, 0)}. % 'currently' is from 5.1.x DBMSs do not necessarily fully implement decimal types, e.g.{} MySQL currently stores them in binary and used to store them as character strings. \item[Dates and times] The handling of dates and times is very much specific to the DBMS. Some allow fractional seconds in date-times, and some do not; some store timezones with date-times or always use UTC and some do not, and so on. Usually there are also types for time intervals. All such types are transferred as character strings in \pkg{RODBC}. \item[Binary types] These are less common, and unsupported by \pkg{RODBC} prior to version 1.3-0. They parallel character types in that they are a sequence of bytes of fixed or variable length, sometimes with additional types for long sequences: there are separate ODBC types for \code{SQL\_BINARY}, \code{SQL\_VARBINARY} and \code{SQL\_LONGVARBINARY}. Binary types can currently only be read as such, and they are returned as column of class \code{"ODBC\_binary"} which is a list of raw vectors. \end{description} % An example is BOOLEAN in Mimer It is possible (but rare) for the DBMS to support data types that the ODBC driver cannot handle. \subsection{Data types when saving a data frame} When \code{sqlSave} creates a table, there is some choice as to the SQL data types used. The default is to select the SQL data type from the R type via the \code{typeInfo} argument to \code{sqlSave}. If this is not supplied (usual) a default mapping is looked up using \code{getSqlTypeInfo()} or by interrogating \code{\link{sqlTypeInfo()}}. This will almost always produce the correct mapping for numeric, integer and character columns of up to 254 characters (or bytes). In other cases (include dates and date-times) the desired SQL type can be specified for each column \emph{via} the argument \code{varTypes}, a named character vector with names corresponding to (some of) the names in the data frame to be saved. Only a very few DBMSs have a logical data type and the default mapping is to store R logical vectors as \code{varchar(5)}. For others DBMSs \code{BIT}, \code{TINYINT} or an enumeration type could be used (but the column may be need to be converted to and from a suitable representation). For example, in MySQL we could use \code{enum('FALSE', 'TRUE')}, but this is actually stored as \code{char(5)}. Note that to represent \code{NA} the SQL data type chosen needs to be nullable, which \code{BIT} often is not. (Mimer has a nullable data type \code{BOOLEAN} but this is not supported by the ODBC client.) \subsection{SQLite} SQLite's concept of `data type' is anomalous: version~3 does recognize types of data (in version~2 everything was a character string), but it does not have a fixed type for a column in a table (although the type specified in the \code{CREATE TABLE} statement is a `recommended' type for the values of that column). Every value is categorized as null, integer (of length 1, 2, 3, 4, 6 or 8 bytes), double, text (UTF-8 or UTF-16) or BLOB (a sequence of bytes). This does not fit well with the ODBC interface which pre-determines a type for each column before reading or writing it: the `SQLite ODBC' driver falls back to a \code{SQL\_VARCHAR} or \code{SQL\_LONGVARCHAR} type if the column type is not available. \subsection{ODBC data types} ODBC defines two sets of data types: \emph{SQL data types} and \emph{C data types}. SQL data types indicate the data types of data stored at the data source using standard names. C data types indicate the data types used in the compiled code in the application (here \pkg{RODBC}) when transferring data and are the same for all drivers. The ODBC SQL data types are abstractions of the data types discussed above with names like \code{SQL\_INTEGER}. They include \code{SQL\_LONGVARCHAR} for large character types and \code{SQL\_WVARCHAR} for Unicode character types. It is usually these types that are returned (by number) in the \code{SQL\_DATA\_TYPE} column of the result of \code{sqlColumns} and \code{SQL\_DATATYPE} column of the result of \code{sqlTypeInfo}. The mapping from names to numbers is given in table~1. \begin{table}[tbp] \qquad{\small\tt \begin{tabular}{lrlr} SQL\_CHAR&1&SQL\_LONGVARCHAR&-1\\ SQL\_NUMERIC&2&SQL\_BINARY&-2\\ SQL\_DECIMAL&3&SQL\_VARBINARY&-3\\ SQL\_INTEGER&4&SQL\_LONGVARBINARY&-4\\ SQL\_SMALLINT&5&SQL\_BIGINT&-5\\ SQL\_FLOAT&6&SQL\_TINYINT&-6\\ SQL\_REAL&7&SQL\_BIT&-7\\ SQL\_DOUBLE&8&SQL\_WCHAR&-8\\ SQL\_DATETIME&9&SQL\_WVARCHAR&-9\\ SQL\_INTERVAL&10&SQL\_WLONGVARCHAR&-10\\ SQL\_TIMESTAMP&11&SQL\_GUID&-11\\ SQL\_VARCHAR&12\\ SQL\_TYPE\_DATE&91\\ SQL\_TYPE\_TIME&92\\ SQL\_TYPE\_TIMESTAMP&93 \end{tabular}} \caption{Mapping between ODBC SQL data type names and numbers. (GUIDs are 16-byte numbers, Microsoft's implementation of UUIDs.)} \end{table} The only ODBC C data types currently used by \pkg{RODBC} are \code{SQL\_C\_DOUBLE}, \code{SQL\_C\_SLONG} (32-bit signed integers) and \code{SQL\_C\_CHAR} for reading and writing, and \code{SQL\_C\_FLOAT} (single-precision), \code{SQL\_C\_SSHORT} (16-bit signed integers) and \code{SQL\_C\_BINARY} for reading from the database. \url{https://msdn.microsoft.com/en-us/library/ms713607%28VS.85%29.aspx} is the defintiive source of information about ODBC data types. \section{Schemas and Catalogs} This is a more technical section: few users will need to deal with these concepts. \sQuote{Schemas}\footnote{which is the usual plural in this technical usage, athough \emph{schemata} is more usual in English.} are collections of objects (such as tables and views) within a database that are supported by some DBMSs: often a separate schema is associated with each user (and \sQuote{schema} in ODBC~3 replaced \sQuote{owner} in ODBC~2). In SQL-92, schemas are collected in a \sQuote{catalog} which is often implemented as a database. Where schemas are implemented, there is a \emph{current schema} used to find unqualified table names, and tables in other schemas can be referred to within SQL queries using the \code{\var{schema}.\var{table}} notation. You can think of a schema as analogous to a name space; it allows related objects to be grouped together without worrying about name clashes with other groups. (Some DBMSs will search for unqualified table names in a search path: see the detailed descriptions below.) Note that \sQuote{schema} is used in another sense in the database literature, for the design of a database and in particular of tables, views and privileges. Here are some details of various DBMSs' interpretations of \code{catalog} and \code{schema} current at the time of writing (mid 2009). (These descriptions are simplistic, and in some cases experimental observations.) \begin{itemize} \item SQLite uses dotted names for alternative databases that are attached by an \code{ATTACH DATABASE} command.\footnote{and may be subsequently detached by a \code{DETACH DATABASE} command} There is a search path of databases, so it is only necessary to use the dotted name notation when there are tables of the same name on attached databases. The initial database is known as \code{main} and that used for temporary tables as \code{temp}. \item MySQL uses \code{catalog} to refer to a database. In MySQL's parlance, `schema' is a little-used synonym for \sQuote{database}. \item PostgreSQL only allows a session to access one database, and does not use `catalog' except to refer to the current database. Version 7.3 introduced schemas---users can create their own schemas with a \code{CREATE SCHEMA} query. Tables are by default in the \code{public} schema, and unqualified table names are searched for along a \sQuote{search path} of schemas (by default, containing \code{public}). \item Oracle uses schemas as synonymous with \sQuote{owner} (also known as \sQuote{user}). There is no way for a user to create additional schemas (that is not what \code{CREATE SCHEMA} does in Oracle). \item IBM DB2 uses schemas as name spaces for objects that may lie on different databases: using \emph{aliases} allows objects to be in more than one schema. The initial current schema is named the same as the user (\code{SQLID} in DB2 parlance), but users can create additional schemas with \code{CREATE SCHEMA} statements. \item Microsoft SQL Server 2008 uses both \code{catalog} and \code{schema}, \code{catalog} for the database and \code{schema} for the type of object, e.g. \code{"sys"} for most of the system tables/views and (default) \code{"dbo"} for user tables. Further schemas can be created by users. The default schema for a user can be set when the user is created and changed \emph{via} \code{ALTER USER}. Prior to SQL Server 2005, `schema' meant `user', and the search path for unqualified names was the database user then \code{"dbo"}. \item The Microsoft Excel and Access ODBC drivers do not use schemas, but do use \code{catalog} to refer to other database/spreadsheet files. \item Mimer (\url{www.mimer.com}) uses schemas which are normally the same as users (which it calls \emph{IDENT}s), but users can create additional schemas with \code{CREATE SCHEMA} statements. There are also system schemas. Mimer uses `schemata' as the plural of schema. \end{itemize} It is often possible to use \code{sqlTables} to list the available catalogs or schemas: see its help page for the driver-specific details. \pkg{RODBC} usually works with tables in the current schema, but unless the connection was opened with \code{interpretDot = FALSE} most functions will attempt to interpret the `dotted name' notation. The interpretation depends on the DBMS: the SQL-92 meaning is \code{\var{schema}.\var{table}} and this is accepted by PostgreSQL, Microsoft SQL Server, Oracle, DB2 and Mimer. However, MySQL uses \code{\var{database}.\var{table}}, and the functions try\footnote{currerntly this is stymied by bugs in the ODBC driver, so \code{SQLColumns} is unable to report on tables in specified databases.} that interpretation if they recognize a MySQL driver. Some DBMSs allow more than two components, but these are not currently supported by the \pkg{RODBC} functions. Functions \code{sqlTables}, \code{sqlColumns} and \code{sqlPrimaryKeys} have arguments \code{catalog} and \code{schema} which in principle allow tables in other schemas to be listed or examined: however these are only partially implemented in many current ODBC drivers. See the help page for \code{sqlTables} for some further details. For other uses, the trick is to select the schema(s) you want to use, which is done \emph{via} an SQL statement sent by \code{sqlQuery}. For Oracle you can set the default schema (owner) by \begin{example} \code{ALTER SESSION SET CURRENT\_SCHEMA = \var{schema}} \end{example} % http://sqlzoo.net/howto/source/z.dir/tip988922/oracle whereas for PostgreSQL the search path can be changed \emph{via} \begin{example} \code{SET search\_path TO \var{schema1},\var{schema2}}. \end{example} % see also https://stat.ethz.ch/pipermail/r-help/2008-May/161304.html In DB2, creating an alias in the current schema can be used to access tables in other schemas, and a \code{CURRENT SCHEMA} query can be used to change the current schema. In MySQL and Microsoft SQL Server a database can be selected by a \code{USE \var{database}} query. \section{Internationalization Issues} Internationalization issues are made more complex by ODBC being a client-server system, and the ODBC client (\pkg{RODBC}) and the server may be running on different machines with different OSes on different continents. So the client may need some help. In most cases numeric data are transferred to and from R in binary form, so the representation of the decimal point is not an issue. But in some cases it could be (e.g.{} decimal rather than binary SQL data types will be transferred as character strings) and then the decimal point to be used will be taken from \code{options("dec")}: if unset this is set when \pkg{RODBC} is loaded from the setting of the current locale on the machine running R (\emph{via} \code{Sys.localeconv}). Some ODBC drivers (e.g.{} for Microsoft SQL Server, Oracle) allow the locale (`NLS') to be used for numeric values to be selected for the connection. The other internationalization issue is the character encoding used. When R and the DBMS are running on the same machine this is unlikely to be an issue, and in many cases the ODBC driver has some options to translate character sets. SQL is an ANSI (US) standard, and DBMSs tended to assume that character data was ASCII or perhaps 8-bit. More recently DBMSs have started to (optionally or by default) to store data in Unicode, which unfortunately means UCS-2 on Windows and UTF-8 elsewhere. So cross-OS solutions are not guaranteed to work, but most do. Encoding issues are best resolved in the ODBC driver or in DBMS settings. In the unusual case that this cannot be done, the \code{DBMSencoding} argument to \code{odbcDriverConnect} allows for recoding when sending data to or from the ODBC driver and thence the DBMS. \section{Excel Drivers} The Microsoft Excel ODBC drivers (Windows only) have a number of peculiarities which mean that it should be used with care. It seems that their concept of a `table' is principally a \emph{named range}. They treat worksheets as system tables, and append a dollar to their name (making then non-standard SQL table names: the quoting convention used is to enclose such names in square brackets). Column names are taken as the first row of the named range/worksheet. Non-standard SQL names are allowed here too, but the driver maps \code{.} to \code{\#} in column names. Annoyingly, \code{sqlTables} is allowed to select named ranges only by \code{tableType = "TABLE"} but not to select only worksheets. There are at least two known problems with reading columns that do not have a format set \emph{before} data entry, and so start with format \sQuote{General}. First, the driver uses the first few rows to determined the column type, and is over-fond of declaring \sQuote{Numeric} even when there are non-numeric entries. The default number of rows consulted is 8, but attempts to change this in the DSN setup are ignored. Second, if a column is declared as \sQuote{Text}, numeric entries will be read as SQL nulls and hence R \code{NA}s. Unfortunately, in neither case does reformatting the column help. % http://support.microsoft.com/kb/141284 The connection is by default read-only. It is possible to de-select this in the DSN (and the convenience wrapper \code{odbcConnectExcel} has a \code{readOnly = FALSE} argument to do so), but this does not support deletion, including SQL \code{DROP}, \code{DELETE}, \code{UPDATE} and \code{ALTER} statements). In particular, \code{\link{sqlDrop}} will remove the data in a worksheet but not the worksheet itself. % http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.ii.doc/opt/tlsodb13.htm % http://www.stata.com/support/faqs/data/odbc_excel.html The driver does allow a worksheet to be updated by \code{sqlUpdate}, and for a new worksheet (with a different name from existing worksheets) to be created by \code{sqlSave} (which also creates a named range). As far as we know, no similar issues affect the Actual Technologies macOS Excel driver: however, it allows only read-only access to Excel files and does not support Excel 2007-and-later \code{.xlsx} files. \section{DBMS-specific tidbits} This section covers some useful DBMS-specific SQL commands and other useful details. Recent versions of several DBMSs have a schema \code{INFORMATION\_SCHEMA} that holds many predefined system views. These include MySQL (the name of a database, mainly populated beginning with MySQL~5.1), Microsoft SQL Server and Mimer. \subsection*{MySQL} Comments about MySQL are mostly applicable to its forks such as MariaDB. We have already mentioned \code{USE \var{database}} as the way to change the database in use. \code{SHOW DATABASES} lists the databases `for which you have some kind of privilege', and can have a \code{LIKE} clause to restrict the result to some pattern of database names. % MySQL 5.1 manual 12.3 The \code{DESCRIBE \var{table}} command is a compact way to get a description of a table or view, similar to the most useful parts of the result of a call to \code{sqlColumns}. (It is also known as \code{SHOW COLUMNS FROM \var{table}}.) \code{SHOW TABLES} is the command to produce a table of the tables/views on the current database, similar to \code{sqlTables}. For example, \begin{example} > sqlQuery(channel, "USE ripley") [1] "No Data" > sqlQuery(channel, "SHOW TABLES") Tables_in_ripley 1 USArrests > sqlQuery(channel, "DESCRIBE USArrests") Field Type Null Key Default Extra 1 State varchar(255) NO PRI NA NA 2 Murder double YES NA NA 3 Assault int(11) YES NA NA 4 UrbanPop int(11) YES NA NA 5 Rape double YES NA NA \end{example} \noindent \code{SHOW FULL TABLES} gives an additional additional column \code{Table\_type}, the types of the tables/views. There is useful information for end users in the \code{INFORMATION\_SCHEMA} \emph{database}, much more extensively as from MySQL~5.1. Some of the non-standard behaviour can be turned off, e.g.{} starting MySQL with \code{--sql-mode=ANSI} gives closer conformance to the standard, and this can be set for a single session by \begin{example} SET SESSION sql\_mode='ANSI' \end{example} To change just the behaviour of quotes (to use double quotes in place of backticks) replace \code{ANSI} by \code{ANSI\_QUOTE}. % manual section 10.4 The maximum size of a \code{char} column is 255 characters. That of a \code{varchar} column is up to 65535 characters (but there is a limit of 65535 bytes on the total size of a row), and those with a maximum of 255 or less are stored more efficiently. Types \code{text}, \code{mediumtext} and \code{longtext} can hold more, and are not subject to the row-size limit (\code{text} has default maximum size 65535, the default \pkg{RODBC} limit on transfers). There are \code{binary}, \code{varbinary} and \code{blob} types which are very similar to their character counterparts but with lengths in bytes. \subsection*{PostgreSQL} Table \code{pg\_tables} lists all tables in all schemas; you probably want to filter on \code{tableowner='\var{current\_user}'}, e.g.{} \begin{smallexample} > sqlQuery(channel, "select * from pg_tables where tableowner='ripley'") schemaname tablename tableowner tablespace hasindexes hasrules hastriggers 1 public dtest ripley NA 0 0 0 \end{smallexample} There are both ANSI and Unicode versions of the ODBC driver on Windows: they provide many customizations. One of these is read-only access, another is if system tables are reported by \code{sqlTables}. % manual chapter 8 The default size of a \code{varchar} column is unlimited, but those with maximum length of 126 bytes or less are stored more efficiently. However, the ODBC interface has limits, which can be set in the configuration options. These include the maximum sizes for \code{varchar} (default 254) and \code{longvarchar} (default 8190), and how to handle unknown column sizes (default as the maximum), and whether `Text' is taken as \code{varchar} or \code{longvarchar} (which affects the reported maximum size for a \code{varchar} column). There is a single binary data type, \code{bytea}. \subsection*{SQLite} These comments are only about SQLite~3.x. Table \code{sqlite\_master} lists tables and indices, and the \code{sql} column gives the SQL command used. E.g.{} \begin{example} > tmp <- sqlQuery(channel, "select * from sqlite_master") > tmp[, "sql"] <- substr(tmp[, "sql"], 1, 16) > tmp type name tbl_name rootpage sql 1 table USArrests USArrests 2 CREATE TABLE "US 2 index sqlite_autoindex_USArrests_1 USArrests 4 \end{example} My current versions of Christian Werner's SQLite~ODBC driver store character data in the current locale's charset (e.g.{} UTF-8) on Unix-alikes and by default in Unicode (UCS-2) on Windows (unless de-selected in the DSN configuration). The default collation for text data is byte-by-byte comparisons, so avoid comparing non-ASCII character data in SQLite. Actual Technologies sell an SQLite driver for macOS which requires \code{believeNRows = FALSE} and has a number of other issues including that it seems not to support dropping tables. (Christian Werner's SQLite~ODBC driver was easy to install from the sources and worked correctly.) Version of the SQLite~ODBC driver since 0.87 have segfaulted on the test suite. \subsection*{Oracle} Tables \code{cat}, \code{user\_table} and \code{user\_catalog} contain useful information on tables. Information on columns is in \code{all\_tab\_columns}, e.g.{} \begin{example} > sqlQuery(channel, "select * from all\_tab\_columns where table_name='USArrests'") OWNER TABLE_NAME COLUMN_NAME DATA_TYPE DATA_TYPE_MOD 1 RIPLEY USArrests State VARCHAR2 NA 2 RIPLEY USArrests Murder FLOAT NA 3 RIPLEY USArrests Assault NUMBER NA 4 RIPLEY USArrests UrbanPop NUMBER NA 5 RIPLEY USArrests Rape FLOAT NA ... \end{example} The Windows ODBC driver we tested had an option for a read-only connection. % SQL Language Reference Manual chapter 2 Oracle's character data types are \code{CHAR}, \code{VARCHAR2} (character set specified when the database was created) and \code{NCHAR}, \code{NVARCHAR2} (Unicode), as well as \code{CLOB} and \code{NCLOB} for large character strings. For the non-Unicode types the units of length are either bytes or charactor (set as a default for the database) but can be overriden by adding a \code{BYTE} or \code{CHAR} qualifier. The limits are 4000 bytes apart from for \code{CLOB} and \code{NCLOB}, which have very high limits. There are \code{RAW} and \code{BLOB} data types. \subsection*{DB2} %http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/index.jsp Schema \code{syscat} contains many views with information about tables: for example view \code{syscat.tables} lists all tables, and \begin{example} > sqlQuery(channel, "select * from syscat.columns where tabname='USArrests'") TABSCHEMA TABNAME COLNAME COLNO TYPESCHEMA TYPENAME LENGTH SCALE 1 RIPLEY USArrests State 0 SYSIBM VARCHAR 255 0 2 RIPLEY USArrests Murder 1 SYSIBM DOUBLE 8 0 3 RIPLEY USArrests Assault 2 SYSIBM INTEGER 4 0 4 RIPLEY USArrests UrbanPop 3 SYSIBM INTEGER 4 0 5 RIPLEY USArrests Rape 4 SYSIBM DOUBLE 8 0 ... \end{example} %http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/index.jsp?topic=/com.ibm.db2.luw.sql.ref.doc/doc/r0008483.html The \code{CHAR} type can have size up to 254 bytes: the maximum size of the \code{VARCHAR} type is 32762 bytes. For larger character strings there is the \code{CLOB} type (up to 2Gb). These types can be used to store data in a MBCS, including various Unicode encodings. There are corresponding \code{BINARY}, \code{VARBINARY} and \code{BLOB} data types. \subsection*{Microsoft SQL Server} There are several hundred views in schemas \code{INFORMATION\_SCHEMA} and \code{sys} which will be listed by \code{sqlTables} and also by the stored procedure \code{sp\_tables}. Another way to list tables is \begin{example} SELECT * FROM sysobjects WHERE xtype='U' \end{example} where the condition restricts to user tables. \code{USE \var{database}} changes the database in use. % http://msdn.microsoft.com/en-us/library/ms187752.aspx Types \code{char} and \code{varchar} have a maximum specified size of 8000 bytes. It is possible to use \code{varchar(max)} (previously known as \code{text}) for a limit of 2Gb, but this may not work well with the ODBC interface. The Unicode types \code{nchar} and \code{nvarchar} have a maximum specified size of 4000 characters: again there is \code{nvarchar(max)} (formerly \code{ntext}). There are corresponding \code{binary} and \code{varbinary} data types (with \code{image} as an earlier name for \code{varbinary(max)}). \subsection*{Mimer} There are tens of views in schema \code{INFORMATION\_SCHEMA} which can be read by SQL \code{SELECT} queries of the form \begin{example} SELECT \var{column-list} FROM INFORMATION_SCHEMA.\var{view-name} WHERE \var{condition} \end{example} See the Mimer SQL Reference Manual chapter on Data Dictionary views for full details: two views are \code{TABLES} and \code{VIEWS}. A session can be set to be read-only by the SQL command \code{SET SESSION READ ONLY}. Mimer uses Latin-1 for its default character types but Unicode types (\code{NCHAR} and \code{NVARCHAR}) are also available. Unsurprisingly given that the company is Swedish, different collations are allowed for both Latin-1 and Unicode character types. % reference manual chapter 6 The \code{char} and \code{varchar} columns have a maximum size of 15000 bytes: the \code{clob} data type is available for larger character columns. The \code{nchar} and \code{nvarchar} columns have a maximum size of 5000 characters: the \code{nclob} data type is available for larger Unicode columns. There are corresponding \code{binary}, \code{varbinary} and \code{blob} binary data types. \newpage \appendix \section{Installation} \pkg{RODBC} is simple to install, and binary distributions are available for Windows from CRAN. To install from the sources, an \emph{ODBC Driver Manager} is required. Windows normally comes with one (it is part of MDAC and can be installed separately if required). macOS from 10.2 to 10.8 shipped with \code{iODBC} (\url{http://www.iodbc.org}, this is also available for other Unix-alikes) but from 10.9 the headers are no longer included in the macOS SDK. For other systems the driver manager of choice is likely to be \code{unixODBC}, part of almost all Linux distributions and with sources downloadable from \url{http://www.unixODBC.org}. In Linux binary distributions it is likely that package \code{unixODBC-devel} or \code{unixodbc-dev} or some such will be needed. Both \code{unixODBC} and \code{iODBC} can be installed from the sources under macOS: they need ODBC drivers compiled for the driver manager in use. At least for macOS 10.9--12, all that is required for \code{iODBC} is to unpack the sources and use their headers by something like \begin{example} ODBC_INCLUDE=/path/to/libiodbc-srcs/include' R CMD INSTALL RODBC \end{example} \noindent and the \code{iODBC} sources used by Apple can be found at \url{https://opensource.apple.com}. In most cases the package's \code{configure} script will find the driver manager files, and the package will install with no extra settings. However, if further information is required, use \code{--with-odbc-include} and \code{--with-odbc-lib} or environment variables \code{ODBC\_INCLUDE} and \code{ODBC\_LIBS} to set the include and library paths as needed. A specific ODBC driver manager can be specified by the \code{--with-odbc-manager} \code{configure} option, with likely values \code{odbc} or \code{iodbc}: if this is done for \code{odbc} and the program \code{odbc\_config} is found, it is used to set the libpath as a last resort (it is often wrong), and to add any additional \code{CFLAGS}. \subsection*{Sources of drivers} Keeping track of ODBC drivers is a never-ending task, and this section is no longer actively maintained. URIs are liable to move or disappear. A list of drivers for \code{unixODBC} is maintained\footnote{that the author works for Easysoft is conspicuous.} at \url{https://www.unixodbc.org/drivers.html}. \code{unixODBC} ships with a number of drivers (although in most cases the DBMS vendor's driver is preferred)---these include for MySQL, PostgreSQL, Mimer and flat files. MySQL provides drivers under the name `Connector/ODBC' (formerly MyODBC') in source form, and binaries for all common 32-bit and most 64-bit R platforms. These are said to work also with MariaDB. PostgreSQL has an associated project at \url{http://pgfoundry.org/projects/psqlodbc/} and another project for at \url{http://pgfoundry.org/projects/odbcng/}. (Documentation for \code{psqlodbc} is currently hard to find, but there is some in the PostgreSQL 7.2 manual at \url{http://www.postgresql.org/docs/7.2/static/odbc.html} from before it was unbundled.) There are drivers for Unix-alikes and Windows -- 64-bit Windows support is available as from PostgreSQL 9.0. An SQLite ODBC driver for Unix-alikes, including macOS, and (32- and 64-bit) Windows is available from \url{http://www.ch-werner.de/sqliteodbc/}. Oracle provides ODBC drivers as a supplement to its `Instant Client' for some of its platforms (including 32/64-bit Windows and Linux but not currently macOS). See \url{https://www.oracle.com/technetwork/database/features/instant-client/index-097480.html} %\url{http://www.oracle.com/technology/software/tech/oci/instantclient/}. One quirk of the Windows drivers is that the Oracle binaries must be in the path, so \code{PATH} should include e.g.{} \verb|c:\Oracle\bin|. For IBM's DB2, search its site for drivers for `ODBC and CLI'. There are some notes about using this under Linux at \url{https://www.unixodbc.org/doc/db2.html}. % http://developer.mimer.se/odbc/ Mimer (\url{www.mimer.com}) is a cross-platform DBMS with integral ODBC support, so \begin{quote} `The Mimer SQL setup process automatically installs an ODBC driver when the Mimer SQL client is installed on any Windows or UNIX platform.' \end{quote} The `HowTos' at \url{http://developer.mimer.se/howto/index.tml} provide some useful hints. Some details of the 32-bit Microsoft `ODBC Desktop Database Drivers' (for Access, Excel, Paradox, dBase and text files on Windows) can be found at \url{https://msdn.microsoft.com/en-us/library/ms709326%28VS.85%29.aspx}. There is also a Visual FoxPro driver and an (outdated) Oracle driver. 32-bit Windows drivers for Access 2007 and Excel 2007 are bundled with Office 2007 but can be installed separately \emph{via} the installer \code{AccessDatabaseEngine.exe} available from %\url{http://www.microsoft.com/downloads/details.aspx?FamilyID=7554f536-8c28-4598-9b72-ef94e038c891&DisplayLang=en}. \url{https://www.microsoft.com/en-us/download/details.aspx?id=23734}. The Access/Excel 2010 versions at %\url{http://www.microsoft.com/downloads/details.aspx?familyid=C06B8369-60DD-4B64-A44B-84B371EDE16D&displaylang=en} \url{https://www.microsoft.com/en-us/download/details.aspx?id=13255} have a 64-bit version: however the 64-bit drivers cannot be installed alongside 32-bit versions of Office (as far as we know, and definitely not for Office 2007). For recent versions of macOS, low-cost and easy-to-use \code{iODBC} drivers are available from \url{https://www.actualtech.com/products.php}: these cover MySQL/PostgreSQL/SQLite (one driver), SQL Server/Sybase, Oracle, and a read-only driver for Access and related formats (including Access 2007 and Excel, but not Excel 2007). That SQLite driver needs \code{believeNRows = FALSE} set. Currently at least, installing those drivers on 10.9 installs \code{iODBC}. macOS drivers for MySQL, PostgreSQL and the major commercial databases are available from \url{http://uda.openlinksw.com/}. \subsection*{Specifying ODBC drivers} The next step is to specify the ODBC drivers to be used for specific DBMSs. On Windows installing the drivers will register them automatically. This might happen as part of the installation on other systems, but usually does not. Both \code{unixODBC} and \code{iODBC} store information on drivers in configuration files, normally system-wide in \code{/etc/odbcinst.ini} and per-user in \verb|~/.odbcinst.ini|. However, the system location can vary, and on systems with \code{unixODBC} can be found by at the Unix command line by one of \begin{example} \$ odbcinst -j \$ odbc\_config --odbcinstini \end{example} For \code{iODBC} use \code{iodbc\_config}: on macOS the system location used by Apple was \code{/Library/ODBC/odbcinst.ini}. \begin{figure} \begin{example} \$ cat /etc/odbcinst.ini [MySQL] Description = ODBC 3.51.26 for MySQL Driver = /usr/lib64/libmyodbc3.so FileUsage = 1 [MySQL ODBC 5.1 Driver] Description = ODBC 5.1.05 for MySQL Driver = /usr/lib64/libmyodbc5.so UsageCount = 1 [PostgreSQL] Description = ODBC for PostgreSQL Driver = /usr/lib64/psqlodbc.so FileUsage = 1 [sqlite3] Description = sqliteodbc Driver = /usr/local/lib64/libsqlite3odbc.so Setup = /usr/local/lib64/libsqlite3odbc.so FileUsage = 1 \end{example} \caption{A system ODBC driver file from a \code{x86\_64} Fedora 10 Linux system using \code{unixODBC}.} \label{fig:odbc1} \end{figure} The format can be seen from figure~\ref{fig:odbc1}. (\code{unixODBC} allows \code{Driver64} here to allow for different paths on 32-bit and 64-bit platforms sharing a file system.) The MySQL and PostgreSQL drivers were installed from the Fedora RPMs \code{mysql-connector-odbc} and \code{postgresql-odbc}, and also from the \code{mysql-connector-odbc} RPM in the MySQL distribution (which inserted the entry in the driver file). The MySQL manual gives detailed information (including screenshots) of installing its drivers and setting up DSNs that may also be informative to users of other DBMSs. \clearpage \section{Specifying DSNs} The ODBC driver managers have `User DSNs' and `System DSNs': these differ only in where the information is stored, the first on a per-user basis and the second for all users of the system. Windows has a GUI\footnote{Extra care is needed on a 64-bit version of Windows, as this GUI shows only 64-bit settings for ODBC, including drivers and DSNs. If you are running 32-bit R (and hence 32-bit ODBC) on 64-bit Windows, you need the 32-bit version of the GUI at something like \texttt{c:\textbackslash{}Windows\textbackslash{}SysWOW64\textbackslash{}odbcad32.exe} -- and beware that both 32- and 64-bit versions are called \texttt{odbcad32.exe}.} to set up DSNs, called something like `Data Sources (ODBC)' under `Administrative Tools' in the Control Panel. You can add, remove and edit (`configure') DSNs there (see figure~2). When adding a DSN, first select the ODBC driver and then complete the driver-specific dialog box. There will usually be an option to test the DSN and it is wise to do so. \begin{figure} \centerline{\includegraphics[width=12cm]{winDSN1}} \bigbreak \centerline{\includegraphics[width=10cm]{winDSN2}} \caption{(Top) The main Data Sources (ODBC) dialog box from a Windows XP system. (Bottom) The dialog box to select a driver that comes up when the \textsf{Add} button is clicked.} \label{fig:1} \end{figure} If \texttt{Rgui} is to be used on Windows, incomplete DSNs can be created and the dialog box will be brought up for completion when \code{odbcConnect} is called---this can be helpful to avoid storing passwords in the Windows Registry or to allow alternate users or databases. On that platform, calling \code{odbcDriverConnect()} with no arguments will bring up the main ODBC Data Sources dialog box to allow a DSN to be constructed on the fly. macOS prior to 10.6 came with a very similar GUI (figure~3) found at \textsf{Applications / Utilities / ODBC Administrator}. This has been available as a download from \url{https://support.apple.com/kb/DL895}. Another GUI for macOS is available from \url{http://www.odbcmanager.net/index.php}. \begin{figure} \centerline{\includegraphics[width=12cm]{macODBC}} \bigbreak \centerline{\includegraphics[width=12cm]{macAccess}} \caption{(Top) The main ODBC Administrator dialog box from a macOS 10.5 system. (Bottom) A page of the dialog box to specify a DSN for the Actual Technologies Access/Excel driver.} \label{fig:1b} \end{figure} % Both \code{unixODBC} and \code{iODBC} provide GUIs (which might be % packaged separately in binary distributions) to create DSNs, and % \code{iODBC} also has a web-grounded DSN administrator. UnixODBC's GUI % is currently called \texttt{ODBCConfig} (see figure~4), and there is a % KDE control widget called \texttt{DataManager} to manage both ODBC % drivers and DSNs. See the \code{unixODBC} user manual at % \url{http://www.unixodbc.org/doc/UserManual/}. (On Fedora these are in % the \code{unixODBC-kde} RPM. It has been announced that they will % become separate projects after \code{unixODBC 2.2.14}.) \begin{figure} \centerline{\includegraphics[width=12cm]{linuxDSN}} \bigbreak \centerline{\includegraphics[width=12cm]{linuxDSNsqlite}} \caption{The dialog box of \code{ODBCconfig} on Fedora 10 Linux, and the \textsf{Configure} screen for the SQLite driver.} \label{fig:2} \end{figure} On Unix-alikes DSNs can also be specified in files (and the graphical tools just manipulate these files). The system-wide file is usually \code{/etc/odbc.ini} and the per-user file\footnote{\texttt{\textasciitilde/Library/ODBC/odbc.ini} on Mac OS X.} \verb|~/.odbc.ini|. Some examples of the format are shown figure~\ref{fig:odbc2}. \begin{figure} \begin{example} [test_mysql] Description = test MySQL Driver = MySQL Trace = No Server = localhost Port = 3306 Database = test [test_mysql5] Description = myodbc5 Driver = MySQL ODBC 5.1 Driver Server = gannet Port = 3306 Database = ripley [test_pg] Description = test PostgreSQL Driver = PostgreSQL Trace = No TraceFile = ServerName = localhost UserName = ripley Port = 5432 Socket = Database = testdb ReadOnly = 0 [test_sqlite3] Description = test SQLite3 Driver = sqlite3 Database = /tmp/mysqlite3.db \end{example} \caption{A personal (\texttt{\textasciitilde/.odbc.ini}) file from a Fedora 10 Linux system using \code{unixODBC}.} \label{fig:odbc2} \end{figure} What fields are supported is driver-specific (and it can be hard to find documentation). There is no clear distinction between fields that specify the driver and those which specify the DSN, so any parts of the driver specification which might differ between connections can be used in the DSN file. Things that are often set here are if the connection is read-only (\code{test\_pg} is \emph{not} readonly) and the character encoding to be used. Command-line programs \code{isql} (\code{unixODBC}) and \code{iodbctest} (\code{iODBC}) can be used to test a DSN that has been created manually in a file. The formats are \begin{example} \$ isql -v \var{dsn} \var{db_username} \var{db_password} \$ iodbctest \end{example} Both give a command-line SQL interface: use \code{quit} to terminate. \begin{figure} \includegraphics[width=6cm]{Access} \quad \includegraphics[width=6cm]{MySQL} \bigbreak \includegraphics[width=6cm]{Oracle} \quad \includegraphics[width=6cm]{SQLserver} \caption{Parts of the ODBC driver configuration screens on Windows XP for Microsoft Access, MySQL Connector/ODBC 5.1, Oracle's ODBC driver and Microsoft SQL Server.} \label{fig:3} \end{figure} \clearpage \section{Internals} The appendix is in part an \emph{aide memoire} for the maintainer, but may interest the curious user. RODBC connection objects are an integer with several attributes: they are numbered consecutively in the current session. For example \begin{smallexample} > channel <- odbcConnect("test") > unclass(channel) [1] 1 attr(,"connection.string") [1] "DATABASE=ripley;DESCRIPTION=myodbc;DSN=test;OPTION=0;PORT=3306;SERVER=localhost;" attr(,"handle\_ptr") attr(,"case") [1] "nochange" attr(,"id") [1] 11371 attr(,"believeNRows") [1] TRUE attr(,"colQuote") [1] "`" attr(,"tabQuote") [1] "`" attr(,"encoding") [1] "" attr(,"rows\_at\_time") [1] 100 attr(,"isMySQL") [1] FALSE \end{smallexample} Most of the attributes record the arguments of \code{odbcDriverConnect}. The \code{"connection.string"} attribute is as returned by \code{SQLDriverConnect} and list driver-specific parameters separated (and perhaps terminated) by a semicolon. The \code{"id"} attribute is a random integer used for integrity checks (and in particular to reject connection objects should they be saved and restored in a different session). The \code{"isMySQL"} attribute is used both to select the default quote character and the interpretation of \code{qualifier.table} names. The main structure of the connection is kept as a C \code{struct}, a pointer to which is passed around as the R external pointer \code{"handle\_ptr"}. This has a finalizer that will close the connection when there is no longer an R object referring to it (including at the end of the R session), with a warning unless the connection has already been closed by \code{close} or \code{odbcClose}. In addition, a C-level table keeps the pointers of the first 1000 connections of an R session, to enable \code{odbcCloseAll} to close them. The \code{struct} is currently defined as \begin{smallexample} typedef struct rodbcHandle \{ SQLHDBC hDbc; /* connection handle */ SQLHSTMT hStmt; /* statement handle */ SQLLEN nRows; /* number of rows and columns in result set */ SQLSMALLINT nColumns; int channel; /* as stored on the R-level object */ int id; /* ditto */ int useNRows; /* value of believeNRows */ /* entries used to bind data for result sets and updates */ COLUMNS *ColData; int nAllocated; SQLUINTEGER rowsFetched; /* use to indicate the number of rows fetched */ SQLUINTEGER rowArraySize; /* use to indicate the number of rows we expect back */ SQLUINTEGER rowsUsed; /* for when we fetch more than we need */ SQLMSG *msglist; /* root of linked list of messages */ SEXP extPtr; /* the external pointer address */ \} RODBCHandle, *pRODBCHandle; \end{smallexample} Most ODBC operations work by sending a query, explicitly or implicitly via e.g.{} \code{sqlColumns}, and this creates a \emph{result set} which is transferred to an R data frame by \code{sqlGetResults}. \code{nRows} and \code{nCols} indicate the size of the pending result set, with \code{nCols = -1} used if there are no pending results. ODBC works with various \emph{handles}. There is a \code{SQLHENV} handle for the environment that \code{RODBC} opens when a connection is first opened or DSNs are listed---its main use is to request ODBC~3 semantics. Then each connection has a \code{SQLHDBC} handle, and each query (statement) a \code{SQLHSTMT} handle. Argument \code{literal=TRUE} of \code{sqlTables} and \code{sqlColumns} is used to set the \verb}SQL_ATTR_METADATA_ID} attribute of the statement handle to be true. All the functions\footnote{ \code{odbcQuery}, \code{sqlColumns}, \code{sqlPrimaryKeys}, \code{sqlTables} and \code{sqlTypeInfo}.} that create a result set call C function \code{cachenbind}. This allocates buffers under the \code{colData} pointer and binds the result set to them by \code{SQLBindCol}. Then when \code{sqlGetResults} calls the C function \code{SQLFetch} or \code{SQLFetchScroll} the results for one or more (up to \code{MAX\_ROWS\_FETCH = 1024}) rows are loaded into the buffers and then copied into R vectors. Prior to \pkg{RODBC} 1.3-0 the default was to fetch a row at a time, but it is now to fetch up to 100 rows at a time. Entries \code{rowsArraySize} and \code{rowsFetched} are used to indicate how many rows were requested and how many were available. Since e.g.{} \code{sqlFetch} allows a maximum number of rows to be returned in the data frame, \code{rowsUsed} indicates how many of the rows last fetched have so far been returned to R. The buffers are part of the \code{ColData} entry, which is an array of \code{COLUMNS} structures, one of each column in the result set. These have the form \begin{smallexample} typedef struct cols \{ SQLCHAR ColName[256]; SQLSMALLINT NameLength; SQLSMALLINT DataType; SQLULEN ColSize; SQLSMALLINT DecimalDigits; SQLSMALLINT Nullable; char *pData; int datalen; SQLDOUBLE RData [MAX\_ROWS\_FETCH]; SQLREAL R4Data[MAX\_ROWS\_FETCH]; SQLINTEGER IData [MAX\_ROWS\_FETCH]; SQLSMALLINT I2Data[MAX\_ROWS\_FETCH]; SQLLEN IndPtr[MAX\_ROWS\_FETCH]; \} COLUMNS; \end{smallexample} The first six entries are returned by a call to \code{SQLDescribeCol}: \code{DataType} is used to select the buffer to use. There are separate buffers for double-precision, single-precision, 32-bit and 16-bit integer and character/byte data. When character/data buffers are allocated, \code{datalen} records the length allocated per row (which is based on the value returned as \code{ColSize}). The \code{IndPtr} value is used to record the actual size of the item in the current row for variable length character and binary types, and for all nullable types the special value \code{SQL\_NULL\_DATA} (-1) indicates an SQL null value. The other main C-level operation is to send data to the ODBC driver for \code{sqlSave} and \code{sqlUpdate}. These use \code{INSERT INTO} and \code{UPDATE} queries respectively, and for \code{fast = TRUE} use parametrized queries. So we have the queries (split across lines for display) \begin{smallexample} > sqlSave(channel, USArrests, rownames = "State", addPK = TRUE, verbose = TRUE) Query: CREATE TABLE "USArrests" ("State" varchar(255) NOT NULL PRIMARY KEY, "Murder" double, "Assault" integer, "UrbanPop" integer, "Rape" double) Query: INSERT INTO "USArrests" ( "State", "Murder", "Assault", "UrbanPop", "Rape" ) VALUES ( ?,?,?,?,? ) Binding: 'State' DataType 12, ColSize 255 Binding: 'Murder' DataType 8, ColSize 15 Binding: 'Assault' DataType 4, ColSize 10 Binding: 'UrbanPop' DataType 4, ColSize 10 Binding: 'Rape' DataType 8, ColSize 15 Parameters: ... > sqlUpdate(channel, foo, "USArrests", verbose=TRUE) Query: UPDATE "USArrests" SET "Assault"=? WHERE "State"=? Binding: 'Assault' DataType 4, ColSize 10 Binding: 'State' DataType 12, ColSize 255 Parameters: ... \end{smallexample} At C level, this works by calling \code{SQLPrepare} to record the insert/update query on the statement handle, then calling \code{SQLBindParameter} to bind a buffer for each column with values to be sent, and finally in a loop over rows copying the data into the buffer and calling \code{SQLExecute} on the statement handle. The same buffer structure is used as when retrieving result sets. The difference is that the arguments which were ouptuts from \code{SQLBindCol} and inputs to \code{SQLBindParameter}, so we need to use \code{sqlColumns} to retrieve the column characteristics of the table and pass these down to the C interface. \end{document} RODBC/vignettes/winDSN2.png0000644000176000001440000004313713013621651015103 0ustar ripleyusersPNG  IHDR`X pHYs+tIME!.*tEXtAuthorH tEXtDescription !# tEXtCopyright:tEXtCreation time5 tEXtSoftware]p: tEXtDisclaimertEXtWarningtEXtSourcetEXtComment̖tEXtTitle'IDATx{d?Os^h( " xYtݟ, ȲTeEEV֊*^`QS) B  Asz&|dNN$3dzfm {ܵ LIJ`[$%&wm߱c}iyUж`v05Qu5 HPb*^wk-0EFAwܮ9ȝیF J".F@BV-/9 flkEIDATP1\( {$fC`8c^GEhKx0I:\ge  Rw à!JL,,l$,"")i@KBMUK%he SGYҠ$ }{ Pжb_J\K}΍,SM=S^2e]e]R/"i(uCh&\ .ܳA#7N} 1Z@0QIDATd9}9tLZvҖo`B [N;g貉7t6KC,=R>26adW2ao~/ r{LT'RJ+0 1wz_gϝvl <hkq[ug]O>~F_fKCߌ/y 5ܺO|Tfs/wyƷ65⮏L4KUQI,+?dO!m( iIIDATG5w7ܑYx'k75=arι?o0^~^tt7Q7g_w%?9H^> Oz%X*罶]}G\aZ@ﭭReXUɶ ˟<|~qͻ -DRێ0t'ANjމ4yo`/b/z7?BЀkjcIDATҪ9>NJbg'PIN/'?{'=n`GJwt::pZok[vyii'.=pBe鹗m7.yuCf9#k#BJLZu4'g;qG&;8q;C2<閭`V`Y%)E_wu=LH% BF ~he!tH/mW4]i0NrZ~WZ.P`IDATo|{>vco/:A:tq?o9kGy$]}3ny=鱷]pϗο_-({_B.[Z~Tm*ð=ՑIDATFB&8_$Duk4~oA0L]{W> woM8_'%;rJ_y9'v7=ʛM{[߽ ݿux oi[~Ԇw%1;L5=$|~s I?]z%g{Wv=ͿCN=q^vmI1qIDATpND ]0T YMR4̼ݿޙ?|B0:U% ̲35@(G 㹍j4 Bwܯ9'scӪ_|]2ΛК]{thflzܜк楯ܯ}:8#,glqT^W_.Q3>|놕tuM&j&oBIDATN9ӫةbΨz%p3i ܱTUkW Y2+0f|Φ/|ӾcF$Pܑ/g.H4  i40r I[ire7[2_ZG}4{׷V5_Eoo_/o]< {jy8la^zלc,A'DK~W74 u}6z5g OoE̚7>`ħ`lM}?ڳ[OW#X΃%~›r}·\tFw(],׮|;}c;vV:)5O# gIDATg[+W?"IDATIw~4suR睊ϏT<bs0i[DսEg`g}ru۱ǭYG`>Fgo\p0]zwȚfGK~)i[iO8^kџo `/sN>̿>r]`쯻?}/P~n-m/_gMxl~^a89O oY&U0 77JBIRrzfwIDAT}Jmòɉx#J@f~1ttBd]@bpou+1aA_ ~gH)hO/7V<,h=CN5l~riAڧʿ{? @!cKOvK~mm~Ibp[}ߨ4wxމc3zZmA n+mj*u^gue!'ڧJ#y~Epgҟ6}IDATisŏ7^L'L=ZW  K(S!M&a2Mb+wѻW* ;*q>]d I?M<,HgN6R ~G;'㵞~Q!4%!LՔi ۄeڦcZ"ݰl`>5+H%t 4B_:.tNTƨm;aĨ- ߪ'Ϥm`^@7RB %2=MIDATHꐐP%lli[Â1߁|ɒ7I tEtXA4[#_#g*B~ذ\2H%4(kBNR(RAI)I;ԛvf8w.9 Wnd]] JNtyI HPN̴RILĖ;uAөZZE~e'v&9vG +쫑v(4 3Q )&`QuZxnefU5侳& ӖPR #2$(g(y2' 1u]3&=~mkow72ag{ᖍ+α(=h&0L/dT 6'75 _ S.}&NմRm],L45kmaڛ_w{VڰMn"MS RAJ]&MIDATR"e+:Ҝq"+ Y-$uk= _u59U >$95cܤ3ZN*6LKI$I)a`)aZJZoi3|y/0c"+6TR i%ɲIZBJ ]غ;3<Ϸ )0LmV*Rؒ,IDD*,QT=5Th܅NNnjpi ۆJ"RtK/)"RT$}p @tb;0Q/w󿡛bVqOWTD 4RdJ) H9ca;5߂±&VZSp}+,ҝg{lz^GgO`7t<1gޱ/|ľUZ? 7WQsIDATZ.h>yxw-{iCdI˴  m3prS#p0uqضu}36N8h&i4M^x,{xA7s{lۺdtwɆr <1{bsԣ陋S㔩GoƏX0 -5e;V4DlrW6`;즻;DN84HgL= s?# 13#5zHIDAT[H2|swz?nj0XWkO1hUvblX; ڜp98jF&{;B^&.]?n7/'$|=lo!yQ< +Cb6dai2Ms±h/GEM+[7TKEw5oB١rPMEv(o C6 IDATCT_AB6ldcN=Լ ɆuRDm\Lj0/i0j_+ږPjšo܁D tꩧ{Y!!V ^~ОBیjI!11T9yLb䛻mN/*yĘ6!;X=[{\XshX݋lBh 3fa7O2˖-0w@0L(cNMYlٲe-Z$"g9000w@P h22IDAT^0 StR|sW`K  ~v*CbO5I7 m6ʌmλnMfUCk ;wu˺ c\v|8J_1{l1|Z ݅н`2=i/.`hEJMr\a]vcn۠jlG,VRӯ#<`j6[?t]1mFmE)O#ߎmxA5_-էlmլ\* m6^_ $=%4_t;-0L&4Riu[MIDATFk/0Yѐw`۠♭n2 JDVN8NͷfŬm[%5_).9i%`|;v hj1fmCI$mQ )S0ۡ!K0mQtFlͷ7̰ m uTI>"a_s[;;_32|6BghxEG C7 ԆcdT}ߠf컯c/6E v$'|}t<\G?-IDATfW0bDc4_bIuٚoC䍋@I#Ĵ9x{O%:J2h7Mv<γ!{]Mjx;uo>=gE4{z)t|COD_ eBڬWAf.1+j_ 7~bLb2&42;KM>}fCf+ɉc*F,dplΚH7EVouR7WU<KxIDATJ8cTݚl4җWm-$$;կx Zй|CmRl4_aZ>vͷJB5_tNPdam8cIDATbY|ݚ;$mi/4ߖ0( m0rdMy{d:6cm+Әf&X,'jU}rDxbMSjI9h-600F)uQP\7"֘MYiQIڏ.jS x|+ޏvXhOr|Y?eq &fi6~!^$7]:C[R ^CapS#&z~yhoHCsIDAT^4ۼ lN&Oݱm#qKgFu ʗ>dn*5g4jӊ),3QZLhdp ,,O#P5LQWM!;636cvx0i<߄KhZmJk$iR-aFcr2&NBͦz[3-\pE:I0LivWLSDkE!E0cΌlw:(B ;+5g5QUu#05-iIDATnɋ7!Jtǔ{,&?&Y-s!Yof©1Uک_V_1F{ގni^<$mjVÈ^T\m*>qcYhwo0LRȿn TBhJvǨ>)W7H b;' ;۝2mWvA=0Yo nTx\sC:1Xcf 紭34L=GZ'oְw&0IDATclAMu|>&3C.|_jviH٭ GMvhgլa3,ͷyxi;ܢ4V$അ}v1[Gcq|6BqZ-}(gjTf'j稆3u@,-#(wD 8EpLՎ)l?I~1U MnD6YpK.\h… u:hbs#~r|8aiOܙIDATOh) i1vHrEh0ۢ1xf G *ĢVzi6M|Sn{ޚZgԬ3ɷc_aN4FY?g3ykhѢpºgCgKй eisa>vRv| FlYL;|yw^_ "T#N=Uaiv,7- pVo N=ɏac;7d:1:ϷIF .IDAT{mqHԲm_ 9|SzhDLfyU^-T͗a2?obOrW_m]Q60m)K&Z͎Ri *-JUW!|5_hZi6q̊4Me+ eKsf+άvH~B-"Z&I Qx 8۶4yWI}Zņi)IIRJM2-%[N/1Bv(.;k[I^J}IDATwB :!x8-6'X%X7>3]ZaSefu=HC®a{vamIhWІb;p>vge+ɽ4s~-iݷżi+fO }8fGxehGi fe8+|Ճ'h(]n_Q*!I@IR9rD.DPtb&]-1dMuW͝C^on"3nSigCO*IDATC4h$ )"E0 :ͷ u)5$a|GҤxQ":π(8d6Cc "$lN۸wLaA-{G{&+ RB Uw|m<7N,/eB,cM&5Q'JbzFPRPH${iƍL2k52JRSx^_i%Y%S: OIDAT%*݅MoGTM !U QfB洽/Dݼ*-3S7!9i;V ZР"LUVj?FUiPoEMr0cj$4}thRR`Xr|4߄wu1g֑/IQȄv.e~>K;|vl}-ȷ7UB[TFy`u ޘ 2N?VCrּXX @Ϳrgep hϬWH#74Qy)lrj9to2*˭|f{~~U|[7tCgk>s{q!}%,?},`|$♤IzO[ƫ0vqIDAT|p,#o.{kl4^|qʝޭQwB< y4B{Ҕi:_xfёoZ$n`g^K7// HFߺE/R<ߘFh<߄&1c<|'!a< 0{ͨܽU 32Ф#FYf'-ۈ[>p#oM-ㅋnޕ \p.M2-熛:^IDATxh Nc0x #_dK R!FJ8f s _sw؈jByuh"5>J w5Ę͒E|ȞIʺ ҉)Ipԇa M)ؕ3O(~lm=r"|gl4=O P\2yBJ1Қ^ @@=^Yl Q6T->7wB#BD5 8͙k 3[o땄pY7ʩO;80hVVdIDAT]xX+H᳍CsD_h˖-EMBk9Ѷ|CoN*zȢ{ f֑)Lv.8suլr׃|xn|-ZԈn2ӝ֧f2ם"n͌XkUS==gug'p_?ۓ{Oyc֌# S.\5]+I33:h'jʹO`3fF`JIDAT<>4aݻt%36 /#:4__:d$%I|2v@`^wղwG_l?ڲn3٣LSYl"H#E"K9嘩/[;E--Vy%b#\ɜum'N6lE6 iKF?cq=OϪ߆46Yr^^إn5L$qh#hlM6+FBz}npGcUl)QɴRQ"m S IDATB6!"ȷJnڔž; nc>Cwօ1va1-yMSYR MHܾ4_'rաnpQo%D|.jj1i:߬|ҟox3lV+ޱ&4~l?{YlC󦄝Z:o&j{nBtUM 13p\Jt'’IDATH]}EJQbL;:AuQ;R==uȸR[fyZ m?`|fU|+; 7kʒO^fZYJ,9Pl6L1ڲfOEu`t04t>~v5b_\ɼ|Ԍczgj>2|̷(V k 8{w_x)tJBJ(I&EB^?Yi)F%MB$az5z `dJ)puIDATR`Y:̎|˴{[Ka2'7}/9:gY?z:ҳg]zO=sg}v lx׉S2:#E<9k['}n&a2W/2sm&jT]"$N1J]9#1ƐCkY5UF4eJ[TmT=c/oD$o(L8UJoۺ>ms=ϝu2*y¤|y$A7f|oH8IDATkg֘K bi-c8/{׬]ַ{6+{녗7m0`=^zf\|%d`8&MTӳ+/l?~jj}r캽RvZ\녗m(5︩K]}쁽Tݟ2S/uuO3?@%wjرPoYNQA6>ҥ$HRP'[S3}v )KF $^ZG*7bIDATUkޯk۠ 3`Ҟjuͷ48ѕ%%URV //^|@AJ9︾_ӏ?ĩuJ $j4MۺcoOz9`ژ޾K^+K'ѳR?:˿cV*Rؒ,Ip,QT=TUW ʗP;j,.kחr&{ ̴?K^ T,D92vҲAL[6 2IDATTTW"EDƞ $ MB(j' KQX .kחB9(O^1*Q'vtZ<1IDDW_ɼv &%}b;~7-n5BҠ{LW_Z|S08r Hʼ{ϓ:_?>τҮaJ#QGsl~#o.'bԪ/_-[NmO~%(%tUIDATcUo0>vSOrՌmWwF߰$ Dž)RJ R$5P@UA@]t;kZ厌4N1m-aK`44!뮯jb>l"(ЌS5B.Ĕ”U1+ѣz,l'YLY-A$R%HT \:zn+oɋ.trrSض3@ - l[:m-J%la'C DDNIDATeC'%E)LA]_U>/ $!u 5?84Сk<@}%|)ʰw{GwCv[$0.YKNk feϻN_~ѴRW_z6(~崽pl!RRIR>~$PJ)AUӹ}a+2-)-0hLrX#KNki~]:D3mNľҖDԉ#r )&k.kIDAT*Ҫ($sai25ilY}:,IaIW5/%iŵ>0;ʹ:NI1]FXחO>b߃KX{sfH}VPzpy &uu| I#ߺq!eBR#`v&wwL b6VVjږJ'>>o+Ԑ1>|qU_G 'QɑzqĬWm'^IDATmMq[e}u'ωFR{b䛻Mȵ0šo!Oe&w]1-ck[%0E21 StX-$2LAa͗a&OX-aÚo!0E5Bš/|a5B.)0`ͷaÚo!a͗a ʔKxA 0 r0LaͷaÚo!a͗a k 0yšo! | ):|L92 k\2@IDAT StX-db[HXeš/0L[%0E5B&ak5_)(2 k\2 StX-db |L915_a`ͷKakL | k SPXe| d[0Laͷ0eTy0 3 k]2 StX-dbcWO2 0 2^xCϗa&2 ;_a`0 |ar/0LhgFIDATa1|ar/0Lev 09`$/:eͳa8 l\d {ֹk0 )oBw0 Ԅ5_a`0 |ar@Wh2 ô/da/0Lev 09Ηa&2 ;_aHہaZ>^ M.#o+WVlT|vd5y~u߽ Qg;1OKI0pcۄy(7HQIDAT|&GƮb0L.e1=sO;5UT[Ɣy?n~eŔ釅N6͏*xw<]h1aˌ-WGL{u{I)GAl(>XП%}[6thgO8;GL voZ10]b7Co[ua^\-»˾ i |$G8+^ƈVD*2|zM<5e:x;ZhxIDATuj`[} /spy^y]wn-ؽ |[!:)Gf22t,zOǓƹQ:B..13" o bt(M^¡CZTͶ!pԷ/Z->&,;0+N x9lQހ*"g_xk 7ɆD &_/gƕsmSrjg1w‰ҙΗd.2i,&)42 ;_a`0 IDAT2L>zyeڑwL_vA&II`˴c1u c oD+ǟ4umko6aÙr1o1 ;_a`0 |ar/0Lev 09Ηa&2 ǻ=طgmdYRje 0&l _f-;@V2 dW&de%hf# Z$zsucה^#}jK*3Nl @IDATڄ]y0 3]{;IENDB`RODBC/vignettes/linuxDSN.png0000644000176000001440000011324013013621651015354 0ustar ripleyusersPNG  IHDRhP{ pHYs f IDATxw|Eǿ{% z(  %![("ب(6W ڐ"*PN A:H - Iiwq{{{?><<3<]4:13X[l Jm'(oz5("L/OR'xwo3?(tE*YD5xՏ$\(z\W sMT~5-Ky5}QQ%W+6O`L;׈ 4"zDb1)&s:%\kq)^q ap_JG:tr^㣠Sf̔|Tc*t6S$8$i29sEJYjLnRuuMWm ]tTc7;*4ڵএޞ贴n=5nIQĮUKAg;}|R|-on׿yݮm42i炲R*Z[hrNwZ BTN%W77(NאЙz7c.Uh`9R l!4"XL6,(РurrQ@Yu&kˤťG'&7 2e6@9eg?(|Q.0ɉvJFU©Ai Ub+ՃBfsUEU -\ѧ'Q"vgUDj Dk38jivKNsKӯ["^"w)\{BKr:&DSu.q+/1r,@Պ6*I8ya;(JjEncyՕ ݺ^VTpGԩSNժU]=ճX:Cy)w1j\5f%YcL^<=+B/xڹuO|;MzY:M~졨TR^;ǔ^Ҧnw)uϟ?ϑ#G89^k&88o~J:ɓ'e_Z5?,ɓFjըU+7+ej瀯~y*b8쒙I^~>T^ڵjQbEesfgZ&tUY_8eeZz)I+JJJؿ?Or*TQPr9qgϞJ*4bKC ^[몥8ց㠵sB3ݒre(h0vW@^sr; O-ժMҳHߓ-T/k6*(ixJN| ʾ/6krE3lU_uIi){ɓT\jի9 feQzu4hbOoii)ԩSDUUF8&$TYZZʾ{9u4=+fYM2)7+Zm6TыgPjU4hdcM+ z4p>pCt.BSNjftA;4(󵨨FX9pMsArRAD@'Hkp^wT_⧜ R$O_3'*hwE*:I^ZI:'SB xnkKxܱ*ׁ'ZXTk׷'YSN`և._Rg[ :z7kƥ e} EEEݷ`x:H^yP'-**b޽PNj'AoO(ƤS\jc ?-b Ku߿p;KU6WįY*tJm"]B@͚502$7nn J_v;G!"2UPR\LaQzLaZ9u9ԩSG|n L2v^xJ'A(O+Os69Pӎ&PbL-ݻ{7Trۭ=ّ_x`vkO2v9y*-^UҹQ=-O}jQC뱭iCң $EF*&*.QRWJ/ )oy6&44T9eݻ&ҳ!!˧vژ5̴}l698vue}zH#"|杓#󾒻R;wLƢcg T#u@͚51 P\p^%4kh(ջB;F͚RsFddyy\pA 8 IXh(n2[q}Ѻu+ڵkСC2́ILL 55VZҹSGF% 񤤴 %) 8 Aغe <0֭[҂o;bb:jl.(w^֩]Z#:*qs&:M? oD5k0h@7IboZ%[Wj;lܒ/%k 9c!߷&~%;G\}Gøݾՠ /^S3@9,炂zA^xb1'MdSO'e\V߹#77Px;&)c:ubx>9P1ϝ;2y L<]cb.zpK<jFGcڄB Gְ0,aXð;def `ٰmW3Naa!!!l6Jm6W6mb=`k׮c_hʽ'N'lfӦlܸ/ZB||cnW vҤm!-m k׭'!!g#ׯ_aÆһO~} 71z֮]vNf3i[ys_}x{{__c%rKҶysSL%<,aC R.Th2QT8ܱGٶm+*Ubŏ+T=G *]ԧ<v &(iᴫ().vH % }TɚݎnWwNIInףʲΪ5k#A߾}Yn=[Q#y79iYvylZSPUr+쯵IN/)whnlrI_;/m£ᥴ8jZX{*eEJ!H$@$3%[FII1+VPlٳ'!!!Y~A)))X/m( J߯ PJE#?̖-[uyl2ozӾj} S2g6&.[Q##>F>˲K\1ne;T-{rs9r<!|SKXְ0+,\Segyqq1fνX28re29D3gv͘f4h7u;o妿(q}ӫW/~my1kVnуCllK/SOq-=@0HMmi f 0m\|Ν:ԜqaA`Рl6Ԝdt؁ׯ/ֵɓdeeѯ__,V+ff͚RbaHNMVL6Rqt߸ILH@qݨQC9n@^^OArrII=fl ;Ԕ$'5g3c(*v^@/i:z_|@vvw t܉:w,OjJ kߎ-ii|uVlټٵC 8Nh׋ey$''ӦMk6mȾ{#6w\ڴnEF i2{Q?l65q,[ؘ|'kۆA"ϣM4lAܾ߯Q82v?DB|c5m„ kN5nP>8+LmOqXg>j =z (0BmXboOٳ;^7jH72o5h ڏ?Kmh0o9ԋay$'9ߦ 1mZy&YyvӴiFEaQw FbB< ؑWyoזƍhۦ5~wfOBB<;3X`>_מĄxz's$&sgHLL}|ᇮߕ\rr-[2ey9rԔd؁S/_ԩ#*y MKJJTs1)|L>|}N8js1>|}233]&Iǎ՗_S ?&׹\/Hv=ӽ ---U;ؘKK4q<[la҄ vrǝd%t7a0Ss#:8";p4#iқ&lL>Y0SNՉv;fq\(e~nn.|n;wgun1%Mǎٺu,[d;w.e%neN>֍a_ifbbb2eI}<֭غu[._|%6ɓuzժSzu1+lV>,fkwߓy3o݈f###+VC}f XW6mNcv?yyZ5kqYf@I_~I=G~WN>-?zhH۲EΒ%K.fqq6lH}yGbM5`SOS6;5Fff&6ow>Lw)Aٳ9xMv+}|"f3;şvƎtVZ|HLL,~=;2WAnڽ&<=bfi[X*6m_fիÏ'y>sM=8s o>!vL+YYY"&տd͚_ df:Ǚ Y+ōtJ(ŕǏA`` /|QKm6}S`/NcFի3iTԭn7^0iTWbD/5y9w^v;Ɖ׽fa wvq$a5lټ d3&4}HA"""T9S2GWl6ڶiM˗3n8Νs sћ$!<"s;Q)2wCzv t֮];"##Z,{'Vh׶ w=@/+=j4AAADUİaXt C)JhLJc $0 |VXر bBkƍGHHxG"܎ぴM̤sNԫWqq,]YgƌC *EVbС.Y &v#33znf]!RpȃC0Lҽ;t,V+VOhH7%੧G` \wuDDD`Z4>m۪~9oxٱq#/U#ݎE`QjՒe˖rAlNKc$;Z֭[f y=jo //b5lġCe_~Yɨ1c "2*qu]GdD٥b',-fkiwήݻqȲes 61[/v  Q|۳ҩu\lS;n' ʁ8_P@hXq knb㏳t91߯?uлw/N>͈G螈~j{}>駟xg uu-<g Ed:uhϺ_oҕ`E֛s'fA n]:wT|ZS*^#GQuiom zA[/єǤz 0"" Rd$CzjժܤwKAe~W Z%ݾ5< KxnCGv7t ] #""E,&++:+yNNaaa go`4nуiӦ(I~gxVɢEѵkRSS<~Ο?C|tڅ Zk3idVk֬zj58ΥoqDG̙3j{iJl6Up$=g:GK}(ӧ(--曻Ԝ$aJclE zBCCvzC>?{,G͚~%$[$8$p$E%n'x&#,< TP ,,y%KuӇiin(mU)<฽sבߘ@Oɮr~8eKHڽkV& 4':B{+W0[,VqMC(P$.\ 7\Obbw= @`@֚q S̥]nY&4mȠ:N*4noK.Mߟ-[4} 駟бc5kʽ!ך 7d鲥oזg֭n'gf͚oӧU>_~ٳ-nLrr HVVjE(*\=yvMs]5mWFU}m۲Y['h=|4[L٬LE+WF?z Q$2"oamlٺml'-mچEEE,_kкu+Zn.vɟ;3r~\J)pqܠSS:sLP:vblٲ.]nLJjBylŸcyŗ'|rxtǎ=z*U(DFVBN:E5 oo-nG*GE8u&=\1ŗؑ =AQߨ|(U) ̚c{:lO'}G[9vR(S?Сc'_-t܉'Ds=Ǵ/t͛;1ylذΝ;ԓO6袜:vr}ѹ pdgϱZLԊf}YI`V.׋-Jx=WsP%$M1BZ|obp>?قbQeyȑxYb|<0xXfAII1}, u ?Nii SW~ٳ; ILL $87v_Ba!g2gnvq̊;B bEt /L'??R۶J[z0ursv:PYf~\_YΏ+~"5%_~%!!!t؉/D d=ÛuB=5Okډ'Xz5EEXV*T  s<_pzJb>CY0?~Q Sx /\ ;,Ϛwީn23vX֯O>Ɇ븮][})B&Mvr^53fкu+*T ,, UM,穟(X,L&J֫}tm6=Ў$wxDБu_\wCG#x}Չ&ՃA_'&5kҫԮKwSFu] o>ω;"Gp<M͚5YCB` 2P& (,*}Q%%%$g,K rFVx}l͛GF6mȼ穾rhHMMuVymرyרMjj ۷c׮]0EفnӆٳgE\׾Zs]r+))-h2;t,XH8Dʕ+3dCߏBƍeY*U[{ej gΜ桇֥! ]vѿ?5kM7u&\3f(N{a:EEkۆ7LyGlqetڕ$׽` ʝ(L: ׵u|'2 w0v"{C5R| 8KRRZ 3fEu]ooj3[1( YszJ\z3s""{ՂN9e>x粉[.s^{UΝ˨Q֭ݻw~}о}{\b矘4q2]>BhjS{i]m:w;R+֭.7 T8^4z*Ic#ݿTNׇNRhԻV/Ytsfʝ,ɪݝIɖSNE%̞{B'ܛ7mOqvL0 AAxcYmI9Q}9^p_ASSRNEѐ=[۞|sHsVR,3EaWkXLǞݻ9xeB5O8D@` y^J3si蒧NP"(OE׷ RO%r' f e#m" Ъ2]Y .Jz^q7.4zɀ.>@&߃z]Uʀ;'t鳧@7P-''ثaie=4R7Lla1;O?%AA<$޲7|qYA5((ժdۮ}yEFٗIѦB XVژlw R\ Gw:y, X# 13DE7[S xiu#Ҵ)3زxRf[@nwws4: דEQPйk AaO鯲j镋PZvwveǭQ8CRR/b<o|qJ5}u J=x]n?"%%P ٍ{PiCEt\~(la CS0>6JzO@/[Jx :}ȅBL&Vǯl˜;_(rL"88XN$JJJ(8}QN  x[,RZR]vO'o *&8 bŊX,lrLx_ )m|Uf|ҫf… \pAn1w@;^$z6o9x$*G Jz7{iB@[K+3 P]T(h],:I^`W9{I TTd5sSImRˑrtOH4Ǔʵ;W| AҎnVқ:4cd 7n )׬sjw*;9gGlAN>[RGB]r7^\2ʕ})T^˽ubpgW1T;] { j^UɁ3G:_3` a~ 0`_#0`"߀  0`~Ϻu;CRRm۶b0`K}qaԩS qf3jߴi"ZF__ #F(Wgv+F7`kRڵ_~GsHO`ȃ PW5mڴaF7`kK.?g#:tU8x>0|?;{/.6?dw^i 8ѴiGlFvrZŵߥFlL}HW5kѬu'|WţNᔊ%-4uK1ԪvuZ Z_×S&sy Elw6dWx)`/)Xw1=ʞM?@[+uo[r ϓqǎ'4"Hţϸ(=~_ZF{3߰>:vc}=֮.ߨ $}?[NkIl%K! ]mv7kNew)mx_—*ZWolD/9&7̞={pEy늭[ӭLy]̙% ye:hDtt-b6J?@R\ jr,Ցlp,׾#5UYH._x, f u?w`Gr>e=d'y}a_2ǎ{2meaDﶼ3g]3tK%+mKnkNe頼l%ŗm].޾—\}HѹߘsN 'vGY(++zS}+ pǎe֕-F2'ՔoȡtVT21?e>jd{rzKHHn}yn5N붉.<ŀ׭/=~on|ۖ n܆=Eso=}GEE~ݐDb|[duI$7 1f;ۋt#ܐܘĄx b;nMv,xiځ6bۼqܘҘ7>-kX z =0{>*xgFw~@](de֭OŦ׺<[&s&8Ge=՝xy=Fyjy{Z eux֖& HLHّ_\f+(;FcP#VFUg/}IOruLd8eiiځ\n;܉C. ~dY2k/eNסP/6̾˃+3 s' JWerlsVB p L0bEV|`~~95q!˽xD53O+ύW?̲qTnOpavfME|As%=c7]uE+= ZQ޼y8ng_WJ5&l;X:-c~NLNGg0%{>*s6frRʢS){NZѐ/39^b,?]#s1'ϩdw%&s}.65YeK9s _jܷ/,;~ PI,AE_e1g:׃wGݺu[.vDPk෌%1[+Sn؀'upR7?.4fs}&a]{O}k#&w>ʣ,\#[qDQ$ϩ=Ngb8{ϗ`ERɢkGjT4)[GɱLV*vg)û tK/r$l%g(ٽabG8I]|@Kj/_߫CޛMU;y` 1BU;kHkacҺLDQ$gLgp`穖wYkr·Rޥq5DS`}YeR~yƶB@DWD\?LziMK|g_0eh0³KifkéjALln>ɲd.^Z 6kr]~޽K23 q̵<[g Nwː/˳㷋vq˃cflߺn,ɾ[-/|hmw=\ނ hߔnSrז% nל $7O -lTmb̈vApl^%y0[ryU\kn^恷?l͐PfkNthZ]Il.yb~S-崅cӗzҶECJΔJi"ńh48-g&$@qAQKh+MfO҃/_BY Ş}t˲ԯ>OŁ,G/:FRD[>~3 X U`S~y' NdWi喭88K|_ef+SD߫™]z=~\*=}K䲨fɺ3,cؓ_7kgu oRke|q-ol >iDe.`۞n|OޛM-v$J IDATخf):2iIy]Z6Vz7;[YWyy?d^CX :4wypYv׿OFDGGӨmv4k>Hu]O|O\;36lوZj?,ّLZt_/Ʒ[ڤ\oFԎMqG~ |HGTe=0}8]z3Wrpc[pRC,NڏقD̄hfsNgI`褏9GWpoiyʺ|8-?ţ)oce:9SfkNt㥒;(*돒և垧崅[Y%vB"h(>w'NJwjsd X;.e#1z:(2X?> K)p8{CYgt8cK8Ǜ̞U௅]{4Ve>ʣ>i9KWW[~uvv~4^8xVqc}ߗ{ٛw*l"E'|6F5-M/^x("Stcx']=U+E3-S狩P67|'J/Hj 90FI홾z4};|y~}ˢӓjq-ɛx)˺<Ӛ#Ir穷P^X8O<}+ӳ/7{lswԕo߈mT*gJWh㿡?1ҽlVٛd>'^F0Csl&j6n /2_"~1b$Z).ȅάQz#Fpz| Sqgy(LriF70+-UN.\붸ؙN:QRƏnf:B~wq|_/^`+x`2绾d W;k)[ ˬ7=&QjY5 ov+k,q7b$ZXkۗkJO[/n+{C}eJЮ]̑yg#_ٮ7b+ .wruRӻ"q:`ĺ /)+ N.\붸g1]ҧ'mߧl]xv2lrثqbcByqv^Ea*KY@&vrZŵՆ&(M4V|M]npT `Ʌk׺~voFViŷWX \mqw)ѥK~ڶmWuQNBBpC*6M#_xxWZ  0p~fݺu~S 4?*7mH~ ~߇~ɀ РAUZķn[oţ>Z&2Ko/S 0`F7`E0 0/ 0`.S [qf3fi =_0`wu+R{1~]j 0` ==B+wfW_\߀ 3h"0ʏe5s_ikF ]a3 Ox':#_9\/MKk{jaWa #_9\Gv🧕~^ZjaWaDXo֩_3]w $îð+eֱ1sGu:B͂Wzo2_ :y g{y`63p%p5̷ߙsNГO;-ymc~0Ӝm|zk+.].isa;FcS3ou-9@p z?\Z/^f\3?N Bj `ۚWCO\Nqo6N *V ‰oqgr[Tvdѳ?/ˮWF7p%pIJKC8/ kä;X{;o^H% o=[ۗLZxO_mƟ(>w?{rM ~^Zbݕky?0++< B@@WD _goChx5>YfoW3.􈢈hW_Н;}%reݵ-MHّW,֭Ɏqcr ɍILcS9Ydst:J5 YC?Ym7$G-W ?7y9整^@E?o }waPՊn׍Oδdl]=-Nͣ5*SeƝ,ڊWڵ,K/*uۋ0whӘlf\u1~lLXu܃/ѶM ڶiwwsg,>U($T\ܦ0wJnoWu9"RA:"*!&F}4Ka˻w{_R_; ixLť6jw #(g+Af thimݲ~=kWN6ws{/xٯXpǹvӾ04$ى?U:>'73{yTU%<e|IIuјC<\b7?y~ZO?-_f5ݨkάI6aʺGӟkr_ZBl5~j)E&޸=E}?ˋٲfkk44ך^[ie߷5fS*RrӏEaPT, |:/.xk=Wc۞ #}.SXY׽ Շ9Ѯ?Td2'BݙWg>+c_KlyG>jAŵɕ1UT*eM1Ѥzo}a8yY3k6=B u,W쬼[׎l߱soԸ{} yCz_&ڽm3oyo'B4sѡco[Nz^޸f:;ꃣT׶w6xm*^z*PM Ov@t) a(nX=R7oNtAm劢8\?uĥdӿZq͛7iricx~ʽɕ1ys{뗭EςZ_f6Ly *bтy4˷mxj^Ɵ\chYCX$/-GWM9ŧڗv`8fDUU2/gͲnjq,7/Ƀ͛\jŔg֓iBEKXh]Sohͬr&͈j1qtUt>,x>6fN71h79ݔY3p1`&py=xz\_ؚG[[~=WF\.Ke=|]z|ʣ}n_e'wxo~ ?v /^!$9ߌh C|F.A53`t\Y#R ۭKGptbtڠZT62*P>=lzlo0`֭[CttrRB[ϐqul=b$*_ttG:H /^d:ŗȸOLT1=|x,GGw6%VWɘӽD?|P+]u/qu<!B B!*BD2{ES+d\[enfWU[yiJGl{!ׁWy9rٸDDDP^w4ŦWʴ_!*v'Tʗ.T\@̨LJ@P=2Kut}>9w6AλZrAF/ T W!|'P hݏ^|Q=4,]EB 5WKf7mƜu'ݻ0{f϶AboxGپJ9տthP0O?f+:vQi>talDDDv޷{YGlݭ kW0Z7;/` fy5뾿ECd\=j5ɾBYrj} ;gsk7oր=_<3ij㳧ؽ/m i-dޞv+1m݅Iɂ*z\]gHQ2M;S'5"Jx…ƒU,":ϸqXtiMW|]u돯q?-ZTlO,_Zhđ0g^Yc;expx^fx; V6VGIoc_#c|UqgFk}۷,r56xߟKnZ.=;5mLl˗1aʶoN\\'OvXGjJC}r~!sG]kִ+kOMǻ$kAS̊vuiG4$ ۦ}c~ja9Z>'73{yTU%<e|Q}B!m5}3|xw #vGc6ٵA(b- ۴3M )sخ\2i~"PUTQ*Wӷխ?BUtϯn,z>47MS55&@ ϟe7=3~9ݞm+hU. !<8Z:{{AǘG1*GM\@>@$ !t ڷt:;G*|U~XO_F)\!\ˁl'%D%{lxQn4Ѝ+;&L H1[;ZUk& hN-f#DUbfc۷l~ukfbF?mdչuKlS\~ds`3[?jVO|6fU#y=hхg#<ZuamYh {4thRArc (6C? sLF^ՏLJ$1{EZC_Y[G:F^էX;&+ h1/#jm\Q۠n PCh4H'[ZpEO٘J%vd~?p瓭 孽ŗ;ݑy)~iݺ5DGwzvn5XF.Z o!/g[^0“rH5p*gϐB±FY9*\8va6&%LBkr:)D#;` @EGwd }&e' {OU n$՚u;Y&h5^swG(Kn׊RԿ=1>H99V(@cwM٘6`%7.b oafc9ƌnJj}ٮbbu;chL#|) Fz}f ^blDŽztH^)G%OqhWfQOgM3^_|Udmi2R IDATles- ԰7/8 0OP^T@ { o,DŮH %bƴ0sn6[ݽ;1$=莡ۚj7mȸ߿BBW =*VB@Kwpf oSkf%E1M- krZR-F<]C{I=ġ LnނpFg`\<|F@ީX7 ?~>[wӸVycPA=¨|[m~-h(v&':ї?Q>\!@Vm[;/iUcBTJ9ly0='+YnۅnKDBNf&{gytnaQHMqX/;$ڱSv\M.ẔCyuUóAfӆj]x|"p1^[]0useL4 ERB"iIsP^ژf[Q;Xb ,3]6zwd:45ĥoG mz6X !7)c_Y4k|ֈ,q KVVVqv4jcxj$҅ UQc }77':HQ?-Zwl߾8&Op$󭉡|~Oeh3%WSSvo}aDB)9_m/wv3ǿ/*10+dqybLsuS|%Du'MMK|h= S_}ۻ7ndLUZ/}T3U_Qv|(JpH$]R*ʐy~-G *<А0uMs_'"BCYßS(ۄ9Z=z6'w̦݇سg7oM}_( #W Ѷ٘[-T)餧־$,Fnxk`̋JJ%==5_ΣkdܚYj:]Yt.eMk =|!ʬAԇ}7;;APѦ5x b1%[nC.5MM[͛5`Ovt XLt ұC+z ~6m|So<2Z-smW^y͛5`糸g'z%ǀѱc{=0 f ٶ>H5u" ɀs. Ӫ>aDmU9OQ}KQF1I)tW7tgoBtTUt! L䂪)9GR/"z8Bwsw(kX:m^k4LVEG.?|W6wLNAфRGR(kI^l\4f]˗c9n~7k]Лs7nsz0ˠ ew^R{#ni.k+`塀f]y~- ߯?OBUUv~=kwk?Xg7M[#4/f~b $a`tl$c.t-*aƴ, o'?(^m9>\m1ve ޑNs~O,|=?ܾ&oʗ?y9))1gƷ/ַ/cĄ c!ZiJ1{EXpǹvAGɠ'NɥGy Р1⮹ Հ&z)ŏw3Iւ&˙s] 6>_K0=6[^OkÅ :io| u3Ӆ4[ٴŏP/P6|EDDAݖ>u?V6C,$oL0w9yؕ1|;SЅqqo<9 kвu,;a=`ʴf /.3~5`i -/T43M )s]kfZkB3\ {3M^zٕ; :XgW-]ֵݺv{Qh%kcZ.#ױ}ת՟r8}⃿ߗkWz{AkCĠHoINN&99KY ib+ۙn,2&C1ﰽvw]Øֳ. S_]?{|GrsGe(}܌Z8lPր>>5 dӴ ֱ)%:;u.'5:'e]yVCZw LNJKvv lݶؽ@\PIמ/ `󹋶d2lQ?Tb"_={SFtX__N }H7뮡z֦^$T1]B.:&]lcWư\sa礟CA\W;(6{Ώq!A λ-nfd-# *nʬI6aʊgɴh2zZW7㙙q1DŽ);OmW>f 9jeUUvٟr&͈d^<Κe;D෫+J9oc}R{?Е|֣#t4,]EB 578eƜuwO tK+g9fXpߣҟ*楛Z2y›\.7YtW1.:Z<&qXXν5`+1Y!ͬZ2Y\?nYv,Fqyl=aѥGt[\q=,?d+ڥ>yINuoTغ[֮aaa5ov^ͳthP0O?>/g@ڄX@[٠rW NRUTjsH"uaM`[c\1tk^#.#88-<6VL9}KbiN>AwKfav {L;V14 \M/Wen_~C[*&~w[X'{(2bHs6 Cѐm&+LvBZ ߂e$>ZMHo7b:[6QF1ӰaCo7Ɏk,/GQUkU\(֪8UGV/ncV ݀,#e`VAAEU fTբZ,Zi. ĝ?w3޾H\~UVS+9skm)iz=WOoSɱ2d=өhPm łE5C^зX`ZXfz漕Aagb1erg@teٻ>NiҶųutkیFmzB}vw?t2NlݖWl* nv#HH,SsHNɵM{KrJ6YGRҥ,.%gqR2HNbbN^~HRg=/sGk8s44m{*柈8u|7w]X7=Pbg䳔9;~v:CK]+'Μ8h[SigΜz!Nq?1z1XK 1]En;-ynYl!sv.#j$Ǣ(-,tmiKk+m.:Nζ g3Q_$eL瘭oX ~9Q;]YQVѓS}z2mӹ;ھW_}ezvtKY^'^p!dee+(=%;!EA*hEŌZ贾j6a15P-f ,fP O'ym52/皁 rUz{L9Gi.Yog \W^2}IFIz-n,9,u⅃hPZ4ˌ'fk t~ V¯K&x| FDx.Wڽ\uTj@N4q]}!&^v}vg`_T刳 Gtg;j{].wCwuh?/IY/GW̗Tl.]ңh̪:Ṵ!PgXbkXLyG&ѽd>F,fM(df*1e˱`=s^?ɜЇt::PM]!7ƒGl;PI'mg}JWwήkEykPB 9gUSAJ%8(G}TB!uh5U´ E[54u9 +wWպClHapz7ؕ;eYy w-\ζ gQEϴg]MLߒȧ_U⎊{w׭/GW`1HO"-- IL̠MEnzswxF’l2IK$-5ԔLRS2IK$5%T,R3S2HMb)&=%=&G/s(o8-o|՜΢r10_O,t̄c{5.$>nj9>]ybQ4䦜ڕ0Kqkœq /wxfϲ_Ȭ?=ⴿіG{SiFPMtTvլ"r̘sYk_xζ w-eim~TQ4H 7bn8} +z_qGEn{gsWh* 3iY9INFWvJ) h^A hgf@.$dx)L?Y穙eIfyFZ&除gZ_^_]0w[뷸{`i6|5aF|k|xĴQFtv?Iv ^VѣycZwMʿY4' ~FDڕU٥ M6僼o:(G}?o9_f4kӏ|^d@VXS)pet 7iɝ;r2jWӼ1;wP#wǣ,0O6δ%,mvm8ۏ*Ro̯MvW⎊;Ζh? J_z"r_ 0#-[KۦZJ5=u`6kPPQE ϧ@LF Z: c?F be? cNiYh,"$-I׸pj"*InZ ZSih:AT ZrO\OL6Z0.\X(ƢQ0JӨ4ڡpKfF5~,&0Q0/lG9"IDATQM( DLzZ ?vʹM0crS34%*S?hjWGƲh֛\@FXT9&s>} bM(ɐn=r򂅳 .(dgk-AZCj+ԉR3\G=u\l<[hB:&Anc[vEՙWW-ąwT`AcԀZ(_E (( (*4h w4ѭ3Y&s͘-o]u B`CFA){W҅u'~o7CxF_'MU]>\Ec *Z{ *G!p@QXbD>٫B!gтVQjTk[+h4ֳ@=l!/_kUѠj,"!OTUQ hyGZP-(:@WuZ}{yEZ-ht\ގwyAq*?'یg8[wO-ۗ練/L7z>qtj=j~P:P5@NZ=,r5?SÆ {8M1ӧilVk 7o#Om뾸b\3L´,Z |UASo}^t2B_tgNblM]FU.9gXP._W/)EрF;]<4BezT45[i(-uY;ʽgWH>ۦe}ʦ4>ӭz2xaeͧ]l|Jj[g՜JÆ 11/jJ{y^?RMys볓莶׋2gch;vuwg_wYQ}Ѳ*mَρvvl҃kWIHAU󓧈iۂ [pWI5ލ},}S|.ٌEG`ɻwԿ6=E(|yE(Qp%G;y^wQ~#U0flcr25eR;حz:x.|ݮUt=+p3gppb0}4_f៣8sQ+'wws,mqwwt6X8ڎ]o6nPgEYG*e;Z?oyK;fr&WsyT9K[;AEVq&^OξTu)>qR4zVգjQ4ZB?#?˒-RTjFWX{JRZsW򵻓(Gɹ>i=n|NMa۹j}w0pmTʒO(G˓Q?6˓O2$Uk>WuYrnyGZiLGev6~S~6T}ŕuhE]?wmm+|9ڍ͹ߢЎҖl?(###Yz|iW9O}unevsᨪw_Œw }߼. x:;Jnwr5Skt{wg|)>ej';nu{*_ #|I^@/˶<Φw^9 G۱;۸+Jۆ<8Zsӗ{;Z5-ms3 .u/>WTS_+`Ag=X䧪,kvV3NrgK,t)9&>7k2ƒej'V|څ9|!z60F~ͽ^9Нmk%ۧGev6~SXIHywUx\&a_ڍL[sgi2EUwJNٮu;ݗgw>/IvXrs0bŜh$f*[sY~:=&|Ez3,fs&볢nHZYy+"|ݞW0>3x w7zE@w4nΦw^9 G۱۸+MQ%#W]VQ֏.ϴ林"1D gAQ/]ƍP~Cfcr JZ |5jCr -a0wΝWvNUO]Ƴ̼&j~?/f Qd?~'-[6~(,lEAhP5:0Qs߲S7UyEUO]N` n^%- jAvv.F قlX/a>usrfX,L&rrԬΆ !§l VrsLff>EML=Py7>f FZ"Yz"B KNݺ5X,|?))p>bX`Wv$Pm5 9}9BT>k׎@b2>FAcEs(Z 3h-Z#N3vv]ƪ:B% h4E}EQhZ ϞAop4z A^{t:4 aa!\'Z-G!*,X>h`' 8C )IF L#080 Zzorw;G_|vv922]O[4iۋwٺ mF6=XoqIvwjӹ;V%/KnyW]BT>.l ljGz ;C`F CF:$ A (a0X d֊˂TZngKήov287zyqz^Ob}pY,|ծzgٓvݓ2V%)KnB'{^GQhvA_NCkEw?h hFI h53:&7֟-Y;Ξ,綳X,˒[n<$*UoԎa7ԫ_ .$66be#G/<۷ɓ(^s7#G/̗ G/—I`^!/SB!/B B!kK~ov!Bx_qUTUB! r!5~!HB!~!HB![_ڵ+ϧW^jB!k׮e׭߻woB]vdws޽{yaB!./B B!/B B!/B B!/B B!/B B!/B/BT7xnQQQQn#_!_n˚4iD BAS-|m:o'_!pɓw{).{Í|׶~WIB!UUQUpYY*_!@BW%B YL-ҹ3&LivӴhڠk3_?5辷'5- B!e6cy۶m䱫0u(6\ʶ ҪZ|6u$/n7+!TW_N !~=sB:LtT W?ǩ'k*X%ŏb|l>5eZeOBvğI<0U{-{p?ڕOS\_!(SS!iͫ l)?\}OA_$kB!D9beZ^|,͹, ?,B+˩v}h/EwU.LBd4=u //;SBggk8M,Lw{wDawx2LAkP'BQA\ܤZKmVQ"ST,Yѻjl$Hp% 鹻eFe<u~˼fFuVyaΦNiw  m Ym%-wY8Om[:ڿmV?@ݹoKߠR}?yDMIM=ITPzeYuP}mԣ˲H$*?Z9g E_"HZt:]R?4p8W.+>0]Y;Pѯ6OM4ME$bpH.Y1DB#gʶ#f۶$)U< 4evWCM϶T;s>VŢoYV?>WOZ8Nqˉ~:T~6ՏYWҟ??Yn1~0Q]8z\ǑauٌZ&M B1}2㸚XEZ߈?>ueh ފ×坟sڽPl-q]Ԧ7_rֵh஀4/Ň_:֬PE[˔IENDB`RODBC/vignettes/macAccess.png0000644000176000001440000026726713013621651015555 0ustar ripleyusersPNG  IHDR}aq*G?iCCPICC ProfilexXy8?30ccd`={vBX[5STBI!B!E{F\554$T=#Ru#sof=VT6[::{T.i'xzz\; 9RO8Ok ^%J:Ť߈uH$$Y<ܘ2:y/ gL>u>[mYiE]%߿ 0bڥ3EJhKudʑ?++U_[0Ղu^ܾWѝ. Fv7r7~f里g[z5<$3V7w_Ӆz"OjkXW}/r_{QD %x~gt]ءqI)̦1W?J,a 4 ͖|vq{٢bROVTWn$[e_=_]'xI܄/@;BяEAD(F٘UNϫF&%j)F$΋ߗLi@25ry h0!=*ɪ={j|ڥ}T~~S#I* s! Bw6m=^u?dyu'-'K%ߎ+TqˀcAGւC(aG""SnEa~856zzپsC2As6{[.S?RVxbɥⰒ×)NeNW\Rʝ+l+ԯ^tczfWͽ[ޡoP'ڸrAu-Ώtp?Ognmn+nynױ9KnoO^ey+޸  guYmy6f7.6edީ+?8N㦛?ff>UWMߎ'7/X/L.ҖR5=+n+ƮW v]c٠nlߊ?g-"b1?6*s7U!Cvw߈P&Yޮ.M1."TV!)Ɋm'./[NAYQSIo^}* d-m)~^=>FQqI΁fNVN֎6 I: :q;]1+Gח|x_-@;?,iN!Ф#EuDˊ9zZ,!v5n(!!7hIdex7yp$-ó,:2Χ\d3j/-8]~rɨHQr{iEYӫBW_Tܮ,:s- j25u.+o 1k7M?n~q˝GU3V6vsN./wv+}egp5pБw cZSA/~^d3WneyGJz>zN(`H@ Up @dn.ZAjLP ^ b'HB!YBHOId99£QHE#G)ANP"t@#xMه c4"0Ռ ؽ$l(13/?#~K;;az {ؔ؊Y؏hLEV#ʓqi|8t~.<0T@BB$xSHU]ExY$C$t;eXq/hq^j MVIs~)SrCTUOrVdNVgZr)TT}ռVP֔fY0 42]6 [YY{Dfm7y1ũe+R6}F l;"GcGlD;)9a%:iB?{.N&CpNOT+g*VC5Bu4 /jг7z. Ͽ TF|zy^m)enmw1PAC \DbBj"ݑI d'rŃRCPQPk JNh-c_pc 10u1g|AF3cW6;̴)iY9yŒǎ !wlfl|g9ќќ߹|ƸqXn6;ǷG H  hlP̓ kh YR*Rc;OKkH/x ȝ'[5%_;C!HBIaA2:j}ok\J cp˰觉 SWx2'cV?m83]}Ôs~e3xXԏJE a~Љsqœ]Rzgfӳ3 ίg͎=O,X]TVUj{eO`%֚Ƿ'˛j<:dU=dw+7/ߎNN}䜕}didy+ U V;(DbIB: iu u5CP Ua?0g  . 7!F' 6٘E'+ef- /`a3uی{'m^h> >uª@`0JQ$TTVJ1*L\HzS$WeY.ErQ*|STzrCiv>Iu^ Ɣf%0ݨ 1F&zXM,,mmً:9۸TRnN=%*}neB(r7BºjD܌:>OH(Lvl 65) s:,.=3CLrz`7ò ڲ:.q4[T h*GW?Z%3fo٠{ P!yH҆A x ~ )@ʐc*]wf˯q=y |[;ytbB<µ=:A4_o-'I0]$"O&mUY7 pHYs   IDATx] @TE]X"BP!]ԯ|% }' Y)h¿$ T!..?sݻwIs&cΜ9soνܼyS*C"444 VP(u33.ÙřH >MCA!0@'t,DB4McdddffVXX>8]++F);Dɘ8g|8aa > ',L"3BᄅI|JeY'),޻ŸG@LX T//u\ſ(`Ӱz3~'*XS,YƳy|4X50eN %Qh,;סssF~0~h^Y"zyͣNWyqwM;,?ƦQ I _)xgn% g"+ кvr}UtA8Cc:Ike/xXY+cd"Z֩7](6"O/1Q&7_;WCݡu4Alsm-96yi y+֮U{; ;6ߐ֭#ǹV>jyeΖ߫`.2b3}|&nhY;ߞd?scZ*fI_5lC,md(o鱇ם{tJoSGzxڒiN 2"֢x 7=ʪз' ؙ^2C,k @_,VgX}}{P 2( ǝhS$l_v( n0{x/ <}n^_\rV~uođMjDXLJ\<ܺħ_GQ9|ye/ mD`ˋތX7=?7+BibK?]5[k~8!EuyQ=8ҟv)wjR-Z>Vkǖvzu5;HzWb'q%ɨ}_E%b&-^&QЬK3]}?[6NP]>ev\K?|a/g,b L—L,)l /2G?^E3>(?ExjNV2YsG?ՉܺƧׁ"3814t+y/!![`䇈-CUa|ک%8%?G3e,IQT񉉇?ox"\6~3NbYt.eo޵a&B߇~mI$ |sF߭SmߝKsr˲YPYmB'mШk-atwBf0Q㎟;wN5ӮViv3A-tD76I)-a_r![!7NDž?]ܥ|r!Bˋ#R̩SxEl/ F Aq llIೃ/8Ba]Y\r~!q?|ǽ+(dw](`׹{w~JU^\"G5p=?tLShd쬴dJi*/-a8$w W]Ag[v!OB>4L7 ?`B_B;2L a(P]ʹZA'{^\|--(pVB=IQYio,<,8b^}vKsMyLޡB/)Ѳa't515u.Xj[{螼D۰k3_yW,7a!J?/We`%sB.s$ xAiᴾILV]6e3ҲBQt,8tڵL&5wIY*_Wqog77%Į fOL$9!xh5ӏ:[~d0NWS8ߗa!}aF*u-c{R䌛 3T)YqfZǰ֩iN+ܩt%Qm^s ܑjZc 黭u/w2HՍ`~S  &T47*z07dž`J0Ct14`YNNNvb`yk`I*2F2T:) }#dv&}fQZmjO*fc5BKit`B ܄ ! RQ!!% $d&h)Ϥ3) Kٰ4 >pãf'33Q,Ê3rBVx}X}+CmF1B],B ?]CoagÜ{viPYlCeq/`=߷OJZc¶?<"mq;U!BEݣ א/~ct$x?SEdb`m;ڗ]pO|%fcfꟑ?%4e\^ C8PGq̴|e (rQ]{WvT3rZh oO >w)['hT2%@rXkyvjBcn `!o04Atbm7_w,n㊱x|լwB:׀pVSU}:ħ~7veo*~M-sڠbӒ YCo7LP/*K:-`{Fg (6b<(rT{wn!;k X]cdo}Ax>1-ѸĄAݾT֥&-"к$Zh]9>G5S%D uIѺ|10}w/|^魑]y%^Jg&mޣ/nlyQeIQ]^fFl=]wŕr2쳯WB3٫-ض^U.yxLܿ;bNUj$gP<{^KJKw`y@ Ͻç/CV}l0mn%O7кZǸ ~ܣRV|P3v Urٺ/ GudUfen``jr:7ػNPzl&idWd]cVFΦā]oKw[0@!=LJGsKy4p4?> {ozs zO>pwt_CbS˅jY߱-nհFyN0ʗl`EheYF+7vGCP@k;Snqޘ؋/ΠQ/"/lM>]o3= f1]D3>5l#z֗-F䔬ޮ}{|wl^g+)+RCw?vQ)\=~vH )1wjcJK:p% 1\E-0TxG[>ThǢ!U=uVᎭBXCzoKBKՎ+C mảVRR]#qqqZ3 DeR ™Hpfq&zǺ{А\b4z~=Qܿ8nM A\spܨJ%[Gv|xy/B>+G#_sT w[.O\{R}_*gVw7bz\d[Tb?}AIM!}/XdV6ɓ/|ݭy],/7%zawWZf*52r֦:1 XAv=jg* } sglVq[#>o $r61BYvm˗W *~Il?ըFϣrg?=j$r#|W靺己1WdY~=f;*7",>eۍXl\ڃ>Dt1([gSߢChZ.le)VI+gEپkthn, xضpCOF*2/G>;r;4i_nZСFqiʘ$N{Yd%.@SǗ#Z C]d;mG.8Yjw.6)o lP3ADZsIBȤsOFI~}%olfʯ+Wl{i , XJ*Vaj󋪐]f50Bnlf 2ϲ]cMM YZݡd9vOT&<V2w>c=2-tTT?Kl, TWlP͝2Գ['cN.&3ݾ] V!"êbXH@\PVxa-XwTUƠ7m*Aտ\/q| A@@ḣVG Rx$F_0xZЉ8Q #>Y|#cF51?j>LX`P_}F)S1\re ll`jdd,AOA"EˆԚ+#cA#%6E`0ދdu+ Òe? yȋb+%T'`*]!5 ʶ` P[e?v&Ы[CIG-<>!l@`Cl=(*H)3S5XӸ1j.g0iD,KjLY ] to D1bbǰcBF$io{o_3k&г!EC77@ӹOO4K4M~4gf#&NG zBL &NG0O(*!FC?.۸q9ۛqƄöv_=#blk=8=Ba}1alj|=m |0?~<0K FiAA @#z@ @;!@n;M! @.1A @ ֤&A @ Kl @ 5 @  @!@naMj"A ~~XA @.A @ ֤&A @ Kl @ 5 @  @!@naMj"A ~~XA @.A @ ֤&A @ Kl @ S8;-@ gg?! %g>|XZAep#,wvk^jəmVKo;|6ut)Sj#aT.g;K5E$+qxgIT%_kO^“ @A]H) .Uӕ ݻ[ k&>Be_:pL+Ff 5mn(#|Z$v[ Ӕ23GUsJr.F!쉘1D\$m&+;s@zTɴiA #0?e$ IDAT{٪y.-C;Nޣ$G|AdB3*7LԹz 2'O0xp Qn}[[L*EBJP [g fGU [+)G <xx=gZJNrRޥv8xTهg}]1<]~xEa7cSF%ݍ !@.Qs\VSX[釁GΨƊ%ߙFW LDȂΒ {Ru校 [ ;A,̦eT*T4Regv?2{|@~,4#Xv4ؔ1^[IJVQ֤ 2-cٕ h@!2½K@bLB(4` `Β!iM>vvKOfxpKNAEmm_.1$f}7'eg"xN=+8S^ukhąh s969 BžforS|İwNόf7IAZpܛz-5x 8sU>w{*ڵ0gBKlp'4Tq3tyۿ?MC~e׮% {<%4;GO^-9~ wYgYX\R)hWG/>rOo ݅=GQ'|!DۜƬ @cNT dę ψ]o}w' ̊ LȢgb8T*FuROOf!aO a>uʷn{v? `Z^hc+GA Ц(ڔ'aL `=ؘ Lr ?`O #f^'zLxd[A-AnnxP:A f r,_d9Ã|WgӁF1f:Z=jp?ߨ|0I#'|KE_ln㡎z!y“R_] TZ.#AZbC.M'YZ}kxҎ镋ܜ_[ Z"bH(a(?ch|wHv |` )2:(ߩ ݅v#F D"!ds{|=Bwz&fH1͝nVH/z4y"Œi ]rl$C]QN:{ ~CGM"IAlhU9{eG ;S:#%wg,= |p '߄BPR?*Q4@zuf]\ NWPFR}V\p3!|1 v-g\I=XBqFϬ Yv.)VêLzttJhk FWxʲоnNr3FVC()(!;pfnB3$Rr# CI$iB婤nW Bvv2R")+IK>.fq !ڪZ_UQV3* C@M@;gݹ{TVVxfg8z02qNpix殓Ú$geu2-}dol@,Oaɕ8#ۂ$jxD\ڻ2g})d._M BE(JDœ, %.>]|F0c18xYx::7q^3kw`u3*ӯ oDk<m A @  ~WAi#@F'wXA @ 6>m A @  ~WAi##iC#pj;F"/OLsyg"B"mmmvxtq3& @ A  AEA  AEA  AEA  AEA  AEA  AEA  AEA  AEA  AEA ?_5JcbbNܐ=_SJg>?`Ȳ mvlLYE^JJ0)bb'UFڠ=k= Q,2O)9(_$wRieeeiink"Hɞ :u7褔)g8~M;%^\zc\i+?ba%O'flCHt~vE-mV[amѱcE466m5ř1.c}2kmF5:ۉ+};D^+@)#ȋ@nP___^Vv]=U h Csqyd{5dQդIυB ,m@KEIĕDdd}UsjOW=UOlЄ:FV a<76V 荐nK^ Y><9RtBܭnqQ5=гwsǑ[EncO\f&EF(m]$eU Je!| sssC(5,lYy 35wKV(G{ K:5.^ ,@s06KBqL-ʢmHF$p@ʞs rDժ͊7@CߙI>8Vت`$Dž ]L!Řht| ԍ*$P C7ԣa74ZwC Hd%Ĭ3PRZtw./;1+keLR|(_/%i/x?/YR,%~~2LHe3mJxJJzc(5 F4s z([YJC)14i4+ *+ZLUNEc s}xƯǯ@Ŭ)aI;Tq'|:OQ%Y~:(1T~+2UL"M; [ ![YUTʛgæ4eIR׎$Iq%#鶒*`0mۉtV`I|dܭK|c??J*SHou4>GMLLT6Xt?Ei`tz״u'T7+Lf#Oڌ 1q71P>%t I5A@]ϓU}h |'Nꄺv@6T錺u.<. POf?q  hѣ͑g C-Pclސp޽AYn_H-m,J@k)J_0a_ϟW*w^jnA# yS>bňhd' }t)o_?_)ţlEP܌ Bn5sݻ8.4V!xɖT޸p-DR>=}1!bnBwBˡ8c%23\Ў!A /ˊY >9Qq%`{J]M![baݼwr6wMB]qpG.T9jb$}X$W?uvkf)NO-41MD(BƲnDkcf!Yo8mBԮTΈu[؜]8T!+xnk VP B7a.{783Ð:[[>xgW֜ Jk=HWN l V[ ܗmUBȈo6g4 ǒ+YܐUuW >_|P(Bfֆ2Si}7JNC3ZԮx,~.)8d6͚8$c9^f\O@.̣~JK+ )׸R]NʮU(_?艪RLDKX}*_ ̾^v% \l Ƥ7{c:bҤj76gP+N˳8WAxFj3SbKhƓMza(輲1v>.^#/Fxt<|U%xtfrOh*UceLɔc3jSIj`iã3ZVUSB29T53zuWiC/\ҝ'0ɸjAYmïNuͰҡGBXUKпXr9Qm`-\Fz+4޲{p;賘]X J (_.D"x4Me첚\+wq@a 0M fY;u{*\ Uj R8pQoK)Яzw=kk2=f;aM Iyʇ7v$LFEi u*C9rޛ=.-RO S!.K%NB,x4,gM%DM_W*W܇!`EہXTzP۱a:ϏpJ'ƧWťoPHo'e68W J\iʡC)7 u-pY" VytL, "QϊȤyI+VVQ1=zX [IT[Ve@_ﰘu <^`:M2YK3waۉxnqXQ6T 3nyIOp<e溘i==PkETWF}TmH02)ZtzUzb. oY©[B.'2M˒{ڊef=ӮWoK%e\x qw01%!{pqy(yh/|.+oiuph n2?b\3>,]I& Ux$G\<8!t!G\-[`k ;A| C&8A5pwŠ -_Ńa 0 R ]g|ASqa9Rm8ZZv>˻D@q+ܝNN.8D  N`-οzp1Jݾ=0 dA>o-*b:iA"rxӐ={2Bë>4FլY2(.oP o\t5-**bf[)klnn]Ҩ@E5̪sgN-J>QEڎ+ºB6VL,V']N'.W5-UVe[I~.b }:< 2iobaK(T {*BCMe6 IDAT<@2T&oV% L)nl5q-k#/c5\3P50|db1tAYH3ӫʬܖF1er?R3Q6Qu~Kb2)+-Bvb;iK@;K$C|ڒ[Y?M_:4];jJXMŊX +(e,4$=ỵ'q7ʚN?y\.$|7MOVxU5DrrYo/>ӭ+~Kԋydׂ+/f?4Je * G;ڎF.:߳pNbϖP\}0d\OIɲzx8Tdš48ϗD{t-']o>Ea3DylaV;p;3̮ 3M755Çᐞ| qHrc4;kmqؔ^&B&zhT;=E՘h/t2N.qB13zZ|0UвHNr,.`0i%l2 o g8YU@՟seTâ;RRʅzc㙬_O"E<=@&N"A Fm..]vBRأ̓(k(J |팡{O%tyǧdz0W|:w#/ ߟpe~α/ߕrQ>{3.iS,^K nrU[/=9a ieNn#ؑP^>w|{,厦]Y7wYixJWrX5_V&jowWp$V_2o|#cC&<05K’if?"Mԧ^ F &&&0 [npTϞ=v !BcGХݕ5G+K =l#DV"[?uW.B[MwTcs(bZR'iQt:'R1֪jWruwPGZժR18;|Rk--qq{)$C d;@ Fm.駟mڴ/ϯ]m۶ni.園._hGwۨDENJ 3"仸F(lKهC/uUKWi$}5/ 3nj-g|ZҫVӲTd=ܘ?+.m=G"7 { d꣊HB}HW}sU<>ܽ;vp>8-4wodFzb״$}J7"W*PM8[Uh7x+NTν:Di<:L=TSZrE mwA?0$$dҥW裏Z2Z#ye4g&3dVy)r~C&.^@bgèk1Cݳ).A <>%\fRN)v0d1Os+ plFV9.YVq8G5mXfDU}0Z~}+j]= +bS7Ku8ΠwFw,EyV$=8;]}r*ufosp8Tz{۪閩9c){fjǚ_Ahqv*bT w|hvuVXKk "Wq:JkᑮzU*%4 yo:q =] cgZ{eúF!ebSVHg_WMUi<WɐQyG|ę\j2: _ BBJTid 'N}ıL=$B /߅^s3ezmPQmCdߢlHf1VTM9sΜ93 OwFv;k1ؼ9N~8E\M2?*J%%ݖ?7q`R{/`gFX0?KȡMl c7LD n}XR'!h߅o*`/RHvݻw,2vx1b5%ۡJYЉ_VujMy8цTa6sE}wAi LuIka@ϒA piGvY?-:}b+$3x6uՓL_wx7uɻvbsiЍ^x5`(jX G*3S95J1H$)<*𦕏Ib'ǩ )7[}EQvinKAU߅ĶNzuU\geG>xa:V$Lyd~b*G\Q!8s{؊e:ӗC,:4%vllcX 0^Jo3g>α2$AxuUw`rİ[{T{FnO)Tբ2^FX?0\%U8iFxCݽf'oJFsVΡCW+]6HԒg6.EHAF.%Cfg xR2|EHMk1-{|xxW ZR؜g$0}\WlazOweu7i`Wh=~p#s5y@ExRƭGuV}zϘ]wIA ht xF|Sqch7+ y=1%pL> @M|j1؝]XNeөSY5]nӼI.A @xxBNJ]k,0>j40zTܰkc],2Bvn1m0 kh^i]} r*F>!@ '3M:4_JKZ'f>GHCᧁkb_ PxPظm}0uF޾ b1aC h> |cOƛo,4_S~LAg\5 #MGJNܔX Vv]ǏiKo ܍SvFP>^Y q ~0sss_?~fUbΚW9_)q0*I~vJxCW,m^#XXXODqR "8V>3UzNĆ$oo࿽?Ծ</jԸoZwEm2dȨQ@%puspWh'hڲ몊/}.W>KbCp";OEa׫ŔT^Z^K=q!17V)/zUA;? 2U`NjСC}vȑzuU"EoîTÇင| qHr äH=3[k6oò]UewxېЁrTW~ }UK0E]!lzuB=)V$F!%R a[z]R[#!>3Ǝ5?l\o6ts]=8>ߤ܏_qO9@ > mmGmh(t렰2QݢݬL]$B 0cތO:5i$3uX]Jԇ3UJ?vr'CjOQڳ.x)HfMLL&K9˖e_C 4Sy]0 _]RLx/Cr$o@SkdI *A&R 4K2 eeTx+zrz%ˠL)fpJJ>y sq}Y{{8묵^ˬb1g&E>a9ٱ.L!$m 8zBKǚΪu-'o +pcE~˻v;Ը}_KdKKbοsghRk{O]=ٶ7מD,k}:YCCsK ~+LdL}[].8sYª1ti7|+ryH$f]edn5a|B,XZX L=^,Cp' ڕIо--İ“*pVOzW>P!#Clŏ^Mt܃{e!7V2/\0nx\r3ɡfvxF _r"V ͘KƿYn{һyЩ` !/{,'L#yB=^&#;Rp. gyWz*.a?nC]e?lJDy Hl6<.OhM6jt*$`PP0ICI2u`k,afUuFX3%nv*K%smm-&&-^.&g~ȀEzӽѾKf1e$!qk^A; c^-qj;Fp1LA؁HJ +VZ&@c ;gU’!i; رcᶵ~)8oL /0K3Nzτ] ەIJh@POm~9n.MVv]qh/{y ^skchdѽw8j ϙ*]u&I/>:;c'[1`C7-{t1].Y.6Lq&4O.`0fPGvK5$' /}D}ɷ/x^s[Xۍ~խ26s[|YES]֢|kkt*ym ({]x)>{n/,=>WpN0{'Fc0pbÊe_ˡѻ_zilV/:u*ts} o~ 51U}A&9ij^n4jZշhԴE'fhOն* K:ĪW#V;T_8GZ})(-fUr 2֖z˹ӴTvG[jgXќԧ<],yie}wޏ {?)>(gk&NYs]GwQn|Q IDATy״]$0,w7{{-<@on>pD]+DZ_/#5z'τ_uw\j/iw/vn|.GBDb$&Xb1nz'&4(]:v!_ߺCTjkkW sGw2%uN 7~!^ɫ7onf6՞,> euɊ<|0Ҥ̙}_P?{G}wlgq;]3GR׿K#`QZ_KN'*M_Gɚ9=_FBwپ:ױ qs/MNYK]TWyˈI.t&x! C@bl\;`rVժzw"_G` .٪'qK*WĿNrnB|%hXF^i4Dv"Nc(٧`"bf {Իܥ7tcVdjAN|OUtV\q~❘7;8 R} ^]8icU%eWr^]8d|}3I8?+ITEJ9w콘+k~{>M?ޘ~4le@ , g][Oدza<#f"u@޴մ=杚eV/^Dow2GEY.Ra.>aFTFRmN{MnNQ2STw$ ijR;ܠ<ȅ`Qw|^{(:{\ &(f02h)=fXXS&T z] X/r0Q=3G2}PҌIq&,`b t?9Yخ/EaW cKl|O4pa5v@ _Ā<>aﲷWG Af7ʈ6,$tH7mJ~uM K yatb}~qhXNZBc=v}3)Xl [zؓrO?~i S}.tU#NPfkN+-kɕ&M1}@ Qۭ̖+:["6\.]k[ n22\{ ,9}09rϟD'?ިdeS r3vXD9ۀp?*GޢL }p[0wmpNvT8*ؾqD7.gWrz37u?4oQ cGlqut<4=FVh{#!5b{-M`rnC\ը^jqSku_Q:ݻd5!v4mq`JQ(9iqﲣ$^|O8;N.Y4mMB { E*b+cQ#g4R"륭߾tS>f6 Z^-"Ԍg=#iCg+ރ@[PROmnb.'W{J&/Û5i OL~{ iwzϊ/׫?od΃4%cQپd_hoP%L;–?ZQ˖y^,.gc ^LjB4!qheΞE4Bwu62PQlׁf"GG<7//hĉ칢Bd-JbmSL.m!k jel JyE h \] .N{X)Xwqq1%(P9F_"z$s[aֶt.cR6sTvt_.zH_ph 4\lKTWW<3&0wKk+)O0 &/5y/z@ xn`=y$AﲖS5.aVtI_0*J}Q&Fum2h zQMoX䊌bh§a#=Jnj ibmڻzԦ2y! EIFzPXdUW(I{|u V)T,\NNNxۻ V`C?"ޡzcSg BI/a|:H&F~uՁo@V<aƲB~^HB?cʻN|C*i/^)[,r5ݶ;Č{m%@bc׻OyIHx|%.ouW7'^vb~6vz}x(¶ݦh tSOҳƮ9 zˇ+SW3DH 73S OpD`eW>ll m+"0\̯B ʯB|<<<2лdPa {&TʊW? ;,~x A ? |,}cߡmvS!Z)|`Min;?wAN񶖿p]?.I}4fػN.7O###p"?{@lH=|_߂ :)wz5MyȡSVwuh8emvWSDŽ3qa^*zdvq¥~\[w{vZ-sN5?ӘSpa/m-=xKx};b#䫿[jx`u/>dPH)PЭrGѻ˷J~\uwP]HUvEYuG^QN>GWg442r:8jIs^]Ln( Z_@QvzУy,NôruOo<4v6 *_H9+ՙ_=¶2qUsFUYy p6N"<<<<Cq7ܳZM8w֘a=v#Xy9R&:T1IvmZLx([=?#$17^s!䩰eٻBơJw NHZ/~6);-!?fuQrp{O&2aגJg}|!/5w$}z7I42lo3Ɓ&\!6k `f1#kYZZL1Ҍ)je&urLlږJB)aN/9ekc$қMՁ)SE-NC` ڑb 8>tVXo؛/E-yk(PE47ﻐG:I}}x#ݎboO6p&P <<-}ջx#ByzξRҊz̞,8U셦ԯUoSى@~*ސѻziXeA[I~zo'gʎjw37wŝt zjwG!ڷ &.MBLZ>z >###0p=3ҽpv$.A"YsvFVtn/կ̕A R?JGqX{o~ȗfq( Yv{^iH Нc%uݔS$g2޼{*Lu:7fOv$d/_@K0ܕٳg z„ =ɓ xxxx лtLgS/?AqMMqޔ.DifmCg*DpOo3)eW["?~͵5_*/ۼ2v"8wqm8xg1-~v'.sڈB2!J&Ps[k .\8gMJJ ho)kq],{/jUɡ 2vmoEtO=婢 8 R}Y /Nr}HS4niw, N"O|Њ^dǦFeGgg34]K< ]q6A;_f^LEJTba3iR[8dqz*7.?ϬNZ:>xuF[TYF[bՋWgZ_ n,Xhz>SC[P" 3 pw`-rho>s 7JF i;WDӸЏ?B4~/xV&'VeK# )L͍rb1\a_O?U,&}H;Mr!V\b} .gfaXzfAo;:;X2K I$n[$b L7&VBW-g$(}EDlSloҾ鯤}mF,ݓ6͏L_]==sjT inM?3C?^TI+]4*#pc#r%\K7Z p/>jPJVéd0B . huu%BWD4Lې-2AEW5S@bw<3gld BIO>9Pdm*\#Q`]T& eP},,^I-W$YxP <~f}DQ]=,qaދKBWS1]8~ kjt4 bS8;RKkCNƙg!Hhd-ٵoKt뮒.twŹL((&Q Y\B1>Te'Rq%1AWYXMINevHg̲M,r`]_,tL5G%UR!Ph8l:Tc)CEL7T'/v_\.Y>3"|prPq_QB`gj֔+IYn2TV-qM/HeLCQê&xcޒ{"d!,b=z|pFPbtcDC"R^^2-N?ԨH|E-AiL:ue'#p]"`P'útƅ52MSHIɓ^a`'3p45"3IфE~o*:c-9#$}"~M]F2Sg L(9"őz7mgN ^T7zT,9/HU.8*4,_m952Ƭ³gd-(*!5' .Q+keSk.E(w^pxI|Sݷ鮶iJYu\Sp{+^:jswQG'~#e%;YbfqڇBY<ݞIeU^<[9ڠI[O͔sQiRφYy23Kuh|Ć-n b4T\^s2okxZ|pS>KB1@t{4(R ye^g/* {} qI)(xv=Q.K㺺:lnlP3 /q/8hw _}pMY ;@"FFn$B<@CV<*3Ђ%,Co*6)ݍVû3I؂vD<l&&ПJ_BbߘiM ofH:[. V+hq&$Z7FWչ|9#YgٮÌYv̙X6.!rύwx:Z?il)s3NI6s?P8  $tӻϢچע`ᄊ!mTr;4dDoe?'ѡՖ_ ߥޠU*s[.~O`(q]1<)R_ifo7PIJuwP'K& g&eY$xHU{L©0}3ƏﳤI\ _(M?IgQҰO.a̝(Zïe DX5+꛶s ۇ{U/տ6TзJS?rma*>6c&FyIm jqB4Ilμd5벁[<ի1X3tq{{NO|UF@chz٩mmslA|gfsTyɒbui8 ^<)& gw5U! IDATiZ@}bh.kϕnQ}wK#-O 7? >K?{yET%1IŀKC]Pz8) mh7nGjj I2Nu&;z>%s'u RooݹΗ4Љb2&(!3!8%x $!"E[m8\ݖ8?$kbr=qps+BѢ--<'zIC#b ʹeeBpfBua`?s Pͻ--=It!M[=EG2΅b_T{&0x]t_gyT7޻agy/8rZIԪ)È5B1vVbۂuo+0pm"F혿򋏏ϸq 0?NJ@n)e2bmM ۋ%t߶dحrcar-O\&k!%aP2jkD?\rhC!wIVԩ@2PWг0}oTR.m!bk UzL^b arD.WDvڋ~UJkXiECeM;|G0e;awmS6) mF&2k0o3fTH, ;:c оv~s0f}cbD#]zY54=kwxj+;}\͊-'tA5bccz2RBp:ፕ`bʵ xJM2[wP8rz LZmP8;E Ի)lSXu ]t{\3u¶(,nmE mo ]² 8똔 K|1CWMzu5}>###p3#0zشqs=J-}l3Qh3is`}26H8|`ǎ0oظgũWg|mCcbbIt2j(^ 8X[-3aY'q\ħUda͵{yxxx]#Ikl@TNa㩩4o~Σn=yңPPݗPm; c99C' V8=jfլ[Ur=ݖ-, ;cgpɵyh6=0@ rsSCzWY[~L7Q#MʎVX\3RO0}{9Sq/򠵗[ݿ!~FPq_~4Scj _4FD_)6Be? Z{i|wAgI3_xau|\FS1swjsKsq~4x<ǰb0&ZM3lj( gZF0;}kڍ@-P \ >####0t <8ZuXikwK)kmhfe\R<:ԖG0rbel+$#f}r A/z=09 :/_HHGkIR5;*ه[UsU0^OmB:nR1 'yb|[G i | h]'&#b‚w2s"@_J]ӾO2`*ڿ~'d)Q0sKj]i;:g\터止Ϲ!n$NUSz%L5(Fڏ:Y \qBx;[+m_iʹ{m1{p 2uCnEALtoC}}gnaKCwIFF#Ѕ!####ѻikQ޽IF/(^[M_dTMI)Z5ޘ`v;^]F kmbLވ4}|ޚ/A{:Z+I162b` 8[v4tjV/*{\GFa50co?$n.K.[ϼUwdb> S~/lekZ HHiF5 t@#05ccD@dlf=/*Yh;f 9=vPPs;m.ex_92tp[[[#Vi ۥ: 98/yxxx,./JMx߬ɉRr~(MOWZje?)lmWʪxl? m= eϏ'.Է4]qcgJjNTն^_n.7ml1fU߄ ###pEJkڳ^Mas~4M11. lKaHX`쌱,&%^z)kw5V& [w(ajxVќ9d жN78vN/ha~OXV`]AY}~u^iY GnZ ߙANW ;xyo:tܠ܊PuqOsZ5׻Xl*0iVtt}m}ۻf\iGN;vɔL~ۭ2 5(%{ճR6Ki0L@JMāp\nQ{ʀyp$n0*-)W ;_ϸt/ 3^DlݰLZұ)5qWʻ6#2x:P )׺?m)rH5DxG|GFEw3X\#j,6366x8&پ//TW|ye̘+>ubJ7E;T֓eDE$I_r_]֝aYj܌5C .X̰GLj>Jݍ槬((&a]8kyWe58՚ji=$?՝fO-!T(szZPjKad%1nqJ$U5v2&DŽ(aBvGRrRiz +e{B2X!{Hr@.B6˪R#A)c`iװ>Ǯcar}e~rZZM쀲{֫8)^^\)>wWvHP]2h?3zdѱ#g/%b _} kj-[Lғi˩Q)Ϟ=U5rM9|m M  +FV:uIsQi'l}l4}*+ 3%-yhSyI۱>~H*&IH ئ.5h8-H!9ŧNd-q#h>K2 ++m-J´aiV^ưRh0prۘu=Pq{UΩʼiYz$J~no z3 ^+qy ȸjdk9>BfDq\.3EΣOi_+/%kw`R,%] =׍6M.A "uy4jIz$?9 &skuɏIHf*?'F^.߳LB4/]u秧V GMvA%$[p,!ϧ*:[.'="R㛢#W\p طB֐9~-u)e뗤eN7"z$(Ϥ4?5% Tgp}鳄Ў9.Xբ4ܨVie;l{ipBC ? f6@m0^_zJWV$bmG$؂ 42,6b,zVV7 cccA]ӞE@@)S0=V.dds(<<< ԻV]Wߝmx5\qڜj4SgK[ FKV J>.àQvmnn&fM/_(z ,A(]0f̲ GGGDzw5.mVV=WGBLL]B*U[__;?,eFU0`W ]<=)]`pWo0~ًW(EaV/pJCa*UzV鎔\JWtmW5e ;O####Bҥ^.%z1_ 7w[ZXPY+Z]bx3\{ cUI4eU IDAT/b}2ETM`ؤ۝'Y#]GGGG`\kA`S&oCCL>I{cj``4 xkԨQP p2vP<`B *`؁CMM͟ .\\BZڻcSwhfki ߝ@ 5.uFs~YHH c" X&RCBl3GGGG\K˞>+@Ո!UuB D~{ <.cIw"5s͉2Ս:^r!<<<GZZ4w "Q7(-X,6 Y^UPl;hĭbULfb 2|GGG`H0 /ɕ@p_{R(硤ej\IZ.\ߚ*<<<<" > 2628R*v~WTM)NgL@D=whCY&Ջ8GZҩ>& =w(EcMGGGG7FfmގwMîٛ}(Nģ)LEL ӽk_Edie^eUP%ݢ7aCD× Tlill* ,r, PO@$>cل; ]?5t݆0as=7yܲfa:1d͍mJ1Zt[qX֤44k _nlk6n\ Ҟ }zΜ9ܤ?+VbuF)# |e42[ ^%H7WPab-&}?(!܎9] |w8::;X2ʪl{%o ϔZC=2t Nɥxt VP8K Held 2ki9_|qv̞hy.7eC;/Gdt'wRC\O i3'I:IđΈ^jy{dlno3]y4kt@0Çl nS. `e~rl)w/N.R YKXREd"TJUFYF_Ljn 'MmIY]&~j?ե]=1tlO_ی$=$9;[o!3P^J.X^Wޖeo`X:/DT∈լ3u:EZImU  kМCb#D#d}Z=YR $cjra<MȪ@'*NkYpؖpinmZRVV(g .V#}m5SR&e={,˫ jraic rGhYΞ*;(gJq6D/i^u(dG .sDZ̴P\*Ό ,Y=XE1%멜(~+\sTaiV^ưLF.lGb%E7yY LyԺ{S2Xg~Ii%_F#vjxɖc+sxE2asr>Z6-:lX"KJZplqr.)x-arۘu=➇DlVY]GMj6]6=$1V+[92yO[9분 1RtJ xj'*qvgS_Ïܢw ݒFsEU]12wyr{B4)^:O2nL'Qi N<*C ]8K t]#&V,MK@|1Ōhzv&Q[pe8ezPwgo`M&T!% pP='LM>QI꺲¬Lrj(P[U' ܼҎ;9$52el!J˱l30QU.q E=WdTӲC%՚yw֪ kD5E4?3rKbǩxC""o[Uo4O*JV> >QI.OpF-I/*˫`/o2zEZO #5Hص#Czy#eҮCe<0wpdii_n;EQ>Gڈ-GD$, s|Α>N#|n߲ΗH_,#J`T[29/,ji O2Ƴyg@ci`_?Q7&e3pzBfY=j L߽h4qvvϚq z݀,ҹ+؉?Wy9j (Q1|j~( \VLb3A颲ZAW}}pn&Qpu't4a@DI(2 xx||%3E1lCD%␠YM@/MNSONoIgoJԩ[U9Oomg{Udnz/HV%Q w%z+}ya&VΙGcAehPԞ6VrjK(G 'uZ5å;pæݫvڻ8p^CO}6Eݽ={EĮ &dǛ53d9bgh,_~{xFO|vu-t'yhg u뱽g w vڻ6xkp zyeƙ8w*ҩP;yz {{ywB upڀ@;yגVAtuZ(Tv6銭SD(=ɵ۟G#p! .,]wyWʦ ;9 9t5G#Ё4񮾦Y]^pUZӤ˴TSq8@0.f/c"]L؛ַ9ʥ G#p nz{w~w w\C|HŶFF6p+ڏ$pAjf2+jB0vQ'w7ut"f+ 2Ы/` @EpWWwa;3 86:17ry{^_VFww&`/eݕ jCVD߾} h[gX:XѝK{W%.c t^H;JAuVI7!>H %uo@t2w;-s5=B#wz0bW}II-y߼yvwRޕ W8ߘ.Ξ 0+}ZmJq Ǔx{M[@j뛺nD|Dhp,O@ch ,)#Ha,m;"|vHѴ#jq,N+Z?8NB߸5qXUUոq`ʷ.zX 4ŋ?p(Veɛ07_!|zƻRaAT"{eAz#> 8M>^-C-|(Ë۱Z%+At ަ_ʔר1H[==08cm`ע'Q>A<;6B[zq׮-Š^>R)F9S6+rv||kA8}g}Y4T{굷ߴqmFeU˟𩛴xfƨ{vtZZѵFzjtt4pɌ]DP쫿~ϔ~OHؐN |AE hS1hO1xzz8 0q oSyNg=w:AJFWݺJVg`jx-d3 U ?cgd].%:&-]=0r_~דq\K%] 녇+0q+~] fP|f˾?z4fmD慦{/x+ҵ?I/|.2rFҴ[XtX8?EY8U7~{4* Wօ 0}θ ?y_>_~vU׿-M,^=L7v>&FoՄv,Je "L.eՂw*G9?EMjPXŨ:Xluӏ\Cwg/]M~S.`g3&İ05珤,^x/?"t47qh[i%vS T &p;j>i]ՠLOEfκ7b,R4} kǛIبhC ge0|rz1٫Q=`s t1RFV!e*Lx6*| os:?w"&aC f.^Mq0} (}G?/Dz ޾0mq>R9/PR7&"!sSs0c㖮ZwR IDATt!7 rkޓHo)ƞ&O>8{On93>z,J->k3'-n*U3l89|9drd^}`v $w~jʕ]{x@ C_] "AY+֧L[SlѰ>yrv }?0yGz,+WDVMjMt NrT݂r0ŽшoN~)<,僧s>?w=6Hwsh,*!r"GЬ|Am:8j\5i!`4I;I@.r vh}c_4VnN]14Fgeaʕr_`^an!a}e^޶֭mK []$d̊f (ȼXvG/2TQgLXCdBߨTeHCdV}u<2ĂoĢL7oV#Ͻ}ȸ}{՗]w#yCF ܛ5e$r = Z{ԱC̴K`ʮ޺d!=)ǭ؉'c9ا=t"9[ ꬷOi:=MZ(HWMN ?/#RrrU4:iYhzt|nUF5 {+uSL+nmL)#kj Zn1ũ#k1ɛ`:7 +:\2y v~ϕcWOٓrlD@pjG)S}P+  cqvqO'1. SdMb,_̘vv3:&,OT d{Ǥ)"`r̟ZjeU)sbV6k4).D?k\uoo<aQ]@&>cE6VOL~e|=:{>x/&,4.]3!9!rf&˛Ҫ`Pv E줹Ծ]۳/>/ C b[@O7~\l} <0C, Ư7=_0k]` caVC}1!QQ:24wC'ݾgNg2-BE/ώ.Mנ[h~&b:wrC4^'ljl6&6YDwyTw\Z─eXj,ї~.jV BCW*zua6Ԩh:I[q#$~TDvSͯSUWam٬R'>4ڍ)1]Up @o+{AM|L+ ڔ{!|cnIoE? LnwT.ְiߤ v~ЀK9js`aGO Y[dFwA`dr y$՚- ?4*q@ҷSvDII%?R^. oH18M{jLUSbh9jiGdӧբ%qwc_ לߴB'^/8"l|J()=r=[ fVxlP7lq{6>՘;wھ}Yjqw;Fk8WeꨈzR1zȯx͵uM1eӠW DP>D+e3SMN_2<ðz9:8r"wLd߾L_a<ȧKftN5C|nc=.g'!@_X `JDh~."0=z&5VQǥ]wVh2T2wb+v(HW[KAY‹ܬgtWCC.sM^C*}$ݙ,cOTv.BMz(oc>JMV}0PjHy(CM98Rԁҗf=}79%?D4n>͜ m[m{K^Kg3͕UWשa\:e|Č8~ҌZJB[7="[H:j A8[ޒVLH5k iaaadݓV b_޽{0Fzbv㚆jU=:mn޾^GU}.ve4upS;QjEꢢ>}dl_@w֭Vdu{,tv[W.V.0W_g maiMyakVV}3 }MұSd,(*3qRo Kn8H d"cGܦ2~*ɨjs+Z&?S.]6_8C:(ܦPaC7kV+Yͦ, 7O/PscXlz$']{9ipޅWQQ]s>=G9_n\cWAR#R/} ht=Ww XFi;k³wO8-a1kXK`B! C{H[*~f|:Qn +Y%=:;]AXS1ċn(2B1p G4u (gΜ  C l߻}FCCCUUb0톾.7L&,%NlVtalS3 _]%tpvoEGA8ʁlmee%`s5ӕ 49&& ]Ʌxһf)ݭIX2Q}0Z]ld ?3N Op: ={ă9jz٢/jPnQk 23pޅxOa;ֽla 6~f*/90QϻlζЭ .7XفD4"(`9/uVX>:s1G#p BF'tY(/=ȥğyץ G#pw#Ѕ8K Rx*0NTcD`scTC8 UY9݌k.aۋt:yH5cn3w%ًQPG#X( dtn-V jND#]Y&uo9[DәEX`{W!ַ]u#r8&~[Ezx:T)fU*5fU]@8 ]e+Zd4.z#݋boc <`6Ou\w4Fݽ4vٰk= lQq.l {fWC\a@,ufcp-ޕ 󪌘i/xݔtdaBqv6 KRƮt-Wk,ؗ5lO8\=xޮAxm*N ́ 2cQ`,렽8n -nD+{S`!*pww3:thЮ 9?M`%x<6YIjHkZRUO rR2.l\gIt1P<%hjT~lj8F#[ӄU%%* :tsyqﲥD[$m) ?N`TDANX2!-G]Э/[`f\q|E:{Gѭ5o/㚟rR9UDJ:;KK *.]^]xG4ċ]{t{G8H# `6"[ )b>c.vB C]2RCO/ Kq:ԑE8Ṙk"T}E9VA@B>I3*dݤbNݾ#lĴ[OYH_i'%o O4;q+M(8{շx(1]]moIH̔K `GD_r 3'dž=ٻ)͝g|p+e0g ֪;؃[+ʂYY: ( #L[w?:{.Zrw]5{Eng>dcmtюjڙ5->Ir_>>N2OĸJvN΄;Wi$sOؼu Is'ؿ僬bVHu%݉Wzoo>tT{o a'ȱM+ӊGD{6mc_ynľ7̯z!z.b:sa~: 히مw/}?[h~3/}_u%GIA @Ж>~%nem2aI[/P!Tyg?s"\fX(-_Up)xKćy 'Mٌ΢5>NZ͚)FPbS ApOeF6ȋSЇbxY6e߉2ѩ;OĤ t#t6ep^<~Lܰ|rD,}ӕo|wuƬIu'ȴ [wj'..Rgn`q:Kq./w̬+SQf~ڢw4.]8& %rc&yA7;?>k/eAȯuL0j괼=#FO~O;YR``Rf.|ޣoNA;qüOH+ SӾ\zkhv{~ԥ>'B}9Յ?>' z5g&jJOO0yuRރ"~lOf(C׷$RTTUQWy cq_OߧnW B|I2+t$]8tLR |.hLȱ_JёH`FƐ=_98A/>dE@<[Kw\yn5l||RloؠO;r3`>3~HDAQf*c{LHbf?e8sB`ྱO#Qh&kJ9!&SGz%%EU^y26**}Cg$_nU9ϑ 3ӗ=8h=g5'Kߨ":8GZ/}rPDaND fsZ?A01#,**Tp-O'fP( I]\@/`ڑSӷgQϑUoC@X )PԤ,z$fJ_|1%ph<vW<*4kt|Ԏ5kh.GP8!UK^D@wFM#vrNzvۮ+rjJ`wTx[GmS9 f"^|饱H!54Dؐ׾j0Mx9wng #H> ’i:n!VĄ.XA5n5[~W^4*,싆`?XЙ` A{g?%?H:ledt"Z9Mϱ.yDv!-AK֖\Ͳ LQȖd QطV"p(YOp!WYc.@_|<6AT.u>Q[10'}b_zYm C-0BںJ* üFy.nLAUKCV5cl',I=~BhᣟD周i{ZY6A .&p$Ѷ7g4us$%!̈́MKX7i_߈a ǩs?I EezXxOлЉ5ޣW(9Ys9Vduq. M[gd^o|?t{Cnx;' >+&7$R(Kp[a?; B+BNJ3JPW].@Miiee9 %%u_OH֩7t✃GȄtB v/~׶ev 8ʚK_i'S&Hލ5NvҔ3#_\-Qi4 %%uv9?27?<ȎV 4)ˎZb:.1䞯.7h4u57nKHJG"d+EmĈkU<r}FXY`T7 糜ʆ:UA^^9C#2Oͫ)xu:S:U.sd~0]xje_Vy?ihuXFV;A} V&1aqNzF#ޜAEXBO%bSw.Q5KvM3ɝ;1jԋ6npgA Sf65 IDAT(yߜ?u\;TZ+\#G?.Tz H?mMu!Y?)y{4:ۉiׄ½ r4=x@<肌?&xvdO,W H֪X?jcac\Hس?flv# )đO~jZaUUQk ΆxS%>NCG.Q|^[!qKFOze)9Qa{ :6~lTfsکFON+~%`n=sp 0{z;~qRIsb6(gXmV k؎5*ʗ_G#t;p4i'\<ѭ }f8s \}E)viƂۥ[QUwta=ASa0rd /:]CÚCmHhXWTʹ`ymi TxyϾK,d^dNӨ݂Xn!JJ>ٸ]E !J«`J(<=APg{呾ΰ-(-48Um1444)<,ihлYVϑAquy'WƋKZhiSy=@s^_f2FUӎ7eSo{V- ҭ6~s@Q)t'TsWFFFCGI޺u]w 5Uu=q~Rmn=]矢`槽UB09HS|0@#PSɒ~8w+ʨҩGjtW:\MIΙέe.z5zn jꪫ/jXVU~>7:c[epy@tN]ʻ1MIwr.Մ@.6M~/Mի7Jj2(w v8:ev LMxmBw݉aَo:FG:dۭ#wtfo+rQGC{x~Խ{p-2a~2mNA*t_?A9烴3g,_Y8GAKyWRgd5j73М!__:) V_ u1C_U/-2!гp0gddζ:@Pybv66ȱiظ /-鲌 v[y<##1`1p8G.û۵nq~ 7"cDpxрT^¾oFgOEDM}}{M6)xSF]a$6ck 7_alp y|n`{g鴬 $>>uo_z) q Ʀ[m6 G#E~fVkb.epW&Wʈ%]!3j:&7}^y`Ar"V[L( |"eqVU];w2fV&!ڠV(Ao@!e a+3eӸ ,/-S#)|`s8nD]KI+[Jeɷ![qʨƾ*?xCUfDT`O2b3^T"xo.@^)p8{Eҕ+gEҵb ʾAr8ݼdt^ ]\Mn+ nzR{snC' VAA_s V5m.k,{F̰)p83,`/fE1K$r,[aܣRݶ $}0 VJKp! $+z[,*#f4iVY]GĻ\R)KdvYT#G#p/#F5Vý 2p˗Mq _r|'OԢo{_@yt3MWF.f:E),,E#Ѯ ᗆ5ё!TC]]0on>>0sKn2H7nF%d`5@KF58nS&ݴrWHT 8ݎ@W󮮤u|?k_3K Fu3aI jaiU@w>^+%G#pW"Nmө`ݕ`qj ]aUq %K]sr8@[xGܝ,Ze$*CZ2s- 3\ me"#ph zkMAVXKDnn%fRNW41TEvxG#hb+GdMNBnd)Qow?lֺ&®+,GyS±`U;"S@Im'<;G#pw#)~[)PW`J[%Rl-9G@@.:,+St:JG#p":ޕ_-r mzλ텓pZZǻčFw-6aAˊ wm r\#h%ʩ<6 #`4ƋUXSd+S8Gu+sWPy;Blqʸn@ͼ#V3G#`@x͝g]י=h['3r1AӤY͜w]p8.@xW.cC= Rʴ mn=@xapcgط5sU]5y!^~LBϋpZϻw ɻiii8+jA#Gӷ:>όpw=Xk W3tsssWZŎ@n̼ktD;^cG#`@yq>7tc;"M3g'63Àf2fl!U,‘=.j~@=yc9'\d zyu=\آHz ,gdlݲI lߎ毅H2{T_Y}ƆYѣzii(_6__^X.w=:w¢;|ƍ.Eca ]2>{=x\G)Ļ2OQWkTH΀s@K!^LLL__$3f_X%Z+dپܹ Y`n"  3ʽ{fq7o 6ݹs'KO^Ս ^d%1o|&+*, \\iw:l>o2G#h}W `e3X-YV,))) @ , II0sa+"0AL'HԻ"h,EDE"d,- <p86LP#U[kl+#[k}RW3jhƦvSaP)U8 aw d Ck%0zhz]'Ì3E$қsG#pDȻ/G48IF=ݪo4F #aVc![Rx\ʥW;-p8"1Ke}BCP0ȸwy<b4|CC_g;zŻ=5.5E:%eQ-WJLFdBj`i^đ1wVKXT-Eyp8)ǻ`Y?7;`MPo0}I)*}b h,(UɌ5^z N1'u y""D\" 9qF(M}0D: S!ТG#" ;w@zݩqPWFFaQlL l͸E!RZ(흷ݸxĦ a[K"))Dt+܅ $EͰ}8A݋D ō2^]Z%IV(Bu( jо :ܺ G`kVSa`UyyyCi }fv"ѩ+;cڡÙrt~䄾SC_ =!RM+JQo`N]娮 SJhuXZ.%ee* m/d[n.]k+)0]GeaW[1.uD:gXlٝ8-jhm ]?z>NR5;`k,?3?v}_O?puǒIU$=J#ϪC'9Te~cj,ϧ$UN8gO|lqXRSdSZZ0Q$/E" DRlzkfP_52,\2kdbvX,B\1"P{bF[&&*Wh}qK5Y"l'vܠ8`z#EvP)K@:KR m;1|4_-k^NoXߖ c/yayo^*x ~K??~ jWkk+iH_;S&KQBxPXcgZT#VvL/gΏg,QzPgv 4 82>"0\YHN*jk/EeakG6Q8``V4/jܑU[H2R*{{"6-.㕂vJrwd3 k{cRZܿۖRaaz64y$Eb (+ ޷b羋&(60l4͌uQjT:]K]"i`ݏcKsy_B $J??7o*"""}/D95 %,D0eq^C{w)R}m:@fB#dPzoxO]T[ߥn( UgbvzS+O_}+n=dC AB T:gХebwjHԧwa-JX;_h'POվ3:&*[tΡ ڙGѺ^ė ^N2yɆQI66v .ɖg4H`CJW uἀ97xdVCe!:cFҷlHHGQUHg#E50!W?xKrSLu GMˆ.=vr0Fvzl<ד-AtUHCGw 6љ)ׄ.:izז2 K?sQTKZR+aa55.AN J[xl:`jFJ 6SqL/!z vW]WNeT5_#"FمV]NԛN>idTG׏/9+6lX&5#G^hRg2UN[s#OI$IGV\-hIyڲC ?PEiG Ɔ'Yvˎ{xټkz.>ޤ\[Sn^|H`mSZ801./鹐];(=!G_{lyc~S .^($.$W FGBX}IygvL>A$辐^qOs߁Gc!HX"^]6 7uŔѯf>v`ȧf\eS7zzi|zJ8dǏ!>㡱g,h1޳7}U˄ޱN3u:_rwhB"U3?ڱn 욆x]W9&Jܻ"#5 pFaۚ,/]<ґZ`hpֵOԹz=}Ќ {wL<,RFZ9|=MKGX_1BcѩZ;bZ/ƒ+?>NxmE3w_PG^Atrꋌ!SV Ypdn!Yp !C~5h4=ICN#2"Zʎ/$UƤ6Y985Gқ ř|x׽'>;l衿l"G-u5=;{sٗ| cM->2ʛq!^MUP%ڊ AQji;uQLt-G9;!+oN Q1n*Uc{be1̖O@H 5kêYXnՃ p[u~Hcb&rZR jS WzO{IPM#y-/8j c@gg&}޴GWʘ +^I YsM)0!SďcL-^OƫtWv!&/L{Ueбg>ٳם;wy1/YO0m湋9hD9{s%.g=o"CK*)EEijsi4{ U4!I~wy)BB}  l)HI:zlݤczrw7Ic͟_XN6?ȩW+,=8߅s@{F=IfMZbm Ԥ]+6żRS'8*$,iUNi74eN,Lw *c?3ɽ/|#ZZdzN}i30hzT:ugf?Ƣ~$cX GψMb3d'amZ)8ةkڻ0NnIEU:ɭ l){L5SchÈt^a:VMF͍k!/{\o6u,|n|HftiYN-GjAJMu9ye*A$nKK\sHWW]8zҸ Vw繷p utҲb/eW&|:G/TCYaVF^MHƏu»+ l >w]wS=oR>_Dm/.7Ќkr"|+A ׯRM54MHԷa1]ʖ@Sb)Ww]tV0 ҹOf"5qW+EG3*;*ODYw]:RxyJZ4ϪMG_nȈӢf}v E,"VQY] 4.*5ufϦg!쵎N 7*<'*کPL6n ۪ۤ}3[Lx^&AհO,^ TQmw& nS) i96!MOJm)b=OmAfT)f8zBW%l2Sh!]=LD.7C_ɵj@Tv"9ٍ#kc]P`:. =ZXUi".7/ #nEXGdDK^KޫAV I`wht6n8I:wv%lAmԫ^mõFTQ#xP&v35 "]rW(?aب7(Ї{8ApYroܭ&0s9\w]9 G$ Vz$bf0} xV-z疿\a!N7zn 1P/h+v s 9>enG,&t.׌NrNZynX-gh]n']v*첩~SsT8ZNa)9t &V)u>\n`j Uݦ< [1^PaMliIgأQZNl64T{y:sRm$KH9/U Ef%k;CSUBI(-)W MmZISIrn=*Nx~NVjk%ȉR(U:J(^ |||9i!I`#ʈ3%a~t|@7bqtJo 1*Ie_L t}ci?gͻ͞h;~Ws3[,_o;<-o< tׅ7w"  ?.'4^=AzhmĦh6Ϻ _ugqױ|hx2,C1]zشu#=H~5kjݤeKWN{D%"2vP_Lׅ9>^U)v[dYWnT4-Yh ثC,kWWBEhg:LxjԬ"ۇcq4Q.G ]ˊwaDmLH// ^㫩2zed^O: ˲F䊿k{Q#޷ڶBXt@5He{~e$yl{oi†  B6"]6[ɋMC^X$sw#+˖4cCrYd`G`{Kh>i `f?lߤN e>6; `M Y0*<4wlQ#:F,Υl^D,X.ٴ~TagcA!#rT=f/L+NK!3VA#b%Rh*ߓaZc"S}lx=ھ6'7/9@9ٶV r|V jsY~ДΌ R3,O#o^$շ)?j;Cuqtpƚvw!QYl,"sCoչ&v$Cޅ '\,c$-Vlfm ݂8bLX4[XXNZ<ϼHGU]@/0eJJ `D%xElvvm̙GxW٭> D_͔a;4:d|5##iĥXyQ tWq{>>orFg-z%iϬzM8r.N.Vj}BJݭE=xamÉ-SMֻ[]%-I ue֖%[R< lŬf;X1ij}ܒN`>M .tuYWZw%Mk{5JK)E*[ M(" ( / (\E rQ(lKs&9=INҤIKhΙ3;;,?u-[SInu%ECm^:c"!6J~ik&}:iWiF {!Z@3ߝꤙK^˹?}S)-o2j~r]2-:iS^Q^/&GnDb<T@d_uQF6^`Lfrn-kdCZ7N䌍11rFec{9F;a;O7c⚳_Ӑ?=cY%80$oV<鷰kmZvpɄGIu=rCY3{ny̔2~x(`MLaDz-7~A#G|y@2:abP0.$ -"0ʼn8~ȑ Ν3y!ztz* S>n-8<K%mdT$7˅@eA9990W;j(ƬԩSsssD?BC l`b >={b56O@2.f >-2wn.Z7˘Sў{ݸnNy\vG>$ w4|di8zAoJWvƁ1O?#SFfxKSm Ôuf\){0ڷTMLY7Rvd6ԧ_/Zxx۵MXE_ncbiۡu$BO2p f?a F*9Z$wv`y13\ l+Naݫ#Rn <&qu[@Ѷ 2p]$a|fמskWn[Z/8o[)}1bYF6'ӄΊvK_hе[F1X6 2a5D\}@N:w'#x -* # bT_\ 5k0c &ݷ]vLELۗq?<[iqyBV{`W2d`@F=`BD%FM0ww#ɜEK?yl;;]B0[uuYSа|m=xx|lz vK*?/Φ,s>A:C>4 BT?KdϽFL+?$2l КFg_l%Dù=¹=%%-u"1e'؋c/`WvJd茕Sb9{Բjt-,mT]O#'(G{L^^Z}(;@ע;PAj+]+$ϟGs]kyBjs$`3Y٬Ei)\-4V¤I 6I1T=v?OfrM&é=6NH//Au"J0l7Y8pgzw9dKu~.bӾ- zKz Ao>w#IϷ-4z8ТQ IGN<65 m᦭H&$%=x;Ԡ^*FΥk`˖ sn5W,?kߚUL V/Бd<>:"%gcH;3ף8`yժ_蛣?egR}8]=e[irp 6 Nṋ[ޅ =𬇬0s zp E=?'OfNUC 83xp9a[-䃙0 Svٲ,^>8mEz" h:.Sg|xBeZ[$by ЫHNqf'ߖ @e7{#0ZrĔ>D'ZͶ,☷3eD>-92iocvR)qvK+_\F(ӟ{dlClϵ Ss1xء;!9X@Eˡ'[vD͗I?= nJ֧G{CS.ս+ĢLHJ>'L9Ltɿ0b'y0 os 'HH7k%*wxk"r˦GЃ@LnMV1%Gq{{ϙSV#hD22 Ҋӓ]q\fA9ݞ >z4B0ɯ@mb`vĈڌٳJ7n8}`` 6 N}_~e Ιb! H`# $Bն~l$ <#l(;C/5 C1/ 7{ G1q ^ cxY IDAT*H͛!E> 3đ'|ce\`\p-|T._k;wgD^Ѐ B@ޛ~uĉo͜٪}u_#' eكLJypg.β0.vz#jr 8hD{$M@`JVE[.M&vL eXw Fd1Ig=KJ"&ᥦvb)>trd @*ۀbݯdVmI Xt} kɽ+ȇ֩' |lT̹n–坵^{uZmǀr8CO1pͅn-{˧!6Ȳ -Ivz.]&9Cȧx 4 |G'BEq@n3R)TDP~3LWXE-(_#Z%9VVZ*1|ff&}i gmm]bL .mQϖc]Na9tdέ_9|n(fFy6/L3䩻lۖnT6T9T/PDtY% bwqqPh Wk( q%jp@_ ;V]Kib,jĻ4!!94&D{e=[ }7NDT(5D)Eb$p9V֍žK*t+4,Tf0p/H)W3YʛP-B>|=˜u SRg[#}V10)| .9<ܤSۅ# fd ~ pA@ĸ9X LK0;Y)d("[rEPnƕ``Cn1|d؍aݗ+lrPN2k+E[WJ^1_nG#Pi}b7 fBNl($DZR_J-)z8 PLukH@(]o<_r FOI=A#:f2pSL07!IM{#0AEGSo?@ E =zrc.#PeKvҕEL}AЃcS ~ᆁY6e\2\b.Y7Sqҳo)s`=Ezs&me3vut5)meljQ19SH.cl:imtGO3./]&JCoNf-xTd{$d*eiYӪ{ҨMSk-K,씄a3O؈Ic: `^1:"""0..).i:]O 0Eht3VKA)u"agen=b~50J)1N~dck? =:`Ԯu#Ys;q#`,FUW 'Q$*TA*v1lMfsݸO'Te]pwAr41NR5ΞZ>)mE څ!xĐfҞ.!q,I!~ϳZCޏ z14J,*:w'=fJqh@ДRYڌqipB6 m/[L\2ϊY0ߘui %5&ϧgf % 046wq8> 47M>1(#`BÜ$1-%}d;MJ*;tAXaϰ?8VBD%qOҲQ(@᯻L8gؔG>{C"+MIv\vK!dCN(TU(.Gwϊ F%,K]&̆ Zv)a(p<#%4O"Ӕ*$ x7D`AACIts ]4;.:hFf}$ lOw0L42GH'2i9ul[_H'' 3mu!G1"xf.HD7RUhhᒏbRdb^Ί7/Ғ $`DF$0a?l\j3)#pyX.Da=Q hHkdf|*kW`Vhd3s,fa9RhԸ:qV'yԦ9qg4Z$2iIí t3il,eA;].Ϡ}{Jz?#$Ksj@x.r8+Dd]a$̀XSIT `(3V^D˜6]Xe~@QaeH-f6)݆c|$Wv&m=Kԩ n2C$!O p@\Rnd ¾#Au8jI[?1x.J&Pt.YXwp8@% P: zTBž+XT* h<}DBnX:Up8Gjmo k׮U~ܥ[_)׈+k9P]tQkH!QЋuG#P&JeXBe 4YfU֘S1Y^(5?P`J7DB}bJPhJSB_Yp8*)b`9xed k8"U|%Q ơAg{v-tc)瑇p8U:KM3Ert_2c8XU|,g_ƁVx` U\x8@%"`#3i*̸M Vq>Lf[-<$n =׻%^OKp8ؕHCd 1tyc0*^ ;;s6%T5YvΪxnz0ؼq_*Nr}xXG#H켋f- :ڂuE<,!Xf9;/(T`-j)Τ[>]d; h4P^_9@pXfsx"^4-P8N0 ;#JЛ`؊%Xͤ**ʡڞ}asؠd8tKG %jlR7xV9p8Uޅ8Ed4dFn]wP9l&Zqbv;oUoij,p8"ԅ*/TIY_EWNxL]I 4[(BEK8zM- 2sJh6#|+Q 88.2 (S而q/[\E(z`XՆu%:<deNNC/ɶhnع-Bh'{S{< G#0μP98q0XzjJ-,}j H\ADT1\r͢ +_"9*P8pG#P!4l% ǕO쀺tmA\U^:/=4&mbiiw12nb@G#yjÏ;4i?d 3YJ\RfAf!٨l,粏'G#TwpX Hډr eXtM0t2t{@9P =$q8Zl;,ENV[P/ ^bo4v1'(P)Xq>A1qll}$p8(]9/[ 9;\]O"!hJyJEOώP6a M$3z)G#8leKa ʮFE8GELh$p8Pc!%T:{q9G#E@mv*\IW&p8 .taY) rG#p\b ;6qG#ʻX^VP4p8j#/n uzo9G#,JNKp8Dzq8G#'uU~J]IݧO:uO䙳ΜmҸa &Jw15:N,xbFqaΣp8@#P!na3g';@5>U%@H]rG#wׯ_̼|7 8:60SMkFG\x0djnU-]0 pn8=VqE:QPo`+.ܠ^LJ?T< G#,ݴGrsmHLl߾8zKKc;7.=hKj*S+'9fnm: 9.!%pG =KF=1#8Iƴ YW cM7]Lu.((Ĥl֭0$NIVÏ?q=;U !bo+8d1hP%</wp8#'ʏ3<\)[q~bp8*ʮ\ uvU$1Vv>xzG#p#7 Np5Fy wA& UdƳldff;e(\#p8WMOG/yi8G sp8U λU>yi8G sp8U λU>yi8G sp8U λU>yi8G sp8U λU>yi8G sp8U λU>yi8G sp8U λU>yi8G sp8U λU>yi8G sp8U ucZ!¡P(߀r8GB =w"ki^H1X jc`Mk32{B _-gDD-/?b}ɹIc):,S]Qt$˗//Ub2__M.#Ct"cVF5zJOZ*/c6׮]wk׮* j5kԩpXAժ>6VJ:y3/5w?|sέ2Zv6L%vK[E1&!W0ݎ ݿkuAtJM% ګڟ;"ħ< KI4lpݺuYfJ/n.s8/AG7KŹ@U? <}μ&ߠ^ɢ0[&ՌC o"-dRu֯NS[ ۶Mk=3*i_:j׉ 5(,FenvnXh/CsXRd3%In*n_gs epW$~-((غuk>}ao:q>d8꓅.[Ӧ0{} iOJza1^CyQ:apo޼gϞQQe 潽t+@aaaq+;}n uѽX0)/>~"KR*tx?:a]~ϐoWdS~ jqCkW\tU[4XKa9{=HV|nײ_.{b΀M|C&s?{ <@/,&ꮕ `iջج̆Czd㣒О\9[ԨA]XhH:DIxsϙ "*BôfNBs'WpW[?=ڴi-Ҷm[ ".B- K}?/} ̤hTo.+-*,/~ȑM 'pٓm} q 9̆us(~0_yϑ㧹)2"(o鯟9IQ8ӯ3R5~9gߴ|E뾣$)9cɘ ?s|~S+j+V)㢛+,fLOg W=?Bx=n-8s`rw̻S/5e6,8]. ɜ~Xh$M+Y:m#<7,2BRbbjtPMHbU&YU-آ =)BlGq.d ?E>EEENjժFJKT*j&zW@ev4VɃ7ؼ[H%s*H$ :TE p({˖-O84<^ ,\bI^>͉~\XL,svޞ=} _!dB79 e,g:n7PmƽOB|xѭsV)'/xa%O2<ȎOlQdfY͊sl%RҨA-#kxmv{i(40b㕵{֧1p#|SVZbYZ  e|;>S9~T4pQQ1ZZQ4 &u"(|#v;ň2(DF#Fc `o0lQXe~+z'%-_pӂ1 }/l8JdՀ8m5}m/G@ȝϮbkv-m{Ӟ^'[0(\ 65j  Z/ 8!]%ג W:.M2}81;DKɪ'0ǾǴ)>ݽHg0,\O6,ynt'v3x7/P`!\NeuĮqt2@+x dl4ikDR4^ZRp鏣R,hv]9#o [xbz?#H ݹ]t,Qp-d+}$Nz~b {&x# //&%M|@bܦ ?vO]&&84Ž~x"~׷Ucm4xն7ρƷZ4fK6Y1gwVQVh%t< sQ5B_C-c!Ҫ|ڻu[г0񃋳ԏ?j{ W|tYE*- ` €SΝnDIп?ۆuhtB&IZھ(,aHb##4=p ]ԓZ%Ӊ%A(2c_6E+њ_ )"Mzv)"B0%(,  ҅[wjSauɡs=]:uKce4a6*tG*9*DX<]BF5Cji]<6̸tub0BW`>b2b U*PEXODo'~}yq{\݃NH.ÑW=?}]s]Ĩ.*3SYeL?>"KQa&"U#yf~eVc}DI?njS E*<.B67p`Ѱt+\Cmʬ}S Ș%Cq^3}oz]4bjtq0.=22%WNW\cg}"Cա0r$Cԧi6]ů uӸ3?eǯJ7ӑ)_ U&/Opzʜ_zZa5]2Ej _+iɊO<>iUaܩĢ -!W϶ QSBm%VU L24BSWCE D&j}:Ttu Gf|(ݝ +a4*}X1aju  Ӳ^'pg[kg^Z }MO| Q43Pi/%#Q(JqW`Y..4[S?&dǃ-q|!ʥ3 jgAQι_~"Dg௴zuѐs:|)'ұ-["_wJtz赡K%zt] ,|p pfSPRB_6j/RaI4u;合&P5BB#1)|Bk4p싄n֊W ϾmZ1βc9xS-cm] eW/>Sv>U+PBTTըAWՅ(uZ%hO!Z[;YBH>w-jֈK:'*-Wίp :5@J bN?EGBV_?alB0ʯ*[fwe_=uxQOIGJKtl՘wv|*bPB_B$!*kw6&Ѵش3i5ԯ]C>"0%\L9./%$77Oyz=,L}1GgOZ'zmy{x׆'"oW&|WƤD5+Щn(UBѴEC{NJiT΀EY}o%?{,&zCjhv b1~iTg; dGGG OVRҞu$Ab%  "6 f>͢%oh]j6Iuj{Zg4i>gOyz| ٚX!d2}ٟfҠrX_o>P]͉ڬxWLj䥙OoI2\ f48󯯔x[IDN?;5&%EQ\ҡf SE7-Ghџ)mQZr۳3 dD#9lSXEb(3O5nCo4#H8A D\aa[W4qƊgǾ=9];hBF״N٣ Lçt eaN!)iWrkkΞ=-uWI[ߒ/Bfq %<>|~G]7nB9ˣx*Yz+'t"OkOΔ}%Ko$ȸ5賋Hd ,:zǐk2dI:IJ19{Fw).xӺ4NOO߾}{vp痭rQ z}Qc.$bV 8uM$^m*5p%:X,tC#clRe? Z+n5qZa Ӡ`\zkY HulhcNjTW"ul׋b@±VjDz9PŢ*z Ws2K=*zipzui_Kr_XmTt&y0i,2Jrܣw}w d =&3TGB[.eSժSi£kѵQTѵGkim1X<[*ԯ|.4: ]LBч*p(Sʗ}XhW\BQ>I1q+£o2-w)$DzCW  Np=Q83Ut].b+A]9Mʆ=!ǧ|Yc9G(X/u]M"׹ :ƞvF1s*wcx/]twԮ]̂W[PC,H^\q|*sՏP+14YA~:pWŊ%j1%蘗 :wF G]~… gΜYf una<Ԯ GBjv 4hj-i`8lĊ.]4le2 .'b^[ayjexٳ'[Qf,CMQT 奃5Y^c"͹;wa,0D  c =0 G63Cu~KlѢEǎ6m <(oڵkN<)֭[o rw\ vk\t8i]V݈m*v6m uM ϜkO<+Ǐaz_Y|ɻ,T.Z=2lg!*CNNpK*ҭdx0l7j#+pc׷ b\>ju377S'ٰ&xuMX8PƑsc1d `C9.?GV<\?6-:Tgp[);λR4}X\0xGU**lw2R4 JG, /jWg|*Z9`_ڬaa5y̟r8G Nd seq8Gz yz3/%G#wx.8Gz yz3/%G#wx.8Gz yz3/%G#wx.8Gz yz3/%G#wx.8Gz yz3/%G#wx.8Gz yz3/%G#wx.8Gz yz3/%G#wx.8Gz yz3/%G#UXBRIENDB`RODBC/vignettes/macODBC.png0000644000176000001440000014443613013621651015053 0ustar ripleyusersPNG  IHDR+1?iCCPICC ProfilexXy8?30ccd`={vBX[5STBI!B!E{F\554$T=#Ru#sof=VT6[::{T.i'xzz\; 9RO8Ok ^%J:Ť߈uH$$Y<ܘ2:y/ gL>u>[mYiE]%߿ 0bڥ3EJhKudʑ?++U_[0Ղu^ܾWѝ. Fv7r7~f里g[z5<$3V7w_Ӆz"OjkXW}/r_{QD %x~gt]ءqI)̦1W?J,a 4 ͖|vq{٢bROVTWn$[e_=_]'xI܄/@;BяEAD(F٘UNϫF&%j)F$΋ߗLi@25ry h0!=*ɪ={j|ڥ}T~~S#I* s! Bw6m=^u?dyu'-'K%ߎ+TqˀcAGւC(aG""SnEa~856zzپsC2As6{[.S?RVxbɥⰒ×)NeNW\Rʝ+l+ԯ^tczfWͽ[ޡoP'ڸrAu-Ώtp?Ognmn+nynױ9KnoO^ey+޸  guYmy6f7.6edީ+?8N㦛?ff>UWMߎ'7/X/L.ҖR5=+n+ƮW v]c٠nlߊ?g-"b1?6*s7U!Cvw߈P&Yޮ.M1."TV!)Ɋm'./[NAYQSIo^}* d-m)~^=>FQqI΁fNVN֎6 I: :q;]1+Gח|x_-@;?,iN!Ф#EuDˊ9zZ,!v5n(!!7hIdex7yp$-ó,:2Χ\d3j/-8]~rɨHQr{iEYӫBW_Tܮ,:s- j25u.+o 1k7M?n~q˝GU3V6vsN./wv+}egp5pБw cZSA/~^d3WneyGJz>zN(`H@ Up @dn.ZAjLP ^ b'HB!YBHOId99£QHE#G)ANP"t@#xMه c4"0Ռ ؽ$l(13/?#~K;;az {ؔ؊Y؏hLEV#ʓqi|8t~.<0T@BB$xSHU]ExY$C$t;eXq/hq^j MVIs~)SrCTUOrVdNVgZr)TT}ռVP֔fY0 42]6 [YY{Dfm7y1ũe+R6}F l;"GcGlD;)9a%:iB?{.N&CpNOT+g*VC5Bu4 /jг7z. Ͽ TF|zy^m)enmw1PAC \DbBj"ݑI d'rŃRCPQPk JNh-c_pc 10u1g|AF3cW6;̴)iY9yŒǎ !wlfl|g9ќќ߹|ƸqXn6;ǷG H  hlP̓ kh YR*Rc;OKkH/x ȝ'[5%_;C!HBIaA2:j}ok\J cp˰觉 SWx2'cV?m83]}Ôs~e3xXԏJE a~Љsqœ]Rzgfӳ3 ίg͎=O,X]TVUj{eO`%֚Ƿ'˛j<:dU=dw+7/ߎNN}䜕}didy+ U V;(DbIB: iu u5CP Ua?0g  . 7!F' 6٘E'+ef- /`a3uی{'m^h> >uª@`0JQ$TTVJ1*L\HzS$WeY.ErQ*|STzrCiv>Iu^ Ɣf%0ݨ 1F&zXM,,mmً:9۸TRnN=%*}neB(r7BºjD܌:>OH(Lvl 65) s:,.=3CLrz`7ò ڲ:.q4[T h*GW?Z%3fo٠{ P!yH҆A x ~ )@ʐc*]wf˯q=y |[;ytbB<µ=:A4_o-'I0]$"O&mUY7 pHYs   IDATx]\Gkы MQl`c4kbI15ػQc^Eq{{8P3?=fg߼?7oވb###.f A @ TUD"xL& fff, "BL"A1 `Asڵlll@,===999%%Nv8www`qmٟ={Fgwec )]a60oSSRKϮI!+ {4٧99 L,lyx44e<{.J@3ݬW=Pw ^SGMR#!KGByΝ}ihA[[ML9S(ҞˎA=l4ez=NxQo999^rtt0̙ä:!\O:;?0טaŰNMSٍK;"Xfk216 ͺ?$ 7wm8f5mAvM5%A?`j+,yv-䘸% 07u%" d wP Da iց-TǴEY^-/m>TI&ʌQ8,xÆ5x (}9lvYnees0!)mR,,,e=m K:<&e L!)EOex*(cE t ~UbOG첔+[@gI}Z1yyE\cs WXaaEEprud|F {ׄ2^~rpԶK(Õ dF?_;qц'zms.eѻ}<|t [CZOS񡿏"GQ=tW'oػǶgM[U+?SCKݢӛ.Z5IwEyڠ7:4N~1˟<Cgian<}+oˀx(t+u.&-yRM~k0r ` zD  8eMn5xטoS䥳0Z[')B@5r6+FRG3t).)??emT+S捩Jk˟/ݣ;{8mF}( MjāNoп , >5"/I0D/?!4fStݠ! P4k,I$c“bX2Pdm@.R)R~VRP.ZMeEi \I02E)wϿn4K~ë44#Iڃ1N_Lob^$f p 2HQ뙿p`q˽k3b(ԈEc?yw8wcNGcŸLĆt|s%e2"%5vvvFBP,5stJk9;b;% iuf~Ff%=#WTeJwy< [3qL6Ї ;/eNO]:MlM/*2b”_Oq2wLT"K%E ml@]V6^h#+Pp &aކii6 4%$  )9r! bkaqQafq_ALcvuH A@?8流s{yFx Iuc)/F9^Qs5Xfgeuob?HH?kޯr\OU{eDzE<hMD"L!6/$xa'Sm5Z|7D\"M {彏Ǯo8/Nkc13p">/F](Jh,R13rNk.gcK (I Ata˗ 7j0MiͅiS=Vԩa&`:;!dSMcv؋IÞ5z]Dgoذ%!} jCEO\taNQl;1j3Z4?5)cmAqaGOg=ax SY<g d<dBOe"iT؞vE"!N.=n ?&9rë^'2mx̶N}>#[m}Mذ3Pv]Iz aNӎ$"R4 Hxa( 3030( k0"rcjЭPK"0"""J B"/q=kSRٵyE A PкMQ0`k0Ȧ8Kr!!@uD(bC"L^&W0A @ >Ъ% @ 0%!A @ UCA @  WbAbA @F FE\%BJ,H @ BըA @P"@(\A!@(Uq @ J+ 1A @ T#W"A@p%$F jjTYUA @ ( ĂA P ^*J %•XA @ «QeW A DֈիWssskDi>\lc>cB^e Հ(PJ(ZMT*377oܸq.]jj0kLvеkڵkטB^ϟ>- mgSRR<<PP(224~iБJӇ`HT/E6M3pF 9Al?jDD1Z;6j>w{!3M:-bK;wax[F!}4-s ^eػmP9UyasR zBwaa 3SmTh T*  . PjȚ1躁©jKԵiaaS҅Fm6YqǭxXmVC}p_?~ېeGsbNW)@n(34~jX1 Bm#W@,- !ρݬYN!Hik폚8{;Xo#=F- Ƹmڿ_)5>>{C'5Ce-j0{+V5_?`4b"K3z̙3V1@^y=JavLP.kKӼu%^6yk}qS99𷜞HXrhlS9SF5{+Aze;K(-F$.jЭʨ<"vx$RK2`ŹjEh xڥ2  91qo M^d! !QTbMtu$Ia7Nlʔku|󚢧+G$NF=`:Ӳ%gP ]7r1F#<Ȕ>[AXv~tp0W,.|y0`mnh0839DkxsˎGiРGǟe FyW$1L]go,0k?ѹWlWâWݺNEʊ5KtaFM]aj6 3jܺGBLx^Nw^R<ܼ;qP/;m믌mϋ806Izqs^ 7^~{{tGJ:=k" X|n-住AFZmB;Ѳg73s^#txsnc򢿫IfnXrnl#J_ʢnA$PƔGg"]dԅz鴖 risѶaZ#t`t;L IDATtv>}.7W^dKQyu1thg3kC≋"ン6?æz<к:~&tw7v&jW'N 'vaWgҵ{(aɊKKC Ш|gee[x3,9$cЭ A;,>kn7Ch%} +|Azb,&L"b&ݗ{S~7^7:3]/9~$/JZf e?7ᜇǼ ˸]9xgڦ}%0 tcbR}Z8Qjm}3m۸˜i.`jN,1r}9׎G`mdUT,e+FLϤzWG 9 6(n7iY<:  ^1,!RkU +uy2IѩG=n|9U6^:~[Ad) Y|Fo|z]ߩn>d :cC,2xje!1d\r.<۫Z~~I7w]w'pkWscR"DFŋ"WAy;z͂A qW,_]s˿⋫#BgeKziЈLlL틇ouRf[Eo\Zi7h,KXx-!yЂ%w֟w=~'Ut6BPPSd?tNjq?is1Tzx4R5; ߹S)Ǭ_?L*<<B&veƬόMi`sYU^{TRE&7~ sl֬O ˤjEȀbi[nYYY|$ 6:;;;9Q2goyv+2`k*4+X\L6HFH M390瑟o𙍳Z[2ȌGdR/ a2`hPթQ} By8acQN s&_yPY|YM:SUBW$(vU=/*|wke2`YZ({!j7C6SܛBBӪ'ZS> 6708IS}(+ &LݛvDf pWMRQBYAy:Ig{~B!UhK|@޾ B˶v8 :rLz$!$#do"/ho4/) ˥7e9{'Zu绰,lnЇEy:|v5Y(`; ZQ)55ԳsE7N[鴥Ӗhg0rǴ9~ ly Jf7 A-~z˾?0;(CpmYZ<{-a:b咢T0hyQȺ;%."j(nBp 6&;P*CSI055y*!p ȴZ7m!,ݽ#iSG3BLfSV>[7pͩػwcHa1@J!zFmdƇ\Aa3gH&N,:~/`ghU{bC{pzF7PU$sW3P7c_계i} 4,ՉC҉M>]g5yI¾cWC7$6u>X+MXFc}3)CS{IZ゚';: Ƭ T/73^]\u\S#y\^ Y+.Y!c݌0Bs- c҂&ib-{NrA]G}ý -G,7&ԝ44ĕu[i-n>6̿)dI>{ U'{Lꓛ?/vȤ5QIZjuS y3t 4 UH6irL[Ad,r QԖ|ddҡ}l jC+^ n1,2ˀ`>zzȚݡiC ]Wݪӛ7; uϝEJ5p`E%q)?tibSg}lw~بJ}`)!+ wYw]vюq+6{}9ÿ{tIo e[x_xZtjJUe)WC&ƤPƗe'#[#p X3ӷhE1x"7+x@tU/+K?RYLL 1\0# ><p*-?lJ"diIQ\6ggEl#SS#}:= 58OC_2 Vѯ #?6QŬ&)NlyrpJS(E9\E rrF6A,]棜աhnlZ=(pS׊D Etej"h2.̏C.s{IՔHF_V2cX-4[%ݎQfc"r+S1J[>!StKznw6ZU!?U&|Ȉ-MX"UK H9W27 %ii$:-KIIInnn )o/$,n``$aa C+`baKKXhHUϭCF:UѡSL163W *;~UFK,csCc,ƲVRcsku!\z'̭J2]!W|:͍M /AMegoC;&[/ ><^Ui.RJrɖ[@b", ^F9*34)tuVtv^af0ʼ۶h^nx[z([ieBaXhjb%,a-jJYV)VuS@P10~1e\7 z-W4,2ig^)uI ToK ֐G-ßKn4rcXJ)T.q0ؿѯRƽ=_b3ZK]mnٲecpk PCM4iѢPXNoy9nOT$MGU u[ײ6ϵWiƤլũvU#9vSV}Bа|}}׬Y3hРΝ;<\+Gm:~"Q(|):j^EjWeiii׮];rȨQ&j^Ԑ"AW`tҁ`bͫ*R"A @(0Pke2kl0 KqqqMScI@AVՃR5CP$xdq߄«uD!P8WOeFQ8 ZͮO0A @IUǞG r @(A @<W2A @ ʁrGA ^yA @(J CPxaO,AC)d%Fdax A @ FLߪ& A Pc('C5;RA @ T_Wߺ#gϺI A"@( @ >kO O BշA Y#@(~RxA @ uG<'Bu@EPx;9A @ |  @ /«o AFY @ #_~:S|$*=JEOOϊ*D"ILLlb9::2Uk(e˖~~~>C=N NAH DBR._zUV-www566jU!%E QXXݻׯ_U }(cmL*'2A" ߿_PP[nݪ9{511{3o߾}qVVV۶mah^~7OP8]! Cj-g[.gZ _΢]TTobjwŭT^MKT k NNNn݂^N6m xG /U]@hQzOhyRĊ#  '2 wmPﶵ.C]o^Mm%wm>*/ʛ] P֣vg@aY@ذӥKXŔu/3Y U璷meR0=\_@Vo޼ 2^Np P%kpB LhگBBD"b">/#"`Ԙ# 4=ߋ]],۱T)nݦGx7M .3"DbeЭU FjVʕ[fMP 6lh``" ]NQ'ߝuwਞ }&l2fJWU*ï"¾8W(8ev27A)0A=b[*U, Rz8s*LZ!>8]8gWӓ+5/rqܷצQ9|J 53DbA%s)MBOWy oM#8mW8-:e}+h͇3mSsC<2mGP-:X{dfho3m_ ?k/ao-F뜳U3 ٳ+a+΂!>چV/iG Zs?6]3w-(u0rJrգ<Կ _fg~EڵkyÀR w|P͍̗33P;-]M"ŧ#""`KCX9=D+*~<\t+: anbP(m5rVݬpX ).w͂uMO=CڼV/}ǨwݻԳVF'-5q5Nxkn"z}fDP%(nN#4 }^]#z>PPeB!3lqOju{j۠y~iه.?hVͮpW+ϔmn7[vq7vmΘ~ޣL^߼zhS[sŝZF\7.ǵ31@m4jQupVYy[ ]Z+ԸdkhB4G(/u,'FNjK/#ť j8Lr@%*##pG2ʤp4tQ DC۵k7i;F&!HϽ]fBBH{oj tFu_3 *jEoE1|uo^TTGiŠDH*:Fon_B}!"V#1m[4r@~+[SqQ M;GS G$E84ؚxmNft6|̭  P rޱ!l1m;uq=v3mmTYR:kPT(4 ."7dV#\T ae9c%)h֡{i;Erj[mLk#zԭH `I)$ CWث͠0|b2v (y( Y6hd29yJֲ{g¢-k2 8-d>1# lPT *2))"fCGO*8vW2bmm[~i{ps6apP\q@@L6p._s$w]|& Xl \ޔsK;ٜ} Xr8쾿6sb#ZϞv7~_DFSae-/UpdKs#:]D 8;g*T-@.E.W  *}m+,IU,*U ʶUX ̌If= ׆sAP7܈vp•{kZORQ1-P֣%SAd0@bҦYLJ/_Pm|L x dG 212hIH>L A^)l k7|El|*BP0Izzwd?`If&KG&Xl[`ca#Qv?Oш IDATRL̶@ 0~sbQC={%=|(ȏy1jh|&/;m/<,ӓ-kYF" W0 f3qkg/FpLPQ CC}@-pn\r@<,9. @@6 ;wYL8wX4x䆛Fxo{xQ~v>nFExKthC@Y$TA^5 G@E0NiQWgQ{QFFQ/cַgjuoi]|&S[l^.PBf,%@PA%OB=;L:l:tЦ7zwfiFAp;AMQ8@"|K?7ļ}`͝V]99F[Z=k5UkX*(Ī}SxUWMtO %6tՙ6Vv%'uZX.%)b|β@ٍّƂUD_. |uw{е &Qvs|,py[ bP m>E Eu6tb7Cג͛;hSE@YڎC8 &o!>6E%lՓ'YH3u(E\CC LZA\Z!jwʋzͳ;ULN75jk%7L3><ggg 䝨 lKJJr+B*ުF>-V[a¡ȰlՀ@(7ӷ/yMoX^/yuMh9+bcLuGz_mz S,k=M'а 5px $Š o0Eyҗw+oo?}پoQWE!cGD0f-5S(Ym\.A^HW} ti£ڸZW`uoh* "L c`S,e)))4w,ӦWKl;mZ[:ѫO>_ F&&L#nu3q:mZWrUP87MsAnfJ\ ᔿDA @ p(P333 ׀ YVMvqvvGg3 ks5Y"OŒ2Ni[@?E &wP&ॡK~`<䤷'U6#P8,_b*"2-Ze q @ |:MMMaиqcxtthCp8 .(V|7k$Ê80,4mllau%r L|תU ߀UUh!8A/ TA P3B8Lã@Niu |f& ^Q>P=2Qf^ K~]Y٢/jjSה-cWs͛yjMbVDC&ױV'G ݰ,K`=}|@vЭ6$W _>\U toKx_[o{-X11sQs|^Lr/,X. I <'g'ų3;QP~h#U7FR* ӤEaWEiz0T:0C~F^-x*`mP^fsmxfuՕ%%TKn[Pľ+={h+Bމ(s6ԥX7jHBUABE=^UJU_|) D2L(L'EH#x t#ʀ@aGMVz6KOxgh=zgd^Nב[щ\F-y-Z̏ߢ@-fFR[dywI+W]5 !-di DN}Oȋ=;QC*z >ߜ2O0Zu9&,6/} ̋h1p4vїӊuBB#^zpmls37#4#\0/"v xRHsS>x ';J16l4E[vvܫKc[C=_\HۯmfW޼|ۯ'ڨz N~  Ue^xۜzyEv}B(일{7R+|1os:uƗll&5o߱se 98Y{W^!T 0L'~n̙ zۣa-DxJ,'re?ďNأ~h]k;w@El~p4>|͜UL;/vH77opbKrt*%TWlPg(KR)~{\*q8\##|+`;xk՜Yy3+89}"jy˲''âl$NOK\&ny2e|Aj @W\ LX @T({KnnnU 2ԩA @ݿY5g?qEнo>~8++m۶rPx9$ @ A"S*(J']؊T k tzۭ[ӦM?A &@UG?ҥ |S*({@ ȴl͛Pf ' @G(J $$$4lŦ=<_Scof*~Ź@\/p蛠%"G U âoڵE"!́Ds8R IJDv퍒߼MMM}"ojH0 (8pyy(RЇ!wyV'1A @Bإekk bXH;Llk!3wO_'{ :-@"b%1,W![ O c``@\ ,?C巪wIFA @X` {LąB){|P1H`ʏyt6hEF.$L ӪmGw{MY셣QX;(-{ŇCȾYmOE4 ܢ6.]5#`Xz% J0aGʓW‘@ _r8zeH`V^e"X*g} X7^{۷u'XX?[TǍľѨ_[K}[$?<|!ߩE6Hv[v--W#SZBeǘ@opnrJ(4}A @ T7`4 @Nh _HY_E18۾ob򑥧%B1o-k@_lf$n;{ٌeg/#УWkMKcmi>[AzFO G5Z9_, /3$A @ T8IL4y,&Co"C,Bz5GgN,#``"ώ|6[f>zglc$s%d=dXf1̍i\eQÓyYl:7Ҥh-?t(,^6]AA @9Vv!BǁA/dX@#s_tL:xɛ;G<26]E2 qImdcQ˽nb_*1*TkFF0w`kiƀ%bEŤ J18|>t\WEA#%* A @S<N6*MTC#x"9f;8r/\+`0OL^x'dƦ`Vd1nUgj2n J =Cu[1 [y ^ZRiJ%h՗?&AvW2A @!.e 5~udLt-<7ďq*n蛻nV.N&69 )r>#uAV_}3rЄP3 žF Z7IU} C(r@7Մ+'(L gffǬ`5P) M!@ f2E,, X,CF[A߀Uvv6  fbT%%%ZU {IFA @)05 ǧqsmNڵ+jpz)LHӧq788ӕj4بXʎl3oz?ӱ YW#kE/=~ƨhܮuWτ{Y4+xLteS{< 4sxJ]v[++ǝxmu#,=<5&H%QEE,ȿ-4GɎ>콐JKVZ+wNpP|p@iUה @"MagnnHVKَ2/d ֲH] q존H^izлnqPciY7iEJ^{\# a/M<4)+1fJTgѡlqAq֔3S)|(5B;oZ}SB Nݲ=|:>0-|2 >˥+VZ]t pKc[! _zzz*wv%іkR/S$ui!UE4i~댴LW+)##A_t>й {MF_Qb/m8ftK?/**]ĭ¢+Kn]]XYr(7s%g=yRTwq>m"L?\ sm n;4(\!PIE$@$Ј@00 ҇1!VC||K9BŸ+1W/|sХ]kQ)Dom{h~]H.|/y]ɒ Q}:`vSNj"MrBj]2P^Xi9j#=Zb8 %]tďJ z*H?,L1'%y1uDeJNr! hIP&|cRGe 5~B^,(w~(btɹ}(.Fn:!:ti|R\Е^!咷A4m[Q`T٥JX IDATH_VڄIz)['|uBRE1^?dCP[kO^ )+rUկG5lntDo1 @P4wvP7.{taOG9]~}<~*:ὐƅYa9呼VF;Q~FGpSc xe==͛S+҈\O >kgM2Q2# >ϵa}Qz Wd|5,$@$@M"Ei"X5.PWh7 nJ%%ygJ"l{='eeۖu[t$2VHuVf,˙-:ab=Iۿ>{T\.P/λv`GfՕv%ͽK>xha፳9߲ M.YJ&}%ҊyZYLB= 7lHH @p[ϲAvU%"TiȽ}od|z f{޲}"K6oݷːdSOOY󤴢SEe;FҞ'xunG~4uo?gnNmzeeG EM.ߘr`ClhPK o .rye]:@a4,,ݚ[nnnMkG:4ĉѣGoaHH#G3+r!Ϯ4C*,{޽y1-|ռ(ͧ) @"@ oRIgHHJxkzJ$@$ФP›Tw  C| 4)&՝tHH7$@$@M%Iu'! h>(ͧ) @"@ oRIgHHG$B^#zJ$@$@Ny1uDᆓQk+$  Ey%uDoqQ$@$@$PSG$.`$@$@$@5"@ .f&  W!@ w$@$@$P#bf  p4ȑ# :& 'зo*-twwhJ 4d{zz֝cHH6Jx_zG$@$d 4{{{7YtHH@CJ8qz  L!%˫)o$@$@$PR9 ˞e$@$@M%w0# hR=<<*VE$@$@uM!%o$kX? 4U )NYk]BHHH:WKujg   U΋Z@zō$@$@ M0p^Ip[Uziw# gkeSG$Pk$! hR e   &ݻwX 4O<  p)pC$@$@%@ .)#  "@ w1$@$@$P]b>  p)Quyy΁,F-bZ=|,6]^ZN:Yf5uӛߋ_0~w#Cܺyo-\u6sL~]~fqp2 *9 CBW> mNڜ ?,d|6iNi6'ii,ӎi+7gZ02xpa!2f&~oVHXNeΓb=wIn<  k}|bnBW(W`ٺkθTD ENVܖұ@5@{DT}m)>o{ĭuF!%jnlŽ[رоg]%YqQK}Iϵ*K޾ϖ܁ǏlK^l!Y!lw87BD)^iV6Ht5kѻ׻zb[OzoW\ܺYYc~&~uL-.=}aJsw;Sy=Hk*[ìrf$(cfA C48=kMm_OnֲMz{JTo_o_!=3'^[]#^!/N_e٪sĦ;+l^+qUVʇYb?%~CxR6eP_p<֚b_״7EDADrjҖ n~A_P͎⢂B_4̊^hi+w m{s02[Ke!7.wF/LRf 6OC襛sҤFm; 47'CnQ=$ô y: Y2M]xoHҤh7凼8kaBi8g鴅[bl^f0+5+!SGSpOo+љV̪2undC{t@?b텱%Jq絛`rJZ(K, ռI iKIl5热Rsh^ Y@VJٌY;NKpxO{ W"5:,daRV\rb[)da^e+PfV0$'DN94 rwd2KFVuvLcޜiKdί6gaӄU%Mls+$lIs_OQ;rsn}ulânVHC5 fpvޅҔs(5ʾusO 0/CX/៻sef'|YU~ۨo {笠}3DbcI@+p^LpXdrP$+bn܋Te lد[j߾˾|fIcLDo3;5RdlXA|L5 g!ZR]<;7bӤaACG.,rzG!q٦1Oez熋u, >?lw:uhy 6 ůaXvvK~sXΰ'K>ڣ qT6͠{0+phH\ֲ9a6#-'v,6GIO<;o4jVF~Yw2Ԩٌ޹ɞ~RU1ͱoit7| hl wDsPou.{a;>{gގZ8~Hy 06%[%3fՎ=)._V?\!m;A&ͻ?Q8)a\WZi;Gg?!VE{vv[ؗe)?%M{0oq`BDTf۾En^MK*YfE7=n*4[4Xm\_ѫX!o۶zͷ 36*U.Qlw +ף ̛Pl1٩4:tqvxwxHLBܷ1ӝ>JOt{!ڡol0lUk9ۭ[OyX(5֯|߶ #5A=FƄK_HEg}a_ۦqt" |(FdH{9ო8@ jǧf#ञ:",]žFHNȖ lٰrx-W-}eqA,"F?0E :9#)Ac_bL4Q$n`oT SBZgI^qܫvqljY.f>ϴ7Z)2\NK2x ؞}j{Iu A- 5Ӈ8TӺrN(56Tl2aʎzGT̖~Qt=_ IDATOCxբWĘZtP=> E 4N[*:uV}X \]xc}7uZmX%^_%_c"Jqq^Vv>1L">S+.ܱ;99y;h֗Y-K@X+S_ns c6ksSxw;Nۡ7W bx)Y:]+µ'n'&>җ9Ju(V5fX&M NqćQ.2~:+> 7MMq3ڷ;>6/_[6pon"PoރX݀/s[4;zO!X%Mb8|"Tf>ydzX(UdVo=6~hҫFsp/<5uS ~{O fYVY- &aH΀p,1pt.PFOfVbl1BMؚyZqӳ$O_hh8)T>WE,{ʖ cPNx͞CQ 65WL(5REB~`XQZNwzw"_)l5t/DM-?r/\o&!q3gnrw}h Oi N<]&~{Zcv8%4hj$Lh$/b\aa}[`<2,lXsyl`Td]V l*.r찾R '݌[=E0Aqt,w=RwQW'Q \OuvP~~ 2 ym箞8;:4ߏri Z!f  y"ee;vRN,{lhʼnyyKG[dBW0fv\аs 0#|[IE3j]VEw|}|y:e!-qYX6L~HX2.'-n;U靾za+%nJ9GmΎ\)KzaA'/=17j 81DY&@MዣȐ[ʆ{PNL Ϙ@mt̃?=x*7^z.gD\,:Ӛɸ%㥮0v4'_l V;p4 _PuX,=I:PjYy f炾mRSYL Ps/jكCCGn(~\ڞ|금уC:VisZwsx֒y8i4DpͭiǎСFc]TӚ_\P iO|ұ:0 (IoyLN ]Y}c~-{jxu~ҭpR\\,=k^jnL}P=H95Ӹ%\5 b6+@TzɌHlYHfMi41&HH•@Xkڃ8L V͎b˰QR'9u<=)jȴC##.g͢MCw3R M"xo/<<^ȶ6KӢ캹M ^)$54"cyR|1 8/1v٠5G q: ٧$ߚ7) *-Y6vF= 7i-_طg"EyߙJ#ٟ-_y^feȪ9QI!"GehBNlca,b|YV!o"hdӺ1O@Q epO?c('k!(OB%N)T"?ٔg'-*.gOe&S*lb"lqDYckZ, xƚ^~hϺ7gǼ}+eSR'@\TbuF1ډ6 0T>,XR f:ll3b;f/ޠi(G34{ӳYlyD xcǡ.8"wĂp?cx(;jфp^f}}7;U<5X܁׍.[?z)oQ/fI^?6f¤L|DvZN_\ضCؙ+ ޲ tz|NxūE8C 2~B?j 3/D^ڶ*|sy?qM~ߺm!(RiPb?L(|0DP9es:YgY*^' Vo  lpSgURJ%N9B-OB嚿U<.ba{zBV:ڱjv:x #ʼjR\ˈvW]GM'JǽY/aB&@[Vm"YrFX1٩;ymLT2tXk3jm.,ޠi(Փv $;%yVb]UUТ,W+K!̆8QeR2c)ݭR4(UĘUHy%k %.[>޴;9lyN~ϮHI~=*q̴;"떋#HfNY7Z?;saZF$)R^]dzm["Khm!*2c{Ru?6zpXyݐS=ĆXXRΒM1ed}ªuF`/wkX3yJJᠱeVP5!&mŋz2{TBvIފog{Me֎=8~3EJbHg5N GRlP9#l荑bs}3H 2ipm]rTo4c r v#1U Dff+$Hx8ľٙ k*CwEi2\!fA%Q2@>KW-Nф,SKRl<6Nds,?p oG c0hӥᣦmo_:Ɂ6(G2l֔+û$!bD2o(C99>^ۊ(ܡU9%u,,Β6uy37bɌԉh6GsKK^Ut/^9Tj99\(rLv=CMj! Li g{MX5;l(ScȧϰS%wH7n(Ę;qcf*(dB jg:ra{F1Yje`lHB{('a6544YKY<|aUU@d?KHؚi{5qp^Lpp2J35;2lTEV͖;vv%"YB)b *Pjwj4!CW}dѧ&|IMhw%q_P]\=il_) Yh̢SD}P"THXޅ!MKFIŅz\Gf'.{eJ!E X)VXt1wReY֡T0qnݘAI 4 fP& TJvI嬢{aa/b@b09\n2vTǞT;eS vXe\T(R gD=;o͎1djX@gaT53AR~hpfBavB"iYQI4Y h <'ǛU J݆Sum C-Z!H&畴œgN {}Q':DѪ$XuʻGd~&d1"ʙ)TZf´g?x2֐TmX'_v! 0 2$heA(C2>7#qͫ²̺C^uJU얲ˬ9HLkw !3X%_91#Ju{fBA9^)OptY3dQc5d1 VGҩhyj L|))eٻ6J8 mhsحUwE+!sk!|a IQo7 -Κ}gAvpQxKRqԳ (5f@"h%\xnܽ"]v;wݸ߇p^W1Vmcm0uko.x 7M5%HH#Jxc5L$@$@.HHHG 4HH!@ wː @7x  p%j,C$@$@ N]@HHHpG 48Jxw   GP2$@$@$( 4HH!@ wː @7x  p#UZZHk,C$@$@$ BOH֭[߼y]q3, 4:NBO FořYHH'h``EErss.̂$@$@$@ E{ e+%  0Q0A$@$@%1m%  #J$@$@$ИPSoV  0Q0A$@$@%1m%  #G^b, @Cp o[m5jtܘkD6A ]H@yyyvv n߾]VVJk|}}^zЁ?޽{qۻM6Cu!ٜ9XHꕀ"ǎ ܹs۶m[h.֩0֭[W\9{׻wx'''R 222<<]v:ߙa˗O<5n\/5L, H(S ҥK9s~~~Æ ˋ1bD1;wq5{l'w%ܜ$@$}&bHBT?,岊޽sOU\k׮+%e]w8 ss/[k /Ԗ#Y=,**iٲ%Bk.{h0 ɓ'GLD+V?8ي,z*&{Q[_~7/ڵ+_oIM /f:;5}|Lq^c9oƏ;38ُ*333ϟ?߭[>}@Pq(Svձc~& h >}ћ"1$زM|v3|]1TLEBY0 7|HHvw-`cǎh_1Ra#sg'jˏ>PoWxXFU@+8ˑ1cƴjժ:WRK8*}$oQnuk!xȃ*w{IH#ߘw#@+h۶mС]w݅tQm_\𢔕|,>COgbUE_?w|QUf ߐ}$-pѣ۷o衇<=B3VRy!%o$W;ĉn߾;xC!'w$ 4UuT{`:mGƤ{оãGv^TX^Ѫ9|[դM72 =d8܁Sp q{F!'`%%=Cm;|#7Ñ޽{7p ^T~V6uYfw#GeFFFAAM#v?vSK0:aFwJ$@.J2v( shwr|IlJJJKmmQ4 /6H 8}97D~/ii\>n|vg ~{jbq.\/h6ȗ.]k4^ y9.Z./+ДFKֆמ/u ~2\Ϋgvs?v {ѿ!B.ngE։~HY;u髟}' {!eePqtM+O#G5᲼&%sne:m#ėw֕םC>?@һ7|̬IIDATCVSŁ3O/R՜hS'|{tJri]^OP'*NYeZU@1X7J8J)+őǪah"fٟW7q!]D1`\#owY\5Y./1 ~Zjg/qɂU|b\l7Xpǽcqc@|l^ 1yH6E0hCBI+|F u}ݷqg'.1271 *㫽M- 7Zj'5ԫ&U.ɰ4I`^yZQYE  yf42`O+*/+d~"MaIW )fxkOiP j(upc/pOm]3ׁtAX"7npEm1ENWm$@$ @[2.VHH?Ɩm7獣);Y>Jl%%WsϕDE]=o\8s[FNN(Y,҂q_R=[P HYSAy hy:6fox/L~B%(fAJq 4U|!<ɬHߘg?Ƹ۷aﮨw[[Z륟G(Ur7˙}Pl.]QqE PeE!/UݿHH)#]EȑѾwAݟ̪]-R7nIִ lWBO;Šu3.T??zOƌ2>1"Ņ E/Dk7d#=oG3`zH.+ңeZQYS*Mŝ$@$T@0kPF."b i*e ʇ__mG„wNntk5oUfv\_zLt)=,v_#R<ԅל Ia3cW;rΤ]5m}4w>0T[VtL'?Ո ORBJEEYPEO7(;(H @01+ ³ݺu9a 0 c pock8U9@}P>Z۸;I[;vv:NI [~;pY"}dzZPA '];ղ7tW K/^-זo._V-îB$ʵ7EOf|sziAEWܸU #Nןmճ.dhϿ8ضourK6Uvjc Z-$dsƳ]Q)fԑ5JCM(YNӶ9mz#o8駟~gݝ`~Gh;loEnae>w-v(CpnÇ}\fƚhNM붓?;j+DBW݃[Kw\voYq-{ .y~Moej`ڇ׫tjO n[ӿڷOk[Pri93.Rt9v{E~y۳g ȪW[9kۄ+bkaD2sV0<]`?ޙ ;~+C) ^qzY ]q`$L?l2^-j])k3Rq= tuk%K0g.MJsx@ߜ"LWQRwDb]ղpaqDŜ#K[ 2~{ع } yX|ֱ;}5VT;PV9)E*ĩ qG<jQ+6S|ߔ) #^7ׯ_Ud5fp s1Fa9R#S!= ^1"Yrr2ল+OEltW`>q5r yyAbtͿݯMW$(7)7~(/nnnx ~5mPt*5nxLJsP'ImMGV-'wks\zt䘼b7]4w_bd?}Jz!֏\T7KZ^!)Y+R_}n-:獧'T{;6ľJBD_cG+ml_ߗK eQO},!˧{̗;Gt7ײa NsIׅR]I~㏱+S^bsbJeV 4?<8+cb..cnaH;&`wex*W0lW_ǂ_rjt"WTXrQ[Ֆ\ 5;GhQQR^xdpd4\w3Tofi3_E\ql?O}nyD>WF\y+_4o;~˳C9eƔm~G3,nͱWL8'ۯ~7zhuEѯm?SCbԴ76gz<:͖G:g0o+3lNkOyy֊o2Lﶔ)'L~mO/Smq#tZBđ٣g|>ô3~xFXbw#4zٱw^*SO7-_x}JϽyY_970?9"? ~2E秾?Qz_SFKSFܛ=uǖ^Ϭ$FHb(rٕ5L ݂Xp_q@ .j}[by 7BMgs7]]^lnmUg^ )MbfعttOqH.=:kXߩO@9l蠻r?{EjwgJ#{⪳ϘH>G+F˚B9g- }yqUt|Y[y4-sc!g%{eV N"F ˢOLJǗ&}炻YPrSD+Ah5%&DEyw."%𖇾\>gqP;"ӱwmtPU3"vKO45:\Y1>Trz^F4~z'!w5+Et;46D 1'JowѩxKL@E-+\Wgt߮.olg,e=Ji誎A%^n|E}3<5-{\ WTӔw7g3bkoJI,e"xȪ/av;VyK +rO|DeyA *KH%7=ʞ3~é|6Lneѫ֍a,ލ,=j J\hS\~Efmű_2]a[焩4t]<\!ZÛ1 uJ{{n/09?eS]gH9vE=+_)?)uO?WDW?s<^9gëo$CTm^}ùrS\ѹD\9~N/DG rTu:(R/Yr9n?siDs>s=s%ʫ8zĕB2E>gsxҞ>٪Vl,~]Q|n7 núS^0o1\} H|¢"0<|EuXdWx /]]kO.ͤlg!_qf}fǾOs?>Uco۷ ?X۱7F?Ʊb&HH?_/zzu.xyiYQ#DApk2}ηƳ>^:< @73tX;gs11"ͮ}o;iGΈJY5]ؖx BȻ/jL򗝧b6x2rZ`ȆjD 6cyV72)iAtuRW=5-Lj_L~1!H{Oϙ0\`rAUX%z-D{-Ϗ9ڄoNLKjP1Ohd?^O|J<8eH+/F/3 @,--L]q-*ndXHf緯))4v|1NKc~7c67vםA%7p@Nyߐq[r+9em*U\)*E`>U\ͽE u"W"?L oo 4CftHHq8u7^$@$@͍;99^ٚhK$@$@Hɓ_}3<:9 EHHꐀQP5&  "߼^[TY -cǎmٲ~^xf$@$@$P+)))'NP5s"V  VmKGc:!JIHHyoq,)f $@$@$P0gjlsFQk:k$  ' @4JQ[nnͰ8 @EsNMgIENDB`RODBC/MD50000644000176000001440000001110113073621375011444 0ustar ripleyusers15f66d5835a44301803a1ab88901b1ff *ChangeLog d9312a2be83a64597fdff613502b9986 *DESCRIPTION eb723b61539feef013de476e68b5c50a *GPL-2 e939f0b310630eb16cabc697aecaed25 *LICENCE.note f946374da2e4588d5056921f41ee4608 *NAMESPACE e23075ef3f1a19256507a29961749022 *R/RODBC.R 33dd6a1f0b2e81f0869119d009c49181 *R/TypeInfo.R dfb84beb49330d47fef0e5b9b941d9a0 *R/sql.R 0869f5c6e4029a8cd8ff94ef765f3ef9 *R/win.R 4151c5e1cb7249386acc7375ccf24b31 *build/vignette.rds 2ee6281df3a48ebf8e9b5943efc6bce6 *cleanup 95c2a4015a09a9d625464c1f3cb73ba2 *configure 81aaf44111b9d04e46e0af81925d178d *configure.ac bb8c1972ee5f14b8c3c55d0dac674591 *configure.win 29f6ab944de445f5e0b1ee448a53f488 *inst/doc/RODBC.Rnw 8e59f4763902d9d0ec5c8c606447e9d3 *inst/doc/RODBC.pdf 2f90b769aba28f5f180030a200d0778b *inst/po/da/LC_MESSAGES/R-RODBC.mo 0bc92b9c3ad77f3a150d4db7a8b902e5 *inst/po/da/LC_MESSAGES/RODBC.mo 35ece9c443280c86f314b821aaab3d83 *inst/po/de/LC_MESSAGES/R-RODBC.mo 55571b68b1f8573433a5054fbf075c31 *inst/po/de/LC_MESSAGES/RODBC.mo a072892252a96f97b75cbe52d519edbd *inst/po/en@quot/LC_MESSAGES/R-RODBC.mo 519022a6b5680d0e27000c18fd16b810 *inst/po/en@quot/LC_MESSAGES/RODBC.mo d6e60e3b7cdf683994438e5af5353a52 *inst/po/pl/LC_MESSAGES/R-RODBC.mo 94c199b625473a471f3453b7367c1c08 *inst/po/pl/LC_MESSAGES/RODBC.mo 8b25f7d5d99b19e08d25346e6794e826 *inst/tests.R c539ad43ab37f105e42e1ca5816ac100 *man/RODBC-internal.Rd 8154281f577e2a59a1056f62850c99d8 *man/RODBC-package.Rd 4a44827874d2e4cfcc20b72f98d81397 *man/odbc.Rd 0ecff17c37eb49308fb1bc93448c2341 *man/odbcClose.Rd 8627e2ac5babd44c62e36c53534d5871 *man/odbcConnect.Rd aecf3447e1c8a867e405473d63104ea6 *man/odbcDataSources.Rd 2d947d3afcd6f590b5a62c2fd3a990ba *man/odbcGetInfo.Rd 75ca8e5a21c9e210e4f9cc533deb8a8d *man/odbcSetAutoCommit.Rd 031bc658f7a8bcbf90dd7a9a67e825cb *man/setSqlTypeInfo.Rd bc17ce6dbf6f098f841e5419c110dd3b *man/sqlColumns.Rd 10b10211cc0245362ec3ef5187cc8cc6 *man/sqlCopy.Rd 1492a7a939440d05ad5cb99ead966218 *man/sqlDrop.Rd ba19c4acfd654eaf95d1c700323f5c71 *man/sqlFetch.Rd 8e3e0c89d5ee2def0d7ebc9a8be5fae6 *man/sqlQuery.Rd cbfd509b83c1bb5dc45a5e2cff41d9c2 *man/sqlSave.Rd d561c206812c25c1b6edf1aecc5a0d53 *man/sqlTables.Rd 8a91f15a0e306278de49748c7e9edf64 *man/sqlTypeInfo.Rd 61c38623a797e12e4ca234bbd054a948 *po/R-RODBC.pot 1eeb0ef772248094ee93d1c46072f783 *po/R-da.po 6937a292c3a76a89d94102f1eb92e5e1 *po/R-de.po 18c5e51e8860d4e7f748388e2be99473 *po/R-pl.po 8dd27c8997e12b26240bb22fd262ba7e *po/RODBC.pot 96ee6e7569dfac6baac3e1cc610643c6 *po/da.po 0b2b2c24a5a5a1fc25ae849446be478e *po/de.po 4c63ad6c62f7accbfcf3462b9ee25ae0 *po/pl.po 0fe1b90d2b7adf1d85e5b38f643d4bbd *src/Makevars.in ad4d2913f37fe87f14158155f7f8284a *src/Makevars.win 70a2ec0a2584e0005ed90fb6188b0278 *src/RODBC.c 879e9c604e75a7ac0cd7e03695df91ca *src/config.h.in 7cf764264d239d149e9b0dd1e366f16a *src/config.h.win 5c11ed447e9f9393862363359a9fd906 *tests/DB2.RR 2a3d6d32b42f2641ee935dee40bc0458 *tests/DB2.Rout.save 20effbb65eb28750e57fbaa144b119ca *tests/Master.R 955e9f530bdef1f7c66f274d9d113d05 *tests/Notes a52dbd83ae8e196dd5285be52adc41c6 *tests/Oracle.RR 0e8163e9c780f52cd56700c996224ec9 *tests/Oracle.Rout.save ec9244c17c6efc9e83ac5b1e1bb29d2e *tests/SQLServer.RR 3f0e6740706fb84cb530d27f563f426a *tests/SQLServer.Rout.save c3f383d4a1acfbea2423b35ee0e568b8 *tests/access.RR 2a61407e1a495373bdafaadc2766c43a *tests/access.Rout.save d7a18e43fc59d1595bab6a8c353169eb *tests/excel.RR 72612e63d3a94ee336939c30058f5c9b *tests/excel.Rout.save a64a740a8ce14a776deaa244f9e02bc9 *tests/hills.xls b1375e6a6f05d0d7e39d0f36c4f719f1 *tests/mimer.RR 31485bb2b9e495378724bdf1520da548 *tests/mimer.Rout.save 809174342fce6493fc7634efe9121dae *tests/mysql-win.RR 461d3636ab0c34ffe8979e811b9be91b *tests/mysql-win.Rout.save 35f190af5a4d3318b0f429f7d4c5579d *tests/mysql.RR 099807ca9c9f443512c55b39fcb7016c *tests/mysql.Rout.save 7c974beac40a5933c62b1f7eee88a884 *tests/postgresql.RR 3ab9b1b462ba17c690b64879407dd4a8 *tests/postgresql.Rout.save 4a8d4be8acc4e443912f6e464b42c366 *tests/sqlite3.RR a820903e3c2be43e4bd9686f757f5931 *tests/sqlite3.Rout.save dc0d827731bab3d1ef6bfdd16722b1a9 *vignettes/Access.png 9a518628d0ca45b2cf9c081a51e41eb9 *vignettes/MySQL.png 51c55f2594b80f9a0dc396265eb92270 *vignettes/Oracle.png 29f6ab944de445f5e0b1ee448a53f488 *vignettes/RODBC.Rnw 283e376b37a9a09991618af8b5c3671a *vignettes/SQLserver.png 4e5964890abff4a31322c993911555a2 *vignettes/linuxDSN.png 39909ae24f339f7fe17ba9f6447845a5 *vignettes/linuxDSNsqlite.png 7cd0bdc699d5c2d760591711fcf3edc3 *vignettes/macAccess.png 531a7dfb71c4ea2723b345dc9cd18752 *vignettes/macODBC.png 2a59edcde71f0cccbde93c81d8da042d *vignettes/winDSN1.png 9ecea702efd5ffeee8c63044893bc7a8 *vignettes/winDSN2.png RODBC/build/0000755000176000001440000000000013073621042012230 5ustar ripleyusersRODBC/build/vignette.rds0000644000176000001440000000032313073621042014565 0ustar ripleyusersb```b`f@&0`b fd`aҜA.NzAyh q̲̒J: R$@ ` ,LȂyh*]R RR@pƙXX 2?"!(jؠjX2sRa ,s\ܠL tGa!΢r=xAa$ϓs}^ZP? `RODBC/DESCRIPTION0000644000176000001440000000135513073621374012653 0ustar ripleyusersPackage: RODBC Version: 1.3-15 Revision: $Rev: 3476 $ Date: 2017-04-13 Authors@R: c(person("Brian", "Ripley", role = c("aut", "cre"), email = "ripley@stats.ox.ac.uk"), person("Michael", "Lapsley", role = "aut", comment = "1999 to Oct 2002")) Title: ODBC Database Access Description: An ODBC database interface. SystemRequirements: An ODBC3 driver manager and drivers. Depends: R (>= 3.0.0) Imports: stats LazyLoad: yes Biarch: yes License: GPL-2 | GPL-3 NeedsCompilation: yes Packaged: 2017-04-13 07:00:50 UTC; ripley Author: Brian Ripley [aut, cre], Michael Lapsley [aut] (1999 to Oct 2002) Maintainer: Brian Ripley Repository: CRAN Date/Publication: 2017-04-13 07:04:28 UTC RODBC/configure0000755000176000001440000043266113013621651013054 0ustar ripleyusers#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for RODBC 1.3. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: ripley@stats.ox.ac.uk about your system, including any $0: error possibly output before this message. Then install $0: a modern shell, or manually run the script under such a $0: shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='RODBC' PACKAGE_TARNAME='rodbc' PACKAGE_VERSION='1.3' PACKAGE_STRING='RODBC 1.3' PACKAGE_BUGREPORT='ripley@stats.ox.ac.uk' PACKAGE_URL='' # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='LTLIBOBJS LIBOBJS RODBC_CPPFLAGS EGREP GREP CPP OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC ODBC_CONFIG target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking with_odbc_manager with_odbc_include with_odbc_lib ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures RODBC 1.3 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/rodbc] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of RODBC 1.3:";; esac cat <<\_ACEOF Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-odbc-manager=MGR specify the ODBC manager, e.g. odbc or iodbc --with-odbc-include=INCLUDE_PATH the location of ODBC header files --with-odbc-lib=LIB_PATH the location of ODBC libraries Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF RODBC configure 1.3 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## ------------------------------------ ## ## Report this to ripley@stats.ox.ac.uk ## ## ------------------------------------ ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_type LINENO TYPE VAR INCLUDES # ------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache # variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type # ac_fn_c_compute_int LINENO EXPR VAR INCLUDES # -------------------------------------------- # Tries to find the compile-time value of EXPR in a program that includes # INCLUDES, setting VAR accordingly. Returns whether the value could be # computed ac_fn_c_compute_int () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) >= 0)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_lo=0 ac_mid=0 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=$ac_mid; break else as_fn_arith $ac_mid + 1 && ac_lo=$as_val if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) < 0)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=-1 ac_mid=-1 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) >= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_lo=$ac_mid; break else as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else ac_lo= ac_hi= fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=$ac_mid else as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done case $ac_lo in #(( ?*) eval "$3=\$ac_lo"; ac_retval=0 ;; '') ac_retval=1 ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 static long int longval () { return $2; } static unsigned long int ulongval () { return $2; } #include #include int main () { FILE *f = fopen ("conftest.val", "w"); if (! f) return 1; if (($2) < 0) { long int i = longval (); if (i != ($2)) return 1; fprintf (f, "%ld", i); } else { unsigned long int i = ulongval (); if (i != ($2)) return 1; fprintf (f, "%lu", i); } /* Do not output a trailing newline, as this causes \r\n confusion on some platforms. */ return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : echo >>conftest.val; read $3 config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by RODBC $as_me 1.3, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu odbc_mgr="" # Check whether --with-odbc-manager was given. if test "${with_odbc_manager+set}" = set; then : withval=$with_odbc_manager; odbc_mgr=$withval fi if test "$odbc_mgr" = "odbc" ; then for ac_prog in odbc_config do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ODBC_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ODBC_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ODBC_CONFIG="$ODBC_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ODBC_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ODBC_CONFIG=$ac_cv_path_ODBC_CONFIG if test -n "$ODBC_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ODBC_CONFIG" >&5 $as_echo "$ODBC_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ODBC_CONFIG" && break done fi # Check whether --with-odbc-include was given. if test "${with_odbc_include+set}" = set; then : withval=$with_odbc_include; odbc_include_path=$withval fi RODBC_CPPFLAGS="-I." if test -n "$odbc_include_path" ; then RODBC_CPPFLAGS="-I. -I${odbc_include_path}" else if test -n "${ODBC_INCLUDE}" ; then RODBC_CPPFLAGS="-I. -I${ODBC_INCLUDE}" else if test -n "${ODBC_CONFIG}"; then RODBC_CPPFLAGS=`odbc_config --cflags` RODBC_CPPFLAGS="-I. ${RODBC_CPPFLAGS}" fi fi fi # Check whether --with-odbc-lib was given. if test "${with_odbc_lib+set}" = set; then : withval=$with_odbc_lib; odbc_lib_path=$withval fi if test -n "$odbc_lib_path" ; then LIBS="-L${odbc_lib_path} ${LIBS}" else if test -n "${ODBC_LIBS}" ; then LIBS="-L${ODBC_LIBS} ${LIBS}" else if test -n "${ODBC_CONFIG}"; then odbc_lib_path=`odbc_config --libs | sed s/-lodbc//` LIBS="${odbc_lib_path} ${LIBS}" fi fi fi : ${R_HOME=`R RHOME`} if test -z "${R_HOME}"; then echo "could not determine R_HOME" exit 1 fi CC=`"${R_HOME}/bin/R" CMD config CC` CPP=`"${R_HOME}/bin/R" CMD config CPP` CFLAGS=`"${R_HOME}/bin/R" CMD config CFLAGS` CPPFLAGS=`"${R_HOME}/bin/R" CMD config CPPFLAGS` CPPFLAGS="${CPPFLAGS} ${RODBC_CPPFLAGS}" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in sql.h sqlext.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done if test "${ac_cv_header_sql_h}" = no || test "${ac_cv_header_sqlext_h}" = no; then as_fn_error $? "\"ODBC headers sql.h and sqlext.h not found\"" "$LINENO" 5 fi if test -n "${odbc_mgr}" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing SQLTables" >&5 $as_echo_n "checking for library containing SQLTables... " >&6; } if ${ac_cv_search_SQLTables+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char SQLTables (); int main () { return SQLTables (); ; return 0; } _ACEOF for ac_lib in '' ${odbc_mgr}; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_SQLTables=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_SQLTables+:} false; then : break fi done if ${ac_cv_search_SQLTables+:} false; then : else ac_cv_search_SQLTables=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_SQLTables" >&5 $as_echo "$ac_cv_search_SQLTables" >&6; } ac_res=$ac_cv_search_SQLTables if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else as_fn_error $? "\"ODBC driver manager '${odbc_mgr}' not found\"" "$LINENO" 5 fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing SQLTables" >&5 $as_echo_n "checking for library containing SQLTables... " >&6; } if ${ac_cv_search_SQLTables+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char SQLTables (); int main () { return SQLTables (); ; return 0; } _ACEOF for ac_lib in '' odbc odbc32 iodbc; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_SQLTables=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_SQLTables+:} false; then : break fi done if ${ac_cv_search_SQLTables+:} false; then : else ac_cv_search_SQLTables=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_SQLTables" >&5 $as_echo "$ac_cv_search_SQLTables" >&6; } ac_res=$ac_cv_search_SQLTables if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else as_fn_error $? "\"no ODBC driver manager found\"" "$LINENO" 5 fi fi ac_fn_c_check_type "$LINENO" "SQLLEN" "ac_cv_type_SQLLEN" "# include " if test "x$ac_cv_type_SQLLEN" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SQLLEN 1 _ACEOF fi ac_fn_c_check_type "$LINENO" "SQLULEN" "ac_cv_type_SQLULEN" "# include " if test "x$ac_cv_type_SQLULEN" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SQLULEN 1 _ACEOF fi # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long" >&5 $as_echo_n "checking size of long... " >&6; } if ${ac_cv_sizeof_long+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long" "$ac_includes_default"; then : else if test "$ac_cv_type_long" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (long) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_long=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long" >&5 $as_echo "$ac_cv_sizeof_long" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_LONG $ac_cv_sizeof_long _ACEOF ac_config_headers="$ac_config_headers src/config.h" ac_config_files="$ac_config_files src/Makevars" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by RODBC $as_me 1.3, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ RODBC config.status 1.3 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "src/config.h") CONFIG_HEADERS="$CONFIG_HEADERS src/config.h" ;; "src/Makevars") CONFIG_FILES="$CONFIG_FILES src/Makevars" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi RODBC/ChangeLog0000644000176000001440000004534013073620443012715 0ustar ripleyusersVersion: 1.3-15 (2017-04-13, released) * RODBC/src/RODBC.c: Missed REPROTECT in line 1503. Version: 1.3-14 (2016-09-24, released) * configure: tweaks for use of odbc-config * R/RODBC.Rnw: mention opensource.apple.com, use macOS and https:// * RODBC/src/RODBC.c: Use "config.h" not Version: 1.3-13 (2016-04-14, released) * R/RODBC.R: Using RODBC::openConnect() works without RODBC on the search path. * R/RODBC.Rnw: add simplified instructions for OS X. * RODBC/src/RODBC.c: include C headers directly, not just via R.h. Version: 1.3-12 (2015-06-29, released) * NAMESPACE; tweak imports. Version: 1.3-11 (2015-02-26, released) * cleanup: tweak for OS X dirs from configure. * R/sql.R: remove unused assignment. * man/{sqlColumns,sqlTypeInfo}.Rd: avoid encoded URLs. * vignettes/RODBC.Rnw: updates, e.g. drop 'Mac', add 'Microsoft'. Version: 1.3-10 (2013-11-25, released) * DESCRIPTION: use Authors@R * R/RODBC.R, man/odbcClose.Rd: return value of close() method is now more consistent with other methods. * man/*.Rd: add copyright dates. Version: 1.3-9 (2013-11-01, released) * cleanup: remove detritus from OS X trial compiles. * R/RODBC.R: return value of odbcClose is now as documented. * src/RODBC.c: remove version dependence as package depends on a later version of R. * vignettes/RODBC.Rnw: updates, including for OS X Mavericks. Version: 1.3-8 (2013-09-01, released) * DESCRIPTION: depend on R (>= 3.0.0) * Remove a.out.DSYM directory left over from OS X * R/TypeInfo.R: Use registered symbol in .Call * src/RODBC.c: remove repeated i++ Version: 1.3-7 (2013-07-01, released) * LICENCE.note: rename LICENCE Version: 1.3-6 (2013-06-28, released) * DESCRIPTION: remove BuildVignettes: no * vignettes/Makefile: remove as R 3.0.x misbehaves Version: 1.3-5 (2012-06-09, released) * R/sql.R: pass na.strings to type.convert, so "NA" need not be converted. * vignettes/: assemble pieces from inst/doc and manual. Version: 1.3-4 (2012-01-05, released) * R/RODBC.R, R/TypeInfo.R: use an environment for typesR2DBMS. Version: 1.3-3 (2011-07-25, released) * COPYING: change to name to GPL-2. * po: add Danish translations from Joe Hansen. Version: 1.3-2 (2010-07-25, released) * po: add German translations from Chris Leick * man/odbcConnect.Rd, manual: mention Access 2010 drivers (which are also available for 64-bit Windows) and update info about sources of ODBC drivers. Version: 1.3-1 (2009-10-11, released) * man/odbcConnect.Rd: Rendering issues for Rd2 convertors. Stress that some ODBC drivers do not work correctly with bulk fetches, and that this is not a bug in RODBC. Version: 1.3-0 (2009-07-28, released) * Documentation has been reorganized into a vignette/manual, and files README and INSTALL have been removed. * sqlSave(), sqlFetch() and sqlUpdate() now allow 'schema.table' forms for the table name. * The internals use grepl(), so R >= 2.9.0 is required. * odbcDriverConnect() obfuscates any password returned in the connection string. * Binary columns in a table can now be retrieved. They will be returned as a column of class "ODBC_binary", which is a list of raw vectors. * The value of 'rows_at_time' set in odbcConnect (default now 100) is now used in all queries. The buffers allocated when fetching character columns now depend on 'rows_at_time', so reducing this will save memory if potentially large character columns are in the result set, and can be done as an argument to sqlQuery() and functions which call it such as sqlFetch(). * Apart from for the Excel driver, odbcTableExists() looks up just the (remapped) name in sqlTables() so will be faster on some systems. Also, dotted table names are not quoted (which is what drivers that support them seem to require). * The internal function sqlwrite() used by sqlSave() now matches column types to the information given by sqlTypeInfo() by number rather than by name, as the Oracle ODBC driver returns names that are aliases of those in the type table. * The test suite now contains examples for IBM's DB2, for Oracle's own OBDC driver and for Mimer (on Windows). * sqlColumns() and sqlTables() have an extra argument 'literal' to control the interpretation of wildcards. * sqlSave(addPK=) causes that column to be created with a 'NOT NULL' constraint (needed by some DBMSs, including DB2). * odbcColumns() and odbcPrimaryKeys() are no longer exported from the namespace. * sqlClear() now uses 'TRUNCATE TABLE' rather than 'DELETE FROM'. * odbcDriverConnect() gains a 'readOnlyOptimize' argument for the few systems (notably Mimer) which support it. * sqlTypeInfo() allows more types to be specified. * getSqlTypeInfo() has data for DB2 (on Windows) and Mimer. * Several C-level errors are given in more detail. * References to the unreleased 'bulk_add' option have been removed. * sqlSave(oldstyle = TRUE) has been removed. * sql* functions now return invisibly if errors = FALSE. * odbcDriverConnect() no longer allows case = "oracle" as a synonym for "toupper" (and Oracle is generally case-insensitive). * odbcReConnect() has been re-designed to allow any of the arguments to be changed. Version: 1.2-6 (2009-06-23, released) * Split INSTALL file out of README. * Clarify that it is the ODBC driver that needs to recognize primary keys: apparently Access has them but the driver does not. * close() was leaking a RODBChandle stucture, found by valgrind. * odcUpdate() could write one character beyond a character buffer: used by sqlSave(fast=TRUE). * sqlSave(fast=TRUE) failed if the driver reported column sizes of date/dateime fields incorrectly, as sqliteodbc does. Now these are retrieved by sqlTypeInfo(), and if they gives silly sizes, a sensible default is used. * sqlSave(fast=FALSE) could write logical columns with ' TRUE' due to a deficiency in as.matrix.data.frame(). * sqlClear() now works with systems that need remapped/quoted table names. * Use NA_character_ as default for 'nullstring'. * Rework help pages, with many more details on catalogs, schema and behaviour of specific drivers. * There is limited support for dotted table names in sqlClear, sqlDrop and sqlFetch. * sqlTables, sqlColumns, sqlPrimaryKeys have extra arguments to restrict/change the search for the table(s) where this supported by the ODBC driver. * There is a now a test suite, the relevant parts of which are run if the environment variable RODBC_TESTING is set. (This depends on specific DSN names being available, and so is intended only for the maintainer's use.) Version: 1.2-5 (2009-01-21, released) * Adapt help to Rd version 2 * Use integer constants * Spelling corrections Version: 1.2-4 (2008-11-19, released) * Add missing temporary PROTECT in odbcConnect(), reported by Tom McCallum. * odbcReConnect() was broken (reported by Thomas Lumley). * sqlGetResults(): add 'stringsAsFactors' argument. Version: 1.2-3 (2008-01-24, released) * Plug a memory leak in inRODBCClose (closing a connection), reported by Stephan Henne. * Use translateChar() on character data sent in. Version: 1.2-2 (2007-10-19, released) * Clarify licensing as under either GPL-2 or GPL-3, add licence comments to source files. * Typo in setSqlTypeInfo(). * Use gsub() rather than chartr() in odbcConnectAccess() etc, because of a report that chartr() was not working correctly on Chinese file names. * Added odbcConnect{Access,Excel}2007() for use with Office 2007 formats and drivers. Version: 1.2-1 (2007-06-03, released) * Use (const char *) for compatibility with R 2.6.0. * Add comments about MySQL's broken Connector/ODBC beta. Version: 1.2-0 (2007-04-24, released) * Move to ODBC3 function calls throughout. * Internally, keep an ODBC environment open throughout the session rather than use one for every channel. * odbcDriverConnect has new arguments to set the values of 'rows_at_time' and 'bulk_add' for the connection. 'rows_at_time' now defaults to 1000. * odbcDriverConnect has new argument 'DBMSencoding' to allow re-encoding of character data to be passed to and from a DBMS running with a charset different from that of the locale under which R is running. Version: 1.1-9 (2007-04-02, released) * odbcConnectExcel has a 'readOnly' option (default TRUE, as before). * There is more support for Excel spreadsheets, including 'tables' as marked ranges as well as worksheets, and more compatibility for writing to spreadsheets (in so far as this is allowed by the ODBC driver). See ?odbcConnectExcel. * odbcDriverConnect has new arguments 'colQuote' and 'tabQuote' to control the quoting of column and table names (respectively) in SQL queries. ANSI SQL92 mandates quoting by ", but this is not universally accepted (e.g. by MySQL) and RODBC used not to quote. Now it attempts to quote suitably, but setting colQuote=NULL reverts to the earlier (non-quoting) behaviour. * odbcDriverConnect tries to figure out a default value for 'case' from the DBMS name reported by the driver. * sqlSave(fast = FALSE) and sqlUpdate(fast = FALSE) now escape embedded single quotes in character strings via doubling, which should work on systems with ANSI SQL92 compliance. The quoting rules for fields is now read from the driver (as e.g. Excel quotes datetime fields by ## not ''). * getSqlTypeInfo now has values for the Excel driver. * Fixed typo in the default setting of options("dec"), which meant it was set to '.' in all locales, and gave a spurious warning in R >= 2.5.0. Version: 1.1-8 (2007-01-02, released) * Make use of symbol registration for .Call entry points. * Add odbcEndTran() function for use when odbcSetAutoCommit() has been used to disable auto-commit. * Add odbcDataSources() function to list User and System DSNs. * sqlUpdate(fast=FALSE) now quotes date and time columns as some drivers appear to need it. * sqlwrite{fast=FALSE, append=TRUE) works better with out-of-order columns on some drivers. Version: 1.1-7 (2006-05-24, released) * configure.ac: make use of odbc_config if --with-odbc-manager=odbc. * sqlSave: change wording of one error message (Matthew Dowle, 2006-04-11). * sqlFetch can now fetch up to 1024 rows at a time, which can be substantially faster when using a remote server. (Based on code suggested by Nick Gorman to Matthew Dowle.) * setSqlTypeInfo: corrected typo. Version: 1.1-6 (2006-04-04, released) * Use SQL[U]LEN to agree with ODBC 64-bit headers. * Add config.h.in to show if the above are defined, and also SIZEOF_LONG for unixODBC headers. * Add more info on sqlite3 in README and tests.R. (I failed to make sqlite 2.8.17 work on a 64-bit platform, and also failed to save to other types such as 'date' and 'text'.) * Add info on 64-bit builds (especially Debian) in README. Version: 1.1-5 (2006-01-10, released) * Added a cast in RODBC.c to counteract a warning Dirk Eddelbuettel got (and I do not on either Linux or Windows). * Autoconf 2.59 goes into undocumented back-compatibility mode with a one-argument AC_INIT, so use full form (with version no). * odbcSetAutocommit was not exported. * sqlSave: if 'verbose' and 'safer' write out verbose message before error message. Version: 1.1-4 (2005-08-04, released) * Add configure arguments and look at env vars - see README * Use collapse="\n" for possible multiple error messages. * Add odbcSetAutocommit() contributed by Yasser El-Zein. * Attempts to open and close more than 100 channels in a session might have segfaulted. * sqlSave(test) was documented with the wrong default. Version: 1.1-3 (2005-02-05, released) * Improve error messages for possible translation. * Fix typo in regexp in mangleColNames. * Add tests for native PostgreSQL on Windows. * Workaround problem with MyODBC 3.15-10 driver that needs SQL_DRIVER_NOPROMPT when the window handle is null. Version: 1.1-2 (2004-10-24, released) * Operating on a closed channel might crash in RODBCcheckchannel. * Report that DBase driver description in odbcConnectDbase was wrong. * Add settings for SQLite. Version: 1.1-1 (2004-09-14, released) * Select the decimal point from Sys.localeconv. * Add an external reference and finalizer so open channels get closed at the end of the session or when there is no R object referring to them. * There is no longer a restriction to 16 channels. Version: 1.1-0 (2004-09-06, test version) * Add NAMESPACE. * odbcConnect{Access,Dbase,Excel} allow a missing file name (and will bring up a dialog box to search for it). * odbcGetInfo returns more information in a 8-element character vector (based on an idea of Matthew Dowle). * The C code calls SQLExecuteDirect rather than SQLExecute and does not call SQLCloseCursor, based on a problem report from Matthew Dowle using MS SQLServer. Repeated calls to sqlGetResults now work. * New function sqlFetchMore. * Table names in Access with embedded spaces are mapped to the [name space] form which Access requires. * Table creation no longer removes _ from column names. * New functions get/setSqlTypeInfo and the typeInfo argument to sqlSave allow users to specify the mapping from R types to DBMS datatypes. sqlSave also allows the specification of DBMS datatypes by column. * It is now possible to write more than 255 chars to a field with sqlSave and sqlUpdate. * Dates and timestamps are now read as 'Date' and 'POSIXct' columns by sqlGetResults (unless as.is = TRUE for the column). Version: 1.0-4 (2003-07-19, released) * RODBC.c: iodbc was not recognizing the SQLTCHAR cast * odbcClose.Rd, odbcConnect.Rd: tidy up Version: 1.0-3 (2003-05-25, released) * RODBC.c: remove unneeded SQLCHAR cast Version: 1.0-2 (2003-05-13, released) * Add inst/ directory and install README. * Allow reading of character fields up to 64K bytes (limited as the driver may report silly sizes). * Note that convenience wrappers for Excel etc need English-language drivers to be installed. Version: 1.0-1 (2003-01-20, released) * If a character field is truncated when reading from a database, an R warning is given. * There was no protection against writing more than 255 chars in a character vector in sqlSave/sqlUpdate(fast=TRUE). Now the first 255 characters are written and a warning given. Version: 0.99-9 (2003-01-17, test version) * Testing with PostgreSQL revealed that - attempting to create a table with a primary key resulted in memory corruption inside the unixODBC PostgreSQL driver and - the special columns in PostgreSQL are pseudo-columns, so ML's stategy in sqlUpdate is doomed. * Added 'addPK' argument to sqlSave(), defaulting to FALSE, to circumvent the above. (The latest psqlodbc client behaves.) * Changed strategy in sqlUpdate(). Allow 'index' argument, and otherwise look first for a primary key in the data frame, then special columns, then "rownames". * Changed all C-level tests to allow for SQL_SUCCESS_WITH_INFO as the return value is driver-dependent and psqlodbc was returning SQL_SUCCESS_WITH_INFO from SQLExecute. Version: 0.99-8 (2003-01-15, test version) * Result sets with no rows are now reported as 0-row data frames and not regarded as an error (return value -1). * More consistent usage of errors, with new error code -2 indicating no data (that is no result from the query, not just no rows available). For example, failure to create a table in sqlSave() is now a fatal error. * On Windows, convenience functions odbcConnectAccess(), odbcConnectDbase() and odbcConnectExcel() based on suggestion of Fan, . * A 'channel' object contains a randomly generated ID, so even if a channel has been closed and the slot reused, the original R object will be declared invalid. * options("dec") is only set when RODBC is loaded if it is not already set. * New function odbcCloseAll(). * Improved documentation. New README, move ML's to README.orig. Version: 0.99-6 (2003-01-12, test version) * Migration to use .Call where appropriate. * 'channel' is now a classed object, with a print method and all relevant information is recorded as attributes of the object, and new function odbcReConnect() allows reconnection to a saved 'channel' object. * New function odbcDriverConnect() provides an alternative interface via ODBC driver connection strings. Under the Windows GUI this allows interactive completion of connection strings via standard ODBC dialog boxes. * Names of tables are no longer deparsed, so normal R semantics apply and they should be quoted. * odbcNumRows now returns the number of rows, not a list. * odbcCaseFlag now returns character in all cases. * New argument 'believeNRows' to accommodate ORACLE (and also sqlTypeInfo() calls on MySQL). * The limit on the number of channels was off by one. * sqlSave() and sqlFetch() now default to rownames = TRUE, that is to include rownames in the table, and to use column 'rownames' for the rownames if it exists. It is possible to retrieve columns other than the first as rownames, as documented (but not working). * New 'safer' option to sqlSave(), which defaults to TRUE. * When sqlSave() creates a table and includes rownames, the rownames are created as a primary key (where supported). * sqlUpdate() has a new 'tablename' argument and many internal changes (e.g. implementing case changes): it is now operational. * sqlSave(fast=TRUE) and sqlUpdate() can now create database NULLs even on MS Access, and character strings with value "NA" are no longer automatically regarded as missing. sqlUpdate() now has a fast=FALSE method, and for both the fast methods avoid converting numeric and integer columns to character. * odbcFetchRow() has been removed. * sqlCopy() is now implemented. * odbcFetchRows() now returns a list, and sqlFetchRows() only returns a data frame, this being the most efficient storage. SQL double, real, integer and smallint columns are transferred directly to R numeric and integer columns (rather than being converted to character and back again). * Function sqlDrop(), sqlColumns() and sqlPrimaryKeys() were not respecting case-changing (although case-altering DBMSs usually coped). * Various memory leaks have been plugged. * Improved documentation. Version: 0.9-1 (release candidate 2, released to CRAN 2002-10-30) * Improved documentation Version: 0.9-0 (release candidate 1) * New maintainer. * Bring up to date for R 1.6.0. * Several functions were not testing the case-switched version of the table name: now integrated into new function odbcTableExists. * New function odbcGetInfo. * New function sqlTypeInfo. * sqlFetch now does work with Excel spreadsheets. Version: 0.8-3 * Minor changes to make documentation and examples R CMD check compliant RODBC/man/0000755000176000001440000000000013013621651011704 5ustar ripleyusersRODBC/man/odbcGetInfo.Rd0000644000176000001440000000332713013621651014363 0ustar ripleyusers% file RODBC/man/odbcGetInfo.Rd % copyright (C) 1999-2002 M. Lapsley % copyright (C) 2002-2013 B. D. Ripley % \name{odbcGetInfo} \alias{odbcGetInfo} \title{Request Information on an ODBC Connection} \description{ Request information on an ODBC connection. } \usage{ odbcGetInfo(channel) } \arguments{ \item{channel}{connection handle as returned by \code{\link{odbcConnect}} of class \code{"RODBC"}.} } \value{ A named character string giving information on the database and ODBC driver in use on the connection \code{channel}. } \author{ Brian Ripley } \examples{\dontrun{ odbcGetInfo(channel) # under Windows XP ## MySQL returned DBMS_Name DBMS_Ver Driver_ODBC_Ver "MySQL" "5.1.35-community" "03.51" Data_Source_Name Driver_Name Driver_Ver "testdb5" "myodbc5.dll" "05.01.0005" ODBC_Ver Server_Name "03.52.0000" "localhost via TCP/IP" ## MS Access returned DBMS_Name DBMS_Ver Driver_ODBC_Ver Data_Source_Name "ACCESS" "04.00.0000" "03.51" "testacc" Driver_Name Driver_Ver ODBC_Ver Server_Name "odbcjt32.dll" "04.00.6305" "03.52.0000" "ACCESS" ## SQL Server 2008 Express returned DBMS_Name DBMS_Ver Driver_ODBC_Ver "Microsoft SQL Server" "10.00.1600" "03.52" Data_Source_Name Driver_Name Driver_Ver "SQLServer" "SQLNCLI.DLL" "09.00.4035" ODBC_Ver Server_Name "03.52.0000" "AUK\\\\SQLEXPRESS" }} \keyword{IO} \keyword{database} RODBC/man/sqlTypeInfo.Rd0000644000176000001440000000470013013621651014451 0ustar ripleyusers% file RODBC/man/sqlTypeInfo.Rd % copyright (C) 1999-2002 M. Lapsley % copyright (C) 2002-2013 B. D. Ripley % \name{sqlTypeInfo} \alias{sqlTypeInfo} \title{Request Information about Data Types in an ODBC Database} \description{ Request information about data types in an ODBC database } \usage{ sqlTypeInfo(channel, type = "all", errors = TRUE, as.is = TRUE) } \arguments{ \item{channel}{connection handle as returned by \code{\link{odbcConnect}}.} \item{type}{The types of columns about which information is requested. Possible values are \code{"all"}, \code{"char"}, \code{"varchar"} , \code{"wchar"}, \code{"wvarchar"} (Unicode), \code{"real"}, \code{"float"}, \code{"double"}, \code{"integer"}, \code{"smallint"}, \code{"date"}, \code{"time"}, \code{"timestamp"}, \code{"binary"}, \code{"varbinary"}, \code{"longvarbinary"} and (its alias) \code{"blob"}. } \item{errors}{logical: if true halt and display error, else return \code{-1}.} \item{as.is}{as in \code{\link{sqlGetResults}}.} } \details{ \code{sqlTypeInfo} attempts to find the types of columns the database supports: ODBC drivers are not required to support this (but all known examples do). Where it is supported, it is used by \code{\link{sqlSave}} to decide what column types to create when creating a new table in the database. } \value{ A data frame on success, or character/numeric on error depending on the \code{errors} argument. Use \code{\link{sqlGetResults}} for further details of errors. The columns returned may depend on the ODBC driver manager. For a fully ODBC 3 manager, see \url{http://msdn.microsoft.com/en-us/library/ms714632(VS.85).aspx}: the symbolic constants mentioned there will be returned as numbers (and the values of the numeric constants can be found in the ODBC headers such as \file{sql.h} and \file{sqlext.h}). } \seealso{ \code{\link{sqlGetResults}}, \code{\link{odbcGetInfo}} } \author{ Brian Ripley } \examples{\dontrun{ > names(sqlTypeInfo(channel)) [1] "TYPE_NAME" "DATA_TYPE" "COLUMN_SIZE" [4] "LITERAL_PREFIX" "LITERAL_SUFFIX" "CREATE_PARAMS" [7] "NULLABLE" "CASE_SENSITIVE" "SEARCHABLE" [10] "UNSIGNED_ATTRIBUTE" "FIXED_PREC_SCALE" "AUTO_UNIQUE_VALUE" [13] "LOCAL_TYPE_NAME" "MINIMUM_SCALE" "MAXIMUM_SCALE" [16] "SQL_DATATYPE" "SQL_DATETIME_SUB" "NUM_PREC_RADIX" [19] "INTERVAL_PRECISION" }} \keyword{IO} \keyword{database} RODBC/man/odbcDataSources.Rd0000644000176000001440000000276613013621651015253 0ustar ripleyusers% file RODBC/man/odbcDataSources.Rd % copyright (C) 2006-2013 B. D. Ripley % \name{odbcDataSources} \alias{odbcDataSources} \title{List ODBC Data Sources} \description{ List known ODBC data sources. } \usage{ odbcDataSources(type = c("all", "user", "system")) } \arguments{ \item{type}{User DSNs, system DSNs or all?} } \value{ A named character vector of DSN descriptions, with names the DSNs. } \author{ Brian Ripley } \examples{\dontrun{ > odbcDataSources() test sqlite3 testpg "MySQL" "sqlite3" "PostgreSQL" or testdb3 sqlite3 "MySQL ODBC 3.51 Driver" "SQLite3 ODBC Driver" bdr.xls testacc "Microsoft Excel Driver (*.xls)" "Microsoft Access Driver (*.mdb)" testpg SQLServer "PostgreSQL ANSI" "SQL Native Client" Oracle DB2 "Oracle in OraDb10g_home1" "IBM DB2 ODBC DRIVER - DB2COPY1" testpgw testdb5 "PostgreSQL Unicode" "MySQL ODBC 5.1 Driver" SQLite Datasource SQLite UTF-8 Datasource "SQLite ODBC Driver" "SQLite ODBC (UTF-8) Driver" SQLite3 Datasource mimdb "SQLite3 ODBC Driver" "MIMER" }} \keyword{utilities}RODBC/man/sqlSave.Rd0000644000176000001440000001576413013621651013626 0ustar ripleyusers% file RODBC/man/sqlSave.Rd % copyright (C) 1999-2002 M. Lapsley % copyright (C) 2002-2013 B. D. Ripley % \name{sqlSave} \alias{sqlSave} \alias{sqlUpdate} \title{Write a Data Frame to a Table in an ODBC Database} \description{ Write or update a table in an ODBC database. } \usage{ sqlSave(channel, dat, tablename = NULL, append = FALSE, rownames = TRUE, colnames = FALSE, verbose = FALSE, safer = TRUE, addPK = FALSE, typeInfo, varTypes, fast = TRUE, test = FALSE, nastring = NULL) sqlUpdate(channel, dat, tablename = NULL, index = NULL, verbose = FALSE, test = FALSE, nastring = NULL, fast = TRUE) } \arguments{ \item{channel}{connection handle returned by \code{\link{odbcConnect}}.} \item{dat}{a data frame.} \item{tablename}{character: a database table name accessible from the connected DSN. If missing, the name of \code{dat}.} \item{index}{character. Name(s) of index column(s) to be used.} \item{append}{logical. Should data be appended to an existing table?} \item{rownames}{either logical or character. If logical, save the row names as the first column \code{rownames} in the table? If character, the column name under which to save the rownames.} \item{colnames}{logical: save column names as the first row of table?} \item{verbose}{display statements as they are sent to the server?} \item{safer}{logical. If true, create a non-existing table but only allow appends to an existing table. If false, allow \code{sqlSave} to attempt to delete all the rows of an existing table, or to drop it.} \item{addPK}{logical. Should rownames (if included) be specified as a primary key?} \item{typeInfo}{optional list of DBMS datatypes. Should have elements named \code{"character"}, \code{"double"} and \code{"integer"}.} \item{varTypes}{an optional named character vector giving the DBMSs datatypes to be used for some (or all) of the columns if a table is to be created.} \item{fast}{logical. If false, write data a row at a time. If true, use a parametrized \code{INSERT INTO} or \code{UPDATE} query to write all the data in one operation.} \item{test}{logical: if \code{TRUE} show what would be done, only.} \item{nastring}{optional character string to be used for writing \code{NA}s to the database. See \sQuote{Details}.} } \details{ \code{sqlSave} saves the data frame \code{dat} in the table \code{tablename}. If the table exists and has the appropriate structure it is used, or else it is created anew. If a new table is created, column names are remapped by removing any characters which are not alphanumeric or \code{_}, and the types are selected by consulting arguments \code{varTypes} and \code{typeInfo}, then looking the driver up in the database used by \code{\link{getSqlTypeInfo}} or failing that by interrogating \code{\link{sqlTypeInfo}}. If \code{rownames = TRUE} the first column of the table will be the row labels with colname \code{rowname}: \code{rownames} can also be a string giving the desired column name (see \sQuote{Examples}). If \code{colnames} is true, the column names are copied into row 1. This is intended for cases where case conversion alters the original column names and it is desired that they are retained. Note that there are drawbacks to this approach: it presupposes that the rows will be returned in the correct order; not always valid. It will also cause numeric columns to be returned as factors. Argument \code{addPK = TRUE} causes the row names to be marked as a primary key. This is usually a good idea, and may allow database updates to be done. However, the ODBC drivers for some DBMSs (e.g. Access) do not support primary keys, and earlier versions of the PostgreSQL ODBC driver generated internal memory corruption if this option is used. \code{sqlUpdate} updates the table where the rows already exist. Data frame \code{dat} should contain columns with names that map to (some of) the columns in the table. It also needs to contain the column(s) specified by \code{index} which together identify the rows to be updated. If \code{index = NULL}, the function tries to identify such columns. First it looks for a primary key for the table, then for the column(s) that the database regards as the optimal for defining a row uniquely (these are returned by \code{\link{sqlColumns}(special = TRUE)}: if this returns a pseudo-column it cannot be used as we do not have values for the rows to be changed). Finally, the row names are used if they are stored as column \code{"rownames"} in the table. When \code{fast = TRUE}, \code{NA}s are always written as SQL nulls in the database, and this is also the case if \code{fast = FALSE} and \code{nastring = NULL} (its default value). Otherwise \code{nastring} gives the character string to be sent to the driver when \code{NA}s are encountered: for all but the simplest applications it will be better to prepare a data frame with non-null missing values already substituted. If \code{fast = FALSE} all data are sent as character strings. If \code{fast = TRUE}, integer and double vectors are sent as types \code{SQL_C_SLONG} and \code{SQL_C_DOUBLE} respectively. Some drivers seem to require \code{fast = FALSE} to send other types, e.g. \code{datetime}. SQLite's approach is to use the data to determine how it is stored, and this does not work well with \code{fast = TRUE}. If \code{tablename} contains \samp{.} and neither \code{catalog} nor \code{schema} is supplied, an attempt is made to interpret \code{\var{qualifier}.\var{table}} names as table \code{\var{table}} in schema \code{\var{qualifier}} (and for MySQL \sQuote{schema} means \sQuote{database}). (This can be suppressed by opening the connection with \code{interpretDot = FALSE}.) } \section{Warning}{ \code{sqlSave(safer = FALSE)} uses the \sQuote{great white shark} method of testing tables (bite it and see). The logic will unceremoniously \code{DROP} the table and create it anew with its own choice of column types in its attempt to find a writable solution. \code{test = TRUE} will not necessarily predict this behaviour. Attempting to write indexed columns or writing to pseudo-columns are less obvious causes of failed writes followed by a \code{DROP}. If your table structure is precious it is up to you back it up. } \value{ \code{1} invisibly for success (and failures cause errors). } \seealso{ \code{\link{sqlFetch}}, \code{\link{sqlQuery}}, \code{\link{odbcConnect}}, \code{\link{odbcGetInfo}} } \author{ Michael Lapsley and Brian Ripley } \examples{ \dontrun{ channel <- odbcConnect("test") sqlSave(channel, USArrests, rownames = "state", addPK=TRUE) sqlFetch(channel, "USArrests", rownames = "state") # get the lot foo <- cbind(state=row.names(USArrests), USArrests)[1:3, c(1,3)] foo[1,2] <- 222 sqlUpdate(channel, foo, "USArrests") sqlFetch(channel, "USArrests", rownames = "state", max = 5) sqlDrop(channel, "USArrests") close(channel) }} \keyword{IO} \keyword{database} RODBC/man/sqlCopy.Rd0000644000176000001440000000361213013621651013627 0ustar ripleyusers% file RODBC/man/sqlCopy.Rd % copyright (C) 1999-2002 M. Lapsley % copyright (C) 2002-2013 B. D. Ripley % \name{sqlCopy} \alias{sqlCopy} \alias{sqlCopyTable} \title{ODBC Copy} \description{ Functions to copy tables or result sets from one database to another. } \usage{ sqlCopy(channel, query, destination, destchannel = channel, verbose = FALSE, errors = TRUE, \dots) sqlCopyTable(channel, srctable, desttable, destchannel = channel, verbose = FALSE, errors = TRUE) } \arguments{ \item{channel, destchannel}{connection handle as returned by \code{\link{odbcConnect}}.} \item{query}{any valid SQL statement} \item{destination, srctable, desttable}{character: a database table name accessible from the connected DSN.} \item{verbose}{Display statements as they are sent to the server?} \item{errors}{if TRUE halt and display error, else return \code{-1}.} \item{\dots}{additional arguments to be passed to \code{\link{sqlSave}}.} } \details{ \code{sqlCopy} as is like \code{\link{sqlQuery}}, but saves the output of \code{query} in table \code{destination} on channel \code{destchannel}. \code{sqlCopyTable} copies the structure of \code{srctable} to \code{desttable} on DSN \code{destchannel}. This is within the limitations of the ODBC lowest common denominator. More precise control is possible \emph{via} \code{sqlQuery}. } \value{ See \code{\link{sqlGetResults}}. } \seealso{ \code{\link{sqlQuery}}, \code{\link{sqlSave}} } \author{ Michael Lapsley and Brian Ripley } \examples{\dontrun{## example for a l/casing DBMS sqlSave(channel, USArrests, rownames = "state") query <- paste("select state, murder from usarrests", "where rape > 30", "order by murder") sqlCopy(channel, query, "HighRape", rownames = FALSE) sqlFetch(channel, "HighRape", rownames = "state", max = 5) sqlDrop(channel, "HighRape") }} \keyword{IO} \keyword{database} RODBC/man/odbcClose.Rd0000644000176000001440000000237413013621651014076 0ustar ripleyusers% file RODBC/man/odbcClose.Rd % copyright (C) 1999-2002 M. Lapsley % copyright (C) 2002-2013 B. D. Ripley % \name{odbcClose} \alias{odbcClose} \alias{odbcCloseAll} \alias{close.RODBC} \title{ODBC Close Connections} \description{ Close connections to ODBC databases. } \usage{ odbcClose(channel) \method{close}{RODBC}(con, \dots) odbcCloseAll() } \arguments{ \item{channel, con}{RODBC connection object as returned by \code{odbcConnect}.} \item{\dots}{additional arguments passed from the generic.} } \details{ \code{odbcClose} cleans up and frees resources. It is also the method for the generic function \code{close}. \code{odbcCloseAll} closes all open channels (amongst the first 1000 used in the session). Channels are closed at the end of an \R session, and may also be closed by garbage collection if no object refers to them. In both cases a warning is given (but may not be seen at the end of a console session). } \value{ Function \code{odbcClose} returns a logical indicating if it succeeded, invisibly unless a warning is given. The \code{close} method returns \code{0} (success) or \code{1}, invisibly. } \author{ Michael Lapsley and Brian Ripley } \seealso{ \code{\link{odbcConnect}} } \keyword{IO} \keyword{database} RODBC/man/odbc.Rd0000644000176000001440000000670413013621651013111 0ustar ripleyusers% file RODBC/man/odbc.Rd % copyright (C) 1999-2002 M. Lapsley % copyright (C) 2002-2013 B. D. Ripley % \name{odbc-low-level} \alias{odbcQuery} \alias{odbcTables} \alias{odbcFetchRows} \alias{odbcGetErrMsg} \alias{odbcClearError} \title{Low-level ODBC functions} \description{ \R functions which talk directly to the ODBC interface. } \usage{ odbcTables(channel, catalog = NULL, schema = NULL, tableName = NULL, tableType = NULL, literal = FALSE) odbcQuery(channel, query, rows_at_time = attr(channel, "rows_at_time")) odbcFetchRows(channel, max = 0, buffsize = 1000, nullstring = NA_character_, believeNRows = TRUE) odbcGetErrMsg(channel) odbcClearError(channel) } \arguments{ \item{channel}{connection handle as returned by \code{\link{odbcConnect}}, of class \code{"RODBC"}.} \item{catalog, schema, tableName, tableType}{\code{NULL} or character: whether these do anything depends on the ODBC driver. The first three can be length-one character vectors, and \code{tableType} can specify zero or more types.} \item{literal}{logical: should arguments be interpreted literally or including wildcards?} \item{query}{any valid SQL statement.} \item{rows_at_time}{The number of rows to fetch at a time, between 1 and 1024. Not all drivers work correctly with values > 1: see \code{\link{sqlQuery}}.} \item{max}{limit on the number of rows to fetch, with 0 indicating no limit.} \item{buffsize}{the number of records to be transferred at a time.} \item{nullstring}{character string to be used when reading \code{SQL_NULL_DATA} items in a column transferred as character.} \item{believeNRows}{logical. Is the number of rows returned by the ODBC connection believable?} } \details{ These are low-level functions called by \code{\link{sqlTables}}, \code{\link{sqlQuery}}, \code{\link{sqlGetResults}} and similar high-level functions. They are likely to be confind to the \pkg{RODBC} namespace in the near future. \code{odbcTables} enquires about the tables on the connected database. Whether arguments after the first do anything and what they do depends on the ODBC driver: see the help on \code{\link{sqlTables}} for some driver-specific details. \code{odbcFetchRows} returns a data frame of the pending rowset, limited to \code{max} rows if \code{max} is greater than 0. \code{buffsize} may be increased from the default of 1000 rows for increased performance on a large dataset. This only has an effect when \code{max = 0} and \code{believeNRows = FALSE} (either for the ODBC connection or for this function call), in which case \code{buffsize} is used as the initial allocation length of the \R vectors to hold the results. (Values of less than 100 are increased to 100.) If the initial size is too small the vector length is doubled, repeatedly if necessary. } \value{ \code{odbcGetErrMsg} returns a (possibly zero-length) character vector of pending messages. \code{odbcClearError} returns nothing, invisibly. The otheres return \code{1} on success and \code{-1} on failure, indicating that a message is waiting to be retrieved \code{\link{odbcGetErrMsg}}. \code{odbcFetchRows} may return \code{-2} indicating \code{"No Data"}, the message that would be returned by \code{\link{odbcGetErrMsg}}. } \seealso{ \code{\link{sqlQuery}}, \code{\link{odbcConnect}}, \code{\link{odbcGetErrMsg}}. } \author{ Michael Lapsley and Brian Ripley } \keyword{IO} \keyword{database} RODBC/man/sqlTables.Rd0000644000176000001440000001415413013621651014132 0ustar ripleyusers% file RODBC/man/s.Rd % copyright (C) 1999-2002 M. Lapsley % copyright (C) 2002-2013 B. D. Ripley % \name{sqlTables} \alias{sqlTables} \title{List Tables on an ODBC Connection} \description{ List the table-like objects accessible from an ODBC connection. What objects are \sQuote{table-like} depends on the DBMS, ODBC driver and perhaps even the configuration settings: in particular some connections report system tables and some do not. } \usage{ sqlTables(channel, errors = FALSE, as.is = TRUE, catalog = NULL, schema = NULL, tableName = NULL, tableType = NULL, literal = FALSE) } \arguments{ \item{channel}{connection handle as returned by \code{\link{odbcConnect}}.} \item{errors}{if \code{TRUE} halt and display error, else return \code{-1}.} \item{as.is}{as in \code{\link{sqlGetResults}}.} \item{catalog, schema, tableName, tableType}{\code{NULL} or character: whether these do anything depends on the ODBC driver. The first three can be length-one character vectors, and \code{tableType} can specify zero or more types in separate elements of a character vector.} \item{literal}{logical: (where supported) should arguments be interpreted literally or including wildcards?} } \value{ A data frame on success, or character/numeric on error depending on the \code{errors} argument. (Use \code{\link{sqlGetResults}} for further details of errors.) The column names depend on the database, containing a third column \code{TABLE_NAME} (not always in upper case): however, they are supposed to be always in the same order. The first column is the \sQuote{catalog} or (in ODBC2 parlance) \sQuote{qualifier}, the second the \sQuote{schema} or (ODBC2) \sQuote{owner}, the third the name, the fourth the table type (one of \code{"TABLE"}, \code{"VIEW"}, \code{"SYSTEM TABLE"}, \code{"ALIAS"}, \code{"SYNONYM"}, or a driver-specific type name) and the fifth column any remarks. Oddly, the Microsoft Excel driver considers worksheets to be system tables, and named ranges to be tables. } \section{Driver-specific details}{ Whether the additional arguments are implemented and what they do is driver-specific. The standard SQL wildcards are \emph{underscore} to match a single character and \emph{percent} to match zero or more characters (and often backslash will escape these): these are not used for table types. All of these drivers interpret wildcards in \code{tableName}, and in \code{catalog} or \code{schema} where supported. Setting one of \code{catalog} or \code{schema} to \code{"\%"} and the other and \code{tableName} to \code{""} should give a list of available catalogs or schemas, whereas \preformatted{ catalog = "", schema = "", tableName = "", tableType = "\%" } should list the supported table types. For MySQL, \code{catalog} refers to a database whereas \code{schema} is mostly ignored, and \code{literal} is ignored. To list all databases use just \code{catalog = "\%"}. In the 5.1.x driver, use \code{catalog="\var{db_name}", tableName="\%"} to list the tables in another database, and to list the table types use the form displayed above. For PostgreSQL's ODBC driver \code{catalog} is ignored (except that \code{catalog = ""} is required when listing schema or table types) and \code{literal} works for both \code{schema} and for \code{tableName}. SQLite ODBC ignores \code{catalog} and \code{schema}, except that the displayed form is used to list table types. So although it is possible to attach databases and to refer to them by the \emph{dotted name} notation, it is apparently impossible to list tables on attached databases. % wildcards in \code{tableName} are used whatever the setting of \code{literal}. Microsoft SQL Server 2008 interprets both \code{catalog} and \code{schema}. With \code{literal = TRUE} it only finds tables if \code{schema} is set (even to an empty string). Schemas are only listed if they contain objects. Oracle's Windows ODBC driver finds no matches if anything non-empty is supplied for the \code{catalog} argument. Unless a schema is specified it lists tables in all schemas. It lists available table types as just \code{"TABLE"} and \code{"VIEW"}, but other types appear in listings. With \code{literal = TRUE} it only finds tables if \code{schema} is set (even to an empty string). DB2 implements schemas but not catalogs. \code{literal = TRUE} has no effect. In some uses case matters and upper-case names must be used for schemas. The Microsoft Access and Excel drivers interpret \code{catalog} as the name of the Access \code{.mdb} or Excel \code{.xls} file (with the path but without the extension): wildcards are interpreted in \code{catalog} (for files in the same folder as the attached database) and \code{tableName}. Using \code{schema} is an error except when listing catalogs or table types. The Excel driver matched \code{tableType = "TABLE"} (a named range) but not \code{tableType = "SYSTEM TABLE"} (the type returned for worksheets). The Actual Technologies Access/Excel driver ignores all the additional arguments. } \seealso{ \code{\link{sqlGetResults}} } \author{ Michael Lapsley and Brian Ripley } \examples{ \dontrun{ > sqlTables(channel, "USArrests") ## MySQL example TABLE_CAT TABLE_SCHEM TABLE_NAME TABLE_TYPE REMARKS 1 ripley USArrests TABLE ## PostgreSQL example TABLE_QUALIFIER TABLE_OWNER TABLE_NAME TABLE_TYPE REMARKS 1 ripley public usarrests TABLE ## Microsoft Access example > sqlTables(channel) TABLE_CAT TABLE_SCHEM TABLE_NAME TABLE_TYPE REMARKS 1 C:\\bdr\\test MSysAccessObjects SYSTEM TABLE 2 C:\\bdr\\test MSysACEs SYSTEM TABLE 3 C:\\bdr\\test MSysObjects SYSTEM TABLE 4 C:\\bdr\\test MSysQueries SYSTEM TABLE 5 C:\\bdr\\test MSysRelationships SYSTEM TABLE 6 C:\\bdr\\test hills TABLE 7 C:\\bdr\\test USArrests TABLE }} \keyword{IO} \keyword{database} RODBC/man/sqlColumns.Rd0000644000176000001440000001475713013621651014351 0ustar ripleyusers% file RODBC/man/sqlColumns.Rd % copyright (C) 1999-2002 M. Lapsley % copyright (C) 2002-2013 B. D. Ripley % \name{sqlColumns} \alias{sqlPrimaryKeys} \alias{sqlColumns} \title{Query Column Structure in ODBC Tables} \description{ Enquire about the column structure of tables on an ODBC database connection. } \usage{ sqlColumns(channel, sqtable, errors = FALSE, as.is = TRUE, special = FALSE, catalog = NULL, schema = NULL, literal = FALSE) sqlPrimaryKeys(channel, sqtable, errors = FALSE, as.is = TRUE, catalog = NULL, schema = NULL) } \arguments{ \item{channel}{connection object as returned by \code{\link{odbcConnect}}.} \item{sqtable}{character string: a database table (or view or similar) name accessible from the connected DSN. If wildcards are allowed (only for \code{sqlColumns(special=FALSE)}), results for all matching tables.} \item{errors}{logical: if true halt and display error, else return \code{-1}.} \item{as.is}{see \code{\link{sqlGetResults}}.} \item{special}{logical. If true, return only the column(s) needed to specify a row uniquely. Depending on the database, there might be none.} \item{catalog, schema}{\code{NULL} or character: additional information on where to locate the table: see \code{\link{sqlTables}} for driver-specific details. Wildcards may be supported in \code{schema} for \code{sqlColumns(special=FALSE)}.} \item{literal}{logical: wildcards may be interpreted in \code{schema} and \code{sqtable}: if so this may suppress such interpretation.} } \details{ The argument \code{special = TRUE} to \code{sqlColumns} returns the column(s) needed to specify a row uniquely. This is intended to form the basis of an SQL \code{WHERE} clause for update queries (see \code{\link{sqlUpdate}}), and what (if anything) it does is DBMS-specific. On many DBMSs it will return the primary keys if present: on others it will return a pseudo-column such as \samp{ROWID} (Oracle) or \samp{_ROWID_} (SQLite), either always (Oracle) or if there is no primary key. Primary keys are implemented in some DBMSs and drivers. A table can have a single column designated as a primary key or, in some cases, multiple columns. Primary keys should not be nullable (that is, cannot contain missing values). They can be specified as part of a \samp{CREATE TABLE} statement or added by a \samp{ALTER TABLE} statement. In principle specifying \code{catalog} should select an alternative database in MySQL or an attached database in SQLite, but neither works with current drivers. If \code{sqtable} contains \samp{.} and neither \code{catalog} nor \code{schema} is supplied, an attempt is made to interpret \code{\var{qualifier}.\var{table}} as table \code{\var{table}} in schema \code{\var{qualifier}} (and for MySQL \sQuote{schema} means \sQuote{database}, but the current drivers fail to interpret \code{catalog=}, so this does not yet work). (This can be suppressed by opening the connection with \code{interpretDot = FALSE}.) This has been tested successfully on PostgreSQL, SQL Server, Oracle, DB2 and Mimer. Whether wildcards are accepted for \code{sqtable} and \code{schema} in \code{sqlColumns(special = FALSE)} depends on the driver and may be changed by the value of \code{literal}. For example, the PostgreSQL driver tested allowed wildcards in \code{schema} only if \code{literal = FALSE} and never in \code{sqtable}, whereas two MySQL drivers both failed to match a database when \code{catalog} was supplied and always allowed wildcards in \code{sqtable} even if \code{literal = TRUE}. % SQLiteODBC allows wildcards whatever \code{literal} is. % SQL Server and Oracle find nothing if literal = TRUE, and does % not access attached databases. } \value{ A data frame on success. If no data is returned, either a zero-row data frame or an error. (For example, if there are no primary keys or special column(s) in this table an empty data frame is returned, but if primary keys are not supported by the ODBC driver or DBMS, an error code results.) The column names are not constant across ODBC versions so the data should be accessed by column number. For \code{sqlPrimaryKeys} and \code{sqlColumns(special=FALSE)} the first four columns give the catalog, schema, table and column names (where applicable). For \code{sqlPrimaryKeys} the next two columns are the column sequence number (starting with 1) and name of the primary key: drivers can define further columns. For \code{sqlColumns(special=FALSE)} there are 18 columnns: see \url{http://msdn.microsoft.com/en-us/library/ms711683(VS.85).aspx}. Those beyond the first 6 shown in the examples give the \sQuote{ordinal position} (column 17) and further characteristics of the column type: see \code{\link{sqlTypeInfo}}. For the numeric values returned by \code{sqlColumns(special=TRUE)} see \url{http://msdn.microsoft.com/en-us/library/ms714602(VS.85).aspx}: the scope should always be \code{2} (the session) since that is the scope requested in the call. For the \code{PSEUDO_COLUMN} column, the possible values are \code{0} (unknown), \code{1} (no) and \code{2} (yes). } \seealso{ \code{\link{odbcConnect}}, \code{\link{sqlQuery}}, \code{\link{sqlFetch}}, \code{\link{sqlSave}}, \code{\link{sqlTables}}, \code{\link{odbcGetInfo}} } \author{ Michael Lapsley and Brian Ripley } \examples{ \dontrun{## example results from MySQL > channel <- odbcConnect("test") > sqlDrop(channel, "USArrests", errors = FALSE) # precautionary > sqlSave(channel, USArrests, addPK = TRUE) > sqlColumns(channel, "USArrests") TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME 1 ripley USArrests rownames 12 varchar 2 ripley USArrests Murder 8 double 3 ripley USArrests Assault 4 integer 4 ripley USArrests UrbanPop 4 integer 5 ripley USArrests Rape 8 double ... 12 more columns > sqlColumns(channel, "USArrests", special = TRUE) SCOPE COLUMN_NAME DATA_TYPE TYPE_NAME COLUMN_SIZE BUFFER_LENGTH 1 2 rownames 12 varchar 255 255 DECIMAL_DIGITS PSEUDO_COLUMN 1 NA 1 > sqlPrimaryKeys(channel, "USArrests") TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME KEY_SEQ PK_NAME 1 USArrests rownames 1 PRIMARY > sqlDrop(channel, "USArrests") > close(channel) }} \keyword{IO} \keyword{database} RODBC/man/sqlQuery.Rd0000644000176000001440000001505313013621651014024 0ustar ripleyusers% file RODBC/man/sqlQuery.Rd % copyright (C) 1999-2002 M. Lapsley % copyright (C) 2002-2013 B. D. Ripley % \name{sqlQuery} \alias{sqlQuery} \alias{sqlGetResults} \title{Query an ODBC Database} \description{ Submit an SQL query to an ODBC database, and retrieve the results. } \usage{ sqlQuery(channel, query, errors = TRUE, ..., rows_at_time) sqlGetResults(channel, as.is = FALSE, errors = FALSE, max = 0, buffsize = 1000, nullstring = NA_character_, na.strings = "NA", believeNRows = TRUE, dec = getOption("dec"), stringsAsFactors = default.stringsAsFactors()) } \arguments{ \item{channel}{connection handle as returned by \code{\link{odbcConnect}}.} \item{query}{any valid SQL statement.} \item{errors}{logical: if true halt and display error, else return \code{-1}.} \item{\dots}{additional arguments to be passed to \code{sqlGetResults}.} \item{rows_at_time}{The number of rows to fetch at a time, between 1 and 1024. See \sQuote{Details}.} \item{as.is}{which (if any) columns returned as character should be converted to another type? Allowed values are as for \code{\link{read.table}}. See \sQuote{Details}.} \item{max}{limit on the number of rows to fetch, with \code{0} indicating no limit.} \item{buffsize}{an initial guess at the number of rows, used if \code{max = 0} and \code{believeNRows == FALSE}.} \item{nullstring}{character string to be used when reading \code{SQL_NULL_DATA} character items from the database.} \item{na.strings}{character vector of strings to be mapped to \code{NA} when reading character data.} \item{believeNRows}{logical. Is the number of rows returned by the ODBC connection believable? This might have been set to false when the channel was opened, and if so that setting cannot be overridden.} \item{dec}{The character for the decimal place to be assumed when converting character columns to numeric.} \item{stringsAsFactors}{logical: should columns returned as character and not excluded by \code{as.is} and not converted to anything else be converted to factors?} } \details{ \code{sqlQuery} is the workhorse function of \pkg{RODBC}. It sends the SQL statement \code{query} to the server, using connection \code{channel} returned by \code{\link{odbcConnect}}, and retrieves (some or all of) the results \emph{via} \code{sqlGetResults}. The term \sQuote{query} includes any valid SQL statement including table creation, alteration, updates etc as well as \samp{SELECT}s. The \code{sqlQuery} command is a convenience wrapper that first calls \code{\link{odbcQuery}} and then \code{sqlGetResults}. If finer-grained control is needed, for example over the number of rows fetched, additional arguments can be passed to \code{sqlQuery} or the underlying functions called directly. \code{sqlGetResults} is a mid-level function. It is called after a call to \code{sqlQuery} or \code{\link{odbcQuery}} to retrieve waiting results into a data frame. Its main use is with \code{max} set to non-zero when it will retrieve the result set in batches with repeated calls. This is useful for very large result sets which can be subjected to intermediate processing. Where possible \code{sqlGetResults} transfers data in binary form: this happens for columns of (ODBC) SQL types \code{double}, \code{real}, \code{integer} and \code{smallint}, and for binary SQL types (which are transferred as lists of raw vectors, given class \code{"ODBC_binary"}). All other SQL data types are converted to character strings by the ODBC interface. This paragraph applies only to SQL data types which are returned by ODBC as character vectors. If when creating the connection (see \code{\link{odbcConnect})} \code{DBMSencoding} was set to a non-empty value, the character strings are re-encoded. Then if \code{as.is} is true for a column, it is returned as a character vector. Otherwise (where detected) \code{date}, \code{datetime} and \code{timestamp} values are converted to the \code{"Date"} or \code{"POSIXct"} class. (Some drivers seem to confuse times with dates, so times may get converted too. Also, some DBMSs (e.g. Oracle's) idea of \code{date} is a date-time.) Remaining cases are converted by \R using \code{\link{type.convert}}. When character data are to be converted to numeric data, the setting of \code{options("dec")} is used to map the character used by the ODBC driver in setting decimal points---this is set to a locale-specific value when \pkg{RODBC} is initialized if it is not already set. Using \code{buffsize} will yield a marginal increase in speed if set to no less than the maximum number of rows when \code{believeNRows = FALSE}. (If set too small it can result in unnecessarily high memory use as the buffers will need to be expanded.) Modern drivers should work (and work faster, especially if communicating with a remote machine) with \code{rows_at_time = 100}, the usual default, or more. (However, some drivers may mis-fetch multiple rows, in which case set \code{rows_at_time = 1} when creating the connection.) However, if \code{max} is specified then this may fetch too many rows and hence it could be reduced (but then this setting applies to all subsequent fetches from that result set). Another circumstance in which you might want to reduce \code{rows_at_time} is if there are large character columns in the result set: with the default value up to 6Mb of buffer for each such column could be allocated to store intermediate results. } \value{ On success, a data frame (possibly with 0 rows) or character string. On error, if \code{errors = TRUE} a character vector of error message(s), otherwise an invisible integer error code \code{-1} (general, call \code{\link{odbcGetErrMsg}} for details) or \code{-2} (no data, which may not be an error as some SQL statements do return no data). } \seealso{ \code{\link{odbcConnect}}, \code{\link{sqlFetch}}, \code{\link{sqlSave}}, \code{\link{sqlTables}}, \code{\link{odbcQuery}} } \author{ Michael Lapsley and Brian Ripley } \examples{ \dontrun{ channel <- odbcConnect("test") sqlSave(channel, USArrests, rownames = "State", verbose = TRUE) # options(dec=".") # optional, if DBMS is not locale-aware or set to ASCII ## note case of State, Murder, Rape are DBMS-dependent, ## and some drivers need column and table names double-quoted. sqlQuery(channel, paste("select State, Murder from USArrests", "where Rape > 30 order by Murder")) close(channel) }} \keyword{IO} \keyword{database} RODBC/man/RODBC-internal.Rd0000644000176000001440000000222713013621651014641 0ustar ripleyusers% file RODBC/man/RODBC-internal.Rd % copyright (C) 1999-2013 M. Lapsley and B. D. Ripley % \name{RODBC-internal} \alias{odbcUpdate} \alias{odbcCaseFlag} \alias{odbcColumns} \alias{odbcPrimaryKeys} \alias{odbcSpecialColumns} \alias{sqltablecreate} \alias{sqlwrite} \alias{odbcTableExists} \alias{odbcClearResults} \alias{odbcValidChannel} \title{Internal RODBC functions} \description{ Internal RODBC functions: not exported from the \pkg{RODBC} name space. } \usage{ odbcUpdate(channel, query, data, params, test = FALSE, verbose = FALSE, nastring = NULL) odbcCaseFlag(channel) odbcColumns(channel, table, catalog = NULL, schema = NULL, literal = FALSE) odbcSpecialColumns(channel, table, catalog = NULL, schema = NULL) odbcPrimaryKeys(channel, table, catalog = NULL, schema = NULL) sqlwrite(channel, tablename, mydata, test = FALSE, fast = TRUE, nastring = NULL, verbose = FALSE) sqltablecreate(channel, tablename, coldata = NULL, colspecs, keys = -1) odbcTableExists(channel, tablename, abort = TRUE, forQuery = TRUE, allowDot = attr(channel, "interpretDot")) odbcClearResults(channel) odbcValidChannel(channel) } \keyword{internal} RODBC/man/RODBC-package.Rd0000644000176000001440000000154413013621651014421 0ustar ripleyusers% file RODBC/man/RODBC-package.Rd % copyright (C) 1999-2013 M. Lapsley and B. D. Ripley % \name{RODBC-package} \alias{RODBC} \title{ODBC Database Connectivity} \description{ Package \pkg{RODBC} implements ODBC database connectivity. See the package manual for details of installation and use. (This will show up as a vignette, and can be accessed \emph{via} \code{RShowDoc("RODBC", package="RODBC")}.) } \details{ Two groups of functions are provided. The mainly internal \code{odbc*} commands implement low-level access to the ODBC functions of similar name. The \code{sql*} functions operate at a higher level to read, save, copy and manipulate data between data frames and SQL tables. Many connections can be open at once to any combination of DSN/hosts. } \author{ Michael Lapsley and Brian Ripley } \keyword{IO} \keyword{database} RODBC/man/odbcSetAutoCommit.Rd0000644000176000001440000000312713013621651015563 0ustar ripleyusers% file RODBC/man/odbcSetAutoCommit.Rd % copyright (C) 2005-2013 B. D. Ripley % \name{odbcSetAutoCommit} \alias{odbcSetAutoCommit} \alias{odbcEndTran} \title{ODBC Set Auto-Commit Mode} \description{ Set ODBC database connection's auto-commit mode. } \usage{ odbcSetAutoCommit(channel, autoCommit = TRUE) odbcEndTran(channel, commit = TRUE) } \arguments{ \item{channel}{RODBC connection object returned by \code{odbcConnect}.} \item{autoCommit}{logical. Set auto-commit on?} \item{commit}{logical. Commit or rollback pending transaction?} } \details{ Auto-commit is a concept supported only by ODBC connections to transactional DBMSs. If a connection to a transactional DBMS is in auto-commit mode (the default), then all its SQL statements will be executed and committed as individual transactions. Otherwise, its SQL statements are grouped into transactions that are terminated by an execution of \code{commit} or \code{rollback}. Switching a connection to auto-commit mode commits the pending transaction. By default, new connections are in auto-commit mode. If auto-commit mode has been disabled, a call to \code{odbcEndTran} or an SQL \code{commit} statement must be executed in order to commit changes; otherwise, pending database changes will not be saved. } \value{ \code{odbcSetAutoCommit} stops if \code{channel} is an invalid connection. The function returns \code{-1} on error, \code{0} on success and \code{} on success with a message that would be returned by \code{odbcGetErrMsg}. } \author{ Norman Yamada, Yasser El-Zein } \keyword{IO} \keyword{database} RODBC/man/setSqlTypeInfo.Rd0000644000176000001440000000316513013621651015131 0ustar ripleyusers% file RODBC/man/sqlTypeInfo.Rd % copyright (C) 2004-2013 B. D. Ripley % \name{setSqlTypeInfo} \alias{setSqlTypeInfo} \alias{getSqlTypeInfo} \title{Specify or Query a Mapping of R Types to DBMS Types} \description{ Specify or retrieve a mapping of \R types to DBMS datatypes. } \usage{ setSqlTypeInfo(driver, value) getSqlTypeInfo(driver) } \arguments{ \item{driver}{A character string specifying the \code{DBMS_name} as returned by \code{\link{odbcGetInfo}}. Optional for \code{getSqlTypeInfo}.} \item{value}{A named list with character values. This should have names \code{"double"}, \code{"integer"}, \code{"character"} and \code{"logical"}, and values SQL types appropriate to the DBMS.} } \details{ This information is used by \code{\link{sqlSave}} if it creates a table in the DBMS and is not overridden by arguments \code{typeInfo} or \code{varTypes}. Mappings are included for MySQL, PostgreSQL, SQLite, Oracle, Mimer, DB2 on Windows, and the Microsoft SQL Server, Access, Excel and Dbase drivers. The SQL types chosen should be nullable to allow \code{NA}s to be represented. (Bit and boolean types often are not.) } \value{ For \code{setSqlTypeInfo} none. For \code{getSqlTypeInfo} with an argument, a named list. Without an argument, a data frame. } \author{ Brian Ripley } \seealso{ \code{\link{sqlTypeInfo}}, \code{\link{sqlSave}}. } \examples{\dontrun{ getSqlTypeInfo() getSqlTypeInfo("MySQL") setSqlTypeInfo("Microsoft SQL Server", list(double="float", integer="int", character="varchar(255)", logical="varchar(5)")) }} \keyword{IO} \keyword{database} RODBC/man/sqlDrop.Rd0000644000176000001440000000363313013621651013624 0ustar ripleyusers% file RODBC/man/sqlDrop.Rd % copyright (C) 1999-2002 M. Lapsley % copyright (C) 2002-2013 B. D. Ripley % \name{sqlDrop} \alias{sqlDrop} \alias{sqlClear} \title{Deletion Operations on Tables in ODBC databases} \description{ \code{sqlClear} deletes all the rows of the table \code{sqtable}. \code{sqlDrop} removes the table \code{sqtable} (if permitted). } \usage{ sqlClear(channel, sqtable, errors = TRUE) sqlDrop(channel, sqtable, errors = TRUE) } \arguments{ \item{channel}{connection object as returned by \code{\link{odbcConnect}}.} \item{sqtable}{character string: a database table name accessible from the connected DSN. This can be a \sQuote{dotted} name of the form \code{\var{schema}.\var{table}}.} \item{errors}{logical: if \code{TRUE} halt and display error, else return \code{-1}.} } \details{ These submit \samp{TRUNCATE TABLE} and \samp{DROP TABLE} SQL queries respectively. \sQuote{Dotted} table names are allowed on systems that support them but the existence of the table is not checked and so attempting these operations on a non-existent table will give a low-level error. (This can be suppressed by opening the connection with \code{interpretDot = FALSE}.) The default \sQuote{drop} behaviour in Oracle is to move the table to the \sQuote{recycle bin}: use \preformatted{ sqlQuery(channel, "PURGE recyclebin") } to empty the recycle bin. The current user might not have privileges to allow these operations, and Actual Technologies' Mac OS X SQLite driver has a bug causing them silently to fail. } \value{ If \code{errors = FALSE}, a numeric value, invisibly. Otherwise a character string or \code{invisible()}. } \seealso{ \code{\link{odbcConnect}}, \code{\link{sqlQuery}}, \code{\link{sqlFetch}}, \code{\link{sqlSave}}, \code{\link{sqlTables}}, \code{\link{odbcGetInfo}} } \author{ Michael Lapsley and Brian Ripley } \keyword{IO} \keyword{database} RODBC/man/odbcConnect.Rd0000644000176000001440000002225413013621651014421 0ustar ripleyusers% file RODBC/man/odbcConnect.Rd % copyright (C) 1999-2002 M. Lapsley % copyright (C) 2002-2013 B. D. Ripley % \name{odbcConnect} \alias{odbcConnect} \alias{odbcDriverConnect} \alias{odbcReConnect} #ifdef windows \alias{odbcConnectAccess} \alias{odbcConnectDbase} \alias{odbcConnectExcel} \alias{odbcConnectAccess2007} \alias{odbcConnectExcel2007} #endif \title{ODBC Open Connections} \description{ Open connections to ODBC databases. } \usage{ odbcConnect(dsn, uid = "", pwd = "", ...) odbcDriverConnect(connection = "", case, believeNRows = TRUE, colQuote, tabQuote = colQuote, interpretDot = TRUE, DBMSencoding = "", rows_at_time = 100, readOnlyOptimize = FALSE) odbcReConnect(channel, ...) #ifdef windows odbcConnectAccess(access.file, uid = "", pwd = "", ...) odbcConnectAccess2007(access.file, uid = "", pwd = "", ...) odbcConnectDbase(dbf.file, ...) odbcConnectExcel(xls.file, readOnly = TRUE, ...) odbcConnectExcel2007(xls.file, readOnly = TRUE, ...) #endif }%" \arguments{ \item{dsn}{character string. A registered data source name.} \item{uid, pwd}{UID and password for authentication (if required).} \item{connection}{character string. See your ODBC documentation for the format.} \item{...}{further arguments to be passed to \code{odbcDriverConnect}.} \item{case}{Controls case changes for different DBMS engines. See \sQuote{Details}.} \item{channel}{RODBC connection object returned by \code{odbcConnect}.} \item{believeNRows}{logical. Is the number of rows returned by the ODBC connection believable? Not true for some Oracle and Sybase drivers, apparently, nor for Actual Technologies' SQLite driver for Mac OS X.} \item{colQuote, tabQuote}{how to quote column (table) names in SQL statements. Can be of length 0 (no quoting), a length--1 character vector giving the quote character to be used at both ends, or a length--2 character vector giving the beginning and ending quotes. ANSI SQL uses double quotes, but the default mode for a MySQL server is to use backticks. The defaults are backtick (\samp{`}) if the DBMS is identified as \code{"MySQL"} by the driver, and double quote otherwise. #ifdef windows The Access, DBase and Excel wrappers set \code{tabQuote = c("[", "]")}. #endif A user reported that the SAS ODBC driver required \code{colQuote = NULL}. } \item{interpretDot}{logical. Should table names of the form \code{\var{qualifier}.\var{table}} be interpreted as table \code{\var{table}} in schema \code{\var{qualifier}} (and for MySQL \sQuote{schema} means database)?} \item{DBMSencoding}{character string naming the encoding returned by the DBMS. The default means the encoding of the locale \R is running under. Values other than the default require \code{\link{iconv}} to be available: it always is from \R 2.10.0, otherwise see \code{\link{capabilities}}.} \item{rows_at_time}{The default number of rows to fetch at a time, between 1 and 1024. Not all drivers work correctly with values > 1: see \code{\link{sqlQuery}}.} \item{readOnlyOptimize}{logical: should the connection be optimized for read-only access?} #ifdef windows \item{access.file, dbf.file, xls.file}{file of an appropriate type.} \item{readOnly}{logical: should the connection be read-only?} #endif } \details{ \code{odbcConnect} establishes a connection to the specified DSN, and \code{odbcDriverConnect} allows a more flexible specification \emph{via} a connection string. \code{odbcConnect} uses the connection string\cr \code{"DSN=\var{dsn};UID=\var{uid};PWD=\var{pwd}"},\cr omitting the last two components if they are empty. #ifdef windows See the examples for other uses of connection strings. Under the Windows GUI, specifying an incomplete \code{connection}, for example the default \code{""}, will bring up a dialog box to complete the information required. (This does not work from \code{Rterm.exe} unless a driver is specified, a Windows restriction.) #endif For DBMSs that translate table and column names \code{case} must be set appropriately. Allowable values are \code{"nochange"}, \code{"toupper"} and \code{"tolower"} as well as the names of databases where the behaviour is known to us (currently \code{"mysql"}, which maps to lower case on Windows but not on Linux, \code{"postgresql"} (lower), and \code{"msaccess"} (nochange)). If \code{case} is not specified, the default is \code{"nochange"} unless the appropriate value can be figured out from the DBMS name reported by the ODBC driver. It is likely that \code{"toupper"} is desirable on IBM's DB2, but this is not enforced. #ifdef windows (The DBase driver is unusual: it preserves names on reading, but converts both table and column names to upper case on writing, and truncates table names to 8 characters. RODBC does not attempt to do any mapping for that driver.) #endif Note that \code{readOnlyOptimize} may do nothing, and is \strong{not} guaranteed to enforce read-only access. With drivers that support it, it is used to optimize locking strategies, transaction management and so on. It does make access to Mimer read-only, and has no effect on MySQL. Function \code{odbcReConnect} re-connects to a database using the settings of an existing (and presumably now closed) channel object. Arguments given in the original call can be overridden as needed. Note that if a password is supplied (either as a \code{pwd} argument or as part of the DSN) it may be stored in the \code{connection.string} element of the return value, but the value is (from \pkg{RODBC} 1.3-0) replaced by \code{******}. (This will break \code{odbcReConnect}.) #ifdef windows \code{odbcConnectAccess}, \code{odbcConnectDbase} and \code{odbcConnectExcel} are convenience wrappers to generate connection strings for those file types. The files given can be relative to the \R working directory or absolute paths (and it seems also relative to the user's home directory). The file name can be omitted, which will on \code{Rgui} bring up a dialog box to search for a file. \bold{Note:} they will only work with English-language 32-bit versions of the Microsoft drivers, which may or may not be installed in other locales, and are not usable from 64-bit \R. The \code{2007} versions work with the drivers which are installed with Office 2007/2010 and give access to formats such as \file{*.xlsx} and \file{*.accdb}. These drivers are also available separately and there is a 64-bit version: see the package manual. (You must have the 32-bit drivers when using 32-bit \R and the 64-bit drivers when using 64-bit \R: otherwise there will be a cryptic message about a driver not being found. And the 64-bit drivers cannot be installed alongside 32-bit Microsoft Office, and \emph{vice versa}. See the package manual for some of the peculiarities of the Excel drivers. \code{readOnly = TRUE} may allow very limited changes (to insert and update rows). #endif If it is possible to set the DBMS or ODBC driver to communicate in the character set of the \R session then this should be done. For example, MySQL can set the communication character set \emph{via} SQL, e.g. \samp{SET NAMES 'utf8'}. } \note{ Several errors which have been reported as bugs in \pkg{RODBC} 1.3-0 which were in fact ODBC driver errors that can be circumvented by setting \code{rows_at_time = 1} (and the warning under that argument has always been there). The drivers involved have been third-party Oracle drivers and old SQL Server drivers. } \value{ A non-negative integer which is used as handle if no error occurred, \code{-1} otherwise. A successful return has class \code{"RODBC"}, and attributes including \item{connection.string}{the full ODBC connection string.} \item{case}{the value of \code{case}.} \item{id}{a numeric ID for the channel.} \item{believeNRows}{the value of \code{believeNRows}.} \item{rows_at_time}{the value of \code{rows_at_time}.} } \author{ Michael Lapsley, Brian Ripley } \seealso{ \code{\link{odbcClose}}, \code{\link{sqlQuery}}, \code{\link{odbcGetInfo}} } \examples{\dontrun{ #ifdef unix # MySQL channel <- odbcConnect("test", uid="ripley", pwd="secret") # PostgreSQL: 'case' should be detected automatically channel <- odbcConnect("pg", uid="ripley", pwd="secret", case="postgresql") #endif #ifdef windows # interactive specification under RGui channel <- odbcDriverConnect("") # MySQL on Windows -- MySQL maps to lower case on Windows only channel <- odbcConnect("testdb", uid="ripley", case="tolower") # Access channel <- odbcConnect("testacc") # if this was set up as a DSN channel2 <- odbcConnectAccess("test.mdb", uid="ripley") # Excel channel <- odbcConnect("bdr.xls") # if this was set up as a DSN channel2 <- odbcDriverConnect(paste("DRIVER=Microsoft Excel Driver (*.xls)", "DBQ=D:\\bdr\\hills.xls", "ReadOnly=False", sep = ";")) ## or "DRIVER=Microsoft Excel Driver (*.xls *.xlsx, *.xlsm, *.xlsb)" channel3 <- odbcConnectExcel("hills.xls") #endif # re-connection odbcCloseAll() channel <- odbcReConnect(channel) # must re-assign as the data may change }} \keyword{IO} \keyword{database} RODBC/man/sqlFetch.Rd0000644000176000001440000000750013013621651013746 0ustar ripleyusers% file RODBC/man/sqlFetch.Rd % copyright (C) 1999-2002 M. Lapsley % copyright (C) 2002-2013 B. D. Ripley % \name{sqlFetch} \alias{sqlFetch} \alias{sqlFetchMore} \title{Reading Tables from ODBC Databases} \description{ Read some or all of a table from an ODBC database into a data frame. } \usage{ sqlFetch(channel, sqtable, ..., colnames = FALSE, rownames = TRUE) sqlFetchMore(channel, ..., colnames = FALSE, rownames = TRUE) } \arguments{ \item{channel}{connection handle returned by \code{\link{odbcConnect}}.} \item{sqtable}{a database table name accessible from the connected DSN. This should be either a literal character string or a character vector of length 1.} \item{\dots}{additional arguments to be passed to \code{\link{sqlQuery}} or \code{\link{sqlGetResults}}. See \sQuote{Details}.} \item{colnames}{logical: retrieve column names from first row of table? (For use when \code{\link{sqlSave}(colnames = TRUE)} was used.)} \item{rownames}{either logical or character. If logical, retrieve row names from the first column (\code{rownames}) in the table? If character, the column name to retrieve them from.} } \details{ Note the \sQuote{table} includes whatever table-like objects are provided by the DBMS, in particular views and system tables. \code{sqlFetch} by default retrieves the the entire contents of the table \code{sqtable}. Rownames and column names are restored as indicated (assuming that they have been placed in the table by the corresponding arguments to \code{\link{sqlSave}}). Alternatively, \code{sqlFetch} can fetch the first \code{max} rows, in which case \code{sqlFetchMore} will retrieve further result rows, provided there has been no other ODBC query on that channel in the meantime. These functions try to cope with the peculiar way the Excel ODBC driver handles table names, and to quote Access table names which contain spaces. Dotted table names, e.g. \code{myschema.mytable}, are allowed on systems that support them, unless the connection was opened with \code{interpretDot = FALSE}. Useful additional parameters to pass to \code{\link{sqlQuery}} or \code{\link{sqlGetResults}} include \describe{ \item{\code{max}:}{limit on the number of rows to fetch, with \code{0} (the default) indicating no limit.} \item{\code{nullstring}:}{character string to be used when reading \code{SQL_NULL_DATA} character items from the database: default \code{NA_character_}.} \item{\code{na.strings}:}{character string(s) to be mapped to \code{NA} when reading character data: default \code{"NA"}.} \item{\code{as.is}:}{as in \code{\link{sqlGetResults}}.} \item{\code{dec}:}{The character for the decimal place to be assumed when converting character columns to numeric.} \item{\code{rows_at_time}:}{Allow for multiple rows to be retrieved at once. See \code{\link{sqlQuery}}.} } } \value{ A data frame on success, or a character or numeric error code (see \code{\link{sqlQuery}}). } \note{ If the table name desired is not a valid SQL name (alphanumeric plus \code{_}) and these functions are not able to interpret the name, you can use \code{\link{sqlQuery}} with whatever quoting mechanism your DBMS vendor provides (e.g. \code{[ ]} on some Microsoft products and backticks on MySQL). } \seealso{ \code{\link{sqlSave}}, \code{\link{sqlQuery}}, \code{\link{odbcConnect}}, \code{\link{odbcGetInfo}} } \author{ Michael Lapsley and Brian Ripley } \examples{ \dontrun{ channel <- odbcConnect("test") sqlSave(channel, USArrests) sqlFetch(channel, "USArrests") # get the lot sqlFetch(channel, "USArrests", max = 20, rows_at_time = 10) sqlFetchMore(channel, max = 20) sqlFetchMore(channel) # get the rest sqlDrop(channel, "USArrests") close(channel) }} \keyword{IO} \keyword{database} RODBC/configure.win0000644000176000001440000000004113013621651013624 0ustar ripleyuserscp src/config.h.win src/config.h RODBC/cleanup0000755000176000001440000000014713013621651012510 0ustar ripleyusers#!/bin/sh ## a.out.dSYM may get created on OS X. rm -rf config.* src/Makevars src/config.h a.out.dSYM RODBC/LICENCE.note0000644000176000001440000000115013013621651013057 0ustar ripleyusersThis package is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 or 3 of the License (at your option). This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. A copy of the GNU General Public License is available at http://www.r-project.org/Licenses/ . A copy of version 2 is included in the sources as file GPL-2.